| Index: media/capture/video/win/video_capture_device_win.cc
|
| diff --git a/media/capture/video/win/video_capture_device_win.cc b/media/capture/video/win/video_capture_device_win.cc
|
| index 341669d59d99e2e904d40cdda37805d64cdba678..249bfedf58505eaab9222685a26f5c4e288afe50 100644
|
| --- a/media/capture/video/win/video_capture_device_win.cc
|
| +++ b/media/capture/video/win/video_capture_device_win.cc
|
| @@ -24,6 +24,17 @@ using base::win::ScopedVariant;
|
|
|
| namespace media {
|
|
|
| +#if DCHECK_IS_ON()
|
| +#define DLOG_IF_FAILED_WITH_HRESULT(message, hr) \
|
| + { \
|
| + DLOG_IF(ERROR, FAILED(hr)) << (message) << ": " \
|
| + << logging::SystemErrorCodeToString(hr); \
|
| + }
|
| +#else
|
| +#define DLOG_IF_FAILED_WITH_HRESULT(message, hr) \
|
| + {}
|
| +#endif
|
| +
|
| // Check if a Pin matches a category.
|
| bool PinMatchesCategory(IPin* pin, REFGUID category) {
|
| DCHECK(pin);
|
| @@ -242,12 +253,9 @@ bool VideoCaptureDeviceWin::Init() {
|
| HRESULT hr;
|
|
|
| hr = GetDeviceFilter(device_descriptor_.device_id, capture_filter_.Receive());
|
| -
|
| - if (!capture_filter_.get()) {
|
| - DLOG(ERROR) << "Failed to create capture filter: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| + DLOG_IF_FAILED_WITH_HRESULT("Failed to create capture filter", hr);
|
| + if (!capture_filter_.get())
|
| return false;
|
| - }
|
|
|
| output_capture_pin_ = GetPin(capture_filter_.get(), PINDIR_OUTPUT,
|
| PIN_CATEGORY_CAPTURE, GUID_NULL);
|
| @@ -267,54 +275,43 @@ bool VideoCaptureDeviceWin::Init() {
|
|
|
| hr = graph_builder_.CreateInstance(CLSID_FilterGraph, NULL,
|
| CLSCTX_INPROC_SERVER);
|
| - if (FAILED(hr)) {
|
| - DLOG(ERROR) << "Failed to create graph builder: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| + DLOG_IF_FAILED_WITH_HRESULT("Failed to create capture filter", hr);
|
| + if (FAILED(hr))
|
| return false;
|
| - }
|
|
|
| hr = capture_graph_builder_.CreateInstance(CLSID_CaptureGraphBuilder2, NULL,
|
| CLSCTX_INPROC);
|
| - if (FAILED(hr)) {
|
| - DLOG(ERROR) << "Failed to create the Capture Graph Builder: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| + DLOG_IF_FAILED_WITH_HRESULT("Failed to create the Capture Graph Builder", hr);
|
| + if (FAILED(hr))
|
| return false;
|
| - }
|
|
|
| hr = capture_graph_builder_->SetFiltergraph(graph_builder_.get());
|
| - if (FAILED(hr)) {
|
| - DLOG(ERROR) << "Failed to give graph to capture graph builder: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| + DLOG_IF_FAILED_WITH_HRESULT("Failed to give graph to capture graph builder",
|
| + hr);
|
| + if (FAILED(hr))
|
| return false;
|
| - }
|
|
|
| hr = graph_builder_.QueryInterface(media_control_.Receive());
|
| - if (FAILED(hr)) {
|
| - DLOG(ERROR) << "Failed to create media control builder: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| + DLOG_IF_FAILED_WITH_HRESULT("Failed to create media control builder", hr);
|
| + if (FAILED(hr))
|
| return false;
|
| - }
|
|
|
| hr = graph_builder_->AddFilter(capture_filter_.get(), NULL);
|
| - if (FAILED(hr)) {
|
| - DLOG(ERROR) << "Failed to add the capture device to the graph: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| + DLOG_IF_FAILED_WITH_HRESULT("Failed to add the capture device to the graph",
|
| + hr);
|
| + if (FAILED(hr))
|
| return false;
|
| - }
|
|
|
| hr = graph_builder_->AddFilter(sink_filter_.get(), NULL);
|
| - if (FAILED(hr)) {
|
| - DLOG(ERROR) << "Failed to add the sink filter to the graph: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| + DLOG_IF_FAILED_WITH_HRESULT("Failed to add the sink filter to the graph", hr);
|
| + if (FAILED(hr))
|
| return false;
|
| - }
|
|
|
| - // The following code builds the upstream portions of the graph,
|
| - // for example if a capture device uses a Windows Driver Model (WDM)
|
| - // driver, the graph may require certain filters upstream from the
|
| - // WDM Video Capture filter, such as a TV Tuner filter or an Analog
|
| - // Video Crossbar filter. We try using the more prevalent
|
| - // MEDIATYPE_Interleaved first.
|
| + // The following code builds the upstream portions of the graph, for example
|
| + // if a capture device uses a Windows Driver Model (WDM) driver, the graph may
|
| + // require certain filters upstream from the WDM Video Capture filter, such as
|
| + // a TV Tuner filter or an Analog Video Crossbar filter. We try using the more
|
| + // prevalent MEDIATYPE_Interleaved first.
|
| base::win::ScopedComPtr<IAMStreamConfig> stream_config;
|
|
|
| hr = capture_graph_builder_->FindInterface(
|
| @@ -324,8 +321,7 @@ bool VideoCaptureDeviceWin::Init() {
|
| hr = capture_graph_builder_->FindInterface(
|
| &PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, capture_filter_.get(),
|
| IID_IAMStreamConfig, (void**)stream_config.Receive());
|
| - DLOG_IF(ERROR, FAILED(hr)) << "Failed to find CapFilter:IAMStreamConfig: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| + DLOG_IF_FAILED_WITH_HRESULT("Failed to find CapFilter:IAMStreamConfig", hr);
|
| }
|
|
|
| return CreateCapabilityMap();
|
| @@ -353,14 +349,14 @@ void VideoCaptureDeviceWin::AllocateAndStart(
|
| ScopedComPtr<IAMStreamConfig> stream_config;
|
| HRESULT hr = output_capture_pin_.QueryInterface(stream_config.Receive());
|
| if (FAILED(hr)) {
|
| - SetErrorState(FROM_HERE, "Can't get the Capture format settings");
|
| + SetErrorState(FROM_HERE, "Can't get the Capture format settings", hr);
|
| return;
|
| }
|
|
|
| int count = 0, size = 0;
|
| hr = stream_config->GetNumberOfCapabilities(&count, &size);
|
| if (FAILED(hr)) {
|
| - SetErrorState(FROM_HERE, "Failed to GetNumberOfCapabilities");
|
| + SetErrorState(FROM_HERE, "Failed to GetNumberOfCapabilities", hr);
|
| return;
|
| }
|
|
|
| @@ -373,7 +369,7 @@ void VideoCaptureDeviceWin::AllocateAndStart(
|
| hr = stream_config->GetStreamCaps(found_capability.stream_index,
|
| media_type.Receive(), caps.get());
|
| if (hr != S_OK) {
|
| - SetErrorState(FROM_HERE, "Failed to get capture device capabilities");
|
| + SetErrorState(FROM_HERE, "Failed to get capture device capabilities", hr);
|
| return;
|
| }
|
| if (media_type->formattype == FORMAT_VideoInfo) {
|
| @@ -389,8 +385,7 @@ void VideoCaptureDeviceWin::AllocateAndStart(
|
| // Order the capture device to use this format.
|
| hr = stream_config->SetFormat(media_type.get());
|
| if (FAILED(hr)) {
|
| - // TODO(grunell): Log the error. http://crbug.com/405016.
|
| - SetErrorState(FROM_HERE, "Failed to set capture device output format");
|
| + SetErrorState(FROM_HERE, "Failed to set capture device output format", hr);
|
| return;
|
| }
|
|
|
| @@ -407,15 +402,13 @@ void VideoCaptureDeviceWin::AllocateAndStart(
|
| }
|
|
|
| if (FAILED(hr)) {
|
| - SetErrorState(FROM_HERE, "Failed to connect the Capture graph.");
|
| + SetErrorState(FROM_HERE, "Failed to connect the Capture graph.", hr);
|
| return;
|
| }
|
|
|
| hr = media_control_->Pause();
|
| if (FAILED(hr)) {
|
| - SetErrorState(
|
| - FROM_HERE,
|
| - "Failed to pause the Capture device, is it already occupied?");
|
| + SetErrorState(FROM_HERE, "Failed to pause the Capture device", hr);
|
| return;
|
| }
|
|
|
| @@ -426,7 +419,7 @@ void VideoCaptureDeviceWin::AllocateAndStart(
|
| // Start capturing.
|
| hr = media_control_->Run();
|
| if (FAILED(hr)) {
|
| - SetErrorState(FROM_HERE, "Failed to start the Capture device.");
|
| + SetErrorState(FROM_HERE, "Failed to start the Capture device.", hr);
|
| return;
|
| }
|
|
|
| @@ -440,7 +433,7 @@ void VideoCaptureDeviceWin::StopAndDeAllocate() {
|
|
|
| HRESULT hr = media_control_->Stop();
|
| if (FAILED(hr)) {
|
| - SetErrorState(FROM_HERE, "Failed to stop the capture graph.");
|
| + SetErrorState(FROM_HERE, "Failed to stop the capture graph.", hr);
|
| return;
|
| }
|
|
|
| @@ -489,25 +482,20 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap() {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| ScopedComPtr<IAMStreamConfig> stream_config;
|
| HRESULT hr = output_capture_pin_.QueryInterface(stream_config.Receive());
|
| - if (FAILED(hr)) {
|
| - DPLOG(ERROR) << "Failed to get IAMStreamConfig interface from "
|
| - "capture device: " << logging::SystemErrorCodeToString(hr);
|
| + DLOG_IF_FAILED_WITH_HRESULT(
|
| + "Failed to get IAMStreamConfig from capture device", hr);
|
| + if (FAILED(hr))
|
| return false;
|
| - }
|
|
|
| // Get interface used for getting the frame rate.
|
| ScopedComPtr<IAMVideoControl> video_control;
|
| hr = capture_filter_.QueryInterface(video_control.Receive());
|
| - DLOG_IF(WARNING, FAILED(hr)) << "IAMVideoControl Interface NOT SUPPORTED: "
|
| - << logging::SystemErrorCodeToString(hr);
|
|
|
| int count = 0, size = 0;
|
| hr = stream_config->GetNumberOfCapabilities(&count, &size);
|
| - if (FAILED(hr)) {
|
| - DLOG(ERROR) << "Failed to GetNumberOfCapabilities: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| + DLOG_IF_FAILED_WITH_HRESULT("Failed to GetNumberOfCapabilities", hr);
|
| + if (FAILED(hr))
|
| return false;
|
| - }
|
|
|
| std::unique_ptr<BYTE[]> caps(new BYTE[size]);
|
| for (int stream_index = 0; stream_index < count; ++stream_index) {
|
| @@ -517,8 +505,7 @@ bool VideoCaptureDeviceWin::CreateCapabilityMap() {
|
| // GetStreamCaps() may return S_FALSE, so don't use FAILED() or SUCCEED()
|
| // macros here since they'll trigger incorrectly.
|
| if (hr != S_OK) {
|
| - DLOG(ERROR) << "Failed to GetStreamCaps: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| + DLOG(ERROR) << "Failed to GetStreamCaps";
|
| return false;
|
| }
|
|
|
| @@ -595,18 +582,16 @@ void VideoCaptureDeviceWin::SetAntiFlickerInCaptureFilter(
|
| hr = ks_propset->Set(PROPSETID_VIDCAP_VIDEOPROCAMP,
|
| KSPROPERTY_VIDEOPROCAMP_POWERLINE_FREQUENCY, &data,
|
| sizeof(data), &data, sizeof(data));
|
| - DLOG_IF(ERROR, FAILED(hr)) << "Anti-flicker setting failed: "
|
| - << logging::SystemErrorCodeToString(hr);
|
| - DVLOG_IF(2, SUCCEEDED(hr)) << "Anti-flicker set correctly.";
|
| - } else {
|
| - DVLOG(2) << "Anti-flicker setting not supported.";
|
| + DLOG_IF_FAILED_WITH_HRESULT("Anti-flicker setting failed", hr);
|
| }
|
| }
|
|
|
| void VideoCaptureDeviceWin::SetErrorState(
|
| const tracked_objects::Location& from_here,
|
| - const std::string& reason) {
|
| + const std::string& reason,
|
| + HRESULT hr) {
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| + DLOG_IF_FAILED_WITH_HRESULT(reason, hr);
|
| state_ = kError;
|
| client_->OnError(from_here, reason);
|
| }
|
|
|