解码/显示概述:从共享文件夹获取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,reqInfo);//
{
//&pListElem=&pObj->listElemQue[chNum]
OSA_queGet(&pObj->listElemQue[chNum],(Int32 *) (&pListElem), OSA_TIMEOUT_NONE);
bufList=&pListElem;//最后共享空间的数据放在bufList中
}
} }//以上函数功能:将共享区域的数据流放在临时空间&ipcBufList
/*最后将从共享空间获取的数据流放入空队列emptyBufList中*/
Vdec_copyBitBufInfoLink2McFw(emptyBufList,&ipcBufList);
} }//VdecVdis_bitsRdGetEmptyBitBufs(&emptyBufList, i) if (emptyBufList.numBufs)
{
VdecVdis_bitsRdReadData(&emptyBufList);//读取gVdecVdis_obj.fdRdData的帧数据,并填充emptyBufList
VdecVdis_bitsRdSendFullBitBufs(&emptyBufList)
{
Vdec_putBitstreamBuffer(fullBufList)
{
Vdec_copyBitBufInfoMcFw2Link(ipcBufList,fullBufList);
IpcBitsOutLink_putFullVideoBitStreamBufs(gVdecModuleContext.ipcBitsOutHLOSId,&ipcBufList)
{
linkId=gVdecModuleContext.ipcBitsOutHLOSId;
OSA_TskHndl * pTsk=System_getLinkTskHndl(linkId);
IpcBitsOutLink_Obj * pObj=pTsk->appData;
bufList=ipcBufList;
IpcBitsOutLink_putFullBufs(pObj,bufList)//将读取的数据帧放入pObj即共享空间
{
Bitstream_Buf *pBitBuf=pBufList->bufs[bufId];
SharedRegion_getPtr(pListElem->srBufPtr)=pBitBuf->addr);//得到共享空间地址
freeBitBufList.bufs[freeBitBufList.numBufs] = pBitBuf;
IpcBitsOutLink_listMPPut(pObj, pListElem);//???
IpcBitsOutLink_putEmptyBufs(pObj, &freeBitBufList)
{
pBufList=freeBitBufList;
pListElem = (SystemIpcBits_ListElem *) pBufList->bufs[bufId];
SharedRegion_getPtr(pListElem->srBufPtr) =pBufList->bufs[bufId]->addr;
OSA_quePut(&(pObj->listElemQue),pListElem, OSA_TIMEOUT_NONE);//pObj得到freeBitBufList的数据流
} }
}
}
} //VdecVdis_bitsRdSendFullBitBufs(&emptyBufList)将新的数据帧放入共享空间 }if (emptyBufList.numBufs) }//while() }
}//创建发送和接收数据流的线程 }//VdecVdis_bitsRdInit() /*初始化系统变量vsysParams*/
Vsys_params_init(&vsysParams);
/*系统初始化*/
Vsys_init(&vsysParams)
{
Vcap_init(NULL);//init gVcapModuleContext
Vdis_init(NULL);//init gVdisModuleContext Vdis_hdmiCtrl_init();
Vdec_init(NULL);//init gVdecModuleContext
Venc_init(NULL);//init gVencModuleContext System_init();//mcfw/src_linux/links/system/system_common.c
{
//创建信号量,用于控制线程
OSA_mutexCreate(&gSystem_objCommon.linkControlMutex);
System_ipcInit();
{
SysLink_setup ();
system_ipc_reset_srheaps();//gSystem_ipcObj.srHeaps=0
System_ipcMsgQInit();
{
System_ipcMsgQHeapCreate();//创建共享堆区gSystem_ipcObj
System_ipcMsgQCreate(); //创建消息队列并初始化msgQParams
System_ipcMsgQTskCreate(); //创建线程
{
OSA_thrCreate( &gSystem_ipcObj.msgQTask,
System_ipcMsgQTaskMain,
SYSTEM_MSGQ_TSK_PRI,
SYSTEM_MSGQ_TSK_STACK_SIZE,
NULL
);
System_ipcMsgQTaskMain()//管理消息队列的线程,线程调度
}
}
System_ipcNotifyInit(); } IpcBitsInLink_init();
{
status = OSA_tskCreate(&pObj->tsk, //线程句柄
IpcBitsInLink_tskMain, //线程主函数
IPC_LINK_TSK_PRI,
IPC_LINK_TSK_STACK_SIZE, 0, pObj); IpcBitsInLink_tskMain()
{
while (!done)
{
cmd = OSA_msgGetCmd(pMsg);//get系统消息
switch (cmd)
{
case SYSTEM_CMD_NEW_DATA:
OSA_tskAckOrFreeMsg(pMsg, status);//释放消息
IpcBitsInLink_processBitBufs(pObj);//缓冲流处理
{
while (1)
{
pListElem = ListMP_getHead(pObj->listMPOutHndl); //得到共享区头部
IpcBitsInLink_getBitBuf(pObj, pListElem, &pBitBuf);//pBitBuf指向共享内存区
//outBitBufQue得到共享内存区数据用于其他link调用
OSA_quePut(&pObj->outBitBufQue, (Int32) pBitBuf, OSA_TIMEOUT_NONE); }
}
break;
}
} }
}
IpcBitsOutLink_init();
{
System_registerLink(pObj->tskId, &linkObj);//注册link
IpcBitsOutLink_initListMP(pObj); //创建多通道句柄 &pObj->listMPOutHndl, &pObj->listMPInHndl
status = OSA_tskCreate(&pObj->tsk, //创建线程
IpcBitsOutLink_tskMain, //线程
IPC_LINK_TSK_PRI,
IPC_LINK_TSK_STACK_SIZE, 0, pObj); IpcBitsOutLink_tskMain()//线程主函数
{
IpcBitsOutLink_create(pObj, OSA_msgGetPrm(pMsg));//创建link
{
IpcBitsOutLink_createOutObj(pObj);
{
IpcBitsOutLink_createFreeListElemQue(pObj);//
{
//&pObj->listElemFreeQue= (Int32)pObj->listElem[i]
IpcBitsOutLink_createFreeListElemQue(pObj);
}
//创建队列
OSA_queCreate(&pObj->listElemQue[chId],SYSTEM_IPC_BITS_MAX_LIST_ELEM);
//&listElem->&pObj->listElemFreeQue
status = OSA_queGet(&pObj->listElemFreeQue,(Int32 *)&listElem,OSA_TIMEOUT_NONE);
//set listElem
//&pObj->listElemQue[chId]=listElem
status =OSA_quePut(&pObj->listElemQue[chId], (Int32) listElem,OSA_TIMEOUT_NONE); }
IpcBitsOutLink_createPrdObj(pObj);
{
OSA_thrCreate(&pObj->prd.thrHandle,
IpcBitsOutLink_periodicTaskFxn,
IPC_LINK_TSK_PRI, IPC_LINK_TSK_STACK_SIZE, pObj);
//线程管理,用于向arm发送任务消息
IpcBitsOutLink_periodicTaskFxn() }
}//create done while (!done)
{
cmd = OSA_msgGetCmd(pMsg);
switch (cmd)
{
//case......
case SYSTEM_CMD_START:
IpcBitsOutLink_start(pObj);
OSA_tskAckOrFreeMsg(pMsg, status);
break;
case IPCBITSOUT_LINK_CMD_CREATE_CH_BUFFER:
{
status = IpcBitsOutLink_CreateChBuffer(pObj,//创建buf
OSA_msgGetPrm(pMsg));
{
//创建缓冲池
ipcbitsoutlink_validate_createbuf_params(pObj,bufCreatePrms);
status = IpcBitsOutLink_doChBufCreate(pObj,bufCreatePrms);
{
//读取内存中的数据
RingBufferInit(&pObj->ringBufHdnl[chId], pObj->bitBufBasePtr[chId], totBufSize);
//listElem->&pObj->listElemFreeQue(listElem是临时变量)
OSA_queGet(&pObj->listElemFreeQue,(Int32 *)&listElem,OSA_TIMEOUT_NONE);
//&pObj->listElemQue[chId]=listElem
OSA_quePut(&pObj->listElemQue[chId], (Int32) listElem,OSA_TIMEOUT_NONE);
}
} OSA_tskAckOrFreeMsg(pMsg, status);
break;
}
}
} } }
IpcFramesInLink_init();
IpcFramesOutLink_init(); AvsyncLink_init(); SystemLink_init();
} } }//VcapVdis_start() } while(!done)
{
ch = Demo_getChar();//设置
switch(ch)
case '1':
Demo_captureSettings(demoId);
break;
case '2':
Demo_encodeSettings(demoId);
break;
case '3':
Demo_decodeSettings(demoId);
break;
case '4':
Demo_displaySettings(demoId);
break;
//...
case 'e':
done = TRUE;
break;
}
/*结束demo,正常退出并释放内存资源
如果在程序运行期间采取ctrl+c的方式中断程序会因为内存没用正常释放从而导致
在下一次重新启动demo是出错。这种错误需要reboot开发板并重新init load
*/
Demo_startStop(demoId, FALSE)
{
VdecVdis_stop()
{
VdecVdis_bitsRdStop(); /* Stop components */
Vdec_stop();
Vdis_stop(); grpx_exit(); Vsys_delete(); /* De-configure display */
Vsys_deConfigureDisplay(); /* De-initialize components */
Vdec_exit();
Vdis_exit();
Vsys_exit(); VdecVdis_bitsRdExit();
}
} return 0; }

DM8168 解码显示模块代码阅读分析的更多相关文章

  1. 代码阅读分析工具Understand 2.0试用

    Understand 2.0是一款源代码阅读分析软件,功能强大.试用过一段时间后,感觉相当不错,确实可以大大提高代码阅读效率.由于Understand功能十分强大,本文不可能详尽地介绍它的所有功能,所 ...

  2. 图形化代码阅读工具——Scitools Understand

    Scitools出品的Understand 2.0.用了很多年了,比Source Insight强大很多.以前的名字叫Understand for C/C++,Understand for Java, ...

  3. 脚本病毒分析扫描专题1-VBA代码阅读扫盲、宏病毒分析

    1.Office Macor MS office宏的编程语言是Visual Basic For Applications(VBA). 微软在1994年发行的Excel5.0版本中,即具备了VBA的宏功 ...

  4. NetSarang软件中nssock2.dll模块被植入恶意代码技术分析与防护方案

    原文地址:http://blog.nsfocus.net/nssock2-dll-module-malicious-code-analysis-report/ NetSarang是一家提供安全连接解决 ...

  5. MDU某产品OMCI模块代码质量现状分析

    说明 本文参考MDU系列某产品OMCI模块现有代码,提取若干实例以说明目前的代码质量,亦可作为甄别不良代码的参考. 本文旨在就事论事,而非否定前人(没有前人的努力也难有后人的进步).希望以史为鉴,不破 ...

  6. 脚本病毒分析扫描专题2-Powershell代码阅读扫盲

    4.2.PowerShell 为了保障木马样本的体积很小利于传播.攻击者会借助宏->WMI->Powershell的方式下载可执行文件恶意代码.最近也经常会遇见利用Powershell通过 ...

  7. Spark Scheduler模块源码分析之TaskScheduler和SchedulerBackend

    本文是Scheduler模块源码分析的第二篇,第一篇Spark Scheduler模块源码分析之DAGScheduler主要分析了DAGScheduler.本文接下来结合Spark-1.6.0的源码继 ...

  8. Verilog HDL基础语法讲解之模块代码基本结构

    Verilog HDL基础语法讲解之模块代码基本结构   本章主要讲解Verilog基础语法的内容,文章以一个最简单的例子"二选一多路器"来引入一个最简单的Verilog设计文件的 ...

  9. Linux-3.0.8 input subsystem代码阅读笔记

    先乱序记录一下阅读Linux input subsystem代码的笔记. 在input device driver的入口代码部分,需要分配并初始化input device结构,内核提供的API是inp ...

随机推荐

  1. Eclipse启动时报需要安装"Java SE 6 Runtime"致无法启动解决方案

    今天心血来潮,把MBP升级到了osx mavericks,然后启动了闲置好久的eclipse,启动时居然报错了: 若要打开Eclipse.app,您需要Java SE 6 runtime,您想现在安装 ...

  2. Javascript数组,String对象,Math对象,Date对象,正则表达式

    标题栏的滚动<html><head><title>山西众创金融</title></head>function init(){ //1.拿到标 ...

  3. 写个 Hello World 而已,要不要这么震撼?!

    Atom 编辑器的一个插件,可以让你写代码的时候体验狂拽酷炫的效果! 如果来点音乐.再配上机械键盘的话,写代码是不是爽到爆呢? 这货全名叫: activate-power-mode atom pack ...

  4. js 一个关于图片onload加载的事

    前几天一个项目让我头疼了很久,一个关于图片加载时的loading效果,因为不是太懂js,所以在网上各种找资料,但还是不理想,无赖苦心研究,终于有了一点眉目了,虽然个中还有一些道理不懂,至少目的达到了; ...

  5. 学点css之经验总结篇章

    学css说起来应该有三天左右的时间的,加上之前了解的基础,对css有一点的感性认识了,相应代码有有比较好的把握,现在就通过分享几张照片的形式分享一下我的收获 备注:在Border的外边的部门被称作:o ...

  6. C#中out和ref使用

    1.out必须在方法中为其赋值,在调用的时候必须在变量的前面加上out关键字,侧重输出. 2.ref修饰方法的参数,在调用的时候必须在变量的前面加上ref关键字,可以修改其值也可以不修改,侧重修改. ...

  7. 结合Retrofit,RxJava,Okhttp,FastJson的网络框架RRO

    Retrofit以其灵活的调用形式, 强大的扩展性著称. 随着RxAndroid的推出, Retrofit这样的可插拔式的网络框架因其可以灵活兼容各种数据解析器, 回调形式(主要还是RxJava啦)而 ...

  8. Unity3D题目,Unity中利用GUI输出九九乘法表

    网上看到的这题,下面贴出源代码 using UnityEngine;using System.Collections; public class c99 : MonoBehaviour//C#脚本名: ...

  9. Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  10. oracle 11g不能连接报ORA-12537+ora-609解决

    操作系统: windows2008 数据库:oracle11g 问题发生:一套正常跑了一年的应用系统,忽然无法连接上数据库,但是另外一个应用可以正常链接,数据入库正常. 数据库服务器端查看: 使用 l ...