RV1126-RV1109 MPP使用说明

一、MPP 简介

Media Process Platform(简称 MPP) 是适用于瑞芯微芯片系列的通用媒体处理软件平台。

该平台对应用软件屏蔽了芯片相关的复杂底层处理, 其目的是为了屏蔽不同芯片的差异, 为使用者提供统一的视频媒体处理接口(Media Process Interface, 缩写 MPI)。

1.MPP的功能

  • 视频解码:H.265 / H.264 / H.263 / VP9 / VP8 / MPEG-4 / MPEG-2 / MPEG-1 / VC1 / MJPEG 压缩格式的流媒体【码流数据】
  • 视频编码:H.264 / VP8 / MJPEG 压缩格式的视频文件【图像数据】
  • 视频处理:视频拷贝,缩放,色彩空间转换,场视频解交织(Deinterlace)。

2.MPP系统架构

image
  • 硬件层

    • 硬件层是瑞芯微系列芯片平台的视频编解码硬件加速模块, 包括 VPU, rkvdec, rkvenc 等不同类型,
      不同功能的硬件加速器。
  • 内核驱动层

    • Linux 内核的编码器驱动(vcodec_service)、VPU驱动(vpu_service),以及相关的 mmu, 内存, 时钟, 电源管理模块等。
  • MPP层

    • MPP层屏蔽了不同操作系统和不同芯片平台的差异,为使用者提供统一的MPI接口,包括:
      • HAL模块
      • OSAL模块
      • MPI模块
      • 视频编解码模块(video decoder、video encoder)
      • 视频处理模块(video process)
  • 操作系统层

    • MPP 用户态的运行平台,如 Android 以及 Debian 等 Linux 发行版
  • 应用层

    • MPP 层通过 MPI 对接各种中间件软件, 如 OpenMax, ffmpeg 和 gstreamer, 或者直接对接客户的上
      层应用。

3.平台支持

  • 硬件平台支持

    • 支持瑞芯微主流的各种系列芯片平台:
      • RK3188 系列, RK3288 系列, RK3368 系列, RK3399 系列
      • RK30xx 系列, RK312x 系列芯片,RK322x 系列芯片, RK332x 系列
      • RV1108 / RV1107 系列
  • 软件平台支持

    • MPP 支持在各种版本的 Android 平台和纯 Linux 平台上运行。
    • 支持瑞芯微 Linux 内核 3.10 和 4.4 版本, 需要有 vcodec_service 设备驱动支持以及相应的 DTS 配置
      支持。

二、MPI 接口

MPI(Media Process Interface)是 MPP 提供给用户的接口,用于提供硬件编解码功能,以及一些必要的相关功能。

1.MPI接口数据结构

MPI 接口使用的主要数据结构

  • MppMem:C 库 malloc 内存的封装。
  • MppBuffe:硬件用的 dmabuf 内存的封装。
  • MppPacket :一维缓存封装, 可以从 MppMem 和 MppBuffer 生成, 主要用于表示码流数据。
    • 码流:视频图像经过编码压缩后在单位时间内的数据流量,应用于流媒体服务器。
  • MppFrame :二维帧数据封装,可 以从 MppMem 和 MppBuffer 生成, 主要用于表示图像数据。
  • MppMeta 和 MppTask :输入输出用任务的高级组合接口,可以支持指定输入输出方式等复杂使用方
    式, 较少使用。

2.MPI 接口使用

MPI 是通过 C 结构里的函数指针方式提供给用户, 用户可以通过 MPP 上下文结构MppCtx 与 MPI 接口结构 MppApi 组合使用来实现解码器与编码器的功能。

  • 操作 MppCtx 接口
    • mpp_create,mpp_init,mpp_destroy
  • 真正的编码与解码过程是通过调用 MppApi 结构体里内的函数指针来实现。
    • 解码
      • 输 入 码 流 :decode_put_packet
        • 按帧输入或者按长度输入,默认可以接收 4 个输入码流包在处理队列中。
      • 输 出 图 像:decode_get_frame
    • 编码
      • 输 入 图像 :encode_put_frame
      • 输 出 码流:encode_get_packet

三、MPP 库编译与使用

1.下载编译MPP 库

目前以RV1126为例使用MPP SDK

$ git clone -b release https://github.com/rockchip-linux/mpp.git
# linux 平台编译,假设处理器结构为arm
$ cd mpp/build/linux/arm
$ sudo apt-get -y install cmake
$ bash make-Makefiles.bash
$ make -j4
$ sudo make install

$ tree -L 2
.
├── arm.linux.cross.cmake
├── CMakeCache.txt
├── CMakeFiles
│   ├── 3.10.2
│   ├── cmake.check_cache
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeError.log
│   ├── CMakeOutput.log
│   ├── CMakeTmp
│   ├── feature_tests.bin
│   ├── feature_tests.c
│   ├── feature_tests.cxx
│   ├── Makefile2
│   ├── Makefile.cmake
│   ├── progress.marks
│   └── TargetDirectories.txt
├── cmake_install.cmake
├── Makefile
├── make-Makefiles.bash
├── mpp
│   ├── base
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── codec
│   ├── hal
│   ├── legacy
│   ├── librockchip_mpp.so -> librockchip_mpp.so.1
│   ├── librockchip_mpp.so.0
│   ├── librockchip_mpp.so.1 -> librockchip_mpp.so.0
│   ├── Makefile
│   └── vproc
├── osal
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── libosal.a
│   ├── Makefile
│   └── test
│       ├── CMakeFiles
│       ├── cmake_install.cmake
│       ├── Makefile
│       ├── mpp_env_test
│       ├── mpp_eventfd_test
│       ├── mpp_log_test
│       ├── mpp_mem_test              # 测试C库的内存分配器是否正常
│       ├── mpp_platform_test      # 读取和测试芯片平台信息是否正常
│       ├── mpp_runtime_test        # 测试一些软硬件运行时环境是否正常
│       ├── mpp_thread_test
│       └── mpp_time_test
├── rockchip_mpp.pc
├── rockchip_vpu.pc
├── test
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── Makefile
│   ├── mpi_dec_mt_test       # 多线程解码测试
│   ├── mpi_dec_multi_test  # 多实例解码测试【n线程同时解码n份数据帧】
│   ├── mpi_dec_test                # 单线程解码测试
│   ├── mpi_enc_multi_test  # 多实例编码测试
│   ├── mpi_enc_test                # 单线程编码测试
│   ├── mpi_rc2_test
│   ├── mpi_rc_test
│   ├── mpi_test
│   ├── mpp_info_test               # 读取和打印MPP库的版本信息
│   └── vpu_api_test
└── utils
    ├── CMakeFiles
    ├── cmake_install.cmake
    ├── libutils.a
    └── Makefile

mpp测试程序说明

  • mpi_enc_test:使用同步界面(轮询,出队和入队),对raw data进行编码以压缩视频。

  • mpi_dec_test:使用同步接口和异步接口(decode_put_packet和decode_get_frame),将视频压缩解码为yuv格式的raw data。

  • mpi_rc_test:编码使用详细的比特率控制配置。

  • mpi_rc2_test:使用详细的比特率控制配置进行编码,而cfg参数则来自mpi_rc.cfg。

  • mpi_test:mpi调用方法的简单描述,仅供参考

  • mpp_event_trigger:事件触发测试。

  • mpp_parse_cfg:mpp解析器cfg测试。

  • vpu_api_test:编码或解码使用旧版接口,以便与以前的vpu接口兼容。

2.获取芯片平台相关信息

$ cd mpp/build/linux/arm/osal/test

$ ./mpp_platform_test
mpp[2493]: mpp_plat_test: chip name: rockchip,rv1126-ds-v10 rockchip,rv1126
mpp[2493]: mpp_plat_test: 
mpp[2493]: mpp_plat_test: chip vcodec type 00050202
mpp[2493]: mpp_plat_test: found vpu2 codec
mpp[2493]: mpp_plat_test: found rkvdec decoder  # rk video decoder
mpp[2493]: mpp_plat_test: found rkvenc encoder  # rk video encoder
mpp[2493]: mpp_plat_test: found vpu2 encoder
mpp[2493]: mpp_plat_test: 
mpp[2493]: mpp_plat_test: start probing decoder device name:
mpp[2493]: mpp_plat_test: H.264 decoder: /dev/mpp_service   # h264解码
mpp[2493]: mpp_plat_test: H.265 decoder: /dev/mpp_service   # h265解码
mpp[2493]: mpp_plat_test: MJPEG decoder: /dev/mpp_service   # MJPEG解码
mpp[2493]: mpp_plat_test: VP9   decoder: (null)
mpp[2493]: mpp_plat_test: avs   decoder: (null)
mpp[2493]: mpp_plat_test: 
mpp[2493]: mpp_plat_test: start probing encoder device name:
mpp[2493]: mpp_plat_test: H.264 encoder: /dev/mpp_service # h264编码
mpp[2493]: mpp_plat_test: H.265 encoder: /dev/mpp_service # h265编码
mpp[2493]: mpp_plat_test: MJPEG encoder: /dev/mpp_service # MJPEG编码
mpp[2493]: mpp_plat_test: mpp platform test done

$ ./mpp_runtime_test
mpp[2596]: mpp_rt: NOT found ion allocator
mpp[2596]: mpp_rt: found drm allocator
mpp[2596]: mpp_rt_test: mpp found ion buffer is invalid
mpp[2596]: mpp_rt_test: mpp found drm buffer is valid

$ ./mpp_mem_test 
mpp[2034]: mpp_mem_test: calloc  success ptr 0x0x59080
mpp[2034]: mpp_mem_test: realloc success ptr 0x0x5b548
mpp[2034]: mpp_mem_test: mpp_mem_test done

3.MPP视频解码测试

$ cd mpp/build/linux/arm/test

$ ./mpi_dec_test
mpp[671]: mpi_dec_test: usage: mpi_dec_test [options]
mpp[671]: utils: -i  input_file         input bitstream file
mpp[671]: utils: -o  output_file        output bitstream file, 
mpp[671]: utils: -c  ops_file           input operation config file
mpp[671]: utils: -w  width              the width of input bitstream
mpp[671]: utils: -h  height             the height of input bitstream
mpp[671]: utils: -t  type               input stream coding type
mpp[671]: utils: -f  format             output frame format type    # 无效,只输出YUV420SP, NV12颜色格式
mpp[671]: utils: -d  debug              debug flag
mpp[671]: utils: -x  timeout            output timeout interval
mpp[671]: utils: -n  frame_number       max output frame number
mpp[671]: mpi: mpp coding type support list:
mpp[671]: mpi: type: dec id 0 coding: mpeg2            id 2
mpp[671]: mpi: type: dec id 0 coding: mpeg4            id 4
mpp[671]: mpi: type: dec id 0 coding: h.263            id 3
mpp[671]: mpi: type: dec id 0 coding: h.264/AVC        id 7
mpp[671]: mpi: type: dec id 0 coding: h.265/HEVC       id 16777220
mpp[671]: mpi: type: dec id 0 coding: vp8              id 9
mpp[671]: mpi: type: dec id 0 coding: VP9              id 10
mpp[671]: mpi: type: dec id 0 coding: avs+             id 16777221
mpp[671]: mpi: type: dec id 0 coding: jpeg             id 8
mpp[671]: mpi: type: enc id 1 coding: h.264/AVC        id 7
mpp[671]: mpi: type: enc id 1 coding: jpeg             id 8
mpp[671]: mpi: type: enc id 1 coding: h265             id 16777220
mpp[671]: mpi: type: enc id 1 coding: vp8              id 9

# 将h.264/AVC视频文件解码成yuv格式raw data视频文件
# 输出图像颜色默认为YUV420SP, NV12格式,-f选择其他参数无效
$ sudo ./mpi_dec_test -i test.h264 -o test.yuv -w 160 -h 128 -t 7
mpp[311]: mpi_dec_test: cmd parse result:
mpp[311]: mpi_dec_test: input  file name: test.h264
mpp[311]: mpi_dec_test: output file name: test.yuv
mpp[311]: mpi_dec_test: config file name: 
mpp[311]: mpi_dec_test: width      :  160
mpp[311]: mpi_dec_test: height     :  128
mpp[311]: mpi_dec_test: type       : 7
mpp[311]: mpi_dec_test: debug flag : 0
mpp[311]: mpi_dec_test: max frames : 0
mpp[311]: mpi_dec_test: mpi_dec_test start
mpp[311]: mpi_dec_test: input file size 3032275
mpp[311]: mpp_info: mpp version: a75c5ed author: Herman Chen    2020-11-06 [legacy]: Remove vpu dependence on mpp_service cmd
mpp[311]: mpi_dec_test: 0x329a0 mpi_dec_test decoder test start w 160 h 128 type 7
mpp[311]: mpp_rt: NOT found ion allocator
mpp[311]: mpp_rt: found drm allocator
mpp[311]: mpi_dec_test: 0x329a0 decode_get_frame get info changed found
mpp[311]: mpi_dec_test: 0x329a0 decoder require buffer w:h [160:128] stride [160:128] buf_size 40960
mpp[311]: mpi_dec_test: 0x329a0 decode get frame 0
mpp[311]: mpi_dec_test: 0x329a0 decode get frame 1
mpp[311]: mpi_dec_test: 0x329a0 decode get frame 2
mpp[311]: mpi_dec_test: 0x329a0 decode get frame 3
......
mpp[311]: mpi_dec_test: 0x329a0 decode get frame 7192
mpp[311]: mpi_dec_test: 0x329a0 decode get frame 7193
mpp[311]: mpi_dec_test: 0x329a0 decode get frame 7194
mpp[311]: mpi_dec_test: 0x329a0 found last packet
mpp[311]: mpi_dec_test: test success max memory 0.27 MB

# 测试RV1126编码极限,将多路h.264/AVC视频文件解码成yuv格式raw data视频【7路 1080P视频解码】
# 注意:编码极限测试时不能用-o,否则会影响测试效果
$ sudo ./mpi_dec_multi_test  -i video-1920x1080.h264  -w 1920 -h 1080 -t 7 -n 7
mpp[3975]: mpi_dec_multi_test: cmd parse result:
mpp[3975]: mpi_dec_multi_test: input  file name: video-1920x1080.h264
mpp[3975]: mpi_dec_multi_test: output file name: 
mpp[3975]: mpi_dec_multi_test: width      : 1920
mpp[3975]: mpi_dec_multi_test: height     : 1080
mpp[3975]: mpi_dec_multi_test: type       : 7
mpp[3975]: mpi_dec_multi_test: mpi_dec_test decoder test start w 1920 h 1080 type 7
mpp[3975]: mpi_dec_multi_test: mpi_dec_test decoder test start w 1920 h 1080 type 7
mpp[3975]: mpp_info: mpp version: a75c5ed author: Herman Chen    2020-11-06 [legacy]: Remove vpu dependence on mpp_service cmd
mpp[3975]: mpp_info: mpp version: a75c5ed author: Herman Chen    2020-11-06 [legacy]: Remove vpu dependence on mpp_service cmd
mpp[3975]: mpi_dec_multi_test: mpi_dec_test decoder test start w 1920 h 1080 type 7
mpp[3975]: mpi_dec_multi_test: mpi_dec_test decoder test start w 1920 h 1080 type 7
mpp[3975]: mpp_rt: NOT found ion allocator
mpp[3975]: mpp_info: mpp version: a75c5ed author: Herman Chen    2020-11-06 [legacy]: Remove vpu dependence on mpp_service cmd
mpp[3975]: mpp_rt: found drm allocator
mpp[3975]: mpi_dec_multi_test: mpi_dec_test decoder test start w 1920 h 1080 type 7
mpp[3975]: mpi_dec_multi_test: mpi_dec_test decoder test start w 1920 h 1080 type 7
mpp[3975]: mpp_info: mpp version: a75c5ed author: Herman Chen    2020-11-06 [legacy]: Remove vpu dependence on mpp_service cmd
mpp[3975]: mpp_info: mpp version: a75c5ed author: Herman Chen    2020-11-06 [legacy]: Remove vpu dependence on mpp_service cmd
mpp[3975]: mpp_info: mpp version: a75c5ed author: Herman Chen    2020-11-06 [legacy]: Remove vpu dependence on mpp_service cmd
mpp[3975]: mpi_dec_multi_test: mpi_dec_test decoder test start w 1920 h 1080 type 7
mpp[3975]: mpp_info: mpp version: a75c5ed author: Herman Chen    2020-11-06 [legacy]: Remove vpu dependence on mpp_service cmd
mpp[3975]: mpi_dec_multi_test: decode_get_frame get info changed found
mpp[3975]: mpi_dec_multi_test: decoder require buffer w:h [1920:1080] stride [1920:1088] buf_size 4177920
mpp[3975]: mpi_dec_multi_test: decode_get_frame get info changed found
mpp[3975]: mpi_dec_multi_test: decoder require buffer w:h [1920:1080] stride [1920:1088] buf_size 4177920
mpp[3975]: mpi_dec_multi_test: decode_get_frame get info changed found
mpp[3975]: mpi_dec_multi_test: decode_get_frame get info changed found
mpp[3975]: mpi_dec_multi_test: decoder require buffer w:h [1920:1080] stride [1920:1088] buf_size 4177920
mpp[3975]: mpi_dec_multi_test: decoder require buffer w:h [1920:1080] stride [1920:1088] buf_size 4177920
mpp[3975]: mpi_dec_multi_test: decode_get_frame get info changed found
mpp[3975]: mpi_dec_multi_test: decoder require buffer w:h [1920:1080] stride [1920:1088] buf_size 4177920
mpp[3975]: mpi_dec_multi_test: decode_get_frame get info changed found
mpp[3975]: mpi_dec_multi_test: decoder require buffer w:h [1920:1080] stride [1920:1088] buf_size 4177920
mpp[3975]: mpi_dec_multi_test: decode_get_frame get info changed found
mpp[3975]: mpi_dec_multi_test: decoder require buffer w:h [1920:1080] stride [1920:1088] buf_size 4177920
mpp[3975]: mpi_dec_multi_test: decode 1500 frame use time 45613 ms frm rate 32.88
mpp[3975]: mpi_dec_multi_test: decode 1500 frame use time 45673 ms frm rate 32.84
mpp[3975]: mpi_dec_multi_test: decode 1500 frame use time 45738 ms frm rate 32.80
mpp[3975]: mpi_dec_multi_test: decode 1500 frame use time 45753 ms frm rate 32.78
mpp[3975]: mpi_dec_multi_test: decode 1500 frame use time 45770 ms frm rate 32.77
mpp[3975]: mpi_dec_multi_test: decode 1500 frame use time 45782 ms frm rate 32.76
mpp[3975]: mpi_dec_multi_test: decode 1500 frame use time 45782 ms frm rate 32.76
mpp[3975]: mpi_dec_multi_test: payload 0 frame rate: 32.84 first delay 180 ms
mpp[3975]: mpi_dec_multi_test: payload 1 frame rate: 32.88 first delay 145 ms
mpp[3975]: mpi_dec_multi_test: payload 2 frame rate: 32.78 first delay 150 ms
mpp[3975]: mpi_dec_multi_test: payload 3 frame rate: 32.77 first delay 181 ms
mpp[3975]: mpi_dec_multi_test: payload 4 frame rate: 32.76 first delay 166 ms
mpp[3975]: mpi_dec_multi_test: payload 5 frame rate: 32.76 first delay 227 ms
mpp[3975]: mpi_dec_multi_test: payload 6 frame rate: 32.80 first delay 165 ms
mpp[3975]: mpi_dec_multi_test: average frame rate 32
# RV1126 MPP解码测试结果:7路 1080P 32fps H.264
  • 视频raw data格式分为YUV和RGB格式
    • 常见的YUV 格式有YUV420、YUV422、YUV444等
      • 根据内存存储方式的不同,YUV420又分为YUV420P和YUV420SP,分别是3平面存储和2平面存储;
      • 常见的NV12、NV21、I420、YV12等都属于YUV420;
    • 常见的RGB格式有RGB和RGBA等,

4.MPP视频编码测试

$ ./mpi_enc_test
mpp[2628]: mpi_enc_utils: usage: mpi_enc_test [options]
mpp[2628]: utils: -i  input_file        input bitstream file
mpp[2628]: utils: -o  output_file       output bitstream file, 
mpp[2628]: utils: -w  width             the width of input picture
mpp[2628]: utils: -h  height            the height of input picture
mpp[2628]: utils: -f  format            the format of input picture
mpp[2628]: utils: -t  type              output stream coding type
mpp[2628]: utils: -n  max frame number  max encoding frame number # 最大编码帧数量,默认是全部帧
mpp[2628]: utils: -g  gop_mode          gop reference mode
mpp[2628]: utils: -d  debug             debug flag
mpp[2628]: utils: -b  bps target:min:max    set tareget bps
mpp[2628]: utils: -r  in/output fps     set input and output frame rate
mpp[2628]: utils: -l  loop count        loop encoding times for each frame
mpp[2628]: mpi: mpp coding type support list:
mpp[2628]: mpi: type: dec id 0 coding: mpeg2            id 2
mpp[2628]: mpi: type: dec id 0 coding: mpeg4            id 4
mpp[2628]: mpi: type: dec id 0 coding: h.263            id 3
mpp[2628]: mpi: type: dec id 0 coding: h.264/AVC        id 7
mpp[2628]: mpi: type: dec id 0 coding: h.265/HEVC       id 16777220
mpp[2628]: mpi: type: dec id 0 coding: vp8              id 9
mpp[2628]: mpi: type: dec id 0 coding: VP9              id 10
mpp[2628]: mpi: type: dec id 0 coding: avs+             id 16777221
mpp[2628]: mpi: type: dec id 0 coding: jpeg             id 8
mpp[2628]: mpi: type: enc id 1 coding: h.264/AVC        id 7
mpp[2628]: mpi: type: enc id 1 coding: jpeg             id 8
mpp[2628]: mpi: type: enc id 1 coding: h265             id 16777220
mpp[2628]: mpi: type: enc id 1 coding: vp8              id 9
mpp[2628]: mpi: mpp color support list: #   the format of input picture
mpp[2628]: mpi: color: id 0     0x00000 YUV420SP,      NV12
mpp[2628]: mpi: color: id 1     0x00001 YUV420SP-10bit
mpp[2628]: mpi: color: id 2     0x00002 YUV422SP,      NV24
mpp[2628]: mpi: color: id 3     0x00003 YUV422SP-10bit
mpp[2628]: mpi: color: id 4     0x00004 YUV420P,       I420
mpp[2628]: mpi: color: id 5     0x00005 YUV420SP,      NV21
mpp[2628]: mpi: color: id 6     0x00006 YUV422P,       422P
mpp[2628]: mpi: color: id 7     0x00007 YUV422SP,      NV42
mpp[2628]: mpi: color: id 8     0x00008 YUV422-YUYV,   YUY2
mpp[2628]: mpi: color: id 10    0x0000a YUV422-UYVY,   UYVY
mpp[2628]: mpi: color: id 12    0x0000c YUV400-Y8,     Y800
mpp[2628]: mpi: color: id 65536 0x10000 RGB565
mpp[2628]: mpi: color: id 65537 0x10001 BGR565
mpp[2628]: mpi: color: id 65538 0x10002 RGB555
mpp[2628]: mpi: color: id 65539 0x10003 BGR555
mpp[2628]: mpi: color: id 65542 0x10006 RGB888
mpp[2628]: mpi: color: id 65543 0x10007 BGR888
mpp[2628]: mpi: color: id 65546 0x1000a ARGB8888
mpp[2628]: mpi: color: id 65547 0x1000b ABGR8888

# 将yuv raw data编码成h264视频文件,输入图像颜色选择YUV420SP, NV12 格式
$ sudo ./mpi_enc_test -i test.yuv -o output.h264  -w 160 -h 128 -f 0 -t 7
mpp[3181]: mpi_enc_utils: cmd parse result:
mpp[3181]: mpi_enc_utils: input  file name: test.yuv
mpp[3181]: mpi_enc_utils: output file name: (null)
mpp[3181]: mpi_enc_utils: width      : 160
mpp[3181]: mpi_enc_utils: height     : 128
mpp[3181]: mpi_enc_utils: format     : 0
mpp[3181]: mpi_enc_utils: type       : 7
mpp[3181]: mpi_enc_test: mpi_enc_test start
mpp[3181]: mpp_rt: NOT found ion allocator
mpp[3181]: mpp_rt: found drm allocator
mpp[3181]: mpp_info: mpp version: a75c5ed author: Herman Chen    2020-11-06 [legacy]: Remove vpu dependence on mpp_service cmd
mpp[3181]: mpi_enc_test: 0x359c0 mpi_enc_test encoder test start w 160 h 128 type 7
mpp[3181]: h264e_api_v2: MPP_ENC_SET_PREP_CFG w:h [160:128] stride [160:128]
mpp[3181]: h264e_api_v2: MPP_ENC_SET_RC_CFG bps 76800 [4800 : 81600] fps [30:30] gop 60
mpp[3181]: mpp_enc_v2: send header for set cfg change input/format 
mpp[3181]: mpp_enc_v2: mode vbr bps [4800:76800:81600] fps fix [30/1] -> fix [30/1] gop i [60] v [0]
mpp[3181]: mpi_enc_test: 0x359c0 encoded frame 0    size 5478   
mpp[3181]: mpi_enc_test: 0x359c0 encoded frame 1    size 1705   
mpp[3181]: mpi_enc_test: 0x359c0 encoded frame 2    size 2182   
......
mpp[1966]: mpi_enc_test: 0x35b60 encoded frame 25292 size 14     
mpp[1966]: mpi_enc_test: 0x35b60 encoded frame 25293 size 14     
mpp[1966]: mpi_enc_test: 0x35b60 found last frame. feof 1
mpp[1966]: mpi_enc_test: 0x35b60 encoded frame 25294 size 0      
mpp[1966]: mpi_enc_test: 0x35b60 found last packet
mpp[1966]: mpi_enc_test: 0x35b60 mpi_enc_test success total frame 25295 bps 147396


# 将YUV420P的raw data视频文件编码成jpeg图片,输入图像颜色选择YUV420SP, NV12 格式
# 默认编码一帧,如果编码多帧则会叠加到同一张图片,size增大
$ ./mpi_enc_test -i test.yuv  -o output.jpeg  -w 160 -h 128 -f 0 -t 8 -n 1
mpp[2417]: mpi_enc_utils: cmd parse result:
mpp[2417]: mpi_enc_utils: input  file name: test.yuv
mpp[2417]: mpi_enc_utils: output file name: output.jpeg
mpp[2417]: mpi_enc_utils: width      : 160
mpp[2417]: mpi_enc_utils: height     : 128
mpp[2417]: mpi_enc_utils: format     : 4
mpp[2417]: mpi_enc_utils: type       : 8
mpp[2417]: mpi_enc_test: mpi_enc_test start
mpp[2417]: mpi_enc_test: jpege default encode only one frame. Use -n [num] for rc case
mpp[2417]: mpp_rt: NOT found ion allocator
mpp[2417]: mpp_rt: found drm allocator
mpp[2417]: mpp_info: mpp version: a75c5ed author: Herman Chen    2020-11-06 [legacy]: Remove vpu dependence on mpp_service cmd
mpp[2417]: mpi_enc_test: 0x35b60 mpi_enc_test encoder test start w 160 h 128 type 8
mpp[2417]: mpi_enc_test: 0x35b60 encoded frame 0    size 4149   
mpp[2417]: mpi_enc_test: 0x35b60 encode max 1 frames
mpp[2417]: mpi_enc_test: 0x35b60 mpi_enc_test success total frame 1 bps 995760

5.视频文件比较

$ sudo apt-get install mediainfo

# 原始测试h264视频文件
$ mediainfo test.h264 
General
Complete name                            : test.h264
Format                                   : AVC
Format/Info                              : Advanced Video Codec
File size                                : 2.89 MiB

Video
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : Main@L5.1
Format settings                          : CABAC / 1 Ref Frames
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 1 frame
Width                                    : 160 pixels
Height                                   : 128 pixels
Display aspect ratio                     : 5:4
Frame rate                               : 29.970 (29970/1000) FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressive
$ du -h test.h264 
2.9M    test.h264

# h264视频文件解码得到的yuv raw data文件
$ mediainfo test.yuv 
General
Complete name                            : test.yuv
File size                                : 211 MiB  # raw data数据比h264编码的数据大72倍,所以网络传输时,编码是很有必要的

# yuv raw data文件再次编码得到的h264视频文件
$ mediainfo output.h264 
General
Complete name                            : output.h264
Format                                   : AVC
Format/Info                              : Advanced Video Codec
File size                                : 2.14 MiB

Video
Format                                   : AVC
Format/Info                              : Advanced Video Codec
Format profile                           : High@L4
Format settings                          : CABAC / 1 Ref Frames
Format settings, CABAC                   : Yes
Format settings, ReFrames                : 1 frame
Format settings, GOP                     : M=1, N=60
Width                                    : 160 pixels
Height                                   : 128 pixels
Display aspect ratio                     : 5:4
Frame rate                               : 30.000 FPS
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Scan type                                : Progressiv

# yuv raw data文件再次编码得到的jpeg图片
$ mediainfo output.jpeg 
General
Complete name                            : output.jpeg
Format                                   : JPEG
File size                                : 4.05 KiB

Image   # 是一张图片
Format                                   : JPEG
Width                                    : 160 pixels
Height                                   : 128 pixels
Color space                              : YUV
Chroma subsampling                       : 4:2:0
Bit depth                                : 8 bits
Compression mode                         : Lossy
Stream size                              : 4.05 KiB (100%)

# 播放H264视频
$ ffplay -i test.h264

# 播放yuv raw data video
$ ffplay -f rawvideo -pixel_format yuv420p -video_size 160x128 test.yuv

# 播放编码得到的H264视频
$ ffplay -i output.h264

# 打开jpeg图片
$ ffplay -i output.jpg
  • h264视频文件解码得到yuv raw data文件,再次编码得到的h264视频文件,两者视频内容一致。
  • ffplay播放raw data video看到的是黑白视频,可以使用yuvplayer.exe,选择YUV420SP, NV12颜色格式,就可以看到彩色视频。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容