Example #1
0
OMX_ERRORTYPE VideoSource::ProcessDataBuffer()
{
    OMX_ERRORTYPE ret = OMX_ErrorNone;

	LOG_DEBUG("VideoSource port number: %d\n", ports[CAPTURED_FRAME_PORT]->BufferNum());
	if (bSendEOS == OMX_TRUE || ports[CAPTURED_FRAME_PORT]->BufferNum() <= 0)
		return OMX_ErrorNoMore;

    ports[CAPTURED_FRAME_PORT]->GetBuffer(&pOutBufferHdr);
    if(pOutBufferHdr != NULL) {
        ret = SendBufferToDevice();
        if (ret != OMX_ErrorNone)
        {
            LOG_ERROR("Send buffer to device fail.\n");
            return ret;
        }
    }

	ret = GetOneFrameFromDevice();
	if (ret != OMX_ErrorNone)
		return ret;
	ret = ProcessOutputBufferFlag();
	if (ret != OMX_ErrorNone)
		return ret;
	ret = ProcessPreviewPort();
	if (ret != OMX_ErrorNone)
		return ret;
	ret = SendOutputBuffer();
	if (ret != OMX_ErrorNone)
		return ret;

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