



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、在代码分析开始前需要对一个概念进行解释,就是MFC。Multi Format Codec 的缩写,是ARM微处理器内部一种支持多种硬件编码方式的硬件 电路,能够编码/解码MPEG-4/H.263/H.264( 30fps )等多种格式的多媒体影像。TOP6410开发板使用的是ARM11的核,我们现在要利用这个ARM内部的硬件编解码电路来直接对摄像头采集到的图像进行基于硬件的编解码。首先在项目开始前需要对TOP6410的性能做大体的测试,现在我们使用的是三星提供的测试程序,通过对这个测试程序的分析可以很好地让我们了解基于系统级的图像编解码函数的调用机制,有利于我们顺利的提取图像并且进行进一步的处
2、理。要使用MFC,首先要了解如何使用这种机制,在我们的代码中首先要定义一个MFC的句柄(han die),所有的MFC操作都是需要通过传递这个han die作为参数来执行的,它的重要性就跟main函数差不多,是整个编解码过程的掌舵者。在源码中是这样定义的:static void *ha ndle;static void *mfc_e ncoder_ in it(i nt width, in theight, int frame_rate, int bitrate, intgop_ nu m);static void *mfc_e ncoder_exe(void *ha ndle, un sig
3、 ned char *yuv_buf, i nt frame_size,int first_frame, l on g*size);static void mfc_en coder_free(void*ha ndle);看到我们这里定义了三个函数分别是初始化函数,执行函数,还有句柄释放函数。我们就是要利用这三个函数进行我们的编解码操作,我们再来看看init函数的实现:void *mfc_e ncoder_ in it(i nt width, int height, i ntframe_rate, int bitrate, int gop_ num)intframe_size;void*ha n
4、dle;intret;frame_size=(width * height * 3) >>1;这里的意思是把 width*height*3的值除以2han dle = SsbSipH264E ncode In it(width, height, frame_rate, bitrate,gop_ nu m);if (ha ndle = NULL) LOG_MSG(LOG_ERROR, "Test_E ncoder","SsbSipH264E ncodel nitFailed'n");return NULL;ret = SsbSipH26
5、4E ncodeExe(ha ndle);retur n han dle;首先要注意的是传入的参数,它们分别定义了每一帧图像的长宽,帧的速度,比特率, GOP (Group of Pictures )策略影响编码质量(设置编码的质量系数)。函数的作用是对整个 MFC的参数进行设置这里有一个frame_size,有人问为什么要定义成那么大,我们需要的图像每一帧的大 小是我们可以自己定义的,我们在代码执行前一般都会开一个缓冲区来存放每一帧的数据, 由于我们开的缓冲区给每帧的大小就是那么大,所以这里也好配合我们之前开辟的缓冲区大小进行编码。SsbSipH264E ncode In it()这个函数可
6、以说是真正的开始进入编码的初始化过程,现在让我们进去看看。现在我们来看看代码里的关键的几个地方:hOpe n = ope n(MFC_DEV_NAME,O_RDWR|O_NDELAY);打开设备节点/ mapp ing shared in/out buffer betwee napplicati on and MFC device driveraddr = (un sig ned char *) mmap(0, BUF_SIZE,PROT_READ | PROT_WRITE, MAP_SHARED, hOpe n, 0);这里是进行内存映射,我想做过摄像头项目的人对这个肯定特别有体会,这个函数
7、的作用其实就是把 MFC设备工作后写入的那部分内存映射到我的应用程序开的缓冲区中,也就 是说我只要对应用程序中的buffer进行读写其实就是对部分内存的读写。内存映射是linux内核当中一个非常重要的机制,希望能够引起大家足够多的重视。pCTX = (_MFCLIB_H264_ENC *)malloc(sizeof(_MFCLIB_H264_ENC);看到这里我想有必要展示一下这个_MFCLIB_H264_ENC的结构体:typedef structintmagic;inthOpe n;intfIn it;int en c_strm_size;inten c_hdr_size;un sig n
8、ed intwidth, height;un sig ned intframerate, bitrate;un sig ned intgop_ num;un sig ned char *mapped_addr; _MFCLIB_H264_ENC;这个是为MFC设备定义的结构体,至于这样定义主要是为了能够和内核中的定义进行 匹配,相关代码可以参看内核。这里主要是定义了编码需要的参数。之后的工作就是要把这个结构体填满(定义好各项初始化参数),主要的作用就是完成初始化的工作。到这里SsbSipH264E ncodel ni t() 结束,但是初始化工作并没有完成。其实这里你会发现 handle是什么
9、? handle其实在这里被定义为了指向 _MFCLIB_H264_ENC 这个结构体的指针。其实仔细的朋友你会发现handle这个指针在每一次函数调用过程当中都会指向不同的结构体或者是内存地址,读者可以把它理解成贯穿于整个MFC硬件解码的过程当中的中间变量,就相当于指向贯穿于我们程序主干部分的指针,通过它可以得到整个硬解码过程的清晰函数结构。要执行SsbSipH264EncodeExe()函数。要做的是对 MFC内部的一些结构体进行初始化,然后就到了很关键的一步:r = ioctl(pCTX->hOpe n,IOCTL_MFC_H264_ENC_INIT, &m fc_args
10、);这一步其实就是把我们刚才设置好的关于MFC的初始化参数传递到我们内核的驱动程序中,使得驱动程序能够根据我们提供的这些参数对设备进行相应的初始化工作。在这里IOCTL_MFC_H264_ENC_INIT是制定设备的编码格式,pCTX->hOpen是设备的描述符,mfc_args里转载了 MFC所有的参数。完成了这些才算是真正的完成了初始化的 工作。总结一下我们刚才经过的步骤:1. 打开设备节点2. 进行内存到应用的内存映射3. 初始化关于MFC设备的机构体,并且提供相应的参数4. 把_MFCLIB_H264_ENC 参数传入MFC跟深层次的结构体当中5. 通过ioctl函数把这些参数传
11、入到内核当中初始化完成以后我们就要正式开始编码了,现在看一下mfc_encoder_exe()函数的实现大致过程。其实运行的过程非常的简单:SsbSipH264EncodeGetInBuf(handle, 0);SsbSipH264E ncodeExe(ha ndle);SsbSipH264E ncodeGetCo nfig(ha ndle,H264_ENC_GETCONF_HEADER_SIZE, &hdr_size);SsbSipH264E ncodeGetOutBuf(ha ndle,size);看以上这几个函数,其作用通过读函数名字我想就已经非常清楚了,步骤如下:1. 首先得到输入图像的地址buffer2. 然后进行编码3. 第一次的编码需要传入配置参数4. 得到输出的经过编码的图像的地址(通过内部结构体传递)和大小分析完以上过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年特岗教师招聘考试初中生物备考资料
- 甲状腺功能低下课件
- 江苏南京2022-2024年中考满分作文31篇
- 云南省楚雄彝族自治州联考2024-2025学年高二下学期7月期末化学试题(含答案)
- 辽宁省辽阳市2024-2025学年高一下学期期末考试物理试卷(含答案)
- 2025年福建省福州市一中中考数学适应性试卷(4月份)(含答案)
- 新解读《GB-T 36136-2018结核分枝杆菌耐药基因芯片检测基本要求》
- 新解读《GB-T 15054.2-2018小螺纹 第2部分:公差和极限尺寸》
- 生物实验安全知识培训课件
- 2025年考研英语(一)阅读理解细节理解 提升查找与识别细节能力试卷
- 学校物业服务应急事件处理预案
- 校园安全培训课件(教师)
- 断绝子女关系协议书
- 《慢性阻塞性肺疾病患者健康教育》课件
- 单位车辆管理委托协议书示例3篇
- 孔子的故事课件
- 直肠癌护理疑难病例讨论
- 脑出血知识讲课课件
- 教育行业合同管理风险及防范措施
- 民宿经营申请书模板
- 中国红外瞄准镜行业分析报告:市场规模、供需态势、竞争格局及投融资动态分析报告
评论
0/150
提交评论