OMX_ERRORTYPE AudioFilter::ProcessOutputDataBuffer()
{
	OMX_ERRORTYPE ret = OMX_ErrorNone;

	AudioRingBuffer.TS_Get(&pOutBufferHdr->nTimeStamp);

	AUDIO_FILTERRETURNTYPE DecodeRet;

	if (bDecoderInitFail == OMX_TRUE)
	{
		AudioRingBuffer.BufferReset();
		bReceivedEOS = OMX_TRUE;
		DecodeRet = AUDIO_FILTER_EOS;
	}
	else
	{
		DecodeRet = AudioFilterFrame();
		if (DecodeRet == AUDIO_FILTER_FAILURE)
		{
			LOG_WARNING("Decode frame fail.\n");
			fsl_osal_sleep(4000);
			return OMX_ErrorNone;
		}
	}

	if (DecodeRet == AUDIO_FILTER_EOS && bReceivedEOS == OMX_TRUE && AudioRingBuffer.AudioDataLen() == 0)
	{
		LOG_DEBUG("Audio Filter %s send EOS, len %d\n", role[0], pOutBufferHdr->nFilledLen);
		pOutBufferHdr->nFlags |= OMX_BUFFERFLAG_EOS;
		bDecoderEOS = OMX_TRUE;
		SendEvent(OMX_EventBufferFlag, AUDIO_FILTER_OUTPUT_PORT, OMX_BUFFERFLAG_EOS, NULL);
	}

	if (bFirstFrame == OMX_TRUE)
	{
		bFirstFrame = OMX_FALSE;
		pOutBufferHdr->nFlags |= OMX_BUFFERFLAG_STARTTIME;
	}
	pOutBufferHdr->nFlags |= OMX_BUFFERFLAG_ENDOFFRAME;
	pOutBufferHdr->nFlags |= OMX_BUFFERFLAG_SYNCFRAME;

	LOG_LOG("audio filter pOutBufferHdr->nTimeStamp = %lld, \n", pOutBufferHdr->nTimeStamp);
	ports[AUDIO_FILTER_OUTPUT_PORT]->SendBuffer(pOutBufferHdr);
	pOutBufferHdr = NULL;

	return OMX_ErrorNone;
}
OMX_ERRORTYPE UdpsProtocol::Read(unsigned char* pBuffer, OMX_U32 nWant, OMX_BOOL * streamEOS, OMX_U64 offsetEnd, OMX_U32 *headerLen, OMX_U32 *nFilled)
{
    int read = 0;
    //static int count = 0;
    static int fail_count = 0;
    while(1){
        if(GetStopReading(callbackArg) == OMX_TRUE)
            return OMX_ErrorNone;

        read = pURLProtocol->url_read(uc, pBuffer, nWant);

        //count++;
        //if((count % 10) == 0)
        //    printf("UdpsProtocol::Read %d\n", read);

        if(read <= 0){
            fail_count++;
            if(fail_count > FAIL_COUNT_LIMITATION){
                printf("Reconnecting...\n");
                pURLProtocol->url_close(uc);
                int err = pURLProtocol->url_open(uc, uc->filename, uc->flags);
                if(err)
                    printf("Reconnect fail\n");
                fail_count = 0;
            }
            fsl_osal_sleep(100000);
            continue;
        }
        
        fail_count = 0;

        break;
    }
    
    *nFilled = read;
    *headerLen = 0;
    *streamEOS = OMX_FALSE;
    return OMX_ErrorNone;
}
OMX_ERRORTYPE AudioSource::ProcessDataBuffer()
{
    OMX_ERRORTYPE ret = OMX_ErrorNone;
	OMX_U32 nActuralLen;
	
	if (bSendEOS == OMX_TRUE)
		return OMX_ErrorNoMore;

	if (AudioRenderRingBuffer.AudioDataLen() <= nFadeInFadeOutProcessLen) {
		if (nDeviceReadLen == 0) {
			LOG_DEBUG("Ringbuffer data len: %d\n", AudioRenderRingBuffer.AudioDataLen());
			ret = GetOneFrameFromDevice();
			if (ret == OMX_ErrorUndefined) {
				OMX_U8 *pBuffer;

				AudioRenderRingBuffer.BufferGet(&pBuffer, nFadeInFadeOutProcessLen, &nActuralLen);
				AudioRenderFadeInFadeOut.SetMode(FADEOUT);
				AudioRenderFadeInFadeOut.Process(pBuffer, nActuralLen);
				AudioRenderRingBuffer.BufferConsumered(nActuralLen);
				AudioRenderRingBuffer.BufferAdd(pBuffer, nFadeInFadeOutProcessLen, &nActuralLen);

				nDeviceReadOffset = 0;
				AudioRenderRingBuffer.BufferAddZeros(nDeviceReadLen, &nActuralLen);
				LOG_LOG("Ringbuffer add len: %d\n", nActuralLen);
				nDeviceReadLen -= nActuralLen;
				nDeviceReadOffset += nActuralLen;
				bAddZeros = OMX_TRUE;
				if (nDeviceReadLen == 0)
					AudioRenderFadeInFadeOut.SetMode(FADEIN);

			} else {
				if (ret != OMX_ErrorNone)
					return ret;

				bAddZeros = OMX_FALSE;
				nDeviceReadOffset = 0;
				AudioRenderFadeInFadeOut.Process(pDeviceReadBuffer, nDeviceReadLen);
				AudioRenderRingBuffer.BufferAdd(pDeviceReadBuffer, nDeviceReadLen, &nActuralLen);
				LOG_LOG("Ringbuffer add len: %d\n", nActuralLen);
				nDeviceReadLen -= nActuralLen;
				nDeviceReadOffset += nActuralLen;
			}
		} else {
			if (bAddZeros == OMX_TRUE) {
				AudioRenderRingBuffer.BufferAddZeros(nDeviceReadLen, &nActuralLen);
				nDeviceReadLen -= nActuralLen;
				nDeviceReadOffset += nActuralLen;
				if (nDeviceReadLen == 0)
					AudioRenderFadeInFadeOut.SetMode(FADEIN);
			} else {
				AudioRenderFadeInFadeOut.Process(pDeviceReadBuffer + nDeviceReadOffset, nDeviceReadLen);
				AudioRenderRingBuffer.BufferAdd(pDeviceReadBuffer + nDeviceReadOffset, nDeviceReadLen, &nActuralLen);
				nDeviceReadLen -= nActuralLen;
				nDeviceReadOffset += nActuralLen;
			}
		}
	}

	LOG_LOG("Ringbuffer data len: %d\n", AudioRenderRingBuffer.AudioDataLen());
	while(AudioRenderRingBuffer.AudioDataLen() > nFadeInFadeOutProcessLen) {
		if (ports[OUTPUT_PORT]->BufferNum() == 0 && pOutBufferHdr == NULL ) {
			fsl_osal_sleep(5000);
			continue;
		}

		if (ports[OUTPUT_PORT]->BufferNum() > 0 && pOutBufferHdr == NULL) {
			ports[OUTPUT_PORT]->GetBuffer(&pOutBufferHdr);
		}

		ret = ProcessOutputBufferData();
		if (ret != OMX_ErrorNone)
			return ret;
		ret = ProcessOutputBufferFlag();
		if (ret != OMX_ErrorNone)
			return ret;
		ret = SendOutputBuffer();
		if (ret != OMX_ErrorNone)
			return ret;
	}

	return OMX_ErrorNone;
}
OMX_ERRORTYPE RtpsProtocol::Read(unsigned char* pBuffer, OMX_U32 nWant, OMX_BOOL * streamEOS, OMX_U64 offsetEnd, OMX_U32 *headerLen, OMX_U32 *nFilled)
{
    int read = 0;
    //static int count = 0;
    static int fail_count = 0;
    while(1){
        if(GetStopReading(callbackArg) == OMX_TRUE)
            return OMX_ErrorNone;

        read = pURLProtocol->url_read(uc, pBuffer, nWant);

        //count++;
        //if((count % 10) == 0)
        //    printf("RtpsProtocol::Read %d\n", read);

        if(read <= 0){
            fail_count++;
            if(fail_count > FAIL_COUNT_LIMITATION){
                printf("Reconnecting...\n");
                pURLProtocol->url_close(uc);
                int err = pURLProtocol->url_open(uc, uc->filename, uc->flags);
                if(err)
                    printf("Reconnect fail\n");
                fail_count = 0;
            }
            fsl_osal_sleep(100000);
            continue;
        }

        OMX_U8 version = (pBuffer[0] & 0xc0) >> 6;
        if(version != 2){
            printf("version number mismatch: %x, len %d\n", version, read);
            continue;
        }
        OMX_U8 payloadType = pBuffer[1] & 0x7f;
        if(payloadType != MP2T){
            printf("payloadType mismatch: %x, len %d\n", payloadType, read);
            continue;
        }

        if(ssrc == 0){ // first packet
            ssrc = pBuffer[8] << 24 | pBuffer[9] << 16 | pBuffer[10] << 8 | pBuffer[11];
            seqNum = pBuffer[2] << 8 | pBuffer[3];
            printf("ssrc %x, seq is %x", ssrc, seqNum);
        }
        else{ // following packets
            OMX_U32 currentSsrc = pBuffer[8] << 24 | pBuffer[9] << 16 | pBuffer[10] << 8 | pBuffer[11];
            if(currentSsrc != ssrc){
                printf("ssrc mismatch: %x, len %d\n", currentSsrc, read);
                continue;
            }
            OMX_U32 currentSeqNum = pBuffer[2] << 8 | pBuffer[3];
            OMX_U32 diff = (currentSeqNum + 0xffff - seqNum) % 0xffff;
            if(diff > 1)
                printf("seqence number error, prev: 0x%x, cur 0x%x, lost %d\n", seqNum, currentSeqNum, diff);

            seqNum = currentSeqNum;
        }

        break;
    }
    
    *nFilled = read;
    *headerLen = 12;
    *streamEOS = OMX_FALSE;
    
    return OMX_ErrorNone;
}
Esempio n. 5
0
OMX_ERRORTYPE GMSubtitlePlayer::ThreadHandler()
{
    delayedSample.nFilledLen = -1;

    fsl_osal_sem_wait(pSem);

    while(bThreadStop != OMX_TRUE) {
        OMX_ERRORTYPE ret = OMX_ErrorNone;
        GM_STATE State = GM_STATE_NULL;
        mAVPlayer->GetState(&State);
        if(State == GM_STATE_PAUSE) {
            fsl_osal_sleep(500000);
            continue;
        }

        if(delayedSample.nFilledLen == -1){
            OMX_BOOL bEOS = OMX_FALSE;
            ret = mSource->GetNextSubtitleSample(mSample, bEOS);
            if(ret == OMX_ErrorNotReady){
                LOG_DEBUG("subtitle not ready, sleep");
                fsl_osal_sleep(300000);
                continue;
            }

            if(bEOS == OMX_TRUE)
                break;
        }
        else{
            fsl_osal_memcpy(&mSample, &delayedSample, sizeof(GMSubtitleSource::SUBTITLE_SAMPLE));
            delayedSample.nFilledLen = -1;
        }

        LOG_DEBUG("subtitle: format: %d, buffer: %s, len: %d, start pts: %lld\n",
                mSample.fmt, mSample.pBuffer, mSample.nFilledLen, mSample.nStartTime);

        OMX_TICKS nMediaTime = 0;
        mAVPlayer->GetMediaPositionNoLock(&nMediaTime);
        OMX_S32 diff = mSample.nStartTime - nMediaTime;

        LOG_DEBUG("diff: %d, start time: %lld, media time: %lld\n",
                diff, mSample.nStartTime, nMediaTime);

        if(diff > 0) {
            fsl_osal_cond_timedwait(Cond, diff);
        }

        if(bThreadStop == OMX_TRUE) {
            LOG_DEBUG("GMSubtitlePlayer break as stop.\n");
            return OMX_ErrorUndefined;
        }

        if(bReset == OMX_TRUE) {
            LOG_DEBUG("GMSubtitlePlayer break as Reset.\n");
            return OMX_ErrorNone;
        }

        mAVPlayer->GetState(&State);
        if(State == GM_STATE_PAUSE) {
            fsl_osal_memcpy(&delayedSample, &mSample, sizeof(GMSubtitleSource::SUBTITLE_SAMPLE));
            continue;
        }

        RenderOneSample();
    }

    return OMX_ErrorNone;
}