Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(988)

Unified Diff: media/video/capture/win/video_capture_device_factory_win.cc

Issue 558503003: Windows video capture: Remove duplicated code from GetDeviceSupportedFormats* (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: offline discussion Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | media/video/capture/win/video_capture_device_mf_win.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/video/capture/win/video_capture_device_factory_win.cc
diff --git a/media/video/capture/win/video_capture_device_factory_win.cc b/media/video/capture/win/video_capture_device_factory_win.cc
index affad623adfb00ea77e4df501a6100e3d6b39df1..145def874e01db9e5e8badb93993e5b90ea9d8a1 100644
--- a/media/video/capture/win/video_capture_device_factory_win.cc
+++ b/media/video/capture/win/video_capture_device_factory_win.cc
@@ -216,27 +216,14 @@ static void GetDeviceNamesMediaFoundation(Names* device_names) {
static void GetDeviceSupportedFormatsDirectShow(const Name& device,
VideoCaptureFormats* formats) {
DVLOG(1) << "GetDeviceSupportedFormatsDirectShow for " << device.name();
- ScopedComPtr<ICreateDevEnum> dev_enum;
- HRESULT hr = dev_enum.CreateInstance(CLSID_SystemDeviceEnum, NULL,
- CLSCTX_INPROC);
- if (FAILED(hr))
- return;
-
- ScopedComPtr<IEnumMoniker> enum_moniker;
- hr = dev_enum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,
- enum_moniker.Receive(), 0);
- // CreateClassEnumerator returns S_FALSE on some Windows OS when no camera
- // exists. Therefore the FAILED macro can't be used.
- if (hr != S_OK)
- return;
-
// Walk the capture devices. No need to check for device presence again since
// that is anyway needed in GetDeviceFilter(). "google camera adapter" and old
// VFW devices are already skipped previously in GetDeviceNames() enumeration.
base::win::ScopedComPtr<IBaseFilter> capture_filter;
- hr = VideoCaptureDeviceWin::GetDeviceFilter(device.capabilities_id(),
- CLSID_VideoInputDeviceCategory,
- capture_filter.Receive());
+ HRESULT hr =
+ VideoCaptureDeviceWin::GetDeviceFilter(device.capabilities_id(),
+ CLSID_VideoInputDeviceCategory,
+ capture_filter.Receive());
if (!capture_filter) {
DLOG(ERROR) << "Failed to create capture filter: "
<< logging::SystemErrorCodeToString(hr);
@@ -253,54 +240,15 @@ static void GetDeviceSupportedFormatsDirectShow(const Name& device,
return;
}
- ScopedComPtr<IAMStreamConfig> stream_config;
- hr = output_capture_pin.QueryInterface(stream_config.Receive());
- if (FAILED(hr)) {
- DLOG(ERROR) << "Failed to get IAMStreamConfig interface from "
- "capture device: " << logging::SystemErrorCodeToString(hr);
+ CapabilityList capabilities;
+ if (!VideoCaptureDeviceWin::CreateCapabilityMap(
+ output_capture_pin, capture_filter, &capabilities)) {
+ DLOG(ERROR) << "CreateCapabilityMap failed";
return;
}
- int count = 0, size = 0;
- hr = stream_config->GetNumberOfCapabilities(&count, &size);
- if (FAILED(hr)) {
- DLOG(ERROR) << "GetNumberOfCapabilities failed: "
- << logging::SystemErrorCodeToString(hr);
- return;
- }
-
- scoped_ptr<BYTE[]> caps(new BYTE[size]);
- for (int i = 0; i < count; ++i) {
- VideoCaptureDeviceWin::ScopedMediaType media_type;
- hr = stream_config->GetStreamCaps(i, media_type.Receive(), caps.get());
- // GetStreamCaps() may return S_FALSE, so don't use FAILED() or SUCCEED()
- // macros here since they'll trigger incorrectly.
- if (hr != S_OK || !media_type.get()) {
- DLOG(ERROR) << "GetStreamCaps failed: "
- << logging::SystemErrorCodeToString(hr);
- return;
- }
-
- if (media_type->majortype == MEDIATYPE_Video &&
- media_type->formattype == FORMAT_VideoInfo) {
- VideoCaptureFormat format;
- format.pixel_format =
- VideoCaptureDeviceWin::TranslateMediaSubtypeToPixelFormat(
- media_type->subtype);
- if (format.pixel_format == PIXEL_FORMAT_UNKNOWN)
- continue;
- VIDEOINFOHEADER* h =
- reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat);
- format.frame_size.SetSize(h->bmiHeader.biWidth,
- h->bmiHeader.biHeight);
- // Trust the frame rate from the VIDEOINFOHEADER.
- format.frame_rate = (h->AvgTimePerFrame > 0) ?
- kSecondsToReferenceTime / static_cast<float>(h->AvgTimePerFrame) :
- 0.0f;
- formats->push_back(format);
- DVLOG(1) << device.name() << " " << format.ToString();
- }
- }
+ for (const CapabilityWin& capability : capabilities)
+ formats->push_back(capability.supported_format);
}
static void GetDeviceSupportedFormatsMediaFoundation(
@@ -322,45 +270,11 @@ static void GetDeviceSupportedFormatsMediaFoundation(
return;
}
- DWORD stream_index = 0;
- ScopedComPtr<IMFMediaType> type;
- while (SUCCEEDED(reader->GetNativeMediaType(
- kFirstVideoStream, stream_index, type.Receive()))) {
- UINT32 width, height;
- hr = MFGetAttributeSize(type, MF_MT_FRAME_SIZE, &width, &height);
- if (FAILED(hr)) {
- DLOG(ERROR) << "MFGetAttributeSize failed: "
- << logging::SystemErrorCodeToString(hr);
- return;
- }
- VideoCaptureFormat capture_format;
- capture_format.frame_size.SetSize(width, height);
-
- UINT32 numerator, denominator;
- hr = MFGetAttributeRatio(type, MF_MT_FRAME_RATE, &numerator, &denominator);
- if (FAILED(hr)) {
- DLOG(ERROR) << "MFGetAttributeSize failed: "
- << logging::SystemErrorCodeToString(hr);
- return;
- }
- capture_format.frame_rate = denominator
- ? static_cast<float>(numerator) / denominator : 0.0f;
-
- GUID type_guid;
- hr = type->GetGUID(MF_MT_SUBTYPE, &type_guid);
- if (FAILED(hr)) {
- DLOG(ERROR) << "GetGUID failed: "
- << logging::SystemErrorCodeToString(hr);
- return;
- }
- VideoCaptureDeviceMFWin::FormatFromGuid(type_guid,
- &capture_format.pixel_format);
- type.Release();
- formats->push_back(capture_format);
- ++stream_index;
+ CapabilityList capabilities;
+ VideoCaptureDeviceMFWin::FillCapabilities(reader, &capabilities);
- DVLOG(1) << device.name() << " " << capture_format.ToString();
- }
+ for (const CapabilityWin& capability : capabilities)
+ formats->push_back(capability.supported_format);
}
// Returns true iff the current platform supports the Media Foundation API
@@ -453,10 +367,13 @@ void VideoCaptureDeviceFactoryWin::GetDeviceSupportedFormats(
const Name& device,
VideoCaptureFormats* formats) {
DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK(formats);
if (use_media_foundation_)
GetDeviceSupportedFormatsMediaFoundation(device, formats);
else
GetDeviceSupportedFormatsDirectShow(device, formats);
+ for (const VideoCaptureFormat& format : *formats)
+ DVLOG(1) << device.name() << " " << format.ToString();
}
} // namespace media
« no previous file with comments | « no previous file | media/video/capture/win/video_capture_device_mf_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698