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; }
what should I do? thanks.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; }