summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/webrtc/video_engine/vie_capturer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/webrtc/video_engine/vie_capturer.cc')
-rw-r--r--chromium/third_party/webrtc/video_engine/vie_capturer.cc201
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;
}