Esempio n. 1
0
/* 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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}