H264解码的一个測试程序

       网上看到的一个H264视频格式的解码測试程序,能够用来參考其逻辑流程。

代码例如以下:

Test_Display_H264()
{
      in_fd = open(H264_INPUT_FILE, O_RDONLY);  //video file open

      fstat(in_fd, &s);                                                // get input file size
      file_size = s.st_size;

 

      in_addr = (char *)mmap(0, file_size, PROT_READ, MAP_SHARED, in_fd, 0);  // mapping input file to memory
      pp_fd = open(PP_DEV_NAME, O_RDWR);                          // Post processor open,不须要它为什么要打开?

      fb_fd = open(FB_DEV_NAME, O_RDWR|O_NDELAY);                                     // LCD frame buffer open
                

      //
      // FrameExtractor Initialization 帧解压初始化//
      //
      pFrameExCtx = FrameExtractorInit(FRAMEX_IN_TYPE_MEM, delimiter_h264, sizeof(delimiter_h264), 1);  
      file_strm.p_start = file_strm.p_cur = (unsigned char *)in_addr;
      file_strm.p_end = (unsigned char *)(in_addr + file_size);
      FrameExtractorFirst(pFrameExCtx, &file_strm);                                      //流文件缓冲区起始及结束

      //


      ///    1. Create new instance      ///
      ///      (SsbSipH264DecodeInit)    ///
      //
     handle = SsbSipH264DecodeInit();

 

     //
     /     1.1 CreateFile     /
     //
     hOpen = open(MFC_DEV_NAME, O_RDWR|O_NDELAY);   //打开MFC设备
   
    //
    // 1.2 Mapping the MFC Input/Output Buffer //
    //
    // mapping shared in/out buffer between application and MFC device driver
    addr = (unsigned char *) mmap(0, BUF_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, hOpen, 0);
    pCTX = (_MFCLIB_H264_DEC *) malloc(sizeof(_MFCLIB_H264_DEC));   //定义解码CTX
  
  
     /
     ///    2. Obtaining the Input Buffer      ///
     ///      (SsbSipH264DecodeGetInBuf)        ///
     /
     pStrmBuf = SsbSipH264DecodeGetInBuf(handle, nFrameLeng);

    /


    / 2.1    (DeviceIoControl)           /
    / IOCTL_MFC_GET_STRM_BUF_ADDR 0x0080000F   /
    /
    mfc_args.get_buf_addr.in_usr_data = (int)pCTX->mapped_addr;
    r = ioctl(pCTX->hOpen, IOCTL_MFC_GET_LINE_BUF_ADDR, &mfc_args);

 

    ///
    // 2.2 H264 CONFIG stream extraction 帧解压配置 //
    //
    nFrameLeng = ExtractConfigStreamH264(pFrameExCtx, &file_strm, pStrmBuf, INPUT_BUFFER_SIZE, NULL);


   
    ///    3. Configuring the instance with the config stream    ///
    ///       (SsbSipH264DecodeExe)                             ///
   
    SsbSipH264DecodeExe(handle, nFrameLeng);
  
    /
    / 3.1       (DeviceIoControl)           /
    / IOCTL_MFC_H264_DEC_INIT 0x00800005   /
    /
    mfc_args.dec_init.in_strmSize = lengthBufFill;
    r = ioctl(pCTX->hOpen, IOCTL_MFC_H264_DEC_INIT, &mfc_args);

 

    /
    ///   4. Get stream information   ///
    /
    SsbSipH264DecodeGetConfig(handle, H264_DEC_GETCONF_STREAMINFO, &stream_info);

 

    //4.1 case H264_DEC_GETCONF_STREAMINFO
    g_stream_info.width      = pCTX->width;
    g_stream_info.height     = pCTX->height;
    g_stream_info.buf_width = pCTX->buf_width;
    g_stream_info.buf_height = pCTX->buf_height;

 

     // set post processor configuration
     // Structure type for IOCTL commands S3C_PP_SET_PARAMS, S3C_PP_SET_INPUT_BUF_START_ADDR_PHY,
     // S3C_PP_SET_INPUT_BUF_NEXT_START_ADDR_PHY, S3C_PP_SET_OUTPUT_BUF_START_ADDR_PHY.
     pp_param.src_full_width     = stream_info.buf_width;
     pp_param.src_full_height = stream_info.buf_height;
     pp_param.src_start_x   = 0;
     pp_param.src_start_y   = 0;
     pp_param.src_width    = pp_param.src_full_width;
     pp_param.src_height    = pp_param.src_full_height;
     pp_param.src_color_space = YC420;    //MFC decode数据为YUV420格式
     pp_param.dst_start_x   = 0;
     pp_param.dst_start_y   = 0;
     pp_param.dst_full_width     = FB0_WIDTH;   // destination width
     pp_param.dst_full_height = FB0_HEIGHT;   // destination height
     pp_param.dst_width    = pp_param.dst_full_width;
     pp_param.dst_height    = pp_param.dst_full_height;
     pp_param.dst_color_space = FB0_COLOR_SPACE; // RGB565
     pp_param.out_path           = DMA_ONESHOT;

     ioctl(pp_fd, S3C_PP_SET_PARAMS, &pp_param);

 

     // get LCD frame buffer address
     fb_size = pp_param.dst_full_width * pp_param.dst_full_height * 2; // RGB565
     fb_addr = (char *)mmap(0, fb_size, PROT_READ | PROT_WRITE, MAP_SHARED, fb_fd, 0);

     //循环解压每一帧,直到播放完成
     while(1)
     {

            //
            ///       5. DECODE            ///
            ///    (SsbSipH264DecodeExe)   ///
            //
            if (SsbSipH264DecodeExe(handle, nFrameLeng) != SSBSIP_H264_DEC_RET_OK)
                  break;
            /
            / 5.1      (DeviceIoControl)           /
            / IOCTL_MFC_H264_DEC_EXE   0x00800007 /
            /
            mfc_args.dec_exe.in_strmSize = lengthBufFill;
            r = ioctl(pCTX->hOpen, IOCTL_MFC_H264_DEC_EXE, &mfc_args);

            //


            ///    6. Obtaining the Output Buffer      ///
            ///      (SsbSipH264DecodeGetOutBuf)       ///
            //
            SsbSipH264DecodeGetConfig(handle, H264_DEC_GETCONF_PHYADDR_FRAM_BUF, pYUVBuf);
 
            //6.1 IOCTL_MFC_GET_PHY_FRAM_BUF_ADDR 0x00800013
            //获取物理地址给pp使用
            r = ioctl(pCTX->hOpen, IOCTL_MFC_GET_PHY_FRAM_BUF_ADDR, &mfc_args);


            ///
            // Next H.264 VIDEO stream 获取下一帧//
            //
            nFrameLeng = NextFrameH264(pFrameExCtx, &file_strm, pStrmBuf, INPUT_BUFFER_SIZE, NULL);
            if (nFrameLeng < 4) //循环结束条件
                 break;

 

             // Post processing
             // pp_param.SrcFrmSt MFC output buffer physical address
             // pp_param.DstFrmSt LCD frame buffer physical address.
             pp_param.src_buf_addr_phy   = pYUVBuf[0]; // MFC output buffer
             ioctl(pp_fd, S3C_PP_SET_SRC_BUF_ADDR_PHY, &pp_param);

             ioctl(fb_fd, FBIOGET_FSCREENINFO, &lcd_info);
             pp_param.dst_buf_addr_phy   = lcd_info.smem_start;    // LCD frame buffer
             ioctl(pp_fd, S3C_PP_SET_DST_BUF_ADDR_PHY, &pp_param);
             ioctl(pp_fd, S3C_PP_START); //pp參数设置完成,启动pp
      }

      SsbSipH264DecodeDeInit(handle);


       munmap(in_addr, file_size);
       munmap(fb_addr, fb_size);
       close(pp_fd);
       close(fb_fd);
       close(in_fd);

       return 0;
}

 

转载于:https://www.cnblogs.com/mfrbuaa/p/3926499.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring框架 web开发_go语言web开发框架学习:Iris框架讲解(一)

Golang介绍Go语言是谷歌推出的一种全新的编程语言&#xff0c;可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说&#xff1a;我们之所以开发Go&#xff0c;是因为过去10多年间软件开发的难度令人沮丧。谷歌资深软件工程师罗布派克(R…

linux终端的背景_如何在终端显示图像缩略图 | Linux 中国

lsix 是一个简单的命令行实用程序&#xff0c;旨在使用 Sixel 图形格式在终端中显示缩略图。-- Sk不久前&#xff0c;我们讨论了 Fim[1]&#xff0c;这是一个轻量级的命令行图像查看器应用程序&#xff0c;用于从命令行显示各种类型的图像&#xff0c;如 bmp、gif、jpeg 和 png…

混合App开发,HBuilder开发移动App

使用HBuilder开发混合App&#xff1a; Hbuilder&#xff1a;是一个在线打包工具&#xff0c;不需要在本地配置开发环境&#xff1b;直接将做好的网站&#xff0c;通过一些简单的操作&#xff0c;就能在线打包为一个App&#xff1b; 混合APP开发常见技术&#xff1a;Html5、Re…

fanuc roboguide_ROBOGUIDE软件:机器人产线输送带输送物料虚拟仿真操作

概述输送带在机器人生产线或工作站中是常见的物料传送设备&#xff0c;它能够将物料从一个工位自动传送到另一个工位&#xff0c;是实现自动化生产制造必不可少的装置设备之一。虚拟仿真是对真实的工业机器人生产线或工作站的图形化再现&#xff0c;因此&#xff0c;对于具有输…

双电阻差分电流采样_小小的采样电阻,还真有点门道!

电流检测电阻的基本原理根据欧姆定律,当被测电流流过电阻时,电阻两端的电压与电流成正比.当1W的电阻通过的电流为几百毫安时,这种设计是没有问题的.然而如果电流达到10-20A,情况就完全不同,因为在电阻上损耗的功率(PI2xR)就不容忽视了.我们可以通过降低电阻阻值来降低功率损耗,…

jpa in查询_优选在shopee虾皮怎么发货价格查询皮皮虾云仓

优选在shopee虾皮怎么发货价格查询皮皮虾云仓皮皮虾云仓物流系统为现代化管理系统&#xff0c;可集中化&#xff0c;高效化的处理本土店物流订单。物流系统可对接主流的的电商平台ERP可以实现高效的订单处理。如lazada&#xff0c;shopee&#xff0c;1688、速卖通、eaby、shopi…

html5+、ReactNative、Weex、Ionic之间的区别、(配置java、python、Android环境)、ReactNative(react-native-cli)、yarn、Weex

html5、ReactNative、Weex、Ionic之间的区别&#xff1a; html5和Ionic&#xff1a; 在开发原理上基本相同&#xff0c;都是需要先开发出一个完整的网站&#xff0c;再通过html5或Ionic提供的打包技术对网站进行打包成移动app&#xff0c;它们实际还是一个网站&#xff0c;并非…

delphi listview失去焦点后的颜色_阴阳师姑获鸟和惠比寿建模更新对比 爷爷帅了 觉醒后鸟姐颜值提升...

阴阳师体验服近期更新了人气式神姑获鸟还有惠比寿的相关建模&#xff0c;本次特别奉上有关这两位式神的建模形象对比图&#xff0c;对比后发现经过修改和优化之后&#xff0c;爷爷更帅了&#xff0c;而觉醒后的鸟姐颜值也有所提升&#xff0c;一起来看看吧。惠比寿觉醒前觉醒前…

kibana 显示 @timestamp 时间问题(utc or browser当前时间)自动转换显示

https://github.com/elasticsearch/kibana/issues/95 可以统一timestamp时间字段为当前信息时区的时间&#xff01; http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-date-format.html 转载于:https://www.cnblogs.com/sunxucool/p/3939701.ht…

React简介、虚拟DOM、Diff算法、创建React项目、JSX语法、组件、组件声明方式、组件传值props和state、组件的生命周期

React简介&#xff1a; 前面只是简单介绍移动APP开发&#xff0c;后面还会继续深入介绍移动app开发&#xff1b;其中想要用ReactNative开发出更出色的应用&#xff0c;那么就得学好React&#xff0c;下面将介绍React&#xff1a; React 是一个由 Facebook 开发用于构建用户界…

去掉 edittext 长按全选_开封消毒湿巾全选

开封消毒湿巾全选   其实&#xff0c;带有杀菌效果的清洁产品大多通过降低微生物的繁殖力达到预期的杀菌效果&#xff0c;所添加的每种杀菌成分都针对特定细菌&#xff0c;无法杀灭所有细菌。如果产品中的杀菌剂浓度总是不能将细菌完全杀灭&#xff0c;就可能导致细菌对该类杀…

代数余子式之和怎么算_小明说养老 | 养老金怎么算之月平均缴费指数怎么来的?...

上一期小明分享了企业职工养老保险退休待遇怎么算&#xff0c;具体可戳小明说养老|养老金怎么算&#xff1f;小明来教你。在以张阿姨为例的计算举例中&#xff0c;提到张阿姨15年的平均缴费指数为0.8209。对这个平均缴费指数的概念提问较多&#xff0c;今天就来解释一下月平均缴…

ReactNative简介、开发环境、调试、常用组件、useState状态、FlatList组件、SectionList组件、Platform 模块、定义样式、图片组件、触摸事件、打包apk发布版

ReactNative简介&#xff1a; ReactNative是基于React语法来进行开发移动app的框架&#xff1b; ReactNative中提供了移动端专用的一些组件&#xff0c;我们要使用ReactNative固有的组件代替网页中使用的一些元素&#xff0c;如&#xff1a;div, p, img 都不能用了&#xff1…

odis工程师使用方法_傅里叶红外光谱仪常见故障维修及排除方法,你了解有多少种呢?...

傅里叶红外光谱仪在使用过程中难免会出现故障&#xff0c;那我们该怎么检修呢&#xff1f;赛默飞傅里叶红外光谱仪有些光谱仪器的使用说明书会给出光谱仪的常见故障及排查方法&#xff0c;有些光谱仪器还有自诊断功能&#xff0c;当傅里叶红外光谱仪不能正常工作时&#xff0c;…

微信小程序简介、发展史、小程序的优点、申请账号、开发工具、初识wxml文件和wxss文件

微信小程序介绍&#xff1a; 小程序简介&#xff1a; 小程序是一种连接用户与服务的方式&#xff0c;它能在微信内被便捷地获取和传播&#xff0c;具有出色的使用体验。 不需要下载安装&#xff0c;用户通过搜一搜或扫一扫就可以打开使用&#xff0c;使用完后退出即可。 小…

tia v15 添加项目_硬技能,TIA 博途软件界面的介绍

在前面的文章中给大家介绍了TIA 博途软件的安装包等介绍&#xff0c;这次小编给大家介绍一下TIA 博途软件的界面。#电工学习PLC#你知道吗&#xff0c;在博途软件的自动化项目任务的创建中&#xff0c;我们可以使用portal视图和项目视图。Portal视图是面向任务的视图&#xff0c…

UIImagePickerController按钮的中文问题

UIImagePickerController按钮的中文问题 执行以下两步即可 1. 在targets中设置region为China 2. 在project中添加支持中文 转载于:https://www.cnblogs.com/YouXianMing/p/3935460.html

rsatool使用步骤图解_工作中想要事半功倍?图解来助你

一次会议上&#xff0c;老板让我们进行一场头脑风暴&#xff0c;然后将脑中浮现出来的想法以ppt的形式&#xff0c;在会议上与大家分享。在会上我看到其他区域的同事做的ppt&#xff0c;真的叫一个精美啊&#xff0c;有图形对比、有案例分析、有未来展望。反观自己的&#xff0…

ZRender源码分析2:Storage(Model层)

回顾 上一篇请移步&#xff1a;zrender源码分析1&#xff1a;总体结构 本篇进行ZRender的MVC结构中的M进行分析 总体理解 上篇说到&#xff0c;Storage负责MVC层中的Model&#xff0c;也就是模型&#xff0c;对于zrender来说&#xff0c;这个model就是shape对象&#xff0c;在…

java语言概述、java语言特性、java语言发展史、java语言作用

Java介绍&#xff1a; Java语言概述&#xff1a; Java语言是由美国Sun&#xff08;Stanford University Network&#xff09;斯坦福网络公司的java语言之父–詹姆斯高斯林&#xff0c;在1995年推出的高级的编程语言。所谓编程语言&#xff0c;是计算机的语言&#xff0c;人们…