Commit ceeb175a authored by dmichael's avatar dmichael Committed by Commit bot

Revert of Windows video capture: Remove duplicated code from...

Revert of Windows video capture: Remove duplicated code from GetDeviceSupportedFormats* (patchset #3 id:200001 of https://codereview.chromium.org/558503003/)

Reason for revert:
See https://code.google.com/p/chromium/issues/detail?id=428958

Original issue's description:
> Windows video capture: Remove duplicated code from GetDeviceSupportedFormats*
>
> The code for GetDeviceSupportedFormatsMediaFoundation and GetDeviceSupportedFormatsDirectShow are already implemented in video_capture_device_mf_win.cc and video_capture_device_win.cc respectively. This CL refactors the implementation so that video_capture_device_factory_win.cc can make use of that code.
>
> Committed: https://crrev.com/b6dae80f8f10b8af1e3026de9f5af4f3128e812a
> Cr-Commit-Position: refs/heads/master@{#301891}

TBR=mcasas@chromium.org,perkj@chromium.org,tommi@chromium.org,magjed@chromium.org
NOTREECHECKS=true
NOTRY=true

Review URL: https://codereview.chromium.org/691143002

Cr-Commit-Position: refs/heads/master@{#302151}
parent ac77ecc7
...@@ -216,14 +216,27 @@ static void GetDeviceNamesMediaFoundation(Names* device_names) { ...@@ -216,14 +216,27 @@ static void GetDeviceNamesMediaFoundation(Names* device_names) {
static void GetDeviceSupportedFormatsDirectShow(const Name& device, static void GetDeviceSupportedFormatsDirectShow(const Name& device,
VideoCaptureFormats* formats) { VideoCaptureFormats* formats) {
DVLOG(1) << "GetDeviceSupportedFormatsDirectShow for " << device.name(); 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 // Walk the capture devices. No need to check for device presence again since
// that is anyway needed in GetDeviceFilter(). "google camera adapter" and old // that is anyway needed in GetDeviceFilter(). "google camera adapter" and old
// VFW devices are already skipped previously in GetDeviceNames() enumeration. // VFW devices are already skipped previously in GetDeviceNames() enumeration.
base::win::ScopedComPtr<IBaseFilter> capture_filter; base::win::ScopedComPtr<IBaseFilter> capture_filter;
HRESULT hr = hr = VideoCaptureDeviceWin::GetDeviceFilter(device.capabilities_id(),
VideoCaptureDeviceWin::GetDeviceFilter(device.capabilities_id(), CLSID_VideoInputDeviceCategory,
CLSID_VideoInputDeviceCategory, capture_filter.Receive());
capture_filter.Receive());
if (!capture_filter) { if (!capture_filter) {
DLOG(ERROR) << "Failed to create capture filter: " DLOG(ERROR) << "Failed to create capture filter: "
<< logging::SystemErrorCodeToString(hr); << logging::SystemErrorCodeToString(hr);
...@@ -240,15 +253,54 @@ static void GetDeviceSupportedFormatsDirectShow(const Name& device, ...@@ -240,15 +253,54 @@ static void GetDeviceSupportedFormatsDirectShow(const Name& device,
return; return;
} }
CapabilityList capabilities; ScopedComPtr<IAMStreamConfig> stream_config;
if (!VideoCaptureDeviceWin::CreateCapabilityMap( hr = output_capture_pin.QueryInterface(stream_config.Receive());
output_capture_pin, capture_filter, &capabilities)) { if (FAILED(hr)) {
DLOG(ERROR) << "CreateCapabilityMap failed"; DLOG(ERROR) << "Failed to get IAMStreamConfig interface from "
"capture device: " << logging::SystemErrorCodeToString(hr);
return; return;
} }
for (const CapabilityWin& capability : capabilities) int count = 0, size = 0;
formats->push_back(capability.supported_format); 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();
}
}
} }
static void GetDeviceSupportedFormatsMediaFoundation( static void GetDeviceSupportedFormatsMediaFoundation(
...@@ -270,11 +322,45 @@ static void GetDeviceSupportedFormatsMediaFoundation( ...@@ -270,11 +322,45 @@ static void GetDeviceSupportedFormatsMediaFoundation(
return; return;
} }
CapabilityList capabilities; DWORD stream_index = 0;
VideoCaptureDeviceMFWin::FillCapabilities(reader, &capabilities); 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;
for (const CapabilityWin& capability : capabilities) DVLOG(1) << device.name() << " " << capture_format.ToString();
formats->push_back(capability.supported_format); }
} }
// Returns true iff the current platform supports the Media Foundation API // Returns true iff the current platform supports the Media Foundation API
...@@ -367,13 +453,10 @@ void VideoCaptureDeviceFactoryWin::GetDeviceSupportedFormats( ...@@ -367,13 +453,10 @@ void VideoCaptureDeviceFactoryWin::GetDeviceSupportedFormats(
const Name& device, const Name& device,
VideoCaptureFormats* formats) { VideoCaptureFormats* formats) {
DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(thread_checker_.CalledOnValidThread());
DCHECK(formats);
if (use_media_foundation_) if (use_media_foundation_)
GetDeviceSupportedFormatsMediaFoundation(device, formats); GetDeviceSupportedFormatsMediaFoundation(device, formats);
else else
GetDeviceSupportedFormatsDirectShow(device, formats); GetDeviceSupportedFormatsDirectShow(device, formats);
for (const VideoCaptureFormat& format : *formats)
DVLOG(1) << device.name() << " " << format.ToString();
} }
} // namespace media } // namespace media
...@@ -58,9 +58,8 @@ static bool FillFormat(IMFMediaType* type, VideoCaptureFormat* format) { ...@@ -58,9 +58,8 @@ static bool FillFormat(IMFMediaType* type, VideoCaptureFormat* format) {
return true; return true;
} }
HRESULT VideoCaptureDeviceMFWin::FillCapabilities( HRESULT FillCapabilities(IMFSourceReader* source,
IMFSourceReader* source, CapabilityList* capabilities) {
CapabilityList* capabilities) {
DWORD stream_index = 0; DWORD stream_index = 0;
ScopedComPtr<IMFMediaType> type; ScopedComPtr<IMFMediaType> type;
HRESULT hr; HRESULT hr;
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include "base/win/scoped_comptr.h" #include "base/win/scoped_comptr.h"
#include "media/base/media_export.h" #include "media/base/media_export.h"
#include "media/video/capture/video_capture_device.h" #include "media/video/capture/video_capture_device.h"
#include "media/video/capture/win/capability_list_win.h"
interface IMFSourceReader; interface IMFSourceReader;
...@@ -35,8 +34,6 @@ class MEDIA_EXPORT VideoCaptureDeviceMFWin ...@@ -35,8 +34,6 @@ class MEDIA_EXPORT VideoCaptureDeviceMFWin
public VideoCaptureDevice { public VideoCaptureDevice {
public: public:
static bool FormatFromGuid(const GUID& guid, VideoPixelFormat* format); static bool FormatFromGuid(const GUID& guid, VideoPixelFormat* format);
static HRESULT FillCapabilities(IMFSourceReader* source,
CapabilityList* capabilities);
explicit VideoCaptureDeviceMFWin(const Name& device_name); explicit VideoCaptureDeviceMFWin(const Name& device_name);
virtual ~VideoCaptureDeviceMFWin(); virtual ~VideoCaptureDeviceMFWin();
......
...@@ -306,8 +306,7 @@ bool VideoCaptureDeviceWin::Init() { ...@@ -306,8 +306,7 @@ bool VideoCaptureDeviceWin::Init() {
return false; return false;
} }
return CreateCapabilityMap( return CreateCapabilityMap();
output_capture_pin_, capture_filter_, &capabilities_);
} }
void VideoCaptureDeviceWin::AllocateAndStart( void VideoCaptureDeviceWin::AllocateAndStart(
...@@ -474,12 +473,11 @@ void VideoCaptureDeviceWin::FrameReceived(const uint8* buffer, ...@@ -474,12 +473,11 @@ void VideoCaptureDeviceWin::FrameReceived(const uint8* buffer,
buffer, length, capture_format_, 0, base::TimeTicks::Now()); buffer, length, capture_format_, 0, base::TimeTicks::Now());
} }
bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin, bool VideoCaptureDeviceWin::CreateCapabilityMap() {
IBaseFilter* capture_filter, DCHECK(CalledOnValidThread());
CapabilityList* capabilities) {
ScopedComPtr<IAMStreamConfig> stream_config; ScopedComPtr<IAMStreamConfig> stream_config;
HRESULT hr = output_capture_pin->QueryInterface(stream_config.Receive()); HRESULT hr = output_capture_pin_.QueryInterface(stream_config.Receive());
if (FAILED(hr) || !stream_config) { if (FAILED(hr)) {
DPLOG(ERROR) << "Failed to get IAMStreamConfig interface from " DPLOG(ERROR) << "Failed to get IAMStreamConfig interface from "
"capture device: " << logging::SystemErrorCodeToString(hr); "capture device: " << logging::SystemErrorCodeToString(hr);
return false; return false;
...@@ -487,10 +485,9 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin, ...@@ -487,10 +485,9 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin,
// Get interface used for getting the frame rate. // Get interface used for getting the frame rate.
ScopedComPtr<IAMVideoControl> video_control; ScopedComPtr<IAMVideoControl> video_control;
hr = capture_filter->QueryInterface(video_control.Receive()); hr = capture_filter_.QueryInterface(video_control.Receive());
DLOG_IF(WARNING, FAILED(hr) || !video_control) DLOG_IF(WARNING, FAILED(hr)) << "IAMVideoControl Interface NOT SUPPORTED: "
<< "IAMVideoControl Interface NOT SUPPORTED: " << logging::SystemErrorCodeToString(hr);
<< logging::SystemErrorCodeToString(hr);
int count = 0, size = 0; int count = 0, size = 0;
hr = stream_config->GetNumberOfCapabilities(&count, &size); hr = stream_config->GetNumberOfCapabilities(&count, &size);
...@@ -507,7 +504,7 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin, ...@@ -507,7 +504,7 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin,
stream_index, media_type.Receive(), caps.get()); stream_index, media_type.Receive(), caps.get());
// GetStreamCaps() may return S_FALSE, so don't use FAILED() or SUCCEED() // GetStreamCaps() may return S_FALSE, so don't use FAILED() or SUCCEED()
// macros here since they'll trigger incorrectly. // macros here since they'll trigger incorrectly.
if (hr != S_OK || !media_type.get()) { if (hr != S_OK) {
DLOG(ERROR) << "Failed to GetStreamCaps: " DLOG(ERROR) << "Failed to GetStreamCaps: "
<< logging::SystemErrorCodeToString(hr); << logging::SystemErrorCodeToString(hr);
return false; return false;
...@@ -523,10 +520,6 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin, ...@@ -523,10 +520,6 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin,
VIDEOINFOHEADER* h = VIDEOINFOHEADER* h =
reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat); reinterpret_cast<VIDEOINFOHEADER*>(media_type->pbFormat);
if (!h) {
DLOG(ERROR) << "VIDEOINFOHEADER is NULL";
continue;
}
format.frame_size.SetSize(h->bmiHeader.biWidth, h->bmiHeader.biHeight); format.frame_size.SetSize(h->bmiHeader.biWidth, h->bmiHeader.biHeight);
// Try to get a better |time_per_frame| from IAMVideoControl. If not, use // Try to get a better |time_per_frame| from IAMVideoControl. If not, use
...@@ -538,7 +531,7 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin, ...@@ -538,7 +531,7 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin,
const SIZE size = {format.frame_size.width(), const SIZE size = {format.frame_size.width(),
format.frame_size.height()}; format.frame_size.height()};
hr = video_control->GetFrameRateList( hr = video_control->GetFrameRateList(
output_capture_pin, stream_index, size, &list_size, &max_fps); output_capture_pin_, stream_index, size, &list_size, &max_fps);
// Can't assume the first value will return the max fps. // Can't assume the first value will return the max fps.
// Sometimes |list_size| will be > 0, but max_fps will be NULL. Some // Sometimes |list_size| will be > 0, but max_fps will be NULL. Some
// drivers may return an HRESULT of S_FALSE which SUCCEEDED() translates // drivers may return an HRESULT of S_FALSE which SUCCEEDED() translates
...@@ -554,11 +547,11 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin, ...@@ -554,11 +547,11 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap(IPin* output_capture_pin,
? (kSecondsToReferenceTime / static_cast<float>(time_per_frame)) ? (kSecondsToReferenceTime / static_cast<float>(time_per_frame))
: 0.0; : 0.0;
capabilities->emplace_back(stream_index, format); capabilities_.emplace_back(stream_index, format);
} }
} }
return !capabilities->empty(); return !capabilities_.empty();
} }
// Set the power line frequency removal in |capture_filter_| if available. // Set the power line frequency removal in |capture_filter_| if available.
......
...@@ -62,9 +62,6 @@ class VideoCaptureDeviceWin ...@@ -62,9 +62,6 @@ class VideoCaptureDeviceWin
REFGUID major_type); REFGUID major_type);
static VideoPixelFormat TranslateMediaSubtypeToPixelFormat( static VideoPixelFormat TranslateMediaSubtypeToPixelFormat(
const GUID& sub_type); const GUID& sub_type);
static bool CreateCapabilityMap(IPin* output_capture_pin,
IBaseFilter* capture_filter,
CapabilityList* capabilities);
explicit VideoCaptureDeviceWin(const Name& device_name); explicit VideoCaptureDeviceWin(const Name& device_name);
virtual ~VideoCaptureDeviceWin(); virtual ~VideoCaptureDeviceWin();
...@@ -88,6 +85,7 @@ class VideoCaptureDeviceWin ...@@ -88,6 +85,7 @@ class VideoCaptureDeviceWin
// Implements SinkFilterObserver. // Implements SinkFilterObserver.
virtual void FrameReceived(const uint8* buffer, int length); virtual void FrameReceived(const uint8* buffer, int length);
bool CreateCapabilityMap();
void SetAntiFlickerInCaptureFilter(); void SetAntiFlickerInCaptureFilter();
HRESULT InstantiateWDMFiltersAndPins(); HRESULT InstantiateWDMFiltersAndPins();
HRESULT AddWDMCrossbarFilterToGraphAndConnect(); HRESULT AddWDMCrossbarFilterToGraphAndConnect();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment