介绍
在有些应用中,发现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...
");
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++;
}
责任编辑:haq
-
代码
+关注
关注
30文章
4941浏览量
73151 -
变量
+关注
关注
0文章
615浏览量
29371
原文标题:设置I帧的QP,提高I帧的质量
文章出处:【微信号:FPGA-EETrend,微信公众号:FPGA开发圈】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
基于芯源CW32 MCU的LED闪烁示例及代码分析
淘宝京东API商品详情接口示例参考
如何使用20829 can-fd发送64字节扩展标识符数据帧?
CYW20721如何在A2DP接收器中更改I2S时钟设置?
NXP i.MX RT1060移植TinyUSB:快速扩展大量USB Class示例
如何获取用于开发fx2的sdk和示例源代码?
ESP32P4示例工程中有用的i2c-tools调试工程
是否可以使用DMA和LPSPI的3字节帧大小?
如何获取SMBus示例代码?
EtherCAT数据帧结构解析
用于 SPI 绝对编码器的 Arduino 示例代码

设置I帧的QP的示例代码
评论