介紹
在有些應用中,發現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的值。可以試試20-35之間的QP值。QP值是20時,能帶來很好的圖像質量。
void ProcessFrame(AL_TBuffer* Src) override { if(m_picCount == 0) m_StartTime = GetPerfTime(); if(!Src) { LogVerbose("Flushing...\n\n"); 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 QpBufShared(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文章
4886瀏覽量
70222 -
MPSoC
+關注
關注
0文章
199瀏覽量
24613
發布評論請先 登錄
相關推薦
熱點推薦
Denebola RDK上配置的幀大小與實際幀大小不一致是怎么回事?
設置了CyU3PMipicsiSetPhyTimeDelay ( 1 , 18 ) ; 。
項目說明:
幀大小不匹配:
根據配置的分辨率和格式,預期的幀大小應為每幀4915200
發表于 05-19 08:09
是否可以使用DMA和LPSPI的3字節幀大小?
。如果我將幀大小配置為8位或32位、則傳輸工作正常、但我無法讓它工作于24位(AD5676 SPI DAC要求)。
當我深入研究相關的 i.MX API 函數時[i
發表于 03-17 06:47
EtherCAT數據幀結構解析
物理層和常規的以太網卡,通過獨特的數據幀結構和處理機制,實現了基于EtherNet的實時控制。本文將深入探討EtherCAT的數據幀結構,從幀的組成、子報文的結構、工作計數器的功能到數據幀
基于Vector工具進行CAN協議錯誤幀的分析實踐
廣播發送的短幀結構,還體現在其錯誤檢測機制上。通過總線數據以及總線波形來分析總線故障時,CAN協議錯誤檢測機制中豐富的錯誤幀類型能讓定位問題的效率更高。錯誤幀是CA

TVP5151是否是25幀的CVBS信號輸入,輸出是并口也是25幀,而不是50幀的?
TVP5151這個芯片是否是25幀的CVBS信號(隔行掃描的)輸入,輸出是并口也是25幀,而不是50幀的
發表于 01-03 07:48
CAN總線通信中的數據幀結構解析
CAN總線由Bosch公司在1980年代開發,旨在為汽車電子系統提供一個可靠的通信網絡。隨著技術的發展,CAN總線已經被廣泛應用于各種工業和自動化領域。 2. CAN總線數據幀概述 CAN總線的數據
以太網幀格式和功能詳解
以太網幀(Ethernet Frame)是以太網(Ethernet)協議用于在局域網(LAN)中傳輸數據的基本單位。理解以太網幀的結構和傳輸過程對于掌握局域網通信的原理至關重要。以下將從以太網幀的定義、格式以及功能三個方面進行詳
以太網幀結構是怎樣的
以太網幀(Ethernet Frame)是以太網(Ethernet)協議用于在局域網(LAN)中傳輸數據的基本單位。理解以太網幀的結構對于掌握局域網通信的原理至關重要。
can標準幀和擴展幀能否共存
CAN(Controller Area Network)是一種用于汽車和工業自動化領域的現場總線通信協議。CAN協議具有多種幀格式,包括標準幀和擴展幀。在實際應用中,標準幀和擴展
can標準幀和擴展幀的區別
CAN(Controller Area Network)是一種用于汽車和工業領域的通信協議,它允許多個設備在同一總線上進行通信。CAN協議有兩種幀類型:標準幀和擴展幀。這兩種幀類型在結
can網絡數據幀的特點
特點,在分布式系統中得到了廣泛應用。 數據幀的重要性 :數據幀是CAN網絡中用于數據傳輸的基本單元,其結構設計和特性直接關系到整個網絡的通信效率和可靠性。 二、數據幀的結構 基本構成 :CAN數據
can數據幀有哪幾個域組成
CAN(控制器局域網絡)是一種基于消息傳遞的通信協議,廣泛應用于汽車、工業自動化和嵌入式系統等領域。CAN協議的數據幀是用于傳輸信息的基本單位。 1. CAN數據幀概述 CAN數據幀是一種用于在
CAN數據幀的各個域及其作用
CAN(Controller Area Network)是一種用于汽車電子系統中的通信協議,它具有高可靠性、實時性和靈活性等特點。在CAN通信中,數據幀是最基本的通信單元,用于傳輸信息。 概述
評論