Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2 *
      3 * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
      4 *
      5 * Licensed under the Apache License, Version 2.0 (the "License");
      6 * you may not use this file except in compliance with the License.
      7 * You may obtain a copy of the License at:
      8 *
      9 * http://www.apache.org/licenses/LICENSE-2.0
     10 *
     11 * Unless required by applicable law or agreed to in writing, software
     12 * distributed under the License is distributed on an "AS IS" BASIS,
     13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 * See the License for the specific language governing permissions and
     15 * limitations under the License.
     16 *
     17 ******************************************************************************/
     18 /**
     19 *******************************************************************************
     20 * @file
     21 *  ihevcd_api.c
     22 *
     23 * @brief
     24 *  Contains functions definitions for reference list generation
     25 *
     26 * @author
     27 *  Srinivas T
     28 *
     29 * @par List of Functions:\
     30 * - ihevcd_ref_pic
     31 *
     32 * @remarks
     33 *  None
     34 *
     35 *******************************************************************************
     36 */
     37 
     38 /*****************************************************************************/
     39 /* File Includes                                                             */
     40 /*****************************************************************************/
     41 #include <stdio.h>
     42 #include <stddef.h>
     43 #include <stdlib.h>
     44 #include <string.h>
     45 #include <assert.h>
     46 
     47 #include "ihevc_typedefs.h"
     48 #include "iv.h"
     49 #include "ivd.h"
     50 #include "ihevcd_cxa.h"
     51 
     52 #include "ihevc_defs.h"
     53 #include "ihevc_debug.h"
     54 #include "ihevc_defs.h"
     55 #include "ihevc_macros.h"
     56 #include "ihevc_platform_macros.h"
     57 #include "ihevc_structs.h"
     58 #include "ihevc_buf_mgr.h"
     59 #include "ihevc_dpb_mgr.h"
     60 
     61 #include "ihevcd_trace.h"
     62 #include "ihevcd_defs.h"
     63 #include "ihevc_cabac_tables.h"
     64 #include "ihevcd_function_selector.h"
     65 #include "ihevcd_structs.h"
     66 #include "ihevcd_error.h"
     67 #include "ihevcd_nal.h"
     68 #include "ihevcd_bitstream.h"
     69 #include "ihevcd_debug.h"
     70 #include "ihevcd_error.h"
     71 
     72 
     73 mv_buf_t* ihevcd_mv_mgr_get_poc(buf_mgr_t *ps_mv_buf_mgr, UWORD32 abs_poc)
     74 {
     75     UWORD32 i;
     76     mv_buf_t *ps_mv_buf = NULL;
     77 
     78 
     79 
     80     for(i = 0; i < ps_mv_buf_mgr->u4_max_buf_cnt; i++)
     81     {
     82         ps_mv_buf = (mv_buf_t *)ps_mv_buf_mgr->apv_ptr[i];
     83         if(ps_mv_buf && (ps_mv_buf->i4_abs_poc == (WORD32)abs_poc))
     84         {
     85             break;
     86         }
     87     }
     88 
     89     return ps_mv_buf;
     90 }
     91 
     92 
     93 WORD32 ihevcd_ref_list(codec_t *ps_codec, pps_t *ps_pps, sps_t *ps_sps, slice_header_t *ps_slice_hdr)
     94 {
     95     WORD32 i, j;
     96     WORD32 st_rps_idx;
     97     WORD32 num_neg_pics, num_pos_pics;
     98     WORD8 *pi1_used;
     99     WORD16 *pi2_delta_poc;
    100     UWORD32 u4_max_poc_lsb;
    101     pic_buf_t *ps_pic_buf;
    102     mv_buf_t *ps_mv_buf;
    103     UWORD32 r_idx;
    104 
    105     dpb_mgr_t *ps_dpb_mgr = (dpb_mgr_t *)ps_codec->pv_dpb_mgr;
    106     buf_mgr_t *ps_mv_buf_mgr = (buf_mgr_t *)ps_codec->pv_mv_buf_mgr;
    107 
    108     WORD32 ai4_poc_st_curr_before[MAX_DPB_SIZE], ai4_poc_st_foll[MAX_DPB_SIZE], ai4_poc_st_curr_after[MAX_DPB_SIZE];
    109     WORD32 ai4_poc_lt_curr[MAX_DPB_SIZE], ai4_poc_lt_foll[MAX_DPB_SIZE];
    110     UWORD32 u4_num_st_curr_before, u4_num_st_foll, u4_num_st_curr_after, u4_num_lt_curr, u4_num_lt_foll;
    111     UWORD32 u4_num_total_curr;
    112 
    113     WORD8 ai1_curr_delta_poc_msb_present_flag[MAX_DPB_SIZE], ai1_foll_delta_poc_msb_present_flag[MAX_DPB_SIZE];
    114 
    115     pic_buf_t *as_ref_pic_lt_curr[MAX_DPB_SIZE];
    116     pic_buf_t *as_ref_pic_lt_foll[MAX_DPB_SIZE];
    117     pic_buf_t *as_ref_pic_st_curr_after[MAX_DPB_SIZE];
    118     pic_buf_t *as_ref_pic_st_curr_before[MAX_DPB_SIZE];
    119     pic_buf_t *as_ref_pic_st_foll[MAX_DPB_SIZE];
    120 
    121     pic_buf_t *as_ref_pic_list_temp0[MAX_DPB_SIZE], *as_ref_pic_list_temp1[MAX_DPB_SIZE];
    122 
    123     UWORD32 u4_num_rps_curr_temp_list0, u4_num_rps_curr_temp_list1;
    124 
    125     WORD32 i4_pic_order_cnt_val;
    126     WORD32 i4_poc_lt;
    127     UNUSED(as_ref_pic_lt_foll);
    128     UNUSED(as_ref_pic_st_foll);
    129     UNUSED(ps_pps);
    130 
    131     RETURN_IF_NAL_INFO;
    132 
    133     u4_max_poc_lsb = (1 << ps_sps->i1_log2_max_pic_order_cnt_lsb);
    134 
    135     i4_pic_order_cnt_val = ps_slice_hdr->i4_abs_pic_order_cnt;
    136 
    137     if(1 == ps_slice_hdr->i1_short_term_ref_pic_set_sps_flag)
    138     {
    139         st_rps_idx = ps_slice_hdr->i1_short_term_ref_pic_set_idx;
    140         num_neg_pics = ps_sps->as_stref_picset[st_rps_idx].i1_num_neg_pics;
    141         num_pos_pics = ps_sps->as_stref_picset[st_rps_idx].i1_num_pos_pics;
    142         pi1_used = ps_sps->as_stref_picset[st_rps_idx].ai1_used;
    143         pi2_delta_poc = ps_sps->as_stref_picset[st_rps_idx].ai2_delta_poc;
    144     }
    145     else
    146     {
    147         st_rps_idx = ps_sps->i1_num_short_term_ref_pic_sets;
    148         num_neg_pics = ps_slice_hdr->s_stref_picset.i1_num_neg_pics;
    149         num_pos_pics = ps_slice_hdr->s_stref_picset.i1_num_pos_pics;
    150         pi1_used = ps_slice_hdr->s_stref_picset.ai1_used;
    151         pi2_delta_poc = ps_slice_hdr->s_stref_picset.ai2_delta_poc;
    152     }
    153 
    154     u4_num_st_curr_before = 0;
    155     u4_num_st_foll = 0;
    156     for(i = 0; i < num_neg_pics; i++)
    157     {
    158         if(pi1_used[i])
    159         {
    160             ai4_poc_st_curr_before[u4_num_st_curr_before] = i4_pic_order_cnt_val + pi2_delta_poc[i];
    161             u4_num_st_curr_before++;
    162         }
    163         else
    164         {
    165             ai4_poc_st_foll[u4_num_st_foll] = i4_pic_order_cnt_val + pi2_delta_poc[i];
    166             u4_num_st_foll++;
    167         }
    168     }
    169     u4_num_st_curr_after = 0;
    170     for(i = num_neg_pics; i < num_neg_pics + num_pos_pics; i++)
    171     {
    172         if(pi1_used[i])
    173         {
    174             ai4_poc_st_curr_after[u4_num_st_curr_after] = i4_pic_order_cnt_val + pi2_delta_poc[i];
    175             u4_num_st_curr_after++;
    176         }
    177         else
    178         {
    179             ai4_poc_st_foll[u4_num_st_foll] = i4_pic_order_cnt_val + pi2_delta_poc[i];
    180             u4_num_st_foll++;
    181         }
    182     }
    183 
    184     u4_num_lt_curr = 0;
    185     u4_num_lt_foll = 0;
    186     for(i = 0; i < ps_slice_hdr->i1_num_long_term_sps + ps_slice_hdr->i1_num_long_term_pics; i++)
    187     {
    188         i4_poc_lt = ps_slice_hdr->ai4_poc_lsb_lt[i];
    189         if(ps_slice_hdr->ai1_delta_poc_msb_present_flag[i])
    190         {
    191             i4_poc_lt += i4_pic_order_cnt_val - ps_slice_hdr->ai1_delta_poc_msb_cycle_lt[i] * u4_max_poc_lsb - ps_slice_hdr->i4_pic_order_cnt_lsb;
    192         }
    193 
    194         if(ps_slice_hdr->ai1_used_by_curr_pic_lt_flag[i])
    195         {
    196             ai4_poc_lt_curr[u4_num_lt_curr] = i4_poc_lt;
    197             ai1_curr_delta_poc_msb_present_flag[u4_num_lt_curr] = ps_slice_hdr->ai1_delta_poc_msb_present_flag[i];
    198             u4_num_lt_curr++;
    199         }
    200         else
    201         {
    202             ai4_poc_lt_foll[u4_num_lt_foll] = i4_poc_lt;
    203             ai1_foll_delta_poc_msb_present_flag[u4_num_lt_foll] = ps_slice_hdr->ai1_delta_poc_msb_present_flag[i];
    204             u4_num_lt_foll++;
    205         }
    206     }
    207 
    208     u4_num_total_curr = u4_num_lt_curr + u4_num_st_curr_after + u4_num_st_curr_before;
    209 
    210     /* Bit stream conformance tests */
    211 /*
    212     for(i = 0; i < u4_num_lt_curr; i++)
    213     {
    214         int j;
    215         if(ai1_curr_delta_poc_msb_present_flag[i])
    216         {
    217             for(j = 0; j < u4_num_st_curr_before; j++)
    218             {
    219                 ASSERT(ai4_poc_st_curr_before[j] != ai4_poc_lt_curr[i]);
    220             }
    221             for(j = 0; j < u4_num_st_curr_after; j++)
    222             {
    223                 ASSERT(ai4_poc_st_curr_after[j] != ai4_poc_lt_curr[i]);
    224             }
    225             for(j = 0; j < u4_num_st_foll; j++)
    226             {
    227                 ASSERT(ai4_poc_st_foll[j] != ai4_poc_lt_curr[i]);
    228             }
    229             for(j = 0; j < u4_num_lt_curr; j++)
    230             {
    231                 ASSERT((ai4_poc_lt_curr[j] != ai4_poc_lt_curr[i]) || (j == i));
    232             }
    233         }
    234         else
    235         {
    236             for(j = 0; j < u4_num_st_curr_before; j++)
    237             {
    238                 ASSERT((ai4_poc_st_curr_before[j] & (u4_max_poc_lsb - 1)) != ai4_poc_lt_curr[i]);
    239             }
    240             for(j = 0; j < u4_num_st_curr_after; j++)
    241             {
    242                 ASSERT((ai4_poc_st_curr_after[j] & (u4_max_poc_lsb - 1)) != ai4_poc_lt_curr[i]);
    243             }
    244             for(j = 0; j < u4_num_st_foll; j++)
    245             {
    246                 ASSERT((ai4_poc_st_foll[j] & (u4_max_poc_lsb - 1)) != ai4_poc_lt_curr[i]);
    247             }
    248             for(j = 0; j < u4_num_lt_curr; j++)
    249             {
    250                 ASSERT(((ai4_poc_lt_curr[j] & (u4_max_poc_lsb - 1)) != ai4_poc_lt_curr[i]) || (j == i));
    251             }
    252         }
    253     }
    254 
    255     for(i = 0; i < u4_num_lt_foll; i++)
    256     {
    257         int j;
    258         if(ai1_foll_delta_poc_msb_present_flag[i])
    259         {
    260             for(j = 0; j < u4_num_st_curr_before; j++)
    261             {
    262                 ASSERT(ai4_poc_st_curr_before[j] != ai4_poc_lt_foll[i]);
    263             }
    264             for(j = 0; j < u4_num_st_curr_after; j++)
    265             {
    266                 ASSERT(ai4_poc_st_curr_after[j] != ai4_poc_lt_foll[i]);
    267             }
    268             for(j = 0; j < u4_num_st_foll; j++)
    269             {
    270                 ASSERT(ai4_poc_st_foll[j] != ai4_poc_lt_foll[i]);
    271             }
    272             for(j = 0; j < u4_num_lt_curr; j++)
    273             {
    274                 ASSERT(ai4_poc_lt_curr[j] != ai4_poc_lt_foll[i]);
    275             }
    276             for(j = 0; j < u4_num_lt_foll; j++)
    277             {
    278                 ASSERT((ai4_poc_lt_foll[j] != ai4_poc_lt_foll[i]) || (j == i));
    279             }
    280         }
    281         else
    282         {
    283             for(j = 0; j < u4_num_st_curr_before; j++)
    284             {
    285                 ASSERT((ai4_poc_st_curr_before[j] & (u4_max_poc_lsb - 1)) != ai4_poc_lt_foll[i]);
    286             }
    287             for(j = 0; j < u4_num_st_curr_after; j++)
    288             {
    289                 ASSERT((ai4_poc_st_curr_after[j] & (u4_max_poc_lsb - 1)) != ai4_poc_lt_foll[i]);
    290             }
    291             for(j = 0; j < u4_num_st_foll; j++)
    292             {
    293                 ASSERT((ai4_poc_st_foll[j] & (u4_max_poc_lsb - 1)) != ai4_poc_lt_foll[i]);
    294             }
    295             for(j = 0; j < u4_num_lt_curr; j++)
    296             {
    297                 ASSERT((ai4_poc_lt_curr[j] & (u4_max_poc_lsb - 1)) != ai4_poc_lt_foll[i]);
    298             }
    299             for(j = 0; j < u4_num_lt_foll; j++)
    300             {
    301                 ASSERT(((ai4_poc_lt_foll[j] & (u4_max_poc_lsb - 1)) != ai4_poc_lt_foll[i]) || (j == i));
    302             }
    303         }
    304     }
    305 */
    306 
    307 
    308     /* Reference Pic sets creation */
    309 
    310     /* Set all the DPB buffers to UNUSED_FOR_REF */
    311     if(0 == ps_codec->i4_pic_present)
    312     {
    313         for(i = 0; i < MAX_DPB_BUFS; i++)
    314         {
    315             if(ps_dpb_mgr->as_dpb_info[i].ps_pic_buf)
    316                 ps_dpb_mgr->as_dpb_info[i].ps_pic_buf->u1_used_as_ref = UNUSED_FOR_REF;
    317         }
    318     }
    319 
    320     for(i = 0; i < (WORD32)u4_num_lt_curr; i++)
    321     {
    322         if(0 == ai1_curr_delta_poc_msb_present_flag[i])
    323         {
    324             ps_pic_buf = ihevc_dpb_mgr_get_ref_by_poc_lsb(ps_dpb_mgr, ai4_poc_lt_curr[i]);
    325             if(NULL != ps_pic_buf)
    326                 ps_pic_buf->u1_used_as_ref = LONG_TERM_REF;
    327 
    328             as_ref_pic_lt_curr[i] = ps_pic_buf;
    329         }
    330         else
    331         {
    332             ps_pic_buf = ihevc_dpb_mgr_get_ref_by_poc(ps_dpb_mgr, ai4_poc_lt_curr[i]);
    333             if(NULL != ps_pic_buf)
    334                 ps_pic_buf->u1_used_as_ref = LONG_TERM_REF;
    335 
    336             as_ref_pic_lt_curr[i] = ps_pic_buf;
    337         }
    338     }
    339 
    340     for(i = 0; i < (WORD32)u4_num_lt_foll; i++)
    341     {
    342         if(0 == ai1_foll_delta_poc_msb_present_flag[i])
    343         {
    344             ps_pic_buf = ihevc_dpb_mgr_get_ref_by_poc_lsb(ps_dpb_mgr, ai4_poc_lt_foll[i]);
    345             if(NULL != ps_pic_buf)
    346                 ps_pic_buf->u1_used_as_ref = LONG_TERM_REF;
    347 
    348             as_ref_pic_lt_foll[i] = ps_pic_buf;
    349         }
    350         else
    351         {
    352             ps_pic_buf = ihevc_dpb_mgr_get_ref_by_poc(ps_dpb_mgr, ai4_poc_lt_foll[i]);
    353             if(NULL != ps_pic_buf)
    354                 ps_pic_buf->u1_used_as_ref = LONG_TERM_REF;
    355 
    356             as_ref_pic_lt_foll[i] = ps_pic_buf;
    357         }
    358     }
    359 
    360 
    361     for(i = 0; i < (WORD32)u4_num_st_curr_before; i++)
    362     {
    363 
    364         ps_pic_buf = ihevc_dpb_mgr_get_ref_by_poc(ps_dpb_mgr, ai4_poc_st_curr_before[i]);
    365         if(NULL != ps_pic_buf)
    366             ps_pic_buf->u1_used_as_ref = SHORT_TERM_REF;
    367 
    368         as_ref_pic_st_curr_before[i] = ps_pic_buf;
    369     }
    370 
    371     for(i = 0; i < (WORD32)u4_num_st_curr_after; i++)
    372     {
    373         ps_pic_buf = ihevc_dpb_mgr_get_ref_by_poc(ps_dpb_mgr, ai4_poc_st_curr_after[i]);
    374         if(NULL != ps_pic_buf)
    375             ps_pic_buf->u1_used_as_ref = SHORT_TERM_REF;
    376 
    377         as_ref_pic_st_curr_after[i] = ps_pic_buf;
    378     }
    379 
    380     for(i = 0; i < (WORD32)u4_num_st_foll; i++)
    381     {
    382         ps_pic_buf = ihevc_dpb_mgr_get_ref_by_poc(ps_dpb_mgr, ai4_poc_st_foll[i]);
    383         if(NULL != ps_pic_buf)
    384             ps_pic_buf->u1_used_as_ref = SHORT_TERM_REF;
    385 
    386         as_ref_pic_st_foll[i] = ps_pic_buf;
    387     }
    388 
    389     //TODO: Bit stream conformance tests to be included
    390 
    391     u4_num_rps_curr_temp_list0 = (WORD32)u4_num_total_curr > ps_slice_hdr->i1_num_ref_idx_l0_active ? (WORD32)u4_num_total_curr : ps_slice_hdr->i1_num_ref_idx_l0_active;
    392 
    393     r_idx = 0;
    394     if((PSLICE == ps_slice_hdr->i1_slice_type) ||
    395        (BSLICE == ps_slice_hdr->i1_slice_type))
    396     {
    397         while(r_idx < u4_num_rps_curr_temp_list0)
    398         {
    399             for(i = 0; (i < (WORD32)u4_num_st_curr_before) && (r_idx < u4_num_rps_curr_temp_list0); r_idx++, i++)
    400             {
    401                 if(NULL == as_ref_pic_st_curr_before[i])
    402                 {
    403                     as_ref_pic_st_curr_before[i] = ihevc_dpb_mgr_get_ref_by_nearest_poc(ps_dpb_mgr, ai4_poc_st_curr_before[i]);
    404                 }
    405                 as_ref_pic_list_temp0[r_idx] = as_ref_pic_st_curr_before[i];
    406             }
    407 
    408             for(i = 0; (i < (WORD32)u4_num_st_curr_after) && (r_idx < u4_num_rps_curr_temp_list0); r_idx++, i++)
    409             {
    410                 if(NULL == as_ref_pic_st_curr_after[i])
    411                 {
    412                     as_ref_pic_st_curr_after[i] = ihevc_dpb_mgr_get_ref_by_nearest_poc(ps_dpb_mgr, ai4_poc_st_curr_after[i]);
    413                 }
    414                 as_ref_pic_list_temp0[r_idx] = as_ref_pic_st_curr_after[i];
    415             }
    416 
    417             for(i = 0; (i < (WORD32)u4_num_lt_curr) && (r_idx < u4_num_rps_curr_temp_list0); r_idx++, i++)
    418             {
    419                 if(NULL == as_ref_pic_lt_curr[i])
    420                 {
    421                     as_ref_pic_lt_curr[i] = ihevc_dpb_mgr_get_ref_by_nearest_poc(ps_dpb_mgr, ai4_poc_lt_curr[i]);
    422                 }
    423                 as_ref_pic_list_temp0[r_idx] = as_ref_pic_lt_curr[i];
    424             }
    425         }
    426 
    427         for(r_idx = 0; (WORD32)r_idx < ps_slice_hdr->i1_num_ref_idx_l0_active; r_idx++)
    428         {
    429             pic_buf_t *ps_pic_buf;
    430             ps_slice_hdr->as_ref_pic_list0[r_idx].pv_pic_buf = ps_slice_hdr->s_rplm.i1_ref_pic_list_modification_flag_l0 ?  (void *)as_ref_pic_list_temp0[ps_slice_hdr->s_rplm.i1_list_entry_l0[r_idx]] :  (void *)as_ref_pic_list_temp0[r_idx];
    431             ps_pic_buf = (pic_buf_t *)ps_slice_hdr->as_ref_pic_list0[r_idx].pv_pic_buf;
    432 
    433             if(ps_pic_buf == NULL)
    434                 return IHEVCD_REF_PIC_NOT_FOUND;
    435 
    436             ps_mv_buf = ihevcd_mv_mgr_get_poc(ps_mv_buf_mgr, ps_pic_buf->i4_abs_poc);
    437             ps_slice_hdr->as_ref_pic_list0[r_idx].pv_mv_buf = ps_mv_buf;
    438         }
    439 
    440 
    441         if(ps_slice_hdr->i1_slice_type  == BSLICE)
    442         {
    443             u4_num_rps_curr_temp_list1 = (WORD32)u4_num_total_curr > ps_slice_hdr->i1_num_ref_idx_l1_active ? (WORD32)u4_num_total_curr : ps_slice_hdr->i1_num_ref_idx_l1_active;
    444 
    445             r_idx = 0;
    446             while(r_idx < u4_num_rps_curr_temp_list1)
    447             {
    448                 for(i = 0; (i < (WORD32)u4_num_st_curr_after) && (r_idx < u4_num_rps_curr_temp_list1); r_idx++, i++)
    449                 {
    450                     if(NULL == as_ref_pic_st_curr_after[i])
    451                     {
    452                         as_ref_pic_st_curr_after[i] = ihevc_dpb_mgr_get_ref_by_nearest_poc(ps_dpb_mgr, ai4_poc_st_curr_after[i]);
    453                     }
    454                     as_ref_pic_list_temp1[r_idx] = as_ref_pic_st_curr_after[i];
    455                 }
    456 
    457                 for(i = 0; (i < (WORD32)u4_num_st_curr_before) && (r_idx < u4_num_rps_curr_temp_list1); r_idx++, i++)
    458                 {
    459                     if(NULL == as_ref_pic_st_curr_before[i])
    460                     {
    461                         as_ref_pic_st_curr_before[i] = ihevc_dpb_mgr_get_ref_by_nearest_poc(ps_dpb_mgr, ai4_poc_st_curr_before[i]);
    462                     }
    463                     as_ref_pic_list_temp1[r_idx] = as_ref_pic_st_curr_before[i];
    464                 }
    465 
    466                 for(i = 0; (i < (WORD32)u4_num_lt_curr) && (r_idx < u4_num_rps_curr_temp_list1); r_idx++, i++)
    467                 {
    468                     if(NULL == as_ref_pic_lt_curr[i])
    469                     {
    470                         as_ref_pic_lt_curr[i] = ihevc_dpb_mgr_get_ref_by_nearest_poc(ps_dpb_mgr, ai4_poc_lt_curr[i]);
    471                     }
    472                     as_ref_pic_list_temp1[r_idx] = as_ref_pic_lt_curr[i];
    473                 }
    474             }
    475 
    476             for(r_idx = 0; (WORD32)r_idx < ps_slice_hdr->i1_num_ref_idx_l1_active; r_idx++)
    477             {
    478                 pic_buf_t *ps_pic_buf;
    479                 ps_slice_hdr->as_ref_pic_list1[r_idx].pv_pic_buf = ps_slice_hdr->s_rplm.i1_ref_pic_list_modification_flag_l1 ?  (void *)as_ref_pic_list_temp1[ps_slice_hdr->s_rplm.i1_list_entry_l1[r_idx]] :  (void *)as_ref_pic_list_temp1[r_idx];
    480                 ps_pic_buf = (pic_buf_t *)ps_slice_hdr->as_ref_pic_list1[r_idx].pv_pic_buf;
    481 
    482                 if(ps_pic_buf == NULL)
    483                     return IHEVCD_REF_PIC_NOT_FOUND;
    484 
    485                 ps_mv_buf = ihevcd_mv_mgr_get_poc(ps_mv_buf_mgr, ps_pic_buf->i4_abs_poc);
    486                 ps_slice_hdr->as_ref_pic_list1[r_idx].pv_mv_buf = ps_mv_buf;
    487             }
    488         }
    489     }
    490 
    491     DEBUG_PRINT_REF_LIST_POCS(i4_pic_order_cnt_val, ps_slice_hdr, ps_dpb_mgr, u4_num_st_curr_before, u4_num_st_curr_after, u4_num_st_foll, u4_num_lt_curr, u4_num_lt_foll, ai4_poc_st_curr_before, ai4_poc_st_curr_after, ai4_poc_st_foll, ai4_poc_lt_curr, ai4_poc_lt_foll);
    492     /* Buffers that are still marked as UNUSED_FOR_REF are released from dpb (internally dpb calls release from pic buf manager)*/
    493     for(i = 0; i < MAX_DPB_BUFS; i++)
    494     {
    495         if((ps_dpb_mgr->as_dpb_info[i].ps_pic_buf) && (UNUSED_FOR_REF == ps_dpb_mgr->as_dpb_info[i].ps_pic_buf->u1_used_as_ref))
    496         {
    497             pic_buf_t *ps_pic_buf = ps_dpb_mgr->as_dpb_info[i].ps_pic_buf;
    498             mv_buf_t *ps_mv_buf;
    499 
    500             /* Long term index is set to MAX_DPB_BUFS to ensure it is not added as LT */
    501             ihevc_dpb_mgr_del_ref(ps_dpb_mgr, (buf_mgr_t *)ps_codec->pv_pic_buf_mgr, ps_pic_buf->i4_abs_poc);
    502 
    503 
    504             /* Find buffer id of the MV bank corresponding to the buffer being freed (Buffer with POC of u4_abs_poc) */
    505             ps_mv_buf = (mv_buf_t *)ps_codec->ps_mv_buf;
    506             for(j = 0; j < ps_codec->i4_max_dpb_size; j++)
    507             {
    508                 if(ps_mv_buf && ps_mv_buf->i4_abs_poc == ps_pic_buf->i4_abs_poc)
    509                 {
    510                     ihevc_buf_mgr_release((buf_mgr_t *)ps_codec->pv_mv_buf_mgr, j, BUF_MGR_REF);
    511                     break;
    512                 }
    513                 ps_mv_buf++;
    514             }
    515         }
    516 
    517     }
    518 
    519     return IHEVCD_SUCCESS;
    520 }
    521