| Index: media/video/capture/mac/video_capture_device_mac.mm
|
| diff --git a/media/video/capture/mac/video_capture_device_mac.mm b/media/video/capture/mac/video_capture_device_mac.mm
|
| index 190f53d6a380a01f4c7bbc6be9af5860f2532d51..65103e5e86f5a6b887dacac73e5d9b51f81c6792 100644
|
| --- a/media/video/capture/mac/video_capture_device_mac.mm
|
| +++ b/media/video/capture/mac/video_capture_device_mac.mm
|
| @@ -20,6 +20,7 @@
|
| #import "media/video/capture/mac/platform_video_capturing_mac.h"
|
| #import "media/video/capture/mac/video_capture_device_avfoundation_mac.h"
|
| #import "media/video/capture/mac/video_capture_device_qtkit_mac.h"
|
| +#include "ui/gfx/size.h"
|
|
|
| @implementation DeviceNameAndTransportType
|
|
|
| @@ -94,24 +95,19 @@ typedef struct IOUSBInterfaceDescriptor {
|
| UInt8 bUnitID;
|
| } IOUSBInterfaceDescriptor;
|
|
|
| -// TODO(ronghuawu): Replace this with CapabilityList::GetBestMatchedCapability.
|
| -void GetBestMatchSupportedResolution(int* width, int* height) {
|
| +static void GetBestMatchSupportedResolution(gfx::Size* resolution) {
|
| int min_diff = kint32max;
|
| - int matched_width = *width;
|
| - int matched_height = *height;
|
| - int desired_res_area = *width * *height;
|
| + const int desired_area = resolution->GetArea();
|
| for (size_t i = 0; i < arraysize(kWellSupportedResolutions); ++i) {
|
| - int area = kWellSupportedResolutions[i]->width *
|
| - kWellSupportedResolutions[i]->height;
|
| - int diff = std::abs(desired_res_area - area);
|
| + const int area = kWellSupportedResolutions[i]->width *
|
| + kWellSupportedResolutions[i]->height;
|
| + const int diff = std::abs(desired_area - area);
|
| if (diff < min_diff) {
|
| min_diff = diff;
|
| - matched_width = kWellSupportedResolutions[i]->width;
|
| - matched_height = kWellSupportedResolutions[i]->height;
|
| + resolution->SetSize(kWellSupportedResolutions[i]->width,
|
| + kWellSupportedResolutions[i]->height);
|
| }
|
| }
|
| - *width = matched_width;
|
| - *height = matched_height;
|
| }
|
|
|
| // Tries to create a user-side device interface for a given USB device. Returns
|
| @@ -370,15 +366,13 @@ void VideoCaptureDeviceMac::AllocateAndStart(
|
| if (state_ != kIdle) {
|
| return;
|
| }
|
| - int width = params.requested_format.frame_size.width();
|
| - int height = params.requested_format.frame_size.height();
|
| - float frame_rate = params.requested_format.frame_rate;
|
|
|
| // 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(&width, &height);
|
| + GetBestMatchSupportedResolution(&resolution);
|
|
|
| client_ = client.Pass();
|
| if (device_name_.capture_api_type() == Name::AVFOUNDATION)
|
| @@ -394,13 +388,11 @@ void VideoCaptureDeviceMac::AllocateAndStart(
|
| SetErrorState("Could not open capture device.");
|
| return;
|
| }
|
| - if (frame_rate < kMinFrameRate)
|
| - frame_rate = kMinFrameRate;
|
| - else if (frame_rate > kMaxFrameRate)
|
| - frame_rate = kMaxFrameRate;
|
|
|
| - capture_format_.frame_size.SetSize(width, height);
|
| - capture_format_.frame_rate = frame_rate;
|
| + capture_format_.frame_size = resolution;
|
| + capture_format_.frame_rate =
|
| + std::max(kMinFrameRate,
|
| + std::min(params.requested_format.frame_rate, kMaxFrameRate));
|
| capture_format_.pixel_format = PIXEL_FORMAT_UYVY;
|
|
|
| // QTKit: Set the capture resolution only if this is VGA or smaller, otherwise
|
| @@ -410,8 +402,8 @@ void VideoCaptureDeviceMac::AllocateAndStart(
|
| // 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() || width <= kVGA.width ||
|
| - height <= kVGA.height) {
|
| + if (AVFoundationGlue::IsAVFoundationSupported() ||
|
| + resolution.width() <= kVGA.width || resolution.height() <= kVGA.height) {
|
| if (!UpdateCaptureResolution())
|
| return;
|
| }
|
|
|