1bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_debug.h"
2bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_parser_ops.h"
3bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
4bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_fw_workload.h"
5bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_pm.h"
6bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
7bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "h264.h"
8bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "h264parse.h"
9bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
10bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "viddec_h264_parse.h"
11bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#include "h264parse_dpb.h"
12bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
13bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* Init function which can be called to intialized local context on open and flush and preserve*/
14bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
15bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_h264_init(void *ctxt, uint32_t *persist_mem, uint32_t preserve)
16bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
17bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_h264_init(void *ctxt, uint32_t *persist_mem, uint32_t preserve)
18bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
19bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
20bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   struct h264_viddec_parser* parser = ctxt;
21bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   h264_Info * pInfo = &(parser->info);
22bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
23bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   if(!preserve)
24bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   {
25bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee       /* we don't initialize this data if we want to preserve
26bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee          sequence and gop information */
27bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee       h264_init_sps_pps(parser,persist_mem);
28bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   }
29bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   /* picture level info which will always be initialized */
30bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   h264_init_Info_under_sps_pps_level(pInfo);
31bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return;
32bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
33bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
34bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
35bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */
36bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */
37bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */
38bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
39bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t viddec_h264_parse(void *parent, void *ctxt)
40bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
41bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic uint32_t viddec_h264_parse(void *parent, void *ctxt)
42bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
43bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
44bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   struct h264_viddec_parser* parser = ctxt;
45bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
46bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   h264_Info * pInfo = &(parser->info);
47bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
48bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	h264_Status status = H264_STATUS_ERROR;
49bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
50bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
51bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   uint8_t nal_ref_idc = 0;
52bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
53bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	///// Parse NAL Unit header
54bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	pInfo->img.g_new_frame = 0;
55bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   pInfo->push_to_cur = 1;
56bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	pInfo->is_current_workload_done =0;
57bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	pInfo->nal_unit_type = 0;
58bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
59bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	h264_Parse_NAL_Unit(parent, pInfo, &nal_ref_idc);
60bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
61bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	///// Check frame bounday for non-vcl elimitter
62bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	h264_check_previous_frame_end(pInfo);
63bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
64bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//OS_INFO("========================nal_type: %d=================\n", pInfo->nal_unit_type);
65bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//DEBUG_WRITE(pInfo->nal_unit_type, pInfo->got_start, pInfo->wl_err_flag, pInfo->is_current_workload_done, 0, 0);
66bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 0
67bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   devh_SVEN_WriteModuleEvent( NULL,
68bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                               SVEN_MODULE_EVENT_GV_FW_PARSER_DEBUG_P0,
69bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                               pInfo->got_start,pInfo->nal_unit_type,  pInfo->wl_err_curr, pInfo->is_current_workload_done, 0, pInfo->img.frame_num);
70bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
71bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
72bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	//////// Parse valid NAL unit
73bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	switch ( pInfo->nal_unit_type )
74bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee  	{
75bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_IDR:
76bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if(pInfo->got_start)	{
77bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->img.recovery_point_found |= 1;
78bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
79bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
80bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			pInfo->sei_rp_received = 0;
81bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
82bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee  		case h264_NAL_UNIT_TYPE_SLICE:
83bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			////////////////////////////////////////////////////////////////////////////
84bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			// Step 1: Check start point
85bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			////////////////////////////////////////////////////////////////////////////
86bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//
87bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/// Slice parsing must start from the valid start point( SPS, PPS,  IDR or recovery point or primary_I)
88bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/// 1) No start point reached, append current ES buffer to workload and release it
89bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/// 2) else, start parsing
90bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//
91bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//if(pInfo->got_start && ((pInfo->sei_information.recovery_point) || (pInfo->nal_unit_type == h264_NAL_UNIT_TYPE_IDR)))
92bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//{
93bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//pInfo->img.recovery_point_found = 1;
94bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//}
95bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         {
96bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
97bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         h264_Slice_Header_t next_SliceHeader;
98bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
99bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	      /// Reset next slice header
100bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	      h264_memset(&next_SliceHeader, 0x0, sizeof(h264_Slice_Header_t));
101bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         next_SliceHeader.nal_ref_idc = nal_ref_idc;
102bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
103bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if( (1==pInfo->primary_pic_type_plus_one)&&(pInfo->got_start))
104bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			{
105bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			   pInfo->img.recovery_point_found |=4;
106bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
107bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			pInfo->primary_pic_type_plus_one = 0;
108bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
109bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
110bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
111bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if(pInfo->img.recovery_point_found == 0) {
112bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->img.structure = FRAME;
113bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->wl_err_curr |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE;
114bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->wl_err_curr |= (FRAME << FIELD_ERR_OFFSET);
115bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				break;
116bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
117bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
118bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			////////////////////////////////////////////////////////////////////////////
119bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			// Step 2: Parsing slice header
120bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			////////////////////////////////////////////////////////////////////////////
121bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/// PWT
122bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         pInfo->h264_pwt_start_byte_offset=0;
123bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         pInfo->h264_pwt_start_bit_offset=0;
124bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         pInfo->h264_pwt_end_byte_offset=0;
125bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         pInfo->h264_pwt_end_bit_offset=0;
126bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         pInfo->h264_pwt_enabled =0;
127bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/// IDR flag
128bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			next_SliceHeader.idr_flag = (pInfo->nal_unit_type == h264_NAL_UNIT_TYPE_IDR);
129bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
130bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
131bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/// Pass slice header
132bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			status = h264_Parse_Slice_Layer_Without_Partitioning_RBSP(parent, pInfo, &next_SliceHeader);
133bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
134bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			pInfo->sei_information.recovery_point = 0;
135bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
136bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if(next_SliceHeader.sh_error & 3) {
137bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->wl_err_curr |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE;
138bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
139bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				// Error type definition, refer to viddec_fw_common_defs.h
140bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//		if error in top field, VIDDEC_FW_WORKLOAD_ERR_TOPFIELD			= (1 << 17)
141bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//		if error in bottom field, VIDDEC_FW_WORKLOAD_ERR_BOTTOMFIELD	   = (1 << 18)
142bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//		if this is frame based, both 2 bits should be set
143bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->wl_err_curr |= (FRAME << FIELD_ERR_OFFSET);
144bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
145bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				break;
146bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
147bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			pInfo->img.current_slice_num++;
148bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
149bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
150bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef DUMP_HEADER_INFO
151bd8388b4555645b3d29abc6a94c303638064d69awonjong.leedump_slice_header(pInfo, &next_SliceHeader);
152bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee////h264_print_decoder_values(pInfo);
153bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
154bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
155bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
156bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			////////////////////////////////////////////////////////////////////////////
157bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			// Step 3: Processing if new picture coming
158bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//  1) if it's the second field
159bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//	2) if it's a new frame
160bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			////////////////////////////////////////////////////////////////////////////
161bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//AssignQuantParam(pInfo);
162bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if(h264_is_new_picture_start(pInfo, next_SliceHeader, pInfo->SliceHeader))
163bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			{
164bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
165bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				///----------------- New Picture.boundary detected--------------------
166bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
167bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->img.g_new_pic++;
168bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
169bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
170bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				// Complete previous picture
171bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				h264_dpb_store_previous_picture_in_dpb(pInfo, 0, 0); //curr old
172bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//h264_hdr_post_poc(0, 0, use_old);
173bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
174bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
175bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				// Update slice structures:
176bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				h264_update_old_slice(pInfo, next_SliceHeader);  	//cur->old; next->cur;
177bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
178bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
179bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				// 1) if resolution change: reset dpb
180bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				// 2) else: init frame store
181bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				h264_update_img_info(pInfo);								//img, dpb
182bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
183bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
184bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				///----------------- New frame.boundary detected--------------------
185bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
186bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->img.second_field = h264_is_second_field(pInfo);
187bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				if(pInfo->img.second_field == 0)
188bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				{
189bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					pInfo->img.g_new_frame = 1;
190bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					h264_dpb_update_queue_dangling_field(pInfo);
191bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
192bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					//
193bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					/// DPB management
194bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					///	1) check the gaps
195bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					///	2) assign fs for non-exist frames
196bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					///	3) fill the gaps
197bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					///	4) store frame into DPB if ...
198bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					//
199bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					//if(pInfo->SliceHeader.redundant_pic_cnt)
200bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					{
201bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee						h264_dpb_gaps_in_frame_num_mem_management(pInfo);
202bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					}
203bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
204bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef DUMP_HEADER_INFO
205bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			dump_new_picture_attr(pInfo, pInfo->SliceHeader.frame_num);
206bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
207bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				}
208bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
209bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				/// Decoding POC
210bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				h264_hdr_decoding_poc (pInfo, 0, 0);
211bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
212bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
213bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				/// Init Frame Store for next frame
214bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				h264_dpb_init_frame_store (pInfo);
215bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->img.current_slice_num = 1;
216bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
217bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				if(pInfo->SliceHeader.first_mb_in_slice != 0)
218bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				{
219bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					////Come here means we have slice lost at the beginning, since no FMO support
220bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					pInfo->SliceHeader.sh_error |= (pInfo->SliceHeader.structure << 17);
221bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				}
222bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
223bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
224bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				/// Emit out the New Frame
225bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            if(pInfo->img.g_new_frame)
226bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            {
227bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee               h264_parse_emit_start_new_frame(parent, pInfo);
228bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            }
229bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
230bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            h264_parse_emit_current_pic(parent, pInfo);
231bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
232bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			else ///////////////////////////////////////////////////// If Not a picture start
233bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			{
234bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
235bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				/// Update slice structures: cur->old; next->cur;
236bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				h264_update_old_slice(pInfo, next_SliceHeader);
237bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
238bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//
239bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				/// 1) if resolution change: reset dpb
240bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				/// 2) else: update img info
241bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				h264_update_img_info(pInfo);
242bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
243bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
244bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
245bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//////////////////////////////////////////////////////////////
246bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			// Step 4: DPB reference list init and reordering
247bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//////////////////////////////////////////////////////////////
248bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
249bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//////////////////////////////////////////////// Update frame Type--- IDR/I/P/B for frame or field
250bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			h264_update_frame_type(pInfo);
251bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
252bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
253bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			h264_dpb_update_ref_lists( pInfo);
254bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
255bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef DUMP_HEADER_INFO
256bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			dump_ref_list(pInfo);
257bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
258bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/// Emit out the current "good" slice
259bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         h264_parse_emit_current_slice(parent, pInfo);
260bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
261bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         }
262bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
263bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
264bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		///// * Main profile doesn't support Data Partition, skipped.... *////
265bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_DPA:
266bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_DPB:
267bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_DPC:
268bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//OS_INFO("***********************DP feature, not supported currently*******************\n");
269bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			pInfo->wl_err_curr |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE;
270bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			status = H264_STATUS_NOTSUPPORT;
271bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
272bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
273bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		//// * Parsing SEI info *////
274bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_SEI:
275bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			status = H264_STATUS_OK;
276bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
277bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//OS_INFO("*****************************SEI**************************************\n");
278bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if(pInfo->sps_valid){
279bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//h264_user_data_t user_data; /// Replace with tmp buffer while porting to FW
280bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->number_of_first_au_info_nal_before_first_slice++;
281bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				/// parsing the SEI info
282bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				status = h264_Parse_Supplemental_Enhancement_Information_Message(parent, pInfo);
283bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
284bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
285bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//h264_rbsp_trailing_bits(pInfo);
286bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
287bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_SPS:
288bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			{
289bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//OS_INFO("*****************************SPS**************************************\n");
290bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			///
291bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/// Can not define local SPS since the Current local stack size limitation!
292bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/// Could be changed after the limitation gone
293bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			///
294bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			uint8_t  old_sps_id=0;
295bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         vui_seq_parameters_t_not_used vui_seq_not_used;
296bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
297bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			old_sps_id = pInfo->active_SPS.seq_parameter_set_id;
298bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			h264_memset(&(pInfo->active_SPS), 0x0, sizeof(seq_param_set_used));
299bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
300bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
301bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			status = h264_Parse_SeqParameterSet(parent, pInfo, &(pInfo->active_SPS), &vui_seq_not_used, (int32_t *)pInfo->TMP_OFFSET_REFFRM_PADDR_GL);
302bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if(status == H264_STATUS_OK) {
303bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				h264_Parse_Copy_Sps_To_DDR(pInfo, &(pInfo->active_SPS), pInfo->active_SPS.seq_parameter_set_id);
304bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee            pInfo->sps_valid = 1;
305bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
306bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				if(1==pInfo->active_SPS.pic_order_cnt_type) {
307bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				  h264_Parse_Copy_Offset_Ref_Frames_To_DDR(pInfo,(int32_t *)pInfo->TMP_OFFSET_REFFRM_PADDR_GL,pInfo->active_SPS.seq_parameter_set_id);
308bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				}
309bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
310bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef DUMP_HEADER_INFO
311bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			dump_sps(&(pInfo->active_SPS));
312bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
313bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
314bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
315bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			///// Restore the active SPS if new arrival's id changed
316bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			if(old_sps_id>=MAX_NUM_SPS) {
317bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			   h264_memset(&(pInfo->active_SPS), 0x0, sizeof(seq_param_set_used));
318bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			   pInfo->active_SPS.seq_parameter_set_id = 0xff;
319bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
320bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			else {
321bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			   if(old_sps_id!=pInfo->active_SPS.seq_parameter_set_id)  {
322bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				  h264_Parse_Copy_Sps_From_DDR(pInfo, &(pInfo->active_SPS), old_sps_id);
323bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			   }
324bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			   else  {
325bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			      //h264_memset(&(pInfo->active_SPS), 0x0, sizeof(seq_param_set));
326bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			      pInfo->active_SPS.seq_parameter_set_id = 0xff;
327bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			   }
328bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
329bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
330bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			pInfo->number_of_first_au_info_nal_before_first_slice++;
331bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
332bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
333bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_PPS:
334bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			{
335bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				//OS_INFO("*****************************PPS**************************************\n");
336bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
337bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				uint32_t old_sps_id = pInfo->active_SPS.seq_parameter_set_id;
338bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				uint32_t old_pps_id = pInfo->active_PPS.pic_parameter_set_id;
339bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
340bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				h264_memset(&pInfo->active_PPS, 0x0, sizeof(pic_param_set));
341bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->number_of_first_au_info_nal_before_first_slice++;
342bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
343bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				if (h264_Parse_PicParameterSet(parent, pInfo, &pInfo->active_PPS)== H264_STATUS_OK)
344bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				{
345bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					h264_Parse_Copy_Sps_From_DDR(pInfo, &(pInfo->active_SPS), pInfo->active_PPS.seq_parameter_set_id);
346bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					if(old_sps_id != pInfo->active_SPS.seq_parameter_set_id)
347bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					{
348bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					   	pInfo->Is_SPS_updated = 1;
349bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					}
350bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					if(pInfo->active_SPS.seq_parameter_set_id != 0xff) {
351bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				   	h264_Parse_Copy_Pps_To_DDR(pInfo, &pInfo->active_PPS, pInfo->active_PPS.pic_parameter_set_id);
352bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee						pInfo->got_start = 1;
353bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee						if(pInfo->sei_information.recovery_point)
354bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee						{
355bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee						   pInfo->img.recovery_point_found |= 2;
356bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
357bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                     //// Enable the RP recovery if no IDR ---Cisco
358bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                     if((pInfo->img.recovery_point_found & 1)==0)
359bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                        pInfo->sei_rp_received = 1;
360bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee						}
361bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					}
362bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					else
363bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					{
364bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					   h264_Parse_Copy_Sps_From_DDR(pInfo, &(pInfo->active_SPS), old_sps_id);
365bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					}
366bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					#ifdef DUMP_HEADER_INFO
367bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					dump_pps(&(pInfo->active_PPS));
368bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					#endif
369bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				} else {
370bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					if(old_sps_id<MAX_NUM_SPS)
371bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee						h264_Parse_Copy_Sps_From_DDR(pInfo, &(pInfo->active_SPS), old_sps_id);
372bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					if(old_pps_id<MAX_NUM_PPS)
373bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee						h264_Parse_Copy_Pps_From_DDR(pInfo, &(pInfo->active_PPS), old_pps_id);
374bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				}
375bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
376bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			} //// End of PPS parsing
377bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
378bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
379bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
380bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_EOSeq:
381bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_EOstream:
382bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
383bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			h264_parse_emit_eos(parent, pInfo);
384bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         h264_init_dpb(&(pInfo->dpb));
385bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
386bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			/* picture level info which will always be initialized */
387bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//h264_init_Info_under_sps_pps_level(pInfo);
388bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
389bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			////reset the pInfo here
390bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//viddec_h264_init(ctxt, (uint32_t *)parser->sps_pps_ddr_paddr, false);
391bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
392bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
393bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			status = H264_STATUS_OK;
394bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			pInfo->number_of_first_au_info_nal_before_first_slice++;
395bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
396bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
397bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_Acc_unit_delimiter:
398bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#if 1
399bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			///// primary_pic_type
400bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			{
401bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				uint32_t code = 0xff;
402bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				int32_t ret = 0;
403bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				ret = viddec_pm_get_bits(parent, (uint32_t *)&(code), 3);
404bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
405bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				if(ret != -1) {
406bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					//if(pInfo->got_start && (code == 0))
407bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					//{
408bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee						//pInfo->img.recovery_point_found |= 4;
409bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					//}
410bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					pInfo->primary_pic_type_plus_one = (uint8_t)(code)+1;
411bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee					status = H264_STATUS_OK;
412bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				}
413bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				pInfo->number_of_first_au_info_nal_before_first_slice++;
414bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee				break;
415bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			}
416bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
417bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
418bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_Reserved1:
419bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_Reserved2:
420bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_Reserved3:
421bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_Reserved4:
422bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_Reserved5:
423bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			status = H264_STATUS_OK;
424bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			pInfo->number_of_first_au_info_nal_before_first_slice++;
425bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
426bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
427bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_filler_data:
428bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			status = H264_STATUS_OK;
429bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
430bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_ACP:
431bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
432bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_SPS_extension:
433bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_unspecified:
434bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		case h264_NAL_UNIT_TYPE_unspecified2:
435bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			status = H264_STATUS_OK;
436bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			//nothing
437bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
438bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		default:
439bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			status = H264_STATUS_OK;
440bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			break;
441bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   }
442bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
443bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   //pInfo->old_nal_unit_type = pInfo->nal_unit_type;
444bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   switch ( pInfo->nal_unit_type )
445bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   {
446bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_IDR:
447bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_SLICE:
448bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_Acc_unit_delimiter:
449bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_SPS:
450bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_PPS:
451bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_SEI:
452bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_EOSeq:
453bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_EOstream:
454bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_Reserved1:
455bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_Reserved2:
456bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_Reserved3:
457bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_Reserved4:
458bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      case h264_NAL_UNIT_TYPE_Reserved5:
459bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      {
460bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         pInfo->old_nal_unit_type = pInfo->nal_unit_type;
461bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         break;
462bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      }
463bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee      default:
464bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee         break;
465bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   }
466bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
467bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return status;
468bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
469bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
470bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
471bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
472bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
473bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */
474bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */
475bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee/* ------------------------------------------------------------------------------------------ */
476bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
477bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic uint32_t viddec_h264_is_frame_start(void *ctxt)
478bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
479bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   struct h264_viddec_parser* parser = ctxt;
480bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	uint32_t ret = 0;
481bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
482bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   h264_Info * pInfo = &(parser->info);
483bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
484bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   if(pInfo->img.g_new_frame) {
485bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	   ret = 1;
486bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   }
487bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
488bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
489bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
490bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
491bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
492bd8388b4555645b3d29abc6a94c303638064d69awonjong.leeuint32_t viddec_h264_wkld_done(void *parent, void *ctxt, unsigned int next_sc,
493bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee                                uint32_t *codec_specific_errors)
494bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
495bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic uint32_t viddec_h264_wkld_done(void *parent, void *ctxt, unsigned int next_sc, uint32_t *codec_specific_errors)
496bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
497bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
498bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   struct h264_viddec_parser* parser = ctxt;
499bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	uint32_t ret = VIDDEC_PARSE_SUCESS;
500bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   h264_Info * pInfo = &(parser->info);
501bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   uint8_t is_stream_forced_to_complete=false;
502bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
503bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   is_stream_forced_to_complete = (VIDDEC_PARSE_EOS == next_sc) || (VIDDEC_PARSE_DISCONTINUITY == next_sc);
504bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
505bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   if(is_stream_forced_to_complete || (pInfo->is_current_workload_done))
506bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   {
507bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		viddec_workload_t 		 *wl;
508bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		viddec_frame_attributes_t *attrs;
509bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
510bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		wl = viddec_pm_get_header( parent );
511bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		attrs = &wl->attrs;
512bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
513bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if((attrs->cont_size.width < 32) || (attrs->cont_size.width > 2048) || (attrs->cont_size.height < 32) || (attrs->cont_size.height>2048))
514bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		{
515bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			attrs->cont_size.width = 32;
516bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			attrs->cont_size.height = 32;
517bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			pInfo->wl_err_curr |= VIDDEC_FW_WORKLOAD_ERR_NOTDECODABLE;
518bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee			pInfo->wl_err_curr |= (FRAME << FIELD_ERR_OFFSET);
519bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
520bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
521bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		*codec_specific_errors = pInfo->wl_err_curr;
522bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		pInfo->wl_err_curr = pInfo->wl_err_next;
523bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		pInfo->wl_err_next = 0;
524bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
525bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		if(is_stream_forced_to_complete)
526bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		{
527bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee          h264_parse_emit_eos(parent, pInfo);
528bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		}
529bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		ret = VIDDEC_PARSE_FRMDONE;
530bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   }
531bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
532bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	return ret;
533bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
534bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
535bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#ifdef VBP
536bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_h264_get_context_size(viddec_parser_memory_sizes_t *size)
537bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#else
538bd8388b4555645b3d29abc6a94c303638064d69awonjong.leestatic void viddec_h264_get_context_size(viddec_parser_memory_sizes_t *size)
539bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee#endif
540bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
541bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   /* Should return size of my structure */
542bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    size->context_size = sizeof(struct h264_viddec_parser);
543bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee    size->persist_size = MAX_NUM_SPS * sizeof(seq_param_set_all)
544bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	 							+ MAX_NUM_PPS * sizeof(pic_param_set)
545bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		                 	+ MAX_NUM_SPS * sizeof(int32_t) * MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE
546bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee		                 	+ sizeof(int32_t) * MAX_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE;
547bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
548bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
549bd8388b4555645b3d29abc6a94c303638064d69awonjong.leevoid viddec_h264_get_ops(viddec_parser_ops_t *ops)
550bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee{
551bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ops->init = viddec_h264_init;
552bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
553bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ops->parse_syntax = viddec_h264_parse;
554bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ops->get_cxt_size = viddec_h264_get_context_size;
555bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ops->is_wkld_done = viddec_h264_wkld_done;
556bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee	ops->is_frame_start = viddec_h264_is_frame_start;
557bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee   return;
558bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee}
559bd8388b4555645b3d29abc6a94c303638064d69awonjong.lee
560