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