网上看到的一个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;
}

H264解码的一个測试程序的更多相关文章

  1. 自己主动化測试程序之中的一个自己定义键盘的模拟測试程序(C语言)

    一.測试程序编写说明 我们做的终端设备上运行的是QT应用程序.使用自己定义的键盘接口.经过測试人员长时间的人机交互測试,来确认系统的功能是否满足需求. 如今须要编写一个自己主动化的測试程序,能够依照预 ...

  2. DLL程序的创建步骤和測试程序

    首先,创建DLL程序 然后,加入一个导出类 比如: //Test.h #pragma once class AFX_EXT_CLASS Test { public:  Test(void);  ~Te ...

  3. DM8168 GPIO驱动与測试程序

    本次測试针对GPIO1进行,挑选了GP1[31],引脚的复用默认的就是GPIO 还是老规矩,贴上driver.c,Makefile,test.c: dm8168_gpio.c: #include &l ...

  4. DM8168 PWM驱动与測试程序

    昨天把DM8168的Timer设置给摸了一遍,为写PWM的底层驱动做好了准备,如今就要进入主题了. dm8168_pwm.c: #include <linux/module.h> #inc ...

  5. spark0.9.1集群模式执行graphx測试程序(LiveJournalPageRank,新增Connected Components)

    spark最新版公布了.之前的版本号就已经集成了graphx,这个版本号还改了一些bug. 我做了简单測试,只是网上关于集群模式执行spark资料太少了,仅仅有关于EC2(见參考资料1)的.可是还非常 ...

  6. 一个Nodejs的简单计算測试程序

    測试目的: 1 測试二维数组的使用 2 输出函数的使用 代码: var util = require('util'); a = 3; b = 4; c = a + b; a = []; for(i = ...

  7. Android Gradle Plugin指南(四)——測试

    原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Testing 5.Testing(測试) 构建一个測试 ...

  8. Mali GPU OpenGL ES 应用性能优化--測试+定位+优化流程

    1. 使用DS-5 Streamline定位瓶颈 DS-5 Streamline要求GPU驱动启用性能測试,在Mali GPU驱动中激活性能測试对性能影响微不足道. 1.1 DS-5 Streamli ...

  9. H264编码器性能測试

    版本号:0.1.0-beta 作者:石硕 更新:2014-04-13 15:54:08 ======================================================== ...

随机推荐

  1. [SAP] 外部系统调用SAP web service用户验证的简单方法

    场景: 一个Java系统调用SAP系统提供的web service,除了根据WSDL生成的代理类,调用相应方法,传入相应参数外,还等需要使用SAP提供的用户信息进行身份验证,最简单的方法是在soap请 ...

  2. jackson的简单实用实例(json)

    一个json格式的字符串比如: {"status":10001,"code":"HDkGzI","pubkey":&qu ...

  3. SQL中 and or优先级问题

    资源来源:http://www.linuxidc.com/Linux/2012-03/56267.htm 刚刚在项目中遇到这样一个问题,SQL语句如下: select * from LOAN_BACK ...

  4. Sublime Text3安装SublimeREPL插件以及快捷键设置

    SublimeREPL是Sublime Text的一个插件,它除了可以使你在ST中运行解释器(REPL),还有对Python语言的特别支持,包括在本地/远程(远程仅在linux/osx平台可用)vir ...

  5. android LayoutInflater的使用

    看其继承关系: public abstract class LayoutInflater extends Object java.lang.Object ↳ android.view.LayoutIn ...

  6. strlen源码剖析

      学习高效编程的有效途径之一就是阅读高手写的源代码,CRT(C/C++ Runtime Library)作为底层的函数库,实现必然高效.恰好手中就有glibc和VC的CRT源代码,于是挑了一个相对简 ...

  7. Oracle SQL篇(一)null值之初体验

           从我第一次正式的写sql语句到现在,已经超过10年的时间了.我写报表,做统计分析和财务对账,我一点点的接触oracle数据库,并尝试深入了解.这条路,一走就是10年,从充满热情,到开始厌 ...

  8. Browserify: 使nodejs模块可以在浏览器下使用

    Browserify:浏览器加载Node.js模块--------------------------------------------------随着JavaScript程序逐渐模块化,在ECMA ...

  9. Linux计时体系结构

    [Linux操作系统分析]定时测量——RTC,TSC,PIT,jiffies,计时体系结构,延迟函数   1 基本概念 定时机制连同一些更可见的内核活动(如检查超时)来驱使进程切换. 两种主要的定时测 ...

  10. hdoj 1878 欧拉回路(无向图欧拉回路+并查集)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1878 思路分析:该问题给定一个无向图,要求判断该无向图是否存在欧拉回路:无向图判断存在欧拉回路的两个必 ...