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

本文解析与参考图像标记过程相关的几个函数。

[cpp]  view plain copy
  1. /*! 
  2.  ************************************************************************ 
  3.  * \brief 
  4.  *    Perform Sliding window decoded reference picture marking process 参考图像的滑窗标记过程 
  5.  * 
  6.  ************************************************************************ 
  7.  */  
  8. static void sliding_window_memory_management(StorablePicture* p)  
  9. {  
  10.   unsigned i;  
  11.   
  12.   assert (!p->idr_flag);  
  13.   // if this is a reference pic with sliding sliding window, unmark first ref frame  
  14.   if (dpb.ref_frames_in_buffer==dpb.num_ref_frames - dpb.ltref_frames_in_buffer)//!< 减去dpb.ltref_frames_in_buffer因滑窗标记不能使用在长期参考帧上  
  15.   {  
  16.     for (i=0; i<dpb.used_size;i++) //!< 采取FIFO策略,将dpb中第一个短期参考帧移出参考帧列表,并更新参考帧列表  
  17.     {  
  18.       if (dpb.fs[i]->is_reference  && (!(dpb.fs[i]->is_long_term)))  
  19.       {  
  20.         unmark_for_reference(dpb.fs[i]); //!< 标记该帧为非参考帧  
  21.         update_ref_list(); //!< 更新参考帧列表  
  22.         break;  
  23.       }  
  24.     }  
  25.   }  
  26.   
  27.   p->is_long_term = 0;  
  28. }  


 

[cpp]  view plain copy
  1. <span style="font-size:12px;">/*! 
  2.  ************************************************************************ 
  3.  * \brief 
  4.  *    Perform Adaptive memory control decoded reference picture marking process 自适应标记过程 
  5.  ************************************************************************ 
  6.  */  
  7. static void adaptive_memory_management(StorablePicture* p)  
  8. {  
  9.   DecRefPicMarking_t *tmp_drpm;  
  10.     
  11.   img->last_has_mmco_5 = 0;  //!< memory_management_control_operation  
  12.   
  13.   assert (!p->idr_flag);  
  14.   assert (p->adaptive_ref_pic_buffering_flag);  
  15.   
  16.   while (p->dec_ref_pic_marking_buffer)  //!< stores the memory management control operations  
  17.   {  
  18.     tmp_drpm = p->dec_ref_pic_marking_buffer; //!< 临时保存操作,可用于在执行完该操作后释放掉对应的内存  
  19.     switch (tmp_drpm->memory_management_control_operation)  
  20.     {  
  21.       case 0:   //!< 结束循环,退出标记操作  
  22.         if (tmp_drpm->Next != NULL)  
  23.         {  
  24.           error ("memory_management_control_operation = 0 not last operation in buffer", 500);  
  25.         }  
  26.         break;  
  27.       case 1:   //!< 将一个短期参考图像标记为非参考图像  
  28.         mm_unmark_short_term_for_reference(p, tmp_drpm->difference_of_pic_nums_minus1);  
  29.         update_ref_list();  
  30.         break;  
  31.       case 2:   //!< 将一个长期参考图像标记为非参考图像  
  32.         mm_unmark_long_term_for_reference(p, tmp_drpm->long_term_pic_num);  
  33.         update_ltref_list();  
  34.         break;  
  35.       case 3:   //!< 将一个短期参考图像转为长期参考图像  
  36.         mm_assign_long_term_frame_idx(p, tmp_drpm->difference_of_pic_nums_minus1, tmp_drpm->long_term_frame_idx);  
  37.         update_ref_list();  
  38.         update_ltref_list();  
  39.         break;  
  40.       case 4:   //!< 指明长期参考帧的最大数目  
  41.         mm_update_max_long_term_frame_idx (tmp_drpm->max_long_term_frame_idx_plus1);  
  42.         update_ltref_list();  
  43.         break;  
  44.       case 5:   //!< 清空参考帧队列,将所有参考图像移出参考帧队列,并禁用长期参考机制  
  45.         mm_unmark_all_short_term_for_reference();  
  46.         mm_unmark_all_long_term_for_reference();  
  47.        img->last_has_mmco_5 = 1; //!< 此处作标记用于接下来对POC进行更新  
  48.         break;  
  49.       case 6:   //!< 将当前图像存为一个长期参考帧  
  50.         mm_mark_current_picture_long_term(p, tmp_drpm->long_term_frame_idx);  
  51.         check_num_ref();  
  52.         break;  
  53.       default:  
  54.         error ("invalid memory_management_control_operation in buffer", 500);  
  55.     }  
  56.     p->dec_ref_pic_marking_buffer = tmp_drpm->Next; //!< 取下一个操作  
  57.     free (tmp_drpm); //!< 释放掉执行完的操作的内存  
  58.   }  
  59.   if ( img->last_has_mmco_5 )  
  60.   {  
  61.     p->pic_num = p->frame_num = 0; //!< 因参考帧列表清空,frame_num清零  
  62.       
  63.     switch (p->structure)  
  64.     {  
  65.     case TOP_FIELD:  
  66.       {  
  67.         p->poc = p->top_poc = img->toppoc =0;  
  68.         break;  
  69.       }  
  70.     case BOTTOM_FIELD:  
  71.       {  
  72.         p->poc = p->bottom_poc = img->bottompoc = 0;  
  73.         break;  
  74.       }  
  75.     case FRAME: //!< 帧模式  
  76.       {  
  77.         p->top_poc    -= p->poc;  
  78.         p->bottom_poc -= p->poc;  
  79.   
  80.         img->toppoc = p->top_poc;  
  81.         img->bottompoc = p->bottom_poc;  
  82.   
  83.         p->poc = min (p->top_poc, p->bottom_poc);  
  84.         img->framepoc = p->poc;  
  85.         break;  
  86.       }  
  87.     }  
  88.     img->ThisPOC = p->poc;  
  89.     flush_dpb();  
  90.   }  
  91. }</span>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值