解码/显示概述:从共享文件夹获取H264流,对264流进行解析,生成hdr文件,hdr文件中包含每一帧的信息,将视频帧信息存放在A8核分配的共享内存空间,供其他核或其他的link调用,M3 Video核调用Display函数通过HDMI输出显示。
/**
解码显示函数流程图
*/
Demo_run()
{
Demo_startStop(demoId, TRUE)
{
VcapVdis_start()
{
VdecVdis_bitsRdInit()
{
/*重置文件处理句柄*/
VdecVdis_bitsRdResetFileHandles();
/*从.ini文件中获取源H264流,并调用iniparser()解析得到hdr文件,hdr文件中有每一帧的数据信息。
如果已经解析过在运行程序时可以选择否。
gVdecVdis_config中保存.ini文件的属性
gVdecVdis_obj.fdRdData 保存H264流
gVdecVdis_obj.fpRdHdr 保存hdr解析流
*/
VdecVdis_bitsRdGetFileInfoFromIniFile();
/*创建发送和接收数据流的线程*/
VdecVdis_bitsRdInitThrObj()
{
OSA_semCreate(&gVdecVdis_obj.thrStartSem,1,0);//创建信号量
status = OSA_thrCreate(&gVdecVdis_obj.thrHandle, //线程句柄,用于指向各种系统资源,比如信号量,线程,和文件等
VdecVdis_bitsRdSendFxn, //线程函数
MCFW_IPCBITS_SENDFXN_TSK_PRI,
MCFW_IPCBITS_SENDFXN_TSK_STACK_SIZE, //线程其实地址
&gVdecVdis_obj); //线程运行的参数
VdecVdis_bitsRdSendFxn(Void * prm)
{
OSA_semWait(&gVdecVdis_obj.thrStartSem,OSA_TIMEOUT_FOREVER);//等待系统消息
while (FALSE == gVdecVdis_obj.thrExit)
{
OSA_waitMsecs(MCFW_IPCBITS_SENDFXN_PERIOD_MS);//每8秒是一个时钟周期
/**/
VdecVdis_bitsRdGetEmptyBitBufs(&emptyBufList, i)
{
VDEC_BUF_REQUEST_S reqInfo.bufSize = gVdecVdis_config.chBufSize[chId];//得到每一个channel的buf
Vdec_requestBitstreamBuffer(&reqInfo, emptyBufList, 0)//reqInfo指示通道i和bufSize大小
{
IpcBitsOutLinkHLOS_BitstreamBufReqInfo ipcReqInfo=reqInfo;
IpcBitsOutLink_getEmptyVideoBitStreamBufs(gVdecModuleContext.ipcBitsOutHLOSId, &ipcBufList,&ipcReqInfo);
{
linkId=gVdecModuleContext.ipcBitsOutHLOSId;
OSA_TskHndl * pTsk=System_getLinkTskHndl(linkId);//得到OutLink的线程Id
IpcBitsOutLink_Obj * pObj= pTsk->appData;;//pObj包含OutLink的基本信息
if (pObj->startProcessing)
{
IpcBitsOutLink_releaseBitBufs(pObj);//清空pObj->listElemQue
reqInfo=ipcReqInfo;bufList=ipcBufList;//参数变化
IpcBitsOutLink_getEmptyBufs(pObj,bufList,