1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/*! 3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *********************************************************************** 4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * \file: h264_dpb_ctl.c 5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee * 6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *********************************************************************** 7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_debug.h" 10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_parser_ops.h" 11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_workload.h" 13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_pm.h" 14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_h264_parse.h" 15bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 17bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//#include <limits.h> 19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "h264parse.h" 20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "h264parse_dpb.h" 21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//#include "h264_debug.h" 22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifndef NULL 24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#define NULL 0 25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//#ifndef USER_MODE 27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//#define NULL 0 28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//#endif 29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////// Declare Globals/////////////////////////////// 31bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeframe_store *active_fs; 32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee///////////////////////// DPB init ////////////////////////////////////////// 37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Init DPB 39bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Description: init dpb, which should be called while open 40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 41bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 43bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_init_dpb(h264_DecodedPictureBuffer * p_dpb) 44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t i; 46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// Init DPB to zero 48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_memset(p_dpb, 0x0, sizeof(h264_DecodedPictureBuffer) ); 49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(i=0;i<NUM_DPB_FRAME_STORES;i++) 52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs[i].fs_idc = MPD_DPB_FS_NULL_IDC; 54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_dpb_idc[i] = MPD_DPB_FS_NULL_IDC; 55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->used_size = 0; 57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_dec_idc = MPD_DPB_FS_NULL_IDC; 58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_non_exist_idc = MPD_DPB_FS_NULL_IDC; 59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee///////////////////////// Reference list management ////////////////////////// 65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_add_ref_list () 71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Adds an idc to the long term reference list 73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 74bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_add_ref_list(h264_DecodedPictureBuffer * p_dpb, int32_t ref_idc) 75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_ref_idc[p_dpb->ref_frames_in_buffer] = ref_idc; 77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->ref_frames_in_buffer++; 78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_add_ltref_list () 84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Adds an idc to the long term reference list 86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 87bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_add_ltref_list(h264_DecodedPictureBuffer * p_dpb, int32_t ref_idc) 88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_ltref_idc[p_dpb->ltref_frames_in_buffer] = ref_idc; 90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->ltref_frames_in_buffer++; 91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_update_all_ref_lists (h264_DecodedPictureBuffer * p_dpb,int32_t NonExisting) 97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Decide whether the current picture needs to be added to the reference lists 99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// active_fs should be set-up prior to calling this function 100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Check if we need to search the lists here 102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// or can we go straight to adding to ref lists.. 103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 105bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_insert_ref_lists(h264_DecodedPictureBuffer * p_dpb, int32_t NonExisting) 106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting) 108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb,p_dpb->fs_non_exist_idc); 109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if(active_fs->is_reference) 113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs->frame.used_for_reference) 114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_long_term(active_fs)) 116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_dec_structure(active_fs) == FRAME) 118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_add_ltref_list(p_dpb, active_fs->fs_idc); 119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t found_in_list = 0, i = 0; 122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; (i < p_dpb->ltref_frames_in_buffer) && (found_in_list == 0); i++) { 123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->fs_ltref_idc[i] == active_fs->fs_idc) found_in_list = 1; 124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(found_in_list == 0) h264_dpb_add_ltref_list(p_dpb, active_fs->fs_idc); 127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_dec_structure(active_fs) == FRAME) { 132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_add_ref_list(p_dpb, active_fs->fs_idc); 133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else 134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t found_in_list = 0, i = 0; 136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; (i < p_dpb->ref_frames_in_buffer) && (found_in_list == 0); i++) 138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->fs_ref_idc[i] == active_fs->fs_idc) found_in_list = 1; 140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(found_in_list == 0) h264_dpb_add_ref_list(p_dpb, active_fs->fs_idc); 143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Set active fs 156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 158bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_set_active_fs(h264_DecodedPictureBuffer * p_dpb, int32_t index) 159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs = &p_dpb->fs[index]; 161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Sort reference list 167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 169bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_list_sort(uint8_t *list, int32_t *sort_indices, int32_t size, int32_t desc) 170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t j, k, temp, idc; 172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Dodgy looking for embedded code here... 174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(size > 1) 175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (j = 0; j < size-1; j = j + 1) { 177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (k = j + 1; k < size; k = k + 1) { 178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((desc & (sort_indices[j] < sort_indices[k]))| 179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (~desc & (sort_indices[j] > sort_indices[k])) ) 180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp = sort_indices[k]; 182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_indices[k] = sort_indices[j]; 183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_indices[j] = temp; 184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idc = list[k]; 185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list[k] = list[j]; 186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list[j] = idc; 187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_pic_is_bottom_field_ref () 198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Used to sort a list based on a corresponding sort indices 200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 202bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t h264_dpb_pic_is_bottom_field_ref(int32_t long_term) 203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t temp; 205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(long_term) temp = ((active_fs->bottom_field.used_for_reference) && (active_fs->bottom_field.is_long_term)) ? 1 : 0; 206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else temp = ((active_fs->bottom_field.used_for_reference) && !(active_fs->bottom_field.is_long_term)) ? 1 : 0; 207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return temp; 209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_pic_is_top_field_ref () 215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Used to sort a list based on a corresponding sort indices 217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 219bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t h264_dpb_pic_is_top_field_ref(int32_t long_term) 220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t temp; 222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(long_term) 223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp = ((active_fs->top_field.used_for_reference) && (active_fs->top_field.is_long_term)) ? 1 : 0; 224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp = ((active_fs->top_field.used_for_reference) && !(active_fs->top_field.is_long_term)) ? 1 : 0; 226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return temp; 228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_gen_pic_list_from_frame_list () 236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Used to sort a list based on a corresponding sort indices 238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 240bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t h264_dpb_gen_pic_list_from_frame_list(h264_DecodedPictureBuffer *p_dpb, uint8_t *pic_list, uint8_t *frame_list, int32_t currPicStructure, int32_t list_size, int32_t long_term) 241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t top_idx, bot_idx, got_pic, list_idx; 243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t lterm; 244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_idx = 0; 246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lterm = (long_term)? 1:0; 247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(list_size){ 249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee top_idx = 0; 252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee bot_idx = 0; 253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (currPicStructure == TOP_FIELD) { 255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while ((top_idx < list_size)||(bot_idx < list_size)) 256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////////////////////////////////////////// ref Top Field 258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee got_pic = 0; 259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while ((top_idx < list_size) & ~got_pic) 260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, frame_list[top_idx]); 262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((viddec_h264_get_is_used(active_fs))&0x1) 263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(h264_dpb_pic_is_top_field_ref(long_term)) 265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pic_list[list_idx] = PUT_LIST_LONG_TERM_BITS(lterm) + frame_list[top_idx] + PUT_LIST_INDEX_FIELD_BIT(0); // top_field 267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_idx++; 268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee got_pic = 1; 269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee top_idx++; 272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////////////////////////////////////////// ref Bottom Field 275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee got_pic = 0; 276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while ((bot_idx < list_size) & ~got_pic) 277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, frame_list[bot_idx]); 279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((viddec_h264_get_is_used(active_fs))&0x2) 280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(h264_dpb_pic_is_bottom_field_ref(long_term)) 282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pic_list[list_idx] = PUT_LIST_LONG_TERM_BITS(lterm) + frame_list[bot_idx] + PUT_LIST_INDEX_FIELD_BIT(1); // bottom_field 284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_idx++; 285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee got_pic = 1; 286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee bot_idx++; 289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////////////////////////////////////////////// current Bottom Field 294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (currPicStructure == BOTTOM_FIELD) { 295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while ((top_idx < list_size)||(bot_idx < list_size)) 296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////////////////////////////////////////// ref Top Field 298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee got_pic = 0; 299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while ((bot_idx < list_size) && (!(got_pic))) 300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, frame_list[bot_idx]); 302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((viddec_h264_get_is_used(active_fs))&0x2) { 303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(h264_dpb_pic_is_bottom_field_ref(long_term)) { 304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // short term ref pic 305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pic_list[list_idx] = PUT_LIST_LONG_TERM_BITS(lterm) + frame_list[bot_idx] + PUT_LIST_INDEX_FIELD_BIT(1); // bottom_field 306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_idx++; 307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee got_pic = 1; 308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee bot_idx++; 311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////////////////////////////////////////// ref Bottom Field 314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee got_pic = 0; 315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while ((top_idx < list_size) && (!(got_pic))) 316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, frame_list[top_idx]); 318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((viddec_h264_get_is_used(active_fs))&0x1) { 319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(h264_dpb_pic_is_top_field_ref(long_term)){ 320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // short term ref pic 321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pic_list[list_idx] = PUT_LIST_LONG_TERM_BITS(lterm) + frame_list[top_idx] + PUT_LIST_INDEX_FIELD_BIT(0); // top_field 322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_idx++; 323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee got_pic = 1; 324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee top_idx++; 327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return list_idx; 333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_remove_ref_list () 340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Removes an idc from the refernce list and updates list after 342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 344bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_remove_ref_list(h264_DecodedPictureBuffer * p_dpb, int32_t ref_idc) 345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t idx = 0; 347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t Found = 0; 348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while ((idx < p_dpb->ref_frames_in_buffer) && (!(Found))) 350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->fs_ref_idc[idx] == ref_idc) 352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Found = 1; 353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx++; 355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (Found) 358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Move the remainder of the list up one 360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while(idx < p_dpb->ref_frames_in_buffer - 1) { 361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_ref_idc[idx] = p_dpb->fs_ref_idc[idx + 1]; 362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx ++; 363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_ref_idc[idx] = MPD_DPB_FS_NULL_IDC; // Clear the last one 366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->ref_frames_in_buffer--; 367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_remove_ltref_list () 376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Removes an idc from the long term reference list and updates list after 378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 380bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_remove_ltref_list(h264_DecodedPictureBuffer * p_dpb,int32_t ref_idc) 381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t idx = 0; 383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t Found = 0; 384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while ((idx < p_dpb->ltref_frames_in_buffer) && (!(Found))) 386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->fs_ltref_idc[idx] == ref_idc) Found = 1; 388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else idx++; 389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (Found) 392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Move the remainder of the list up one 394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while(idx <(uint8_t)(p_dpb->ltref_frames_in_buffer - 1)) 395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_ltref_idc[idx] = p_dpb->fs_ltref_idc[idx + 1]; 397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx ++; 398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_ltref_idc[idx] = MPD_DPB_FS_NULL_IDC; // Clear the last one 400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->ltref_frames_in_buffer--; 402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_init_lists () 413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Used to initialise the reference lists 415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Also assigns picture numbers and long term picture numbers if P OR B slice 416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 417bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_update_ref_lists(h264_Info * pInfo) 418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer * p_dpb = &pInfo->dpb; 420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t MaxFrameNum = 1 << (pInfo->active_SPS.log2_max_frame_num_minus4 + 4); 422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t list0idx, list0idx_1, listltidx; 424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t idx; 425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t add_top, add_bottom, diff; 427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t list_idc; 428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t check_non_existing, skip_picture; 429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t gen_pic_fs_list0[16]; 432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t gen_pic_fs_list1[16]; 433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t gen_pic_fs_listlt[16]; 434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t gen_pic_pic_list[32]; // check out these sizes... 435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t sort_fs_idc[16]; 437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t list_sort_number[16]; 438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef DUMP_HEADER_INFO 440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee static int cc1 = 0; 441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //OS_INFO("-------------cc1= %d\n",cc1); /////// DEBUG info 442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(cc1 == 255) 443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx = 0; 444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx = list0idx_1 = listltidx = 0; 447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.structure == FRAME) 449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////////////////////////////////////////////////// short term handling 451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ref_frames_in_buffer; idx++) 452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ref_idc[idx]); 454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((viddec_h264_get_is_used(active_fs) == 3)&&(active_fs->frame.used_for_reference == 3)) 456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->frame_num > pInfo->img.frame_num) 458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame_num_wrap = active_fs->frame_num - MaxFrameNum; 459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame_num_wrap = active_fs->frame_num; 461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.pic_num = active_fs->frame_num_wrap; 463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Use this opportunity to sort list for a p-frame 465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type == h264_PtypeP) 466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_fs_idc[list0idx] = p_dpb->fs_ref_idc[idx]; 468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_sort_number[list0idx] = active_fs->frame.pic_num; 469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx++; 470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type == h264_PtypeP) 475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_list_sort(sort_fs_idc, list_sort_number, list0idx, 1); 477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < list0idx; idx++) 478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_0[idx] = (sort_fs_idc[idx]); // frame 479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] = list0idx; 481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////////////////////////////////////////////////// long term handling 484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ltref_frames_in_buffer; idx++) 485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ltref_idc[idx]); 487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((viddec_h264_get_is_used(active_fs) == 3) && (viddec_h264_get_is_long_term(active_fs) == 3) && (active_fs->frame.used_for_reference == 3)) 488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.long_term_pic_num = active_fs->frame.long_term_frame_idx; 490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type == h264_PtypeP) 492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_fs_idc[list0idx-p_dpb->listXsize[0]] = p_dpb->fs_ltref_idc[idx]; 494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_sort_number[list0idx-p_dpb->listXsize[0]] = active_fs->frame.long_term_pic_num; 495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx++; 496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type == h264_PtypeP) 501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_list_sort(sort_fs_idc, list_sort_number, list0idx-p_dpb->listXsize[0], 0); 503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = p_dpb->listXsize[0]; idx < list0idx; idx++) { 504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_0[idx] = (1<<6) + sort_fs_idc[idx-p_dpb->listXsize[0]]; 505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] = list0idx; 507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else /// Field base 510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.structure == TOP_FIELD) 512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee add_top = 1; 514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee add_bottom = 0; 515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee add_top = 0; 519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee add_bottom = 1; 520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////////////////////////////////////////////P0: Short term handling 523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ref_frames_in_buffer; idx++) 524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ref_idc[idx]); 526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->frame.used_for_reference) 527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs->frame_num > pInfo->SliceHeader.frame_num) { 529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame_num_wrap = active_fs->frame_num - MaxFrameNum; 530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame_num_wrap = active_fs->frame_num; 532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference)&0x1) { 535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.pic_num = (active_fs->frame_num_wrap << 1) + add_top; 536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference)&0x2) { 539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.pic_num = (active_fs->frame_num_wrap << 1) + add_bottom; 540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type == h264_PtypeP) { 543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_fs_idc[list0idx] = p_dpb->fs_ref_idc[idx]; 544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_sort_number[list0idx] = active_fs->frame_num_wrap; 545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx++; 546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type == h264_PtypeP) 551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_list_sort(sort_fs_idc, list_sort_number, list0idx, 1); 553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < list0idx; idx++) { 554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gen_pic_fs_list0[idx] = sort_fs_idc[idx]; 555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] = 0; 558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] = h264_dpb_gen_pic_list_from_frame_list(p_dpb, gen_pic_pic_list, gen_pic_fs_list0, pInfo->img.structure, list0idx, 0); 559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->listXsize[0]; idx++) 561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_0[idx] = gen_pic_pic_list[idx]; 563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////////////////////////////////////////////P0: long term handling 567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ltref_frames_in_buffer; idx++) 568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ltref_idc[idx]); 570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_long_term(active_fs)&0x1) { 572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.long_term_pic_num = (active_fs->top_field.long_term_frame_idx << 1) + add_top; 573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_long_term(active_fs)&0x2) { 576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.long_term_pic_num = (active_fs->bottom_field.long_term_frame_idx << 1) + add_bottom; 577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type == h264_PtypeP) 580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_fs_idc[listltidx] = p_dpb->fs_ltref_idc[idx]; 582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_sort_number[listltidx] = active_fs->long_term_frame_idx; 583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee listltidx++; 584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type == h264_PtypeP) 588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_list_sort(sort_fs_idc, list_sort_number, listltidx, 0); 590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < listltidx; idx++) { 591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gen_pic_fs_listlt[idx] = sort_fs_idc[idx]; 592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx_1 = h264_dpb_gen_pic_list_from_frame_list(p_dpb, gen_pic_pic_list, gen_pic_fs_listlt, pInfo->img.structure, listltidx, 1); 594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < list0idx_1; idx++) { 596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_0[p_dpb->listXsize[0]+idx] = gen_pic_pic_list[idx]; 597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] += list0idx_1; 599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.slice_type == h264_PtypeI) 604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] = 0; 606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[1] = 0; 607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type == h264_PtypeP) 611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// Forward done above 613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[1] = 0; 614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // B-Slice 618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Do not include non-existing frames for B-pictures when cnt_type is zero 619bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type == h264_PtypeB) 621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx = list0idx_1 = listltidx = 0; 623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee skip_picture = 0; 624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->active_SPS.pic_order_cnt_type == 0) 626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee check_non_existing = 1; 627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee check_non_existing = 0; 629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.structure == FRAME) 631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ref_frames_in_buffer; idx++) 633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ref_idc[idx]); 635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs) == 3) 636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(check_non_existing) 638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_non_existent(active_fs)) skip_picture = 1; 640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else skip_picture = 0; 641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(skip_picture == 0) 644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference==3) && (!(active_fs->frame.is_long_term))) 646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.framepoc >= active_fs->frame.poc) 648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_fs_idc[list0idx] = p_dpb->fs_ref_idc[idx]; 650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_sort_number[list0idx] = active_fs->frame.poc; 651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx++; 652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 655bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_list_sort(sort_fs_idc, list_sort_number, list0idx, 1); 659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < list0idx; idx++) { 660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_0[idx] = sort_fs_idc[idx]; 661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx_1 = list0idx; 664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////////////////////////////////////////B0: Short term handling 666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ref_frames_in_buffer; idx++) 667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ref_idc[idx]); 669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs) == 3) 671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(check_non_existing) 673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_non_existent(active_fs)) skip_picture = 1; 675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else skip_picture = 0; 676bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(skip_picture == 0) 679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference) && (!(active_fs->frame.is_long_term))) 681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.framepoc < active_fs->frame.poc) 683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_fs_idc[list0idx-list0idx_1] = p_dpb->fs_ref_idc[idx]; 685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_sort_number[list0idx-list0idx_1] = active_fs->frame.poc; 686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx++; 687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_list_sort(sort_fs_idc, list_sort_number, list0idx-list0idx_1, 0); 694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = list0idx_1; idx < list0idx; idx++) { 695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_0[idx] = sort_fs_idc[idx-list0idx_1]; 696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 698bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < list0idx_1; idx++) { 699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_1[list0idx-list0idx_1+idx] = p_dpb->listX_0[idx]; 700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = list0idx_1; idx < list0idx; idx++) { 703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_1[idx-list0idx_1] = p_dpb->listX_0[idx]; 704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] = list0idx; 707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[1] = list0idx; 708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////////////////////////////////////////B0: long term handling 710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx = 0; 711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Can non-existent pics be set as long term?? 713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ltref_frames_in_buffer; idx++) 714bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 715bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ltref_idc[idx]); 716bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 717bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((viddec_h264_get_is_used(active_fs) == 3) && (viddec_h264_get_is_long_term(active_fs) == 3)) 718bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 719bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // if we have two fields, both must be long-term 720bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_fs_idc[list0idx] = p_dpb->fs_ltref_idc[idx]; 721bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_sort_number[list0idx] = active_fs->frame.long_term_pic_num; 722bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx++; 723bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 724bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 725bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 726bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_list_sort(sort_fs_idc, list_sort_number, list0idx, 0); 727bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = p_dpb->listXsize[0]; idx < (p_dpb->listXsize[0]+list0idx); idx = idx + 1) 728bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 729bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_0[idx] = (1<<6) + sort_fs_idc[idx-p_dpb->listXsize[0]]; 730bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_1[idx] = (1<<6) + sort_fs_idc[idx-p_dpb->listXsize[0]]; 731bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 732bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 733bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] += list0idx; 734bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[1] += list0idx; 735bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 736bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else // Field 737bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 738bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ref_frames_in_buffer; idx++) 739bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 740bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ref_idc[idx]); 741bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 742bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs)) { 743bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(check_non_existing) { 744bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_non_existent(active_fs)) 745bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee skip_picture = 1; 746bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 747bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee skip_picture = 0; 748bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 749bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 750bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(skip_picture == 0) { 751bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.ThisPOC >= active_fs->frame.poc) { 752bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_fs_idc[list0idx] = p_dpb->fs_ref_idc[idx]; 753bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_sort_number[list0idx] = active_fs->frame.poc; 754bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx++; 755bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 756bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 757bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 758bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 759bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 760bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_list_sort(sort_fs_idc, list_sort_number, list0idx, 1); 761bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < list0idx; idx = idx + 1) { 762bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gen_pic_fs_list0[idx] = sort_fs_idc[idx]; 763bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 764bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 765bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx_1 = list0idx; 766bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 767bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///////////////////////////////////////////// B1: Short term handling 768bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ref_frames_in_buffer; idx++) 769bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 770bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ref_idc[idx]); 771bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs)) 772bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 773bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(check_non_existing) { 774bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_non_existent(active_fs)) 775bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee skip_picture = 1; 776bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 777bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee skip_picture = 0; 778bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 779bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 780bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(skip_picture == 0) { 781bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.ThisPOC < active_fs->frame.poc) { 782bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_fs_idc[list0idx-list0idx_1] = p_dpb->fs_ref_idc[idx]; 783bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_sort_number[list0idx-list0idx_1] = active_fs->frame.poc; 784bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx++; 785bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 786bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 787bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 788bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 789bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 790bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// Generate frame list from sorted fs 791bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// 792bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_list_sort(sort_fs_idc, list_sort_number, list0idx-list0idx_1, 0); 793bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = list0idx_1; idx < list0idx; idx++) 794bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gen_pic_fs_list0[idx] = sort_fs_idc[idx-list0idx_1]; 795bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 796bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < list0idx_1; idx++) 797bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gen_pic_fs_list1[list0idx-list0idx_1+idx] = gen_pic_fs_list0[idx]; 798bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 799bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = list0idx_1; idx < list0idx; idx++) 800bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gen_pic_fs_list1[idx-list0idx_1] = gen_pic_fs_list0[idx]; 801bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 802bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// Generate List_X0 803bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// 804bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] = h264_dpb_gen_pic_list_from_frame_list(p_dpb, gen_pic_pic_list, gen_pic_fs_list0, pInfo->img.structure, list0idx, 0); 805bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 806bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->listXsize[0]; idx++) 807bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_0[idx] = gen_pic_pic_list[idx]; 808bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 809bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// Generate List X1 810bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// 811bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[1] = h264_dpb_gen_pic_list_from_frame_list(p_dpb, gen_pic_pic_list, gen_pic_fs_list1, pInfo->img.structure, list0idx, 0); 812bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 813bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->listXsize[1]; idx++) 814bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_1[idx] = gen_pic_pic_list[idx]; 815bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 816bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///////////////////////////////////////////// B1: long term handling 817bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ltref_frames_in_buffer; idx++) 818bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 819bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ltref_idc[idx]); 820bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee sort_fs_idc[listltidx] = p_dpb->fs_ltref_idc[idx]; 821bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_sort_number[listltidx] = active_fs->long_term_frame_idx; 822bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee listltidx++; 823bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 824bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 825bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_list_sort(sort_fs_idc, list_sort_number, listltidx, 0); 826bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < listltidx; idx++) 827bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gen_pic_fs_listlt[idx] = sort_fs_idc[idx]; 828bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 829bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list0idx_1 = h264_dpb_gen_pic_list_from_frame_list(p_dpb, gen_pic_pic_list, gen_pic_fs_listlt, pInfo->img.structure, listltidx, 1); 830bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 831bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < list0idx_1; idx++) 832bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 833bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_0[p_dpb->listXsize[0]+idx] = gen_pic_pic_list[idx]; 834bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_1[p_dpb->listXsize[1]+idx] = gen_pic_pic_list[idx]; 835bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 836bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 837bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] += list0idx_1; 838bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[1] += list0idx_1; 839bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 840bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 841bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 842bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Setup initial list sizes at this point 843bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->nInitListSize[0] = p_dpb->listXsize[0]; 844bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->nInitListSize[1] = p_dpb->listXsize[1]; 845bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.slice_type != h264_PtypeI) 846bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 847bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((p_dpb->listXsize[0]==p_dpb->listXsize[1]) && (p_dpb->listXsize[0] > 1)) 848bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 849bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // check if lists are identical, if yes swap first two elements of listX[1] 850bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee diff = 0; 851bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->listXsize[0]; idx = idx + 1) 852bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 853bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->listX_0[idx] != p_dpb->listX_1[idx]) diff = 1; 854bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 855bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 856bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 857bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!(diff)) 858bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 859bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_idc = p_dpb->listX_1[0]; 860bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_1[0] = p_dpb->listX_1[1]; 861bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listX_1[1] = list_idc; 862bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 863bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 864bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 865bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // set max size 866bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->listXsize[0] > pInfo->SliceHeader.num_ref_idx_l0_active) 867bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 868bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[0] = pInfo->SliceHeader.num_ref_idx_l0_active; 869bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 870bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 871bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 872bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->listXsize[1] > pInfo->SliceHeader.num_ref_idx_l1_active) 873bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 874bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->listXsize[1] = pInfo->SliceHeader.num_ref_idx_l1_active; 875bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 876bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 877bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 878bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 879bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 880bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 881bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 882bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 883bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// DPB reorder list 884bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_reorder_lists(pInfo); 885bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 886bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 887bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} //// End of init_dpb_list 888bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 889bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 890bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 891bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 892bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 893bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 894bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_get_short_term_pic () 895bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 896bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Sets active_fs to point to frame store containing picture with given picNum 897bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Sets field_flag, bottom_field and err_flag based on the picture and whether 898bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// it is available or not... 899bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 900bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic frame_param_ptr h264_dpb_get_short_term_pic(h264_Info * pInfo,int32_t pic_num, int32_t *bottom_field_bit) 901bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 902bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register uint32_t idx; 903bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register frame_param_ptr temp_fs; 904bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 905bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 906bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 907bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *bottom_field_bit = 0; 908bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ref_frames_in_buffer; idx++) 909bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 910bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp_fs = &p_dpb->fs[p_dpb->fs_ref_idc[idx]]; 911bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.structure == FRAME) 912bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 913bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(temp_fs->frame.used_for_reference == 3) 914bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!(temp_fs->frame.is_long_term)) 915bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->frame.pic_num == pic_num) return temp_fs; 916bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 917bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else // current picture is a field 918bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 919bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->frame.used_for_reference&0x1) 920bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!(temp_fs->top_field.is_long_term)) 921bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->top_field.pic_num == pic_num) 922bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 923bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return temp_fs; 924bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 925bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 926bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->frame.used_for_reference&0x2) 927bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!(temp_fs->bottom_field.is_long_term)) 928bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->bottom_field.pic_num == pic_num) 929bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 930bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *bottom_field_bit = PUT_LIST_INDEX_FIELD_BIT(1); 931bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return temp_fs; 932bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 933bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 934bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 935bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return NULL; 936bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 937bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 938bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 939bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 940bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 941bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 942bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_get_long_term_pic () 943bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 944bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Sets active_fs to point to frame store containing picture with given picNum 945bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 946bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 947bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic frame_param_ptr h264_dpb_get_long_term_pic(h264_Info * pInfo,int32_t long_term_pic_num, int32_t *bottom_field_bit) 948bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 949bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register uint32_t idx; 950bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register frame_param_ptr temp_fs; 951bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 952bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 953bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *bottom_field_bit = 0; 954bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ltref_frames_in_buffer; idx++) 955bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 956bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp_fs = &p_dpb->fs[p_dpb->fs_ltref_idc[idx]]; 957bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.structure == FRAME) 958bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 959bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->frame.used_for_reference == 3) 960bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->frame.is_long_term) 961bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->frame.long_term_pic_num == long_term_pic_num) 962bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return temp_fs; 963bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 964bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 965bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 966bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->frame.used_for_reference&0x1) 967bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->top_field.is_long_term) 968bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->top_field.long_term_pic_num == long_term_pic_num) 969bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return temp_fs; 970bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 971bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->frame.used_for_reference&0x2) 972bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->bottom_field.is_long_term) 973bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs->bottom_field.long_term_pic_num == long_term_pic_num) 974bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 975bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *bottom_field_bit = PUT_LIST_INDEX_FIELD_BIT(1); 976bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return temp_fs; 977bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 978bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 979bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 980bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return NULL; 981bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 982bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 983bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 984bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 985bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 986bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 987bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_reorder_ref_pic_list () 988bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 989bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Used to sort a list based on a corresponding sort indices 990bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 991bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 992bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestruct list_value_t 993bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 994bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t value; 995bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct list_value_t *next; 996bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}; 997bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 998bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestruct linked_list_t 999bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1000bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct list_value_t *begin; 1001bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct list_value_t *end; 1002bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct list_value_t *entry; 1003bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct list_value_t *prev_entry; 1004bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct list_value_t list[32]; 1005bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}; 1006bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1007bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void linked_list_initialize (struct linked_list_t *lp, uint8_t *vp, int32_t size) 1008bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1009bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct list_value_t *lvp; 1010bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1011bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp = lp->list; 1012bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->begin = lvp; 1013bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->entry = lvp; 1014bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->end = lvp + (size-1); 1015bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->prev_entry = NULL; 1016bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1017bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while (lvp <= lp->end) 1018bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1019bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp->value = *(vp++); 1020bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp->next = lvp + 1; 1021bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp++; 1022bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1023bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->end->next = NULL; 1024bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1025bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1026bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1027bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1028bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1029bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void linked_list_reorder (struct linked_list_t *lp, int32_t list_value) 1030bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1031bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register struct list_value_t *lvp = lp->entry; 1032bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register struct list_value_t *lvp_prev; 1033bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1034bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (lvp == NULL) { 1035bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->end->value = list_value; // replace the end entry 1036bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else if ((lp->begin==lp->end)||(lvp==lp->end)) // replece the begin/end entry and set the entry to NULL 1037bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1038bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->entry->value = list_value; 1039bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->prev_entry = lp->entry; 1040bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->entry = NULL; 1041bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1042bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (lvp->value==list_value) // the entry point matches 1043bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1044bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->prev_entry = lvp; 1045bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->entry = lvp->next; 1046bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1047bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (lvp->next == lp->end) // the entry is just before the end 1048bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1049bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // replace the end and swap the end and entry points 1050bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // lvp 1051bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // prev_entry => entry => old_end 1052bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // old_end & new_prev_entry => new_end & entry 1053bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->end->value = list_value; 1054bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1055bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (lp->prev_entry) 1056bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->prev_entry->next = lp->end; 1057bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1058bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->begin = lp->end; 1059bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1060bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->prev_entry = lp->end; 1061bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->end->next = lvp; 1062bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->end = lvp; 1063bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp->next = NULL; 1064bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1065bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1066bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1067bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp_prev = NULL; 1068bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while (lvp->next) // do not check the end but we'll be in the loop at least once 1069bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1070bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (lvp->value == list_value) break; 1071bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp_prev = lvp; 1072bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp = lvp->next; 1073bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1074bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp->value = list_value; // force end matches 1075bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1076bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // remove lvp from the list 1077bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp_prev->next = lvp->next; 1078bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (lvp==lp->end) lp->end = lvp_prev; 1079bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1080bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // insert lvp in front of lp->entry 1081bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (lp->entry==lp->begin) 1082bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1083bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp->next = lp->begin; 1084bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->begin = lvp; 1085bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1086bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1087bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1088bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp->next = lp->entry; 1089bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->prev_entry->next = lvp; 1090bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1091bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lp->prev_entry = lvp; 1092bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1093bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1094bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1095bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1096bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1097bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1098bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void linked_list_output (struct linked_list_t *lp, int32_t *vp) 1099bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register int32_t *ip1; 1101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register struct list_value_t *lvp; 1102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp = lp->begin; 1104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ip1 = vp; 1105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while (lvp) 1106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *(ip1++) = lvp->value; 1108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee lvp = lvp->next; 1109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1115bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t h264_dpb_reorder_ref_pic_list(h264_Info * pInfo,int32_t list_num, int32_t num_ref_idx_active) 1116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 1118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t *remapping_of_pic_nums_idc; 1119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_reordering_num_t *list_reordering_num; 1120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t bottom_field_bit; 1121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t maxPicNum, currPicNum, picNumLXNoWrap, picNumLXPred, pic_num; 1123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t refIdxLX; 1124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t i; 1125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t PicList[32] = {0}; 1127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct linked_list_t ll; 1128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee struct linked_list_t *lp = ≪ // should consider use the scratch space 1129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // declare these below as registers gave me 23 cy/MB for the worst frames in Allegro_Combined_CABAC_07_HD, YHu 1131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register frame_param_ptr temp_fs; 1132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register int32_t temp; 1133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee register uint8_t *ip1; 1134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee maxPicNum = 1 << (pInfo->active_SPS.log2_max_frame_num_minus4 + 4); 1136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (list_num == 0) // i.e list 0 1139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ip1 = p_dpb->listX_0; 1141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee remapping_of_pic_nums_idc = pInfo->SliceHeader.sh_refpic_l0.reordering_of_pic_nums_idc; 1142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_reordering_num = pInfo->SliceHeader.sh_refpic_l0.list_reordering_num; 1143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ip1 = p_dpb->listX_1; 1147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee remapping_of_pic_nums_idc = pInfo->SliceHeader.sh_refpic_l1.reordering_of_pic_nums_idc; 1148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee list_reordering_num = pInfo->SliceHeader.sh_refpic_l1.list_reordering_num; 1149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee linked_list_initialize (lp, ip1, num_ref_idx_active); 1153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee currPicNum = pInfo->SliceHeader.frame_num; 1155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.structure != FRAME) 1156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* The reason it is + 1 I think, is because the list is based on polarity 1159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee expand later... 1160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 1161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee maxPicNum <<= 1; 1162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee currPicNum <<= 1; 1163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee currPicNum++; 1164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picNumLXPred = currPicNum; 1167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee refIdxLX = 0; 1168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; remapping_of_pic_nums_idc[i] != 3; i++) 1170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(i > MAX_NUM_REF_FRAMES) 1172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 1174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (remapping_of_pic_nums_idc[i] < 2) // - short-term re-ordering 1177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp = (list_reordering_num[i].abs_diff_pic_num_minus1 + 1); 1179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (remapping_of_pic_nums_idc[i] == 0) 1180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp = picNumLXPred - temp; 1182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp < 0 ) picNumLXNoWrap = temp + maxPicNum; 1183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else picNumLXNoWrap = temp; 1184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else // (remapping_of_pic_nums_idc[i] == 1) 1186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp += picNumLXPred; 1188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp >= maxPicNum) picNumLXNoWrap = temp - maxPicNum; 1189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else picNumLXNoWrap = temp; 1190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Updates for next iteration of the loop 1193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picNumLXPred = picNumLXNoWrap; 1194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (picNumLXNoWrap > currPicNum ) pic_num = picNumLXNoWrap - maxPicNum; 1196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else pic_num = picNumLXNoWrap; 1197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp_fs = h264_dpb_get_short_term_pic(pInfo, pic_num, &bottom_field_bit); 1199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs) 1200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp = bottom_field_bit + PUT_FS_IDC_BITS(temp_fs->fs_idc); 1202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee linked_list_reorder (lp, temp); 1203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else //(remapping_of_pic_nums_idc[i] == 2) long-term re-ordering 1206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pic_num = list_reordering_num[i].long_term_pic_num; 1208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp_fs = h264_dpb_get_long_term_pic(pInfo, pic_num, &bottom_field_bit); 1210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (temp_fs) 1211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp = PUT_LIST_LONG_TERM_BITS(1) + bottom_field_bit + PUT_FS_IDC_BITS(temp_fs->fs_idc); 1213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee linked_list_reorder (lp, temp); 1214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee linked_list_output (lp, PicList); 1219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(0 == list_num ) 1221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(i=0; i<num_ref_idx_active; i++) 1223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->slice_ref_list0[i]=(uint8_t)PicList[i]; 1225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(i=0; i<num_ref_idx_active; i++) 1230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->slice_ref_list1[i]=(uint8_t)PicList[i]; 1232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Instead of updating the now reordered list here, just write it down... 1237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // This way, we can continue to hold the initialised list in p_dpb->listX_0 1238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // and therefore not need to update it every slice 1239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_dpb_write_list(list_num, PicList, num_ref_idx_active); 1241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return num_ref_idx_active; 1243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1250bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_RP_check_list (h264_Info * pInfo) 1251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 1253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t *p_list = pInfo->slice_ref_list0; 1254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // If the decoding start from RP and without exact point, all B frames belong to previous GOP should be throw away! 1257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((pInfo->SliceHeader.slice_type == h264_PtypeB)&&(pInfo->sei_b_state_ready ==0) && pInfo->sei_rp_received) { 1260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_curr |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE; 1261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->wl_err_curr |= (FRAME << FIELD_ERR_OFFSET); 1262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Repare Ref list if it damaged with RP recovery only 1267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((pInfo->SliceHeader.slice_type == h264_PtypeP) && pInfo->sei_rp_received) 1269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx, rp_found = 0; 1272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.num_ref_idx_l0_active == 1) 1274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.sh_refpic_l0.ref_pic_list_reordering_flag) 1276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_list = pInfo->slice_ref_list0; 1278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_list = pInfo->dpb.listX_0; 1282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //pInfo->sei_rp_received = 0; 1283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //return; 1284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(idx = 0; idx < p_dpb->used_size; idx++) { 1288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->fs_dpb_idc[idx] == pInfo->last_I_frame_idc) { 1289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee rp_found = 1; 1290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 1291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(rp_found) { 1294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0 1295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t poc; 1296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// Clear long-term ref list 1298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->ltref_frames_in_buffer; idx++) 1299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_reference(p_dpb, p_dpb->fs_ltref_idc[0]); 1301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ltref_list(p_dpb, p_dpb->fs_ltref_idc[0]); 1302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// Clear short-term ref list 1305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //while(p_dpb->used_size>1) 1306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(idx = 0; idx < p_dpb->used_size; idx++) 1307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx_pos; 1309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// find smallest non-output POC 1310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_get_smallest_poc(p_dpb, &poc, &idx_pos); 1311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// Remove all frames in previous GOP 1313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((idx_pos != MPD_DPB_FS_NULL_IDC) && (p_dpb->fs_dpb_idc[idx_pos] != pInfo->last_I_frame_idc)) 1314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Remove from ref-list 1316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_reference(p_dpb, p_dpb->fs_dpb_idc[idx_pos]); 1317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, p_dpb->fs_dpb_idc[idx_pos]); 1318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Output from DPB 1320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dpb_idc[idx]); 1321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if((active_fs->is_output == 0) && (active_fs->is_non_existent == 0)) 1322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //int32_t existing; 1324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_dpb_frame_output(pInfo, p_dpb->fs_dpb_idc[idx], 0, &existing); 1325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //p_dpb->last_output_poc = poc; 1326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_dpb_remove_frame_from_dpb(p_dpb, idx); // Remove dpb.fs_dpb_idc[pos] 1328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 1332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///// Set the reference to last I frame 1333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( (pInfo->last_I_frame_idc!=255)&&(pInfo->last_I_frame_idc!=p_list[0])) 1334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Repaire the reference list now 1336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_reference(p_dpb, p_list[0]); 1337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, p_list[0]); 1338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_list[0] = pInfo->last_I_frame_idc; 1339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sei_rp_received = 0; 1345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sei_b_state_ready = 1; 1346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 1358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_reorder_lists () 1359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Used to sort a list based on a corresponding sort indices 1361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1363bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_reorder_lists(h264_Info * pInfo) 1364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t currSliceType = pInfo->SliceHeader.slice_type; 1366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (currSliceType == h264_PtypeP ) 1368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////////////////////////////////////////////// Reordering reference list for P slice 1370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Forward reordering 1371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.sh_refpic_l0.ref_pic_list_reordering_flag) 1372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_reorder_ref_pic_list(pInfo, 0, pInfo->SliceHeader.num_ref_idx_l0_active); 1373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->dpb.listXsize[0]=pInfo->SliceHeader.num_ref_idx_l0_active; 1378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else if (currSliceType == h264_PtypeB) 1379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////////////////////////////////////////////// Reordering reference list for B slice 1381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Forward reordering 1382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.sh_refpic_l0.ref_pic_list_reordering_flag) 1383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_reorder_ref_pic_list(pInfo, 0, pInfo->SliceHeader.num_ref_idx_l0_active); 1384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->dpb.listXsize[0]=pInfo->SliceHeader.num_ref_idx_l0_active; 1389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Backward reordering 1391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.sh_refpic_l1.ref_pic_list_reordering_flag) 1392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_reorder_ref_pic_list(pInfo, 1, pInfo->SliceHeader.num_ref_idx_l1_active); 1393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->dpb.listXsize[1]=pInfo->SliceHeader.num_ref_idx_l1_active; 1398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// Check if need recover reference list with previous recovery point 1401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_RP_check_list(pInfo); 1402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////// DPB management ////////////////////// 1408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 1410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// avc_dpb_get_non_output_frame_number () 1411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// get total non output frame number in the DPB. 1413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1414bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic int32_t avc_dpb_get_non_output_frame_number(h264_Info * pInfo) 1415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx; 1417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t number=0; 1418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 1419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->used_size; idx++) 1421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dpb_idc[idx]); 1423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_output(active_fs) == 0) 1425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (number)++; 1427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return number; 1431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//// Store previous picture in DPB, and then update DPB queue, remove unused frames from DPB 1438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1439bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_store_previous_picture_in_dpb(h264_Info * pInfo,int32_t NonExisting, int32_t use_old) 1440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 1442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t used_for_reference; 1444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t is_direct_output; 1445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t second_field_stored = 0; 1446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t poc; 1447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t pos; 1448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t flag; 1449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t first_field_non_ref = 0; 1450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idr_flag; 1451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting) { 1453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->fs_non_exist_idc == MPD_DPB_FS_NULL_IDC) 1454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_non_exist_idc); 1456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 1457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->fs_dec_idc == MPD_DPB_FS_NULL_IDC) 1458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 1460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting == 0) 1463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->sps_disp_index = (next_sps_disp_entry == 0)? 7 : next_sps_disp_entry - 1; 1465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.last_has_mmco_5 = 0; 1466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.last_pic_bottom_field = pInfo->img.bottom_field_flag; 1467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //used_for_reference = (use_old) ? !(old_pInfo->img.old_disposable_flag) : !(pInfo->img.disposable_flag); 1469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee used_for_reference = (use_old) ? !(pInfo->old_slice.nal_ref_idc==0) : !(pInfo->SliceHeader.nal_ref_idc==0); 1470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch (viddec_h264_get_dec_structure(active_fs)) 1472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case(TOP_FIELD) : { 1474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.used_for_reference = used_for_reference; 1475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_top_used(active_fs, 1); 1476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->crc_field_coded = 1; 1477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 1478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case(BOTTOM_FIELD): { 1479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.used_for_reference = used_for_reference << 1; 1480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_bottom_used(active_fs, 1); 1481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->crc_field_coded = 1; 1482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 1483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default: { 1484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = used_for_reference?3:0; 1485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_used(active_fs, 3); 1486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if(pInfo->img.MbaffFrameFlag) active_fs->crc_field_coded = 1; 1487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 1489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //freeze_assert = use_old ? old_pInfo->img.sei_freeze_this_image : pInfo->img.sei_freeze_this_image; 1492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if (freeze_assert) sei_information.disp_frozen = 1; 1493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idr_flag = use_old ? pInfo->old_slice.idr_flag : pInfo->SliceHeader.idr_flag; 1495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (idr_flag) { 1496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_idr_memory_management (pInfo, &pInfo->active_SPS, pInfo->img.no_output_of_prior_pics_flag); 1497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 1498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // adaptive memory management 1499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (used_for_reference & pInfo->SliceHeader.sh_dec_refpic.adaptive_ref_pic_marking_mode_flag) { 1500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_adaptive_memory_management(pInfo); 1501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Reset the active frame store - could have changed in mem management ftns 1504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 1505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((viddec_h264_get_dec_structure(active_fs) == TOP_FIELD)||(viddec_h264_get_dec_structure(active_fs) == BOTTOM_FIELD)) 1507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // check for frame store with same pic_number -- always true in my case, YH 1509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // when we allocate frame store for the second field, we make sure the frame store for the second 1510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // field is the one that contains the first field of the frame- see h264_dpb_init_frame_store() 1511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // This is different from JM model. 1512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // In this way we don't need to move image data around and can reduce memory bandwidth. 1513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // simply check if the check if the other field has been decoded or not 1514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs) != 0) 1516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.second_field) 1518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_insert_picture_in_dpb(pInfo, used_for_reference, 0, NonExisting, use_old); 1520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee second_field_stored = 1; 1521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { // Set up locals for non-existing frames 1527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee used_for_reference = 1; 1528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = used_for_reference?3:0; 1530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_used(active_fs, 3); 1531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_dec_structure(active_fs, FRAME); 1532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.structure = FRAME; 1533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee is_direct_output = 0; 1536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (NonExisting == 0) 1537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->used_size >= p_dpb->BumpLevel) 1539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // non-reference frames may be output directly 1541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 1542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((used_for_reference == 0) && (viddec_h264_get_is_used(active_fs) == 3)) 1544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_get_smallest_poc (p_dpb, &poc, &pos); 1546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 1547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((pos == MPD_DPB_FS_NULL_IDC) || (pInfo->img.ThisPOC < poc)) 1548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee is_direct_output = 1; 1550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (NonExisting) { 1556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_sliding_window_memory_management(p_dpb, NonExisting, pInfo->active_SPS.num_ref_frames); 1557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else if(pInfo->SliceHeader.idr_flag == 0) { 1558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(used_for_reference){ 1559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.second_field == 0) { 1560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.sh_dec_refpic.adaptive_ref_pic_marking_mode_flag == 0) { 1561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_sliding_window_memory_management(p_dpb, NonExisting, pInfo->active_SPS.num_ref_frames); 1562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_unused_frame_from_dpb(p_dpb, &flag); 1568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if (is_direct_output == 0) 1570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((pInfo->img.second_field == 0) || (NonExisting)) 1572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_insert_picture_in_dpb(pInfo, used_for_reference, 1, NonExisting, use_old); 1574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // In an errored stream we saw a condition where 1577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // p_dpb->ref_frames_in_buffer + p_dpb->ltref_frames_in_buffer > p_dpb->BumpLevel, 1578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // which in itself is an error, but this means first_field_non_ref will 1579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // not get set and causes problems for h264_dpb_queue_update() 1580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((pInfo->img.structure != FRAME) && (pInfo->img.second_field == 0)) { 1581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(used_for_reference == 0) 1582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->ref_frames_in_buffer + p_dpb->ltref_frames_in_buffer == p_dpb->BumpLevel) 1583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee first_field_non_ref = 1; 1584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting) 1589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_non_exist_idc); 1590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 1592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting == 0) 1594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((pInfo->img.second_field == 1) || (pInfo->img.structure == FRAME)) 1596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_send_new_decoded_frame(); 1598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((p_dpb->OutputCtrl) && (is_direct_output == 0)) 1599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_output_one_frame_from_dpb(pInfo, 0, 0,pInfo->active_SPS.num_ref_frames); 1600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Pictures inserted by this point - check if we have reached the specified output 1602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // level (if one has been specified) so we can begin on next call 1603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* 1605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Fixed HSD 212625---------------should compare OutputLevel with non-output frame number in dpb, not the used number in dpb 1606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((p_dpb->OutputLevelValid)&&(p_dpb->OutputCtrl == 0)) 1607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->used_size == p_dpb->OutputLevel) 1609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->OutputCtrl = 1; 1610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 1612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->OutputLevelValid) 1614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t non_output_frame_number=0; 1616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee non_output_frame_number = avc_dpb_get_non_output_frame_number(pInfo); 1617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(non_output_frame_number == p_dpb->OutputLevel) 1619bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->OutputCtrl = 1; 1620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->OutputCtrl = 0; 1622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 1624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->OutputCtrl = 0; 1625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while(p_dpb->used_size > (p_dpb->BumpLevel + first_field_non_ref)) 1630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //while(p_dpb->used_size > p_dpb->BumpLevel) 1631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_queue_update(pInfo, 1, 0, 0,pInfo->active_SPS.num_ref_frames); // flush a frame 1633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_dpb_remove_unused_frame_from_dpb(p_dpb, &flag); 1634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Do not output "direct output" pictures until the sempahore has been set that the pic is 1638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // decoded!! 1639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(is_direct_output) { 1641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_queue_update(pInfo, 1, 1, 0,pInfo->active_SPS.num_ref_frames); 1642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_dpb_remove_unused_frame_from_dpb(p_dpb, &flag); 1643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Add reference pictures into Reference list 1647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(used_for_reference) { 1649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_insert_ref_lists(&pInfo->dpb, NonExisting); 1650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_unused_frame_from_dpb(p_dpb, &flag); 1653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1655bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} ////////////// End of DPB store pic 1657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 1663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_insert_picture_in_dpb () 1664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Insert the decoded picture into the DPB. A free DPB position is necessary 1666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// for frames, . 1667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// This ftn tends to fill out the framestore's top level parameters from the 1668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// storable picture's parameters within it. It is called from h264_dpb_store_picture_in_dpb() 1669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// This function finishes by updating the reference lists - this means it must be called after 1671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_sliding_window_memory_management() 1672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// In the case of a frame it will call h264_dpb_split_field() 1674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// In the case of the second field of a complementary field pair it calls h264_dpb_combine_field() 1675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1676bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1677bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_insert_picture_in_dpb(h264_Info * pInfo,int32_t used_for_reference, int32_t add2dpb, int32_t NonExisting, int32_t use_old) 1678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 1680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting == 0) { 1682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 1683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame_num = (use_old) ? pInfo->old_slice.frame_num : pInfo->SliceHeader.frame_num; 1684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 1686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_non_exist_idc); 1687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame_num = active_fs->frame.pic_num; 1688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (add2dpb) { 1691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_dpb_idc[p_dpb->used_size] = active_fs->fs_idc; 1692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->used_size++; 1693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch (viddec_h264_get_dec_structure(active_fs)) 1697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1698bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case FRAME :{ 1699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_used(active_fs, 3); 1700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = used_for_reference?3:0; 1701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (used_for_reference) 1702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = 3; 1704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->frame.is_long_term) 1705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_long_term(active_fs, 3); 1706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Split frame to 2 fields for prediction 1708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_split_field(pInfo); 1709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 1711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case TOP_FIELD :{ 1712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_top_used(active_fs, 1); 1713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1714bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.used_for_reference = used_for_reference; 1715bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (used_for_reference) 1716bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1717bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference |= 0x1; 1718bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->top_field.is_long_term) 1719bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1720bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_top_long_term(active_fs, 1); 1721bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->long_term_frame_idx = active_fs->top_field.long_term_frame_idx; 1722bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1723bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1724bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs) == 3) { 1725bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_combine_field(use_old); // generate frame view 1726bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1727bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1728bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1729bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.poc = active_fs->top_field.poc; 1730bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1731bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1732bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 1733bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case BOTTOM_FIELD :{ 1734bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_bottom_used(active_fs, 1); 1735bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1736bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.used_for_reference = (used_for_reference<<1); 1737bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (used_for_reference) 1738bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1739bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference |= 0x2; 1740bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->bottom_field.is_long_term) 1741bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1742bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_bottom_long_term(active_fs, 1); 1743bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->long_term_frame_idx = active_fs->bottom_field.long_term_frame_idx; 1744bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1745bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1746bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs) == 3) { 1747bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_combine_field(use_old); // generate frame view 1748bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1749bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1750bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1751bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.poc = active_fs->bottom_field.poc; 1752bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1753bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1754bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 1755bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1756bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* 1757bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ( gRestartMode.LastRestartType == RESTART_SEI ) 1758bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1759bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ( active_fs->open_gop_entry ) dpb.WaitSeiRecovery = 1; 1760bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1761bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1762bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee gRestartMode.LastRestartType = 0xFFFF; 1763bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee*/ 1764bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1765bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1766bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} ////// End of insert picture in DPB 1767bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1768bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1769bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1770bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1771bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 1772bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_mm_unmark_short_term_for_reference () 1773bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1774bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Adaptive Memory Management: Mark short term picture unused 1775bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1776bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1777bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_mm_unmark_short_term_for_reference(h264_Info * pInfo, int32_t difference_of_pic_nums_minus1) 1778bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1779bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t picNumX; 1780bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t currPicNum; 1781bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t idx; 1782bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t unmark_done; 1783bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 1784bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1785bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.structure == FRAME) 1786bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee currPicNum = pInfo->img.frame_num; 1787bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1788bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee currPicNum = (pInfo->img.frame_num << 1) + 1; 1789bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1790bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picNumX = currPicNum - (difference_of_pic_nums_minus1 + 1); 1791bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1792bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee unmark_done = 0; 1793bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1794bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx =0; (idx < p_dpb->ref_frames_in_buffer) && (!(unmark_done)); idx++) 1795bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1796bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ref_idc[idx]); 1797bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1798bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.structure == FRAME) 1799bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1800bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* If all pic numbers in the list are different (and they should be) 1801bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee we should terminate the for loop the moment we match pic numbers, 1802bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee no need to continue to check - hence set unmark_done 1803bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 1804bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1805bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference == 3) && (viddec_h264_get_is_long_term(active_fs) == 0) && 1806bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (active_fs->frame.pic_num == picNumX)) 1807bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1808bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_reference(p_dpb, active_fs->fs_idc); 1809bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, active_fs->fs_idc); 1810bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee unmark_done = 1; 1811bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1812bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1813bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1814bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1815bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* 1816bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee If we wish to unmark a short-term picture by picture number when the current picture 1817bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee is a field, we have to unmark the corresponding field as unused for reference, 1818bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee and also if it was part of a frame or complementary reference field pair, the 1819bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee frame is to be marked as unused. However the opposite field may still be used as a 1820bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee reference for future fields 1821bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1822bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee How will this affect the reference list update ftn coming after?? 1823bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1824bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 1825bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference&0x1) && (!(viddec_h264_get_is_long_term(active_fs)&0x01))&& 1826bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (active_fs->top_field.pic_num == picNumX) ) 1827bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1828bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.used_for_reference = 0; 1829bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference &= 2; 1830bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1831bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee unmark_done = 1; 1832bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1833bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Check if other field is used for short-term reference, if not remove from list... 1834bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs->bottom_field.used_for_reference == 0) 1835bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, p_dpb->fs_ref_idc[idx]); 1836bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1837bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference&0x2) && (!(viddec_h264_get_is_long_term(active_fs)&0x2)) && 1838bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (active_fs->bottom_field.pic_num == picNumX) ) 1839bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1840bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.used_for_reference = 0; 1841bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference &= 1; 1842bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1843bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee unmark_done = 1; 1844bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1845bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Check if other field is used for reference, if not remove from list... 1846bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs->top_field.used_for_reference == 0) 1847bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, p_dpb->fs_ref_idc[idx]); 1848bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1849bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1850bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1851bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1852bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1853bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1854bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1855bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1856bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1857bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1858bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee//////////////////////////////////////////////////////////////////////////////////// 1859bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_mm_unmark_long_term_for_reference () 1860bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1861bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Adaptive Memory Management: Mark long term picture unused 1862bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1863bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// In a frame situation the long_term_pic_num will refer to another frame. 1864bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Thus we can call h264_dpb_unmark_for_long_term_reference() and then remove the picture 1865bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// from the list 1866bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1867bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// If the current picture is a field, long_term_pic_num will refer to another field 1868bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// It is also the case that each individual field should have a unique picture number 1869bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 8.2.5.4.2 suggests that when curr pic is a field, an mmco == 2 operation 1870bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// should be accompanied by a second op to unmark the other field as being unused 1871bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/////////////////////////////////////////////////////////////////////////////////// 1872bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1873bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_mm_unmark_long_term_for_reference (h264_Info * pInfo, int32_t long_term_pic_num) 1874bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1875bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t idx; 1876bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t unmark_done; 1877bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 1878bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1879bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee unmark_done = 0; 1880bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; (idx < p_dpb->ltref_frames_in_buffer) && (!(unmark_done)); idx++) 1881bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1882bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ltref_idc[idx]); 1883bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1884bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.structure == FRAME) 1885bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1886bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference==3) && (viddec_h264_get_is_long_term(active_fs)==3) && 1887bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (active_fs->frame.long_term_pic_num == long_term_pic_num)) 1888bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1889bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_long_term_reference(p_dpb, p_dpb->fs_ltref_idc[idx]); 1890bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ltref_list(p_dpb, p_dpb->fs_ltref_idc[idx]); 1891bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee unmark_done = 1; 1892bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1893bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1894bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 1895bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1896bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Check top field 1897bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference&0x1) && (viddec_h264_get_is_long_term(active_fs)&0x1) && 1898bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (active_fs->top_field.long_term_pic_num == long_term_pic_num) ) 1899bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1900bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.used_for_reference = 0; 1901bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.is_long_term = 0; 1902bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference &= 2; 1903bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_long_term(active_fs, 2); 1904bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1905bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee unmark_done = 1; 1906bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1907bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Check if other field is used for long term reference, if not remove from list... 1908bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->bottom_field.used_for_reference == 0) || (active_fs->bottom_field.is_long_term == 0)) 1909bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ltref_list(p_dpb, p_dpb->fs_ltref_idc[idx]); 1910bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1911bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1912bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Check Bottom field 1913bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference&0x2) && (viddec_h264_get_is_long_term(active_fs)&0x2) && 1914bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (active_fs->bottom_field.long_term_pic_num == long_term_pic_num) ) 1915bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1916bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.used_for_reference = 0; 1917bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.is_long_term = 0; 1918bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference &= 1; 1919bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_long_term(active_fs, 1); 1920bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1921bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee unmark_done = 1; 1922bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Check if other field is used for long term reference, if not remove from list... 1923bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->top_field.used_for_reference == 0) || (active_fs->top_field.is_long_term == 0)) 1924bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1925bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ltref_list(p_dpb, p_dpb->fs_ltref_idc[idx]); 1926bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1927bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1928bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } // field structure 1929bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } //for(idx) 1930bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1931bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 1932bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1933bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1934bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1935bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1936bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 1937bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_get_pic_struct_by_pic_num 1938bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1939bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Searches the fields appearing in short term reference list 1940bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Returns the polarity of the field with pic_num = picNumX 1941bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 1942bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1943bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t h264_dpb_get_pic_struct_by_pic_num(h264_DecodedPictureBuffer *p_dpb, int32_t picNumX) 1944bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1945bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t idx; 1946bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t pic_struct = INVALID; 1947bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t found = 0; 1948bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1949bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx =0; (idx < p_dpb->ref_frames_in_buffer) && (!(found)); idx++) 1950bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1951bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ref_idc[idx]); 1952bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1953bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference&0x1) && (!(viddec_h264_get_is_long_term(active_fs)&0x01))&& 1954bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (active_fs->top_field.pic_num == picNumX) ) 1955bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1956bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee found = 1; 1957bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pic_struct = TOP_FIELD; 1958bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1959bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1960bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_fs->frame.used_for_reference&0x2) && (!(viddec_h264_get_is_long_term(active_fs)&0x2)) && 1961bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (active_fs->bottom_field.pic_num == picNumX) ) 1962bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 1963bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee found = 1; 1964bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pic_struct = BOTTOM_FIELD; 1965bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1966bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1967bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1968bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1969bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return pic_struct; 1970bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 1971bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1972bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1973bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 1974bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 1975bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_mm_assign_long_term_frame_idx () 1976bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1977bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Assign a long term frame index to a short term picture 1978bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Both lists must be updated as part of this process... 1979bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 1980bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1981bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_mm_assign_long_term_frame_idx(h264_Info * pInfo, int32_t difference_of_pic_nums_minus1, int32_t long_term_frame_idx) 1982bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 1983bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 1984bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t picNumX; 1985bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t currPicNum; 1986bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t polarity = 0; 1987bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1988bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.structure == FRAME) { 1989bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee currPicNum = pInfo->img.frame_num; 1990bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 1991bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee currPicNum = (pInfo->img.frame_num << 1) + 1; 1992bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 1993bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1994bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picNumX = currPicNum - (difference_of_pic_nums_minus1 + 1); 1995bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 1996bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // remove frames / fields with same long_term_frame_idx 1997bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.structure == FRAME) { 1998bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_long_term_frame_for_reference_by_frame_idx(p_dpb, long_term_frame_idx); 1999bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 2000bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee polarity = h264_dpb_get_pic_struct_by_pic_num(p_dpb, picNumX); 2001bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2002bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(polarity != INVALID) 2003bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_long_term_field_for_reference_by_frame_idx(p_dpb, long_term_frame_idx, active_fs->fs_idc, polarity); 2004bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2005bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2006bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mark_pic_long_term(pInfo, long_term_frame_idx, picNumX); 2007bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2008bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2009bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2010bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2011bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2012bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2013bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2014bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_mm_update_max_long_term_frame_idx () 2015bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2016bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Set new max long_term_frame_idx 2017bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2018bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2019bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_mm_update_max_long_term_frame_idx(h264_DecodedPictureBuffer *p_dpb,int32_t max_long_term_frame_idx_plus1) 2020bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2021bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 2022bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx; 2023bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t temp; 2024bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t removed_count; 2025bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx2 = 0; 2026bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2027bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->max_long_term_pic_idx = max_long_term_frame_idx_plus1 - 1; 2028bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2029bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp = p_dpb->ltref_frames_in_buffer; 2030bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee removed_count = 0; 2031bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2032bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // check for invalid frames 2033bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < temp; idx++) 2034bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2035bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx2 = idx - removed_count; 2036bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ltref_idc[idx2]); 2037bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2038bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->long_term_frame_idx > p_dpb->max_long_term_pic_idx) 2039bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2040bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee removed_count++; 2041bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_long_term_reference(p_dpb, p_dpb->fs_ltref_idc[idx2]); 2042bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ltref_list(p_dpb, p_dpb->fs_ltref_idc[idx2]); 2043bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2044bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2045bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2046bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2047bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2048bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2049bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2050bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2051bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_mm_unmark_all_short_term_for_reference () 2052bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2053bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Unmark all short term refernce pictures 2054bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2055bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2056bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_mm_unmark_all_short_term_for_reference (h264_DecodedPictureBuffer *p_dpb) 2057bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2058bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx; 2059bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t temp = p_dpb->ref_frames_in_buffer; 2060bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2061bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < temp; idx++) 2062bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2063bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_reference(p_dpb, p_dpb->fs_ref_idc[0]); 2064bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, p_dpb->fs_ref_idc[0]); 2065bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2066bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2067bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2068bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2069bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2070bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2071bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2072bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_mm_mark_current_picture_long_term () 2073bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2074bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Marks the current picture as long term after unmarking any long term picture 2075bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// already assigned with the same long term frame index 2076bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2077bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2078bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_mm_mark_current_picture_long_term(h264_DecodedPictureBuffer *p_dpb, int32_t long_term_frame_idx) 2079bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2080bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t picNumX; 2081bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 2082bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2083bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_dec_structure(active_fs) == FRAME) 2084bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2085bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_long_term_frame_for_reference_by_frame_idx(p_dpb, long_term_frame_idx); 2086bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 2087bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.is_long_term = 1; 2088bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.long_term_frame_idx = long_term_frame_idx; 2089bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.long_term_pic_num = long_term_frame_idx; 2090bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2091bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 2092bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2093bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_dec_structure(active_fs) == TOP_FIELD) 2094bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2095bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picNumX = (active_fs->top_field.pic_num << 1) + 1; 2096bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.is_long_term = 1; 2097bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.long_term_frame_idx = long_term_frame_idx; 2098bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2099bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Assign long-term pic num 2100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.long_term_pic_num = (long_term_frame_idx << 1) + 1; 2101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 2103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee picNumX = (active_fs->bottom_field.pic_num << 1) + 1; 2105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.is_long_term = 1; 2106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.long_term_frame_idx = long_term_frame_idx; 2107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Assign long-term pic num 2109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.long_term_pic_num = (long_term_frame_idx << 1) + 1; 2110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_long_term_field_for_reference_by_frame_idx(p_dpb, long_term_frame_idx, p_dpb->fs_dec_idc, viddec_h264_get_dec_structure(active_fs)); 2113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Add to long term list 2115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_dpb_add_ltref_list(p_dpb->fs_dec_idc); 2116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_unmark_long_term_frame_for_reference_by_frame_idx () 2124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Mark a long-term reference frame or complementary field pair unused for referemce 2126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// NOTE: Obviously this ftn cannot be used to unmark individual fields... 2127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2129bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_unmark_long_term_frame_for_reference_by_frame_idx(h264_DecodedPictureBuffer *p_dpb, int32_t long_term_frame_idx) 2130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t idx; 2132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for(idx =0; idx < p_dpb->ltref_frames_in_buffer; idx++) 2133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ltref_idc[idx]); 2135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->long_term_frame_idx == long_term_frame_idx) 2137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_long_term_reference(p_dpb, p_dpb->fs_ltref_idc[idx]); 2139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ltref_list(p_dpb, p_dpb->fs_ltref_idc[idx]); 2140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_unmark_long_term_field_for_reference_by_frame_idx () 2150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Mark a long-term reference field unused for reference. However if it is the 2152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// complementary field (opposite polarity) of the picture stored in fs_idc, 2153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// we do not unmark it 2154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2156bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_unmark_long_term_field_for_reference_by_frame_idx(h264_DecodedPictureBuffer *p_dpb, int32_t long_term_frame_idx, int32_t fs_idc, int32_t polarity) 2157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t idx; 2159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t found = 0; 2160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t is_complement = 0; 2161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; (idx < p_dpb->ltref_frames_in_buffer) && (found == 0); idx++) 2163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ltref_idc[idx]); 2165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->long_term_frame_idx == long_term_frame_idx) 2166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs->fs_idc == fs_idc) 2168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Again these seem like redundant checks but for safety while until JM is updated 2170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (polarity == TOP_FIELD) 2171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee is_complement = (active_fs->bottom_field.is_long_term)? 1:0; 2172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if(polarity == BOTTOM_FIELD) 2173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee is_complement = (active_fs->top_field.is_long_term) ? 1:0; 2174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee found = 1; 2176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(found) { 2180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(is_complement == 0) 2181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_long_term_reference(p_dpb, p_dpb->fs_ltref_idc[idx-1]); 2183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ltref_list(p_dpb, p_dpb->fs_ltref_idc[idx-1]); 2184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_mark_pic_long_term () 2196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// This is used on a picture already in the dpb - i.e. not for the current picture 2198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// dpb_split / dpb_combine field will perform ftnality in that case 2199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Marks a picture as used for long-term reference. Adds it to the long-term 2201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// reference list. Also removes it from the short term reference list if required 2202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Note: if the current picture is a frame, the picture to be marked will be a 2204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// short-term reference frame or short-term complemenetary reference field pair 2205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// We use the pic_num assigned to the frame part of the structure to locate it 2206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Both its fields will have their long_term_frame_idx and long_term_pic_num 2207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// assigned to be equal to long_term_frame_idx 2208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// If the current picture is a field, the picture to be marked will be a 2210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// short-term reference field. We use the pic_nums assigned to the field parts of 2211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// the structure to identify the appropriate field. We assign the long_term_frame_idx 2212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// of the field equal to long_term_frame_idx. 2213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// We also check to see if this marking has resulted in both fields of the frame 2215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// becoming long_term. If it has, we update the frame part of the structure by 2216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// setting its long_term_frame_idx 2217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2219bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_mark_pic_long_term(h264_Info * pInfo, int32_t long_term_frame_idx, int32_t picNumX) 2220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 2222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t idx; 2223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t mark_done; 2224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t polarity = 0; 2225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mark_done = 0; 2227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.structure == FRAME) 2229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; (idx < p_dpb->ref_frames_in_buffer) && (!(mark_done)); idx++) 2231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_ref_idc[idx]); 2233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->frame.used_for_reference == 3) 2235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((!(active_fs->frame.is_long_term))&&(active_fs->frame.pic_num == picNumX)) 2237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->long_term_frame_idx = long_term_frame_idx; 2239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.long_term_frame_idx = long_term_frame_idx; 2240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.long_term_frame_idx = long_term_frame_idx; 2241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.long_term_frame_idx = long_term_frame_idx; 2242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.is_long_term = 1; 2244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.is_long_term = 1; 2245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.is_long_term = 1; 2246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_long_term(active_fs, 3); 2248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee mark_done = 1; 2249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Assign long-term pic num 2251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.long_term_pic_num = long_term_frame_idx; 2252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.long_term_pic_num = long_term_frame_idx; 2253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.long_term_pic_num = long_term_frame_idx; 2254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Add to long term list 2255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_add_ltref_list(p_dpb, p_dpb->fs_ref_idc[idx]); 2256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Remove from short-term list 2257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, p_dpb->fs_ref_idc[idx]); 2258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 2263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee polarity = h264_dpb_get_pic_struct_by_pic_num(p_dpb, picNumX); 2265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->long_term_frame_idx = long_term_frame_idx; /////BUG 2266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(polarity == TOP_FIELD) 2268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.long_term_frame_idx = long_term_frame_idx; 2270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.is_long_term = 1; 2271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_top_long_term(active_fs, 1); 2272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Assign long-term pic num 2274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.long_term_pic_num = (long_term_frame_idx << 1) + ((pInfo->img.structure == TOP_FIELD) ? 1 : 0); 2275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (polarity == BOTTOM_FIELD) 2278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.long_term_frame_idx = long_term_frame_idx; 2280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.is_long_term = 1; 2281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_bottom_long_term(active_fs, 1); 2282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Assign long-term pic num 2284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.long_term_pic_num = (long_term_frame_idx << 1) + ((pInfo->img.structure == BOTTOM_FIELD) ? 1 : 0); 2285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_long_term(active_fs) == 3) 2288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.is_long_term = 1; 2290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.long_term_frame_idx = long_term_frame_idx; 2291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, active_fs->fs_idc); 2292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 2294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // We need to add this idc to the long term ref list... 2296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_add_ltref_list(p_dpb, active_fs->fs_idc); 2297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // If the opposite field is not a short term reference, remove it from the 2299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // short term list. Since we know top field is a reference but both are not long term 2300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // we can simply check that both fields are not references... 2301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs->frame.used_for_reference != 3) 2302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, active_fs->fs_idc); 2303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} ///// End of mark pic long term 2307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_adaptive_memory_management () 2314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Perform Adaptive memory control decoded reference picture marking process 2316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2318bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_adaptive_memory_management (h264_Info * pInfo) 2319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 2321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx; 2322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx = 0; 2324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while (idx < pInfo->SliceHeader.sh_dec_refpic.dec_ref_pic_marking_count) 2326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch(pInfo->SliceHeader.sh_dec_refpic.memory_management_control_operation[idx]) 2328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 1:{ //Mark a short-term reference picture as �unused for reference? 2330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mm_unmark_short_term_for_reference(pInfo, 2331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->SliceHeader.sh_dec_refpic.difference_of_pic_num_minus1[idx]); 2332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } break; 2333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 2:{ //Mark a long-term reference picture as �unused for reference? 2334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mm_unmark_long_term_for_reference(pInfo, 2335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->SliceHeader.sh_dec_refpic.long_term_pic_num[idx]); 2336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 2337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 3:{ //Mark a short-term reference picture as "used for long-term reference" and assign a long-term frame index to it 2338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mm_assign_long_term_frame_idx(pInfo, 2339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->SliceHeader.sh_dec_refpic.difference_of_pic_num_minus1[idx], 2340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->SliceHeader.sh_dec_refpic.long_term_frame_idx[idx]); 2341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 2342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 4:{ //Specify the maximum long-term frame index and 2343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //mark all long-term reference pictureshaving long-term frame indices greater than 2344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //the maximum value as "unused for reference" 2345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mm_update_max_long_term_frame_idx (&pInfo->dpb, 2346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->SliceHeader.sh_dec_refpic.max_long_term_frame_idx_plus1[idx]); 2347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 2348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 5:{ //Mark all reference pictures as "unused for reference" and set the MaxLongTermFrameIdx variable to 2349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // "no long-term frame indices" 2350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mm_unmark_all_short_term_for_reference(&pInfo->dpb); 2351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mm_update_max_long_term_frame_idx(&pInfo->dpb, 0); 2352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.last_has_mmco_5 = 1; 2353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 2354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 6:{ //Mark the current picture as "used for long-term reference" and assign a long-term frame index to it 2355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mm_mark_current_picture_long_term(&pInfo->dpb, 2356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->SliceHeader.sh_dec_refpic.long_term_frame_idx[idx]); 2357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 2358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx++; 2360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.last_has_mmco_5) 2364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.frame_num = 0; 2366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->SliceHeader.frame_num=0; 2367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 2368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_dec_structure(active_fs) == FRAME) 2370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.bottompoc -= active_fs->frame.poc; 2372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.toppoc -= active_fs->frame.poc; 2373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.poc = 0; 2376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.pic_num = 0; 2377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame_num = 0; 2378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (viddec_h264_get_dec_structure(active_fs) == TOP_FIELD) 2381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.poc = active_fs->top_field.pic_num = 0; 2383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.toppoc = active_fs->top_field.poc; 2384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (viddec_h264_get_dec_structure(active_fs) == BOTTOM_FIELD) 2386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.poc = active_fs->bottom_field.pic_num = 0; 2388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.bottompoc = 0; 2389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_flush_dpb(pInfo, 1, pInfo->img.second_field,pInfo->active_SPS.num_ref_frames); 2392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Reset the marking count operations for the current picture... 2394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->SliceHeader.sh_dec_refpic.dec_ref_pic_marking_count = 0; 2395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} ////// End of adaptive memory management 2398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_gaps_in_frame_num_mem_management () 2404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Produces a set of frame_nums pertaining to "non-existing" pictures 2406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Calls h264_dpb_store_picture_in_dpb 2407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2409bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_gaps_in_frame_num_mem_management(h264_Info * pInfo) 2410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t temp_frame_num = 0; 2412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx, prev_idc; 2413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t prev_frame_num_plus1_wrap; 2414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t temp; 2415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t MaxFrameNum = 1 << (pInfo->active_SPS.log2_max_frame_num_minus4 + 4); 2416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee seq_param_set_used_ptr active_sps = &pInfo->active_SPS; 2417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 2418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.gaps_in_frame_num = 0; 2420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // pInfo->img.last_has_mmco_5 set thru store_picture_in_dpb 2422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.last_has_mmco_5) 2423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // If the previous picture was an unpaired field, mark it as a dangler 2425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->used_size) 2426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx = p_dpb->used_size-1; 2428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee prev_idc = p_dpb->fs_dpb_idc[idx]; 2429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (prev_idc != MPD_DPB_FS_NULL_IDC) 2430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dpb_idc[idx]); 2432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame_num =0; 2433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNumOffset = 0; 2436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //CONFORMANCE_ISSUE 2437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNum = 0; 2438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Check for gaps in frame_num 2442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.idr_flag) { 2443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNum = pInfo->img.frame_num; 2444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Have we re-started following a recovery point message? 2446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* 2447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if(got_sei_recovery || aud_got_restart){ 2448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNum = pInfo->img.frame_num; 2449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //got_sei_recovery = 0; 2450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //aud_got_restart = 0; 2451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee*/ 2453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if(pInfo->img.frame_num != pInfo->img.PreviousFrameNum) 2454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (MaxFrameNum) 2456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ldiv_mod_u((uint32_t)(pInfo->img.PreviousFrameNum + 1), (uint32_t)MaxFrameNum, &temp); 2457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee prev_frame_num_plus1_wrap = temp; 2459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.frame_num != prev_frame_num_plus1_wrap) 2460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.gaps_in_frame_num = (pInfo->img.frame_num < pInfo->img.PreviousFrameNum)? ((MaxFrameNum + pInfo->img.frame_num -1) - pInfo->img.PreviousFrameNum): (pInfo->img.frame_num - pInfo->img.PreviousFrameNum - 1); 2462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // We should test for an error here - should infer an unintentional loss of pictures 2463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if(active_sps->gaps_in_frame_num_value_allowed_flag == 0) { 2468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.gaps_in_frame_num && (active_sps->gaps_in_frame_num_value_allowed_flag == 0)) { 2469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // infer an unintentional loss of pictures 2470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // only invoke following process for a conforming bitstream 2471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // when gaps_in_frame_num_value_allowed_flag is equal to 1 2472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.gaps_in_frame_num = 0; 2473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //mfd_printf("ERROR STREAM??\n"); 2475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////// Error handling here---- 2476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////// Removed following OLO source (Sodaville H.D) 2479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //else if (pInfo->img.gaps_in_frame_num > active_sps->num_ref_frames) { 2480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // // No need to produce any more non-existent frames than the amount required to flush the dpb 2481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // pInfo->img.gaps_in_frame_num = active_sps->num_ref_frames; 2482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //mfd_printf("gaps in frame: %d\n", gaps_in_frame_num); 2483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //} 2484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // If the previous picture was an unpaired field, mark it as a dangler 2486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->used_size) 2487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx = p_dpb->used_size-1; 2489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee prev_idc = p_dpb->fs_dpb_idc[idx]; 2490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (prev_idc != MPD_DPB_FS_NULL_IDC) 2491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2492bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dpb_idc[idx]); 2493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_used(active_fs) != 3) { 2494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mark_dangling_field(p_dpb, active_fs->fs_idc); //, DANGLING_TYPE_GAP_IN_FRAME 2495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while(temp_frame_num < pInfo->img.gaps_in_frame_num) 2500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_assign_frame_store(pInfo, 1); 2502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Set up initial markings - not sure if all are needed 2504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_dec_structure(active_fs, FRAME); 2505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(MaxFrameNum) 2507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ldiv_mod_u((uint32_t)(pInfo->img.PreviousFrameNum + 1), (uint32_t)MaxFrameNum, &temp); 2508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.pic_num = temp; 2510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->long_term_frame_idx = 0; 2511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.long_term_pic_num = 0; 2512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_long_term(active_fs, 0); 2513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Note the call below will overwrite some aspects of the img structure with info relating to the 2515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // non-existent picture 2516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // However, since this is called before h264_hdr_decoding_poc() for the current existing picture 2517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // it should be o.k. 2518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.pic_order_cnt_type) 2519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_hdr_decoding_poc(pInfo, 1, temp); 2520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.structure = FRAME; 2522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.poc = pInfo->img.framepoc; 2523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // call store_picture_in_dpb 2525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_store_previous_picture_in_dpb(pInfo, 1, 0); 2527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_hdr_post_poc(pInfo, 1, temp, 0); 2529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp_frame_num++; 2531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_unmark_for_reference () 2540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Mark FrameStore unused for reference. Removes it from the short term reference list 2542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2544bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_unmark_for_reference(h264_DecodedPictureBuffer *p_dpb, int32_t fs_idc) 2545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, fs_idc); 2547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs)&0x1) active_fs->top_field.used_for_reference = 0; 2549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs)&0x2) active_fs->bottom_field.used_for_reference = 0; 2550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs) == 3) active_fs->frame.used_for_reference = 0; 2551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = 0; 2553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2560bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_unmark_for_long_term_reference () 2562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// mark FrameStore unused for reference and reset long term flags 2564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// This function does not remove it form the long term list 2565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2567bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_unmark_for_long_term_reference(h264_DecodedPictureBuffer *p_dpb, int32_t fs_idc) 2568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, fs_idc); 2570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs)&0x1) 2572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.used_for_reference = 0; 2574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.is_long_term = 0; 2575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs)&0x2) 2578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.used_for_reference = 0; 2580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.is_long_term = 0; 2581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs) == 3) 2583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = 0; 2585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.is_long_term = 0; 2586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = 0; 2589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_long_term(active_fs, 0); 2590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2595bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_mark_dangling_field 2600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Tells HW previous field was dangling 2602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Marks it in SW as so 2603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Takes appropriate actions. - sys_data needs thought through... 2604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2606bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_mark_dangling_field(h264_DecodedPictureBuffer *p_dpb, int32_t fs_idc) 2607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, fs_idc); 2610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //PRINTF(MFD_NONE, " fs_idc = %d DANGLING_TYPE = %d \n", fs_idc, reason); 2612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* 2613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Make the check that it has not already been marked 2614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee This covers the situation of a dangling field followed by a 2615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee frame which is direct output (i.e. never entered into the dpb). 2616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee In this case we could attempt to mark the prev unpaired field 2617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee as a dangler twice which would upset the HW dpb_disp_q count 2618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee */ 2619bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_dangling(active_fs) == 0) 2621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch(viddec_h264_get_dec_structure(active_fs)) 2623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case TOP_FIELD: 2625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_dangling(active_fs, 1); 2626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //PRINTF(MFD_NONE, "FN:%d fs_idc=%d FRAME_FLAG_DANGLING_TOP_FIELD\n ", (h264_frame_number+1), active_fs->fs_idc); 2627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case BOTTOM_FIELD: 2629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //PRINTF(MFD_NONE, " FN:%d fs_idc=%d FRAME_FLAG_DANGLING_BOTTOM_FIELD \n ", (h264_frame_number+1), active_fs->fs_idc); 2630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_dangling(active_fs, 1); 2631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default: 2633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //PRINTF(MFD_NONE, "FN:%d fs_idc=%d DANGLING: FATAL_ERROR\n ", (h264_frame_number+1), active_fs->fs_idc); 2634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_send_new_decoded_frame(); 2638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_is_used_for_reference () 2649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Check if one of the frames/fields in active_fs is used for reference 2651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2652bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_is_used_for_reference(int32_t * flag) 2653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2655bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /* Check out below for embedded */ 2656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *flag = 0; 2657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->frame.used_for_reference) 2658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *flag = 1; 2659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (viddec_h264_get_is_used(active_fs) ==3) // frame 2660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *flag = active_fs->frame.used_for_reference; 2661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 2662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs)&0x1) // top field 2664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *flag = active_fs->top_field.used_for_reference; 2665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_used(active_fs)&0x2) // bottom field 2666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *flag = *flag || active_fs->bottom_field.used_for_reference; 2667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2669bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_idr_memory_management () 2675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2676bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Perform Memory management for idr pictures 2677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2679bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_idr_memory_management (h264_Info * pInfo,seq_param_set_used_ptr active_sps, int32_t no_output_of_prior_pics_flag) 2680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 2682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t idx; 2683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t i; 2684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t DPB_size; 2685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t FrameSizeInBytes, FrameSizeInMbs; 2686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t data; 2687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t num_ref_frames = active_sps->num_ref_frames; 2688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t level_idc = active_sps->level_idc; 2689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t temp_bump_level=0; 2690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// H.D----- 2693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// There are 2 kinds of dpb flush defined, one is with display, the other is without display 2694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// The function name dpb_flush actually is just the first, and the 2nd one is for error case or no_prior_output 2695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// We will rewrite the code below to make it clean and clear 2696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 2697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (no_output_of_prior_pics_flag) 2698bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // free all stored pictures 2701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->used_size; idx = idx + 1) 2702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dpb_idc[idx]); 2704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //mfd_printf(" directly freeing fs_idc = %d DSN = 0x%x \n",active_fs->fs_idc, active_fs->first_dsn); 2706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_used(active_fs, 0); 2707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if( (active_fs->frame_sent == 0x01) && (active_fs->is_output == 0x0)) 2708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //DECODED_FRAME sent but not DISPLAY_FRAME 2710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_reference(p_dpb, active_fs->fs_idc); 2711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, active_fs->fs_idc); 2712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_send_new_display_frame(0x01); //send ignore_frame signal to Host 2713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2714bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Add into drop-out list for all frms in dpb without display 2715bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!(viddec_h264_get_is_non_existent(active_fs))) { 2716bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( viddec_h264_get_is_output(&(p_dpb->fs[p_dpb->fs_dpb_idc[idx]])) ) { //// This frame has been displayed but not released 2717bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->frame_id_need_to_be_removed[p_dpb->frame_numbers_need_to_be_removed] = p_dpb->fs_dpb_idc[idx]; 2718bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->frame_numbers_need_to_be_removed ++; 2719bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { //// This frame will be removed without display 2720bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->frame_id_need_to_be_dropped[p_dpb->frame_numbers_need_to_be_dropped] = p_dpb->fs_dpb_idc[idx]; 2721bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->frame_numbers_need_to_be_dropped ++; 2722bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2723bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2724bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2725bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2726bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2727bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2728bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////////////////////////////////////////// Reset Reference list 2729bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; i < p_dpb->ref_frames_in_buffer; i++) 2730bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_ref_idc[i] = MPD_DPB_FS_NULL_IDC; 2731bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2732bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; i < p_dpb->ltref_frames_in_buffer; i++) 2733bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_ltref_idc[i] = MPD_DPB_FS_NULL_IDC; 2734bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2735bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////////////////////////////////////////// Reset DPB and dpb list 2736bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; i < p_dpb->used_size; i++) { 2737bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs[p_dpb->fs_dpb_idc[i]].fs_idc = MPD_DPB_FS_NULL_IDC; 2738bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_dpb_idc[i] = MPD_DPB_FS_NULL_IDC; 2739bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2740bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2741bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->used_size = 0; 2742bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->ref_frames_in_buffer = 0; 2743bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->ltref_frames_in_buffer = 0; 2744bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2745bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->last_output_poc = 0x80000000; 2746bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2747bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 2748bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_flush_dpb(pInfo, 1, pInfo->img.second_field, num_ref_frames); 2749bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2750bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2751bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->fs_dec_idc != MPD_DPB_FS_NULL_IDC) // added condition for use of DPB initialization 2752bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2753bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 2754bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.long_term_reference_flag) 2755bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2756bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->max_long_term_pic_idx = 0; 2757bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch (viddec_h264_get_dec_structure(active_fs)) 2758bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2759bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case FRAME : active_fs->frame.is_long_term = 1; 2760bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case TOP_FIELD : active_fs->top_field.is_long_term = 1; 2761bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case BOTTOM_FIELD : active_fs->bottom_field.is_long_term = 1; 2762bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2763bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->long_term_frame_idx = 0; 2764bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2765bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 2766bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2767bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->max_long_term_pic_idx = MPD_DPB_FS_NULL_IDC; 2768bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_long_term(active_fs, 0); 2769bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2770bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2771bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2772bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->OutputLevel = 0; 2773bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->OutputLevelValid = 0; 2774bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->OutputCtrl = 0; 2775bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2776bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2777bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Set up bumping level - do this every time a parameters set is activated... 2778bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_sps->sps_disp.vui_parameters_present_flag) 2779bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2780bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_sps->sps_disp.vui_seq_parameters.bitstream_restriction_flag) 2781bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2782bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //p_dpb->OutputLevel = active_sps->sps_disp.vui_seq_parameters.num_reorder_frames; 2783bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //p_dpb->OutputLevelValid = 1; 2784bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2785bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2786bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2787bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Set up bumping level - do this every time a parameters set is activated... 2788bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch(level_idc) 2789bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2790bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level1b: 2791bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level1: 2792bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2793bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((active_sps->profile_idc < 100) && ((active_sps->constraint_set_flags & 0x1) == 0)) { 2794bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 338; 2795bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2796bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 2797bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 149; 2798bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2799bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2800bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2801bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2802bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level11: 2803bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2804bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 338; 2805bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2806bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2807bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level12: 2808bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level13: 2809bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level2: 2810bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2811bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 891; 2812bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2813bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2814bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level21: 2815bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2816bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 1782; 2817bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2818bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2819bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level22: 2820bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level3: 2821bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2822bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 3038; 2823bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2824bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2825bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level31: 2826bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2827bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 6750; 2828bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2829bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2830bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level32: 2831bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2832bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 7680; 2833bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2834bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2835bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level4: 2836bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level41: 2837bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2838bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 12288; 2839bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2840bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2841bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level42: 2842bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2843bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 13056; 2844bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2845bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2846bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level5: 2847bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2848bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 41400; 2849bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2850bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2851bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case h264_Level51: 2852bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2853bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee DPB_size = 69120; 2854bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 2855bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2856bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default : DPB_size = 69120; break; 2857bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2858bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2859bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee FrameSizeInMbs = pInfo->img.PicWidthInMbs * pInfo->img.FrameHeightInMbs; 2860bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee FrameSizeInBytes = (FrameSizeInMbs << 8) + (FrameSizeInMbs << 7); 2861bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2862bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(FrameSizeInBytes) 2863bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2864bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2865bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee temp_bump_level = ldiv_mod_u((DPB_size << 10), FrameSizeInBytes, &data); 2866bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2867bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(temp_bump_level > 255) 2868bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2869bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->BumpLevel = 255; 2870bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2871bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 2872bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2873bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->BumpLevel = (uint8_t)temp_bump_level; 2874bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2875bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2876bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2877bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->BumpLevel == 0) 2878bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->BumpLevel = active_sps->num_ref_frames + 1; 2879bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2880bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->BumpLevel > 16) 2881bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->BumpLevel = 16; 2882bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2883bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2884bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_sps->sps_disp.vui_parameters_present_flag && active_sps->sps_disp.vui_seq_parameters.bitstream_restriction_flag) { 2885bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2886bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_sps->sps_disp.vui_seq_parameters.max_dec_frame_buffering > p_dpb->BumpLevel) { 2887bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //MFD_PARSER_DEBUG(ERROR_H264_DPB); 2888bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //// err handling here 2889bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2890bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 2891bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->BumpLevel = (active_sps->sps_disp.vui_seq_parameters.max_dec_frame_buffering > 1) ? 2892bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (active_sps->sps_disp.vui_seq_parameters.max_dec_frame_buffering) : 1; 2893bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2894bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2895bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2896bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2897bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // A new sequence means automatic frame release 2898bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //sei_information.disp_frozen = 0; 2899bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2900bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2901bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} //// End --- dpb_idr_memory_management 2902bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2903bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2904bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2905bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2906bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2907bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_remove_frame_from_dpb () 2908bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2909bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// remove one frame from DPB 2910bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// The parameter index, is the location of the frame to be removed in the 2911bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// fs_dpb_idc list. The used size is decremented by one 2912bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2913bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2914bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_remove_frame_from_dpb(h264_DecodedPictureBuffer *p_dpb, int32_t idx) 2915bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2916bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t fs_idc; 2917bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t i; 2918bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2919bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee fs_idc = p_dpb->fs_dpb_idc[idx]; 2920bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2921bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, fs_idc); 2922bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_used(active_fs, 0); 2923bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2924bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //add to support frame relocation interface to host 2925bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!(viddec_h264_get_is_non_existent(active_fs))) 2926bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2927bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->frame_id_need_to_be_removed[p_dpb->frame_numbers_need_to_be_removed] = p_dpb->fs[fs_idc].fs_idc; 2928bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->frame_numbers_need_to_be_removed ++; 2929bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2930bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2931bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///////////////////////////////////////// Reset FS 2932bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs[fs_idc].fs_idc = MPD_DPB_FS_NULL_IDC; 2933bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2934bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /////Remove unused frame from dpb-list 2935bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee i = idx; 2936bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while( (i + 1)< p_dpb->used_size) 2937bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2938bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_dpb_idc[i] = p_dpb->fs_dpb_idc[i + 1]; 2939bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee i ++; 2940bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2941bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_dpb_idc[i] = MPD_DPB_FS_NULL_IDC; 2942bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2943bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //////////////////////////// 2944bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->used_size--; 2945bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2946bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 2947bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 2948bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2949bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2950bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2951bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 2952bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2953bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2954bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_remove_unused_frame_from_dpb () 2955bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 2956bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Remove a picture from DPB which is no longer needed. 2957bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Search for a frame which is not used for reference and has previously been placed 2958bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// in the output queue - if find one call h264_dpb_remove_frame_from_dpb() and 2959bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// set flag 1 2960bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 2961bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2962bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_remove_unused_frame_from_dpb(h264_DecodedPictureBuffer *p_dpb, int32_t * flag) 2963bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 2964bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t idx; 2965bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t first_non_exist_valid, non_exist_idx; 2966bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t used_for_reference = 0; 2967bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2968bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *flag = 0; 2969bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee first_non_exist_valid = 0x0; 2970bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee non_exist_idx = 0x0; 2971bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2972bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; (idx < p_dpb->used_size) && (*flag == 0); idx++) 2973bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2974bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dpb_idc[idx]); 2975bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_is_used_for_reference(&used_for_reference); 2976bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2977bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if( (used_for_reference == 0x0 ) && active_fs->is_output && active_fs->is_non_existent == 0x0) 2978bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //{ 2979bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //PRINTF(MFD_NONE, " requesting to send FREE: fs_idc = %d fb_id = %d \n", active_fs->fs_idc, active_fs->fb_id); 2980bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //dpb_release_fb(&h264_dpb, active_fs->fb_id, 1); 2981bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //} 2982bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 2983bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_output(active_fs) && (used_for_reference == 0)) 2984bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2985bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_frame_from_dpb(p_dpb, idx); 2986bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *flag = 1; 2987bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2988bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* 2989bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/////// Removed following OLO source (Sodaville H.D) 2990bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if ( (first_non_exist_valid == 0x0) && active_fs->is_non_existent ) 2991bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 2992bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee first_non_exist_valid = 0x01; 2993bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee non_exist_idx = idx; 2994bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2995bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee*/ 2996bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 2997bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* 2998bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/////// Removed following OLO source (Sodaville H.D) 2999bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ( *flag == 0x0 && first_non_exist_valid) { 3000bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_frame_from_dpb(p_dpb,non_exist_idx); 3001bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *flag = 1; 3002bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3003bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee*/ 3004bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 3005bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} //// End of h264_dpb_remove_unused_frame_from_dpb 3006bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3007bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3008bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3009bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3010bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3011bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3012bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_get_smallest_poc () 3013bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3014bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// find smallest POC in the DPB which has not as yet been output 3015bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// This function only checks for frames and dangling fields... 3016bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// unless the dpb used size is one, in which case it will accept an unpaired field 3017bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3018bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_get_smallest_poc(h264_DecodedPictureBuffer *p_dpb, int32_t *poc, int32_t *pos) 3019bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3020bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t poc_int; 3021bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t idx; 3022bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t first_non_output = 1; 3023bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3024bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *pos = MPD_DPB_FS_NULL_IDC; 3025bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3026bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dpb_idc[0]); 3027bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee poc_int = active_fs->frame.poc; 3028bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3029bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->used_size; idx++) 3030bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3031bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dpb_idc[idx]); 3032bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3033bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (viddec_h264_get_is_output(active_fs) == 0) 3034bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3035bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //PRINTF(MFD_NONE, " active_fs->fs_idc = %d active_fs->is_used = %d, active_fs->is_dangling = %d , active_fs->poc = %d \n", active_fs->fs_idc, active_fs->is_used, active_fs->is_dangling, active_fs->poc); 3036bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((viddec_h264_get_is_used(active_fs) == 3) || (viddec_h264_get_is_dangling(active_fs))) 3037bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3038bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (first_non_output) 3039bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3040bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *pos = idx; 3041bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee first_non_output = 0; 3042bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee poc_int = active_fs->frame.poc; 3043bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3044bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (poc_int > active_fs->frame.poc) 3045bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3046bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee poc_int = active_fs->frame.poc; 3047bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *pos = idx; 3048bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3049bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3050bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (p_dpb->used_size == 1) 3051bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3052bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee poc_int = active_fs->frame.poc; 3053bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *pos = idx; 3054bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3055bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3056bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3057bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3058bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *poc = poc_int; 3059bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3060bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 3061bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 3062bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3063bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3064bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3065bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3066bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3067bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_split_field () 3068bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3069bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Extract field information from a frame 3070bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3071bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3072bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_split_field (h264_Info * pInfo) 3073bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3074bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3075bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->frame.poc = active_fs->frame.poc; 3076bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // active_fs->top_field.poc = active_fs->frame.poc; 3077bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // This line changed on 11/05/05 KMc 3078bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.poc = pInfo->img.toppoc; 3079bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.poc = pInfo->img.bottompoc; 3080bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3081bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.used_for_reference = active_fs->frame.used_for_reference & 1; 3082bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.used_for_reference = active_fs->frame.used_for_reference >> 1; 3083bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3084bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.is_long_term = active_fs->frame.is_long_term; 3085bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.is_long_term = active_fs->frame.is_long_term; 3086bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3087bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->long_term_frame_idx = active_fs->frame.long_term_frame_idx; 3088bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.long_term_frame_idx = active_fs->frame.long_term_frame_idx; 3089bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.long_term_frame_idx = active_fs->frame.long_term_frame_idx; 3090bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3091bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3092bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Assign field mvs attached to MB-Frame buffer to the proper buffer 3093bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //! Generate field MVs from Frame MVs 3094bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // ... 3095bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // these will be done in RTL through using proper memory mapping 3096bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 3097bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 3098bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3099bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_combine_field (int32_t use_old) 3105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Generate a frame from top and bottom fields 3107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3109bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_combine_field(int32_t use_old) 3110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //remove warning 3113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee use_old = use_old; 3114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.poc = (active_fs->top_field.poc < active_fs->bottom_field.poc)? 3116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.poc: active_fs->bottom_field.poc; 3117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->frame.poc = active_fs->poc; 3119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = active_fs->top_field.used_for_reference |(active_fs->bottom_field.used_for_reference); 3122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.is_long_term = active_fs->top_field.is_long_term |(active_fs->bottom_field.is_long_term <<1); 3124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->frame.is_long_term) 3126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.long_term_frame_idx = active_fs->long_term_frame_idx; 3127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 3129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 3131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_sliding_window_memory_management () 3138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Perform Sliding window decoded reference picture marking process 3140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// It must be the reference frame, complementary reference field pair 3141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// or non-paired reference field that has the smallest value of 3142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// FrameNumWrap which is marked as unused for reference. Note : We CANNOT 3143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// simply use frame_num!!!! 3144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Although we hold frame_num_wrap in SW, currently, this is not 3146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// being updated for every picture (the b-picture parameter non-update 3147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// phenomenon of the reference software) 3148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3150bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_sliding_window_memory_management(h264_DecodedPictureBuffer *p_dpb, int32_t NonExisting, int32_t num_ref_frames) 3151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // if this is a reference pic with sliding window, unmark first ref frame 3153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // should this be (p_dpb->ref_frames_in_buffer + p_dpb->ltref_frames_in_buffer) 3154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Rem: adaptive marking can be on a slice by slice basis so we 3155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // could have pictures merked as long term reference in adaptive marking and then 3156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // the marking mode changed back to sliding_window_memory_management 3157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->ref_frames_in_buffer >= (num_ref_frames - p_dpb->ltref_frames_in_buffer)) 3158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_reference(p_dpb, p_dpb->fs_ref_idc[0]); 3160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, p_dpb->fs_ref_idc[0]); 3161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting == 0) 3163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dec_idc); 3165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_long_term(active_fs, 0); 3166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 3169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_store_picture_in_dpb () 3175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// First we run the marking procedure. 3177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Then, before we add the current frame_store to the list of refernce stores we run some checks 3178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// These include checking the number of existing reference frames 3179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// in DPB and if necessary, flushing frames. 3180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// \param NonExisting 3182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// If non-zero this is called to store a non-existing frame resulting from gaps_in_frame_num 3183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_frame_output () 3187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// If direct == 1, Directly output a frame without storing it in the p_dpb-> 3189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Therefore we must set is_used to 0, which I guess means it will not appear 3190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// in the fs_dpb_idc list and is_output to 1 which means it should be in the 3191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// fs_output_idc list. 3192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// If it is a non-existing pcture we do not actually place it in the output queue 3194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3196bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_frame_output(h264_Info * pInfo,int32_t fs_idc, int32_t direct, int32_t * existing) 3197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 3199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, fs_idc); 3201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_dpb_push_output_queue(); 3203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->sei_information.disp_frozen) 3204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // check pocs 3206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs->top_field.poc >= pInfo->sei_information.freeze_POC) 3207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs->top_field.poc < pInfo->sei_information.release_POC) 3209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_top_skipped(active_fs, 1); 3211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sei_information.disp_frozen = 0; 3215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs->bottom_field.poc >= pInfo->sei_information.freeze_POC) 3219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs->bottom_field.poc < pInfo->sei_information.release_POC) 3221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_bottom_skipped(active_fs, 1); 3223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sei_information.disp_frozen = 0; 3227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ( viddec_h264_get_broken_link_picture(active_fs) ) 3232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sei_information.broken_link = 1; 3233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( pInfo->sei_information.broken_link) 3235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Check if this was the recovery point picture - going to have recovery point on 3237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // a frame basis 3238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_recovery_pt_picture(active_fs)) 3239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sei_information.broken_link = 0; 3241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Also reset wait on sei recovery point picture 3242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->WaitSeiRecovery = 0; 3243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_skipped(active_fs, 3); 3247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // even if this is not a broken - link, we need to follow SEI recovery point rules 3252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Did we use SEI recovery point for th elast restart? 3253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ( p_dpb->WaitSeiRecovery ) 3254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ( viddec_h264_get_recovery_pt_picture(active_fs) ) { 3256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->WaitSeiRecovery = 0; 3257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 3258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_skipped(active_fs, 3); 3259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ( p_dpb->SuspendOutput ) 3264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ( viddec_h264_get_open_gop_entry(active_fs) ) { 3266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->SuspendOutput = 0; 3267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else{ 3268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_skipped(active_fs, 3); 3269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_send_new_display_frame(0x0); 3273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_output(active_fs, 1); 3274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_non_existent(active_fs) == 0) 3276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *existing = 1; 3278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->frame_id_need_to_be_displayed[p_dpb->frame_numbers_need_to_be_displayed]=active_fs->fs_idc; 3279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->frame_numbers_need_to_be_displayed++; 3280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if(direct) 3282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_dpb_remove_frame_from_dpb(p_dpb, active_fs->fs_idc); // Remove dpb.fs_dpb_idc[pos] 3283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *existing = 0; 3287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(direct) { 3290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_frame_used(active_fs, 0); 3291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = 0; 3292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.used_for_reference = 0; 3293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.used_for_reference = 0; 3294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->fs_idc = MPD_DPB_FS_NULL_IDC; 3295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 3297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} ///////// End of dpb frame output 3298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_output_one_frame_from_dpb () 3305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Output one frame stored in the DPB. Basiclly this results in its placment 3307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// in the fs_output_idc list. 3308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Placement in the output queue should cause an automatic removal from the dpb 3309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// if the frame store is not being used as a reference 3310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// This may need another param for a frame request so that it definitely outputs one non-exiosting frame 3311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3312bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t h264_dpb_output_one_frame_from_dpb(h264_Info* pInfo,int32_t direct, int32_t request, int32_t num_ref_frames) 3313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 3315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t poc; 3316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t pos; 3317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t used_for_reference; 3318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t existing = 0; 3320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t is_refused = 0; 3321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t is_pushed = 0; 3322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //remove warning 3324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee request = request; 3325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(direct) 3327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_frame_output(pInfo, p_dpb->fs_dec_idc, 1, &existing); 3329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->used_size != 0) 3333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Should this be dpb.not_as_yet_output_num > 0 ?? 3335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // There should maybe be a is_refused == 0 condition instead... 3336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while ((p_dpb->used_size > 0) && (existing == 0) && (is_refused == 0)) 3337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // find smallest non-output POC 3339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_get_smallest_poc(p_dpb, &poc, &pos); 3340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pos != MPD_DPB_FS_NULL_IDC) 3341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // put it into the output queue 3343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_frame_output(pInfo, p_dpb->fs_dpb_idc[pos], 0, &existing); 3344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->last_output_poc = poc; 3346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (existing) is_pushed = 1; 3347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // If non-reference, free frame store and move empty store to end of buffer 3348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_is_used_for_reference(&used_for_reference); 3350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!(used_for_reference)) 3351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_frame_from_dpb(p_dpb, pos); // Remove dpb.fs_dpb_idc[pos] 3352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t flag; 3356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t idx; 3357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // This is basically an error condition caused by too many reference frames in the DPB. 3359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // It should only happen in errored streams, and can happen if this picture had an MMCO, 3360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // thus disabling h264_dpb_sliding_window_memory_management(), which would normally have 3361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // unmarked the oldest reference frame. 3362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_sliding_window_memory_management(p_dpb, 0,num_ref_frames); 3363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_unused_frame_from_dpb(p_dpb, &flag); 3364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (flag == 0) { 3366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < p_dpb->used_size; idx++) 3367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dpb_idc[idx]); 3369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_is_used_for_reference(&used_for_reference); 3370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (used_for_reference) { 3372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 3373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (idx < p_dpb->used_size) { 3377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Short term 3378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_reference(p_dpb, p_dpb->fs_dpb_idc[idx]); 3379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, p_dpb->fs_dpb_idc[idx]); 3380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Long term 3382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_long_term_reference(p_dpb, p_dpb->fs_dpb_idc[idx]); 3383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ltref_list(p_dpb, p_dpb->fs_dpb_idc[idx]); 3384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Remove from DPB 3386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_unused_frame_from_dpb(p_dpb, &flag); 3387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return 1; 3390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return is_pushed; 3396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 3397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_queue_update 3405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// This should be called anytime the output queue might be changed 3407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3409bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t h264_dpb_queue_update(h264_Info* pInfo,int32_t push, int32_t direct, int32_t frame_request, int32_t num_ref_frames) 3410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t frame_output = 0; 3413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(push) 3415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee frame_output = h264_dpb_output_one_frame_from_dpb(pInfo, direct, 0, num_ref_frames); 3417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if(frame_request) 3419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee frame_output = h264_dpb_output_one_frame_from_dpb(pInfo, 0, 1,num_ref_frames); 3421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return frame_output; 3425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 3427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_flush_dpb () 3434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Unmarks all reference pictures in the short-term and long term lists and 3436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// in doing so resets the lists. 3437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Flushing the dpb, adds all the current frames in the dpb, not already on the output list 3439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// to the output list and removes them from the dpb (they will all be marked as unused for 3440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// reference first) 3441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3443bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_flush_dpb (h264_Info* pInfo,int32_t output_all, int32_t keep_complement, int32_t num_ref_frames) 3444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 3446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx, flag; 3448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ref_frames_in_buffer; 3449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ref_frames_in_buffer = p_dpb->ref_frames_in_buffer; 3451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < ref_frames_in_buffer; idx++){ 3453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_reference(p_dpb, p_dpb->fs_ref_idc[0]); 3454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ref_list(p_dpb, p_dpb->fs_ref_idc[0]); 3455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ref_frames_in_buffer = p_dpb->ltref_frames_in_buffer; 3458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < ref_frames_in_buffer; idx++) 3460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_unmark_for_long_term_reference(p_dpb, p_dpb->fs_ltref_idc[0]); 3462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_ltref_list(p_dpb, p_dpb->fs_ltref_idc[0]); 3463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // output frames in POC order 3466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (output_all) { 3467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while (p_dpb->used_size - keep_complement) { 3468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_queue_update(pInfo, 1, 0, 0,num_ref_frames); 3469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee flag = 1; 3473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while (flag) { 3474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_unused_frame_from_dpb(p_dpb, &flag); 3475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3477bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 3478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 3479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_reset_dpb () 3485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Used to reset the contents of dpb 3487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Must calculate memory (aligned) pointers for each of the possible frame stores 3488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Also want to calculate possible max dpb size in terms of frames 3490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// We should have an active SPS when we call this ftn to calc bumping level 3491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3492bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_reset_dpb(h264_Info * pInfo,int32_t PicWidthInMbs, int32_t FrameHeightInMbs, int32_t SizeChange, int32_t no_output_of_prior_pics_flag) 3493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 3495bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t num_ref_frames = pInfo->active_SPS.num_ref_frames; 3497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // If half way through a frame then Frame in progress will still be high, 3500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // so mark the previous field as a dangling field. This is also needed to 3501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // keep cs7050_sif_dpb_disp_numb_ptr correct. Better to reset instead? 3502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(p_dpb->used_size) 3503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx; 3505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx = p_dpb->used_size-1; 3506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->fs_dpb_idc[idx] != MPD_DPB_FS_NULL_IDC) 3507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, p_dpb->fs_dpb_idc[idx]); 3509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_used(active_fs) != 3) 3511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mark_dangling_field(p_dpb, active_fs->fs_idc); //, DANGLING_TYPE_DPB_RESET 3512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // initialize software DPB 3516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(active_fs) { 3517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_dec_structure(active_fs, INVALID); 3518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_idr_memory_management(pInfo, &pInfo->active_SPS, no_output_of_prior_pics_flag); // implied no_output_of_prior_pics_flag==1 3520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // May always be a size change which calls this function now... 3523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // could eliminate below branch 3524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(SizeChange) 3525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /*** 3528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Note : 21/03/2005 14:16 3529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Danger asociated with resetting curr_alloc_mem as it would allow the FW top reallocate 3530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee frame stores from 0 -> NUM_FRAME_STORES again - could lead to queue overflow and corruption 3531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee Placed in size change condition in the hope that this will only ensure dpb is empty 3533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee and thus this behaviour is valid before continuing again 3534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ***/ 3535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3536bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->PicWidthInMbs = PicWidthInMbs; 3538bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->FrameHeightInMbs = FrameHeightInMbs; 3539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_dec_idc = MPD_DPB_FS_NULL_IDC; 3541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //Flush the current DPB. 3542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_flush_dpb(pInfo, 1,0,num_ref_frames); 3543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 3546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} ///// End of reset DPB 3547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3549bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// --------------------------------------------------------------------------- 3552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Note that if an 'missing_pip_fb' condition exists, the message will 3553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// sent to the host each time setup_free_fb is called. However, since this 3554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// condition is not expected to happen if pre-defined steps are followed, we let 3555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// it be for now and will change it if required. Basically, as long as host 3556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// enables PiP after adding PiP buffers and disables PiP before removing buffers 3557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// and matches PiP fb_id's with normal decode fb_id's this condition should 3558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// not occur. 3559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// --------------------------------------------------------------------------- 3560bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t dpb_setup_free_fb( h264_DecodedPictureBuffer *p_dpb, uint8_t* fb_id, pip_setting_t* pip_setting ) 3561bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3562bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t idx; 3563bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3564bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //remove warning 3565bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pip_setting = pip_setting; 3566bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3567bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3568bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (idx = 0; idx < NUM_DPB_FRAME_STORES; idx++) 3569bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3570bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (p_dpb->fs[idx].fs_idc == MPD_DPB_FS_NULL_IDC) 3571bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3572bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee *fb_id = idx; 3573bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 3574bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3575bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3576bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3577bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(idx == NUM_DPB_FRAME_STORES) 3578bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return 1; 3579bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3580bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs[idx].fs_idc = idx; 3581bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3582bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return 0; 3583bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3584bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 3585bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3586bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3587bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3588bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3589bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3590bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_assign_frame_store () 3591bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3592bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// may need a non-existing option parameter 3593bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3594bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3595bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeint32_t h264_dpb_assign_frame_store(h264_Info * pInfo, int32_t NonExisting) 3596bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3597bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint8_t idc = MPD_DPB_FS_NULL_IDC; 3598bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pip_setting_t pip_setting; 3599bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *p_dpb = &pInfo->dpb; 3600bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3601bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3602bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while( dpb_setup_free_fb(p_dpb, &idc, &pip_setting) != 0 ) { 3603bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 3604bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// Generally this is triggered a error case, no more frame buffer avaliable for next 3605bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// What we do here is just remove one with min-POC before get more info 3606bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee /// 3607bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3608bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t pos = 0, poc = 0, existing = 1; 3609bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3610bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // find smallest non-output POC 3611bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_get_smallest_poc(p_dpb, &poc, &pos); 3612bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pos != MPD_DPB_FS_NULL_IDC) 3613bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3614bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // put it into the output queue 3615bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_frame_output(pInfo, p_dpb->fs_dpb_idc[pos], 0, &existing); 3616bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->last_output_poc = poc; 3617bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_remove_frame_from_dpb(p_dpb, pos); // Remove dpb.fs_dpb_idc[pos] 3618bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3619bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3620bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3621bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3622bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting) { 3623bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_non_exist_idc = idc; 3624bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }else { 3625bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->fs_dec_idc = idc; 3626bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3627bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3628bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //add to support frame relocation interface to host 3629bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(!NonExisting) 3630bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3631bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->frame_numbers_need_to_be_allocated = 1; 3632bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee p_dpb->frame_id_need_to_be_allocated = p_dpb->fs_dec_idc; 3633bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3634bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3635bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3636bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ///////////////////////////////h264_dpb_reset_fs(); 3637bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(p_dpb, idc); 3638bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->fs_flag_1 = 0; 3639bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->fs_flag_2 = 0; 3640bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_non_existent(active_fs, NonExisting); 3641bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_output(active_fs, (NonExisting?1:0)); 3642bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3643bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->pic_type = ((FRAME_TYPE_INVALID<<FRAME_TYPE_TOP_OFFSET)|(FRAME_TYPE_INVALID<<FRAME_TYPE_BOTTOM_OFFSET)); //---- 3644bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3645bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Only put members in here which will not be reset somewhere else 3646bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // and which could be used before they are overwritten again with 3647bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // new valid values 3648bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // eg ->is_used is reset on removal from dpb, no need for it here 3649bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // ->poc would only be changed when we overwrite on insert_Picture_in_dpb() 3650bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // but would be used by get_smallest_poc() 3651bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // ->top.poc would also not be overwritten until a new valid value comes along, 3652bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // but I don't think it is used before then so no need to reset 3653bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->is_long_term = 0; 3654bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = 0; 3655bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.poc = 0; 3656bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3657bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return 1; 3658bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} 3659bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3660bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3661bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3662bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3663bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3664bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3665bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_update_queue_dangling_field (h264_Info * pInfo) 3666bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3667bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Update DPB for Dangling field special case 3668bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3669bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_update_queue_dangling_field(h264_Info * pInfo) 3670bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3671bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *dpb_ptr = &pInfo->dpb; 3672bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t prev_pic_unpaired_field = 0; 3673bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3674bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(dpb_ptr->used_size > dpb_ptr->BumpLevel) 3675bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3676bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (dpb_ptr->fs_dpb_idc[dpb_ptr->used_size-1] != MPD_DPB_FS_NULL_IDC) 3677bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3678bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(dpb_ptr, dpb_ptr->fs_dpb_idc[dpb_ptr->used_size-1]); 3679bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_used(active_fs) != 3) 3680bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3681bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee prev_pic_unpaired_field = 1; 3682bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3683bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3684bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3685bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.structure != FRAME) 3686bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3687bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // To prove this is the second field, 3688bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1) The previous picture is an (as yet) unpaired field 3689bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(prev_pic_unpaired_field) 3690bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3691bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // If we establish the previous pic was an unpaired field and this picture is not 3692bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // its complement, the previous picture was a dangling field 3693bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.second_field == 0) { 3694bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while(dpb_ptr->used_size > dpb_ptr->BumpLevel) 3695bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_queue_update(pInfo, 1, 0, 0,pInfo->active_SPS.num_ref_frames); // flush a frame 3696bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3697bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3698bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3699bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (prev_pic_unpaired_field) { 3700bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee while(dpb_ptr->used_size > dpb_ptr->BumpLevel) 3701bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_queue_update(pInfo, 1, 0, 0,pInfo->active_SPS.num_ref_frames); // flush a frame 3702bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3703bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3704bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3705bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3706bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 3707bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} ///// End of init Frame Store 3708bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3709bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3710bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3711bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3712bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3713bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3714bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_dpb_init_frame_store (h264_Info * pInfo) 3715bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3716bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Set the frame store to be used in decoding the picture 3717bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3718bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3719bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_dpb_init_frame_store(h264_Info * pInfo) 3720bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3721bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_DecodedPictureBuffer *dpb_ptr = &pInfo->dpb; 3722bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3723bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t free_fs_found; 3724bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t idx = 0; 3725bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t prev_pic_unpaired_field = 0; 3726bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t prev_idc = MPD_DPB_FS_NULL_IDC; 3727bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t structure = pInfo->img.structure; 3728bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3729bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(dpb_ptr->used_size) 3730bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3731bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee idx = dpb_ptr->used_size-1; 3732bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee prev_idc = dpb_ptr->fs_dpb_idc[idx]; 3733bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3734bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3735bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (prev_idc != MPD_DPB_FS_NULL_IDC) 3736bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3737bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(dpb_ptr, dpb_ptr->fs_dpb_idc[dpb_ptr->used_size-1]); 3738bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(viddec_h264_get_is_used(active_fs) != 3) 3739bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3740bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //PRINTF(MFD_NONE, " FN: %d active_fs->is_used = %d \n", (h264_frame_number+1), active_fs->is_used); 3741bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee prev_pic_unpaired_field = 1; 3742bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3743bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3744bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3745bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if ((pInfo->img.curr_has_mmco_5) || (pInfo->img.idr_flag)) curr_fld_not_prev_comp = 1; 3746bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3747bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (structure != FRAME) 3748bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3749bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3750bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // To prove this is the second field, 3751bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 1) The previous picture is an (as yet) unpaired field 3752bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(prev_pic_unpaired_field) 3753bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3754bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // If we establish the previous pic was an unpaired field and this picture is not 3755bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // its complement, the previous picture was a dangling field 3756bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.second_field == 0) 3757bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mark_dangling_field(dpb_ptr, active_fs->fs_idc); //, DANGLING_TYPE_FIELD 3758bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3759bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3760bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (prev_pic_unpaired_field) { 3761bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_mark_dangling_field(dpb_ptr, active_fs->fs_idc); //, DANGLING_TYPE_FRAME 3762bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3763bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3764bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee free_fs_found = 0; 3765bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3766bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // If this is not a second field, we must find a free space for the current picture 3767bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!(pInfo->img.second_field)) 3768bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3769bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee dpb_ptr->fs_dec_idc = MPD_DPB_FS_NULL_IDC; 3770bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee free_fs_found = h264_dpb_assign_frame_store(pInfo, 0); 3771bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //h264_frame_number++; 3772bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //PRINTF(MFD_NONE, " FN: %d (inc) fs_idc = %d \n", (h264_frame_number+1), dpb.fs_dec_idc); 3773bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3774bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3775bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_dpb_set_active_fs(dpb_ptr, dpb_ptr->fs_dec_idc); 3776bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3777bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ////////////// TODO: THe following init 3778bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1 3779bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if( pInfo->img.second_field) { 3780bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->second_dsn = pInfo->img.dsn; 3781bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->prev_dsn = pInfo->img.prev_dsn; 3782bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (active_fs->pic_type == FRAME_TYPE_IDR || 3783bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->pic_type == FRAME_TYPE_I) { 3784bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3785bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_first_field_intra(active_fs, 1); 3786bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else { 3787bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_first_field_intra(active_fs, 0); 3788bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3789bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3790bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3791bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 3792bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->first_dsn = pInfo->img.dsn; 3793bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->prev_dsn = pInfo->img.prev_dsn; 3794bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_first_field_intra(active_fs, 0); 3795bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3796bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3797bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.structure == FRAME) { 3798bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->second_dsn = 0x0; 3799bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3800bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3801bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ( pInfo->sei_information.broken_link_pic ) 3802bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3803bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_broken_link_picture(active_fs, 1); 3804bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->sei_information.broken_link_pic = 0; 3805bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3806bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3807bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((pInfo->img.frame_num == pInfo->sei_information.recovery_frame_num)&&(pInfo->SliceHeader.nal_ref_idc != 0)) 3808bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_recovery_pt_picture(active_fs, 1); 3809bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3810bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //if ((( gRestartMode.aud ) || ( gRestartMode.sei )) && ( !gRestartMode.idr)) 3811bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.recovery_point_found == 6) 3812bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3813bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_open_gop_entry(active_fs, 1); 3814bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->dpb.SuspendOutput = 1; 3815bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3816bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 3817bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3818bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((pInfo->img.second_field) || (free_fs_found)) 3819bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3820bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_dec_structure(active_fs, pInfo->img.structure); 3821bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee viddec_h264_set_is_output(active_fs, 0); 3822bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3823bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch(pInfo->img.structure) 3824bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3825bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case (FRAME) :{ 3826bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.pic_num = pInfo->img.frame_num; 3827bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.long_term_frame_idx = 0; 3828bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.long_term_pic_num = 0; 3829bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.used_for_reference = 0; 3830bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.is_long_term = 0; 3831bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->frame.structure = pInfo->img.structure; 3832bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->frame.poc = pInfo->img.framepoc; 3833bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 3834bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case (TOP_FIELD) :{ 3835bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.pic_num = pInfo->img.frame_num; 3836bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.long_term_frame_idx = 0; 3837bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.long_term_pic_num = 0; 3838bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.used_for_reference = 0; 3839bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.is_long_term = 0; 3840bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->top_field.structure = pInfo->img.structure; 3841bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->top_field.poc = pInfo->img.toppoc; 3842bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 3843bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case(BOTTOM_FIELD) :{ 3844bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.pic_num = pInfo->img.frame_num; 3845bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.long_term_frame_idx = 0; 3846bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.long_term_pic_num = 0; 3847bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.used_for_reference = 0; 3848bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.is_long_term = 0; 3849bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //active_fs->bottom_field.structure = pInfo->img.structure; 3850bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee active_fs->bottom_field.poc = pInfo->img.bottompoc; 3851bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 3852bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3853bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3854bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3855bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3856bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Need to drop a frame or something here 3857bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3858bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3859bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 3860bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} ///// End of init Frame Store 3861bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3862bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3863bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3864bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3865bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 3866bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3867bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// Decoding POC for current Picture 3868bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 1) pic_order_cnt_type (0, 1, 2) 3869bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 3870bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 3871bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3872bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_hdr_decoding_poc (h264_Info * pInfo,int32_t NonExisting, int32_t frame_num) 3873bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 3874bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t MaxPicOrderCntLsb = (1<<(pInfo->active_SPS.log2_max_pic_order_cnt_lsb_minus4+4)); 3875bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t delta_pic_order_count[2]; 3876bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t MaxFrameNum = 1 << (pInfo->active_SPS.log2_max_frame_num_minus4 + 4); 3877bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3878bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t AbsFrameNum =0; 3879bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ExpectedDeltaPerPicOrderCntCycle =0; 3880bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t PicOrderCntCycleCnt = 0; 3881bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t FrameNumInPicOrderCntCycle =0; 3882bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t ExpectedPicOrderCnt =0; 3883bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3884bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t actual_frame_num =0; 3885bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3886bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3887bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3888bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting) actual_frame_num = frame_num; 3889bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else actual_frame_num = pInfo->img.frame_num; 3890bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3891bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch (pInfo->active_SPS.pic_order_cnt_type) 3892bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3893bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 0: 3894bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting != 0) break; 3895bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3896bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.idr_flag) 3897bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3898bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PicOrderCntMsb = 0; 3899bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PrevPicOrderCntLsb = 0; 3900bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3901bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (pInfo->img.last_has_mmco_5) 3902bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3903bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.last_pic_bottom_field) 3904bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3905bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PicOrderCntMsb = 0; 3906bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PrevPicOrderCntLsb = 0; 3907bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3908bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3909bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3910bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PicOrderCntMsb = 0; 3911bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PrevPicOrderCntLsb = pInfo->img.toppoc; 3912bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3913bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3914bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3915bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Calculate the MSBs of current picture 3916bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if((pInfo->img.pic_order_cnt_lsb < pInfo->img.PrevPicOrderCntLsb) && 3917bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ((pInfo->img.PrevPicOrderCntLsb - pInfo->img.pic_order_cnt_lsb )>=(MaxPicOrderCntLsb>>1)) ) 3918bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3919bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.CurrPicOrderCntMsb = pInfo->img.PicOrderCntMsb + MaxPicOrderCntLsb; 3920bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else if ((pInfo->img.pic_order_cnt_lsb > pInfo->img.PrevPicOrderCntLsb) && 3921bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ((pInfo->img.pic_order_cnt_lsb - pInfo->img.PrevPicOrderCntLsb ) > (MaxPicOrderCntLsb>>1)) ) 3922bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3923bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.CurrPicOrderCntMsb = pInfo->img.PicOrderCntMsb - MaxPicOrderCntLsb; 3924bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } else 3925bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3926bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.CurrPicOrderCntMsb = pInfo->img.PicOrderCntMsb; 3927bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3928bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3929bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 2nd 3930bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3931bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->img.field_pic_flag==0) 3932bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3933bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //frame pix 3934bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.toppoc = pInfo->img.CurrPicOrderCntMsb + pInfo->img.pic_order_cnt_lsb; 3935bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.bottompoc = pInfo->img.toppoc + pInfo->img.delta_pic_order_cnt_bottom; 3936bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.ThisPOC = pInfo->img.framepoc = (pInfo->img.toppoc < pInfo->img.bottompoc)? pInfo->img.toppoc : pInfo->img.bottompoc; // POC200301 3937bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3938bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (pInfo->img.bottom_field_flag==0) 3939bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { //top field 3940bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.ThisPOC= pInfo->img.toppoc = pInfo->img.CurrPicOrderCntMsb + pInfo->img.pic_order_cnt_lsb; 3941bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3942bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3943bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { //bottom field 3944bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.ThisPOC= pInfo->img.bottompoc = pInfo->img.CurrPicOrderCntMsb + pInfo->img.pic_order_cnt_lsb; 3945bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3946bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.framepoc=pInfo->img.ThisPOC; 3947bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3948bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ( pInfo->img.frame_num != pInfo->old_slice.frame_num) 3949bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNum = pInfo->img.frame_num; 3950bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3951bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.nal_ref_idc) 3952bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3953bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PrevPicOrderCntLsb = pInfo->img.pic_order_cnt_lsb; 3954bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PicOrderCntMsb = pInfo->img.CurrPicOrderCntMsb; 3955bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3956bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3957bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 3958bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 1: { 3959bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(NonExisting) 3960bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3961bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee delta_pic_order_count[0] = 0; 3962bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee delta_pic_order_count[1] = 0; 3963bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3964bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3965bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3966bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee delta_pic_order_count[0] = ( pInfo->img.delta_pic_order_always_zero_flag ) ? 0 : pInfo->img.delta_pic_order_cnt[0]; 3967bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee delta_pic_order_count[1] = ( pInfo->img.delta_pic_order_always_zero_flag ) ? 0 : 3968bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ( (!pInfo->active_PPS.pic_order_present_flag) && (!(pInfo->img.field_pic_flag))) ? 0 : 3969bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.delta_pic_order_cnt[1]; 3970bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3971bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3972bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // this if branch should not be taken during processing of a gap_in_frame_num pic since 3973bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // an IDR picture cannot produce non-existent frames... 3974bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if(pInfo->SliceHeader.idr_flag) 3975bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3976bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.FrameNumOffset = 0; 3977bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3978bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3979bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3980bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3981bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (actual_frame_num < pInfo->img.PreviousFrameNum) 3982bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3983bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.FrameNumOffset = pInfo->img.PreviousFrameNumOffset + MaxFrameNum; 3984bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3985bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3986bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 3987bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.FrameNumOffset = pInfo->img.PreviousFrameNumOffset; 3988bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3989bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 3990bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3991bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // pInfo->img.num_ref_frames_in_pic_order_cnt_cycle set from SPS 3992bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // so constant between existent and non-existent frames 3993bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.num_ref_frames_in_pic_order_cnt_cycle) 3994bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee AbsFrameNum = pInfo->img.FrameNumOffset + actual_frame_num; 3995bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 3996bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee AbsFrameNum = 0; 3997bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 3998bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // pInfo->img.disposable_flag should never be true for a non-existent frame since these are always 3999bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // references... 4000bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((pInfo->SliceHeader.nal_ref_idc == 0) && (AbsFrameNum > 0)) AbsFrameNum = AbsFrameNum - 1; 4001bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4002bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // 3rd 4003bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ExpectedDeltaPerPicOrderCntCycle = pInfo->active_SPS.expectedDeltaPerPOCCycle; 4004bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4005bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (AbsFrameNum) 4006bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4007bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Rem: pInfo->img.num_ref_frames_in_pic_order_cnt_cycle takes max value of 255 (8 bit) 4008bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // Frame NUm may be 2^16 (17 bits) 4009bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee // I guess we really have to treat AbsFrameNum as a 32 bit number 4010bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee uint32_t temp = 0; 4011bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t i=0; 4012bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t offset_for_ref_frame[MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE]; 4013bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4014bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.num_ref_frames_in_pic_order_cnt_cycle) 4015bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee PicOrderCntCycleCnt = ldiv_mod_u((uint32_t)(AbsFrameNum-1), (uint32_t)pInfo->img.num_ref_frames_in_pic_order_cnt_cycle, &temp); 4016bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4017bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ExpectedPicOrderCnt = mult_u((uint32_t)PicOrderCntCycleCnt, (uint32_t)ExpectedDeltaPerPicOrderCntCycle); 4018bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4019bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee FrameNumInPicOrderCntCycle = temp; 4020bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4021bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //ExpectedPicOrderCnt +=pInfo->active_SPS.expectedDeltaPerPOCCycle; 4022bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifndef USER_MODE 4023bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee h264_Parse_Copy_Offset_Ref_Frames_From_DDR(pInfo, offset_for_ref_frame, pInfo->active_SPS.seq_parameter_set_id); 4024bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; i <= FrameNumInPicOrderCntCycle; i++) 4025bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ExpectedPicOrderCnt += offset_for_ref_frame[i]; 4026bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else 4027bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee for (i = 0; i <= FrameNumInPicOrderCntCycle; i++) 4028bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ExpectedPicOrderCnt += pInfo->active_SPS.offset_for_ref_frame[i]; 4029bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif 4030bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4031bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else { 4032bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ExpectedPicOrderCnt = 0; 4033bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4034bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4035bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.nal_ref_idc == 0) 4036bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee ExpectedPicOrderCnt += pInfo->img.offset_for_non_ref_pic; 4037bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4038bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!(pInfo->img.field_pic_flag)) 4039bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4040bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.toppoc = ExpectedPicOrderCnt + delta_pic_order_count[0]; 4041bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.bottompoc = pInfo->img.toppoc + pInfo->img.offset_for_top_to_bottom_field + delta_pic_order_count[1]; 4042bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.framepoc = (pInfo->img.toppoc < pInfo->img.bottompoc)? pInfo->img.toppoc : pInfo->img.bottompoc; 4043bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.ThisPOC = pInfo->img.framepoc; 4044bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4045bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (!(pInfo->img.bottom_field_flag)) 4046bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4047bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //top field 4048bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.toppoc = ExpectedPicOrderCnt + delta_pic_order_count[0]; 4049bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.ThisPOC = pInfo->img.toppoc; 4050bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.bottompoc = 0; 4051bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4052bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 4053bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4054bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //bottom field 4055bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.toppoc = 0; 4056bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.bottompoc = ExpectedPicOrderCnt + pInfo->img.offset_for_top_to_bottom_field + delta_pic_order_count[0]; 4057bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.ThisPOC = pInfo->img.bottompoc; 4058bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4059bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4060bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //CONFORMANCE_ISSUE 4061bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.framepoc=pInfo->img.ThisPOC; 4062bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4063bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //CONFORMANCE_ISSUE 4064bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNum=pInfo->img.frame_num; 4065bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNumOffset=pInfo->img.FrameNumOffset; 4066bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4067bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4068bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 4069bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 2: { // POC MODE 2 4070bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.idr_flag) 4071bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4072bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.FrameNumOffset = 0; 4073bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.framepoc = 0; 4074bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.toppoc = 0; 4075bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.bottompoc = 0; 4076bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.ThisPOC = 0; 4077bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4078bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 4079bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4080bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->img.last_has_mmco_5) 4081bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4082bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNum = 0; 4083bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNumOffset = 0; 4084bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4085bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (actual_frame_num < pInfo->img.PreviousFrameNum) 4086bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.FrameNumOffset = pInfo->img.PreviousFrameNumOffset + MaxFrameNum; 4087bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 4088bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.FrameNumOffset = pInfo->img.PreviousFrameNumOffset; 4089bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4090bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee AbsFrameNum = pInfo->img.FrameNumOffset + actual_frame_num; 4091bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (pInfo->SliceHeader.nal_ref_idc == 0) pInfo->img.ThisPOC = (AbsFrameNum<<1) - 1; 4092bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else pInfo->img.ThisPOC = (AbsFrameNum<<1); 4093bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4094bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if (!(pInfo->img.field_pic_flag)) 4095bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4096bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.toppoc = pInfo->img.ThisPOC; 4097bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.bottompoc = pInfo->img.ThisPOC; 4098bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.framepoc = pInfo->img.ThisPOC; 4099bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else if (!(pInfo->img.bottom_field_flag)) 4101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.toppoc = pInfo->img.ThisPOC; 4103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.framepoc = pInfo->img.ThisPOC; 4104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee else 4106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.bottompoc = pInfo->img.ThisPOC; 4108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.framepoc = pInfo->img.ThisPOC; 4109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee //CONFORMANCE_ISSUE 4113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNum = pInfo->img.frame_num; 4114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNumOffset = pInfo->img.FrameNumOffset; 4115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 4117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default: 4118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 4119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 4122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} //// End of decoding_POC 4123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 4125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 4126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */ 4127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 4128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// h264_hdr_post_poc () 4129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee// 4130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////////////////////////////////////////////////////////////////////////////// 4131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4132bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid h264_hdr_post_poc(h264_Info* pInfo, int32_t NonExisting, int32_t frame_num, int32_t use_old) 4133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{ 4134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t actual_frame_num = (NonExisting)? frame_num : 4135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (use_old)? pInfo->old_slice.frame_num : 4136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.frame_num; 4137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee int32_t disposable_flag = (use_old)?(pInfo->old_slice.nal_ref_idc == 0) : 4139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee (pInfo->SliceHeader.nal_ref_idc == 0); 4140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee switch(pInfo->img.pic_order_cnt_type) 4142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 0: { 4144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNum = actual_frame_num; 4145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee if ((disposable_flag == 0) && (NonExisting == 0)) 4146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee { 4147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PrevPicOrderCntLsb = (use_old)? pInfo->old_slice.pic_order_cnt_lsb : 4148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->SliceHeader.pic_order_cnt_lsb; 4149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PicOrderCntMsb = pInfo->img.CurrPicOrderCntMsb; 4150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4151bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 4153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 1: { 4154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNum = actual_frame_num; 4155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNumOffset = pInfo->img.FrameNumOffset; 4156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee break; 4158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee case 2: { 4159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNum = actual_frame_num; 4160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee pInfo->img.PreviousFrameNumOffset = pInfo->img.FrameNumOffset; 4161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 4163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee default: { 4165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee }break; 4166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee } 4167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee return; 4169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee} ///// End of h264_hdr_post_poc 4170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee 4172