コード例 #1
0
tWMAFileStatus WMA10FileCBGetNewPayload(OMX_PTR *state, OMX_U64 offset, OMX_U32 *pnum_bytes, \
			     OMX_U8 **ppData, OMX_PTR pAppContext, OMX_U32 *pbIsCompressedPayload)
{
    tWMAFileStatus ret = cWMA_NoErr;
	WmaDec *pWmaDec = (WmaDec *)pAppContext;
	RingBuffer *pAudioRingBuffer = (RingBuffer *)&(pWmaDec->AudioRingBuffer);
	AudioTSManager *pAudioTSManager = (AudioTSManager *)&(pWmaDec->TS_Manager);
	*ppData = NULL;

	LOG_LOG("Wma need bytes: %d RingBuffer audio data len: %d\n", *pnum_bytes, pAudioRingBuffer->AudioDataLen());

	if(pAudioRingBuffer->AudioDataLen()<=0 && pWmaDec->bReceivedEOS == OMX_TRUE)
	{
		return cWMA_NoMoreFrames;
	}
	if((pAudioRingBuffer->AudioDataLen() - pAudioRingBuffer->nPrevOffset)<*pnum_bytes && pWmaDec->bReceivedEOS == OMX_FALSE)
	{
		*ppData = NULL;
		*pnum_bytes=0;
		return cWMA_NoMoreDataThisTime;
	}

	pAudioRingBuffer->BufferConsumered(pAudioRingBuffer->nPrevOffset);
	pAudioTSManager->Consumered(pAudioRingBuffer->nPrevOffset);

	OMX_U32 nActuralLen;

	pAudioRingBuffer->BufferGet(ppData, *pnum_bytes, &nActuralLen);
	LOG_DEBUG("Get stream length: %d\n", nActuralLen);

	if(nActuralLen==0 && pWmaDec->bReceivedEOS == OMX_TRUE)
	{
		return cWMA_NoMoreFrames;
	}

	pAudioRingBuffer->nPrevOffset = nActuralLen;
	return ret;
}