介绍
在有些应用中,发现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文章
4741浏览量
68326 -
MPSoC
+关注
关注
0文章
198浏览量
24246
发布评论请先 登录
相关推荐
以太网帧格式和功能详解
以太网帧(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通信中,数据帧是最基本的通信单元,用于传输信息。 概述
AMD HYPR-RX支持AMD帧生成技术,助力即刻提升游戏性能
AMD Fluid Motion Frames(AFMF)—AMD帧生成技术,助力AMD Radeon用户在数千款DirectX 11和DirectX 12游戏中,使用帧插值技术来提高帧
为了提高应用的安全性,TLD7002-16ES的帧间延迟应该更长还是更短?
问题:为了提高应用的安全性,TLD7002-16ES的帧间延迟应该更长还是更短? 答案:根据数据表,https://www.infineon.com/dgdl
Coral3568如何软硬件过滤can帧及优化?
CAN总线调试时,根据数据的重要性,接收端可以专注于接收重要消息,提高效率。CAN报文帧是用一个标识符或一系列标识符来过滤的。可以使用CAN总线软件和芯片硬件过滤规则实现过滤功能。软件过滤
can标准帧和扩展帧区别
标准帧和扩展帧是用于在控制器局域网(CAN)中传输数据的两种基本格式。它们在帧结构、标识符长度、数据长度以及数据传输和应用上存在一些区别。本文将详细介绍标准帧和扩展
can数据帧的标准格式
CAN(Controller Area Network)是一种广泛应用于汽车、工业控制和通信领域的串行通信总线标准。CAN数据帧是CAN总线上传输数据的基本单位,它包含了一系列的字段,用于确定
TSMaster采样点配置方法与消除错误帧流程
当通讯节点间采样点参数和波特率参数不匹配造成一些错误帧时,我们如何在TSMaster中设置以及调整波特率参数和采样点参数,来减少以及消除总线上出现的错误帧,进一步提高通信
评论