| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/video/capture/win/video_capture_device_win.h" | 5 #include "media/video/capture/win/video_capture_device_win.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <list> | 8 #include <list> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 hr = ks_property->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, | 95 hr = ks_property->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, |
| 96 &pin_category, sizeof(pin_category), &return_value); | 96 &pin_category, sizeof(pin_category), &return_value); |
| 97 if (SUCCEEDED(hr) && (return_value == sizeof(pin_category))) { | 97 if (SUCCEEDED(hr) && (return_value == sizeof(pin_category))) { |
| 98 found = (pin_category == category); | 98 found = (pin_category == category); |
| 99 } | 99 } |
| 100 } | 100 } |
| 101 return found; | 101 return found; |
| 102 } | 102 } |
| 103 | 103 |
| 104 // Finds a IPin on a IBaseFilter given the direction an category. | 104 // Finds a IPin on a IBaseFilter given the direction an category. |
| 105 HRESULT GetPin(IBaseFilter* filter, PIN_DIRECTION pin_dir, REFGUID category, | 105 ScopedComPtr<IPin> GetPin(IBaseFilter* filter, PIN_DIRECTION pin_dir, |
| 106 IPin** pin) { | 106 REFGUID category) { |
| 107 DCHECK(pin); | 107 ScopedComPtr<IPin> pin; |
| 108 ScopedComPtr<IEnumPins> pin_emum; | 108 ScopedComPtr<IEnumPins> pin_emum; |
| 109 HRESULT hr = filter->EnumPins(pin_emum.Receive()); | 109 HRESULT hr = filter->EnumPins(pin_emum.Receive()); |
| 110 if (pin_emum == NULL) | 110 if (pin_emum == NULL) |
| 111 return hr; | 111 return pin; |
| 112 | 112 |
| 113 // Get first unconnected pin. | 113 // Get first unconnected pin. |
| 114 hr = pin_emum->Reset(); // set to first pin | 114 hr = pin_emum->Reset(); // set to first pin |
| 115 while ((hr = pin_emum->Next(1, pin, NULL)) == S_OK) { | 115 while ((hr = pin_emum->Next(1, pin.Receive(), NULL)) == S_OK) { |
| 116 PIN_DIRECTION this_pin_dir = static_cast<PIN_DIRECTION>(-1); | 116 PIN_DIRECTION this_pin_dir = static_cast<PIN_DIRECTION>(-1); |
| 117 hr = (*pin)->QueryDirection(&this_pin_dir); | 117 hr = pin->QueryDirection(&this_pin_dir); |
| 118 if (pin_dir == this_pin_dir) { | 118 if (pin_dir == this_pin_dir) { |
| 119 if (category == GUID_NULL || PinMatchesCategory(*pin, category)) | 119 if (category == GUID_NULL || PinMatchesCategory(pin, category)) |
| 120 return S_OK; | 120 return pin; |
| 121 } | 121 } |
| 122 (*pin)->Release(); | 122 pin.Release(); |
| 123 } | 123 } |
| 124 | 124 |
| 125 return E_FAIL; | 125 DCHECK(!pin); |
| 126 return pin; |
| 126 } | 127 } |
| 127 | 128 |
| 128 // Release the format block for a media type. | 129 // Release the format block for a media type. |
| 129 // http://msdn.microsoft.com/en-us/library/dd375432(VS.85).aspx | 130 // http://msdn.microsoft.com/en-us/library/dd375432(VS.85).aspx |
| 130 void FreeMediaType(AM_MEDIA_TYPE* mt) { | 131 void FreeMediaType(AM_MEDIA_TYPE* mt) { |
| 131 if (mt->cbFormat != 0) { | 132 if (mt->cbFormat != 0) { |
| 132 CoTaskMemFree(mt->pbFormat); | 133 CoTaskMemFree(mt->pbFormat); |
| 133 mt->cbFormat = 0; | 134 mt->cbFormat = 0; |
| 134 mt->pbFormat = NULL; | 135 mt->pbFormat = NULL; |
| 135 } | 136 } |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 376 } | 377 } |
| 377 | 378 |
| 378 if (moniker.get()) { | 379 if (moniker.get()) { |
| 379 base::win::ScopedComPtr<IBaseFilter> capture_filter; | 380 base::win::ScopedComPtr<IBaseFilter> capture_filter; |
| 380 hr = GetDeviceFilter(device, capture_filter.Receive()); | 381 hr = GetDeviceFilter(device, capture_filter.Receive()); |
| 381 if (!capture_filter) { | 382 if (!capture_filter) { |
| 382 DVLOG(2) << "Failed to create capture filter."; | 383 DVLOG(2) << "Failed to create capture filter."; |
| 383 return; | 384 return; |
| 384 } | 385 } |
| 385 | 386 |
| 386 base::win::ScopedComPtr<IPin> output_capture_pin; | 387 base::win::ScopedComPtr<IPin> output_capture_pin( |
| 387 hr = GetPin(capture_filter, PINDIR_OUTPUT, PIN_CATEGORY_CAPTURE, | 388 GetPin(capture_filter, PINDIR_OUTPUT, PIN_CATEGORY_CAPTURE)); |
| 388 output_capture_pin.Receive()); | |
| 389 if (!output_capture_pin) { | 389 if (!output_capture_pin) { |
| 390 DVLOG(2) << "Failed to get capture output pin"; | 390 DVLOG(2) << "Failed to get capture output pin"; |
| 391 return; | 391 return; |
| 392 } | 392 } |
| 393 | 393 |
| 394 ScopedComPtr<IAMStreamConfig> stream_config; | 394 ScopedComPtr<IAMStreamConfig> stream_config; |
| 395 hr = output_capture_pin.QueryInterface(stream_config.Receive()); | 395 hr = output_capture_pin.QueryInterface(stream_config.Receive()); |
| 396 if (FAILED(hr)) { | 396 if (FAILED(hr)) { |
| 397 DVLOG(2) << "Failed to get IAMStreamConfig interface from " | 397 DVLOG(2) << "Failed to get IAMStreamConfig interface from " |
| 398 "capture device"; | 398 "capture device"; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 } | 465 } |
| 466 | 466 |
| 467 bool VideoCaptureDeviceWin::Init() { | 467 bool VideoCaptureDeviceWin::Init() { |
| 468 DCHECK(CalledOnValidThread()); | 468 DCHECK(CalledOnValidThread()); |
| 469 HRESULT hr = GetDeviceFilter(device_name_, capture_filter_.Receive()); | 469 HRESULT hr = GetDeviceFilter(device_name_, capture_filter_.Receive()); |
| 470 if (!capture_filter_) { | 470 if (!capture_filter_) { |
| 471 DVLOG(2) << "Failed to create capture filter."; | 471 DVLOG(2) << "Failed to create capture filter."; |
| 472 return false; | 472 return false; |
| 473 } | 473 } |
| 474 | 474 |
| 475 hr = GetPin(capture_filter_, PINDIR_OUTPUT, PIN_CATEGORY_CAPTURE, | 475 output_capture_pin_ = |
| 476 output_capture_pin_.Receive()); | 476 GetPin(capture_filter_, PINDIR_OUTPUT, PIN_CATEGORY_CAPTURE); |
| 477 if (!output_capture_pin_) { | 477 if (!output_capture_pin_) { |
| 478 DVLOG(2) << "Failed to get capture output pin"; | 478 DVLOG(2) << "Failed to get capture output pin"; |
| 479 return false; | 479 return false; |
| 480 } | 480 } |
| 481 | 481 |
| 482 // Create the sink filter used for receiving Captured frames. | 482 // Create the sink filter used for receiving Captured frames. |
| 483 sink_filter_ = new SinkFilter(this); | 483 sink_filter_ = new SinkFilter(this); |
| 484 if (sink_filter_ == NULL) { | 484 if (sink_filter_ == NULL) { |
| 485 DVLOG(2) << "Failed to create send filter"; | 485 DVLOG(2) << "Failed to create send filter"; |
| 486 return false; | 486 return false; |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 } | 572 } |
| 573 | 573 |
| 574 if (FAILED(hr)) | 574 if (FAILED(hr)) |
| 575 SetErrorState("Failed to set capture device output format"); | 575 SetErrorState("Failed to set capture device output format"); |
| 576 | 576 |
| 577 if (format.pixel_format == PIXEL_FORMAT_MJPEG && !mjpg_filter_.get()) { | 577 if (format.pixel_format == PIXEL_FORMAT_MJPEG && !mjpg_filter_.get()) { |
| 578 // Create MJPG filter if we need it. | 578 // Create MJPG filter if we need it. |
| 579 hr = mjpg_filter_.CreateInstance(CLSID_MjpegDec, NULL, CLSCTX_INPROC); | 579 hr = mjpg_filter_.CreateInstance(CLSID_MjpegDec, NULL, CLSCTX_INPROC); |
| 580 | 580 |
| 581 if (SUCCEEDED(hr)) { | 581 if (SUCCEEDED(hr)) { |
| 582 GetPin(mjpg_filter_, PINDIR_INPUT, GUID_NULL, input_mjpg_pin_.Receive()); | 582 input_mjpg_pin_ = GetPin(mjpg_filter_, PINDIR_INPUT, GUID_NULL); |
| 583 GetPin(mjpg_filter_, PINDIR_OUTPUT, GUID_NULL, | 583 output_mjpg_pin_ = GetPin(mjpg_filter_, PINDIR_OUTPUT, GUID_NULL); |
| 584 output_mjpg_pin_.Receive()); | |
| 585 hr = graph_builder_->AddFilter(mjpg_filter_, NULL); | 584 hr = graph_builder_->AddFilter(mjpg_filter_, NULL); |
| 586 } | 585 } |
| 587 | 586 |
| 588 if (FAILED(hr)) { | 587 if (FAILED(hr)) { |
| 589 mjpg_filter_.Release(); | 588 mjpg_filter_.Release(); |
| 590 input_mjpg_pin_.Release(); | 589 input_mjpg_pin_.Release(); |
| 591 output_mjpg_pin_.Release(); | 590 output_mjpg_pin_.Release(); |
| 592 } | 591 } |
| 593 } | 592 } |
| 594 | 593 |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 750 return !capabilities_.empty(); | 749 return !capabilities_.empty(); |
| 751 } | 750 } |
| 752 | 751 |
| 753 void VideoCaptureDeviceWin::SetErrorState(const std::string& reason) { | 752 void VideoCaptureDeviceWin::SetErrorState(const std::string& reason) { |
| 754 DCHECK(CalledOnValidThread()); | 753 DCHECK(CalledOnValidThread()); |
| 755 DVLOG(1) << reason; | 754 DVLOG(1) << reason; |
| 756 state_ = kError; | 755 state_ = kError; |
| 757 client_->OnError(reason); | 756 client_->OnError(reason); |
| 758 } | 757 } |
| 759 } // namespace media | 758 } // namespace media |
| OLD | NEW |