diff options
author | wuchengli@chromium.org <wuchengli@chromium.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2014-05-27 12:40:27 +0000 |
---|---|---|
committer | wuchengli@chromium.org <wuchengli@chromium.org@4adac7df-926f-26a2-2b94-8c16560cd09d> | 2014-05-27 12:40:27 +0000 |
commit | a3b8c852fe775a455c29d436c73163db662b7a6d (patch) | |
tree | 93938cf167802d05eed2508f0786266f52c127c7 /video_engine/vie_capturer.cc | |
parent | 17d5ac4d612c69abe4dbc824601583f0e3273bc5 (diff) | |
download | webrtc-a3b8c852fe775a455c29d436c73163db662b7a6d.tar.gz |
Add support of texture frames for video capturer.
- Add ViECapturer unittest.
- Add CloneFrame function in I420VideoFrame.
- Encoders do not support texture yet and texture frames
are dropped in ViEEncoder for now.
Corresponding CLs:
https://codereview.chromium.org/277943002
http://cl/66620352
BUG=chromium:362437
TEST=WebRTC video stream forwarding. Run video_engine_core_unittests and common_video_unittests.
R=fischman@webrtc.org, perkj@webrtc.org, stefan@webrtc.org, wu@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/12499004
git-svn-id: http://webrtc.googlecode.com/svn/trunk/webrtc@6252 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'video_engine/vie_capturer.cc')
-rw-r--r-- | video_engine/vie_capturer.cc | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/video_engine/vie_capturer.cc b/video_engine/vie_capturer.cc index 867de9b1..30d66335 100644 --- a/video_engine/vie_capturer.cc +++ b/video_engine/vie_capturer.cc @@ -10,6 +10,7 @@ #include "webrtc/video_engine/vie_capturer.h" +#include "webrtc/common_video/interface/texture_video_frame.h" #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h" #include "webrtc/modules/interface/module_common_types.h" #include "webrtc/modules/utility/interface/process_thread.h" @@ -346,11 +347,16 @@ void ViECapturer::OnIncomingCapturedFrame(const int32_t capture_id, TRACE_EVENT_ASYNC_BEGIN1("webrtc", "Video", video_frame.render_time_ms(), "render_time", video_frame.render_time_ms()); - captured_frame_.SwapFrame(&video_frame); + if (video_frame.native_handle() != NULL) { + captured_frame_.reset(video_frame.CloneFrame()); + } else { + if (captured_frame_ == NULL || captured_frame_->native_handle() != NULL) + captured_frame_.reset(new I420VideoFrame()); + captured_frame_->SwapFrame(&video_frame); + } capture_event_.Set(); - overuse_detector_->FrameCaptured(captured_frame_.width(), - captured_frame_.height()); - return; + overuse_detector_->FrameCaptured(captured_frame_->width(), + captured_frame_->height()); } void ViECapturer::OnCaptureDelayChanged(const int32_t id, @@ -473,7 +479,9 @@ bool ViECapturer::ViECaptureProcess() { deliver_cs_->Enter(); if (SwapCapturedAndDeliverFrameIfAvailable()) { encode_start_time = Clock::GetRealTimeClock()->TimeInMilliseconds(); - DeliverI420Frame(&deliver_frame_); + DeliverI420Frame(deliver_frame_.get()); + if (deliver_frame_->native_handle() != NULL) + deliver_frame_.reset(); // Release the texture so it can be reused. } deliver_cs_->Leave(); if (current_brightness_level_ != reported_brightness_level_) { @@ -494,6 +502,11 @@ bool ViECapturer::ViECaptureProcess() { } void ViECapturer::DeliverI420Frame(I420VideoFrame* video_frame) { + if (video_frame->native_handle() != NULL) { + ViEFrameProviderBase::DeliverFrame(video_frame); + return; + } + // Apply image enhancement and effect filter. if (deflicker_frame_stats_) { if (image_proc_module_->GetFrameStats(deflicker_frame_stats_, @@ -608,11 +621,21 @@ void ViECapturer::OnNoPictureAlarm(const int32_t id, bool ViECapturer::SwapCapturedAndDeliverFrameIfAvailable() { CriticalSectionScoped cs(capture_cs_.get()); - if (captured_frame_.IsZeroSize()) + if (captured_frame_ == NULL) + return false; + + if (captured_frame_->native_handle() != NULL) { + deliver_frame_.reset(captured_frame_.release()); + return true; + } + + if (captured_frame_->IsZeroSize()) return false; - deliver_frame_.SwapFrame(&captured_frame_); - captured_frame_.ResetSize(); + if (deliver_frame_ == NULL) + deliver_frame_.reset(new I420VideoFrame()); + deliver_frame_->SwapFrame(captured_frame_.get()); + captured_frame_->ResetSize(); return true; } |