介紹
在有些應用中,發現I幀不夠大。MPSoC VCU CtrlSW可以設置每一幀的QP大小。因此,可以通過設置I幀的QP,提高I幀的大小,從而提高I幀的質量。
代碼
下面是設置I幀的QP的示例代碼。
GOP長度變量
在struct EncoderSink : IFrameSink的定義里添加GOP的成員變量,記錄GOP長度。
#if USER_I_FRAME_QP // USER_I_FRAME_QP changes START float uFrameRate = 0.0f; int uGopLength = 0; // USER_I_FRAME_QP changes END #endif // USER_I_FRAME_QP
記錄GOP長度
在EncoderSink 的EncoderSink函數設置GOP的變量的值。
struct EncoderSink : IFrameSink { EncoderSink(ConfigFile const& cfg, AL_IEncScheduler* pScheduler, AL_TAllocator* pAllocator ) : CmdFile(cfg.sCmdFileName, false), EncCmd(CmdFile.fp, cfg.RunInfo.iScnChgLookAhead, cfg.Settings.tChParam[0].tGopParam.uFreqLT), twoPassMngr(cfg.sTwoPassFileName, cfg.Settings.TwoPass, cfg.Settings.bEnableFirstPassSceneChangeDetection, cfg.Settings.tChParam[0].tGopParam.uGopLength, cfg.Settings.tChParam[0].tRCParam.uCPBSize / 90, cfg.Settings.tChParam[0].tRCParam.uInitialRemDelay / 90, cfg.MainInput.FileInfo.FrameRate), qpBuffers{cfg.Settings, cfg.RunInfo.eGenerateQpMode}, pAllocator{pAllocator}, pSettings{&cfg.Settings} { #if USER_I_FRAME_QP // USER_I_FRAME_QP changes STARTED ---------------------------------- uFrameRate = cfg.Settings.tChParam.tRCParam.uFrameRate; uGopLength = cfg.Settings.tChParam.tGopParam.uGopLength; // USER_I_FRAME_QP changes END -------------------------------------- #endif // USER_I_FRAME_QP }
設置QP
在EncoderSink 的ProcessFrame函數里,根據GOP長度,確定每個GOP開始的I幀。然后再設置QP的值??梢栽囋?0-35之間的QP值。QP值是20時,能帶來很好的圖像質量。
void ProcessFrame(AL_TBuffer* Src) override { if(m_picCount == 0) m_StartTime = GetPerfTime(); if(!Src) { LogVerbose("Flushing... "); if(!AL_Encoder_Process(hEnc, nullptr, nullptr)) throw std::runtime_error("Failed"); return; } DisplayFrameStatus(m_picCount); if(twoPassMngr.iPass) { auto pPictureMetaTP = AL_TwoPassMngr_CreateAndAttachTwoPassMetaData(Src); if(twoPassMngr.iPass == 2) twoPassMngr.GetFrame(pPictureMetaTP); } AL_TBuffer* QpBuf = qpBuffers.getBuffer(m_picCount); std::shared_ptr責任編輯:haqQpBufShared(QpBuf, [&](AL_TBuffer* pBuf) { qpBuffers.releaseBuffer(pBuf); }); if(pSettings->hRcPluginDmaContext != NULL) RCPlugin_SetNextFrameQP(pSettings, pAllocator); #if USER_I_FRAME_QP if( 0 == (m_picCount%uGopLength) ) { AL_Encoder_SetQP(hEnc, 20 ); } #endif // USER_I_FRAME_QP if(!AL_Encoder_Process(hEnc, Src, QpBuf)) throw std::runtime_error("Failed"); m_picCount++; m_picGopCount++; }
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
代碼
+關注
關注
30文章
4827瀏覽量
69054 -
變量
+關注
關注
0文章
613瀏覽量
28466
原文標題:設置I幀的QP,提高I幀的質量
文章出處:【微信號:FPGA-EETrend,微信公眾號:FPGA開發圈】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
用于 SPI 絕對編碼器的 Arduino 示例代碼
(SPI) 通信來配置和讀取 [Same Sky] 的 [AMT22 絕對編碼器] 的數據。該教程將提供所需的硬件和軟件、關鍵設置要求以及單圈和多圈輸出選項的示例代碼包和說明。以下是入門工作所需的物料清單
![用于 SPI 絕對編碼器的 Arduino <b class='flag-5'>示例</b><b class='flag-5'>代碼</b>](https://file1.elecfans.com/web3/M00/06/8D/wKgZPGeM_y6AQfmPAABlEOwHFDc990.jpg)
I2C總線設備地址設置方法
通常是一個7位或10位的數字,用于標識總線上的每個設備。在7位尋址模式下,地址范圍是0x00到0x7F,而在10位尋址模式下,地址范圍是0x000到0x3FF。I2C地址的最低位(LSB)通常用于指示讀/寫操作。 硬件地址設置 1. 地址引腳配置 許多
can標準幀和擴展幀能否共存
CAN(Controller Area Network)是一種用于汽車和工業自動化領域的現場總線通信協議。CAN協議具有多種幀格式,包括標準幀和擴展幀。在實際應用中,標準幀和擴展
can標準幀和擴展幀的區別
CAN(Controller Area Network)是一種用于汽車和工業領域的通信協議,它允許多個設備在同一總線上進行通信。CAN協議有兩種幀類型:標準幀和擴展幀。這兩種幀類型在結
如何使用AURIX?將Erika操作系統移植到TC387-QP MCU中?
如何使用AURIX?設計工作室將此 Erika OS 集成到 TC387-QP MCU 中?
Erika OS文件夾已經可用,并以 ZIP 文件的形式共享,以供參考。
設置如下
AURIX?設計工
發表于 05-17 14:03
關于STM32 DMAMUX模塊具體的應用示例代碼
有人通過公眾號微信留言,詢問是否有關于STM32 DMAMUX模塊具體的應用示例代碼。同時,個人也發現,雖然STM32片內的DMAMUX不是什么新模塊,似乎還是很多人并不太熟悉。這里借機聊聊這方面的內容,重點演示相關功能的實現,以供參考。
![關于STM32 DMAMUX模塊具體的應用<b class='flag-5'>示例</b><b class='flag-5'>代碼</b>](https://file1.elecfans.com/web2/M00/C5/98/wKgZomYA0KWAXr1uAAActZx-jhs970.png)
TC387QP啟用HSm時,PFlash被擦除而鎖定了怎么解決?
你好,
我曾在 HSM 啟用狀態下進行過 Pflash 擦除。 因此,鎖定微型 TC387QP。
請告訴我如何解鎖微控制器 TC387QP?
發表于 03-04 06:05
瑞薩Flash示例程序01型SC版本(代碼Flash)應用說明
電子發燒友網站提供《瑞薩Flash示例程序01型SC版本(代碼Flash)應用說明.pdf》資料免費下載
發表于 02-19 13:48
?0次下載
![瑞薩Flash<b class='flag-5'>示例</b>程序01型SC版本(<b class='flag-5'>代碼</b>Flash)應用說明](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論