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

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

3天内不再提示

设置I帧的QP的示例代码

YCqV_FPGA_EETre 来源:博客园 作者:HankFu 2021-10-20 11:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

介绍

在有些应用中,发现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
责任编辑:haq
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151
  • 变量
    +关注

    关注

    0

    文章

    615

    浏览量

    29371

原文标题:设置I帧的QP,提高I帧的质量

文章出处:【微信号:FPGA-EETrend,微信公众号:FPGA开发圈】欢迎添加关注!文章转载请注明出处。

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    基于芯源CW32 MCU的LED闪烁示例代码分析

    最近我在项目中使用了芯源的CW32 MCU,这是一款非常适合物联网和低功耗应用的微控制器。在初步学习和使用中,我做了一个简单的LED闪烁实验,通过这篇帖子给大家分享一下代码及相关的配置步骤。 硬件
    发表于 12-04 06:52

    淘宝京东API商品详情接口示例参考

    。 is_promotion:是否获取促销价,可选参数,根据需求设置。 其他参数可能包括返回字段列表、API密钥等,具体以API文档为准。 请求示例:   http复制代码GET https://eco.taobao.com
    的头像 发表于 11-04 09:36 130次阅读

    请问如何构建 emWin 示例代码

    如何构建 emWin 示例代码
    发表于 09-04 07:25

    如何使用20829 can-fd发送64字节扩展标识符数据

    亲爱的先生, 基于MTB代码示例CAN_FD,它使用11位标准标识符数据。 更改为29位扩展标识符数据,并将RX / TX FIFO更改为64Bytes,将
    发表于 08-04 06:56

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

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

    NXP i.MX RT1060移植TinyUSB:快速扩展大量USB Class示例

    前言   为啥是TinyUSB?给强大的RT配个轻巧的USB栈! USB这个让我们方便快捷的接口,几乎无处不在。在嵌入式世界里,尤其是用上了像NXP i.MX RT这样性能强劲的跨界MCU,我们自然
    的头像 发表于 05-15 09:25 2205次阅读
    NXP <b class='flag-5'>i</b>.MX RT1060移植TinyUSB:快速扩展大量USB Class<b class='flag-5'>示例</b>

    如何获取用于开发fx2的sdk和示例代码

    大家好 我正在使用 FX2 设备,以前也使用过 FX3 设备。 使用 FX3 设备 SDK,当我下载它时,我在安装文件夹中获得了许多示例代码,但是它没有 FX2 的示例代码,我如何
    发表于 05-07 07:25

    ESP32P4示例工程中有用的i2c-tools调试工程

    有用的示例工程 开发过程调试是个令人头疼的问题,在程序正式运行起来之前,需要借助其他的工具来调试硬件、检验代码逻辑是否正确。乐鑫的示例代码中有个使用串口控制台调试
    发表于 05-03 18:25

    是否可以使用DMA和LPSPI的3字节大小?

    DMA 传输为24字节。 我不需要 CPU 干预,所以一切都需要在 DMA 设置中进行配置,否则就违背了使用 DMA 的目的。 此时,除非我们进一步深入研究,否则我不会分享我的代码,但我
    发表于 03-17 06:47

    如何获取SMBus示例代码

    想找一个用硬件SMBus外设的示例代码,但是在网上找到的很多都是HAL库的版本,我目前的代码是用的标准库,想知道ST官方有没有相关的示例代码
    发表于 03-10 07:16

    EtherCAT数据结构解析

    物理层和常规的以太网卡,通过独特的数据结构和处理机制,实现了基于EtherNet的实时控制。本文将深入探讨EtherCAT的数据结构,从的组成、子报文的结构、工作计数器的功能到数据
    的头像 发表于 02-02 17:42 2226次阅读

    用于 SPI 绝对编码器的 Arduino 示例代码

    (SPI) 通信来配置和读取 [Same Sky] 的 [AMT22 绝对编码器] 的数据。该教程将提供所需的硬件和软件、关键设置要求以及单圈和多圈输出选项的示例代码包和说明。以下是入门工作所需的物料清单
    的头像 发表于 01-26 21:35 1299次阅读
    用于 SPI 绝对编码器的 Arduino <b class='flag-5'>示例</b><b class='flag-5'>代码</b>

    I2C总线设备地址设置方法

    通常是一个7位或10位的数字,用于标识总线上的每个设备。在7位寻址模式下,地址范围是0x00到0x7F,而在10位寻址模式下,地址范围是0x000到0x3FF。I2C地址的最低位(LSB)通常用于指示读/写操作。 硬件地址设置 1. 地址引脚配置 许多
    的头像 发表于 01-17 15:17 6989次阅读

    AN-840: 通过I2C接口更新代码

    电子发烧友网站提供《AN-840: 通过I2C接口更新代码.pdf》资料免费下载
    发表于 01-15 16:04 0次下载
    AN-840: 通过<b class='flag-5'>I</b>2C接口更新<b class='flag-5'>代码</b>

    tcpdump使用示例

    这里收集了一些实用的 tcpdump 使用示例,使用它们可提升您的网络故障排除和安全测试能力。 熟练掌握下面的 tcpdump 使用示例,可以帮助我们更好的了解自己的网络。 了解 tcpdump
    的头像 发表于 01-06 09:33 1238次阅读