/* IPin methods */ STDMETHODIMP SampleCapturePin::Connect( IPin * pReceivePin, const AM_MEDIA_TYPE *pmt ) { if( State_Running == p_filter->state ) { ATLTRACE( "SampleCapturePin::Connect [not stopped]" ); return VFW_E_NOT_STOPPED; } if( p_connected_pin ) { ATLTRACE( "SampleCapturePin::Connect [already connected]" ); return VFW_E_ALREADY_CONNECTED; } if( !pmt ) return S_OK; if( GUID_NULL != pmt->majortype && media_types[0].majortype != pmt->majortype ) { ATLTRACE( "SampleCapturePin::Connect [media major type mismatch]" ); return S_FALSE; } if( GUID_NULL != pmt->subtype && !GetFourCCFromMediaType(*pmt) ) { ATLTRACE( "SampleCapturePin::Connect [media subtype type " "not supported]" ); return S_FALSE; } if( pmt->pbFormat && pmt->majortype == MEDIATYPE_Video ) { if( !((VIDEOINFOHEADER *)pmt->pbFormat)->bmiHeader.biHeight || !((VIDEOINFOHEADER *)pmt->pbFormat)->bmiHeader.biWidth ) { ATLTRACE( "SampleCapturePin::Connect " "[video width/height == 0 ]" ); return S_FALSE; } } ATLTRACE( "SampleCapturePin::Connect [OK]" ); return S_OK; }
STDMETHODIMP SampleCapturePin::QueryAccept( const AM_MEDIA_TYPE *pmt ) { if( State_Stopped != p_filter->state || media_types == NULL) { ATLTRACE( "SampleCapturePin::QueryAccept [not stopped]" ); return S_FALSE; } if( media_types[0].majortype != pmt->majortype ) { ATLTRACE( "SampleCapturePin::QueryAccept [media type mismatch]" ); return S_FALSE; } int i_fourcc = GetFourCCFromMediaType(*pmt); if( !i_fourcc ) { ATLTRACE( "SampleCapturePin::QueryAccept " "[media type not supported]" ); return S_FALSE; } if( pmt->majortype == MEDIATYPE_Video ) { /*if( pmt->pbFormat && ( (((VIDEOINFOHEADER *)pmt->pbFormat)->bmiHeader.biHeight == 0) || (((VIDEOINFOHEADER *)pmt->pbFormat)->bmiHeader.biWidth == 0) ) ) { ATLTRACE( "SampleCapturePin::QueryAccept [video size wxh == 0]"); return S_FALSE; }*/ VIDEOINFOHEADER * pSourceVHI = AMGetVideoInfoHeader(*pmt); if(pSourceVHI == NULL) return S_FALSE; BOOL bMatch = FALSE; for(int i = 0; i < media_type_count; i++) { if(GetFourCCFromMediaType(media_types[i]) == i_fourcc) { VIDEOINFOHEADER * pVHI = AMGetVideoInfoHeader(media_types[i]); if(pVHI) { if(pVHI->bmiHeader.biHeight == pSourceVHI->bmiHeader.biHeight && pVHI->bmiHeader.biWidth == pSourceVHI->bmiHeader.biWidth && pVHI->bmiHeader.biCompression == pSourceVHI->bmiHeader.biCompression) { bMatch = TRUE; delete pVHI; break; } delete pVHI; } } } delete pSourceVHI; if(!bMatch) { return S_FALSE; } ATLTRACE( "SampleCapturePin::QueryAccept [OK] " "(width=%ld, height=%ld, chroma=%4.4s)", ((VIDEOINFOHEADER *)pmt->pbFormat)->bmiHeader.biWidth, ((VIDEOINFOHEADER *)pmt->pbFormat)->bmiHeader.biHeight, (char *)&i_fourcc ); } else if( pmt->majortype == MEDIATYPE_Audio ) { BOOL bMatch = FALSE; WAVEFORMATEX *pWfx = reinterpret_cast<WAVEFORMATEX*>(pmt->pbFormat); for(int i = 0; i < media_type_count; i++) { WAVEFORMATEX *pWfxSrc = reinterpret_cast<WAVEFORMATEX*>(media_types[i].pbFormat); if(pWfx && pWfxSrc) { bMatch = TRUE; if(pWfxSrc->nChannels && pWfxSrc->nChannels != pWfx->nChannels) bMatch = FALSE; if(pWfxSrc->nSamplesPerSec && pWfxSrc->nSamplesPerSec != pWfx->nSamplesPerSec) bMatch = FALSE; if(pWfxSrc->wBitsPerSample && pWfxSrc->wBitsPerSample != pWfx->wBitsPerSample) bMatch = FALSE; if(bMatch) break; } } if(!bMatch) return S_FALSE; ATLTRACE( "SampleCapturePin::QueryAccept [OK] (channels=%d, " "samples/sec=%lu, bits/samples=%d, format=%4.4s)", ((WAVEFORMATEX *)pmt->pbFormat)->nChannels, ((WAVEFORMATEX *)pmt->pbFormat)->nSamplesPerSec, ((WAVEFORMATEX *)pmt->pbFormat)->wBitsPerSample, (char *)&i_fourcc ); } else { ATLTRACE( "SampleCapturePin::QueryAccept [OK] (stream format=%4.4s)", (char *)&i_fourcc ); } if( p_connected_pin ) { FreeMediaType( cx_media_type ); CopyMediaType( &cx_media_type, pmt ); } return S_OK; }
STDMETHODIMP CapturePin::QueryAccept( const AM_MEDIA_TYPE *pmt ) { if( State_Stopped != p_filter->state ) { msg_Dbg( p_input, "CapturePin::QueryAccept [not stopped]" ); return S_FALSE; } if( media_types[0].majortype != pmt->majortype ) { msg_Dbg( p_input, "CapturePin::QueryAccept [media type mismatch]" ); return S_FALSE; } int i_fourcc = GetFourCCFromMediaType(*pmt); if( !i_fourcc ) { msg_Dbg( p_input, "CapturePin::QueryAccept " "[media type not supported]" ); return S_FALSE; } if( pmt->majortype == MEDIATYPE_Video ) { if( pmt->pbFormat && ( (((VIDEOINFOHEADER *)pmt->pbFormat)->bmiHeader.biHeight == 0) || (((VIDEOINFOHEADER *)pmt->pbFormat)->bmiHeader.biWidth == 0) ) ) { msg_Dbg( p_input, "CapturePin::QueryAccept [video size wxh == 0]"); return S_FALSE; } msg_Dbg( p_input, "CapturePin::QueryAccept [OK] " "(width=%ld, height=%ld, chroma=%4.4s, fps=%f)", ((VIDEOINFOHEADER *)pmt->pbFormat)->bmiHeader.biWidth, ((VIDEOINFOHEADER *)pmt->pbFormat)->bmiHeader.biHeight, (char *)&i_fourcc, 10000000.0f/((float)((VIDEOINFOHEADER *)pmt->pbFormat)->AvgTimePerFrame) ); } else if( pmt->majortype == MEDIATYPE_Audio ) { msg_Dbg( p_input, "CapturePin::QueryAccept [OK] (channels=%d, " "samples/sec=%lu, bits/samples=%d, format=%4.4s)", ((WAVEFORMATEX *)pmt->pbFormat)->nChannels, ((WAVEFORMATEX *)pmt->pbFormat)->nSamplesPerSec, ((WAVEFORMATEX *)pmt->pbFormat)->wBitsPerSample, (char *)&i_fourcc ); } else { msg_Dbg( p_input, "CapturePin::QueryAccept [OK] (stream format=%4.4s)", (char *)&i_fourcc ); } if( p_connected_pin ) { FreeMediaType( cx_media_type ); CopyMediaType( &cx_media_type, pmt ); } return S_OK; }