本文解析幾個與參考幀重排序的相關函數。
- /*!
- ************************************************************************
- * \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 ])
- if( (RefPicListX[ cIdx ]->is_long_term ) || (RefPicListX[ cIdx ]->pic_num != picNumLX )) //!< 該操作可將參考幀列表中重複的序號爲picNumLX的參考幀覆蓋掉
- RefPicListX[ nIdx++ ] = RefPicListX[ cIdx ];
- }
- /*!
- ************************************************************************
- * \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;
- }
- /*!
- ************************************************************************
- * \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 ];
- }
- <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>