/// <summary> /// Start Playback /// </summary> /// <param name="res"></param> public void InitPlayback(VideoBuffer videoBuffer) { if (videoBuffer == null) { throw new ArgumentNullException("videoBufferDescription"); } VerifyAccess(); TimeSpan renderinterval; try { int fps = AppDefaults.visualSettings.ui_video_rendering_fps; fps = (fps <= 0 || fps > 100) ? 100 : fps; renderinterval = TimeSpan.FromMilliseconds(1000 / fps); } catch { renderinterval = TimeSpan.FromMilliseconds(1000 / 30); } var cancellationTokenSource = new CancellationTokenSource(); renderSubscription.Disposable = Disposable.Create(() => { cancellationTokenSource.Cancel(); }); var bitmap = PrepareForRendering(videoBuffer); var cancellationToken = cancellationTokenSource.Token; var dispatcher = Application.Current.Dispatcher; var renderingTask = Task.Factory.StartNew(() => { var statistics = new CircularBuffer<long>(100); using (videoBuffer.Lock()) { try { //start rendering loop while (!cancellationToken.IsCancellationRequested) { using (var processingEvent = new ManualResetEventSlim(false)) { dispatcher.BeginInvoke(() => { using (Disposable.Create(() => processingEvent.Set())) { if (!cancellationToken.IsCancellationRequested) { //update statisitc info statistics.Enqueue(Stopwatch.GetTimestamp()); //evaluate averange rendering fps var ticksEllapsed = statistics.last - statistics.first; double avgFps = 0; if (ticksEllapsed > 0) { avgFps = ((double)statistics.length * (double)Stopwatch.Frequency) / (double)ticksEllapsed; } //render farme to screen DrawFrame(bitmap, videoBuffer, avgFps); } } }); processingEvent.Wait(cancellationToken); } cancellationToken.WaitHandle.WaitOne(renderinterval); } } catch (OperationCanceledException) { //swallow exception } catch (Exception error) { dbg.Error(error); } } }, cancellationToken); }
private WriteableBitmap PrepareForRendering(VideoBuffer videoBuffer) { PixelFormat pixelFormat; if (videoBuffer.pixelFormat == PixFrmt.rgb24) { pixelFormat = PixelFormats.Rgb24; } else if (videoBuffer.pixelFormat == PixFrmt.bgra32) { pixelFormat = PixelFormats.Bgra32; } else if (videoBuffer.pixelFormat == PixFrmt.bgr24) { pixelFormat = PixelFormats.Bgr24; } else { throw new Exception("unsupported pixel format"); } var bitmap = new WriteableBitmap( videoBuffer.width, videoBuffer.height, 96, 96, pixelFormat, null ); _imgVIew.Source = bitmap; return bitmap; }
private void DrawFrame(WriteableBitmap bitmap, VideoBuffer videoBuffer, double averangeFps) { VerifyAccess(); if (isPaused) { return; } bitmap.Lock(); try { using (var ptr = videoBuffer.Lock()) { bitmap.WritePixels( new Int32Rect(0, 0, videoBuffer.width, videoBuffer.height), ptr.value, videoBuffer.size, videoBuffer.stride, 0, 0 ); } } finally { bitmap.Unlock(); } fpsCaption.Text = averangeFps.ToString("F1"); }
public void SetVideoBuffer(VideoBuffer videoBuffer) { playerTask.videoBuffer = videoBuffer; }
void VideoStartup(StreamInfoArgs args) {//, string profToken) { vidBuff = new VideoBuffer((int)args.sourceResolution.Width, (int)args.sourceResolution.Height); //var playerAct = container.Resolve<IVideoPlayerActivity>(); ////profileToken: profToken, //var model = new VideoPlayerActivityModel( // showStreamUrl: false, // streamSetup: new StreamSetup() { // Stream = StreamType.RTPUnicast, // Transport = new Transport() { // Protocol = AppDefaults.visualSettings.Transport_Type, // Tunnel = null // } // } //); //disposables.Add( // container.RunChildActivity(player, model, (c, m) => playerAct.Run(c, m)) //); VideoPlayerView playview = new VideoPlayerView(); disposables.Add(playview); player.Child = playview; playview.Init(new VideoPlayerView.Model( streamSetup: args.streamSetup, mediaUri: new MediaUri() { uri = args.streamUri }, encoderResolution: new VideoResolution() { height = (int)args.sourceResolution.Height, width = (int)args.sourceResolution.Width }, isUriEnabled: false, metadataReceiver: null )); }
private void DrawFrame(WriteableBitmap bitmap, VideoBuffer videoBuffer, PlaybackStatistics statistics) { VerifyAccess(); if (isPaused) { return; } using (var md = videoBuffer.Lock()) { // internally calls lock\unlock, uses MILUtilities.MILCopyPixelBuffer bitmap.WritePixels( new Int32Rect(0, 0, videoBuffer.width, videoBuffer.height), md.value.scan0Ptr, videoBuffer.size, videoBuffer.stride, 0, 0 ); } renderingFps.Text = String.Format("rendering fps: {0:F1}", statistics.avgRenderingFps); decodingFps.Text = String.Format("decoding fps: {0:F1}", statistics.avgDecodingFps); noSignalPanel.Visibility = statistics.isNoSignal ? Visibility.Visible : Visibility.Hidden; }
/// <summary> /// Initiate rendering loop /// </summary> /// <param name="videoBuffer"></param> public void InitPlayback(VideoBuffer videoBuffer) { if (videoBuffer == null) { throw new ArgumentNullException("videoBufferDescription"); } VerifyAccess(); TimeSpan renderinterval; try { int fps = AppDefaults.visualSettings.ui_video_rendering_fps; fps = (fps <= 0 || fps > 100) ? 100 : fps; renderinterval = TimeSpan.FromMilliseconds(1000 / fps); } catch { renderinterval = TimeSpan.FromMilliseconds(1000 / 30); } var cancellationTokenSource = new CancellationTokenSource(); renderSubscription.Disposable = Disposable.Create(() => { cancellationTokenSource.Cancel(); }); var bitmap = PrepareForRendering(videoBuffer); var cancellationToken = cancellationTokenSource.Token; var dispatcher = this.Dispatcher; //Application.Current.Dispatcher; var renderingTask = Task.Factory.StartNew(() => { var statistics = PlaybackStatistics.Start(); using (videoBuffer.Lock()) { try { //start rendering loop while (!cancellationToken.IsCancellationRequested) { using (var processingEvent = new ManualResetEventSlim(false)) { dispatcher.BeginInvoke(() => { using (Disposable.Create(() => processingEvent.Set())) { if (!cancellationToken.IsCancellationRequested) { //update statisitc info statistics.Update(videoBuffer); //render farme to screen DrawFrame(bitmap, videoBuffer, statistics); } } }); processingEvent.Wait(cancellationToken); } cancellationToken.WaitHandle.WaitOne(renderinterval); } } catch (OperationCanceledException) { //swallow exception } catch (Exception error) { dbg.Error(error); } } }, cancellationToken); }
public void Update(VideoBuffer videoBuffer) { //update rendering times history renderTimes.Enqueue(Stopwatch.GetTimestamp()); //evaluate averange rendering fps avgRenderingFps = CalculateAvgFpsFromTimes(renderTimes); //update no signal indicator using (var md = videoBuffer.Lock()) { signal = md.value.signal; md.value.signal = 0; } UpdateNoSignal(); //evaluate averange rendering fps avgDecodingFps = CalculateAvgFpsFromTimes(decodeTimes); }
void VideoStartup(Model model) { player = new HostedPlayer(); var res = model.encoderResolution; videoBuff = new VideoBuffer(res.width, res.height); player.SetVideoBuffer(videoBuff); var account = AccountManager.Instance.CurrentAccount; UserNameToken utoken = null; if (!account.IsAnonymous) { utoken = new UserNameToken(account.Name, account.Password); } if (model.metadataReceiver != null) { player.SetMetadataReciever(model.metadataReceiver); } MediaStreamInfo.Transport transp; switch (model.streamSetup.transport.protocol) { case TransportProtocol.http: transp = MediaStreamInfo.Transport.Http; break; case TransportProtocol.rtsp: transp = MediaStreamInfo.Transport.Tcp; break; default: transp = MediaStreamInfo.Transport.Udp; break; } MediaStreamInfo mstrInfo = new MediaStreamInfo(model.mediaUri.uri, transp, utoken); disposables.Add(player.Play(mstrInfo, this)); InitPlayback(videoBuff); }
void VideoStartup(Model model, VideoResolution resolution) { //subscribe to metadata IMetadataReceiver metadataReceiver = null; if (AppDefaults.visualSettings.EnableGraphicAnnotation) { string vaConfToken = model.engineConfToken; var eventMetadataProcessor = new EventMetadataProcessor(); //eventMetadataProcessor.Processors.Add(new ObjectMotionMetadataProcessor(null, vaConfToken, movingObjectsHolder.EntityInitialized, movingObjectsHolder.EntityChanged, movingObjectsHolder.EntityDeleted)); eventMetadataProcessor.Processors.Add(new MotionAlarmMetadataProcessor(null, vaConfToken, alarmsHolder.EntityInitialized, alarmsHolder.EntityChanged, alarmsHolder.EntityDeleted)); eventMetadataProcessor.Processors.Add(new RegionMotionAlarmMetadataProcessor(null, vaConfToken, alarmsHolder.EntityInitialized, alarmsHolder.EntityChanged, alarmsHolder.EntityDeleted)); eventMetadataProcessor.Processors.Add(new LoiteringAlarmMetadataProcessor(null, vaConfToken, alarmsHolder.EntityInitialized, alarmsHolder.EntityChanged, alarmsHolder.EntityDeleted)); eventMetadataProcessor.Processors.Add(new AbandonedItemAlarmMetadataProcessor(null, vaConfToken, alarmsHolder.EntityInitialized, alarmsHolder.EntityChanged, alarmsHolder.EntityDeleted)); eventMetadataProcessor.Processors.Add(new TripwireAlarmMetadataProcessor(null, vaConfToken, alarmsHolder.EntityInitialized, alarmsHolder.EntityChanged, alarmsHolder.EntityDeleted)); eventMetadataProcessor.Processors.Add(new TamperingDetectorAlarmMetadataProcessor(null, vaConfToken, alarmsHolder.EntityInitialized, alarmsHolder.EntityChanged, alarmsHolder.EntityDeleted)); var sceneMetadataProcessor = new SceneMetadataProcessor(movingObjectsHolder.EntityInitialized, movingObjectsHolder.EntityChanged, movingObjectsHolder.EntityDeleted); var metadataProcessor = new MetadataProcessor(eventMetadataProcessor, sceneMetadataProcessor); metadataReceiver = new MetadataFramer(metadataProcessor.Process); } vidBuff = new VideoBuffer(resolution.width, resolution.height); var streamSetup = new StreamSetup() { transport = new Transport() { protocol = AppDefaults.visualSettings.Transport_Type } }; VideoPlayerView playview = new VideoPlayerView(); disposables.Add(playview); player.Child = playview; playview.Init(new VideoPlayerView.Model( streamSetup: streamSetup, mediaUri: new MediaUri() { uri = model.uri }, encoderResolution: new VideoResolution() { height = resolution.height, width = resolution.width }, isUriEnabled: false, //TODO if true then annotation is not positioned correctly metadataReceiver: metadataReceiver )); uriString.Visibility = System.Windows.Visibility.Visible; uriString.Text = model.uri; }
void VideoStartup(StreamInfoArgs args) {//, string profToken) { vidBuff = new VideoBuffer((int)args.sourceResolution.Width, (int)args.sourceResolution.Height); VideoPlayerView playview = new VideoPlayerView(); disposables.Add(playview); player.Child = playview; playview.Init(new VideoPlayerView.Model( streamSetup: args.streamSetup, mediaUri: new MediaUri() { uri = args.streamUri }, encoderResolution: new VideoResolution() { height = (int)args.sourceResolution.Height, width = (int)args.sourceResolution.Width }, isUriEnabled: false, metadataReceiver: null )); }