Quantcast
Channel: Media Foundation Development for Windows Desktop forum
Viewing all articles
Browse latest Browse all 1079

why cannot receive data in ProcessOutput

$
0
0

I have received data from IMFMediaSource in IMFTransform::ProcessInput, after I process the data then I should receive it in ProcessOutput.

But It seems not work. when I get the IMediaBuffer in ProcessOutput, the buffer size is zero.

HRESULT OggDecoder::ProcessInput(DWORD dwInputStreamID, IMFSample  *pSample, DWORD dwFlags)
{
    if (pSample == NULL)
    {
        return E_POINTER;
    }
    if (!IsValidInputStream(dwInputStreamID))
    {
        return MF_E_INVALIDSTREAMNUMBER;
    }
    if (dwFlags != 0)
    {
        return E_INVALIDARG; 
    }
    EnterCriticalSection(&m_critSec);

    HRESULT hr = S_OK;
    LONGLONG rtTimestamp = 0;

    if (!m_pInputType || !m_pOutputType)
    {
        hr = MF_E_NOTACCEPTING;   
    }
    else if (HasPendingOutput())
    {
        hr = MF_E_NOTACCEPTING;  
    }
    if (SUCCEEDED(hr))
    {   
       hr = pSample->ConvertToContiguousBuffer(&m_pBuffer);  // I can get the data buffer here!!!
    }

    if (SUCCEEDED(hr))
    {   
        hr = m_pBuffer->Lock(&m_pbData, NULL, &m_cbData);
    }

    if (SUCCEEDED(hr))
    {
       
        if (FAILED(pSample->GetSampleTime(&rtTimestamp)))
        {
            rtTimestamp = INVALID_TIME;
        }

        m_StreamState.TimeStamp(rtTimestamp);

        hr = Process();// do something
    }

    LeaveCriticalSection(&m_critSec);
    return hr;
}

HRESULT OggDecoder::ProcessOutput( DWORD dwFlags, DWORD cOutputBufferCount, MFT_OUTPUT_DATA_BUFFER *pOutputSamples, DWORD *pdwStatus ) { if (dwFlags != 0) { return E_INVALIDARG; } if (pOutputSamples == NULL || pdwStatus == NULL) { return E_POINTER; } if (cOutputBufferCount != 1) { return E_INVALIDARG; } if (pOutputSamples[0].pSample == NULL) { return E_INVALIDARG; } EnterCriticalSection(&m_critSec); HRESULT hr = S_OK; DWORD cbData = 0; IMFMediaBuffer *pOutput = NULL;

if (!HasPendingOutput()) { hr = MF_E_TRANSFORM_NEED_MORE_INPUT; } // Get the output buffer. if (SUCCEEDED(hr)) { hr = pOutputSamples[0].pSample->GetBufferByIndex(0, &pOutput); // I cannot get the buffer here!!!!!!!

hr = pOutput->GetMaxLength(&cbData); // and cbData will be zero!!!!

} if (SUCCEEDED(hr)) { hr = InternalProcessOutput(pOutputSamples[0].pSample, pOutput); } if (SUCCEEDED(hr)) { // do something } SafeRelease(&pOutput); LeaveCriticalSection(&m_critSec); return hr; }

what should I do? thanks.



Viewing all articles
Browse latest Browse all 1079

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>