H.264参考帧列表管理分析 —— JM中相关函数解析(中)

本文解析几个与参考帧重排序的相关函数。

[cpp]  view plain copy
  1. /*! 
  2.  ************************************************************************ 
  3.  * \brief 
  4.  *    Reordering process for short-term reference pictures 短期参考帧重排序 
  5.  * 
  6.  ************************************************************************ 
  7.  */  
  8. static void reorder_short_term(StorablePicture **RefPicListX, int num_ref_idx_lX_active_minus1, int picNumLX, int *refIdxLX)  
  9. {  
  10.   int cIdx, nIdx;  
  11.   
  12.   StorablePicture *picLX;  
  13.   
  14.   picLX = get_short_term_pic(picNumLX); //!< 根据给定的picNumLX获取相应的短期参考帧  
  15.   
  16.   for( cIdx = num_ref_idx_lX_active_minus1+1; cIdx > *refIdxLX; cIdx-- )  
  17.     RefPicListX[ cIdx ] = RefPicListX[ cIdx - 1];    //!< 将refIdxLX位置之后的参考帧依次后移  
  18.     
  19.   RefPicListX[ (*refIdxLX)++ ] = picLX; //!< 将给定的picNumLX短期参考帧存至refIdxLX位置  
  20.   
  21.   nIdx = *refIdxLX;  
  22.   
  23.   for( cIdx = *refIdxLX; cIdx <= num_ref_idx_lX_active_minus1+1; cIdx++ )  
  24.     if (RefPicListX[ cIdx ])  
  25.       if( (RefPicListX[ cIdx ]->is_long_term ) ||  (RefPicListX[ cIdx ]->pic_num != picNumLX ))    //!< 该操作可将参考帧列表中重复的序号为picNumLX的参考帧覆盖掉  
  26.         RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ];  
  27.   
  28. }  

 

[cpp]  view plain copy
  1.  /*! 
  2.  ************************************************************************ 
  3.  * \brief 
  4.  *    Returns short term pic with given picNum 返回给定picNum序号的短期参考帧 
  5.  * 
  6.  ************************************************************************ 
  7.  */  
  8. static StorablePicture*  get_short_term_pic(int picNum)  
  9. {  
  10.   unsigned i;  
  11.   
  12.   for (i=0; i<dpb.ref_frames_in_buffer; i++) //!< 遍历dpb中的参考帧  
  13.   {  
  14.     if (img->structure==FRAME) //!< 帧模式  
  15.     {  
  16.       if (dpb.fs_ref[i]->is_reference == 3)  
  17.         if ((!dpb.fs_ref[i]->frame->is_long_term)&&(dpb.fs_ref[i]->frame->pic_num == picNum))  
  18.           return dpb.fs_ref[i]->frame; //!< 找到pic_num等于picNum且不是长期参考帧的短期参考帧,返回  
  19.     }  
  20.     else //!< 场模式(略过)  
  21.     {  
  22.       if (dpb.fs_ref[i]->is_reference & 1)  
  23.         if ((!dpb.fs_ref[i]->top_field->is_long_term)&&(dpb.fs_ref[i]->top_field->pic_num == picNum))  
  24.           return dpb.fs_ref[i]->top_field;  
  25.       if (dpb.fs_ref[i]->is_reference & 2)  
  26.         if ((!dpb.fs_ref[i]->bottom_field->is_long_term)&&(dpb.fs_ref[i]->bottom_field->pic_num == picNum))  
  27.           return dpb.fs_ref[i]->bottom_field;  
  28.     }  
  29.   }  
  30. //  return NULL;  
  31.   return no_reference_picture;  
  32. }  


 

[cpp]  view plain copy
  1. /*! 
  2.  ************************************************************************ 
  3.  * \brief 
  4.  *    Reordering process for long-term reference pictures 长期参考帧重排序 
  5.  * 
  6.  ************************************************************************ 
  7.  */  
  8. static void reorder_long_term(StorablePicture **RefPicListX, int num_ref_idx_lX_active_minus1, int LongTermPicNum, int *refIdxLX)  
  9. {  
  10.   int cIdx, nIdx;  
  11.   
  12.   StorablePicture *picLX;  
  13.   
  14.   picLX = get_long_term_pic(LongTermPicNum); //!< 获取给定LongTermPicNum的相应的长期参考帧  
  15.   
  16.   for( cIdx = num_ref_idx_lX_active_minus1+1; cIdx > *refIdxLX; cIdx-- )  
  17.     RefPicListX[ cIdx ] = RefPicListX[ cIdx - 1]; //!< 将refIdxLX之后的参考帧依次右移  
  18.     
  19.   RefPicListX[ (*refIdxLX)++ ] = picLX; //!< 将LongTermPicNum对应的长期参考帧存至refIdxLX位置  
  20.   
  21.   nIdx = *refIdxLX;  
  22.   
  23.   for( cIdx = *refIdxLX; cIdx <= num_ref_idx_lX_active_minus1+1; cIdx++ )  
  24.     if (RefPicListX[ cIdx ])  
  25.       if( (!RefPicListX[ cIdx ]->is_long_term ) ||  (RefPicListX[ cIdx ]->long_term_pic_num != LongTermPicNum )) //!< 可将序号为LongTermPicNum重复的参考帧覆盖掉  
  26.         RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ];  
  27. }  
[cpp]  view plain copy
  1. <pre class="cpp" name="code">/*! 
  2.  ************************************************************************ 
  3.  * \brief 
  4.  *    Returns long term pic with given LongtermPicNum 
  5.  * 
  6.  ************************************************************************ 
  7.  */  
  8. static StorablePicture*  get_long_term_pic(int LongtermPicNum)  
  9. {  
  10.   unsigned i;  
  11.   
  12.   for (i=0; i<dpb.ltref_frames_in_buffer; i++) //!< 遍历dpb中所有的长期参考帧  
  13.   {  
  14.     if (img->structure==FRAME) //!< 帧模式  
  15.     {  
  16.       if (dpb.fs_ltref[i]->is_reference == 3)  
  17.         if ((dpb.fs_ltref[i]->frame->is_long_term)&&(dpb.fs_ltref[i]->frame->long_term_pic_num == LongtermPicNum))  
  18.           return dpb.fs_ltref[i]->frame; //!< 找到long_term_pic_num等于LongtermPicNum的长期参考帧,返回  
  19.     }  
  20.     else //!< 场模式(略过)  
  21.     {  
  22.       if (dpb.fs_ltref[i]->is_reference & 1)  
  23.         if ((dpb.fs_ltref[i]->top_field->is_long_term)&&(dpb.fs_ltref[i]->top_field->long_term_pic_num == LongtermPicNum))  
  24.           return dpb.fs_ltref[i]->top_field;  
  25.       if (dpb.fs_ltref[i]->is_reference & 2)  
  26.         if ((dpb.fs_ltref[i]->bottom_field->is_long_term)&&(dpb.fs_ltref[i]->bottom_field->long_term_pic_num == LongtermPicNum))  
  27.           return dpb.fs_ltref[i]->bottom_field;  
  28.     }  
  29.   }  
  30.   return NULL;  
  31. }</pre><pre class="cpp" name="code"> </pre>  
  32. <pre></pre>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值