| Index: media/capture/video/mac/video_capture_device_mac.mm
|
| diff --git a/media/capture/video/mac/video_capture_device_mac.mm b/media/capture/video/mac/video_capture_device_mac.mm
|
| index ec6fcaf83f9279d46beea362f6b16a9814607456..39b6a3da0923fa30c104ba3585eda89b1cdbd15e 100644
|
| --- a/media/capture/video/mac/video_capture_device_mac.mm
|
| +++ b/media/capture/video/mac/video_capture_device_mac.mm
|
| @@ -27,7 +27,6 @@
|
| #include "media/base/timestamp_constants.h"
|
| #import "media/capture/video/mac/platform_video_capturing_mac.h"
|
| #import "media/capture/video/mac/video_capture_device_avfoundation_mac.h"
|
| -#import "media/capture/video/mac/video_capture_device_qtkit_mac.h"
|
| #include "ui/gfx/geometry/size.h"
|
|
|
| @implementation DeviceNameAndTransportType
|
| @@ -59,23 +58,6 @@ const float kMaxFrameRate = 30.0f;
|
| // In device identifiers, the USB VID and PID are stored in 4 bytes each.
|
| const size_t kVidPidSize = 4;
|
|
|
| -const struct Resolution {
|
| - const int width;
|
| - const int height;
|
| -} kQVGA = {320, 240}, kVGA = {640, 480}, kHD = {1280, 720};
|
| -
|
| -const struct Resolution* const kWellSupportedResolutions[] = {
|
| - &kQVGA,
|
| - &kVGA,
|
| - &kHD,
|
| -};
|
| -
|
| -// Rescaling the image to fix the pixel aspect ratio runs the risk of making
|
| -// the aspect ratio worse, if QTKit selects a new source mode with a different
|
| -// shape. This constant ensures that we don't take this risk if the current
|
| -// aspect ratio is tolerable.
|
| -const float kMaxPixelAspectRatio = 1.15;
|
| -
|
| // The following constants are extracted from the specification "Universal
|
| // Serial Bus Device Class Definition for Video Devices", Rev. 1.1 June 1, 2005.
|
| // http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip
|
| @@ -101,21 +83,6 @@ typedef struct IOUSBInterfaceDescriptor {
|
| UInt8 bUnitID;
|
| } IOUSBInterfaceDescriptor;
|
|
|
| -static void GetBestMatchSupportedResolution(gfx::Size* resolution) {
|
| - int min_diff = std::numeric_limits<int32_t>::max();
|
| - const int desired_area = resolution->GetArea();
|
| - for (size_t i = 0; i < arraysize(kWellSupportedResolutions); ++i) {
|
| - const int area = kWellSupportedResolutions[i]->width *
|
| - kWellSupportedResolutions[i]->height;
|
| - const int diff = std::abs(desired_area - area);
|
| - if (diff < min_diff) {
|
| - min_diff = diff;
|
| - resolution->SetSize(kWellSupportedResolutions[i]->width,
|
| - kWellSupportedResolutions[i]->height);
|
| - }
|
| - }
|
| -}
|
| -
|
| // Tries to create a user-side device interface for a given USB device. Returns
|
| // true if interface was found and passes it back in |device_interface|. The
|
| // caller should release |device_interface|.
|
| @@ -347,15 +314,11 @@ const std::string VideoCaptureDevice::Name::GetModel() const {
|
|
|
| VideoCaptureDeviceMac::VideoCaptureDeviceMac(const Name& device_name)
|
| : device_name_(device_name),
|
| - tried_to_square_pixels_(false),
|
| task_runner_(base::ThreadTaskRunnerHandle::Get()),
|
| state_(kNotInitialized),
|
| capture_device_(nil),
|
| first_timestamp_(media::kNoTimestamp()),
|
| weak_factory_(this) {
|
| - // Avoid reconfiguring AVFoundation or blacklisted devices.
|
| - final_resolution_selected_ = AVFoundationGlue::IsAVFoundationSupported() ||
|
| - device_name.is_blacklisted();
|
| }
|
|
|
| VideoCaptureDeviceMac::~VideoCaptureDeviceMac() {
|
| @@ -371,18 +334,10 @@ void VideoCaptureDeviceMac::AllocateAndStart(
|
| return;
|
| }
|
|
|
| - // QTKit API can scale captured frame to any size requested, which would lead
|
| - // to undesired aspect ratio changes. Try to open the camera with a known
|
| - // supported format and let the client crop/pad the captured frames.
|
| - gfx::Size resolution = params.requested_format.frame_size;
|
| - if (!AVFoundationGlue::IsAVFoundationSupported())
|
| - GetBestMatchSupportedResolution(&resolution);
|
| -
|
| client_ = std::move(client);
|
| if (device_name_.capture_api_type() == Name::AVFOUNDATION)
|
| LogMessage("Using AVFoundation for device: " + device_name_.name());
|
| - else
|
| - LogMessage("Using QTKit for device: " + device_name_.name());
|
| +
|
| NSString* deviceId =
|
| [NSString stringWithUTF8String:device_name_.id().c_str()];
|
|
|
| @@ -393,26 +348,16 @@ void VideoCaptureDeviceMac::AllocateAndStart(
|
| return;
|
| }
|
|
|
| - capture_format_.frame_size = resolution;
|
| + capture_format_.frame_size = params.requested_format.frame_size;
|
| capture_format_.frame_rate =
|
| std::max(kMinFrameRate,
|
| std::min(params.requested_format.frame_rate, kMaxFrameRate));
|
| - // Leave the pixel format selection to AVFoundation/QTKit. The pixel format
|
| + // Leave the pixel format selection to AVFoundation. The pixel format
|
| // will be passed to |ReceiveFrame|.
|
| capture_format_.pixel_format = PIXEL_FORMAT_UNKNOWN;
|
|
|
| - // QTKit: Set the capture resolution only if this is VGA or smaller, otherwise
|
| - // leave it unconfigured and start capturing: QTKit will produce frames at the
|
| - // native resolution, allowing us to identify cameras whose native resolution
|
| - // is too low for HD. This additional information comes at a cost in startup
|
| - // latency, because the webcam will need to be reopened if its default
|
| - // resolution is not HD or VGA.
|
| - // AVfoundation is configured for all resolutions.
|
| - if (AVFoundationGlue::IsAVFoundationSupported() ||
|
| - resolution.width() <= kVGA.width || resolution.height() <= kVGA.height) {
|
| if (!UpdateCaptureResolution())
|
| return;
|
| - }
|
|
|
| // Try setting the power line frequency removal (anti-flicker). The built-in
|
| // cameras are normally suspended so the configuration must happen right
|
| @@ -445,7 +390,6 @@ void VideoCaptureDeviceMac::StopAndDeAllocate() {
|
| [capture_device_ setFrameReceiver:nil];
|
| client_.reset();
|
| state_ = kIdle;
|
| - tried_to_square_pixels_ = false;
|
| }
|
|
|
| bool VideoCaptureDeviceMac::Init(
|
| @@ -456,9 +400,6 @@ bool VideoCaptureDeviceMac::Init(
|
| if (capture_api_type == Name::AVFOUNDATION) {
|
| capture_device_ =
|
| [[VideoCaptureDeviceAVFoundation alloc] initWithFrameReceiver:this];
|
| - } else {
|
| - capture_device_ =
|
| - [[VideoCaptureDeviceQTKit alloc] initWithFrameReceiver:this];
|
| }
|
|
|
| if (!capture_device_)
|
| @@ -475,70 +416,8 @@ void VideoCaptureDeviceMac::ReceiveFrame(const uint8_t* video_frame,
|
| int aspect_denominator,
|
| base::TimeDelta timestamp) {
|
| // This method is safe to call from a device capture thread, i.e. any thread
|
| - // controlled by QTKit/AVFoundation.
|
| - if (!final_resolution_selected_) {
|
| - DCHECK(!AVFoundationGlue::IsAVFoundationSupported());
|
| - if (capture_format_.frame_size.width() > kVGA.width ||
|
| - capture_format_.frame_size.height() > kVGA.height) {
|
| - // We are requesting HD. Make sure that the picture is good, otherwise
|
| - // drop down to VGA.
|
| - bool change_to_vga = false;
|
| - if (frame_format.frame_size.width() <
|
| - capture_format_.frame_size.width() ||
|
| - frame_format.frame_size.height() <
|
| - capture_format_.frame_size.height()) {
|
| - // These are the default capture settings, not yet configured to match
|
| - // |capture_format_|.
|
| - DCHECK(frame_format.frame_rate == 0);
|
| - DVLOG(1) << "Switching to VGA because the default resolution is "
|
| - << frame_format.frame_size.ToString();
|
| - change_to_vga = true;
|
| - }
|
| -
|
| - if (capture_format_.frame_size == frame_format.frame_size &&
|
| - aspect_numerator != aspect_denominator) {
|
| - DVLOG(1) << "Switching to VGA because HD has nonsquare pixel "
|
| - << "aspect ratio " << aspect_numerator << ":"
|
| - << aspect_denominator;
|
| - change_to_vga = true;
|
| - }
|
| -
|
| - if (change_to_vga)
|
| - capture_format_.frame_size.SetSize(kVGA.width, kVGA.height);
|
| - }
|
| -
|
| - if (capture_format_.frame_size == frame_format.frame_size &&
|
| - !tried_to_square_pixels_ &&
|
| - (aspect_numerator > kMaxPixelAspectRatio * aspect_denominator ||
|
| - aspect_denominator > kMaxPixelAspectRatio * aspect_numerator)) {
|
| - // The requested size results in non-square PAR. Shrink the frame to 1:1
|
| - // PAR (assuming QTKit selects the same input mode, which is not
|
| - // guaranteed).
|
| - int new_width = capture_format_.frame_size.width();
|
| - int new_height = capture_format_.frame_size.height();
|
| - if (aspect_numerator < aspect_denominator)
|
| - new_width = (new_width * aspect_numerator) / aspect_denominator;
|
| - else
|
| - new_height = (new_height * aspect_denominator) / aspect_numerator;
|
| - capture_format_.frame_size.SetSize(new_width, new_height);
|
| - tried_to_square_pixels_ = true;
|
| - }
|
| -
|
| - if (capture_format_.frame_size == frame_format.frame_size) {
|
| - final_resolution_selected_ = true;
|
| - } else {
|
| - UpdateCaptureResolution();
|
| - // Let the resolution update sink through QTKit and wait for next frame.
|
| - return;
|
| - }
|
| - }
|
| -
|
| - // QTKit capture source can change resolution if someone else reconfigures the
|
| - // camera, and that is fine: http://crbug.com/353620. In AVFoundation, this
|
| - // should not happen, it should resize internally.
|
| - if (!AVFoundationGlue::IsAVFoundationSupported()) {
|
| - capture_format_.frame_size = frame_format.frame_size;
|
| - } else if (capture_format_.frame_size != frame_format.frame_size) {
|
| + // controlled by AVFoundation.
|
| + if (capture_format_.frame_size != frame_format.frame_size) {
|
| ReceiveError(FROM_HERE,
|
| "Captured resolution " + frame_format.frame_size.ToString() +
|
| ", and expected " + capture_format_.frame_size.ToString());
|
|
|