Как получить данные из выходного контакта фильтра DirectShow? - PullRequest
2 голосов
/ 01 декабря 2011

У меня есть фильтр прямого показа, который принимает входные данные, обрабатывает их и передает результат в 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;
}

1 Ответ

0 голосов
/ 01 декабря 2011

У вас есть полный исходный код, выполняйте его с помощью отладчика, пока не достигнете точки, где ваш фильтр вызывает IPin::Receive равноправного нисходящего фильтра, обновите / переопределите код и получите полный контроль над записью данных в файл и т. Д.

...