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;
}

H264解码的一个測试程序

时间: 2024-10-13 02:08:19

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

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

一.測试程序编写说明 我们做的终端设备上运行的是QT应用程序.使用自己定义的键盘接口.经过測试人员长时间的人机交互測试,来确认系统的功能是否满足需求. 如今须要编写一个自己主动化的測试程序,能够依照预设的脚本运行,比方某个按键须要连续运行10000次.或是通过连续几个按键动作运行特定的业务流程10W次.通过这种自己主动測试,能够减轻測试人员的负担,还能够查看触发N次按键后,画面运行N次后的系统的稳定性,如内存使用率,cup使用率等等. 设备有4*4的键盘,包含0-9,C(Call).A.U(up

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

原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Testing 5.Testing(測试) 构建一个測试程序已经被集成到应用项目中,没有必要再专门建立一个測试项目. 5.1 Basics and Configuration(基本知识和配置) 正如前面所提到的,紧邻main sourceSet的就是androidTest sourceSet,默认路径在src/androidTest/下. 在这个測试so

H264编码器性能測试

版本号:0.1.0-beta 作者:石硕 更新:2014-04-13 15:54:08 ============================================================ 现在.H264已经成为视频行业的标准规范.企业中使用比較多的当数X264,开源,资源消耗又比較少. 首先,介绍一下常见的三大开源H264编码器:JM.X264.T264 JM H264的官方測试源代码,实现了264的全部特性,但程序结构冗长,编码复杂度高,不推荐商业应用. X264 摈弃了

Redis安装及简单測试

摘要: Redis是眼下业界很受到欢迎的一个内存数据库,一般用作系统的中间缓存系统,用以提升总体商业系统的吞吐量和响应速度.本文将简要介绍安装的主要过程以及给出一个简要的測试代码. 1.  系统环境和版本号说明 操作系统选用Ubuntu 14.04, Redis的版本号选取眼下的最新稳定版本号2.8.9. client选用了Redis的Java版本号jedis 2.4.2. 2.  Redis的安装步骤 a. 下载Redis的安装包 wget http://download.redis.io/r

C语言单元測试

对于敏捷开发来说,单元測试不可缺少,对于Java开发来说,JUnit非常好,对于C++开发,也有CPPUnit可供使用,而对于传统的C语言开发,就没有非常好的工具可供使用,能够找到的有这么几个工具: CuTest -- CuTest(Cute Test)是一个很easy的C语言单元測试工具.在使用它的时候,仅仅须要包括两个文件“CuTest.c CuTest.h”,然后就能够写測试用例,进行測试了.它对用例差点儿没有管理功能,报表输出也很easy,能够用来试验单元測试的基本想法. CUnit -

using the easy connect naming method 简单连接測试

一直都不明确sqlnet.ora中的NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)是什么意思.今天看到一篇文档,就是登陆选用的方式.做一个測试: tnsnames.ora  10.10.32.119 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.32.119)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME =

淘宝分布式 key/value 存储引擎Tair安装部署过程及Javaclient測试一例

文件夹 1. 简单介绍 2. 安装步骤及问题小记 3. 部署配置 4. Javaclient測试 5. 參考资料 声明 1. 以下的安装部署基于Linux系统环境:centos 6(64位),其他Linux版本号可能有所差异. 2. 网上有人说tair安装失败可能是由于gcc版本号问题,高版本号的gcc可能不支持某些特性导致安装失败.经过实验证明.该说法是错误的,tair安装失败有各种可能的原因但绝对与gcc版本号无关,比方我的gcc開始版本号为4.4.7,后来tair安装失败,我又一次编译低版

Bandwidth内存带宽測试工具

本博文为原创,遵循CC3.0协议,转载请注明出处:http://blog.csdn.net/lux_veritas/article/details/24766015 -----------------------------------------------------------------------------------------------------------------------------------------------------------------------

在Eclipse中使用JUnit4进行单元測试(0基础篇)

本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能非常强大,但我们在程序中仅仅用到该函数的一小部分功能,而且经过调试能够确定,这一小部分功能是正确的.可是,我们同一时候应该确保每个函数都全然正确,由于假设我们今后假设对程序进行扩展,用到了某个函数的其它功能,而这个功能有bug的话,那绝对是一件非常郁闷的事情.所以说,每编写完一个函数之后,都应该对这