DxShow Dynamic FilterResChange



  • Hallo,

    ich habe einen DxShow Filter, und möchte zur Laufzeit des streams die Dimension ändern, zuerst habe ich das in der Experimentierphase so gemacht:

    Test Pseudo Code:

    HRESULT CVCamStream::FillBuffer(IMediaSample *pms)
    {
    	REFERENCE_TIME rtNow;
    	REFERENCE_TIME avgFrameTime = ((VIDEOINFOHEADER*)m_mt.pbFormat)->AvgTimePerFrame;
    
    	rtNow = m_rtLastTime;
    	m_rtLastTime += avgFrameTime;
    	pms->SetTime(&rtNow, &m_rtLastTime);
    	pms->SetSyncPoint(TRUE);
    
    	BYTE *pImg(0);
    	if (m_pFcGetFrame && (pImg = m_pFcGetFrame(m_PicNr++)))
    	{
    		BYTE *pData; pms->GetPointer(&pData);
    		int Width(320), Height(240), Bpp(24), DataLen(pms->GetSize()); 
    
    		if (m_pFcGetDimension)m_pFcGetDimension(Width, Height, Bpp);
    
    		if (Width*Height*(Bpp >> 3) == DataLen)
    		{
    			memcpy(pData, pImg, DataLen);
    		}
    
    		else//resolution is changed
    		{
    			IFilterGraph *pGraph = m_pParent->GetGraph();
    
    			((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biWidth     = Width;
    			((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biHeight    = Height;
    			((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biBitCount  = Bpp;
    			((VIDEOINFOHEADER*)m_mt.pbFormat)->bmiHeader.biSizeImage = Width*Height*(Bpp >> 3);
    
    			pms->SetMediaType(&m_mt);
    
    			pGraph->Reconnect(this);
    
    		}
    	}
    	else
    	{
    		rtNow = m_rtLastTime;
    		m_rtLastTime += avgFrameTime;
    		pms->SetTime(&rtNow, &m_rtLastTime);
    		pms->SetSyncPoint(TRUE);
    
    		BYTE *pData;
    		long lDataLen;
    		pms->GetPointer(&pData);
    		lDataLen = pms->GetSize();
    		for (int i = 0; i < lDataLen; ++i)
    			pData[i] = rand();
    	}
    
    	return NOERROR;
    }
    

    Leider wirkt das nicht :

    Funktion via Basefilter:

    pms->SetMediaType(&m_mt);
    pGraph->Reconnect(this);
    

    GibtVes Hinweise wie genau der Pin deconnected werden muss
    Das verfahren ist noch unklar.

    Danke für Hinweise
    Karsten


Anmelden zum Antworten