Exemplo n.º 1
0
MHdl *MH_Component_List_Open(
   void(*handler)( MHdl *handle, Media_Event event ),
   STFSAL *pstFSAL,
   MHPB_CompList const *pFunc[])
{
   MHdl *hdl;
   MHPB_Internal *ihdl;

   hdl = MH_Component_Construct(pFunc);
   ihdl = (MHPB_Internal *)hdl;
   
   hdl->handler = handler;
   // File handle
   ihdl->pstFSAL = pstFSAL;
   FSAL_GetFileSize(pstFSAL, &ihdl->uFileSize);
   
   // KH 20100818 need revise
   hdl->Play    = GenCompPlay;
   hdl->Pause   = GenCompPause;
   hdl->Resume  = GenCompResume;
   hdl->Stop    = GenCompStop;
   hdl->Close   = GenCompClose;
   hdl->Process = GenCompProcess;
   
   if (ihdl->numComp) {
      AcuFileParam parseInfo;
      
      parseInfo.pstFSAL = pstFSAL;
      parseInfo.pFileInfo = hdl->pFileInfo;
      ihdl->NodeArray[0].curHdl->SetParameter(ihdl->NodeArray[0].curHdl, OMX_IndexParamMedFileHandle, &parseInfo);
   }
   
   hdl->state = COMPONENT_STATE_IDLE;
   
   return hdl;
}
Exemplo n.º 2
0
/*****************************************************************************
 * FUNCTION
 *  aud_media_get_audio_format_in_video
 * DESCRIPTION
 *  This function is to get the audio format in video
 * PARAMETERS
 *
 * RETURNS
 * kal_uint8   result
 *****************************************************************************/
kal_uint8 aud_stretch_is_aduio_in_video_PP_support(kal_wchar *file_name, kal_uint8 *data, kal_uint32 data_len, kal_int16 data_format)
{
#if defined(MED_PURE_AUDIO)
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    MP4_Parser_Status eMp4ParserRet;
    FSAL_Status eFSALRet;
    kal_uint8 result;
    kal_bool is_file_opened = KAL_FALSE;
    kal_bool has_aud_track;
    kal_bool is_PP_support = KAL_FALSE;
    Media_Format audio_format;
    kal_uint32 filesize;
    kal_uint32 index;
    kal_uint64 temp;
    STFSAL stFSAL_ROM;
    kal_uint8 *fsal_rom_buf;

    STMp4Parser *stMp4Parser_aud;
    STFSAL *stFSAL_aud;
    STFSAL *stFSAL_aud_stsz;
    STFSAL *stFSAL_aud_stco;
    STFSAL *stFSAL_aud_aud_data;
    kal_uint32 *mp4_aud_buf;
    kal_uint32 *mp4_aud_data_buf;
    kal_uint32 *mp4_aud_stco_buf;
    kal_uint32 *mp4_aud_stsz_buf;
    kal_uint32 *mp4_aud_stbl_buf;
    FS_FileLocationHint *aud_seek_hint;
  
    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/

    /* Open file for playing */
    stFSAL_aud = (STFSAL*)get_ctrl_buffer(sizeof(STFSAL));    
    eFSALRet = FSAL_Open(stFSAL_aud, (void*)file_name, FSAL_READ); 

    if (eFSALRet != FSAL_OK)
    {
        result = MED_RES_OPEN_FILE_FAIL;
        goto pure_audio_error_out;
    }
    is_file_opened = KAL_TRUE;

    /* Allocate working buffer for operation */    
    stMp4Parser_aud = (STMp4Parser*)get_ctrl_buffer(sizeof(STMp4Parser));
    stFSAL_aud_stsz = (STFSAL*)get_ctrl_buffer(sizeof(STFSAL));
    stFSAL_aud_stco = (STFSAL*)get_ctrl_buffer(sizeof(STFSAL));
    stFSAL_aud_aud_data = (STFSAL*)get_ctrl_buffer(sizeof(STFSAL));
    mp4_aud_buf = (kal_uint32*)med_alloc_ext_mem( AUD_MP4_FSAL_BUF_SIZE*sizeof(kal_uint32) );
    mp4_aud_data_buf = (kal_uint32*)med_alloc_ext_mem( AUD_MP4_FSAL_BUF_SIZE*sizeof(kal_uint32) );
    mp4_aud_stco_buf = (kal_uint32*)med_alloc_ext_mem( AUD_MP4_STCO_BUF_SIZE*sizeof(kal_uint32) );
    mp4_aud_stsz_buf = (kal_uint32*)med_alloc_ext_mem( AUD_MP4_STSZ_BUF_SIZE*sizeof(kal_uint32) );
    mp4_aud_stbl_buf = (kal_uint32*)med_alloc_ext_mem( AUD_MP4_STBL_BUF_SIZE*sizeof(kal_uint32) );
    aud_seek_hint = (FS_FileLocationHint*)med_alloc_ext_mem( AUD_DEC_SEEK_HINT_SIZE*sizeof(FS_FileLocationHint) );

    /* Set buffer for FSAL */
    FSAL_SetBuffer(stFSAL_aud, AUD_MP4_FSAL_BUF_SIZE, (kal_uint8*)mp4_aud_buf);

    /* Set seek hint */
    eFSALRet = FSAL_GetFileSize(stFSAL_aud, &filesize);
    if (eFSALRet != FSAL_OK)
    {
        result = MED_RES_OPEN_FILE_FAIL;
        goto pure_audio_error_out;
    }

    for (index = 0; index < AUD_DEC_SEEK_HINT_SIZE; index++)
    {
        temp = ((kal_uint64) filesize * (kal_uint64) (index + 1)) / (kal_uint64) (AUD_DEC_SEEK_HINT_SIZE + 1);
        aud_seek_hint[index].Index = (kal_uint32) temp;
    }
    DRM_set_seek_hint(stFSAL_aud->hFile, AUD_DEC_SEEK_HINT_SIZE, aud_seek_hint);

    /* Creat MP4 parser */
    eMp4ParserRet = MP4_Parse(stMp4Parser_aud, stFSAL_aud);

    if (eMp4ParserRet != MP4_PARSER_OK && eMp4ParserRet != MP4_PARSER_WARNING_TRAILING_GARBAGE)
    {
        result = MED_RES_BAD_FORMAT;
        goto pure_audio_error_out;
    }

    /* Check if there's audio track */
    MP4_MetaHasAudioTrack(stMp4Parser_aud, &has_aud_track);
    if (!has_aud_track)
    {
        result = MED_RES_MP4_NO_AUDIO_TRACK;
        goto pure_audio_error_out;
    }

    /* Prepare cache table */
    eMp4ParserRet = MP4_STBL_CacheTablePreprocess(
                        stMp4Parser_aud, 
                        mp4_aud_stbl_buf, 
                        AUD_MP4_STBL_BUF_SIZE);
                        
    if (eMp4ParserRet != MP4_PARSER_OK)
    {
        result = MED_RES_BAD_FORMAT;
        goto pure_audio_error_out;
    }    

    /* FSAL aud data */
    eFSALRet = FSAL_Open_Attach(stFSAL_aud_aud_data, stFSAL_aud);
    
    if (eFSALRet != FSAL_OK)
    {
        result = MED_RES_OPEN_FILE_FAIL;
        goto pure_audio_error_out;
    }
    FSAL_SetBuffer(stFSAL_aud_aud_data, AUD_MP4_FSAL_BUF_SIZE, (kal_uint8*)mp4_aud_data_buf);

    /* FASL stco */
    eFSALRet = FSAL_Open_Attach(stFSAL_aud_stco, stFSAL_aud);
    if (eFSALRet != FSAL_OK)
    {
        result = MED_RES_OPEN_FILE_FAIL;
        goto pure_audio_error_out;
    }
    FSAL_SetBuffer(stFSAL_aud_stco, AUD_MP4_STCO_BUF_SIZE, (kal_uint8*)mp4_aud_stco_buf);

    /* FSAL stsz */
    eFSALRet = FSAL_Open_Attach(stFSAL_aud_stsz, stFSAL_aud);
    if (eFSALRet != FSAL_OK)
    {
        result = MED_RES_OPEN_FILE_FAIL;
        goto pure_audio_error_out;
    }
    FSAL_SetBuffer(stFSAL_aud_stsz, AUD_MP4_STSZ_BUF_SIZE, (kal_uint8*)mp4_aud_stsz_buf);

    /* Set FSAL to MP4 Parser */
    MP4_Audio_SetFSAL(stMp4Parser_aud, stFSAL_aud_aud_data);    
    MP4_SetFSAL_STCO(stMp4Parser_aud, MP4_TRACK_AUDIO, stFSAL_aud_stco);
    MP4_SetFSAL_STSZ(stMp4Parser_aud, MP4_TRACK_AUDIO, stFSAL_aud_stsz);
    MP4_UpdateSampleCount(stMp4Parser_aud, MP4_TRACK_AUDIO);

    /* Get Audio Type */
    audio_format = MP4_Audio_Type_To_Media_Format(MP4_GetAudioType(stMp4Parser_aud));
    AUD_VALUE_TRACE(audio_format, -1, __LINE__);

    /* The audio format in 3GP/MP4 file */
    switch (audio_format)
    {
        /* Check AMR / AMR-WB by format enum directly */
    #ifdef AMR_DECODE    
        case MEDIA_FORMAT_AMR:
    #ifdef AMRWB_DECODE        
        case MEDIA_FORMAT_AMR_WB:
    #endif         
            is_PP_support = AudioPP_TS_IsSupport((Media_Format) audio_format, NULL);
            break;
    #endif /*AMR_DECODE*/

        /* Need to wrap audio data in FSAL ROM file for check function */
    #if defined(AAC_DECODE)            
        case MEDIA_FORMAT_AAC:
        {
            kal_uint32 uSampleNo;
            kal_uint32 num_bytes;

            /* Seek to front and read a small range of data */
            eMp4ParserRet =  MP4_Audio_TimeToSampleNo(stMp4Parser_aud, 0, &uSampleNo );
            if(eMp4ParserRet != MP4_PARSER_OK)
            {
                result = MED_RES_FAIL;
                goto pure_audio_error_out; 
            }
            eMp4ParserRet =  MP4_Audio_Seek(stMp4Parser_aud, uSampleNo);
            if(eMp4ParserRet != MP4_PARSER_OK)
            {
                result = MED_RES_FAIL;
                goto pure_audio_error_out; 
            }

            /* Read audio data into buffer and set it to FSAL ROM file */
            fsal_rom_buf = (kal_uint8*)med_alloc_ext_mem( AUD_STRETCH_FSAL_ROM_SIZE*sizeof(kal_uint8) );
            eMp4ParserRet = MP4_Audio_Read(stMp4Parser_aud, fsal_rom_buf, AUD_STRETCH_FSAL_ROM_SIZE, &num_bytes);

            if((eMp4ParserRet != MP4_PARSER_OK) && (eMp4ParserRet != MP4_PARSER_READ_EOF))
            {
                med_free_ext_mem((void**)&fsal_rom_buf);
                result = MED_RES_FAIL;
                goto pure_audio_error_out;             
            }

            FSAL_Direct_SetRamFileSize(&stFSAL_ROM, num_bytes);
            eFSALRet = FSAL_Open(&stFSAL_ROM, (void*)fsal_rom_buf, FSAL_ROMFILE);

            if (eFSALRet != FSAL_OK)
            {
                med_free_ext_mem((void**)&fsal_rom_buf);            
                result = MED_RES_OPEN_FILE_FAIL;
                goto pure_audio_error_out;
            }

            /* check time stretch support by using extract audio data in FSAL ROM file */
            is_PP_support = AudioPP_TS_IsSupport((Media_Format) audio_format, &stFSAL_ROM);

            med_free_ext_mem((void**)&fsal_rom_buf);
            break;
        }            
    #endif /*AAC_DECODE*/            

        default:
            result = MED_RES_INVALID_FORMAT;
            goto pure_audio_error_out;
            break;
    }

    if (is_PP_support)
    {
        result = MED_RES_OK;
    }
    else
    {
        result = MED_RES_UNSUPPORTED_SPEED;
    }
     
pure_audio_error_out:
    if (is_file_opened)
    {
        FSAL_Close(stFSAL_aud);

        free_ctrl_buffer(stMp4Parser_aud);        
        free_ctrl_buffer(stFSAL_aud_stsz);
        free_ctrl_buffer(stFSAL_aud_stco);
        free_ctrl_buffer(stFSAL_aud_aud_data);
        med_free_ext_mem((void**)&mp4_aud_buf);
        med_free_ext_mem((void**)&mp4_aud_data_buf);
        med_free_ext_mem((void**)&mp4_aud_stco_buf);
        med_free_ext_mem((void**)&mp4_aud_stsz_buf);
        med_free_ext_mem((void**)&mp4_aud_stbl_buf);     
        med_free_ext_mem((void**)&aud_seek_hint);
    }

    free_ctrl_buffer(stFSAL_aud);

    return result;

#else
    return MED_RES_INVALID_FORMAT;
#endif /* #if defined(MED_PURE_AUDIO) */

}