From 80f14d20c4bfed640de05e6d01eb7dec19acb0a1 Mon Sep 17 00:00:00 2001 From: "mikhal@webrtc.org" Date: Thu, 11 Oct 2012 15:03:53 +0000 Subject: [PATCH] Adding DeliverCaptureEncodedFrame Review URL: https://webrtc-codereview.appspot.com/860012 git-svn-id: http://webrtc.googlecode.com/svn/trunk@2909 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../main/source/video_capture_impl.cc | 50 ++++++++++++++++--- .../main/source/video_capture_impl.h | 4 ++ 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/modules/video_capture/main/source/video_capture_impl.cc b/src/modules/video_capture/main/source/video_capture_impl.cc index 6c33128614..1084ff47ce 100644 --- a/src/modules/video_capture/main/source/video_capture_impl.cc +++ b/src/modules/video_capture/main/source/video_capture_impl.cc @@ -209,8 +209,44 @@ WebRtc_Word32 VideoCaptureImpl::CaptureDelay() WebRtc_Word32 VideoCaptureImpl::DeliverCapturedFrame(VideoFrame& captureFrame, WebRtc_Word64 capture_time, VideoCodecType codec_type) { - UpdateFrameCount();// frame count used for local frame rate callback. - _startImageFrameIntervall = 0; // prevent the start image to be displayed. + UpdateFrameCount(); // frame count used for local frame rate callback. + _startImageFrameIntervall = 0; // prevent the start image to be displayed. + + const bool callOnCaptureDelayChanged = _setCaptureDelay != _captureDelay; + // Capture delay changed + if (_setCaptureDelay != _captureDelay) { + _setCaptureDelay = _captureDelay; + } + + // Set the capture time + if (capture_time != 0) { + captureFrame.SetRenderTime(capture_time); + } + else { + captureFrame.SetRenderTime(TickTime::MillisecondTimestamp()); + } + + if (captureFrame.RenderTimeMs() == last_capture_time_) { + // We don't allow the same capture time for two frames, drop this one. + return -1; + } + last_capture_time_ = captureFrame.RenderTimeMs(); + + if (_dataCallBack) { + if (callOnCaptureDelayChanged) { + _dataCallBack->OnCaptureDelayChanged(_id, _captureDelay); + } + _dataCallBack->OnIncomingCapturedFrame(_id, captureFrame, codec_type); + } + + return 0; +} + +WebRtc_Word32 VideoCaptureImpl::DeliverEncodedCapturedFrame( + VideoFrame& captureFrame, WebRtc_Word64 capture_time, + VideoCodecType codec_type) { + UpdateFrameCount(); // frame count used for local frame rate callback. + _startImageFrameIntervall = 0; // prevent the start image to be displayed. const bool callOnCaptureDelayChanged = _setCaptureDelay != _captureDelay; // Capture delay changed @@ -306,18 +342,20 @@ WebRtc_Word32 VideoCaptureImpl::IncomingFrame( return -1; } _captureFrame.SetLength(requiredLength); + DeliverCapturedFrame(_captureFrame, captureTime, frameInfo.codecType); } else // Encoded format { - if (_captureFrame.CopyFrame(videoFrameLength, videoFrame) != 0) + if (_capture_encoded_frame.CopyFrame(videoFrameLength, videoFrame) != 0) { WEBRTC_TRACE(webrtc::kTraceError, webrtc::kTraceVideoCapture, _id, - "Failed to copy captured frame of length %d", (int) videoFrameLength); + "Failed to copy captured frame of length %d", + static_cast(videoFrameLength)); } + DeliverEncodedCapturedFrame(_capture_encoded_frame, captureTime, + frameInfo.codecType); } - DeliverCapturedFrame(_captureFrame, captureTime, frameInfo.codecType); - const WebRtc_UWord32 processTime = (WebRtc_UWord32)(TickTime::Now() - startProcessTime).Milliseconds(); diff --git a/src/modules/video_capture/main/source/video_capture_impl.h b/src/modules/video_capture/main/source/video_capture_impl.h index df5d981d91..12c822f6a4 100644 --- a/src/modules/video_capture/main/source/video_capture_impl.h +++ b/src/modules/video_capture/main/source/video_capture_impl.h @@ -104,6 +104,9 @@ protected: WebRtc_Word32 DeliverCapturedFrame( VideoFrame& captureFrame, WebRtc_Word64 capture_time, VideoCodecType codec_type); + WebRtc_Word32 DeliverEncodedCapturedFrame( + VideoFrame& captureFrame, + WebRtc_Word64 capture_time, VideoCodecType codec_type); WebRtc_Word32 _id; // Module ID char* _deviceUniqueId; // current Device unique name; @@ -134,6 +137,7 @@ private: VideoRotationMode _rotateFrame; //Set if the frame should be rotated by the capture module. VideoFrame _captureFrame; + VideoFrame _capture_encoded_frame; // Used to make sure incoming timestamp is increasing for every frame. WebRtc_Word64 last_capture_time_;