HEVC代码跟踪(1)

学习HEVC已经有两个月了吧,向我这样的又懒又爱拖延的人实在是进度慢的很。尤其是入门阶段(其实依然处于入门阶段),论文写得都高大上到难以理解,网上博客作者也都是各路大牛神级人物,他们写得必然是精华但是渣渣如我还没有达到能够直接读懂精华的level  o(╯□╰)o  加上编程基础几乎为零,编C语言用CFree编JAVA居然使用的记事本……说起来一把辛酸泪。当时就希望哪位大牛行行好多跟我等学渣啰嗦几句,但是大牛就是大牛,永远不会懂得学渣的苦。所以,在我跌跌撞撞开始觉得有些似懂非懂之后决定造福一下跟我一样处境的盆友们(们字请用升调~\(≧▽≦)/~),博主所有关于HEVC的原创博客都仅供交流,理解肯定有很多偏差,文章中也会记录博主的很多困惑,希望大家能多多指点、交流,让我等学渣一起抱团逆袭吧┏ (゜ω゜)=☞

打开HM15.0工程文件,七个工程慢悠悠地蹦出来,顿时傻眼……

别急,最先进入的当然是main,点进去一目了然,当你看到cTAppEncTop.encode();时,打起精神来,转到encode的定义(像我等刚刚开始接触VS的白痴真的应该有人提醒一下我,快捷键F12是转到定义)。此时此刻,我们进入了TAppEncTop.cpp文件,这个函数的定义很短,让人看了忍不住怀疑我真的在研究一个高大上的东西吗?Come on!不要too young too naive了,老老实实看下去。

前面的initialize的东西不用管了,因为你看了也对你没啥太大帮助。这个函数里面要注意一个变量:bEos。这个变量直接关系到编码一个序列时何时结束。一个while循环可以轻松愉快地说明这一切:

while ( !bEos )//当bEos为FALSE时,代表接受到的frame数小于将要编码的frame数,也就是还得继续接收。m_framesToBeEncoded是从cfg中读出来的
  {
    // get buffers
    xGetBuffer(pcPicYuvRec);


    // read input YUV file
    m_cTVideoIOYuvInputFile.read( pcPicYuvOrg, m_aiPad );
    
    // increase number of received frames
    m_iFrameRcvd++;
    //由bEos的赋值可见,cfg文件中指定编多少帧,它就编多少,一旦接收到足够多,立刻跳出编码循环
    bEos = (m_isField && (m_iFrameRcvd == (m_framesToBeEncoded >> 1) )) || ( !m_isField && (m_iFrameRcvd == m_framesToBeEncoded) );
    Bool flush = 0;
    // if end of file (which is only detected on a read failure) flush the encoder of any queued pictures
    if (m_cTVideoIOYuvInputFile.isEof())
    {
      flush = true;
      bEos = true;
      m_iFrameRcvd--;
      m_cTEncTop.setFramesToBeEncoded(m_iFrameRcvd);
    }


    // call encoding function for one frame编码读入的每一帧
    if ( m_isField )
    {
      m_cTEncTop.encode( bEos, flush ? 0 : pcPicYuvOrg, m_cListPicYuvRec, outputAccessUnits, iNumEncoded, m_isTopFieldFirst);
    }
    else
    {
      m_cTEncTop.encode( bEos, flush ? 0 : pcPicYuvOrg, m_cListPicYuvRec, outputAccessUnits, iNumEncoded );
    }
    
    // write bistream to file if necessary
    if ( iNumEncoded > 0 )
    {
      xWriteOutput(bitstreamFile, iNumEncoded, outputAccessUnits);
      outputAccessUnits.clear();
    }
  }

代码中的m_isField与场编码有关,指点我的师兄告诉我“无视它”,我还是很听话的。然后看这一句:

m_cTEncTop.encode( bEos, flush ? 0 : pcPicYuvOrg, m_cListPicYuvRec, outputAccessUnits, iNumEncoded );

我们知道,每过一遍这个while循环,就从文件中读入一帧,而这个encode函数便是对每一帧进行编码的函数了,果断转到定义。

轻轻一按F12,你就进入了TEncTop.cpp文件。注意,很多函数前面其实是有注释的,虽然我一直觉得写注释的人太不照顾初学者的感受了,但是还是不得不说,这些注释很是简明扼要,一定要看,有很大帮助。这个函数依然很短,可以一行行看下去并找到compressGOP,进入~

问题来了,我一直很困惑的一点,GOP是group of picture,前面我如果理解的没错的话,这个encode应该是对一帧进行编码,为什么又出了group?难道frame跟picture是有区别的?可是配置文件中在描述GOP参数的时候,直接写的是frame啊,求解答求交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值