
H:\webrtc-20210315\webrtc-20210315\webrtc\webrtc-checkout\src\modules\video_capture\windows\video_capture_ds.cc
VideoCaptureDS::Init()
int32_t VideoCaptureDS::Init(const char* deviceUniqueIdUTF8) {const int32_t nameLength = (int32_t)strlen((char*)deviceUniqueIdUTF8);if (nameLength > kVideoCaptureUniqueNameLength)return -1;// Store the device name_deviceUniqueId = new (std::nothrow) char[nameLength + 1];memcpy(_deviceUniqueId, deviceUniqueIdUTF8, nameLength + 1);if (_dsInfo.Init() != 0)return -1;_captureFilter = _dsInfo.GetDeviceFilter(deviceUniqueIdUTF8);if (!_captureFilter) {RTC_LOG(LS_INFO) << "Failed to create capture filter.";return -1;}// Get the interface for DirectShow's GraphBuilderHRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void**)&_graphBuilder);if (FAILED(hr)) {RTC_LOG(LS_INFO) << "Failed to create graph builder.";return -1;}hr = _graphBuilder->QueryInterface(IID_IMediaControl, (void**)&_mediaControl);if (FAILED(hr)) {RTC_LOG(LS_INFO) << "Failed to create media control builder.";return -1;}hr = _graphBuilder->AddFilter(_captureFilter, CAPTURE_FILTER_NAME);if (FAILED(hr)) {RTC_LOG(LS_INFO) << "Failed to add the capture device to the graph.";return -1;}_outputCapturePin = GetOutputPin(_captureFilter, PIN_CATEGORY_CAPTURE);if (!_outputCapturePin) {RTC_LOG(LS_INFO) << "Failed to get output capture pin";return -1;}// Create the sink filte used for receiving Captured frames.sink_filter_ = new ComRefCount<CaptureSinkFilter>(this);hr = _graphBuilder->AddFilter(sink_filter_, SINK_FILTER_NAME);if (FAILED(hr)) {RTC_LOG(LS_INFO) << "Failed to add the send filter to the graph.";return -1;}_inputSendPin = GetInputPin(sink_filter_);if (!_inputSendPin) {RTC_LOG(LS_INFO) << "Failed to get input send pin";return -1;}// Temporary connect here.// This is done so that no one else can use the capture device.if (SetCameraOutput(_requestedCapability) != 0) {return -1;}hr = _mediaControl->Pause();if (FAILED(hr)) {RTC_LOG(LS_INFO)<< "Failed to Pause the Capture device. Is it already occupied? " << hr;return -1;}RTC_LOG(LS_INFO) << "Capture device '" << deviceUniqueIdUTF8<< "' initialized.";return 0;}
通过DeviceInfo::GetDeviceFilter就可以采集视频数据了。
IGraphBuilder做了两件事:
1、创建IMediaControl,控制啥时候开始或停止采集视频数据
2、AddFilter添加Filter到FilterGraph,接收采集数据传输到上层
