程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> H.264參考幀列表管理分析 —— JM中相關函數解析(中)

H.264參考幀列表管理分析 —— JM中相關函數解析(中)

編輯:C++入門知識

本文解析幾個與參考幀重排序的相關函數。

[cpp] 
/*!
 ************************************************************************
 * \brief
 *    Reordering process for short-term reference pictures 短期參考幀重排序
 *
 ************************************************************************
 */ 
static void reorder_short_term(StorablePicture **RefPicListX, int num_ref_idx_lX_active_minus1, int picNumLX, int *refIdxLX) 

  int cIdx, nIdx; 
 
  StorablePicture *picLX; 
 
  picLX = get_short_term_pic(picNumLX); //!< 根據給定的picNumLX獲取相應的短期參考幀 
 
  for( cIdx = num_ref_idx_lX_active_minus1+1; cIdx > *refIdxLX; cIdx-- ) 
    RefPicListX[ cIdx ] = RefPicListX[ cIdx - 1];    //!< 將refIdxLX位置之後的參考幀依次後移 
   
  RefPicListX[ (*refIdxLX)++ ] = picLX; //!< 將給定的picNumLX短期參考幀存至refIdxLX位置 
 
  nIdx = *refIdxLX; 
 
  for( cIdx = *refIdxLX; cIdx <= num_ref_idx_lX_active_minus1+1; cIdx++ ) 
    if (RefPicListX[ cIdx ])  www.2cto.com
      if( (RefPicListX[ cIdx ]->is_long_term ) ||  (RefPicListX[ cIdx ]->pic_num != picNumLX ))    //!< 該操作可將參考幀列表中重復的序號為picNumLX的參考幀覆蓋掉 
        RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ]; 
 

 

[cpp] 
 /*!
 ************************************************************************
 * \brief
 *    Returns short term pic with given picNum 返回給定picNum序號的短期參考幀
 *
 ************************************************************************
 */ 
static StorablePicture*  get_short_term_pic(int picNum) 

  unsigned i; 
 
  for (i=0; i<dpb.ref_frames_in_buffer; i++) //!< 遍歷dpb中的參考幀 
  { 
    if (img->structure==FRAME) //!< 幀模式 
    { 
      if (dpb.fs_ref[i]->is_reference == 3) 
        if ((!dpb.fs_ref[i]->frame->is_long_term)&&(dpb.fs_ref[i]->frame->pic_num == picNum)) 
          return dpb.fs_ref[i]->frame; //!< 找到pic_num等於picNum且不是長期參考幀的短期參考幀,返回 
    } 
    else //!< 場模式(略過) 
    { 
      if (dpb.fs_ref[i]->is_reference & 1) 
        if ((!dpb.fs_ref[i]->top_field->is_long_term)&&(dpb.fs_ref[i]->top_field->pic_num == picNum)) 
          return dpb.fs_ref[i]->top_field; 
      if (dpb.fs_ref[i]->is_reference & 2) 
        if ((!dpb.fs_ref[i]->bottom_field->is_long_term)&&(dpb.fs_ref[i]->bottom_field->pic_num == picNum)) 
          return dpb.fs_ref[i]->bottom_field; 
    } 
  } 
//  return NULL; 
  return no_reference_picture; 

 

[cpp] 
/*!
 ************************************************************************
 * \brief
 *    Reordering process for long-term reference pictures 長期參考幀重排序
 *
 ************************************************************************
 */ 
static void reorder_long_term(StorablePicture **RefPicListX, int num_ref_idx_lX_active_minus1, int LongTermPicNum, int *refIdxLX) 

  int cIdx, nIdx; 
 
  StorablePicture *picLX; 
 
  picLX = get_long_term_pic(LongTermPicNum); //!< 獲取給定LongTermPicNum的相應的長期參考幀 
 
  for( cIdx = num_ref_idx_lX_active_minus1+1; cIdx > *refIdxLX; cIdx-- ) 
    RefPicListX[ cIdx ] = RefPicListX[ cIdx - 1]; //!< 將refIdxLX之後的參考幀依次右移 
   
  RefPicListX[ (*refIdxLX)++ ] = picLX; //!< 將LongTermPicNum對應的長期參考幀存至refIdxLX位置 
 
  nIdx = *refIdxLX; 
 
  for( cIdx = *refIdxLX; cIdx <= num_ref_idx_lX_active_minus1+1; cIdx++ ) 
    if (RefPicListX[ cIdx ]) 
      if( (!RefPicListX[ cIdx ]->is_long_term ) ||  (RefPicListX[ cIdx ]->long_term_pic_num != LongTermPicNum )) //!< 可將序號為LongTermPicNum重復的參考幀覆蓋掉 
        RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ]; 

[cpp] 
<pre class="cpp" name="code">/*!
 ************************************************************************
 * \brief
 *    Returns long term pic with given LongtermPicNum
 *
 ************************************************************************
 */ 
static StorablePicture*  get_long_term_pic(int LongtermPicNum) 

  unsigned i; 
 
  for (i=0; i<dpb.ltref_frames_in_buffer; i++) //!< 遍歷dpb中所有的長期參考幀 
  { 
    if (img->structure==FRAME) //!< 幀模式 
    { 
      if (dpb.fs_ltref[i]->is_reference == 3) 
        if ((dpb.fs_ltref[i]->frame->is_long_term)&&(dpb.fs_ltref[i]->frame->long_term_pic_num == LongtermPicNum)) 
          return dpb.fs_ltref[i]->frame; //!< 找到long_term_pic_num等於LongtermPicNum的長期參考幀,返回 
    } 
    else //!< 場模式(略過) 
    { 
      if (dpb.fs_ltref[i]->is_reference & 1) 
        if ((dpb.fs_ltref[i]->top_field->is_long_term)&&(dpb.fs_ltref[i]->top_field->long_term_pic_num == LongtermPicNum)) 
          return dpb.fs_ltref[i]->top_field; 
      if (dpb.fs_ltref[i]->is_reference & 2) 
        if ((dpb.fs_ltref[i]->bottom_field->is_long_term)&&(dpb.fs_ltref[i]->bottom_field->long_term_pic_num == LongtermPicNum)) 
          return dpb.fs_ltref[i]->bottom_field; 
    } 
  } 
  return NULL; 
}</pre><pre class="cpp" name="code"> </pre> 
<pre></pre> 
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved