У меня есть фильтр прямого показа, который принимает входные данные, обрабатывает их и передает результат в outputpin.
Я хочу записать выходные данные этого фильтра в файл ... И я хочу сделать это в классе фильтра. Поэтому я хочу получить данные буфера выходного вывода.
Вкратце, как достичь окончательных данных outputpin в его фильтре? Как мне это сделать?
Не: Выходной вывод получен из CBaseOutputPin. Это фильтр с открытым исходным кодом, он «волшебным образом» :-) помещает точные данные на свой выходной вывод, который я пока не могу понять, как ...
Обновление:
Вот заявление:
Media Source ----> GFilter ----> FileWriter
У меня есть исходный код GFilter ... У меня нет исходного кода FileWriter ... Что я хочу сделать, это заставить GFilter записывать свои собственные данные ... Я отлаживаю GFilter, чтобы получить представление о том, как преобразовывать данные, но моя попытка чтобы записать эти данные с неверными данными ... Итак, я пока решил, как просто получить данные на его выходной вывод ...
Update [2]
В выходной булавке фильтра где-то, когда писатель фильтра передает вывод писателя файла в переменную IStreamPtr ... Кажется, что все записывается в переменную m_pIStream, которая имеет тип [IStreamPtr]
GFilterOutput::CompleteConnect(IPin *pReceivePin)
{
// make sure that this is the file writer, supporting
// IStream, or we will not be able to write out the metadata
// at stop time
// m_pIStream is IStreamPtr type
m_pIStream = pReceivePin;
if (m_pIStream == NULL)
{
return E_NOINTERFACE;
}
return CBaseOutputPin::CompleteConnect(pReceivePin);
}
...
GFilterOutput::Replace(LONGLONG pos, const BYTE* pBuffer, long cBytes)
{
//OutputDebugStringA("DEBUG: Now at MuxOutput Replace");
// all media content is written when the graph is running,
// using IMemInputPin. On stop (during our stop, but after the
// file writer has stopped), we switch to IStream for the metadata.
// The in-memory index is updated after a successful call to this function, so
// any data not written on completion of Stop will not be in the index.
CAutoLock lock(&m_csWrite);
HRESULT hr = S_OK;
if (m_bUseIStream)
{
IStreamPtr pStream = GetConnected();
if (m_pIStream == NULL)
{
hr = E_NOINTERFACE;
} else {
LARGE_INTEGER liTo;
liTo.QuadPart = pos;
ULARGE_INTEGER uliUnused;
hr = m_pIStream->Seek(liTo, STREAM_SEEK_SET, &uliUnused);
if (SUCCEEDED(hr))
{
ULONG cActual;
hr = m_pIStream->Write(pBuffer, cBytes, &cActual);
if (SUCCEEDED(hr) && ((long)cActual != cBytes))
{
hr = E_FAIL;
}
}
}
} else {
// where the buffer boundaries lie is not important in this
// case, so break writes up into the buffers.
while (cBytes && (hr == S_OK))
{
IMediaSamplePtr pSample;
hr = GetDeliveryBuffer(&pSample, NULL, NULL, 0);
if (SUCCEEDED(hr))
{
long cThis = min(pSample->GetSize(), cBytes);
BYTE* pDest;
pSample->GetPointer(&pDest);
CopyMemory(pDest, pBuffer, cThis);
pSample->SetActualDataLength(cThis);
// time stamps indicate file position in bytes
LONGLONG tStart = pos;
LONGLONG tEnd = pos + cThis;
pSample->SetTime(&tStart, &tEnd);
hr = Deliver(pSample);
if (SUCCEEDED(hr))
{
pBuffer += cThis;
cBytes -= cThis;
pos += cThis;
}
}
}
}
return hr;
}