?
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