0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何设置I帧的QP提高I帧的质量

刘芳 来源:yfdsfqdqd 作者:yfdsfqdqd 2022-08-02 08:03 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

介绍
在有些应用中,发现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

    文章

    4977

    浏览量

    74420
  • MPSoC
    +关注

    关注

    0

    文章

    203

    浏览量

    25238
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    S32K148 FlexCAN模块无法接收远程,为什么?

    我想验证远程发送和接收功能,但无法接收远程。发送和接收数据是正常的。我可以修改代码中标记为红色的部分来发送和接收远程吗?您可以提供用于远程
    发表于 04-24 06:55

    S32K(ST05板)上未接收到CAN FD远程响应是怎么回事?

    我正在进行 CAN FD 设置,其中我使用 ST05 板作为一个节点,使用 PeakCAN 作为另一个节点。 从 ST05 开始,我发送一个远程框架. 在 PeakCAN 上,我可以在
    发表于 04-22 06:58

    NeurIPS 2024 | 丝滑视觉新极限:EPA 框架利用事件相机突破插伪影瓶颈

    核心提要:传统视频插在极高速运动下难逃“重影”与“撕裂”。北京理工大学团队提出的EPA(PerceptuallyAligned)框架,通过感知对齐学习,将事件相机的微秒级轨迹精准融入图像纹理,实现
    的头像 发表于 04-17 17:20 7698次阅读
    NeurIPS 2024 | 丝滑视觉新极限:EPA 框架利用事件相机突破插<b class='flag-5'>帧</b>伪影瓶颈

    HT for Web 动画 | 3D 动态渲染设计与实现

    动画凭借灵活的序列设计与精准时序控制,成为图扑软件 HT 可视化项目的核心视觉能力。结合完善的动画体系与性能优化方案,可打造高沉浸、高真实感的数字孪生场景,是实现虚实融合与创意表达的重要技术支撑。
    的头像 发表于 03-24 11:05 216次阅读
    HT for Web <b class='flag-5'>帧</b>动画 | 3D 动态渲染设计与实现

    CAN总线报错看不懂?5种错误+5步排查法一次讲清

    CAN总线通信异常?错误帧频繁出现?本文详解五种错误类型,并提供五步排查法,助你快速定位问题根源。错误的作用错误是CAN总线用于错误通知的报文。当任一节点检测到通信错误时,会立即发送错误
    的头像 发表于 03-16 11:36 484次阅读
    CAN总线报错看不懂?5种错误<b class='flag-5'>帧</b>+5步排查法一次讲清

    MediaTek天玑倍技术MFRC专区上线官网

    MediaTek 宣布在天玑开发者中心网站已正式上线「天玑倍技术 MFRC 专区」(MediaTek Frame Rate Converter,MFRC)。
    的头像 发表于 01-29 14:57 901次阅读

    XC95108-15PQ100I 通信应用实操:多协议解析与数据转换技巧

    XC95108-15PQ100I不是什么神秘的黑科技,它其实就是Xilinx公司推出的一款高性能CPLD(复杂可编程逻辑器件)。简单说,这就像一个可以重新编程的"数字电路积木",让工程师能够按照需求搭建出各种数字逻辑功能。
    的头像 发表于 01-28 09:59 562次阅读
    XC95108-15PQ100<b class='flag-5'>I</b> 通信应用实操:多协议<b class='flag-5'>帧</b>解析与数据转换技巧

    中颖电子8位单片机的I/O设置介绍

    在嵌入式系统设计中,单片机的I/O端口设置是基础且关键的一环。今天我们来详细解析中颖电子8位单片机的I/O设置,帮助工程师更好地理解和应用。
    的头像 发表于 12-30 09:37 903次阅读
    中颖电子8位单片机的<b class='flag-5'>I</b>/O<b class='flag-5'>设置</b>介绍

    CW32 UART的数据结构有哪些特点?

    请问 CW32 UART 的数据结构有哪些特点?
    发表于 12-15 06:58

    为什么无法在 USB3 Vision 上传输虚拟

    /FX3-U3V-device-fails-to-build-genapi-no...中提供的代码。但是我无法在 eBUS USB 播放器中传输视频。 在 eBUS 播放器中,我获取了 SiPayloadTransferSize
    发表于 07-16 06:42

    如何查找 TLE9881 接收的 DLC?

    我们的项目使用 TLE9881,并使用经典 CAN 协议进行通信。 您能帮我找到接收到的 CAN 的 DLC 吗?
    发表于 07-15 06:42

    CYW20721如何在A2DP接收器中更改I2S时钟设置

    CYW20721 DS 提到的主模式下的 I2S 时钟可以是: 44.1 kHz x 每 32 位 = 1411.2 千赫 48 kHz x 每 32 位 = 1536 kHz 我能知道如何为这 2 个
    发表于 07-03 06:41

    如何评估CAN总线信号质量

    络中,数据通过双绞线上的差分信号传输。信号质量直接影响节点正确解读数据的能力。信号质量差可能表现为: 位错误 :由于噪声或信号失真导致的位误判。 错误 :CAN结构错误,导致接收节
    发表于 06-07 08:46

    CX3 I2C启动失败的原因?

    I2C 启动。 使用逻辑分析仪测试 I2C 信号。您可以在开始时读取第一数据。与AN76405相比,读取数据正确。但奇怪的是,此后I2C接口就停止工作了。 逻辑分析仪测试
    发表于 05-28 07:46

    Denebola RDK上配置的大小与实际大小不一致是怎么回事?

    设置了CyU3PMipicsiSetPhyTimeDelay ( 1 , 18 ) ; 。 项目说明: 大小不匹配: 根据配置的分辨率和格式,预期的大小应为每4915200
    发表于 05-19 08:09