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; }
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; }