一、概述
hd_videoenc 的主要目的是從上層單元獲取影像原始資料,並控制影片編碼器對該影像進行編碼,輸出碼流後可用於保存檔案或進行線上串流。
二、HDAL介面介紹
這部分可以直接參考 video_record.c 這支範例程式碼,
開啟與關閉一路的 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,高清視頻編碼參數路徑配置, &config);
3.2、設定編碼參數:
參考 video_record.c 中的 set_enc_param()
3.2.1in參數
hd_videoenc_set(path, 高清視頻編碼參數輸入句子: , ¶m);
3.2.2out參數
hd_videoenc_set(path,高清_視頻編碼_參數_輸出_編碼_參數, ¶m);
3.2.3rc參數
hd_videoenc_set(path,HD_視頻編碼參數_輸出_速率控制, &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 最大記憶體大小
Venc 的 max_mem size 可以對應到 sample code path config 中的參數設定,
其大小則取決於 max_w、max_h、svc、ltr、bitrate、enc_ms、sout。
max_mem 大小 = 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 沒有拉出,導致 bs 滿了會發出 WRN 作為警告。
解法:可以下指令echo vdoenc encinfo 1 > /proc/hdal/venc/cmd看到 Bque 的值是不是很滿,若是 90,就要檢查流程是否有 pull out 來解決問題。
5.5、警告:_NMR_VdoTrig_TrigAndwait() [vDoTRIG][2] 輸入幀索引 = 410,大小不足,丟棄幀,時間 = 325564535 微秒。
答:表示videoenc path2沒有釋放out,導致bs緩衝區沒有釋放空間而報錯。
解法:下指令 echo vdoenc encinfo 2 > /proc/hdal/venc/cmd 查看 Bque 值,
下指令echo isfve showmsg 2 2048 > /proc/hdal/venc/cmd 查看幀間隔時間是否過長或不穩定,若執行此指令後沒有任何輸出,代表沒有取流,確認後需自行檢查取流執行緒是否有問題。
參考文獻:Novatek HDAL 設計規範 - hd_videoenc
NT9852x_BRC_使用者指南_中文
評論