Enumerating things in DirectShow
2010-4-11 17:52 | by 2ndboy在任何领域做段日子以后,或多或少都会积累起一些自己熟悉和习惯的工具函数/类,今天把最近做 DirectShow 程序的时候写的两个小函数晒一下:)
在 DirectShow 里做东西肯定有需要枚举一些 object 的场合,比如枚举出某 filter 的所有 pin,或者某 pin 支持的所有 media type。由于 DS 基于 COM 来构建,所以在枚举代码里时不时要照顾到 release 的逻辑,而且这些枚举代码也比较有共性,所以就写了两个小函数来封装一把,下面这个是枚举某 filter 特定方向上所有 pin 的:
- bool
- EnumPinsOfFilter(
- IBaseFilter *pFilter,
- PIN_DIRECTION dir,
- IEnumPins **ppEnum,
- IPin **ppPin )
- {
- bool bResult = false;
- while( true )
- {
- if( NULL == pFilter || NULL == ppEnum || NULL == ppPin )
- break;
- SafeRelease( *ppPin );
- HRESULT hResult = S_OK;
- if( NULL == *ppEnum )
- {
- hResult = pFilter->EnumPins( ppEnum );
- if( FAILED( hResult ) )
- break;
- (*ppEnum)->Reset();
- }
- ULONG uFetched = 0;
- hResult = (*ppEnum)->Next( 1, ppPin, &uFetched );
- if( FAILED( hResult ) )
- break;
- if( 0 == uFetched ) // no more pins
- break;
- PIN_DIRECTION pindir = PINDIR_INPUT;
- hResult = (*ppPin)->QueryDirection( &pindir );
- if( FAILED( hResult ) || pindir != dir )
- {
- SafeRelease( *ppPin );
- continue;
- }
- bResult = true;
- break;
- }
- return( bResult );
- }
调用者需要实现准备一个枚举器指针和一个 pin 指针,不断调用这个函数,直到得到一个 false 的返回值。每成功的调用一次需要 release 一下 pin 指针,最后一次调用结束后 release 枚举器指针:
- IEnumPins *pEnum = NULL;
- IPin *pPin = NULL;
- while( EnumPinsOfFilter( pFilter, PINDIR_OUTPUT, &pEnum, &pPin ) )
- {
- // use pPin
- SafeRelease( pPin );
- }
- SafeRelease( pEnum );
下面这个函数是用来枚举某 pin 支持的所有 media type 的:
- bool
- EnumMediaTypesOfPin(
- IPin *pPin,
- IEnumMediaTypes **ppEnum,
- AM_MEDIA_TYPE **ppType )
- {
- bool bResult = false;
- do
- {
- if( NULL == pPin || NULL == ppEnum || NULL == ppType )
- break;
- SafeDeleteMediaType( *ppType );
- HRESULT hResult = S_OK;
- if( NULL == *ppEnum )
- {
- hResult = pPin->EnumMediaTypes( ppEnum );
- if( FAILED( hResult ) )
- break;
- (*ppEnum)->Reset();
- }
- ULONG uFetched = 0;
- hResult = (*ppEnum)->Next( 1, ppType, &uFetched );
- if( FAILED( hResult ) )
- break;
- if( 0 == uFetched ) // no more types
- break;
- bResult = true;
- }
- while( false );
- return( bResult );
- }
用法类似,不多说了;)
-=-= =-=-
iPhone OS 4.0 发布以后,果然支持多任务,不过不是真正的多任务就对了。当然,这也不一定完全是坏处,还是要兼顾电力和内存的限制,达到硬件限制和使用体验的最佳平衡。不管怎么说,到夏天的时候就可以升级了。


