From 9f3aabb5adc853b40c4d2449f6db19685b8d8e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= Date: Thu, 7 Feb 2019 16:42:55 +0100 Subject: [PATCH] Delete obsolete class cricket::VideoCapturer Bug: webrtc:6353 Change-Id: I220aca39319fd6562190f04bc97aa1fa9e523f31 Reviewed-on: https://webrtc-review.googlesource.com/c/119221 Reviewed-by: Steve Anton Reviewed-by: Karl Wiberg Commit-Queue: Niels Moller Cr-Commit-Position: refs/heads/master@{#26612} --- api/DEPS | 1 - media/BUILD.gn | 5 - media/base/fake_video_capturer.cc | 173 ----- media/base/fake_video_capturer.h | 80 --- media/base/video_capturer.cc | 393 ------------ media/base/video_capturer.h | 283 -------- media/base/video_capturer_unittest.cc | 785 ----------------------- pc/peer_connection_interface_unittest.cc | 1 - 8 files changed, 1721 deletions(-) delete mode 100644 media/base/fake_video_capturer.cc delete mode 100644 media/base/fake_video_capturer.h delete mode 100644 media/base/video_capturer.cc delete mode 100644 media/base/video_capturer.h delete mode 100644 media/base/video_capturer_unittest.cc diff --git a/api/DEPS b/api/DEPS index 96fd36b9ba..bc807048f7 100644 --- a/api/DEPS +++ b/api/DEPS @@ -120,7 +120,6 @@ specific_include_rules = { "peer_connection_interface\.h": [ "+logging/rtc_event_log/rtc_event_log_factory_interface.h", "+media/base/media_config.h", - "+media/base/video_capturer.h", "+media/base/media_engine.h", "+p2p/base/port_allocator.h", "+rtc_base/bitrate_allocation_strategy.h", diff --git a/media/BUILD.gn b/media/BUILD.gn index 2cb0afc6ab..c016def92f 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -108,8 +108,6 @@ rtc_static_library("rtc_media_base") { "base/video_adapter.h", "base/video_broadcaster.cc", "base/video_broadcaster.h", - "base/video_capturer.cc", - "base/video_capturer.h", "base/video_common.cc", "base/video_common.h", "base/video_source_base.cc", @@ -464,8 +462,6 @@ if (rtc_include_tests) { "base/fake_network_interface.h", "base/fake_rtp.cc", "base/fake_rtp.h", - "base/fake_video_capturer.cc", - "base/fake_video_capturer.h", "base/fake_video_renderer.cc", "base/fake_video_renderer.h", "base/test_utils.cc", @@ -559,7 +555,6 @@ if (rtc_include_tests) { "base/turn_utils_unittest.cc", "base/video_adapter_unittest.cc", "base/video_broadcaster_unittest.cc", - "base/video_capturer_unittest.cc", "base/video_common_unittest.cc", "engine/apm_helpers_unittest.cc", "engine/encoder_simulcast_proxy_unittest.cc", diff --git a/media/base/fake_video_capturer.cc b/media/base/fake_video_capturer.cc deleted file mode 100644 index 84bb032af0..0000000000 --- a/media/base/fake_video_capturer.cc +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#include "media/base/fake_video_capturer.h" - -#include -#include - -#include "absl/memory/memory.h" -#include "api/scoped_refptr.h" -#include "api/video/i420_buffer.h" -#include "api/video/video_frame_buffer.h" -#include "rtc_base/arraysize.h" -#include "rtc_base/checks.h" -#include "rtc_base/time_utils.h" - -namespace cricket { - -FakeVideoCapturer::FakeVideoCapturer(bool is_screencast) - : running_(false), - is_screencast_(is_screencast), - rotation_(webrtc::kVideoRotation_0) { - // Default supported formats. Use ResetSupportedFormats to over write. - using cricket::VideoFormat; - static const VideoFormat formats[] = { - {1280, 720, VideoFormat::FpsToInterval(30), cricket::FOURCC_I420}, - {640, 480, VideoFormat::FpsToInterval(30), cricket::FOURCC_I420}, - {320, 240, VideoFormat::FpsToInterval(30), cricket::FOURCC_I420}, - {160, 120, VideoFormat::FpsToInterval(30), cricket::FOURCC_I420}, - {1280, 720, VideoFormat::FpsToInterval(60), cricket::FOURCC_I420}, - }; - ResetSupportedFormats({&formats[0], &formats[arraysize(formats)]}); -} - -FakeVideoCapturer::FakeVideoCapturer() : FakeVideoCapturer(false) {} - -FakeVideoCapturer::~FakeVideoCapturer() { - SignalDestroyed(this); -} - -void FakeVideoCapturer::ResetSupportedFormats( - const std::vector& formats) { - SetSupportedFormats(formats); -} - -bool FakeVideoCapturer::CaptureFrame() { - if (!GetCaptureFormat()) { - return false; - } - RTC_CHECK_EQ(GetCaptureFormat()->fourcc, FOURCC_I420); - return CaptureFrame(frame_source_->GetFrame()); -} - -bool FakeVideoCapturer::CaptureCustomFrame(int width, int height) { - // Default to 30fps. - // TODO(nisse): Would anything break if we always stick to - // the configure frame interval? - return CaptureFrame(frame_source_->GetFrame(width, height, rotation_, - rtc::kNumMicrosecsPerSec / 30)); -} - -bool FakeVideoCapturer::CaptureFrame(const webrtc::VideoFrame& frame) { - if (!running_) { - return false; - } - - int adapted_width; - int adapted_height; - int crop_width; - int crop_height; - int crop_x; - int crop_y; - - // TODO(nisse): It's a bit silly to have this logic in a fake - // class. Child classes of VideoCapturer are expected to call - // AdaptFrame, and the test case - // VideoCapturerTest.SinkWantsMaxPixelAndMaxPixelCountStepUp - // depends on this. - if (AdaptFrame(frame.width(), frame.height(), frame.timestamp_us(), - frame.timestamp_us(), &adapted_width, &adapted_height, - &crop_width, &crop_height, &crop_x, &crop_y, nullptr)) { - rtc::scoped_refptr buffer( - webrtc::I420Buffer::Create(adapted_width, adapted_height)); - buffer->InitializeData(); - - webrtc::VideoFrame adapted_frame = - webrtc::VideoFrame::Builder() - .set_video_frame_buffer(buffer) - .set_rotation(frame.rotation()) - .set_timestamp_us(frame.timestamp_us()) - .set_id(frame.id()) - .build(); - OnFrame(adapted_frame, frame.width(), frame.height()); - } - - return true; -} - -cricket::CaptureState FakeVideoCapturer::Start( - const cricket::VideoFormat& format) { - SetCaptureFormat(&format); - running_ = true; - SetCaptureState(cricket::CS_RUNNING); - frame_source_ = absl::make_unique( - format.width, format.height, - format.interval / rtc::kNumNanosecsPerMicrosec, rtc::TimeMicros()); - frame_source_->SetRotation(rotation_); - return cricket::CS_RUNNING; -} - -void FakeVideoCapturer::Stop() { - running_ = false; - SetCaptureFormat(NULL); - SetCaptureState(cricket::CS_STOPPED); -} - -bool FakeVideoCapturer::IsRunning() { - return running_; -} - -bool FakeVideoCapturer::IsScreencast() const { - return is_screencast_; -} - -bool FakeVideoCapturer::GetPreferredFourccs(std::vector* fourccs) { - fourccs->push_back(cricket::FOURCC_I420); - fourccs->push_back(cricket::FOURCC_MJPG); - return true; -} - -void FakeVideoCapturer::SetRotation(webrtc::VideoRotation rotation) { - rotation_ = rotation; - if (frame_source_) - frame_source_->SetRotation(rotation_); -} - -webrtc::VideoRotation FakeVideoCapturer::GetRotation() { - return rotation_; -} - -FakeVideoCapturerWithTaskQueue::FakeVideoCapturerWithTaskQueue( - bool is_screencast) - : FakeVideoCapturer(is_screencast) {} - -FakeVideoCapturerWithTaskQueue::FakeVideoCapturerWithTaskQueue() {} - -bool FakeVideoCapturerWithTaskQueue::CaptureFrame() { - if (task_queue_.IsCurrent()) - return FakeVideoCapturer::CaptureFrame(); - bool ret = false; - task_queue_.SendTask( - [this, &ret]() { ret = FakeVideoCapturer::CaptureFrame(); }); - return ret; -} - -bool FakeVideoCapturerWithTaskQueue::CaptureCustomFrame(int width, int height) { - if (task_queue_.IsCurrent()) - return FakeVideoCapturer::CaptureCustomFrame(width, height); - bool ret = false; - task_queue_.SendTask([this, &ret, width, height]() { - ret = FakeVideoCapturer::CaptureCustomFrame(width, height); - }); - return ret; -} - -} // namespace cricket diff --git a/media/base/fake_video_capturer.h b/media/base/fake_video_capturer.h deleted file mode 100644 index 3cb64b0554..0000000000 --- a/media/base/fake_video_capturer.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#ifndef MEDIA_BASE_FAKE_VIDEO_CAPTURER_H_ -#define MEDIA_BASE_FAKE_VIDEO_CAPTURER_H_ - -#include - -#include -#include - -#include "api/video/i420_buffer.h" -#include "api/video/video_frame.h" -#include "media/base/fake_frame_source.h" -#include "media/base/video_capturer.h" -#include "media/base/video_common.h" -#include "rtc_base/task_queue_for_test.h" -#include "rtc_base/time_utils.h" - -namespace cricket { - -// Fake video capturer that allows the test to manually pump in frames. -class FakeVideoCapturer : public cricket::VideoCapturer { - public: - explicit FakeVideoCapturer(bool is_screencast); - FakeVideoCapturer(); - - ~FakeVideoCapturer() override; - - void ResetSupportedFormats(const std::vector& formats); - virtual bool CaptureFrame(); - virtual bool CaptureCustomFrame(int width, int height); - - sigslot::signal1 SignalDestroyed; - - cricket::CaptureState Start(const cricket::VideoFormat& format) override; - void Stop() override; - bool IsRunning() override; - bool IsScreencast() const override; - bool GetPreferredFourccs(std::vector* fourccs) override; - - void SetRotation(webrtc::VideoRotation rotation); - - webrtc::VideoRotation GetRotation(); - - private: - bool CaptureFrame(const webrtc::VideoFrame& frame); - - bool running_; - const bool is_screencast_; - // Duplicates FakeFrameSource::rotation_, but needed to support - // SetRotation before Start. - webrtc::VideoRotation rotation_; - std::unique_ptr frame_source_; -}; - -// Inherits from FakeVideoCapturer but adds a TaskQueue so that frames can be -// delivered on a TaskQueue as expected by VideoSinkInterface implementations. -class FakeVideoCapturerWithTaskQueue : public FakeVideoCapturer { - public: - explicit FakeVideoCapturerWithTaskQueue(bool is_screencast); - FakeVideoCapturerWithTaskQueue(); - - bool CaptureFrame() override; - bool CaptureCustomFrame(int width, int height) override; - - protected: - rtc::test::TaskQueueForTest task_queue_{"FakeVideoCapturerWithTaskQueue"}; -}; - -} // namespace cricket - -#endif // MEDIA_BASE_FAKE_VIDEO_CAPTURER_H_ diff --git a/media/base/video_capturer.cc b/media/base/video_capturer.cc deleted file mode 100644 index b51f4d89eb..0000000000 --- a/media/base/video_capturer.cc +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (c) 2010 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -// Implementation file of class VideoCapturer. - -#include "media/base/video_capturer.h" - -#include - -#include "api/scoped_refptr.h" -#include "api/video/i420_buffer.h" -#include "api/video/video_frame.h" -#include "api/video/video_frame_buffer.h" -#include "api/video/video_rotation.h" -#include "rtc_base/checks.h" -#include "rtc_base/logging.h" -#include "rtc_base/time_utils.h" - -namespace cricket { - -namespace { - -static const int64_t kMaxDistance = ~(static_cast(1) << 63); -#ifdef WEBRTC_LINUX -static const int kYU12Penalty = 16; // Needs to be higher than MJPG index. -#endif - -} // namespace - -///////////////////////////////////////////////////////////////////// -// Implementation of class VideoCapturer -///////////////////////////////////////////////////////////////////// -VideoCapturer::VideoCapturer() : apply_rotation_(false) { - thread_checker_.DetachFromThread(); - Construct(); -} - -VideoCapturer::~VideoCapturer() {} - -void VideoCapturer::Construct() { - enable_camera_list_ = false; - capture_state_ = CS_STOPPED; - scaled_width_ = 0; - scaled_height_ = 0; - enable_video_adapter_ = true; -} - -const std::vector* VideoCapturer::GetSupportedFormats() const { - return &filtered_supported_formats_; -} - -bool VideoCapturer::StartCapturing(const VideoFormat& capture_format) { - RTC_DCHECK(thread_checker_.CalledOnValidThread()); - CaptureState result = Start(capture_format); - const bool success = (result == CS_RUNNING) || (result == CS_STARTING); - if (!success) { - return false; - } - if (result == CS_RUNNING) { - SetCaptureState(result); - } - return true; -} - -bool VideoCapturer::apply_rotation() { - return apply_rotation_; -} - -void VideoCapturer::SetSupportedFormats( - const std::vector& formats) { - // This method is OK to call during initialization on a separate thread. - RTC_DCHECK(capture_state_ == CS_STOPPED || - thread_checker_.CalledOnValidThread()); - supported_formats_ = formats; - UpdateFilteredSupportedFormats(); -} - -bool VideoCapturer::GetBestCaptureFormat(const VideoFormat& format, - VideoFormat* best_format) { - RTC_DCHECK(thread_checker_.CalledOnValidThread()); - // TODO(fbarchard): Directly support max_format. - UpdateFilteredSupportedFormats(); - const std::vector* supported_formats = GetSupportedFormats(); - - if (supported_formats->empty()) { - return false; - } - RTC_LOG(LS_INFO) << " Capture Requested " << format.ToString(); - int64_t best_distance = kMaxDistance; - std::vector::const_iterator best = supported_formats->end(); - std::vector::const_iterator i; - for (i = supported_formats->begin(); i != supported_formats->end(); ++i) { - int64_t distance = GetFormatDistance(format, *i); - // TODO(fbarchard): Reduce to LS_VERBOSE if/when camera capture is - // relatively bug free. - RTC_LOG(LS_INFO) << " Supported " << i->ToString() << " distance " - << distance; - if (distance < best_distance) { - best_distance = distance; - best = i; - } - } - if (supported_formats->end() == best) { - RTC_LOG(LS_ERROR) << " No acceptable camera format found"; - return false; - } - - if (best_format) { - best_format->width = best->width; - best_format->height = best->height; - best_format->fourcc = best->fourcc; - best_format->interval = best->interval; - RTC_LOG(LS_INFO) << " Best " << best_format->ToString() << " Interval " - << best_format->interval << " distance " << best_distance; - } - return true; -} - -void VideoCapturer::ConstrainSupportedFormats(const VideoFormat& max_format) { - RTC_DCHECK(thread_checker_.CalledOnValidThread()); - max_format_.reset(new VideoFormat(max_format)); - RTC_LOG(LS_VERBOSE) << " ConstrainSupportedFormats " << max_format.ToString(); - UpdateFilteredSupportedFormats(); -} - -bool VideoCapturer::GetInputSize(int* width, int* height) { - rtc::CritScope cs(&frame_stats_crit_); - if (!input_size_valid_) { - return false; - } - *width = input_width_; - *height = input_height_; - - return true; -} - -void VideoCapturer::RemoveSink( - rtc::VideoSinkInterface* sink) { - RTC_DCHECK(thread_checker_.CalledOnValidThread()); - broadcaster_.RemoveSink(sink); - OnSinkWantsChanged(broadcaster_.wants()); -} - -void VideoCapturer::AddOrUpdateSink( - rtc::VideoSinkInterface* sink, - const rtc::VideoSinkWants& wants) { - RTC_DCHECK(thread_checker_.CalledOnValidThread()); - broadcaster_.AddOrUpdateSink(sink, wants); - OnSinkWantsChanged(broadcaster_.wants()); -} - -void VideoCapturer::OnSinkWantsChanged(const rtc::VideoSinkWants& wants) { - RTC_DCHECK(thread_checker_.CalledOnValidThread()); - apply_rotation_ = wants.rotation_applied; - - if (video_adapter()) { - video_adapter()->OnResolutionFramerateRequest(wants.target_pixel_count, - wants.max_pixel_count, - wants.max_framerate_fps); - } -} - -bool VideoCapturer::AdaptFrame(int width, - int height, - int64_t camera_time_us, - int64_t system_time_us, - int* out_width, - int* out_height, - int* crop_width, - int* crop_height, - int* crop_x, - int* crop_y, - int64_t* translated_camera_time_us) { - if (translated_camera_time_us) { - *translated_camera_time_us = - timestamp_aligner_.TranslateTimestamp(camera_time_us, system_time_us); - } - if (!broadcaster_.frame_wanted()) { - return false; - } - - if (enable_video_adapter_) { - if (!video_adapter_.AdaptFrameResolution( - width, height, camera_time_us * rtc::kNumNanosecsPerMicrosec, - crop_width, crop_height, out_width, out_height)) { - // VideoAdapter dropped the frame. - broadcaster_.OnDiscardedFrame(); - return false; - } - *crop_x = (width - *crop_width) / 2; - *crop_y = (height - *crop_height) / 2; - } else { - *out_width = width; - *out_height = height; - *crop_width = width; - *crop_height = height; - *crop_x = 0; - *crop_y = 0; - } - - return true; -} - -void VideoCapturer::OnFrame(const webrtc::VideoFrame& frame, - int orig_width, - int orig_height) { - // For a child class which implements rotation itself, we should - // always have apply_rotation_ == false or frame.rotation() == 0. - // Except possibly during races where apply_rotation_ is changed - // mid-stream. - if (apply_rotation_ && frame.rotation() != webrtc::kVideoRotation_0) { - rtc::scoped_refptr buffer( - frame.video_frame_buffer()); - if (buffer->type() != webrtc::VideoFrameBuffer::Type::kI420) { - // Sources producing non-I420 frames must handle apply_rotation - // themselves. But even if they do, we may occasionally end up - // in this case, for frames in flight at the time - // applied_rotation is set to true. In that case, we just drop - // the frame. - RTC_LOG(LS_WARNING) << "Non-I420 frame requiring rotation. Discarding."; - return; - } - webrtc::VideoFrame rotated_frame = - webrtc::VideoFrame::Builder() - .set_video_frame_buffer(webrtc::I420Buffer::Rotate( - *buffer->GetI420(), frame.rotation())) - .set_rotation(webrtc::kVideoRotation_0) - .set_timestamp_us(frame.timestamp_us()) - .set_id(frame.id()) - .build(); - broadcaster_.OnFrame(rotated_frame); - } else { - broadcaster_.OnFrame(frame); - } - UpdateInputSize(orig_width, orig_height); -} - -void VideoCapturer::SetCaptureState(CaptureState state) { - RTC_DCHECK(thread_checker_.CalledOnValidThread()); - if (state == capture_state_) { - // Don't trigger a state changed callback if the state hasn't changed. - return; - } - capture_state_ = state; - SignalStateChange(this, capture_state_); -} - -// Get the distance between the supported and desired formats. -// Prioritization is done according to this algorithm: -// 1) Width closeness. If not same, we prefer wider. -// 2) Height closeness. If not same, we prefer higher. -// 3) Framerate closeness. If not same, we prefer faster. -// 4) Compression. If desired format has a specific fourcc, we need exact match; -// otherwise, we use preference. -int64_t VideoCapturer::GetFormatDistance(const VideoFormat& desired, - const VideoFormat& supported) { - RTC_DCHECK(thread_checker_.CalledOnValidThread()); - int64_t distance = kMaxDistance; - - // Check fourcc. - uint32_t supported_fourcc = CanonicalFourCC(supported.fourcc); - int64_t delta_fourcc = kMaxDistance; - if (FOURCC_ANY == desired.fourcc) { - // Any fourcc is OK for the desired. Use preference to find best fourcc. - std::vector preferred_fourccs; - if (!GetPreferredFourccs(&preferred_fourccs)) { - return distance; - } - - for (size_t i = 0; i < preferred_fourccs.size(); ++i) { - if (supported_fourcc == CanonicalFourCC(preferred_fourccs[i])) { - delta_fourcc = i; -#ifdef WEBRTC_LINUX - // For HD avoid YU12 which is a software conversion and has 2 bugs - // b/7326348 b/6960899. Reenable when fixed. - if (supported.height >= 720 && (supported_fourcc == FOURCC_YU12 || - supported_fourcc == FOURCC_YV12)) { - delta_fourcc += kYU12Penalty; - } -#endif - break; - } - } - } else if (supported_fourcc == CanonicalFourCC(desired.fourcc)) { - delta_fourcc = 0; // Need exact match. - } - - if (kMaxDistance == delta_fourcc) { - // Failed to match fourcc. - return distance; - } - - // Check resolution and fps. - int desired_width = desired.width; - int desired_height = desired.height; - int64_t delta_w = supported.width - desired_width; - float supported_fps = VideoFormat::IntervalToFpsFloat(supported.interval); - float delta_fps = - supported_fps - VideoFormat::IntervalToFpsFloat(desired.interval); - // Check height of supported height compared to height we would like it to be. - int64_t aspect_h = desired_width - ? supported.width * desired_height / desired_width - : desired_height; - int64_t delta_h = supported.height - aspect_h; - - distance = 0; - // Set high penalty if the supported format is lower than the desired format. - // 3x means we would prefer down to down to 3/4, than up to double. - // But we'd prefer up to double than down to 1/2. This is conservative, - // strongly avoiding going down in resolution, similar to - // the old method, but not completely ruling it out in extreme situations. - // It also ignores framerate, which is often very low at high resolutions. - // TODO(fbarchard): Improve logic to use weighted factors. - static const int kDownPenalty = -3; - if (delta_w < 0) { - delta_w = delta_w * kDownPenalty; - } - if (delta_h < 0) { - delta_h = delta_h * kDownPenalty; - } - // Require camera fps to be at least 80% of what is requested if resolution - // matches. - // Require camera fps to be at least 96% of what is requested, or higher, - // if resolution differs. 96% allows for slight variations in fps. e.g. 29.97 - if (delta_fps < 0) { - float min_desirable_fps = - delta_w - ? VideoFormat::IntervalToFpsFloat(desired.interval) * 28.f / 30.f - : VideoFormat::IntervalToFpsFloat(desired.interval) * 23.f / 30.f; - delta_fps = -delta_fps; - if (supported_fps < min_desirable_fps) { - distance |= static_cast(1) << 62; - } else { - distance |= static_cast(1) << 15; - } - } - int64_t idelta_fps = static_cast(delta_fps); - - // 12 bits for width and height and 8 bits for fps and fourcc. - distance |= - (delta_w << 28) | (delta_h << 16) | (idelta_fps << 8) | delta_fourcc; - - return distance; -} - -void VideoCapturer::UpdateFilteredSupportedFormats() { - filtered_supported_formats_.clear(); - filtered_supported_formats_ = supported_formats_; - if (!max_format_) { - return; - } - std::vector::iterator iter = filtered_supported_formats_.begin(); - while (iter != filtered_supported_formats_.end()) { - if (ShouldFilterFormat(*iter)) { - iter = filtered_supported_formats_.erase(iter); - } else { - ++iter; - } - } - if (filtered_supported_formats_.empty()) { - // The device only captures at resolutions higher than |max_format_| this - // indicates that |max_format_| should be ignored as it is better to capture - // at too high a resolution than to not capture at all. - filtered_supported_formats_ = supported_formats_; - } -} - -bool VideoCapturer::ShouldFilterFormat(const VideoFormat& format) const { - RTC_DCHECK(thread_checker_.CalledOnValidThread()); - if (!enable_camera_list_) { - return false; - } - return format.width > max_format_->width || - format.height > max_format_->height; -} - -void VideoCapturer::UpdateInputSize(int width, int height) { - // Update stats protected from fetches from different thread. - rtc::CritScope cs(&frame_stats_crit_); - - input_size_valid_ = true; - input_width_ = width; - input_height_ = height; -} - -} // namespace cricket diff --git a/media/base/video_capturer.h b/media/base/video_capturer.h deleted file mode 100644 index 05219be014..0000000000 --- a/media/base/video_capturer.h +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (c) 2010 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -// Declaration of abstract class VideoCapturer - -#ifndef MEDIA_BASE_VIDEO_CAPTURER_H_ -#define MEDIA_BASE_VIDEO_CAPTURER_H_ - -#include - -#include -#include -#include -#include - -#include "api/video/video_source_interface.h" -#include "media/base/video_adapter.h" -#include "media/base/video_broadcaster.h" -#include "media/base/video_common.h" -#include "rtc_base/constructor_magic.h" -#include "rtc_base/critical_section.h" -#include "rtc_base/system/rtc_export.h" -#include "rtc_base/third_party/sigslot/sigslot.h" -#include "rtc_base/thread_checker.h" -#include "rtc_base/timestamp_aligner.h" - -namespace webrtc { -class VideoFrame; -} - -namespace cricket { - -// Current state of the capturer. -enum CaptureState { - CS_STOPPED, // The capturer has been stopped or hasn't started yet. - CS_STARTING, // The capturer is in the process of starting. Note, it may - // still fail to start. - CS_RUNNING, // The capturer has been started successfully and is now - // capturing. - CS_FAILED, // The capturer failed to start. -}; - -// VideoCapturer is an abstract class that defines the interfaces for video -// capturing. The subclasses implement the video capturer for various types of -// capturers and various platforms. -// -// The captured frames may need to be adapted (for example, cropping). -// Video adaptation is built into and enabled by default. After a frame has -// been captured from the device, it is sent to the video adapter, then out to -// the sinks. -// -// Programming model: -// Create an object of a subclass of VideoCapturer -// Initialize -// SignalStateChange.connect() -// AddOrUpdateSink() -// Find the capture format for Start() by either calling GetSupportedFormats() -// and selecting one of the supported or calling GetBestCaptureFormat(). -// video_adapter()->OnOutputFormatRequest(desired_encoding_format) -// Start() -// GetCaptureFormat() optionally -// Stop() -// -// Assumption: -// The Start() and Stop() methods are called by a single thread (E.g., the -// media engine thread). Hence, the VideoCapture subclasses dont need to be -// thread safe. -// -class RTC_EXPORT VideoCapturer - : public sigslot::has_slots<>, - public rtc::VideoSourceInterface { - public: - VideoCapturer(); - - ~VideoCapturer() override; - - // Gets the id of the underlying device, which is available after the capturer - // is initialized. Can be used to determine if two capturers reference the - // same device. - const std::string& GetId() const { return id_; } - - // Get the capture formats supported by the video capturer. The supported - // formats are non empty after the device has been opened successfully. - const std::vector* GetSupportedFormats() const; - - // Get the best capture format for the desired format. The best format is the - // same as one of the supported formats except that the frame interval may be - // different. If the application asks for 16x9 and the camera does not support - // 16x9 HD or the application asks for 16x10, we find the closest 4x3 and then - // crop; Otherwise, we find what the application asks for. Note that we assume - // that for HD, the desired format is always 16x9. The subclasses can override - // the default implementation. - // Parameters - // desired: the input desired format. If desired.fourcc is not kAnyFourcc, - // the best capture format has the exactly same fourcc. Otherwise, - // the best capture format uses a fourcc in GetPreferredFourccs(). - // best_format: the output of the best capture format. - // Return false if there is no such a best format, that is, the desired format - // is not supported. - virtual bool GetBestCaptureFormat(const VideoFormat& desired, - VideoFormat* best_format); - - // TODO(hellner): deprecate (make private) the Start API in favor of this one. - // Also remove CS_STARTING as it is implied by the return - // value of StartCapturing(). - bool StartCapturing(const VideoFormat& capture_format); - // Start the video capturer with the specified capture format. - // Parameter - // capture_format: The caller got this parameter by either calling - // GetSupportedFormats() and selecting one of the supported - // or calling GetBestCaptureFormat(). - // Return - // CS_STARTING: The capturer is trying to start. Success or failure will - // be notified via the |SignalStateChange| callback. - // CS_RUNNING: if the capturer is started and capturing. - // CS_FAILED: if the capturer failes to start.. - // CS_NO_DEVICE: if the capturer has no device and fails to start. - virtual CaptureState Start(const VideoFormat& capture_format) = 0; - - // Get the current capture format, which is set by the Start() call. - // Note that the width and height of the captured frames may differ from the - // capture format. For example, the capture format is HD but the captured - // frames may be smaller than HD. - const VideoFormat* GetCaptureFormat() const { return capture_format_.get(); } - - // Stop the video capturer. - virtual void Stop() = 0; - // Check if the video capturer is running. - virtual bool IsRunning() = 0; - CaptureState capture_state() const { return capture_state_; } - - virtual bool apply_rotation(); - - // Returns true if the capturer is screencasting. This can be used to - // implement screencast specific behavior. - virtual bool IsScreencast() const = 0; - - // Caps the VideoCapturer's format according to max_format. It can e.g. be - // used to prevent cameras from capturing at a resolution or framerate that - // the capturer is capable of but not performing satisfactorily at. - // The capping is an upper bound for each component of the capturing format. - // The fourcc component is ignored. - void ConstrainSupportedFormats(const VideoFormat& max_format); - - void set_enable_camera_list(bool enable_camera_list) { - enable_camera_list_ = enable_camera_list; - } - bool enable_camera_list() { return enable_camera_list_; } - - // Signal all capture state changes that are not a direct result of calling - // Start(). - sigslot::signal2 SignalStateChange; - - // If true, run video adaptation. By default, video adaptation is enabled - // and users must call video_adapter()->OnOutputFormatRequest() - // to receive frames. - bool enable_video_adapter() const { return enable_video_adapter_; } - void set_enable_video_adapter(bool enable_video_adapter) { - enable_video_adapter_ = enable_video_adapter; - } - - bool GetInputSize(int* width, int* height); - - // Implements VideoSourceInterface - void AddOrUpdateSink(rtc::VideoSinkInterface* sink, - const rtc::VideoSinkWants& wants) override; - void RemoveSink(rtc::VideoSinkInterface* sink) override; - - protected: - // OnSinkWantsChanged can be overridden to change the default behavior - // when a sink changes its VideoSinkWants by calling AddOrUpdateSink. - virtual void OnSinkWantsChanged(const rtc::VideoSinkWants& wants); - - // Reports the appropriate frame size after adaptation. Returns true - // if a frame is wanted. Returns false if there are no interested - // sinks, or if the VideoAdapter decides to drop the frame. - - // This function also implements timestamp translation/filtering. - // |camera_time_ns| is the camera's timestamp for the captured - // frame; it is expected to have good accuracy, but it may use an - // arbitrary epoch and a small possibly free-running with a frequency - // slightly different from the system clock. |system_time_us| is the - // monotonic system time (in the same scale as rtc::TimeMicros) when - // the frame was captured; the application is expected to read the - // system time as soon as possible after frame capture, but it may - // suffer scheduling jitter or poor system clock resolution. The - // output |translated_camera_time_us| is a combined timestamp, - // taking advantage of the supposedly higher accuracy in the camera - // timestamp, but using the same epoch and frequency as system time. - bool AdaptFrame(int width, - int height, - int64_t camera_time_us, - int64_t system_time_us, - int* out_width, - int* out_height, - int* crop_width, - int* crop_height, - int* crop_x, - int* crop_y, - int64_t* translated_camera_time_us); - - // Called when a frame has been captured and converted to a - // VideoFrame. OnFrame can be called directly by an implementation - // that does not use SignalFrameCaptured or OnFrameCaptured. The - // orig_width and orig_height are used only to produce stats. - void OnFrame(const webrtc::VideoFrame& frame, - int orig_width, - int orig_height); - - VideoAdapter* video_adapter() { return &video_adapter_; } - - void SetCaptureState(CaptureState state); - - // subclasses override this virtual method to provide a vector of fourccs, in - // order of preference, that are expected by the media engine. - virtual bool GetPreferredFourccs(std::vector* fourccs) = 0; - - // mutators to set private attributes - void SetId(const std::string& id) { id_ = id; } - - void SetCaptureFormat(const VideoFormat* format) { - capture_format_.reset(format ? new VideoFormat(*format) : NULL); - } - - void SetSupportedFormats(const std::vector& formats); - - private: - void Construct(); - // Get the distance between the desired format and the supported format. - // Return the max distance if they mismatch. See the implementation for - // details. - int64_t GetFormatDistance(const VideoFormat& desired, - const VideoFormat& supported); - - // Updates filtered_supported_formats_ so that it contains the formats in - // supported_formats_ that fulfill all applied restrictions. - void UpdateFilteredSupportedFormats(); - // Returns true if format doesn't fulfill all applied restrictions. - bool ShouldFilterFormat(const VideoFormat& format) const; - - void UpdateInputSize(int width, int height); - - rtc::ThreadChecker thread_checker_; - std::string id_; - CaptureState capture_state_; - std::unique_ptr capture_format_; - std::vector supported_formats_; - std::unique_ptr max_format_; - std::vector filtered_supported_formats_; - - bool enable_camera_list_; - int scaled_width_; // Current output size from ComputeScale. - int scaled_height_; - - rtc::VideoBroadcaster broadcaster_; - bool enable_video_adapter_; - VideoAdapter video_adapter_; - - rtc::CriticalSection frame_stats_crit_; - // The captured frame size before potential adapation. - bool input_size_valid_ RTC_GUARDED_BY(frame_stats_crit_) = false; - int input_width_ RTC_GUARDED_BY(frame_stats_crit_); - int input_height_ RTC_GUARDED_BY(frame_stats_crit_); - - // Whether capturer should apply rotation to the frame before - // passing it on to the registered sinks. - bool apply_rotation_; - - // State for the timestamp translation. - rtc::TimestampAligner timestamp_aligner_; - RTC_DISALLOW_COPY_AND_ASSIGN(VideoCapturer); -}; - -} // namespace cricket - -#endif // MEDIA_BASE_VIDEO_CAPTURER_H_ diff --git a/media/base/video_capturer_unittest.cc b/media/base/video_capturer_unittest.cc deleted file mode 100644 index bb05ca10b9..0000000000 --- a/media/base/video_capturer_unittest.cc +++ /dev/null @@ -1,785 +0,0 @@ -/* - * Copyright (c) 2008 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. An additional intellectual property rights grant can be found - * in the file PATENTS. All contributing project authors may - * be found in the AUTHORS file in the root of the source tree. - */ - -#include -#include -#include - -#include "absl/types/optional.h" -#include "api/video/video_rotation.h" -#include "media/base/fake_video_capturer.h" -#include "media/base/fake_video_renderer.h" -#include "media/base/video_capturer.h" -#include "rtc_base/gunit.h" -#include "rtc_base/thread.h" -#include "test/gtest.h" - -using cricket::FakeVideoCapturerWithTaskQueue; - -namespace { - -const int kMsCallbackWait = 500; -// For HD only the height matters. -const int kMinHdHeight = 720; - -} // namespace - -class VideoCapturerTest : public sigslot::has_slots<>, public testing::Test { - public: - VideoCapturerTest() - : capture_state_(cricket::CS_STOPPED), num_state_changes_(0) { - InitCapturer(false); - } - - protected: - void InitCapturer(bool is_screencast) { - capturer_ = std::unique_ptr( - new FakeVideoCapturerWithTaskQueue(is_screencast)); - capturer_->SignalStateChange.connect(this, - &VideoCapturerTest::OnStateChange); - capturer_->AddOrUpdateSink(&renderer_, rtc::VideoSinkWants()); - } - void InitScreencast() { InitCapturer(true); } - - void OnStateChange(cricket::VideoCapturer*, - cricket::CaptureState capture_state) { - capture_state_ = capture_state; - ++num_state_changes_; - } - cricket::CaptureState capture_state() { return capture_state_; } - int num_state_changes() { return num_state_changes_; } - - std::unique_ptr capturer_; - cricket::CaptureState capture_state_; - int num_state_changes_; - cricket::FakeVideoRenderer renderer_; - bool expects_rotation_applied_; -}; - -TEST_F(VideoCapturerTest, CaptureState) { - EXPECT_TRUE(capturer_->enable_video_adapter()); - EXPECT_EQ(cricket::CS_RUNNING, - capturer_->Start(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420))); - EXPECT_TRUE(capturer_->IsRunning()); - EXPECT_EQ_WAIT(cricket::CS_RUNNING, capture_state(), kMsCallbackWait); - EXPECT_EQ(1, num_state_changes()); - capturer_->Stop(); - EXPECT_EQ_WAIT(cricket::CS_STOPPED, capture_state(), kMsCallbackWait); - EXPECT_EQ(2, num_state_changes()); - capturer_->Stop(); - rtc::Thread::Current()->ProcessMessages(100); - EXPECT_EQ(2, num_state_changes()); -} - -TEST_F(VideoCapturerTest, ScreencastScaledOddWidth) { - InitScreencast(); - - int kWidth = 1281; - int kHeight = 720; - - std::vector formats; - formats.push_back(cricket::VideoFormat(kWidth, kHeight, - cricket::VideoFormat::FpsToInterval(5), - cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(formats); - - EXPECT_EQ(cricket::CS_RUNNING, - capturer_->Start(cricket::VideoFormat( - kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420))); - EXPECT_TRUE(capturer_->IsRunning()); - EXPECT_EQ(0, renderer_.num_rendered_frames()); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(1, renderer_.num_rendered_frames()); - EXPECT_EQ(kWidth, renderer_.width()); - EXPECT_EQ(kHeight, renderer_.height()); -} - -TEST_F(VideoCapturerTest, TestRotationAppliedBySource) { - int kWidth = 800; - int kHeight = 400; - int frame_count = 0; - - std::vector formats; - formats.push_back(cricket::VideoFormat(kWidth, kHeight, - cricket::VideoFormat::FpsToInterval(5), - cricket::FOURCC_I420)); - - capturer_->ResetSupportedFormats(formats); - rtc::VideoSinkWants wants; - // |capturer_| should compensate rotation. - wants.rotation_applied = true; - capturer_->AddOrUpdateSink(&renderer_, wants); - - // capturer_ should compensate rotation as default. - EXPECT_EQ(cricket::CS_RUNNING, - capturer_->Start(cricket::VideoFormat( - kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420))); - EXPECT_TRUE(capturer_->IsRunning()); - EXPECT_EQ(0, renderer_.num_rendered_frames()); - - // If the frame's rotation is compensated anywhere in the pipeline based on - // the rotation information, the renderer should be given the right dimension - // such that the frame could be rendered. - - capturer_->SetRotation(webrtc::kVideoRotation_90); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(++frame_count, renderer_.num_rendered_frames()); - // Swapped width and height - EXPECT_EQ(kWidth, renderer_.height()); - EXPECT_EQ(kHeight, renderer_.width()); - EXPECT_EQ(webrtc::kVideoRotation_0, renderer_.rotation()); - - capturer_->SetRotation(webrtc::kVideoRotation_270); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(++frame_count, renderer_.num_rendered_frames()); - // Swapped width and height - EXPECT_EQ(kWidth, renderer_.height()); - EXPECT_EQ(kHeight, renderer_.width()); - EXPECT_EQ(webrtc::kVideoRotation_0, renderer_.rotation()); - - capturer_->SetRotation(webrtc::kVideoRotation_180); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(++frame_count, renderer_.num_rendered_frames()); - // Back to normal width and height - EXPECT_EQ(kWidth, renderer_.width()); - EXPECT_EQ(kHeight, renderer_.height()); - EXPECT_EQ(webrtc::kVideoRotation_0, renderer_.rotation()); -} - -TEST_F(VideoCapturerTest, TestRotationAppliedBySinkByDefault) { - int kWidth = 800; - int kHeight = 400; - - std::vector formats; - formats.push_back(cricket::VideoFormat(kWidth, kHeight, - cricket::VideoFormat::FpsToInterval(5), - cricket::FOURCC_I420)); - - capturer_->ResetSupportedFormats(formats); - - EXPECT_EQ(cricket::CS_RUNNING, - capturer_->Start(cricket::VideoFormat( - kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420))); - EXPECT_TRUE(capturer_->IsRunning()); - EXPECT_EQ(0, renderer_.num_rendered_frames()); - - // If the frame's rotation is compensated anywhere in the pipeline, the frame - // won't have its original dimension out from capturer. Since the renderer - // here has the same dimension as the capturer, it will skip that frame as the - // resolution won't match anymore. - - int frame_count = 0; - capturer_->SetRotation(webrtc::kVideoRotation_0); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(++frame_count, renderer_.num_rendered_frames()); - EXPECT_EQ(capturer_->GetRotation(), renderer_.rotation()); - - capturer_->SetRotation(webrtc::kVideoRotation_90); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(++frame_count, renderer_.num_rendered_frames()); - EXPECT_EQ(capturer_->GetRotation(), renderer_.rotation()); - - capturer_->SetRotation(webrtc::kVideoRotation_180); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(++frame_count, renderer_.num_rendered_frames()); - EXPECT_EQ(capturer_->GetRotation(), renderer_.rotation()); - - capturer_->SetRotation(webrtc::kVideoRotation_270); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(++frame_count, renderer_.num_rendered_frames()); - EXPECT_EQ(capturer_->GetRotation(), renderer_.rotation()); -} - -TEST_F(VideoCapturerTest, TestRotationAppliedBySourceWhenDifferentWants) { - int kWidth = 800; - int kHeight = 400; - - std::vector formats; - formats.push_back(cricket::VideoFormat(kWidth, kHeight, - cricket::VideoFormat::FpsToInterval(5), - cricket::FOURCC_I420)); - - capturer_->ResetSupportedFormats(formats); - rtc::VideoSinkWants wants; - // capturer_ should not compensate rotation. - wants.rotation_applied = false; - capturer_->AddOrUpdateSink(&renderer_, wants); - - EXPECT_EQ(cricket::CS_RUNNING, - capturer_->Start(cricket::VideoFormat( - kWidth, kHeight, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420))); - EXPECT_TRUE(capturer_->IsRunning()); - EXPECT_EQ(0, renderer_.num_rendered_frames()); - - int frame_count = 0; - capturer_->SetRotation(webrtc::kVideoRotation_90); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(++frame_count, renderer_.num_rendered_frames()); - EXPECT_EQ(capturer_->GetRotation(), renderer_.rotation()); - - // Add another sink that wants frames to be rotated. - cricket::FakeVideoRenderer renderer2; - wants.rotation_applied = true; - capturer_->AddOrUpdateSink(&renderer2, wants); - - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(++frame_count, renderer_.num_rendered_frames()); - EXPECT_EQ(1, renderer2.num_rendered_frames()); - EXPECT_EQ(webrtc::kVideoRotation_0, renderer_.rotation()); - EXPECT_EQ(webrtc::kVideoRotation_0, renderer2.rotation()); -} - -// TODO(nisse): This test doesn't quite fit here. It tests two things: -// Aggregation of VideoSinkWants, which is the responsibility of -// VideoBroadcaster, and translation of VideoSinkWants to actual -// resolution, which is the responsibility of the VideoAdapter. -TEST_F(VideoCapturerTest, SinkWantsMaxPixelAndMaxPixelCountStepUp) { - EXPECT_EQ(cricket::CS_RUNNING, - capturer_->Start(cricket::VideoFormat( - 1280, 720, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420))); - EXPECT_TRUE(capturer_->IsRunning()); - - EXPECT_EQ(0, renderer_.num_rendered_frames()); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(1, renderer_.num_rendered_frames()); - EXPECT_EQ(1280, renderer_.width()); - EXPECT_EQ(720, renderer_.height()); - - // Request a lower resolution. The output resolution will have a resolution - // with less than or equal to |wants.max_pixel_count| depending on how the - // capturer can scale the input frame size. - rtc::VideoSinkWants wants; - wants.max_pixel_count = 1280 * 720 * 3 / 5; - capturer_->AddOrUpdateSink(&renderer_, wants); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(2, renderer_.num_rendered_frames()); - EXPECT_EQ(960, renderer_.width()); - EXPECT_EQ(540, renderer_.height()); - - // Request a lower resolution. - wants.max_pixel_count = (renderer_.width() * renderer_.height() * 3) / 5; - capturer_->AddOrUpdateSink(&renderer_, wants); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(3, renderer_.num_rendered_frames()); - EXPECT_EQ(640, renderer_.width()); - EXPECT_EQ(360, renderer_.height()); - - // Adding a new renderer should not affect resolution. - cricket::FakeVideoRenderer renderer2; - capturer_->AddOrUpdateSink(&renderer2, rtc::VideoSinkWants()); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(4, renderer_.num_rendered_frames()); - EXPECT_EQ(640, renderer_.width()); - EXPECT_EQ(360, renderer_.height()); - EXPECT_EQ(1, renderer2.num_rendered_frames()); - EXPECT_EQ(640, renderer2.width()); - EXPECT_EQ(360, renderer2.height()); - - // Request higher resolution. - wants.target_pixel_count.emplace((wants.max_pixel_count * 5) / 3); - wants.max_pixel_count = wants.max_pixel_count * 4; - capturer_->AddOrUpdateSink(&renderer_, wants); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(5, renderer_.num_rendered_frames()); - EXPECT_EQ(960, renderer_.width()); - EXPECT_EQ(540, renderer_.height()); - EXPECT_EQ(2, renderer2.num_rendered_frames()); - EXPECT_EQ(960, renderer2.width()); - EXPECT_EQ(540, renderer2.height()); - - // Updating with no wants should not affect resolution. - capturer_->AddOrUpdateSink(&renderer2, rtc::VideoSinkWants()); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(6, renderer_.num_rendered_frames()); - EXPECT_EQ(960, renderer_.width()); - EXPECT_EQ(540, renderer_.height()); - EXPECT_EQ(3, renderer2.num_rendered_frames()); - EXPECT_EQ(960, renderer2.width()); - EXPECT_EQ(540, renderer2.height()); - - // But resetting the wants should reset the resolution to what the camera is - // opened with. - capturer_->AddOrUpdateSink(&renderer_, rtc::VideoSinkWants()); - EXPECT_TRUE(capturer_->CaptureFrame()); - EXPECT_EQ(7, renderer_.num_rendered_frames()); - EXPECT_EQ(1280, renderer_.width()); - EXPECT_EQ(720, renderer_.height()); - EXPECT_EQ(4, renderer2.num_rendered_frames()); - EXPECT_EQ(1280, renderer2.width()); - EXPECT_EQ(720, renderer2.height()); -} - -TEST_F(VideoCapturerTest, TestFourccMatch) { - cricket::VideoFormat desired( - 640, 480, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_ANY); - cricket::VideoFormat best; - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(480, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - desired.fourcc = cricket::FOURCC_MJPG; - EXPECT_FALSE(capturer_->GetBestCaptureFormat(desired, &best)); - - desired.fourcc = cricket::FOURCC_I420; - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); -} - -TEST_F(VideoCapturerTest, TestResolutionMatch) { - cricket::VideoFormat desired( - 1920, 1080, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_ANY); - cricket::VideoFormat best; - // Ask for 1920x1080. Get HD 1280x720 which is the highest. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(1280, best.width); - EXPECT_EQ(720, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - desired.width = 360; - desired.height = 250; - // Ask for a little higher than QVGA. Get QVGA. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(320, best.width); - EXPECT_EQ(240, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - desired.width = 480; - desired.height = 270; - // Ask for HVGA. Get VGA. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(480, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - desired.width = 320; - desired.height = 240; - // Ask for QVGA. Get QVGA. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(320, best.width); - EXPECT_EQ(240, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - desired.width = 80; - desired.height = 60; - // Ask for lower than QQVGA. Get QQVGA, which is the lowest. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(160, best.width); - EXPECT_EQ(120, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); -} - -TEST_F(VideoCapturerTest, TestHDResolutionMatch) { - // Add some HD formats typical of a mediocre HD webcam. - std::vector formats; - formats.push_back(cricket::VideoFormat( - 320, 240, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - formats.push_back(cricket::VideoFormat( - 960, 544, cricket::VideoFormat::FpsToInterval(24), cricket::FOURCC_I420)); - formats.push_back( - cricket::VideoFormat(1280, 720, cricket::VideoFormat::FpsToInterval(15), - cricket::FOURCC_I420)); - formats.push_back(cricket::VideoFormat(2592, 1944, - cricket::VideoFormat::FpsToInterval(7), - cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(formats); - - cricket::VideoFormat desired( - 960, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_ANY); - cricket::VideoFormat best; - // Ask for 960x720 30 fps. Get qHD 24 fps - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(960, best.width); - EXPECT_EQ(544, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(24), best.interval); - - desired.width = 960; - desired.height = 544; - desired.interval = cricket::VideoFormat::FpsToInterval(30); - // Ask for qHD 30 fps. Get qHD 24 fps - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(960, best.width); - EXPECT_EQ(544, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(24), best.interval); - - desired.width = 360; - desired.height = 250; - desired.interval = cricket::VideoFormat::FpsToInterval(30); - // Ask for a little higher than QVGA. Get QVGA. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(320, best.width); - EXPECT_EQ(240, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - desired.width = 480; - desired.height = 270; - // Ask for HVGA. Get VGA. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(480, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - desired.width = 320; - desired.height = 240; - // Ask for QVGA. Get QVGA. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(320, best.width); - EXPECT_EQ(240, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - desired.width = 160; - desired.height = 120; - // Ask for lower than QVGA. Get QVGA, which is the lowest. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(320, best.width); - EXPECT_EQ(240, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - desired.width = 1280; - desired.height = 720; - // Ask for HD. 720p fps is too low. Get VGA which has 30 fps. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(480, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - desired.width = 1280; - desired.height = 720; - desired.interval = cricket::VideoFormat::FpsToInterval(15); - // Ask for HD 15 fps. Fps matches. Get HD - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(1280, best.width); - EXPECT_EQ(720, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval); - - desired.width = 1920; - desired.height = 1080; - desired.interval = cricket::VideoFormat::FpsToInterval(30); - // Ask for 1080p. Fps of HD formats is too low. Get VGA which can do 30 fps. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(desired, &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(480, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); -} - -// Some cameras support 320x240 and 320x640. Verify we choose 320x240. -TEST_F(VideoCapturerTest, TestStrangeFormats) { - std::vector supported_formats; - supported_formats.push_back(cricket::VideoFormat( - 320, 240, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 320, 640, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - - std::vector required_formats; - required_formats.push_back(cricket::VideoFormat( - 320, 240, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - required_formats.push_back(cricket::VideoFormat( - 320, 200, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - required_formats.push_back(cricket::VideoFormat( - 320, 180, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - cricket::VideoFormat best; - for (size_t i = 0; i < required_formats.size(); ++i) { - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best)); - EXPECT_EQ(320, best.width); - EXPECT_EQ(240, best.height); - } - - supported_formats.clear(); - supported_formats.push_back(cricket::VideoFormat( - 320, 640, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 320, 240, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - - for (size_t i = 0; i < required_formats.size(); ++i) { - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best)); - EXPECT_EQ(320, best.width); - EXPECT_EQ(240, best.height); - } -} - -// Some cameras only have very low fps. Verify we choose something sensible. -TEST_F(VideoCapturerTest, TestPoorFpsFormats) { - // all formats are low framerate - std::vector supported_formats; - supported_formats.push_back(cricket::VideoFormat( - 320, 240, cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 1280, 720, cricket::VideoFormat::FpsToInterval(2), cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - - std::vector required_formats; - required_formats.push_back(cricket::VideoFormat( - 320, 240, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - required_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - cricket::VideoFormat best; - for (size_t i = 0; i < required_formats.size(); ++i) { - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best)); - EXPECT_EQ(required_formats[i].width, best.width); - EXPECT_EQ(required_formats[i].height, best.height); - } - - // Increase framerate of 320x240. Expect low fps VGA avoided. - supported_formats.clear(); - supported_formats.push_back(cricket::VideoFormat( - 320, 240, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(7), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 1280, 720, cricket::VideoFormat::FpsToInterval(2), cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - - for (size_t i = 0; i < required_formats.size(); ++i) { - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best)); - EXPECT_EQ(320, best.width); - EXPECT_EQ(240, best.height); - } -} - -// Some cameras support same size with different frame rates. Verify we choose -// the frame rate properly. -TEST_F(VideoCapturerTest, TestSameSizeDifferentFpsFormats) { - std::vector supported_formats; - supported_formats.push_back(cricket::VideoFormat( - 320, 240, cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 320, 240, cricket::VideoFormat::FpsToInterval(20), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 320, 240, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - - std::vector required_formats = supported_formats; - cricket::VideoFormat best; - for (size_t i = 0; i < required_formats.size(); ++i) { - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best)); - EXPECT_EQ(320, best.width); - EXPECT_EQ(240, best.height); - EXPECT_EQ(required_formats[i].interval, best.interval); - } -} - -// Some cameras support the correct resolution but at a lower fps than -// we'd like. This tests we get the expected resolution and fps. -TEST_F(VideoCapturerTest, TestFpsFormats) { - // We have VGA but low fps. Choose VGA, not HD - std::vector supported_formats; - supported_formats.push_back( - cricket::VideoFormat(1280, 720, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 400, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 360, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - - std::vector required_formats; - required_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_ANY)); - required_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(20), cricket::FOURCC_ANY)); - required_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(10), cricket::FOURCC_ANY)); - cricket::VideoFormat best; - - // Expect 30 fps to choose 30 fps format. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[0], &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(400, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - // Expect 20 fps to choose 30 fps format. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[1], &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(400, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(30), best.interval); - - // Expect 10 fps to choose 15 fps format and set fps to 15. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[2], &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(480, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval); - - // We have VGA 60 fps and 15 fps. Choose best fps. - supported_formats.clear(); - supported_formats.push_back( - cricket::VideoFormat(1280, 720, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(60), cricket::FOURCC_MJPG)); - supported_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(15), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 400, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 360, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - - // Expect 30 fps to choose 60 fps format and will set best fps to 60. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[0], &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(480, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(60), best.interval); - - // Expect 20 fps to choose 60 fps format, and will set best fps to 60. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[1], &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(480, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(60), best.interval); - - // Expect 10 fps to choose 15 fps. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[2], &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(480, best.height); - EXPECT_EQ(cricket::VideoFormat::FpsToInterval(15), best.interval); -} - -TEST_F(VideoCapturerTest, TestRequest16x10_9) { - std::vector supported_formats; - // We do not support HD, expect 4x3 for 4x3, 16x10, and 16x9 requests. - supported_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 400, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 360, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - - std::vector required_formats = supported_formats; - cricket::VideoFormat best; - // Expect 4x3, 16x10, and 16x9 requests are respected. - for (size_t i = 0; i < required_formats.size(); ++i) { - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best)); - EXPECT_EQ(required_formats[i].width, best.width); - EXPECT_EQ(required_formats[i].height, best.height); - } - - // We do not support 16x9 HD, expect 4x3 for 4x3, 16x10, and 16x9 requests. - supported_formats.clear(); - supported_formats.push_back(cricket::VideoFormat( - 960, 720, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 400, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 360, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - - // Expect 4x3, 16x10, and 16x9 requests are respected. - for (size_t i = 0; i < required_formats.size(); ++i) { - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best)); - EXPECT_EQ(required_formats[i].width, best.width); - EXPECT_EQ(required_formats[i].height, best.height); - } - - // We support 16x9HD, Expect 4x3, 16x10, and 16x9 requests are respected. - supported_formats.clear(); - supported_formats.push_back( - cricket::VideoFormat(1280, 720, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 480, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 400, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - supported_formats.push_back(cricket::VideoFormat( - 640, 360, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - - // Expect 4x3 for 4x3 and 16x10 requests. - for (size_t i = 0; i < required_formats.size() - 1; ++i) { - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[i], &best)); - EXPECT_EQ(required_formats[i].width, best.width); - EXPECT_EQ(required_formats[i].height, best.height); - } - - // Expect 16x9 for 16x9 request. - EXPECT_TRUE(capturer_->GetBestCaptureFormat(required_formats[2], &best)); - EXPECT_EQ(640, best.width); - EXPECT_EQ(360, best.height); -} - -bool HdFormatInList(const std::vector& formats) { - for (std::vector::const_iterator found = - formats.begin(); - found != formats.end(); ++found) { - if (found->height >= kMinHdHeight) { - return true; - } - } - return false; -} - -TEST_F(VideoCapturerTest, Whitelist) { - // The definition of HD only applies to the height. Set the HD width to the - // smallest legal number to document this fact in this test. - const int kMinHdWidth = 1; - cricket::VideoFormat hd_format(kMinHdWidth, kMinHdHeight, - cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420); - cricket::VideoFormat vga_format( - 640, 480, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420); - std::vector formats = *capturer_->GetSupportedFormats(); - formats.push_back(hd_format); - - // Enable whitelist. Expect HD not in list. - capturer_->set_enable_camera_list(true); - capturer_->ResetSupportedFormats(formats); - EXPECT_TRUE(HdFormatInList(*capturer_->GetSupportedFormats())); - capturer_->ConstrainSupportedFormats(vga_format); - EXPECT_FALSE(HdFormatInList(*capturer_->GetSupportedFormats())); - - // Disable whitelist. Expect HD in list. - capturer_->set_enable_camera_list(false); - capturer_->ResetSupportedFormats(formats); - EXPECT_TRUE(HdFormatInList(*capturer_->GetSupportedFormats())); - capturer_->ConstrainSupportedFormats(vga_format); - EXPECT_TRUE(HdFormatInList(*capturer_->GetSupportedFormats())); -} - -TEST_F(VideoCapturerTest, BlacklistAllFormats) { - cricket::VideoFormat vga_format( - 640, 480, cricket::VideoFormat::FpsToInterval(30), cricket::FOURCC_I420); - std::vector supported_formats; - // Mock a device that only supports HD formats. - supported_formats.push_back( - cricket::VideoFormat(1280, 720, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420)); - supported_formats.push_back( - cricket::VideoFormat(1920, 1080, cricket::VideoFormat::FpsToInterval(30), - cricket::FOURCC_I420)); - capturer_->ResetSupportedFormats(supported_formats); - EXPECT_EQ(2u, capturer_->GetSupportedFormats()->size()); - // Now, enable the list, which would exclude both formats. However, since - // only HD formats are available, we refuse to filter at all, so we don't - // break this camera. - capturer_->set_enable_camera_list(true); - capturer_->ConstrainSupportedFormats(vga_format); - EXPECT_EQ(2u, capturer_->GetSupportedFormats()->size()); - // To make sure it's not just the camera list being broken, add in VGA and - // try again. This time, only the VGA format should be there. - supported_formats.push_back(vga_format); - capturer_->ResetSupportedFormats(supported_formats); - ASSERT_EQ(1u, capturer_->GetSupportedFormats()->size()); - EXPECT_EQ(vga_format.height, capturer_->GetSupportedFormats()->at(0).height); -} diff --git a/pc/peer_connection_interface_unittest.cc b/pc/peer_connection_interface_unittest.cc index 8e2226103b..3803b7fa23 100644 --- a/pc/peer_connection_interface_unittest.cc +++ b/pc/peer_connection_interface_unittest.cc @@ -49,7 +49,6 @@ #include "media/base/media_config.h" #include "media/base/media_engine.h" #include "media/base/stream_params.h" -#include "media/base/video_capturer.h" #include "media/engine/webrtc_media_engine.h" #include "media/sctp/sctp_transport_internal.h" #include "modules/audio_device/include/audio_device.h"