SRTParser::SRTParser(CP_PIPETYPE *hPipe, OMX_STRING url)
{
    mInit = OMX_FALSE;
    mState = SRT_STATE_SEQ_NUM;
    mBuffer = NULL;
    mSource = NULL;
    mTimeTable = NULL;
    mTimeTableEntrySize = 0;
    mTimeTableIndex = 0;
    mTimeTableSize = SRT_TIME_TABLE_SIZE;
    mBuffer = (OMX_U8*)FSL_MALLOC(BUFFER_SIZE_SRT);
    if(mBuffer == NULL) {
        LOG_ERROR("failed allocate buffer for SRTParser.\n");
        return;
    }
    mSource = FSL_NEW(TextSource, (hPipe, url));
    if(mSource == NULL) {
        LOG_ERROR("failed create TextSource.\n");
        return;
    }
    mTimeTable = (TIME_NODE*)FSL_MALLOC(mTimeTableSize * sizeof(TIME_NODE));
    if(mTimeTable == NULL) {
        LOG_ERROR("failed to create time table for srt.\n");
        return;
    }
    mInit = OMX_TRUE;
}
OMX_ERRORTYPE TextSource::Init()
{
    CPresult ret = 0;
    ret = mPipe->Open(&mHandle, mUrl, CP_AccessRead);
    if(ret != 0) {
        LOG_ERROR("Can't open content: %s\n", mUrl);
        return OMX_ErrorUndefined;
    }

    mBuffer = (OMX_U8*)FSL_MALLOC(mBufferSize);
    if(mBuffer == NULL) {
        DeInit();
        return OMX_ErrorInsufficientResources;
    }

    mCache = (OMX_U8*)FSL_MALLOC(mCacheSize);
    if(mCache == NULL) {
        DeInit();
        return OMX_ErrorInsufficientResources;
    }
    mCacheRead = mCacheFill = 0;
    mOffset = 0;

    return OMX_ErrorNone;
}
RINGBUFFER_ERRORTYPE RingBuffer::BufferCreate(fsl_osal_u32 nPushModeLen, fsl_osal_u32 nRingBufferScale)
{
	RINGBUFFER_ERRORTYPE ret = RINGBUFFER_SUCCESS;

	nPushModeInputLen = nPushModeLen;
	nRingBufferLen = nPushModeInputLen * nRingBufferScale;

	/** Create queue for TS. */
	TS_Queue = FSL_NEW(Queue, ());
	if (TS_Queue == NULL)
	{
		LOG_ERROR("Can't get memory.\n");
		return RINGBUFFER_INSUFFICIENT_RESOURCES;
	}

	if (TS_Queue->Create(TS_QUEUE_SIZE, sizeof(TS_QUEUE), E_FSL_OSAL_FALSE) != QUEUE_SUCCESS)
	{
		FSL_DELETE(TS_Queue);
		LOG_ERROR("Can't create audio ts queue.\n");
		return RINGBUFFER_INSUFFICIENT_RESOURCES;
	}

	/** Create ring buffer for audio decoder input stream. */
	LOG_DEBUG("Ring buffer len: %d\n", nRingBufferLen);
	RingBufferPtr = (fsl_osal_u8 *)FSL_MALLOC(nRingBufferLen+8);
	if (RingBufferPtr == NULL)
	{
		FSL_DELETE(TS_Queue);
		TS_Queue->Free();
		LOG_ERROR("Can't get memory.\n");
		return RINGBUFFER_INSUFFICIENT_RESOURCES;
	}

	Reserved = (fsl_osal_u8 *)FSL_MALLOC(nPushModeInputLen);
	if (Reserved == NULL)
	{
		FSL_DELETE(TS_Queue);
		TS_Queue->Free();
		FSL_FREE(RingBufferPtr);
		LOG_ERROR("Can't get memory.\n");
		return RINGBUFFER_INSUFFICIENT_RESOURCES;
	}

	CurrentTS = 0;
	bHaveTS = E_FSL_OSAL_FALSE;
	TotalConsumeLen = 0;
	RingBufferBeginPre = -1;
	ReservedLen = nPushModeInputLen;
	Begin = RingBufferPtr;
	End = RingBufferPtr;
	Consumered = RingBufferPtr;
	nPrevOffset = 0;

	return ret;
}
OMX_ERRORTYPE prepare_port_buffers(HTEST *hTest, OMX_U32 nPortIndex)
{
    OMX_COMPONENTTYPE *hComponent = NULL;
    OMX_PARAM_PORTDEFINITIONTYPE sPortDef;
    OMX_BUFFERHEADERTYPE *pBufferHdr = NULL;
    OMX_U8 *pBuffer = NULL;
    OMX_U32 i;

    hComponent = hTest->hComponent;
    OMX_INIT_STRUCT(&sPortDef, OMX_PARAM_PORTDEFINITIONTYPE);
    sPortDef.nPortIndex = nPortIndex;
    OMX_GetParameter(hComponent, OMX_IndexParamPortDefinition, &sPortDef);

    for(i=0; i<sPortDef.nBufferCountActual; i++) {
        if(hTest->bAllocater[nPortIndex] == OMX_TRUE) {
            OMX_AllocateBuffer(hComponent, &pBufferHdr, nPortIndex, NULL, sPortDef.nBufferSize);
            printf("Allocate buffer done.\n");
        }
        else {
            pBuffer = (OMX_U8*)FSL_MALLOC(sPortDef.nBufferSize);
            OMX_UseBuffer(hComponent, &pBufferHdr, nPortIndex, NULL, sPortDef.nBufferSize, pBuffer);
            printf("Use buffer done.\n");
        }
        hTest->pBufferHdr[nPortIndex][i] = pBufferHdr;
    }
    hTest->nBufferHdr[nPortIndex] = sPortDef.nBufferCountActual;


    return OMX_ErrorNone;
}
OMX_ERRORTYPE UniaDecoder::AudioFilterCheckCodecConfig()
{
    OMX_S32 ret = OMX_ErrorNone;
    if(IDecoder == NULL || uniaHandle == NULL)
        return OMX_ErrorUndefined;

    if (codecConfig.buf != NULL) {
        codecConfig.buf = (char *)FSL_REALLOC(codecConfig.buf, \
            codecConfig.size + pInBufferHdr->nFilledLen);
        if (codecConfig.buf == NULL)
        {
            LOG_ERROR("Can't get memory.\n");
            return OMX_ErrorInsufficientResources;
        }
        fsl_osal_memcpy(codecConfig.buf + codecConfig.size, pInBufferHdr->pBuffer, pInBufferHdr->nFilledLen);
        codecConfig.size += pInBufferHdr->nFilledLen;

    } else {
         codecConfig.buf = (char *)FSL_MALLOC(pInBufferHdr->nFilledLen);
        if (codecConfig.buf == NULL)
        {
            LOG_ERROR("Can't get memory.\n");
            return OMX_ErrorInsufficientResources;
        }
        fsl_osal_memcpy(codecConfig.buf, pInBufferHdr->pBuffer, pInBufferHdr->nFilledLen);
        codecConfig.size = pInBufferHdr->nFilledLen;
    }

    ret = IDecoder->SetParameter(uniaHandle,UNIA_CODEC_DATA,(UniACodecParameter*)&codecConfig);

    LOG_DEBUG("UniaDec::AudioDecoderBaseCheckCodecConfig nFilledLen=%d,ret=%d",pInBufferHdr->nFilledLen,ret);
    pInBufferHdr->nFilledLen = 0;

    return (OMX_ERRORTYPE)ret;
}
OMX_ERRORTYPE GMInbandSubtitleSource::SetType(OMX_STRING type)
{
    SUBTITLE_TYPE mType1;
    OMX_S32 nLen = 0;

    LOG_DEBUG("GMInbandSubtitleSource set type: %s\n", type);

    mType1 = GetSubtitleType(type);
    switch(mType1) {
        case TYPE_3GPP:
            nLen = BUFFER_SIZE_3GP;
        case TYPE_SRT:
            nLen = BUFFER_SIZE_SRT;
        default:
            break;
    }

    if(mType1 == TYPE_UNKNOWN)
        return OMX_ErrorNotImplemented;

    if(mType != mType1) {
        if(pBuffer)
            FSL_FREE(pBuffer);

        pBuffer = (OMX_U8*)FSL_MALLOC(nLen);
        if(pBuffer == NULL)
            return OMX_ErrorInsufficientResources;

        mType = mType1;
    }

    fsl_osal_memset(pBuffer, 0, nLen);

    return OMX_ErrorNone;
}
VO_U32 cmnMemAlloc (VO_S32 uID,  VO_MEM_INFO * pMemInfo)
{
	if (!pMemInfo)
		return VO_ERR_INVALID_ARG;

	pMemInfo->VBuffer = FSL_MALLOC(pMemInfo->Size);
	return 0;
}
OMX_ERRORTYPE WbAmrEncWrapper::InstanceInit()
{
    OMX_ERRORTYPE ret = OMX_ErrorNone;
	OMX_S32 i;

	pAmrEncConfig = (WBAMRE_Encoder_Config *)FSL_MALLOC(sizeof(WBAMRE_Encoder_Config));
	if (pAmrEncConfig == NULL)
	{
		LOG_ERROR("Can't get memory.\n");
		return OMX_ErrorInsufficientResources;
	}
	fsl_osal_memset(pAmrEncConfig, 0, sizeof(WBAMRE_Encoder_Config));

	pAmrEncConfig->wbappe_initialized_data_start = NULL;

	WBAMRE_RET_TYPE AmrRet;
	AmrRet = wbamre_query_enc_mem(pAmrEncConfig);
	if (AmrRet != WBAMRE_OK)
	{
		LOG_ERROR("Amr encoder query memory fail.\n");
		return OMX_ErrorUndefined;
	}

	OMX_S32 MemoryCnt = pAmrEncConfig->wbamre_mem_info.wbamre_num_reqs;
	for (i = 0; i < MemoryCnt; i ++)
	{
		OMX_U32 BufferSize;
		OMX_U8 *pBuffer;

		BufferSize = pAmrEncConfig->wbamre_mem_info.mem_info_sub[i].wbamre_size;
		pBuffer = (OMX_U8 *)FSL_MALLOC(BufferSize);
		if (pBuffer == NULL)
		{
			LOG_ERROR("Can't get memory.\n");
			return OMX_ErrorInsufficientResources;
		}
		fsl_osal_memset(pBuffer, 0, BufferSize);
		pAmrEncConfig->wbamre_mem_info.mem_info_sub[i].wbappe_base_ptr = pBuffer;
	}

	return ret;

}
HTEST * create_test(
    OMX_STRING component,
    OMX_STRING in_file,
    OMX_STRING out_file,
    FORMAT fmt)
{
	HTEST *hTest = NULL;

	hTest = (HTEST*)FSL_MALLOC(sizeof(HTEST));
	if(hTest == NULL)
	{
		printf("Failed to allocate memory for test handle.\n");
		return 0;
	}
	fsl_osal_memset(hTest, 0, sizeof(HTEST));

	hTest->name = component;

	hTest->pMsgQ = FSL_NEW(Queue, ());
	if(hTest->pMsgQ == NULL)
	{
		printf("Create message queue failed.\n");
		return 0;
	}
	hTest->pMsgQ->Create(128, sizeof(MSG), E_FSL_OSAL_TRUE);

	hTest->pInFile = fopen(in_file, "rb");
	if(hTest->pInFile == NULL)
	{
		printf("Failed to open file: %s\n", in_file);
		return 0;
	}

	hTest->pOutFile = fopen(out_file, "wb");
	if(hTest->pOutFile == NULL)
	{
		printf("Failed to open file: %s\n", out_file);
		return 0;
	}

	hTest->fmt = fmt;
	if(fmt == MPEG4)
	{
		hTest->role = "video_decoder.mpeg4";
		hTest->get_video_frame_len = get_mpeg4_frame_length;
	}
	if(fmt == H264)
	{
		hTest->role = "video_decoder.avc";
		hTest->get_video_frame_len = get_h264_frame_length;
	}

	return hTest;
}
HTEST * create_test(
        OMX_STRING component,
        OMX_STRING in_file,
		OMX_S32 width,
		OMX_S32 height,
        OMX_STRING out_file,
        FORMAT fmt,
		OMX_S32 bitrate)
{
    HTEST *hTest = NULL;

    hTest = (HTEST*)FSL_MALLOC(sizeof(HTEST));
    if(hTest == NULL) {
        printf("Failed to allocate memory for test handle.\n");
        return 0;
    }
    fsl_osal_memset(hTest, 0, sizeof(HTEST));

    hTest->name = component;

    hTest->pMsgQ = FSL_NEW(Queue, ());
    if(hTest->pMsgQ == NULL) {
        printf("Create message queue failed.\n");
        return 0;
    }
    hTest->pMsgQ->Create(128, sizeof(MSG), E_FSL_OSAL_TRUE);

    hTest->pInFile = fopen(in_file, "rb");
    if(hTest->pInFile == NULL) {
        printf("Failed to open file: %s\n", in_file);
        return 0;
    }

    hTest->pOutFile = fopen(out_file, "wb");
    if(hTest->pOutFile == NULL) {
        printf("Failed to open file: %s\n", out_file);
        return 0;
    }

    hTest->width = width;
    hTest->height = height;
    hTest->bitrate = bitrate;

    hTest->fmt = fmt;
    if(fmt == H263) {
        hTest->role = "video_encoder.h263";
    }
    if(fmt == H264) {
        hTest->role = "video_encoder.avc";
    }

    return hTest;
}
OMX_PTR CreatePMeoryContext()
{
    OMX_PTR Context = NULL;

    Context = (OMX_PTR)FSL_MALLOC(sizeof(PMCONTEXT));
    if(Context == NULL) {
        LOG_ERROR("Failed allocate PMemory context.\n");
        return NULL;
    }
    fsl_osal_memset(Context, 0, sizeof(PMCONTEXT));

    return Context;
}
OMX_ERRORTYPE WmaDec::AudioFilterInstanceInit()
{
    OMX_ERRORTYPE ret = OMX_ErrorNone;
	pWmaDecConfig = (WMADDecoderConfig *)FSL_MALLOC(sizeof(WMADDecoderConfig));
	if (pWmaDecConfig == NULL)
	{
		LOG_ERROR("Can't get memory.\n");
		return OMX_ErrorInsufficientResources;
	}
	fsl_osal_memset(pWmaDecConfig, 0, sizeof(WMADDecoderConfig));

	pWmaDecParams = (WMADDecoderParams *)FSL_MALLOC(sizeof(WMADDecoderParams));
	if (pWmaDecParams == NULL)
	{
		LOG_ERROR("Can't get memory.\n");
		return OMX_ErrorInsufficientResources;
	}
	fsl_osal_memset(pWmaDecParams, 0, sizeof(WMADDecoderParams));

	if (nPushModeInputLen < WmaType.nBlockAlign * 2)
		nPushModeInputLen = WmaType.nBlockAlign * 2;

    return ret;
}
static void* appLocalMalloc (uint32 TotalSize)
{

    void *PtrMalloc = NULL;

    if(0 == TotalSize)
        LOG_WARNING("\nWarning: ZERO size IN LOCAL MALLOC");

    PtrMalloc = FSL_MALLOC(TotalSize);

    if (PtrMalloc == NULL) {

        LOG_ERROR("\nError: MEMORY FAILURE IN LOCAL MALLOC");
    }
    return (PtrMalloc);
}
static void *appLocalCalloc(uint32 TotalNumber, uint32 TotalSize)
{
    void *PtrCalloc = NULL;

    if((0 == TotalSize)||(0==TotalNumber))
        LOG_WARNING("\nWarning: ZERO size IN LOCAL CALLOC");

    PtrCalloc = FSL_MALLOC(TotalNumber*TotalSize);

    if (PtrCalloc == NULL) {

        LOG_ERROR("\nError: MEMORY FAILURE IN LOCAL CALLOC");
                return NULL;
    }
    fsl_osal_memset(PtrCalloc, 0, TotalSize*TotalNumber);
    return (PtrCalloc);
}
OMX_ERRORTYPE AudioSource::DoLoaded2Idle()
{
    OMX_ERRORTYPE ret = OMX_ErrorNone;

    ret = OpenDevice();
    if(ret != OMX_ErrorNone) {
        CloseDevice();
        SendEvent(OMX_EventError, ret, 0, NULL);
        return ret;
	}

	nDeviceReadLen = nPeriodSize * nSampleSize;
	OMX_U32 BufferSize;
	OMX_U8 *pBuffer;

	BufferSize = nDeviceReadLen;
	pBuffer = (OMX_U8 *)FSL_MALLOC(BufferSize);
	if (pBuffer == NULL) {
		LOG_ERROR("Can't get memory.\n");
		return OMX_ErrorInsufficientResources;
	}
	fsl_osal_memset(pBuffer, 0, BufferSize);
	pDeviceReadBuffer = pBuffer;

	OMX_U32 nRingBufferSize = nFadeInFadeOutProcessLen + nDeviceReadLen;
	RINGBUFFER_ERRORTYPE BufferRet = RINGBUFFER_SUCCESS;
	LOG_DEBUG("Audio source nRingBufferSize = %d\n", nRingBufferSize);
	BufferRet = AudioRenderRingBuffer.BufferCreate(nRingBufferSize);
	if (BufferRet != RINGBUFFER_SUCCESS) {
		LOG_ERROR("Create ring buffer fail.\n");
		return OMX_ErrorInsufficientResources;
	} 

	FADEINFADEOUT_ERRORTYPE FadeRet = FADEINFADEOUT_SUCCESS;
	FadeRet = AudioRenderFadeInFadeOut.Create(PcmMode.nChannels, PcmMode.nSamplingRate, \
			PcmMode.nBitPerSample, nFadeInFadeOutProcessLen, 0);
	if (FadeRet != FADEINFADEOUT_SUCCESS) {
		LOG_ERROR("Create fade in fade out process fail.\n");
		return OMX_ErrorInsufficientResources;
	}

    return OMX_ErrorNone;
}
Esempio n. 16
0
OMX_ERRORTYPE PlatformResourceMgr::AddHwBuffer(
        OMX_PTR pPhyiscAddr,
        OMX_PTR pVirtualAddr)
{
    PLATFORM_DATA *pData = NULL;

    pData = (PLATFORM_DATA*)FSL_MALLOC(sizeof(PLATFORM_DATA));
    if(pData == NULL)
        return OMX_ErrorInsufficientResources;

    pData->pVirtualAddr = pVirtualAddr;
    pData->pPhyiscAddr = pPhyiscAddr;

    fsl_osal_mutex_lock(lock);
    if(LIST_SUCCESS != PlatformDataList->Add(pData)) {
        FSL_FREE(pData);
        fsl_osal_mutex_unlock(lock);
        return OMX_ErrorUndefined;
    }
    fsl_osal_mutex_unlock(lock);

    return OMX_ErrorNone;
}
OMX_ERRORTYPE Mp3Parser::SetSource(OMX_PARAM_CONTENTURITYPE *Content, OMX_PARAM_CONTENTPIPETYPE *Pipe)
{
	OMX_ERRORTYPE ret = OMX_ErrorNone;

	hPipe =(CP_PIPETYPE* ) (((OMX_PARAM_CONTENTPIPETYPE *)Pipe)->hPipe);

	OMX_PARAM_CONTENTURITYPE * pContentURI = (OMX_PARAM_CONTENTURITYPE *)Content;
	nMediaNameLen = fsl_osal_strlen((const char *)&(pContentURI->contentURI)) + 1;

	pMediaName = (OMX_S8 *)FSL_MALLOC(nMediaNameLen);
	if (!pMediaName)
	{
		return OMX_ErrorInsufficientResources;
	}
	fsl_osal_strcpy((char *)pMediaName, (const char *)&(pContentURI->contentURI));
	if(fsl_osal_strncmp((fsl_osal_char*)pMediaName, "http://", 7) == 0
	        || fsl_osal_strncmp((fsl_osal_char*)pMediaName, "rtsp://", 7) == 0)
		isStreamingSource = OMX_TRUE;

	bGetMetadata = OMX_TRUE;
	fsl_osal_strcpy((fsl_osal_char*)sCompRole.cRole, role[0]);

	return ret;
}
OMX_ERRORTYPE WmaDec::AudioFilterCodecInit()
{
    OMX_ERRORTYPE ret = OMX_ErrorNone;
	tWMAFileStatus WmaRet;

	pWmaDecConfig->psWMADecodeInfoStructPtr = NULL;
	pWmaDecParams->bDropPacket = 0;
	pWmaDecParams->nDRCSetting = 0;
	pWmaDecParams->nDecoderFlags =0;
	pWmaDecParams->nDstChannelMask = 0;
	pWmaDecParams->nInterpResampRate = 0;
	pWmaDecParams->nMBRTargetStream = 1;
	pWmaDecParams->bIsRawDecoder = WMAD_TRUE;
	pWmaDecParams->us16Version = WmaType.eFormat;
	pWmaDecParams->us16Channels = WmaType.nChannels;
	pWmaDecParams->us32SamplesPerSec = WmaType.nSamplingRate;
	pWmaDecParams->us32AvgBytesPerSec = WmaType.nBitRate >> 3;
	pWmaDecParams->us16EncodeOpt = WmaType.nEncodeOptions;
	if (WmaType.eFormat == OMX_AUDIO_WMAFormat7)
		pWmaDecParams->us16wFormatTag = 0x160;
	else if (WmaType.eFormat == OMX_AUDIO_WMAFormat8)
		pWmaDecParams->us16wFormatTag = 0x161;
	else if (WmaType.eFormat == OMX_AUDIO_WMAFormat9)
		pWmaDecParams->us16wFormatTag = 0x162;

	pWmaDecParams->us32nBlockAlign = WmaType.nBlockAlign;
	pWmaDecParams->us32ChannelMask = dwChannelMask;
	pWmaDecParams->us16AdvancedEncodeOpt = nAdvancedEncodeOpt;
	pWmaDecParams->us32AdvancedEncodeOpt2 = nAdvancedEncodeOpt2;
	pWmaDecParams->us32ValidBitsPerSample = WmaTypeExt.nBitsPerSample;
	if((pWmaDecParams->us32ValidBitsPerSample!=16)&&(pWmaDecParams->us32ValidBitsPerSample!=24))
	{
		pWmaDecParams->us32ValidBitsPerSample = 16;
	}
	if(pWmaDecParams->us16Channels > 2)
	{
		pWmaDecParams->nDecoderFlags |= DECOPT_CHANNEL_DOWNMIXING;
		pWmaDecParams->nDstChannelMask = 0x03;
	}

	pWmaDecConfig->app_swap_buf = (tWMAFileStatus (*)(void*, WMAD_UINT64, WMAD_UINT32*, WMAD_UINT8**, void*, WMAD_UINT32*))WMA10FileCBGetNewPayload;
	pWmaDecConfig->pContext = (OMX_PTR)(this);
	pWmaDecConfig->sDecodeParams = pWmaDecParams;
	fsl_osal_memset(&sWfx,0,sizeof(WAVEFORMATEXTENSIBLE));
    pWmaDecParams->pWfx = &sWfx;

	OMX_S32 MemoryCnt = pWmaDecConfig->sWMADMemInfo.s32NumReqs;
	for (OMX_S32 i = 0; i < MemoryCnt; i ++)
	{
		FSL_FREE(pWmaDecConfig->sWMADMemInfo.sMemInfoSub[i].app_base_ptr);
	}

	LOG_DEBUG("nVersion=%d,wFormatTag=%p,nSamplesPerSec=%d,nAvgBytesPerSec=%d,nBlockAlign=%d,nChannels=%d,nEncodeOpt=%p,wBitsPerSample=%d,dwChannelMask=%p,nAdvancedEncodeOpt=%p,nAdvancedEncodeOpt2=%p\n",pWmaDecConfig->sDecodeParams->us16Version,pWmaDecConfig->sDecodeParams->us16wFormatTag,pWmaDecConfig->sDecodeParams->us32SamplesPerSec,pWmaDecConfig->sDecodeParams->us32AvgBytesPerSec,pWmaDecConfig->sDecodeParams->us32nBlockAlign,pWmaDecConfig->sDecodeParams->us16Channels,pWmaDecConfig->sDecodeParams->us16EncodeOpt,pWmaDecConfig->sDecodeParams->us32ValidBitsPerSample,pWmaDecConfig->sDecodeParams->us32ChannelMask,pWmaDecConfig->sDecodeParams->us16AdvancedEncodeOpt,pWmaDecConfig->sDecodeParams->us32AdvancedEncodeOpt2);

	WmaRet = pWMADQueryMem(pWmaDecConfig);
	if (WmaRet != cWMA_NoErr)
	{
		LOG_ERROR("Wma decoder query memory fail.\n");
		return OMX_ErrorUndefined;
	}

	MemoryCnt = pWmaDecConfig->sWMADMemInfo.s32NumReqs;
	for (OMX_S32 i = 0; i < MemoryCnt; i ++)
	{
		OMX_U32 BufferSize;
		OMX_U8 *pBuffer;

		BufferSize = pWmaDecConfig->sWMADMemInfo.sMemInfoSub[i].s32WMADSize;
		pBuffer = (OMX_U8 *)FSL_MALLOC(BufferSize);
		if (pBuffer == NULL)
		{
			LOG_ERROR("Can't get memory.\n");
			return OMX_ErrorInsufficientResources;
		}
		fsl_osal_memset(pBuffer, 0, BufferSize);
		pWmaDecConfig->sWMADMemInfo.sMemInfoSub[i].app_base_ptr = pBuffer;
	}

	WmaRet = pInitWMADecoder(pWmaDecConfig, pWmaDecParams, NULL, 0);
	if (WmaRet != cWMA_NoErr)
	{
		LOG_ERROR("Wma decoder initialize fail.\n");
		return OMX_ErrorUnsupportedSetting;
	}

	AudioRingBuffer.nPrevOffset = 0;

	return ret;
}
OMX_ERRORTYPE UniaDecoder::CreateDecoderInterface()
{
    OMX_S32 ret = OMX_ErrorNone;

    do{

        tUniACodecQueryInterface  myQueryInterface;

        if(NULL == role || decoderLibName == NULL){
            ret = OMX_ErrorInsufficientResources;
            break;
        }
        if(optionaDecoderlLibName){
            hLib = libMgr->load((fsl_osal_char *)optionaDecoderlLibName);
            LOG_DEBUG("Audio Decoder library name 1: %s\n", optionaDecoderlLibName);
        }

        if(hLib == NULL){
            hLib = libMgr->load((fsl_osal_char *)decoderLibName);
            LOG_DEBUG("Audio Decoder library name 2: %s\n", decoderLibName);
        }

        if(NULL == hLib){
            LOG_ERROR("Fail to open Decoder library for %s\n", role);
            ret = OMX_ErrorComponentNotFound;
            break;
        }

        IDecoder = (UniaDecInterface *)FSL_MALLOC(sizeof(UniaDecInterface));
        if(IDecoder == NULL){
            ret = OMX_ErrorUndefined;
        }
        fsl_osal_memset(IDecoder,0 ,sizeof(UniaDecInterface));

        myQueryInterface = (tUniACodecQueryInterface)libMgr->getSymbol(hLib, (fsl_osal_char *)"UniACodecQueryInterface");
        if(NULL == myQueryInterface)
        {
            LOG_ERROR("Fail to query decoder interface\n");
            ret = OMX_ErrorNotImplemented;
            break;
        }

        ret = myQueryInterface(ACODEC_API_GET_VERSION_INFO, (void **)&IDecoder->GetVersionInfo);

        ret |= myQueryInterface(ACODEC_API_CREATE_CODEC, (void **)&IDecoder->CreateDecoder);
        ret |= myQueryInterface(ACODEC_API_DELETE_CODEC, (void **)&IDecoder->DeleteDecoder);
        ret |= myQueryInterface(ACODEC_API_RESET_CODEC, (void **)&IDecoder->ResetDecoder);
        ret |= myQueryInterface(ACODEC_API_SET_PARAMETER, (void **)&IDecoder->SetParameter);
        ret |= myQueryInterface(ACODEC_API_GET_PARAMETER, (void **)&IDecoder->GetParameter);
        ret |= myQueryInterface(ACODEC_API_DEC_FRAME, (void **)&IDecoder->DecodeFrame);
        ret |= myQueryInterface(ACODEC_API_GET_LAST_ERROR, (void **)&IDecoder->GetLastError);

        if(ret != OMX_ErrorNone){
            LOG_ERROR("Fail to query decoder API\n");
            ret = OMX_ErrorNotImplemented;
            break;
        }

    }while(0);

    if(ret != OMX_ErrorNone){
        LOG_ERROR("UniaDecoder::CreateDecoderInterface ret=%d",ret);
        if (hLib)
            libMgr->unload(hLib);
        hLib = NULL;
        FSL_FREE(IDecoder);
        FSL_DELETE(libMgr);
    }

    return (OMX_ERRORTYPE)ret;
}
OMX_PTR VideoFilter::AllocateOutputBuffer(OMX_U32 nSize)
{
    return FSL_MALLOC(nSize);
}
OMX_ERRORTYPE VideoFilter::ProcessInBufferFlags()
{
    if(pInBufferHdr->nFlags & OMX_BUFFERFLAG_STARTTIME)
        bGetNewSegment = OMX_TRUE;

    if(bGetNewSegment == OMX_TRUE && (!(pInBufferHdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG)))
    {
        LOG_DEBUG("Get New sement buffer, ts %lld\n", pInBufferHdr->nTimeStamp);
        bGetNewSegment = OMX_FALSE;
        bNewSegment = OMX_TRUE;
        bLastInput = OMX_FALSE;
        bLastOutput = OMX_FALSE;
        if(pInBufferHdr->nFlags & OMX_BUFFERFLAG_STARTTRICK)
        {
            LOG_DEBUG("Set ts manager to FIFO mode.\n");
            tsmFlush(hTsHandle, pInBufferHdr->nTimeStamp, MODE_FIFO);
        }
        else
        {
            LOG_DEBUG("Set ts manager to AI mode.\n");
            tsmFlush(hTsHandle, pInBufferHdr->nTimeStamp, MODE_AI);
        }
    }

    if(bLastInput != OMX_FALSE)
    {
        LOG_DEBUG("Filter drop input buffers in EOS state.\n");
        ReturnInputBuffer();
        return OMX_ErrorNoMore;
    }

    if(pInBufferHdr->nFlags & OMX_BUFFERFLAG_EOS)
    {
        bLastInput = OMX_TRUE;
        bNeedInputBuffer = OMX_FALSE;
        pInBufferHdr->nTimeStamp = -1;
        pInBufferHdr->nFilledLen = 0;
        return OMX_ErrorNone;
    }

    if(!(pInBufferHdr->nFlags & OMX_BUFFERFLAG_ENDOFFRAME) && bFilterSupportPartilInput != OMX_TRUE)
    {
        ProcessPartialInput();
        return OMX_ErrorNotReady;
    }

    if(PartialInputHdr.pBuffer != NULL)
    {
        ProcessPartialInput();
        pInBufferHdr = &PartialInputHdr;
    }

    if(pInBufferHdr->nFlags & OMX_BUFFERFLAG_DECODEONLY)
        nDecodeOnly ++;

    if(pInBufferHdr->nFlags & OMX_BUFFERFLAG_CODECCONFIG && pInBufferHdr->nFilledLen > 0)
    {
        if(pCodecData == NULL)
        {
            pCodecData = FSL_MALLOC(pInBufferHdr->nFilledLen);
            if(pCodecData == NULL)
            {
                SendEvent(OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
                return OMX_ErrorInsufficientResources;
            }
        }
        else
        {
            pCodecData = FSL_REALLOC(pCodecData, nCodecDataLen + pInBufferHdr->nFilledLen);
            if(pCodecData == NULL)
            {
                SendEvent(OMX_EventError, OMX_ErrorInsufficientResources, 0, NULL);
                return OMX_ErrorInsufficientResources;
            }
        }
        fsl_osal_memcpy((char *)pCodecData + nCodecDataLen, pInBufferHdr->pBuffer, pInBufferHdr->nFilledLen);
        nCodecDataLen += pInBufferHdr->nFilledLen;
        LOG_INFO("Get Codec configure data, len: %d\n", nCodecDataLen);
        ReturnInputBuffer();
        return OMX_ErrorNotReady;
    }

    return OMX_ErrorNone;
}
Esempio n. 22
0
QUEUE_ERRORTYPE Queue::Create(
        fsl_osal_u32 maxQSize,
        fsl_osal_u32 msgSize,
        efsl_osal_bool block)
{
    QUEUE_ERRORTYPE ret = QUEUE_SUCCESS;
    fsl_osal_u32 i, aligned_msg_size;
    fsl_osal_ptr ptr = NULL;
    QNODE *pQNode = NULL;
    fsl_osal_u8 *pMsg = NULL;

    pQNodeMem = pQMsgMem = NULL;
    pFreeNodes = pHead = pTail = NULL;
    nQSize = 0;
    lock = usedNodesSem = freeNodesSem = NULL;

    nMaxQSize = maxQSize;
    nMsgSize = msgSize;
    bBlocking = block;

    /* allocate for queue nodes */
    ptr = FSL_MALLOC(sizeof(QNODE) * nMaxQSize);
    if(ptr == NULL) {
        LOG_ERROR("Failed to allocate memory for queue node.\n");
        ret = QUEUE_INSUFFICIENT_RESOURCES;
        goto err;
    }
    pQNodeMem = ptr;
    pQNode = (QNODE*)ptr;

    /* alloate for node messages */
    aligned_msg_size = (nMsgSize + 3)/4*4;
    ptr = FSL_MALLOC(nMaxQSize * aligned_msg_size);
    if(ptr == NULL) {
        LOG_ERROR("Failed to allocate memory for queue node message.\n");
        ret = QUEUE_INSUFFICIENT_RESOURCES;
        goto err;
    }
    pQMsgMem = ptr;
    pMsg = (fsl_osal_u8*)ptr;

    for(i=0; i<nMaxQSize-1; i++) {
        pQNode[i].NextNode = &(pQNode[i+1]);
        pQNode[i].pMsg = pMsg;
        pMsg += aligned_msg_size;
    }
    pQNode[nMaxQSize-1].NextNode = NULL;
    pQNode[nMaxQSize-1].pMsg = pMsg;
    pFreeNodes = pQNode;

    if(fsl_osal_mutex_init(&lock, fsl_osal_mutex_normal) != E_FSL_OSAL_SUCCESS) {
        LOG_ERROR("Failed to create mutex for queue.\n");
        ret = QUEUE_INSUFFICIENT_RESOURCES;
        goto err;
    }

    if(fsl_osal_sem_init(&usedNodesSem, 0, 0) != E_FSL_OSAL_SUCCESS) {
        LOG_ERROR("Failed to create mutex for used nodes.\n");
        ret = QUEUE_INSUFFICIENT_RESOURCES;
        goto err;
    }

    if(fsl_osal_sem_init(&freeNodesSem, 0, nMaxQSize) != E_FSL_OSAL_SUCCESS) {
        LOG_ERROR("Failed to create mutex for free nodes.\n");
        ret = QUEUE_INSUFFICIENT_RESOURCES;
        goto err;
    }

    return ret;

err:
    Free();
    return ret;
}
OMX_ERRORTYPE SRTParser::BuildSeekTable()
{
    TextSource::TEXT_LINE sLine;
    OMX_BOOL bEOS = OMX_FALSE;

    while(1) {
        OMX_S64 nPos = 0;
        mSource->GetCurPosition(nPos);
        mSource->GetNextLine(sLine, bEOS);
        if(bEOS != OMX_FALSE) {
            LOG_DEBUG("%s, EOS.\n", __FUNCTION__);
            break;
        }
        if(sLine.pData == NULL)
            continue;

        int hour1, hour2, min1, min2, sec1, sec2, msec1, msec2;
        if(sscanf((OMX_STRING)sLine.pData, "%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d",
                    &hour1, &min1, &sec1, &msec1, &hour2, &min2, &sec2, &msec2) != 8) {
            continue;
        }

        TIME_NODE *node = mTimeTable + mTimeTableEntrySize;
        node->nTime = TIME2US(hour1, min1, sec1, msec1);
        node->nOffset = nPos;
        mTimeTableEntrySize++;
        if(mTimeTableEntrySize >= mTimeTableSize) {
            OMX_PTR temp = FSL_MALLOC(sizeof(TIME_NODE)*(mTimeTableSize + SRT_TIME_TABLE_SIZE));
            if(!temp) {
                LOG_ERROR("failed to allocate time table size to %d\n", mTimeTableSize + SRT_TIME_TABLE_SIZE);
                break;
            }
            fsl_osal_memcpy(temp, mTimeTable, mTimeTableEntrySize*sizeof(TIME_NODE));
            FSL_FREE(mTimeTable);
            mTimeTable = (TIME_NODE*)temp;
            mTimeTableSize += SRT_TIME_TABLE_SIZE;
        }
        LOG_DEBUG("[%d], time: %lld, offset: %lld\n", mTimeTableEntrySize, node->nTime, node->nOffset);
    }

    LOG_DEBUG("mTimeTableEntrySize: %d\n", mTimeTableEntrySize);

    OMX_BOOL needSort = OMX_FALSE;

    if(mTimeTableEntrySize > 1){
        for(OMX_U32 i = 0; i < mTimeTableEntrySize -2; i++){
            if(mTimeTable[i].nTime > mTimeTable[i+1].nTime){
                needSort = OMX_TRUE;
                break;
            }
        }
    }

    if(needSort == OMX_TRUE){
        for(OMX_U32 roundEnd = mTimeTableEntrySize - 1; roundEnd >0; roundEnd--){
            // search for biggest one from 0 to roundEnd
            OMX_U32 biggest = 0;
            for(OMX_U32 i = 1; i <= roundEnd; i++){
                if(mTimeTable[i].nTime > mTimeTable[biggest].nTime)
                    biggest = i;
            }
            if(biggest != roundEnd){
                // exchange biggest with roundEnd
                TIME_NODE node;
                fsl_osal_memcpy(&node, mTimeTable + biggest, sizeof(TIME_NODE));
                fsl_osal_memcpy(mTimeTable + biggest, mTimeTable + roundEnd, sizeof(TIME_NODE));
                fsl_osal_memcpy(mTimeTable + roundEnd, &node,  sizeof(TIME_NODE));
            }
        }
    }

    mSource->SeekTo(0);

    return OMX_ErrorNone;
}