1 解码头获得MP3文件的版本信息,例如PV公司的MP3解码库中有以下定义:
#define MPEG_1 0
#define MPEG_2 1
#define MPEG_2_5 2
#define INVALID_VERSION -1
如果版本信息为MPEG_1 则outputFrameSize也就是函数ProcessData()中的OutputLength为1152,否则为576,
还有就是声道数如果为2,则OutputLength为outputFrameSize*2,单声道为outputFrameSize
2 解码头获取文件的比特率、采样率声道等信息,再反过来去配置OMX中的相关配置
3 而且要保证输出buffer的空间不小于outputFrameSize
4 PV的MP3解码函数
Mp3Decoder::Mp3DecodeAudio(OMX_S16* aOutBuff,
OMX_U32* aOutputLength, OMX_U8** aInputBuf,
OMX_U32* aInBufSize, OMX_S32* aFrameCount,
OMX_AUDIO_PARAM_PCMMODETYPE* aAudioPcmParam,
OMX_AUDIO_PARAM_MP3TYPE* aAudioMp3Param,
OMX_BOOL aMarkerFlag,
OMX_BOOL* aResizeFlag)
ipMp3Dec->Mp3DecodeAudio((OMX_S16*) pOutBuffer,
(OMX_U32*) & OutputLength,
&(ipFrameDecodeBuffer),
&iInputCurrLength,
&iFrameCount,
&(ipPorts[OMX_PORT_OUTPUTPORT_INDEX]->AudioPcmMode),
&(ipPorts[OMX_PORT_INPUTPORT_INDEX]->AudioMp3Param),
iEndOfFrameFlag,
&ResizeNeeded);
参数解析:
pOutBuffer:输出buffer数据的指针,保存解码后的PCM数据;
OutputLength:输入时其内容是输出buffer中空间的大小,解码函数后是outputFrameSize,也就是解码获得PCM数据大小;
ipFrameDecodeBuffer:保存未解码的数据,是PV OMX组件对象的成员量,在解码函数前后值不变,也就是仅是将数据传递给解码函数;
iInputCurrLength:其内容是当前输出buffer数据的大小,也是OMX对象的成员量,在解码函数中会实时更新,并且在函数返回后要通过这个值来更新输入buffer的nFilledlen值;
iFrameCount:指示已解码帧的数目;
iEndOfFrameFlag:标志传过来的一帧是否是完整帧,(是否有结尾部分)在此是定值1,因为在上层对部分帧整合过了;
PV中通过iInputCurrLength更新输入buffer的nFilledlen,如果为零,则将输入buffer返回,更新输入buffer
5 bellagio中一个buffer的大小是4096
6 bellagio是过来一个输入buffer,先传递给临时buffer,同时更新nFilledlen,再将临时buffer传递给stream,如果stream的数据不够了,通过设置参数need_mad_stream=1返回,再从输入buffer中提取,如果输入buffer空了,设置参数isNewBuffer为1,返回通知上层输入新的buffer,
那相对来说,PV中是如何的呢???