211 Star 1.1K Fork 975

Ascend/samples

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

readme

本样例为大家学习昇腾软件栈提供参考,非商业目的!

本样例适配5.0.3及以上版本,支持产品为Atlas 推理系列产品(Ascend 310P处理器)、Atlas 200/500 A2推理产品。

功能描述

DVPP中的VDEC功能模块,实现H264码流格式的视频解码。

原理介绍

样例中的关键接口调用流程如下:

输入图片说明

目录结构

├──————CMakeLists.txt            // 编译脚本
├──————src/VdecDemo.cpp          // 示例代码文件
├──————src/Vdec.cpp              // 示例代码文件
├──————src/Vdec.h                // 头文件

环境要求

  • 操作系统及架构:Ubuntu 18.04 x86_64、Ubuntu 18.04 aarch64、EulerOS aarch64

  • 编译器:g++ 或 aarch64-linux-gnu-g++

  • 芯片:Atlas 推理系列产品(Ascend 310P处理器)、Atlas 200/500 A2推理产品。

  • 已完成昇腾AI软件栈在开发环境、运行环境上的部署。

准备测试数据

请单击以下链接,获取该样例的测试图片数据。

dvpp_vdec_h264_1frame_bp_51_1920x1080.h264

编译运行

  1. 以运行用户登录开发环境,编译代码。此时存在以下两种情况:

    1. 当开发环境与运行环境的操作系统架构相同时,例如两者都是X86架构,或者都是AArch64架构,此时编译流程参考如下:

      1. 设置环境变量。

        如下示例,$HOME/Ascend表示编译环境runtime标准形态安装包的安装路径,latest对应安装包版本号,请根据实际情况替换。

        export DDK_PATH=$HOME/Ascend/latest
        export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub/
        
      2. 切换到vdec_sample目录,依次执行如下命令执行编译。

        mkdir build
        cd build
        cmake .. -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE
        make
        

        在“vdec_sample/build/“目录下会生成可执行程序vdec_demo。

    2. 当开发环境与运行环境的操作系统架构不同时,例如开发环境是X86架构、运行环境是AArch64架构,此时涉及交叉编译,需要在开发环境安装包含AArch64工具链的软件包,并将相关环境变量指向AArch64版本路径,具体编译流程参考如下:

      1. 提前在x86_64编译环境安装x86_64版本的CANN-toolkit包

      2. 设置环境变量。

        如下示例,$HOME/Ascend表示编译环境runtime标准形态安装包的安装路径,latest对应安装包版本号,请根据实际情况替换。

        export DDK_PATH=$HOME/Ascend/latest
        export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub/aarch64
        
      3. 切换到vdec_sample目录,依次执行如下命令执行编译。

        mkdir build
        cd build
        cmake .. -DCMAKE_CXX_COMPILER=$HOME/Ascend/latest/toolkit/toolchain/hcc/bin/aarch64-target-linux-gnu-g++ -DCMAKE_SKIP_RPATH=TRUE
        make
        

        在“vdec_sample/build/“目录下会生成可执行程序vdec_demo。

  2. 以运行用户将开发环境的“vdec_sample/build“目录下的可执行程序vdec_demo以及准备测试数据中测试数据拷贝到运行环境(Host)的同一目录下,例如“$HOME/dvpp/vdec_sample“。

  3. 运行应用。

    1. 切换到可执行文件vdec_demo所在的目录,例如“$HOME/dvpp/vdec_sample“,给该目录下的vdec_demo文件加执行权限。

      chmod +x vdec_demo
      
    2. 设置环境变量。“$HOME/Ascend“表示runtime标准形态安装包的安装路径,请根据实际情况替换。

      export LD_LIBRARY_PATH=$HOME/Ascend/runtime/lib64
      
    3. 运行应用。

      运行可执行文件的命令示例及说明请参见单路H264码流解码~单路H264码流解码+缩放

      使用demo进行性能测试时不能保存解码结果,需要配置--write_file 0。使用demo进行多路性能测试时,为了多路同时并发,需要设置启动延迟时间--delay_time 20,以保证码流发送线程在同一时刻开始发送码流。

      运行可执行文件的参数说明如下所示:

      • img_height:输入视频的高度。默认值为2160。取值范围[128, 4096]。
        • in_image_file:输入图像文件路径,包含文件名。默认值为“infile”。
        • in_format:输入码流的格式。
          • 默认值为0:0:h264格式的码流。
          • 1:h265格式的码流。
        • in_bitwidth:码流的位宽。默认值为8。
          • 8:8bit码流。
          • 10:10bit码流。
      • chn_num:创建解码通道的数目,默认值为1。取值范围[1, 96]。
        • out_width:输出图像宽度。支持缩放,0表示不缩放原图输出,默认值为0。取值范围[10, 4096]。
        • out_height:输出图像高度。支持缩放,0表示不缩放原图输出,默认值为0。取值范围[6, 4096]。
        • out_image_file:输出图像文件的路径,包含文件名。默认值为“outfile”。
        • out_format:输出图像的格式。默认值为0。
          • 0:YUV420SP
          • 1:YVU420SP
          • 2:RGB888
        • 3:BGR888
        • width_stride:输出内存宽Stride,要求16对齐,其中RGB888/BGR888最小width_stride = AlignUp(out_width, 16) * 3。默认值为4096。
        • height_stride:输出内存高Stride,YUV420SP/YVU420SP格式要求2对齐,默认值为4096。
      • ref_frame_num:参考帧个数。
        • dis_frame_num:显示帧个数。
        • write_file:是否保存输出解码结果:
          • 1:保存
          • 0:不保存
        • output_order:解码图像输出顺序。默认值为0。
          • 0:显示序
          • 1:解码序
        • send_times:输入码流循环发送次数。默认值为1,设置0表示一直循环。
        • send_interval:码流每帧发送时间间隔,单位us。默认值为0。
        • delay_time:码流发送线程启动发送码流的时延,单位s,默认值为1。
        • alloc_num:每路解码的输出内存预申请个数,默认值为20。
        • start_chn:多路解码起始通道号,默认值为0。
        • render:抽帧间隔,0表示每帧都进行后处理,默认值为0。
        • device_id:设备id,默认值为0。

单路H264码流解码

./vdec_demo --in_image_file ./dvpp_vdec_h264_1frame_bp_51_1920x1080.h264 --img_width 1920 --img_height 1080 --in_format 0 --in_bitwidth 8 --chn_num 1 --out_width 1920 --out_height 1080 --width_stride 1920 --height_stride 1080 --out_format 0 --out_image_file ./yuv_1920x1080_1frames_h264 --ref_frame_num 5 --dis_frame_num 3 --write_file 1
  • 示例描述:本命令用于调用VDEC解码h264格式的码流,得到YUV420SP格式图像。
  • 输入视频:宽1920像素、高1080像素、名称为“dvpp_vdec_h264_1frame_bp_51_1920x1080.h264”的码流。
  • 输出图像:宽1920像素、高1080像素、格式为YUV420SP的图像。

16路H264码流解码+输出RGB888格式图片

./vdec_demo --in_image_file ./dvpp_vdec_h264_1frame_bp_51_1920x1080.h264 --img_width 1920 --img_height 1080 --in_format 0 --in_bitwidth 8 --chn_num 16 --out_width 1920 --out_height 1080 --width_stride 5760 --height_stride 1080 --out_format 2 --out_image_file ./yuv_1920x1080_1frames_h264 --ref_frame_num 5 --dis_frame_num 3 --write_file 1
  • 示例描述:本命令用于16路调用VDEC解码h264格式的码流,得到RGB888格式图像。
  • 输入视频:宽1920像素、高1080像素、名称为“dvpp_vdec_h264_1frame_bp_51_1920x1080.h264”的码流。
  • 输出图像:宽1920像素、高1080像素、格式为RGB888的图像。

单路H264码流解码+缩放

./vdec_demo --in_image_file ./dvpp_vdec_h264_1frame_bp_51_1920x1080.h264 --img_width 1920 --img_height 1080 --in_format 0 --in_bitwidth 8 --chn_num 1 --out_width 128 --out_height 128 --width_stride 128 --height_stride 128 --out_format 0 --out_image_file ./yuv_1920x1080_1frames_h264 --ref_frame_num 5 --dis_frame_num 3 --write_file 1
  • 示例描述:本命令用于调用VDEC解码h264格式的码流,并进行缩放得到YUV420SP格式图像。
  • 输入视频:宽1920像素、高1080像素、名称为“dvpp_vdec_h264_1frame_bp_51_1920x1080.h264”的码流。
  • 输出图像:宽128像素、高128像素、格式为YUV420SP的图像。
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/ascend/samples.git
git@gitee.com:ascend/samples.git
ascend
samples
samples
master

搜索帮助