1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include <initguid.h> // Must come before the help_functions_ds.h include so 12 // that DEFINE_GUID() entries will be defined in this 13 // object file. 14 15 #include "webrtc/modules/video_capture/windows/help_functions_ds.h" 16 17 #include <cguid.h> 18 19 namespace webrtc 20 { 21 namespace videocapturemodule 22 { 23 // This returns minimum :), which will give max frame rate... 24 LONGLONG GetMaxOfFrameArray(LONGLONG *maxFps, long size) 25 { 26 LONGLONG maxFPS = maxFps[0]; 27 for (int i = 0; i < size; i++) 28 { 29 if (maxFPS > maxFps[i]) 30 maxFPS = maxFps[i]; 31 } 32 return maxFPS; 33 } 34 35 IPin* GetInputPin(IBaseFilter* filter) 36 { 37 HRESULT hr; 38 IPin* pin = NULL; 39 IEnumPins* pPinEnum = NULL; 40 filter->EnumPins(&pPinEnum); 41 if (pPinEnum == NULL) 42 { 43 return NULL; 44 } 45 46 // get first unconnected pin 47 hr = pPinEnum->Reset(); // set to first pin 48 49 while (S_OK == pPinEnum->Next(1, &pin, NULL)) 50 { 51 PIN_DIRECTION pPinDir; 52 pin->QueryDirection(&pPinDir); 53 if (PINDIR_INPUT == pPinDir) // This is an input pin 54 { 55 IPin* tempPin = NULL; 56 if (S_OK != pin->ConnectedTo(&tempPin)) // The pint is not connected 57 { 58 pPinEnum->Release(); 59 return pin; 60 } 61 } 62 pin->Release(); 63 } 64 pPinEnum->Release(); 65 return NULL; 66 } 67 68 IPin* GetOutputPin(IBaseFilter* filter, REFGUID Category) 69 { 70 HRESULT hr; 71 IPin* pin = NULL; 72 IEnumPins* pPinEnum = NULL; 73 filter->EnumPins(&pPinEnum); 74 if (pPinEnum == NULL) 75 { 76 return NULL; 77 } 78 // get first unconnected pin 79 hr = pPinEnum->Reset(); // set to first pin 80 while (S_OK == pPinEnum->Next(1, &pin, NULL)) 81 { 82 PIN_DIRECTION pPinDir; 83 pin->QueryDirection(&pPinDir); 84 if (PINDIR_OUTPUT == pPinDir) // This is an output pin 85 { 86 if (Category == GUID_NULL || PinMatchesCategory(pin, Category)) 87 { 88 pPinEnum->Release(); 89 return pin; 90 } 91 } 92 pin->Release(); 93 pin = NULL; 94 } 95 pPinEnum->Release(); 96 return NULL; 97 } 98 99 BOOL PinMatchesCategory(IPin *pPin, REFGUID Category) 100 { 101 BOOL bFound = FALSE; 102 IKsPropertySet *pKs = NULL; 103 HRESULT hr = pPin->QueryInterface(IID_PPV_ARGS(&pKs)); 104 if (SUCCEEDED(hr)) 105 { 106 GUID PinCategory; 107 DWORD cbReturned; 108 hr = pKs->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, NULL, 0, &PinCategory, 109 sizeof(GUID), &cbReturned); 110 if (SUCCEEDED(hr) && (cbReturned == sizeof(GUID))) 111 { 112 bFound = (PinCategory == Category); 113 } 114 pKs->Release(); 115 } 116 return bFound; 117 } 118 } // namespace videocapturemodule 119 } // namespace webrtc 120