一、概述
hd_videoenc 的主要目的是从上层单元获取图像原始数据,并控制视频编码器对该图像进行编码,输出码流后可用于保存档案或进行在线串流。
二、HDAL interface介绍
这部分可以直接参考 video_record.c 这支 sample code,
开启与关闭一路的 venc 模块的顺序如下:
hd_videoenc_init: 对编码进行初始化。
hd_videoenc_open: 开启编码通道。
hd_videoenc_set: 设定 config参数与编码参数。
hd_videoenc_start: 用于生效videoenc模块之参数设定与绑定关系。
hd_videoenc_stop: 停止编码通道。
hd_videoenc_close: 关闭编码通道。
hd_videoenc_uninit:对编码进行去初始化。
hd_videoenc_push_in_buf: 非绑定模式下送入 yuv 给 venc 做编码。
hd_videoenc_pull_out_buf: 取出码流。
hd_videoenc_release_out_buf:释放kflow bs缓冲区空间。
三、hd_videoenc_set模块说明:
参数设置hd_videoenc_set可以分为两部分,一是设定Config 参数,二是设定编码参数。
3.1、设定config参数:
video_record.c 中的 set_enc_cfg()
hd_videoenc_set(path, HD_VIDEOENC_PARAM_PATH_CONFIG, &config);
3.2、 设定编码参数:
参考 video_record.c 中的 set_enc_param()
3.2.1 in参数
hd_videoenc_set(path, HD_VIDEOENC_PARAM_IN, ¶m);
3.2.2 out参数
hd_videoenc_set(path, HD_VIDEOENC_PARAM_OUT_ENC_PARAM, ¶m);
3.2.3 rc参数
hd_videoenc_set(path, HD_VIDEOENC_PARAM_OUT_RATE_CONTROL, &rc_param)
四、cat /proc/hdal/venc/info
编码模块最常用的指令就是 cat /proc/hdal/venc/info,在板端跑完AP之后,下此指令可以打印与其他模块的绑定状态、编码器配置设定、编码参数设定值等等。
4.1、查看绑定状态
可以看到这里是绑定模式,videoenc_0_in_0与videoproc_0_out_0绑定:
若是非绑定模式,bind_src显示null
4.2、 venc max_mem size
Venc的max_mem size可以对应到sample code path config中的参数设定,
其大小则取决于max_w, max_h, svc, ltr, bitrate, enc_ms, sout。
max_mem size=codec_size + bs_buff_size + srcout_size。
五、FAQ
5.1、hd_videoenc_start这支API在流程中起到什么作用?
答:分配kflow和kdrv所需的内存,以及编码参数值设定给kdrv。
5.2、hd_videoenc_start会配置kflow和kdrv所需的内存,那会在什么阶段释放?
答:会在hd_videoenc_close释放内存。
5.3、Videoenc部分各个模块的参数该如何理解?
答:参考文档Novatek_HDAL_Videoenc_Programming_Guide_zh.pdf,该文档对videoenc的参数和api都有详细的解释。
5.4、如何理解报错WRN:_NMR_VdoTrig_TrigAndWait() [VDOTRIG][1] queue frame count >= 90, time = 3180304963 us 。
答:此错误表示videoenc path1没有pull out,导致bs满了会发WRN作警告。
解法:可以下指令echo vdoenc encinfo 1 > /proc/hdal/venc/cmd,看到Bque的值是不是很满,若是90,就要检查流程是否有pull out来解决问题。
5.5、WRN:_NMR_VdoTrig_TrigAndwait() [vDoTRIG][2] input frame idx = 410, size not enough, drop frame,time = 325564535 us。
答:表示videoenc path2 没有release out导致bs缓冲区没有释放空间而报错。
解法:下指令echo vdoenc encinfo 2 > /proc/hdal/venc/cmd查看Bque值,
下指令echo isfve showmsg 2 2048 > /proc/hdal/venc/cmd查看帧间隔时间是否过长或飘忽不定,若下此指令没有任何打印,代表没有取流,确认后需自行检查取流线程是否有误。
参考文献:Novatek HDAL Design Specification - hd_videoenc
NT9852x_BRC_User_Guide_zh
欲知更多技术内容可点击此处前往大大通阅览~