diff options
Diffstat (limited to 'chromium/third_party/webrtc/video_engine/vie_capturer.cc')
-rw-r--r-- | chromium/third_party/webrtc/video_engine/vie_capturer.cc | 201 |
1 files changed, 71 insertions, 130 deletions
diff --git a/chromium/third_party/webrtc/video_engine/vie_capturer.cc b/chromium/third_party/webrtc/video_engine/vie_capturer.cc index aec5b39a1d8..30d663357c7 100644 --- a/chromium/third_party/webrtc/video_engine/vie_capturer.cc +++ b/chromium/third_party/webrtc/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" @@ -19,10 +20,9 @@ #include "webrtc/system_wrappers/interface/clock.h" #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" #include "webrtc/system_wrappers/interface/event_wrapper.h" +#include "webrtc/system_wrappers/interface/logging.h" #include "webrtc/system_wrappers/interface/thread_wrapper.h" -#include "webrtc/system_wrappers/interface/trace.h" #include "webrtc/system_wrappers/interface/trace_event.h" -#include "webrtc/video_engine/include/vie_base.h" #include "webrtc/video_engine/include/vie_image_process.h" #include "webrtc/video_engine/overuse_frame_detector.h" #include "webrtc/video_engine/vie_defines.h" @@ -59,26 +59,15 @@ ViECapturer::ViECapturer(int capture_id, denoising_enabled_(false), observer_cs_(CriticalSectionWrapper::CreateCriticalSection()), observer_(NULL), - overuse_detector_(new OveruseFrameDetector(Clock::GetRealTimeClock(), - kNormalUseStdDevMs, - kOveruseStdDevMs)) { - WEBRTC_TRACE(kTraceMemory, kTraceVideo, ViEId(engine_id, capture_id), - "ViECapturer::ViECapturer(capture_id: %d, engine_id: %d)", - capture_id, engine_id); + overuse_detector_(new OveruseFrameDetector(Clock::GetRealTimeClock())) { unsigned int t_id = 0; - if (capture_thread_.Start(t_id)) { - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id, capture_id), - "%s: thread started: %u", __FUNCTION__, t_id); - } else { + if (!capture_thread_.Start(t_id)) { assert(false); } module_process_thread_.RegisterModule(overuse_detector_.get()); } ViECapturer::~ViECapturer() { - WEBRTC_TRACE(kTraceMemory, kTraceVideo, ViEId(engine_id_, capture_id_), - "ViECapturer::~ViECapturer() - capture_id: %d, engine_id: %d", - capture_id_, engine_id_); module_process_thread_.DeRegisterModule(overuse_detector_.get()); // Stop the thread. @@ -103,10 +92,6 @@ ViECapturer::~ViECapturer() { delete &deliver_event_; } else { assert(false); - WEBRTC_TRACE(kTraceMemory, kTraceVideoRenderer, - ViEId(engine_id_, capture_id_), - "%s: Not able to stop capture thread for device %d, leaking", - __FUNCTION__, capture_id_); } if (image_proc_module_) { @@ -209,8 +194,6 @@ int ViECapturer::FrameCallbackChanged() { } int32_t ViECapturer::Start(const CaptureCapability& capture_capability) { - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), "%s", - __FUNCTION__); int width; int height; int frame_rate; @@ -247,15 +230,11 @@ int32_t ViECapturer::Start(const CaptureCapability& capture_capability) { } int32_t ViECapturer::Stop() { - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), "%s", - __FUNCTION__); requested_capability_ = CaptureCapability(); return capture_module_->StopCapture(); } bool ViECapturer::Started() { - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), "%s", - __FUNCTION__); return capture_module_->CaptureStarted(); } @@ -267,19 +246,17 @@ void ViECapturer::RegisterCpuOveruseObserver(CpuOveruseObserver* observer) { overuse_detector_->SetObserver(observer); } -void ViECapturer::CpuOveruseMeasures(int* capture_jitter_ms, - int* avg_encode_time_ms, - int* encode_usage_percent, - int* capture_queue_delay_ms_per_s) const { - *capture_jitter_ms = overuse_detector_->last_capture_jitter_ms(); - *avg_encode_time_ms = overuse_detector_->AvgEncodeTimeMs(); - *encode_usage_percent = overuse_detector_->EncodeUsagePercent(); - *capture_queue_delay_ms_per_s = - overuse_detector_->AvgCaptureQueueDelayMsPerS(); +void ViECapturer::SetCpuOveruseOptions(const CpuOveruseOptions& options) { + overuse_detector_->SetOptions(options); +} + +void ViECapturer::GetCpuOveruseMetrics(CpuOveruseMetrics* metrics) const { + overuse_detector_->GetCpuOveruseMetrics(metrics); } int32_t ViECapturer::SetCaptureDelay(int32_t delay_ms) { - return capture_module_->SetCaptureDelay(delay_ms); + capture_module_->SetCaptureDelay(delay_ms); + return 0; } int32_t ViECapturer::SetRotateCapturedFrames( @@ -308,10 +285,6 @@ int ViECapturer::IncomingFrame(unsigned char* video_frame, uint16_t height, RawVideoType video_type, unsigned long long capture_time) { // NOLINT - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), - "ExternalCapture::IncomingFrame width %d, height %d, " - "capture_time %u", width, height, capture_time); - if (!external_capture_module_) { return -1; } @@ -326,11 +299,6 @@ int ViECapturer::IncomingFrame(unsigned char* video_frame, int ViECapturer::IncomingFrameI420(const ViEVideoFrameI420& video_frame, unsigned long long capture_time) { // NOLINT - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), - "ExternalCapture::IncomingFrame width %d, height %d, " - " capture_time %u", video_frame.width, video_frame.height, - capture_time); - if (!external_capture_module_) { return -1; } @@ -352,10 +320,7 @@ int ViECapturer::IncomingFrameI420(const ViEVideoFrameI420& video_frame, video_frame.v_pitch); if (ret < 0) { - WEBRTC_TRACE(kTraceError, - kTraceVideo, - ViEId(engine_id_, capture_id_), - "Failed to create I420VideoFrame"); + LOG_F(LS_ERROR) << "Could not create I420Frame."; return -1; } @@ -366,12 +331,13 @@ int ViECapturer::IncomingFrameI420(const ViEVideoFrameI420& video_frame, void ViECapturer::SwapFrame(I420VideoFrame* frame) { external_capture_module_->IncomingI420VideoFrame(frame, frame->render_time_ms()); + frame->set_timestamp(0); + frame->set_ntp_time_ms(0); + frame->set_render_time_ms(0); } void ViECapturer::OnIncomingCapturedFrame(const int32_t capture_id, I420VideoFrame& video_frame) { - WEBRTC_TRACE(kTraceStream, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s(capture_id: %d)", __FUNCTION__, capture_id); CriticalSectionScoped cs(capture_cs_.get()); // Make sure we render this frame earlier since we know the render time set // is slightly off since it's being set when the frame has been received from @@ -381,18 +347,22 @@ 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, const int32_t delay) { - WEBRTC_TRACE(kTraceStream, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s(capture_id: %d) delay %d", __FUNCTION__, capture_id_, - delay); + LOG(LS_INFO) << "Capture delayed change to " << delay + << " for device " << id; // Deliver the network delay to all registered callbacks. ViEFrameProviderBase::SetFrameDelay(delay); @@ -402,26 +372,9 @@ int32_t ViECapturer::RegisterEffectFilter( ViEEffectFilter* effect_filter) { CriticalSectionScoped cs(deliver_cs_.get()); - if (!effect_filter) { - if (!effect_filter_) { - WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: no effect filter added for capture device %d", - __FUNCTION__, capture_id_); - return -1; - } - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: deregister effect filter for device %d", __FUNCTION__, - capture_id_); - } else { - if (effect_filter_) { - WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: effect filter already added for capture device %d", - __FUNCTION__, capture_id_); - return -1; - } - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: register effect filter for device %d", __FUNCTION__, - capture_id_); + if (effect_filter != NULL && effect_filter_ != NULL) { + LOG_F(LS_ERROR) << "Effect filter already registered."; + return -1; } effect_filter_ = effect_filter; return 0; @@ -433,9 +386,7 @@ int32_t ViECapturer::IncImageProcRefCount() { image_proc_module_ = VideoProcessingModule::Create( ViEModuleId(engine_id_, capture_id_)); if (!image_proc_module_) { - WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: could not create video processing module", - __FUNCTION__); + LOG_F(LS_ERROR) << "Could not create video processing module."; return -1; } } @@ -454,10 +405,6 @@ int32_t ViECapturer::DecImageProcRefCount() { } int32_t ViECapturer::EnableDenoising(bool enable) { - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s(capture_device_id: %d, enable: %d)", __FUNCTION__, - capture_id_, enable); - CriticalSectionScoped cs(deliver_cs_.get()); if (enable) { if (denoising_enabled_) { @@ -476,20 +423,13 @@ int32_t ViECapturer::EnableDenoising(bool enable) { denoising_enabled_ = false; DecImageProcRefCount(); } - return 0; } int32_t ViECapturer::EnableDeflickering(bool enable) { - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s(capture_device_id: %d, enable: %d)", __FUNCTION__, - capture_id_, enable); - CriticalSectionScoped cs(deliver_cs_.get()); if (enable) { if (deflicker_frame_stats_) { - WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: deflickering already enabled", __FUNCTION__); return -1; } if (IncImageProcRefCount() != 0) { @@ -498,8 +438,6 @@ int32_t ViECapturer::EnableDeflickering(bool enable) { deflicker_frame_stats_ = new VideoProcessingModule::FrameStats(); } else { if (deflicker_frame_stats_ == NULL) { - WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: deflickering not enabled", __FUNCTION__); return -1; } DecImageProcRefCount(); @@ -510,15 +448,9 @@ int32_t ViECapturer::EnableDeflickering(bool enable) { } int32_t ViECapturer::EnableBrightnessAlarm(bool enable) { - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s(capture_device_id: %d, enable: %d)", __FUNCTION__, - capture_id_, enable); - CriticalSectionScoped cs(deliver_cs_.get()); if (enable) { if (brightness_frame_stats_) { - WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: BrightnessAlarm already enabled", __FUNCTION__); return -1; } if (IncImageProcRefCount() != 0) { @@ -528,8 +460,6 @@ int32_t ViECapturer::EnableBrightnessAlarm(bool enable) { } else { DecImageProcRefCount(); if (brightness_frame_stats_ == NULL) { - WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: deflickering not enabled", __FUNCTION__); return -1; } delete brightness_frame_stats_; @@ -549,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_) { @@ -570,15 +502,18 @@ 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_, *video_frame) == 0) { image_proc_module_->Deflickering(video_frame, deflicker_frame_stats_); } else { - WEBRTC_TRACE(kTraceStream, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: could not get frame stats for captured frame", - __FUNCTION__); + LOG_F(LS_ERROR) << "Could not get frame stats."; } } if (denoising_enabled_) { @@ -601,8 +536,7 @@ void ViECapturer::DeliverI420Frame(I420VideoFrame* video_frame) { current_brightness_level_ = Bright; break; default: - WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s: Brightness detection failed", __FUNCTION__); + break; } } } @@ -610,10 +544,13 @@ void ViECapturer::DeliverI420Frame(I420VideoFrame* video_frame) { unsigned int length = CalcBufferSize(kI420, video_frame->width(), video_frame->height()); - scoped_array<uint8_t> video_buffer(new uint8_t[length]); + scoped_ptr<uint8_t[]> video_buffer(new uint8_t[length]); ExtractBuffer(*video_frame, length, video_buffer.get()); - effect_filter_->Transform(length, video_buffer.get(), - video_frame->timestamp(), video_frame->width(), + effect_filter_->Transform(length, + video_buffer.get(), + video_frame->ntp_time_ms(), + video_frame->timestamp(), + video_frame->width(), video_frame->height()); } // Deliver the captured frame to all observers (channels, renderer or file). @@ -638,28 +575,26 @@ bool ViECapturer::CaptureCapabilityFixed() { } int32_t ViECapturer::RegisterObserver(ViECaptureObserver* observer) { - if (observer_) { - WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(engine_id_, capture_id_), - "%s Observer already registered", __FUNCTION__, capture_id_); - return -1; - } - if (capture_module_->RegisterCaptureCallback(*this) != 0) { - return -1; + { + CriticalSectionScoped cs(observer_cs_.get()); + if (observer_) { + LOG_F(LS_ERROR) << "Observer already registered."; + return -1; + } + observer_ = observer; } + capture_module_->RegisterCaptureCallback(*this); capture_module_->EnableFrameRateCallback(true); capture_module_->EnableNoPictureAlarm(true); - observer_ = observer; return 0; } int32_t ViECapturer::DeRegisterObserver() { - CriticalSectionScoped cs(observer_cs_.get()); - if (!observer_) { - return 0; - } capture_module_->EnableFrameRateCallback(false); capture_module_->EnableNoPictureAlarm(false); capture_module_->DeRegisterCaptureCallback(); + + CriticalSectionScoped cs(observer_cs_.get()); observer_ = NULL; return 0; } @@ -671,17 +606,13 @@ bool ViECapturer::IsObserverRegistered() { void ViECapturer::OnCaptureFrameRate(const int32_t id, const uint32_t frame_rate) { - WEBRTC_TRACE(kTraceStream, kTraceVideo, ViEId(engine_id_, capture_id_), - "OnCaptureFrameRate %d", frame_rate); - CriticalSectionScoped cs(observer_cs_.get()); observer_->CapturedFrameRate(id_, static_cast<uint8_t>(frame_rate)); } void ViECapturer::OnNoPictureAlarm(const int32_t id, const VideoCaptureAlarm alarm) { - WEBRTC_TRACE(kTraceStream, kTraceVideo, ViEId(engine_id_, capture_id_), - "OnNoPictureAlarm %d", alarm); + LOG(LS_WARNING) << "OnNoPictureAlarm " << id; CriticalSectionScoped cs(observer_cs_.get()); CaptureAlarm vie_alarm = (alarm == Raised) ? AlarmRaised : AlarmCleared; @@ -690,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; } |