任务

  • 晶视-1838的概述和系统控制

  • 视频解码

  • 图像处理(格式转换和缩放)

  • 图片编码成jpeg格式并保存

  • 视频编码(未完成)

  • 推理


晶视-1838的概述和系统控制

概述

  • CVITEK 所提供的多媒体软件架构(Multimedia Framework, 简称 MMF),用以缩短应用程序开发所需的时间。 此架构屏蔽了芯片端的复杂底层设计和差异,对应用程序提供统一且便捷的MMF Programming Interface编程接口。 MMF 包含了以下功能:
    • ISP 影像前处理(包含 HDR、去噪、边缘锐化等)
    • 输入影像撷取及输出
    • 图像几何校正
    • H.265/ H.264/JPEG 编解码
    • 音频撷取及输出
    • 音频编解码等
  • 定义及缩写
    • MMF – Multimedia Framework – 多媒体软件架构
    • ISP – Image Signal Processor – 影像处理处理器
    • VI – Video Input – 影像输入
    • VPSS – Video Process Sub-System – 影像处理子系统
    • VO – Video Output – 影像输出
    • VDEC – Video Decoder – 影像解码
    • VENC – Video Encoder – 影像编码
    • MIPI – Mobile Industry Processor Interface – 移动行业处理器接口
  • 内部主要处理流程:
    • VI 捕捉视频图像,可对其做剪切、影像优化等处理后,再将图像数据传递给VPSS 处理
    • VDEC 将编码后的码流解码,再将图像数据传递给 VPSS 处理
    • VPSS 接收 VI 或 VDEC 发送的图像,并可同时输出多个不同分辨率的图像,以供预览、编码或抓拍
    • VO 接收 VPSS 处理后的图像,并根据设定的时序输出到显示设备
    • REGION 可以将用户所指定的位图(Bitmap)作为 OSD 叠加到图像数据上
  • 系统绑定
    • SDK 提供系统绑定接口(CVI_SYS_Bind) ,即通过绑定数据源和数据接收者来建立两者之间的关联关系。 绑定后,数据源生成的数据将自动发送给接收者
    • 一个数据源可以绑定多个数据接收者,若数据源未绑定,则最终会自动返回视频内存区块池
    • 同一个数据接收者只能绑定一个数据源
    • VI 和 VDEC 作为数据源,是以通道为发送者,向其他模块发送数据,用户将设备号置为 0,SDK 不检查输入的设备号
    • VPSS 作为数据接收者时,是以设备(GROUP)为接收者,接收其他模块发来的数据,用户将通道号置为 0
    • 其他情况均需指定设备号和通道号
  • 智能盒子上的视频文件相关应用
    • 存储介质 –》 VDEC –》 VPSS –》 VENC –》 压缩码流或存储介质
    • 存储介质或压缩码流 –》 VDEC –》 VPSS –》VO –》 显示屏

系统控制

  • 在进行视频编解码的工作之前,需要先处理系统资源,即:系统资源的初始化和去初始化, VB资源的初始化和去初始化

  • 首先对系统和VB资源进行初始化,所调用的接口有
    • CVI_SYS_Exit();
    • CVI_VB_Exit();
    • CVI_VB_SetConfig();
    • CVI_VB_Init();
    • CVI_SYS_Init();
  • 相对应的在程序结尾对系统和VB资源进行去初始化,所调用的接口有
    • CVI_SYS_Exit();
    • CVI_VB_ExitModCommPool();
    • CVI_VB_Exit();
  • 注意:
    • 对VB资源的初始化的步骤很关键,因为整个系统框架都是依赖于视频区块池的,在视频解码时,需要申请和使用视频区块池,在视频编码时,也需要申请和使用视频区块池
  • 遗留问题:
    • 视频编码h.264 – 有可能与视频区块池的创建和删除有关系

视频解码

  • 获取和设置解码模式
    • CVI_VDEC_GetModParam
    • CVI_VDEC_SetModParam
  • 为解码通道属性结构体赋予初值
    • VDEC_CHN_ATTR_S
      • enType – 解码协议类型枚举值 Video Codec 常使用枚举:PT_JPEG/ PT_H264/PT_H265/ PT_MJPEG
      • enMode – 码流发送方式。目前仅支持 VIDEO_MODE_FRAME
      • u32PicWidth – 通道支持的解码图像最大宽(以像素为单位)
      • u32PicHeight – 通道支持的解码图像最大高(以像素为单位)
      • u32StreamBufSize – 码流缓存的大小。(u32StreamBufSize = u32Width * u32Height)
      • u32FrameBufSize – 解码图像帧存 buffer 大小。(随 enType 而异)
      • u32FrameBufCnt – 解码图像帧存个数。
      • stVdecVideoAttr – 视频(H.264/H.265)解码通道属性
  • 创建解码通道
    • CVI_VDEC_CreateChn
  • 创建并连接 VB Pool
    • CVI_VB_CreatePool – 创建
    • 创建VB Pool,需要计算大小,这个大小存放在一个结构体中 – VB_POOL_CONFIG_S
      • u32BlkSize – 视频区块大小
      • u32BlkCnt – 视频区块池内的区块数
      • enRemapMode – 区块的 memory-map 模式
    • 计算大小是调用cvi_buffer.h文件中的 VDEC_GetPicBufferSize 函数
    • CVI_VDEC_AttachVbPool – 连接
  • 获取并设置通道参数
    • CVI_VDEC_GetChnParam
    • 定义解码通道参数的结构体 – VDEC_CHN_PARAM_S
      • enType – 常使用枚举:PT_JPEG/PT_H264/PT_H265/PT_MJPEG
      • u32DisplayFrameNum – 解码缓存图像的最小帧数
      • stVdecVideoParam – 视频(H.264/H.265)解码高级参数
      • stVdecPictureParam – 图片(JPEG/MJPEG)解码高级参数
    • CVI_VDEC_SetChnParam
  • 开始接收码流
    • CVI_VDEC_StartRecvStream
  • 发送一个码流
    • CVI_VDEC_SendStream
    • 定义视频解码的码流结构体 VDEC_STREAM_S
      • u32Len – 码流包的长度。
      • u64PTS – 码流包的时间戳
      • bEndOfFrame – 当前帧是否结束
      • bEndOfStream – 是否发完所有码流
      • pu8Addr – 码流包的地址
      • bDisplay – 当前帧是否输出显示
  • 接收一个码流
    • CVI_VDEC_GetFrame

图像处理(格式转换和缩放)

  • 设置并创建Group
    • CVI_VPSS_CreateGrp
    • 定义VPSS Group属性结构体 – VPSS_GRP_ATTR_S
      • u32MaxW – 输入图像宽度。静态属性,创建 Group 时设定,不可更改
      • u32MaxH – 输入图像高度。静态属性,创建 Group 时设定,不可更改
      • enPixelFormat – 输入图像像素格式。静态属性,创建 Group 时设定,不可更改
      • stFrameRate – 组帧率。
      • u8VpssDev – 可指定此 VPSS 组要使用哪个硬件工作
  • 设置VPSS通道属性
    • CVI_VPSS_SetChnAttr
    • 定义VPSS物理通道属性 – VPSS_CHN_ATTR_S
      • u32Width – 目标图像宽度
      • u32Height – 目标图像高度
      • enVideoFormat – 目标图像视频格式。
      • enPixelFormat – 目标图像像素格式。
      • stFrameRate – 帧率控制信息。
      • bMirror – 水平镜像使能。
      • bFlip – 垂直翻转使能。
      • u32Depth – 用户获取通道图像的队列长度。
      • stAspectRatio – 幅形比参数。
      • stNormalize – Normalize 以便加速后续 TPU 的运作
  • 启动VPSS通道
    • CVI_VPSS_EnableChn
  • 启用VPSS Group
    • CVI_VPSS_StartGrp
  • 向VPSS发送解码出来的数据帧
    • CVI_VPSS_SendFrame
  • 从通道获取一帧处理完成的图像
    • CVI_VPSS_GetChnFrame
  • 保存图片到本地(png格式)
    • CVI_IVE_CreateHandle
    • CVI_SYS_MmapCache
    • CVI_IVE_VideoFrameInfo2Image
    • CVI_IVE_WriteImage
    • CVI_SYS_Munmap
    • CVI_SYS_FreeI
  • 释放一帧通道处理完成的图像
    • CVI_VPSS_ReleaseChnFrame

图片编码成jpeg格式并保存

  • 设置编码模式
    • CVI_VENC_SetModParam
  • 设置通道属性并创建通道
    • 编码通道属性结构体 – VENC_CHN_ATTR_S
      • stVencAttr – 编码属性
        • enType – 负载类型
        • u32MaxPicWidth – 影像最大编码宽度
        • u32MaxPicHeight – 影像最大编码高度
        • u32BufSize – Encoded bitstream buffer 大小
        • bByFrame – Encoded bitstream 收集方式 CVI_TRUE:以帧为主 CVI_FALSE:以封包为主
        • u32PicWidth – 编码影像宽度
        • u32PicHeight – 编码影像高度
        • stAttrJpege – JPEG Encoder 属性
      • stRcAtt – 码率控制器属性
      • stGopAttr – Gop Mode 类型的结构体
  • 设置通道参数
    • 定义编码通道参数的结构体 – VENC_CHN_PARAM_S
      • bColor2Grey – 开启或关闭一个通道的彩转灰功能
      • u32Priority – 编码通道优先级参数。
      • u32MaxStrmCnt – 最大码流缓存帧数。
      • u32PollWakeUpFrmCnt – 当通道使用超时或阻塞获取码流,编码指定的 帧u32PollWakeUpFrmCnt 之后唤醒阻塞接口。 取值范围:大于 0默认值:1
      • stCropCfg – 通道截取(Crop)参数
      • stFrameRate – 通道帧率控制参数
    • CVI_VENC_SetChnParam
  • 开启编码通道接收输入图像
    • CVI_VENC_StartRecvFrame
  • 发送图像进行编码
    • CVI_VENC_SendFrame
  • 获取编码的码流
    • CVI_VENC_GetStream
    • 定义帧码流类型结构体 VENC_STREAM_S
      • pstPack – 码流包结构体
        • u64PhyAddr – 物理地址
        • pu8Addr – 逻辑地址
        • u32Len – 码流包长度。
        • DataType – 码流类型,支持 H.264/JPEG/ H.265 协议类型的数据包
        • bFrameEnd – 帧结束标识。CVI_TRUE:该码流包是该帧的最后一个包。 CVI_FALSE:该码流包不是该帧的最后一个包。
        • u32Offset – 码流包中有效数据与码流包首地址 pu8Addr 的偏移。
        • u64PTS – 时间戳。单位:us
        • u32DataNum – 前码流包(当前包的类型由 DataType 指定)数据中包含其他类型码流包的个数
        • stPackInfo[8] – 当前码流包数据中包含其他类型码流包数据信息
      • u32PackCount – 码流包数量
    • 注意:
      • 获取到的码流数据需要一个内存区域存放,这个内存区域需要手动申请,通过CVI_VENC_QueryStatus接口查询当前帧编码出来的包数,确定所需内存区域大小,通过malloc申请
  • 停止编码通道接收输入图像
    • CVI_VENC_StopRecvFrame
  • 保存文件到本地
    • fopen
    • fwrite
    • 使用两个函数,在test中存在
  • 释放码流缓存
    • CVI _ VENC_ReleaseStream

视频编码

  • 设置编码模式
    • VENC_PARAM_MOD_S (参考图片编码)
    • CVI_VENC_SetModParam
  • 设置通道属性并创建通道
    • 编码成视频需要设置通道属性和码率属性,因为视频编码通常会与 RC 同时运作,如果是图片编码 (如 JPEG),因为只有单张图片,不会需要此模块
  • 设置VB Pool属性并创建VB Pool

  • 视频编码失败的原因大概率在初始化并创建VB Pool步骤,在系统资源初始化时,会对VB Pool配置并初始化,不确定是否影响在此处VB Pool的创建,另外,样例中是通过编码和图像处理子系统绑定来进行视频编码的,且群里说的按照绑定的操作,进行初始化,这个方法还没有尝试,可能成功,是一个解决问题的方向

  • 另一个可能出错的原因在将解码出来的码流写入到文件中,当时实验时,是按照编码jpeg图像的思路,只不过将关闭文件的步骤放在了最后,但这样可能会出现一直从文件开头开始写数据,查阅样例代码,有使用标准库 fseek ftell rewind方法,有可能是每一次编码成码流包之后,写入的文件位置不对,此处也是一个解决问题的方向

  • 最后一个是在设置码率属性方面,所设置的属性不了解,样例代码中也没有给出明确的测试数值,都是依照自己的估计设定的,很有可能出错,此处也是一个解决问题的方向

推理

  • 此处没有接触,不予记录

任务测试

  • 常用命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
      cp -r ../ubuntu1604/CV183x .
    
      ./configure.sh -c CV183X -p aarch64 -g
    
      bash ssh-1838.sh
    
      scp user@192.167.15.58:/home/user/workspace/vca_learn-workspace/video_process/build/test.exe ./test_enc.exe
    
      export LD_LIBRARY_PATH=/data/picture/VideoProcess/3party/lib:/data/picture/VideoProcess/lib:/mnt/flash/Server/lib/:$LD_LIBRARY_PATH
    
      gdbserver :9999 test_enc.exe test_ffmpeg --src MAH00433.mp4
    
      scp -r imgs/ user@192.167.15.58:/tmp/
    
  • 参考例子的编码部分

    • sample_venc_lib.c : 1387 non-bind mode, source frame either comes from file or VPSS
    • sample_multivenc.c : 437 encode_loop

遇到的基础概念:

  • 编码,就是输入一个数据帧,然后将该帧编码成数据包

  • 通过接口使用物理设备,
  • 每一个物理设备都有一个设备号,一一对应,指定哪一个设备号就是用哪一个设备

  • 编码器,解码器 工作原理和底层实现
    • 一直工作,关于流,没有停止,是一个个数据,只是编译器定义某一段为一帧或一个数据包

任务关键点

  • 经过测试,
    • 接收解码出来,不经过VPPS处理的数据帧,编码出来的图片是正常的
    • 接收解码出来,再经过VPPS处理的数据帧(直接将从VPPS处理通道中取出来的数据帧发送到编码通道),编码出来的图片则是不正常的
  • 大致结论(V1.0):
    • 在例子中对于接收编码的数据,有两种模式:绑定模式和非绑定模式
      • 绑定模式:编码器和视频处理子系统(VPSS)绑定,需要取的数据帧是在VPSS通道中直接送入到编码通道中
      • 非绑定模式:不绑定VPSS,直接将VIDEO_FRAME_INFO_S结构体发送到通道中
    • 之前一直出错的原因在于,对于VPSS处理获取到的数据帧,是直接送到编码通道中的,而不是通过绑定的方式,所以晶视已经存在编码器和视频处理子系统设备绑定,可能就不支持直接将VPSS处理后生成的数据帧手动发送到编码器中
  • 结论(V2.0):
    • 文档有说明,JPEG输入源所支持的格式为:YUV422 YUV420,输入的尺寸和编码器定义要接收的图片尺寸应该相同
    • 错误的原因是:
      • 经过VPSS处理后,设置的图片格式为RGB,编码器不支持的
      • 经过VPSS处理后,图片的尺寸变成了手动设置的尺寸大小,而编码器输入的尺寸还是按照原图的尺寸
  • 最终结论(V1.0)
    • JPEG编码输入的图像格式只能是:YUV420 或 YUV422
    • JPEG编码输入的图像尺寸和编码器设置接收的图像尺寸要相同

结构体

  • VDEC_CHN_ATTR_S
    • MMF文档:273页

系统控制

  • 系统控制根据各个芯片的特性,完成硬件各个部件的复位、基本初始化工作,同时负责完成MMF系统各个功能模块的初始化、控制、去初始化以及管理MMF系统各个功能模块的工作状态、提供大块物理内存管理等功能。

  • 应用程序启动 MMF 功能前,首先必须完成 MMF 系统初始化工作。 同理,应用程序退出 MMF 功能后,也要完成 MMF 系统去初始化工作,释放资源。

  • 定义及缩写
    • MMF(Multimedia Framework 多媒体软件架构)
    • VB(Video Buffer 影像内存区块)
    • VI(Video Input 图像输入)
    • VI_CAP(Video Input Capture 图像输入撷取)
    • VI_PROC(Video Input Process 图像输入处理)
    • VPSS(Video Process Sub-System 图像处理子系统)
    • VO(Video Output 图像输出)
    • VDEC(Video Decoder 图像解码)
    • VENC(Video Encoder 影像编码)
    • AI(Audio Input 音频输入)
    • AO(Audio Output 音频输出)
    • ADEC(Audio Decoder 音频解码)
    • AENC(Audio Encoder 音频编码)
  • 视频内存区块池(配置规则
    • 视频内存区块池主要向各模块(VI/VPSS/VO/VDEC/VENC/GDC…)提供大块物理内存管理功能,负责内存的取得、分配和回收,让物理内存资源在各个媒体处理模块中分享使用,并免除不必要的复制动作。
    • 多组大小相同、物理地址连续的区块组成一个视频区块池。 必须在系统初始化之前配置公共视频区块池。 根据所需功能的不同,公共区块池的数量、区块的大小和数量应对应有所增减
    • 视频区块池所需的数量,所需考虑的点如下:
      • 每多一个 channel 就需要增加两个(ping-pong buffer)。
      • VO 为条件一的例外,是根据 DisplayBufLen 来决定,最小为 3。
      • 若 channel 的 u32Depth 不为 0,则需要增加 u32Depth 的数量
      • 每增加一个 GDC 的功能(fisheye, rotation, etc),就需要加一个。
    • 在内存空间足够的情况下,可以取最大的空间来建立一个公共视频区块池即可; 若是要精简内存的使用量,建议使用多个不同大小的公共视频区块池
  • 所有的视频处理通道都可以从公共视频区块池中获取视频区块用于保存采集的图像

  • 系统绑定
    • SDK 提供系统绑定接口(CVI_SYS_Bind) ,即通过绑定数据源和数据接收者来建立两者之间的关联关系。
    • 绑定后,数据源生成的数据将自动发送给接收者
    • 一个数据源可以绑定多个数据接收者,若数据源未绑定,则最终会自动返回视频内存区块池。
    • 目前支持的绑定关系:
      • VI(数据源)
        • 数据接收者
        • VPSS
        • VENC
        • VO
      • VPSS(数据源)
        • 数据接收者
        • VO
        • VENC
        • VPSS
      • VDEC(数据源)
        • 数据接收者
        • VPSS
        • VENC
        • VO
      • AI(数据源)
        • 数据接收者
        • AENC
        • AO
      • ADEC(数据源)
        • 数据接收者
        • AO

CVI_SYS_Init

  • 原型:CVI_S32 CVI_SYS_Init(CVI_VOID);
  • 功能:初始化系统。 包括视频输入输出、视频编解码、视频叠加区域、视频处理、音频输入输出等模块都会被初始化 。
  • 参数:
  • 返回值:
    • 成功 – 0
    • 失败 – 非0,参见错误码
  • 需求:
    • 头文件:cvi_sys.h, cvi_comm_sys.h
    • 库文件:libsys.a
  • 注意:
    • 由于 MMF 系统的正常运行依赖于区块池,因此需要先调用 CVI_VB_Init 初始化区块池,再初始化 MMF 系统,否则会导致功能运行异常。
    • 在未调用去初始化前,如果多次初始化,仍会返回成功,但实际上系统不会对MMF 的运行状态有任何影响

CVI_SYS_Exit

  • 原型:CVI_S32 CVI_SYS_Exit(CVI_VOID);
  • 功能:去初始化系统。 包括视频输入输出、视频编解码、视频叠加区域、视频处理、音频输入输出等模块都会被销毁或禁用 。
  • 参数:
  • 返回值:
    • 成功 – 0
    • 失败 – 非0,参见错误码
  • 需求:
    • 头文件:cvi_sys.h, cvi_comm_sys.h
    • 库文件:libsys.a
  • 注意:
    • 去初始化时,如果有阻塞在 MMF 上的用户进程,则去初始化会失败。
    • 如果所有阻塞在 MMF 上的调用都返回,则可以成功去初始化

CVI_VB_Init

  • 原型:CVI_S32 CVI_VB_Init(CVI_VOID);
  • 功能:初始化 MMF 视频区块池。
  • 参数:
  • 返回值:
    • 成功 – 0
    • 失败 – 非0,参见错误码
  • 需求:
    • 头文件:cvi_sys.h, cvi_comm_sys.h
    • 库文件:libsys.a
  • 注意:
    • 必须先调用 CVI_VB_SetConfig 配置配置区块池属性,再初始化,否则初始化会失败
    • 如果多次初始化,仍会返回成功,但实际上系统不会对MMF 的运行状态有任何影响。

CVI_VB_Exit

  • 原型:CVI_S32 CVI_VB_Exit(CVI_VOID);
  • 功能:去初始化 MMF 视频区块池
  • 参数:
  • 返回值:
    • 成功 – 0
    • 失败 – 非0,参见错误码
  • 需求:
    • 头文件:cvi_sys.h, cvi_comm_sys.h
    • 库文件:libsys.a
  • 注意:
    • 必须先调用 CVI_SYS_Exit 去初始化 MMF 系统,再去初始化区块池,否则返回失败
    • 可以反复去初始化,不返回失败

CVI_VB_SetConfig

  • 原型:CVI_S32 CVI_VB_SetConfig(const VB_CONFIG_S *pstVbConfig);
  • 功能:设置 MMF 视频区块池属性
  • 参数:
    • pstVbConfig – 视频区块池属性指针 – 输入
  • 返回值:
    • 成功 – 0
    • 失败 – 非0,参见错误码
  • 需求:
    • 头文件:cvi_sys.h, cvi_comm_sys.h
    • 库文件:libsys.a
  • 注意:
    • 只能在系统处于未初始化的状态下,才可以设置区块池属性,否则会返回失败
    • video buffer 根据不同的应用场景需要不同的配置。 配置规则参见视频区块池(配置规则)
    • 公共区块池中每个区块的大小应根据当前图像像素格式以及图像是否压缩而有所不同。 具体分配大小请参考 VB_CONFIG_S 结构体中的描述。

CVI_VB_GetConfig

  • 原型:CVI_S32 CVI_VB_GetConfig(VB_CONFIG_S *pstVbConfig);
  • 功能:获取 MMF 视频区块池属性
  • 参数:
    • pstVbConfig – 视频区块池属性指针 – 输出
  • 返回值:
    • 成功 – 0
    • 失败 – 非0,参见错误码
  • 需求:
    • 头文件:cvi_sys.h, cvi_comm_sys.h
    • 库文件:libsys.a
  • 注意:
    • 必须先调用 CVI_VB_SetConfig 设置MMF视频区块池属性

视频解码(VDEC)

概述

  • 文档256页

  • VDEC模块提供驱动视频解码硬件工作的对应接口,实现视频解码功能

  • 定义及缩写
    • VDEC – Video Decoder,视频解码器
    • Output Order – 输出顺序
    • Decoding Order – 解码顺序
    • Displayer Order – 播放顺序
    • Frame – 帧
    • Stream – 码流
  • 图像输出方式
    • 按照H.264/H.265视频标准,输入的Stream经解码之后,输出的影像顺序未必等于输入的顺序,因此在播放时会分为Decoding order 和 Display order
      • Decoding order – 输出影像的顺序等于输入Stream的顺序
      • Display Order – 输出影像的顺序等于最后播放的顺序

CVI_VDEC_SetModParam

  • 原型:CVI_S32 CVI_VDEC_SetModParam(const VDEC_MOD_PARAM_S *pstModParam);
  • 功能:设置解码模式
  • 参数:
    • pstModParam – 解码模式参数结构体指针 – 输入
  • 返回值:
    • CVI_SUCCESS 成功
    • 非0 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意:
    • 这个接口和参数的结构体在文档中没有
    • 结构体:
      1
      2
      3
      4
      5
      6
      7
      8
      
        typedef struct _VDEC_MOD_PARAM_S 
        {
        	VB_SOURCE_E enVdecVBSource; /* RW, Range: [1, 3];  frame buffer mode  */
        	CVI_U32 u32MiniBufMode; /* RW, Range: [0, 1];  stream buffer mode */
        	CVI_U32 u32ParallelMode; /* RW, Range: [0, 1];  VDH working mode   */
        	VDEC_VIDEO_MOD_PARAM_S stVideoModParam;
        	VDEC_PICTURE_MOD_PARAM_S stPictureModParam;
        } VDEC_MOD_PARAM_S;
      
    • 目前能够使用的模式为:
      • stModParam.enVdecVBSource = VB_SOURCE_USER;

CVI_VDEC_GetModParam

  • 原型:CVI_S32 CVI_VDEC_GetModParam(VDEC_MOD_PARAM_S *pstModParam);
  • 功能:获取当前解码模式
  • 参数:
    • pstModParam – 解码模式参数结构体指针 – 输出
  • 返回值:
    • CVI_SUCCESS 成功
    • 非0 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意:
    • 这个接口和参数的结构体在文档中没有

CVI_VDEC_CreateChn

  • 原型:CVI_S32 CVI_VDEC_CreateChn(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr);
  • 功能:创建视频解码通道
  • 参数:
    • CVI_S32 – typedef int CVI_S32
    • VdChn – 输入, 视频解码通道号
    • pstAttr – 输入, 解码通道属性指针
  • 返回值:
    • CVI_SUCCESS 成功
    • 非0 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意
    • 系统内存不足时,返回HI_ERR_VDEC_NOMEM 错误码
    • 使用JPEG/MJPEG时,要在创建解码信道(通道)之前要先创建专属于VDEC的模块VB池,不同协议解码所需要的图像VB块大小不同,参考sample_vdec_lib.c内的vdecInitVBPool函数
    • H264 H265内核已经保留了memory, 所以不需要调用VB函数
  • 示例代码:
    • /sample/common/sample_common_vdec.c:720:

CVI_VDEC_DestoryChn

  • 原型:CVI_S32 CVI_VDEC_DestoryChn(VDEC_CHN VdChn);
  • 参数:
    • VdChn – 视频解码通道号 - 输入
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意
    • 销毁前必须保证通道已经创建,否则会返回通道未创建错误
    • 销毁前必须停止接收码流(或者尚未开始接收码流)否则返回错误

CVI_VDEC_GetChnAttr

  • 原型:CVI_S32 CVI_VDEC_GetChnAttr(VDEC_CHN VdChn, VDEC_CHN_ATTR_S *pstAttr)
  • 功能:获取视频解码通道属性
  • 参数:
    • VdChn – 视频解码通道号 – 输入
    • pstAttr – 解码通道属性指针 – 输出
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意
    • VDEC通道必须已经创建
    • 此函数通常在CVI_VDEC_SetChnAttr前使用,或者是在获取decoder frame之前调用,以确认通道正常
  • 举例
    • sample_common_vdec.c内的SAMPLE_COMM_VDEC-GetPic()函数(587)

CVI_VDEC_SetChnAttr

  • 原型:CVI_S32 CVI_VDEC_SetChnAttr(VDEC_CHN VdChn, const VDEC_CHN_ATTR_S *pstAttr);
  • 功能:设置视频解码通道属性
  • 参数:
    • VdChn – 视频解码通道号 – 输入
    • pstAttr – 解码通道属性指针 – 输入
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意:
    • VDEC通道必须已经创建
    • 切换通道属性之前必须先停止接收码流,否则返回错误

CVI_VDEC_StartRecvStream

  • 原型:CVI_S32 CVI_VDEC_StartRecvStream(VDEC_CHN VdChn);
  • 功能:解码器开始接收用户发送的码流
  • 参数
    • VdChn – 视频解码通道号 – 输入
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意
    • 启动接收码流前必须保证通道已经创建,否则会返回错误

CVI_VDEC_StopRecvStream

  • 原型:CVI_S32 CVI_VDEC_StopRecvStream(VDEC_CHN VdChn);
  • 功能:解码器停止接收用户发送的码流
  • 参数
    • VdChn – 视频解码通道号 – 输入
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意
    • 调用此接口,必须在CVI_VDEC_DestoryChn之前

CVI_VDEC_QueryStatus

  • 原型:CVI_S32 CVI_VDEC_QueryStatus(VDEC_CHN VdChn, VDEC_CHN_STATUS_S *pstStatus);
  • 功能:查询解码通道状态
  • 参数
    • VdChn – 视频解码通道号 – 输入
    • pstStatus – 视频解码通道状态结构体指针 – 输出
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意
    • 启动接收码流前必须保证通道已经创建,否则会返回错误
  • 参阅sample_common_vdec.c内的SAMPLE_COMM_VDEC_CmdCtrl用法

CVI_VDEC_SetChnParam

  • 原型:CVI_S32 CVI_VDEC_SetChnParam(VDEC_CHN VdChn, const VDEC_CHN_PARAM_S *pstPrarm);
  • 功能:设置解码通道参数
  • 参数
    • VdChn – 视频解码通道号 – 输入
    • pstParaqm – 通道参数 – 输入
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意
    • 启动接收码流前必须保证通道已经创建,否则会返回错误

CVI_VDEC_GetChnParam

  • 原型:CVI_S32 CVI_VDEC_GetChnParam(VDEC_CHN VdChn, const VDEC_CHN_PARAM_S *pstPrarm);
  • 功能:获取解码通道参数
  • 参数
    • VdChn – 视频解码通道号 – 输入
    • pstParaqm – 通道参数 – 输出
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意
    • 启动接收码流前必须保证通道已经创建,否则会返回错误

CVI_VDEC_SendStream

  • 原型:CVI_S32 CVI_VDEC_SendStream(VDEC_CHN VdChn, const VDEC_STREAM_S *pstStream, CVI_S32 s32MilliSec);
  • 功能:发送码流数据至视频解码通道
  • 参数:
    • VdChn – 视频解码通道号 – 输入
    • pstStream – 解码码流数据指针 – 输入
    • s32MilliSec – 送码流方式标志 – 输入
      • 取址范围: -1, 阻塞
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意
    • 发送数据前必须保证已经调用CVI_VDEC_CreateChn, CVI_VDEC_StartRecvStream
    • 此接口在mjpeg, jpeg译码状态下,送入长度0(pstStream->u32Len)会返回CVI_SUCCESS
    • 译码失败会回传错误码:ERR_CVI_VDEC_SEND_STREAM

CVI_VDEC_GetFrame

  • 原型:CVI_S32 CVI_VDEC_GetFrame(VDEC_CHN VdChn, VIDEO_FRAME_INFO_S *pstFrameInfo, CVI_S32 s32MilliSec);
  • 功能:获取视频解码通道的解码图像
  • 参数:
    • VdChn – 视频解码通道号 – 输入
    • s32MilliSec – 获取图像方式标志 – 输入
      • 取值范围: -1 , 阻塞
    • pstFrameInfo – 获取的解码图像信息 – 输出
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意
    • 启动接收码流前必须保证通道已经创建,否则会返回错误

CVI_VDEC_ReleaseFrame

  • 原型:CVI_S32 CVI_VDEC_ReleaseFrame(VDEC_CHN VdChn, const VIDEO_FRAME_INFO_S *pstFrameInfo);
  • 功能:释放视频解码通道的图像
  • 参数
    • VdChn – 视频解码通道号 – 输入
    • pstFrameInfo – 解码后的图像信息指针 – 输入
  • 返回值
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • cvi_vdec.h cvi_comm_video.h cvi_comm_vdec.h
    • libvdec.so / libvdec.a
  • 注意:
    • 此接口需要和CVI_VDEC_GetFrame配对使用,获取的数据应当在使用完之后立即释放,如果不立即释放,会导致解码过程阻塞等待资源
    • 释放的数据必须是CVI_VDEC_GetFrame从该通道获取的数据,不得对数据信息结构体进行任何修改
    • 释放视频解码通道的图像必须在通道销毁之前。

编码

概述

  • 文档:193页

  • 视频编码主要提供视频及时编码,将输入信号源影像经过标准影音编码器作压缩,降 低数据量,提供应用层影音服务

  • 目前有支持的输入源为:
    • 用户在 User Mode 自行输入的影像资料
    • 视频输入(VI)模块收到的影像直接发送到编码器
    • 视频输入(VI)模块收到的影像经视频处理子系统(VPSS)发送到编码器
  • 目前支持的视频标准为
    • JPEG
    • MJPEG
    • H.264
    • H.265
  • 定义及缩写
    • Bitrate – 比特率
    • Fixed QP – 固定 QP
    • Frame -- – 帧
    • Packet -- – 包
    • Frame Buffer – 帧存
    • Video Quality – 图像质量
    • MB Macroblcok – 宏块
    • RC Rate Control – 码率控制器RC Rate Control码率控制器
    • Encoded Bitstream – 编码流
    • VBR Variable Bitrate – 可变码率
    • CBR Constant Bitrate – 固定码率
    • QP Quantization Parameter – 量化参数
  • VENC 模块的输入为待编码的图像,输出为编码后的 Bitstream。 VENC 含有两个子模组,Receiver和Encoder。

  • Receiver
    • 接收影像的输入
  • Encoder
    • 将收到的影像进行图片及视频编码,转换成 Encoded Bitstream,目前支持的视频标准为
    • JPEG
      • 支持的图像格式为
      • YUV422
      • YUV420
    • MJPEG
      • 支持的图像格式和 JPEG 相同
    • H.264
      • 支持的图像格式为
      • YUV420
    • H.265
      • 支持的图像格式为
      • YUV420
  • 视频编码通道
    • 视频编码通道为视频编码的基本操作单元,内部主要包含VENC相关功能,通道相关设定。
    • 系统上可以有多个视频编码通道,各通道独立运作。
    • 各通道建立后,用户可按需求设置通道基本参数,如图像分辨率、编码 Bitrate、RC 机制… 等,相关的参数会对VENC初始化
  • 码率控制
    • RC 为 Encoder 中控制 Bitrate 和 Video Quality 的主要模块,主要藉由各视讯标准中的 QP 这个参数,进一步控制影像质量,
    • 当 QP 变大时,编码出来的资料量会变小,但 Video Quality 会变差;
    • 当 QP 变小时,编码出来的资料量会变大,但 VideoQuality 会变好
    • 视频编码通常会与 RC 同时运作,如果是图片编码 (如 JPEG),因为只有单张图片,不会需要此模块
  • Fixed QP
    • 在统计时间内,影像中的所有 MB 使用同一个 QP 值。
  • CBR
    • CBR(Constant Bit Rate)固定码率,动态控制 QP,使得 Encoded Bitstream 在设定的时间区间内,维持在想要的 bitrate。 主要的参数如下
    • u32StatTime Bitrate 统计时间
      • 单位时间为秒 (second),encoder 会在设定时间内统计 Bitrate 进而调整影像质量,符合想要的 Bitrate。 当此值愈小时,统计区间小,影像品值变化幅度会相对比较大,每一张 Frame 压缩完后,对接下来的压缩有较大的影响,视频质量比较不稳定。 此值大时,统计区间大,每一张 Frame 压缩完后的影响程度比较小,影像变化的幅度比较小,视频质量比较稳定。
  • VBR
    • VBR(Variable Bit Rate)可变码率,允许码率在设定的统计时间内,动态调整整体Bitrate,可使得影像质量相对稳定。
    • u32MaxBitRate 最大码率
      • 设定在统计时间内,最大可使用的码率
    • u32MinQp 最小码率
      • 设定最小可使用的 MB QP,限制影像的最佳品质,不会使用过高的 Bitrate
  • GOP 结构
    • NormalP 的 GOP 结构如下
      • IDR 帧出现周期为 u32Gop
    • SmartP 的 GOP 结构如下
      • VI(Virtual I Frame) 帧出现周期为 u32Gop, 该帧只向前参考邻近之 IDR 帧
      • IDR 帧出现周期为 u32BgInterval, 该 IDR 帧为长期参考帧
  • 编码码流帧配置模式
    • 压缩后的编码码流,使用CVI_VENC_GetStream取得Encoded Bitstream,相关资讯如下
    • u32PackCount
      • 此张 Frame 含有多少个 NAL packet,例如目前压缩格式为 H.264,第一张为 I frame, 此值会为 3 (含 SPS,PPS,1 Slice),第二张 Frame 为 1(含 1Slice)
    • pstPack
      • 根据 u32PackCount 的数量,会含有 pstPack[0] ~
  • NAL, 全称Network Abstract Layer,即网络抽象层
  • H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面(NAL)。

  • 网络抽象层面(Network Abstract Layer,NAL),负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输
    • H.264/AVC标准的特色是将网络提取层的概念涵盖进来,亦即以NAL封包为单位的方式来做为VCL编译码的运算单位,这样传输层拿到NAL封包之后不需要再进行切割,只需附加该传输协议的文件头信息(adding header only)就可以交由底层传送出去
  • 视频编码层面(Video Coding Layer,VCL),负责有效表示视频数据的内容
    • 视频压缩的原理是利用影像在时间与空间上存有相似性,这些相似的数据经过压缩算法处理之后,可以将人眼无法感知的部分抽离出来,这些称为视觉冗余(visual redundancy)的部分在去除之后,就可以达到视频压缩的目的
    • H.264/AVC的视讯编码机制是以图块(block-based)为基础单元,也就是说先将整张影像分割成许多矩形的小区域,称之为巨图块(macroblock,MB)
    • 再将这些巨图块进行编码,先使用画面内预测(intra-prediction)与画面间预测(inter-prediction)技术,以去除影像之间的相似性来得到所谓的差余影像(residual)
    • 再将差余影像施以空间转换(transform)与量化(quantize)来去除视觉冗余,最后视讯编码层会输出编码过的比特流(bitstream)
    • 之后再包装成网络提取层的单元封包(NAL-unit),经由网络传送到远程或储存在储存媒体中
    • H.264/AVC允许视讯影片以frame或是以filed的方式来进行编码,两者可以共存,而frame可以是progress或是interlace形式,对同一段影片来说也可使用两者来混合编码,这个特性与MPEG-2相同
  • 多编码器并行编码
    • H.264 和 H.265 支持多路编码,目前默认最多为 8 路并行编码,以下为注意事项
    • 编码整体性能需要低于硬件设计限制,超过会无法达到设定的 framerate
    • 所需要的 Frame Buffer 会随着路数的增加成正比增加,DRAM 使用量亦随之增加

CVI_VENC_CreateChn

  • 原型:CVI_S32 CVI_VENC_CreateChn (VENC_CHN VeChn, const VENC_CHN_ATTR_S *pstAttr);
  • 功能:创建编码通道
  • 参数:
    • VeChn – VENC Channel 号 – 输入
    • pstAttr – VENC_CHN_ATTR_S 属性指针 – 输入
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_venc.h、cvi_venc.h
    • 库文件:libvenc.a
  • 注意:
    • 通道属性分为三个结构:
      • VENC_ATTR_S: 决定编码属性,此属性决定编码协议并赋值设定对应宽,高
      • VENC_RC_ATTR_S:码率控制器属性, 此属性随编码设定及码率控制模式 (CBR、VBR、FIXQP)不同对应子结构做设定
      • VENC_GOP_ATTR_S: GOP 类型属性,编码 GOP 类型(编码单参考帧,P帧, GOP 类型。)
      • 推荐的编码宽高为: 3840x2160(4k)、1920x1080(1080P)、1280x720(720P)
    • 用户可参阅 sample_common_venc.cSAMPLE_COMM_VENC_SetChnAttr参考对应属性指针的设定

CVI_VENC_DestroyChn

  • 原型:CVI_S32 CVI_VENC_DestroyChn (VENC_CHN VeChn);
  • 功能:销毁编码通道
  • 参数:
    • VeChn – VENC Channel 号 – 输入
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_venc.h、cvi_venc.h
    • 库文件:libvenc.a
  • 注意:
    • 销毁并不存在的通道,将返回失败
    • 可参阅 sample_common_venc.c,销毁通道前必须停止传送 frame

CVI_ VENC_StartRecvFrame

  • 原型:CVI_S32 CVI_VENC_StartRecvFrame(VENC_CHN VeChn, const VENC_RECV_PIC_PARAM_S *pstRecvParam);
  • 功能:开启编码通道接收输入图像,允许指定接收帧数,超出指定的帧数后自动停止接收图像
  • 参数:
    • VeChn – 编码通道号 – 输入
    • pstRecvParam – 接收图像参数结构体指针,用于指定需要接收的图像帧数 – 输入
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_venc.h、cvi_venc.h
    • 库文件:libvenc.a
  • 注意:
    • 如果通道未创建,则返回失败
    • 开启编码器接收之后才能开始接收图像编码
    • 可參照 sample_common_venc.cSAMPLE_COMM_VENC_Start 函式

CVI_ VENC_StopRecvFrame

  • 原型:CVI_S32 CVI_VENC_StopRecvFrame(VENC_CHN VeChn);
  • 功能:停止编码通道接收输入图像。
  • 参数:
    • VeChn – 编码通道号 – 输入
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_venc.h、cvi_venc.h
    • 库文件:libvenc.a
  • 注意:
    • 通道销毁前,需调用 CVI_VENC_StopRecvFrame
    • 如通道未创建或通道已销毁,则返回失败
    • 调用此接口仅停止接收原始数据编码,码流 buffer 并不会被清除
    • 此接口用于编码通道停止接收图像来编码,在编码通道销毁或复位前必须停止接收图像
    • 可參照 sample_common_venc.cSAMPLE_COMM_VENC_Stop 函式

CVI_VENC_QueryStatus

  • 原型:CVI_S32 CVI_VENC_QueryStatus(VENC_CHN VeChn, VENC_CHN_STATUS_S *pstStatus);
  • 功能:查询编码通道状态。
  • 参数:
    • VeChn – 编码通道号 – 输入
    • pstStatus – 编码通道的状态指针。 – 输入
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_venc.h、cvi_venc.h
    • 库文件:libvenc.a
  • 注意:
    • 如果通道未创建,则返回失败
    • 在编码通道状态结构体中,u32CurPacks 表示当前帧的码流包个数。在调用CVI_VENC_GetStream 之前应确保 u32CurPacks 大于 0

CVI_VENC_SendFrame

  • 原型:CVI_S32 CVI_VENC_SendFrame(VENC_CHN VeChn, const VIDEO_FRAME_INFO_S *pstFrame, CVI_S32 S32MilliSec);
  • 功能:送出影像以供编码
  • 参数:
    • VeChn – 编码通道号 – 输入
    • pstFrame – VIDEO_FRAME_INFO_S 属性指针 – 输入
    • S32MilliSec – 发送图像超时时间,取值范围:[-1,+∞ ) -1:阻塞 0:非阻塞 大于0:超时时间。– 输入
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_venc.h、cvi_venc.h
    • 库文件:libvenc.a
  • 注意:
    • 此接口支持用户发送图像至编码通道,以进行编码
    • 调用该接口发送图像,用户需要保证编码通道已创建且开启接收输入图像
    • 可參照 sample_venc_lib.cSAMPLE_VENC_GetVencStreamProc

CVI_VENC_GetStream

  • 原型:CVI_S32 CVI_VENC_GetStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream, CVI_S32 S32MilliSec);
  • 功能:获取编码的码流。
  • 参数:
    • VeChn – 编码通道号 – 输入
    • pstFrame – 码流结构体指针 – 输出
    • S32MilliSec – 发送图像超时时间,取值范围:[-1,+∞ ) -1:阻塞 0:非阻塞 大于0:超时时间。– 输入
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_venc.h、cvi_venc.h
    • 库文件:libvenc.a
  • 注意:
    • venc 通道必须先创建,否则此函式会回传错误
    • 在非 bind mode 状况下,CVI_VENC_SendFrame 必须有调用过,否则CVI_VENC_GetStream 将无法获得码流结构
    • CVI_VENC_GetStream 调用之前,可以搭配 CVI_VENC_GetChnAttr,CVI_VENC_QueryStatus 调用确保编码信道当下的正确性
    • 码流结构体 VENC_STREAM_S 包含 4 个部分
      • 码流包信息指针 pstPack – 指向一组 VENC_PACK_S 的内存空间,该空间由调用者分配。注意:pstPack 空间必须在调用CVI_VENC_GetStream 前给予对应空间,否则将回传错误
    • 可參照 sample_venc_lib.c 內的 SAMPLE_VENC_GetVencStreamProc

CVI _ VENC_ReleaseStream

  • 原型:`CVI_S32 CVI_VENC_ReleaseStream(VENC_CHN VeChn, VENC_STREAM_S *pstStream);
  • 功能:释放码流缓存
  • 参数:
    • VeChn – 编码通道号 – 输入
    • pstFrame – 码流结构体指针 – 输出
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_venc.h、cvi_venc.h
    • 库文件:libvenc.a
  • 注意:
    • 请确认 venc 通道已创建
    • 请确认 CVI_VENC_ReleaseStreamCVI_VENC_GetStream 之后,若提前调用CVI_VENC_ReleaseStream,则 CVI_VENC_GetStream 将不具备取得正确stream 保证
    • 用户获取码流后必须及时释放已经获取的码流缓存,否则可能会导致码流buffer 满,影响编码器编码

CVI_VENC_GetChnParam

  • 原型:CVI_S32 CVI_VENC_GetChnParam(VENC_CHN VeChn, VENC_CHN_PARAM_S *pstChnParam);
  • 功能:获取通道参数。
  • 参数:
    • VeChn – 编码通道号 – 输入
    • pstChnParam – Venc 的通道参数指针 – 输入
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_venc.h、cvi_venc.h
    • 库文件:libvenc.a

CVI_VENC_SetChnParam

  • 原型:CVI_S32 CVI_VENC_SetChnParam(VENC_CHN VeChn, const VENC_CHN_PARAM_S *pstChnParam);
  • 功能:设置通道参数。
  • 参数:
    • VeChn – 编码通道号 – 输入
    • pstChnParam – Venc 的通道参数指针 – 输入
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_venc.h、cvi_venc.h
    • 库文件:libvenc.a
  • 注意:
    • 本接口在编码通道创建之后,编码通道销毁之前调用
    • 此函数呼叫于CVI_VENC_CreateChn 之后
    • 此函数API参数支持venc crop设置,其使用参数为
      • VENC_CHN_PARAM_S,stCropCfg。 可设定对应的 x,y 轴及宽(width),高(height)

视频处理子系统(VPSS) – API参考

CVI_VPSS_GetChnFrame

  • 原型:CVI_S32 CVI_VPSS_GetChnFrame(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, VIDEO_FRAME_INFO_S *pstFrameInfo, CVI_S32 s32MilliSec);
  • 功能:用户从通道获取一帧处理完成的图像
  • 参数:
    • VpssGrp – VPSS GROUP 号,取值范围:[0,VPSS_MAX_GRP_NUM] – 输入
    • VpssChn – VPSS 通道号,取值范围:[0,VPSS_MAX_CHN_NUM] – 输入
    • pstVideoFrame – 待发送的图像信息(详解在系统控制章节) – 输出
    • s32MilliSec – 超时时间 – 输入
  • 返回值:
    • CVI_SUCCESS – 成功
    • 非0 – 失败,其值为错误码
  • 需求:
    • 头文件:cvi_comm_vpss.h、cvi_vpss.h
    • 库文件:libvpu.a
  • 注意:
    • Group 必须已经创建
    • 该函数将获得的图像信息保存在 pstvideoFrame 里面,并包含了图像的虚拟地址和物理地址
  • VENC_CHN_ATTR_S::VENC_ATTR_S:决定编码属性,此属性决定编码协议并赋值设定对应宽,高