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 = &ll;     // 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