blob: 11e2c7f0fb750ab541cdfb6e9b9710a651ae51ad [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20/*!
21 **************************************************************************
22 * \file ih264d_parse_slice.c
23 *
24 * \brief
25 * Contains routines that decodes a slice NAL unit
26 *
27 * \date
28 * 19/12/2002
29 *
30 * \author AI
31 **************************************************************************
32 */
33#include <string.h>
34#include "ih264_typedefs.h"
35#include "ih264_macros.h"
36#include "ih264_platform_macros.h"
37#include "ithread.h"
38#include "ih264d_structs.h"
39#include "ih264d_debug.h"
40#include "ih264d_bitstrm.h"
41#include "ih264d_parse_mb_header.h"
42#include "ih264d_process_bslice.h"
43#include "ih264d_process_pslice.h"
44#include "ih264d_parse_cavlc.h"
45#include "ih264d_utils.h"
46#include "ih264d_deblocking.h"
47#include "ih264d_defs.h"
48#include "ih264d_error_handler.h"
49#include "ih264d_tables.h"
50#include "ih264d_defs.h"
51#include "ih264d_mem_request.h"
52#include "ih264d_parse_islice.h"
53#include "ih264d_parse_slice.h"
54#include "ih264d_mvpred.h"
55#include "ih264d_mb_utils.h"
56
57#include "ih264d_defs.h"
58#include "ih264d_quant_scaling.h"
59
60#include "ih264d_inter_pred.h"
61
62#include "ih264d_sei.h"
63#include "ih264d.h"
64#include "ih264_error.h"
65#include "ih264_disp_mgr.h"
66#include "ih264_buf_mgr.h"
67
68#include "ih264d_thread_parse_decode.h"
69#include "ih264d_thread_compute_bs.h"
70#include "ih264d_dpb_manager.h"
71#include <assert.h>
72#include "ih264d_parse_islice.h"
73#define RET_LAST_SKIP 0x80000000
74
75/*!
76 **************************************************************************
77 * \if Function name : ih264d_form_pred_weight_matrix \endif
78 *
79 * \brief
80 * Forms pred weight matrix.
81 *
82 * \return
83 * None
84 *
85 **************************************************************************
86 */
87
88void ih264d_form_pred_weight_matrix(dec_struct_t *ps_dec)
89{
90 dec_slice_params_t *ps_cur_slice;
91 UWORD8 uc_num_ref_idx_l0_active, uc_num_ref_idx_l1_active;
92 UWORD8 i, j;
93 UWORD32 *pu4_mat_iwt_ofst;
94 UWORD16 i2_idx;
95 UWORD32 *pui32_weight_offset_l0, *pui32_weight_offset_l1;
96 UWORD32 u4_temp;
97
98 ps_cur_slice = ps_dec->ps_cur_slice;
99 uc_num_ref_idx_l0_active = ps_cur_slice->u1_num_ref_idx_lx_active[0];
100 uc_num_ref_idx_l1_active = ps_cur_slice->u1_num_ref_idx_lx_active[1];
101
102 pu4_mat_iwt_ofst = ps_dec->pu4_wts_ofsts_mat;
103
104 if(ps_cur_slice->u1_slice_type == B_SLICE)
105 {
106 for(i = 0; i < uc_num_ref_idx_l0_active; i++)
107 {
108 pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i];
109 for(j = 0; j < uc_num_ref_idx_l1_active; j++)
110 {
111 pui32_weight_offset_l1 = ps_cur_slice->u4_wt_ofst_lx[1][j];
112 i2_idx = i * uc_num_ref_idx_l0_active + j;
113 i2_idx = X3(i2_idx);
114 /* u4_temp = (pui32_weight_offset_l0[0] | (pui32_weight_offset_l1[0] << 16));
115 pu4_mat_iwt_ofst[0] = u4_temp;
116 u4_temp = (pui32_weight_offset_l0[1] | (pui32_weight_offset_l1[1] << 16));
117 pu4_mat_iwt_ofst[1] = u4_temp;
118 u4_temp = (pui32_weight_offset_l0[2] | (pui32_weight_offset_l1[2] << 16));
119 pu4_mat_iwt_ofst[2] = u4_temp;
120 pu4_mat_iwt_ofst += 3;*/
121 pu4_mat_iwt_ofst[0] = pui32_weight_offset_l0[0];
122 pu4_mat_iwt_ofst[1] = pui32_weight_offset_l1[0];
123 pu4_mat_iwt_ofst[2] = pui32_weight_offset_l0[1];
124 pu4_mat_iwt_ofst[3] = pui32_weight_offset_l1[1];
125 pu4_mat_iwt_ofst[4] = pui32_weight_offset_l0[2];
126 pu4_mat_iwt_ofst[5] = pui32_weight_offset_l1[2];
127 pu4_mat_iwt_ofst += 6;
128 }
129 }
130 }
131 else
132 {
133 for(i = 0; i < uc_num_ref_idx_l0_active; i++)
134 {
135 pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i];
136 i2_idx = X3(i);
137 u4_temp = (UWORD32)pui32_weight_offset_l0[0];
138 pu4_mat_iwt_ofst[0] = u4_temp;
139 u4_temp = (UWORD32)pui32_weight_offset_l0[1];
140 pu4_mat_iwt_ofst[2] = u4_temp;
141 u4_temp = (UWORD32)pui32_weight_offset_l0[2];
142 pu4_mat_iwt_ofst[4] = u4_temp;
143 pu4_mat_iwt_ofst += 6;
144 }
145 }
146}
147
148
149/*!
150 **************************************************************************
151 * \if Function name : init_firstSliceParam \endif
152 *
153 * \brief
154 * Initialize the Parameter required for all the slices for a picture
155 *
156 * \return : Nothing
157 *
158 **************************************************************************
159 */
160
161WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
162 WORD32 i4_poc,
163 pocstruct_t *ps_temp_poc,
164 UWORD16 u2_frame_num,
165 dec_pic_params_t *ps_pps)
166{
167 pocstruct_t *ps_prev_poc = &ps_dec->s_cur_pic_poc;
168 pocstruct_t *ps_cur_poc = ps_temp_poc;
169
170 pic_buffer_t *pic_buf;
171
172 ivd_video_decode_op_t * ps_dec_output =
173 (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
174 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
175 dec_seq_params_t *ps_seq = ps_pps->ps_sps;
176 UWORD8 u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag;
177 UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
178 /* high profile related declarations */
179 high_profile_tools_t s_high_profile;
180 WORD32 ret;
181
182 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
183
184 ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
185 ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
186 ps_prev_poc->i4_delta_pic_order_cnt_bottom =
187 ps_cur_poc->i4_delta_pic_order_cnt_bottom;
188 ps_prev_poc->i4_delta_pic_order_cnt[0] =
189 ps_cur_poc->i4_delta_pic_order_cnt[0];
190 ps_prev_poc->i4_delta_pic_order_cnt[1] =
191 ps_cur_poc->i4_delta_pic_order_cnt[1];
192 ps_prev_poc->u1_bot_field = ps_dec->ps_cur_slice->u1_bottom_field_flag;
193 ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
194 ps_prev_poc->u2_frame_num = u2_frame_num;
195 ps_dec->i1_prev_mb_qp_delta = 0;
196 ps_dec->i1_next_ctxt_idx = 0;
197
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530198
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700199 ps_dec->u4_nmb_deblk = 0;
200 if(ps_dec->u4_num_cores == 1)
201 ps_dec->u4_nmb_deblk = 1;
202
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530203
204
205 if(ps_seq->u1_mb_aff_flag == 1)
206 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700207 ps_dec->u4_nmb_deblk = 0;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530208 if(ps_dec->u4_num_cores > 2)
209 ps_dec->u4_num_cores = 2;
210 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700211
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530212 ps_dec->u4_use_intrapred_line_copy = 0;
213
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700214
215
216 if (ps_seq->u1_mb_aff_flag == 0)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530217 {
218 ps_dec->u4_use_intrapred_line_copy = 1;
219 }
220
221 ps_dec->u4_app_disable_deblk_frm = 0;
222 /* If degrade is enabled, set the degrade flags appropriately */
223 if(ps_dec->i4_degrade_type && ps_dec->i4_degrade_pics)
224 {
225 WORD32 degrade_pic;
226 ps_dec->i4_degrade_pic_cnt++;
227 degrade_pic = 0;
228
229 /* If degrade is to be done in all frames, then do not check further */
230 switch(ps_dec->i4_degrade_pics)
231 {
232 case 4:
233 {
234 degrade_pic = 1;
235 break;
236 }
237 case 3:
238 {
239 if(ps_cur_slice->u1_slice_type != I_SLICE)
240 degrade_pic = 1;
241
242 break;
243 }
244 case 2:
245 {
246
247 /* If pic count hits non-degrade interval or it is an islice, then do not degrade */
248 if((ps_cur_slice->u1_slice_type != I_SLICE)
249 && (ps_dec->i4_degrade_pic_cnt
250 != ps_dec->i4_nondegrade_interval))
251 degrade_pic = 1;
252
253 break;
254 }
255 case 1:
256 {
257 /* Check if the current picture is non-ref */
258 if(0 == ps_cur_slice->u1_nal_ref_idc)
259 {
260 degrade_pic = 1;
261 }
262 break;
263 }
264
265 }
266 if(degrade_pic)
267 {
268 if(ps_dec->i4_degrade_type & 0x2)
269 ps_dec->u4_app_disable_deblk_frm = 1;
270
271 /* MC degrading is done only for non-ref pictures */
272 if(0 == ps_cur_slice->u1_nal_ref_idc)
273 {
274 if(ps_dec->i4_degrade_type & 0x4)
275 ps_dec->i4_mv_frac_mask = 0;
276
277 if(ps_dec->i4_degrade_type & 0x8)
278 ps_dec->i4_mv_frac_mask = 0;
279 }
280 }
281 else
282 ps_dec->i4_degrade_pic_cnt = 0;
283 }
284
285 {
286 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
287 if(ps_dec->u1_sl_typ_5_9
288 && ((ps_cur_slice->u1_slice_type == I_SLICE)
289 || (ps_cur_slice->u1_slice_type
290 == SI_SLICE)))
291 ps_err->u1_cur_pic_type = PIC_TYPE_I;
292 else
293 ps_err->u1_cur_pic_type = PIC_TYPE_UNKNOWN;
294
295 if(ps_err->u1_pic_aud_i == PIC_TYPE_I)
296 {
297 ps_err->u1_cur_pic_type = PIC_TYPE_I;
298 ps_err->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
299 }
300
301 if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)
302 {
303 if(ps_err->u1_err_flag)
304 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
305 ps_err->u1_err_flag = ACCEPT_ALL_PICS;
306 }
307 }
308
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530309 if(ps_dec->u1_init_dec_flag && ps_dec->s_prev_seq_params.u1_eoseq_pending)
310 {
311 /* Reset the decoder picture buffers */
312 WORD32 j;
313 for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
314 {
315
316 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
317 j,
318 BUF_MGR_REF);
319 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
320 ps_dec->au1_pic_buf_id_mv_buf_id_map[j],
321 BUF_MGR_REF);
322 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
323 j,
324 BUF_MGR_IO);
325 }
326
327 /* reset the decoder structure parameters related to buffer handling */
328 ps_dec->u1_second_field = 0;
329 ps_dec->i4_cur_display_seq = 0;
330
331 /********************************************************************/
332 /* indicate in the decoder output i4_status that some frames are being */
333 /* dropped, so that it resets timestamp and wait for a new sequence */
334 /********************************************************************/
335
336 ps_dec->s_prev_seq_params.u1_eoseq_pending = 0;
337 }
338 ret = ih264d_init_pic(ps_dec, u2_frame_num, i4_poc, ps_pps);
339 if(ret != OK)
340 return ret;
341
342 ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data;
343 ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data;
344 ps_dec->ps_nmb_info = ps_dec->ps_frm_mb_info;
345 if(ps_dec->u1_separate_parse)
346 {
347 UWORD16 pic_wd = ps_dec->u4_width_at_init;
348 UWORD16 pic_ht = ps_dec->u4_height_at_init;
349 UWORD32 num_mbs;
350
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700351 if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530352 {
353 pic_wd = ps_dec->u2_pic_wd;
354 pic_ht = ps_dec->u2_pic_ht;
355 }
356 num_mbs = (pic_wd * pic_ht) >> 8;
357
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530358 if(ps_dec->pu1_dec_mb_map)
359 {
360 memset((void *)ps_dec->pu1_dec_mb_map, 0, num_mbs);
361 }
362
363 if(ps_dec->pu1_recon_mb_map)
364 {
365
366 memset((void *)ps_dec->pu1_recon_mb_map, 0, num_mbs);
367 }
368
369 if(ps_dec->pu2_slice_num_map)
370 {
371 memset((void *)ps_dec->pu2_slice_num_map, 0,
372 (num_mbs * sizeof(UWORD16)));
373 }
374
375 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530376
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700377 ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
378 ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
379 ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
Harish Mahendrakar5e4f64c2016-06-01 13:31:45 +0530380 ps_dec->u2_cur_slice_num = 0;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530381
382 /* Initialize all the HP toolsets to zero */
383 ps_dec->s_high_profile.u1_scaling_present = 0;
384 ps_dec->s_high_profile.u1_transform8x8_present = 0;
385
386 /* Get Next Free Picture */
387 if(1 == ps_dec->u4_share_disp_buf)
388 {
389 UWORD32 i;
390 /* Free any buffer that is in the queue to be freed */
391 for(i = 0; i < MAX_DISP_BUFS_NEW; i++)
392 {
393 if(0 == ps_dec->u4_disp_buf_to_be_freed[i])
394 continue;
395 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, i,
396 BUF_MGR_IO);
397 ps_dec->u4_disp_buf_to_be_freed[i] = 0;
398 ps_dec->u4_disp_buf_mapping[i] = 0;
399
400 }
401 }
402 if(!(u1_field_pic_flag && 0 != ps_dec->u1_top_bottom_decoded)) //ps_dec->u1_second_field))
403 {
404 pic_buffer_t *ps_cur_pic;
405 WORD32 cur_pic_buf_id, cur_mv_buf_id;
406 col_mv_buf_t *ps_col_mv;
407 while(1)
408 {
409 ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free(
410 (buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
411 &cur_pic_buf_id);
412 if(ps_cur_pic == NULL)
413 {
414 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
415 return ERROR_UNAVAIL_PICBUF_T;
416 }
417 if(0 == ps_dec->u4_disp_buf_mapping[cur_pic_buf_id])
418 {
419 break;
420 }
421
422 }
423 ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
424 &cur_mv_buf_id);
425 if(ps_col_mv == NULL)
426 {
427 ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
428 return ERROR_UNAVAIL_MVBUF_T;
429 }
430
431 ps_dec->ps_cur_pic = ps_cur_pic;
432 ps_dec->u1_pic_buf_id = cur_pic_buf_id;
433 ps_cur_pic->u4_ts = ps_dec->u4_ts;
434
435
436 ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
437 ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id;
438
439 ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag;
440 ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv;
441 ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
Harish Mahendrakarf6344812016-12-15 18:04:53 +0530442
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700443 {
444 /*make first entry of list0 point to cur pic,so that if first Islice is in error, ref pic struct will have valid entries*/
445 ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
446 *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic;
Harish Mahendrakarbc71ad22016-09-17 17:00:37 +0530447 /* Initialize for field reference as well */
448 *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700449 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530450
451 if(!ps_dec->ps_cur_pic)
452 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530453 WORD32 j;
Martin Storsjo086dd8e2015-06-13 00:35:01 +0300454 H264_DEC_DEBUG_PRINT("------- Display Buffers Reset --------\n");
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530455 for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
456 {
457
458 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
459 j,
460 BUF_MGR_REF);
461 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
462 ps_dec->au1_pic_buf_id_mv_buf_id_map[j],
463 BUF_MGR_REF);
464 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
465 j,
466 BUF_MGR_IO);
467 }
468
469 ps_dec->i4_cur_display_seq = 0;
470 ps_dec->i4_prev_max_display_seq = 0;
471 ps_dec->i4_max_poc = 0;
472
473 ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free(
474 (buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
475 &cur_pic_buf_id);
476 if(ps_cur_pic == NULL)
477 {
478 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
479 return ERROR_UNAVAIL_PICBUF_T;
480 }
481
482 ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
483 &cur_mv_buf_id);
484 if(ps_col_mv == NULL)
485 {
486 ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
487 return ERROR_UNAVAIL_MVBUF_T;
488 }
489
490 ps_dec->ps_cur_pic = ps_cur_pic;
491 ps_dec->u1_pic_buf_id = cur_pic_buf_id;
492 ps_cur_pic->u4_ts = ps_dec->u4_ts;
493 ps_dec->apv_buf_id_pic_buf_map[cur_pic_buf_id] = (void *)ps_cur_pic;
494
495 ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
496 ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id;
497
498 ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag;
499 ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv;
500 ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
501
502 }
503
504 ps_dec->ps_cur_pic->u1_picturetype = u1_field_pic_flag;
505 ps_dec->ps_cur_pic->u4_pack_slc_typ = SKIP_NONE;
506 H264_DEC_DEBUG_PRINT("got a buffer\n");
507 }
508 else
509 {
510 H264_DEC_DEBUG_PRINT("did not get a buffer\n");
511 }
512
513 ps_dec->u4_pic_buf_got = 1;
514
515 ps_dec->ps_cur_pic->i4_poc = i4_poc;
516 ps_dec->ps_cur_pic->i4_frame_num = u2_frame_num;
517 ps_dec->ps_cur_pic->i4_pic_num = u2_frame_num;
518 ps_dec->ps_cur_pic->i4_top_field_order_cnt = ps_pps->i4_top_field_order_cnt;
519 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt =
520 ps_pps->i4_bottom_field_order_cnt;
521 ps_dec->ps_cur_pic->i4_avg_poc = ps_pps->i4_avg_poc;
522 ps_dec->ps_cur_pic->u4_time_stamp = ps_dec->u4_pts;
523
524 ps_dec->s_cur_pic = *(ps_dec->ps_cur_pic);
525 if(u1_field_pic_flag && u1_bottom_field_flag)
526 {
527 WORD32 i4_temp_poc;
528 WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
529 /* Point to odd lines, since it's bottom field */
530 ps_dec->s_cur_pic.pu1_buf1 += ps_dec->s_cur_pic.u2_frm_wd_y;
531 ps_dec->s_cur_pic.pu1_buf2 += ps_dec->s_cur_pic.u2_frm_wd_uv;
532 ps_dec->s_cur_pic.pu1_buf3 += ps_dec->s_cur_pic.u2_frm_wd_uv;
533 ps_dec->s_cur_pic.ps_mv +=
534 ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
535 ps_dec->s_cur_pic.pu1_col_zero_flag += ((ps_dec->u2_pic_ht
536 * ps_dec->u2_pic_wd) >> 5);
537 ps_dec->ps_cur_pic->u1_picturetype |= BOT_FLD;
538 i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
539 i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
540 i4_temp_poc = MIN(i4_top_field_order_poc,
541 i4_bot_field_order_poc);
542 ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
543 }
544
545 ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag
546 && (!u1_field_pic_flag);
547
548 ps_dec->ps_cur_pic->u1_picturetype |= (ps_cur_slice->u1_mbaff_frame_flag
549 << 2);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530550
551 ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row; //[0];
552 ps_dec->ps_cur_mb_row++; //Increment by 1 ,so that left mb will always be valid
553 ps_dec->ps_top_mb_row =
554 ps_dec->ps_nbr_mb_row
555 + ((ps_dec->u2_frm_wd_in_mbs + 1)
556 << (1
557 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag));
558 ps_dec->ps_top_mb_row++; //Increment by 1 ,so that left mb will always be valid
559
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530560 ps_dec->pu1_y = ps_dec->pu1_y_scratch[0];
561 ps_dec->pu1_u = ps_dec->pu1_u_scratch[0];
562 ps_dec->pu1_v = ps_dec->pu1_v_scratch[0];
563 ps_dec->u1_yuv_scratch_idx = 0;
564 /* CHANGED CODE */
565 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
566 ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0];
567 /* CHANGED CODE */
568 ps_dec->u1_mv_top_p = 0;
569 ps_dec->u1_mb_idx = 0;
570 /* CHANGED CODE */
571 ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv;
572 ps_dec->pu1_yleft = 0;
573 ps_dec->pu1_uleft = 0;
574 ps_dec->pu1_vleft = 0;
575 ps_dec->u1_not_wait_rec = 2;
576 ps_dec->u2_total_mbs_coded = 0;
577 ps_dec->i4_submb_ofst = -(SUB_BLK_SIZE);
578 ps_dec->u4_pred_info_idx = 0;
579 ps_dec->u4_pred_info_pkd_idx = 0;
580 ps_dec->u4_dma_buf_idx = 0;
581 ps_dec->ps_mv = ps_dec->s_cur_pic.ps_mv;
582 ps_dec->ps_mv_bank_cur = ps_dec->s_cur_pic.ps_mv;
583 ps_dec->pu1_col_zero_flag = ps_dec->s_cur_pic.pu1_col_zero_flag;
584 ps_dec->ps_part = ps_dec->ps_parse_part_params;
585 ps_dec->i2_prev_slice_mbx = -1;
586 ps_dec->i2_prev_slice_mby = 0;
587 ps_dec->u2_mv_2mb[0] = 0;
588 ps_dec->u2_mv_2mb[1] = 0;
589 ps_dec->u1_last_pic_not_decoded = 0;
590
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530591 ps_dec->u2_cur_slice_num_dec_thread = 0;
592 ps_dec->u2_cur_slice_num_bs = 0;
593 ps_dec->u4_intra_pred_line_ofst = 0;
594 ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line;
595 ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line;
596 ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line;
597
598 ps_dec->pu1_cur_y_intra_pred_line_base = ps_dec->pu1_y_intra_pred_line;
599 ps_dec->pu1_cur_u_intra_pred_line_base = ps_dec->pu1_u_intra_pred_line;
600 ps_dec->pu1_cur_v_intra_pred_line_base = ps_dec->pu1_v_intra_pred_line;
601
602
603
604
605
606 ps_dec->pu1_prev_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line
607 + (ps_dec->u2_frm_wd_in_mbs * MB_SIZE);
608
609 ps_dec->pu1_prev_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line
610 + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE * YUV420SP_FACTOR;
611 ps_dec->pu1_prev_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line
612 + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE;
613
614 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
615 ps_dec->ps_deblk_mbn_curr = ps_dec->ps_deblk_mbn;
616 ps_dec->ps_deblk_mbn_prev = ps_dec->ps_deblk_mbn + ps_dec->u1_recon_mb_grp;
617 /* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag */
618 {
619 if(ps_cur_slice->u1_mbaff_frame_flag)
620 {
621 ps_dec->pf_compute_bs = ih264d_compute_bs_mbaff;
622 ps_dec->pf_mvpred = ih264d_mvpred_mbaff;
623 }
624 else
625 {
626 ps_dec->pf_compute_bs = ih264d_compute_bs_non_mbaff;
627 ps_dec->u1_cur_mb_fld_dec_flag = ps_cur_slice->u1_field_pic_flag;
628 }
629 }
630 /* Set up the Parameter for DMA transfer */
631 {
632 UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
633
634 UWORD8 u1_mbaff = ps_cur_slice->u1_mbaff_frame_flag;
635
636 UWORD8 uc_lastmbs = (((ps_dec->u2_pic_wd) >> 4)
637 % (ps_dec->u1_recon_mb_grp >> u1_mbaff));
638 UWORD16 ui16_lastmbs_widthY =
639 (uc_lastmbs ? (uc_lastmbs << 4) : ((ps_dec->u1_recon_mb_grp
640 >> u1_mbaff) << 4));
641 UWORD16 ui16_lastmbs_widthUV =
642 uc_lastmbs ? (uc_lastmbs << 3) : ((ps_dec->u1_recon_mb_grp
643 >> u1_mbaff) << 3);
644
645 ps_dec->s_tran_addrecon.pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
646 ps_dec->s_tran_addrecon.pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
647 ps_dec->s_tran_addrecon.pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
648
649 ps_dec->s_tran_addrecon.u2_frm_wd_y = ps_dec->u2_frm_wd_y
650 << u1_field_pic_flag;
651 ps_dec->s_tran_addrecon.u2_frm_wd_uv = ps_dec->u2_frm_wd_uv
652 << u1_field_pic_flag;
653
654 if(u1_field_pic_flag)
655 {
656 ui16_lastmbs_widthY += ps_dec->u2_frm_wd_y;
657 ui16_lastmbs_widthUV += ps_dec->u2_frm_wd_uv;
658 }
659
660 /* Normal Increment of Pointer */
661 ps_dec->s_tran_addrecon.u4_inc_y[0] = ((ps_dec->u1_recon_mb_grp << 4)
662 >> u1_mbaff);
663 ps_dec->s_tran_addrecon.u4_inc_uv[0] = ((ps_dec->u1_recon_mb_grp << 4)
664 >> u1_mbaff);
665
666 /* End of Row Increment */
667 ps_dec->s_tran_addrecon.u4_inc_y[1] = (ui16_lastmbs_widthY
668 + (PAD_LEN_Y_H << 1)
669 + ps_dec->s_tran_addrecon.u2_frm_wd_y
670 * ((15 << u1_mbaff) + u1_mbaff));
671 ps_dec->s_tran_addrecon.u4_inc_uv[1] = (ui16_lastmbs_widthUV
672 + (PAD_LEN_UV_H << 2)
673 + ps_dec->s_tran_addrecon.u2_frm_wd_uv
674 * ((15 << u1_mbaff) + u1_mbaff));
675
676 /* Assign picture numbers to each frame/field */
677 /* only once per picture. */
678 ih264d_assign_pic_num(ps_dec);
679 ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (ps_dec->u1_recon_mb_grp
680 << 2) - 1 - (u1_mbaff << 2);
681 ps_dec->s_tran_addrecon.u2_mv_left_inc = ((ps_dec->u1_recon_mb_grp
682 >> u1_mbaff) - 1) << (4 + u1_mbaff);
683 }
684 /**********************************************************************/
685 /* High profile related initialization at pictrue level */
686 /**********************************************************************/
687 if(ps_seq->u1_profile_idc == HIGH_PROFILE_IDC)
688 {
689 if((ps_seq->i4_seq_scaling_matrix_present_flag)
690 || (ps_pps->i4_pic_scaling_matrix_present_flag))
691 {
692 ih264d_form_scaling_matrix_picture(ps_seq, ps_pps, ps_dec);
693 ps_dec->s_high_profile.u1_scaling_present = 1;
694 }
695 else
696 {
697 ih264d_form_default_scaling_matrix(ps_dec);
698 }
699
700 if(ps_pps->i4_transform_8x8_mode_flag)
701 {
702 ps_dec->s_high_profile.u1_transform8x8_present = 1;
703 }
704 }
705 else
706 {
707 ih264d_form_default_scaling_matrix(ps_dec);
708 }
709
710 /* required while reading the transform_size_8x8 u4_flag */
711 ps_dec->s_high_profile.u1_direct_8x8_inference_flag =
712 ps_seq->u1_direct_8x8_inference_flag;
713 ps_dec->s_high_profile.s_cavlc_ctxt = ps_dec->s_cavlc_ctxt;
714
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700715 ps_dec->i1_recon_in_thread3_flag = 1;
716 ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_addrecon;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530717 if(ps_dec->u1_separate_parse)
718 {
719 memcpy(&ps_dec->s_tran_addrecon_parse, &ps_dec->s_tran_addrecon,
720 sizeof(tfr_ctxt_t));
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700721 if(ps_dec->u4_num_cores >= 3 && ps_dec->i1_recon_in_thread3_flag)
722 {
723 memcpy(&ps_dec->s_tran_iprecon, &ps_dec->s_tran_addrecon,
724 sizeof(tfr_ctxt_t));
725 ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_iprecon;
726 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530727 }
728
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700729
730 ih264d_init_deblk_tfr_ctxt(ps_dec,&(ps_dec->s_pad_mgr), &(ps_dec->s_tran_addrecon),
731 ps_dec->u2_frm_wd_in_mbs, 0);
732
733 ps_dec->ps_cur_deblk_mb = ps_dec->ps_deblk_pic;
734 ps_dec->u4_cur_deblk_mb_num = 0;
735
736 ps_dec->u4_deblk_mb_x = 0;
737 ps_dec->u4_deblk_mb_y = 0;
Harish Mahendrakar33db7a02016-04-20 16:13:52 +0530738 ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700739
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530740 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
741 return OK;
742}
743
744/*!
745 **************************************************************************
746 * \if Function name : ih264d_deblock_display \endif
747 *
748 * \brief : The function callls the deblocking routine and manages
749 : the Recon buffers and displays .
750 * \return : Nothing
751 *
752 **************************************************************************
753 */
754WORD32 ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec)
755{
756 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
757 UWORD8 u1_num_of_users = 0;
758 WORD32 ret;
759
760 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
761 if(1)
762 {
763
764 {
765 ih264d_delete_nonref_nondisplay_pics(ps_dec->ps_dpb_mgr);
766 if(ps_cur_slice->u1_mmco_equalto5
767 || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
768 {
769 ps_dec->ps_cur_pic->i4_poc = 0;
770 if(ps_dec->u2_total_mbs_coded
771 == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1))
772 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
773 ih264d_release_display_bufs(ps_dec);
774 }
775 if(ps_dec->u4_num_reorder_frames_at_init != 0)
776 {
777 ret = ih264d_assign_display_seq(ps_dec);
778 if(ret != OK)
779 return ret;
780 }
781 }
782
783 if(ps_cur_slice->u1_nal_ref_idc)
784 {
785 /* Mark pic buf as needed for reference */
786 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
787 ps_dec->u1_pic_buf_id,
788 BUF_MGR_REF);
789 /* Mark mv buf as needed for reference */
790 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
791 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
792 BUF_MGR_REF);
793 ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 1;
794 }
795
796 /* 420 consumer */
797 /* Increment the number of users by 1 for display based upon */
798 /*the SEEK KEY FRAME control sent to decoder */
799 if(((0 == ps_dec->u1_last_pic_not_decoded)
800 && (0
801 == (ps_dec->ps_cur_pic->u4_pack_slc_typ
802 & ps_dec->u4_skip_frm_mask)))
803 || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
804 {
805 /* Mark pic buf as needed for display */
806 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
807 ps_dec->u1_pic_buf_id,
808 BUF_MGR_IO);
809
810 }
811
812 if(!ps_cur_slice->u1_field_pic_flag
813 || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
814 != ps_dec->u1_top_bottom_decoded))
815 {
816 pic_buffer_t *ps_cur_pic = ps_dec->ps_cur_pic;
817 ps_cur_pic->u2_disp_width = ps_dec->u2_disp_width;
818 ps_cur_pic->u2_disp_height = ps_dec->u2_disp_height >> 1;
819
820 ps_cur_pic->u2_crop_offset_y = ps_dec->u2_crop_offset_y;
821 ps_cur_pic->u2_crop_offset_uv = ps_dec->u2_crop_offset_uv;
822 ps_cur_pic->u1_pic_type = 0;
823
824 ret = ih264d_insert_pic_in_display_list(
825 ps_dec->ps_dpb_mgr,
826 ps_dec->u1_pic_buf_id,
827 ps_dec->i4_prev_max_display_seq
828 + ps_dec->ps_cur_pic->i4_poc,
829 ps_dec->ps_cur_pic->i4_frame_num);
830 if(ret != OK)
831 return ret;
832
833 {
834 ivd_video_decode_op_t * ps_dec_output =
835 (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
836
837 ps_dec_output->u4_frame_decoded_flag = 1;
838 }
839 if(ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] == 0)
840 {
841 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
842 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
843 BUF_MGR_REF);
844 ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 0;
845
846 }
847 }
848 else
849 {
850 H264_DEC_DEBUG_PRINT("pic not inserted display %d %d\n",
851 ps_cur_slice->u1_field_pic_flag,
852 ps_dec->u1_second_field);
853 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530854
855 if(!ps_cur_slice->u1_field_pic_flag
856 || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
857 == ps_dec->u1_top_bottom_decoded))
858 {
859 if(ps_dec->u4_num_reorder_frames_at_init == 0)
860 {
861 ret = ih264d_assign_display_seq(ps_dec);
862 if(ret != OK)
863 return ret;
864 }
865 }
866 }
867
868 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
869
870 return OK;
871}
872
873void ih264d_err_pic_dispbuf_mgr(dec_struct_t *ps_dec)
874{
875 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
876 ivd_video_decode_op_t * ps_dec_output =
877 (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
878
879 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
880 ps_dec->u1_pic_buf_id,
881 BUF_MGR_REF);
882 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
883 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
884 BUF_MGR_REF);
885 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
886 ps_dec->u1_pic_buf_id,
887 BUF_MGR_IO);
888}
889
890void ih264d_deblock_picture(void *ptr)
891{
892 dec_struct_t *ps_dec = (dec_struct_t *)ptr;
893
894 {
895 /*Deblock picture only if all the mb's in the frame have been decoded*/
896 if(ps_dec->u1_pic_decode_done == 1)
897 {
898 if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag
899 || ps_dec->ps_cur_slice->u1_field_pic_flag)
900 {
901 ps_dec->p_DeblockPicture[ps_dec->ps_cur_slice->u1_mbaff_frame_flag](
902 ps_dec);
903 }
904 else
905
906 {
907
908 ih264d_deblock_picture_progressive(ps_dec);
909 }
910
911 }
912 }
913
914}
915
916/*!
917 **************************************************************************
918 * \if Function name : ih264d_deblock_display \endif
919 *
920 * \brief : The function callls the deblocking routine and manages
921 : the Recon buffers and displays .
922 * \return : Nothing
923 *
924 **************************************************************************
925 */
926WORD32 ih264d_deblock_display(dec_struct_t *ps_dec)
927{
928 WORD32 ret;
929 /* Call deblocking */
930 ih264d_deblock_picture(ps_dec);
931
932 ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
933 if(ret != OK)
934 return ret;
935
936 return OK;
937}
938
939/*
940 *!
941 **************************************************************************
942 * \if Function name : EndofPoc \endif
943 *
944 * \brief
945 * EndofPoc Processing
946 *
947 * \return
948 * 0 on Success and Error code otherwise
949 **************************************************************************
950 */
951
952WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec,
953 UWORD8 u1_is_idr_slice,
954 UWORD16 u2_frame_num)
955{
956 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
957 WORD32 ret;
958
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530959 ps_dec->u2_mbx = 0xffff;
960 ps_dec->u2_mby = 0;
961 {
962 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
963 if(ps_err->u1_err_flag & REJECT_CUR_PIC)
964 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530965 ih264d_err_pic_dispbuf_mgr(ps_dec);
Hamsalekha S9f0dcba2015-06-09 15:54:31 +0530966 return ERROR_NEW_FRAME_EXPECTED;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530967 }
968 }
969
970 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
971 ret = ih264d_end_of_pic_processing(ps_dec);
972 if(ret != OK)
973 return ret;
974 ps_dec->u2_total_mbs_coded = 0;
975 /*--------------------------------------------------------------------*/
976 /* ih264d_decode_pic_order_cnt - calculate the Pic Order Cnt */
977 /* Needed to detect end of picture */
978 /*--------------------------------------------------------------------*/
979 {
980 pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
981 pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
982 if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
983 ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
984
985 if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5)
986 ps_dec->u2_prev_ref_frame_num = 0;
987
988 if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag)
989 {
990 ret = ih264d_decode_gaps_in_frame_num(ps_dec, u2_frame_num);
991 if(ret != OK)
992 return ret;
993 }
994
995 ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
996 ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
997 ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
998 if(ps_cur_slice->u1_nal_ref_idc)
999 {
1000 ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
1001 ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
1002 ps_prev_poc->i4_delta_pic_order_cnt_bottom =
1003 ps_cur_poc->i4_delta_pic_order_cnt_bottom;
1004 ps_prev_poc->i4_delta_pic_order_cnt[0] =
1005 ps_cur_poc->i4_delta_pic_order_cnt[0];
1006 ps_prev_poc->i4_delta_pic_order_cnt[1] =
1007 ps_cur_poc->i4_delta_pic_order_cnt[1];
1008 ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
1009 }
1010 }
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301011
1012 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301013
1014 return OK;
1015}
1016
1017/*!
1018 **************************************************************************
1019 * \if Function name : DecodeSlice \endif
1020 *
1021 * \brief
1022 * Parses a slice
1023 *
1024 * \return
1025 * 0 on Success and Error code otherwise
1026 **************************************************************************
1027 */
1028
1029WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,
1030 UWORD8 u1_nal_ref_idc,
1031 dec_struct_t *ps_dec /* Decoder parameters */
1032 )
1033{
1034 dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
1035 dec_pic_params_t *ps_pps;
1036 dec_seq_params_t *ps_seq;
1037 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
1038 pocstruct_t s_tmp_poc;
1039 WORD32 i_delta_poc[2];
1040 WORD32 i4_poc = 0;
1041 UWORD16 u2_first_mb_in_slice, u2_frame_num;
1042 UWORD8 u1_field_pic_flag, u1_redundant_pic_cnt = 0, u1_slice_type;
1043 UWORD32 u4_idr_pic_id = 0;
1044 UWORD8 u1_bottom_field_flag, u1_pic_order_cnt_type;
1045
1046 UWORD8 u1_nal_unit_type;
1047 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1048 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1049 WORD8 i1_is_end_of_poc;
1050
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001051 WORD32 ret, end_of_frame;
1052 WORD32 prev_slice_err, num_mb_skipped;
1053 UWORD8 u1_mbaff;
1054 pocstruct_t *ps_cur_poc;
1055
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301056 UWORD32 u4_temp;
1057 WORD32 i_temp;
1058 UWORD32 u4_call_end_of_pic = 0;
1059
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301060 /* read FirstMbInSlice and slice type*/
1061 ps_dec->ps_dpb_cmds->u1_dpb_commands_read_slc = 0;
1062 u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst,
1063 pu4_bitstrm_buf);
1064 if(u2_first_mb_in_slice
1065 > (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs))
1066 {
1067
1068 return ERROR_CORRUPTED_SLICE;
1069 }
1070
1071 /*we currently don not support ASO*/
1072 if(((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag)
Harish Mahendrakaref274332017-01-16 17:10:07 +05301073 <= ps_dec->u2_cur_mb_addr) && (ps_dec->u4_first_slice_in_pic == 0))
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301074 {
1075 return ERROR_CORRUPTED_SLICE;
1076 }
1077
1078 COPYTHECONTEXT("SH: first_mb_in_slice",u2_first_mb_in_slice);
1079
1080 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1081
1082 if(u4_temp > 9)
1083 return ERROR_INV_SLC_TYPE_T;
1084
1085 u1_slice_type = u4_temp;
1086 COPYTHECONTEXT("SH: slice_type",(u1_slice_type));
1087 ps_dec->u1_sl_typ_5_9 = 0;
1088 /* Find Out the Slice Type is 5 to 9 or not then Set the Flag */
1089 /* u1_sl_typ_5_9 = 1 .Which tells that all the slices in the Pic*/
1090 /* will be of same type of current */
1091 if(u1_slice_type > 4)
1092 {
1093 u1_slice_type -= 5;
1094 ps_dec->u1_sl_typ_5_9 = 1;
1095 }
1096
1097 {
1098 UWORD32 skip;
1099
1100 if((ps_dec->i4_app_skip_mode == IVD_SKIP_PB)
1101 || (ps_dec->i4_dec_skip_mode == IVD_SKIP_PB))
1102 {
1103 UWORD32 u4_bit_stream_offset = 0;
1104
1105 if(ps_dec->u1_nal_unit_type == IDR_SLICE_NAL)
1106 {
1107 skip = 0;
1108
1109 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE;
1110 }
1111 else if((I_SLICE == u1_slice_type)
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001112 && (1 >= ps_dec->ps_cur_sps->u1_num_ref_frames))
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301113 {
1114 skip = 0;
1115
1116 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE;
1117 }
1118 else
1119 {
1120 skip = 1;
1121 }
1122
1123 /* If one frame worth of data is already skipped, do not skip the next one */
1124 if((0 == u2_first_mb_in_slice) && (1 == ps_dec->u4_prev_nal_skipped))
1125 {
1126 skip = 0;
1127 }
1128
1129 if(skip)
1130 {
1131 ps_dec->u4_prev_nal_skipped = 1;
1132 ps_dec->i4_dec_skip_mode = IVD_SKIP_PB;
1133 return 0;
1134 }
1135 else
1136 {
1137 /* If the previous NAL was skipped, then
1138 do not process that buffer in this call.
1139 Return to app and process it in the next call.
1140 This is necessary to handle cases where I/IDR is not complete in
1141 the current buffer and application intends to fill the remaining part of the bitstream
1142 later. This ensures we process only frame worth of data in every call */
1143 if(1 == ps_dec->u4_prev_nal_skipped)
1144 {
1145 ps_dec->u4_return_to_app = 1;
1146 return 0;
1147 }
1148 }
1149 }
1150
1151 }
1152
1153 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1154 if(u4_temp & MASK_ERR_PIC_SET_ID)
1155 return ERROR_INV_SPS_PPS_T;
1156 /* discard slice if pic param is invalid */
1157 COPYTHECONTEXT("SH: pic_parameter_set_id", u4_temp);
1158 ps_pps = &ps_dec->ps_pps[u4_temp];
1159 if(FALSE == ps_pps->u1_is_valid)
1160 {
1161 return ERROR_INV_SPS_PPS_T;
1162 }
1163 ps_seq = ps_pps->ps_sps;
1164 if(!ps_seq)
1165 return ERROR_INV_SPS_PPS_T;
1166 if(FALSE == ps_seq->u1_is_valid)
1167 return ERROR_INV_SPS_PPS_T;
1168
1169 /* Get the frame num */
1170 u2_frame_num = ih264d_get_bits_h264(ps_bitstrm,
1171 ps_seq->u1_bits_in_frm_num);
1172// H264_DEC_DEBUG_PRINT("FRAME %d First MB in slice: %d\n", u2_frame_num, u2_first_mb_in_slice);
1173
1174 COPYTHECONTEXT("SH: frame_num", u2_frame_num);
1175// H264_DEC_DEBUG_PRINT("Second field: %d frame num: %d prv_frame_num: %d \n", ps_dec->u1_second_field, u2_frame_num, ps_dec->u2_prv_frame_num);
1176
1177 /* Get the field related flags */
1178 if(!ps_seq->u1_frame_mbs_only_flag)
1179 {
1180
1181 u1_field_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
1182 COPYTHECONTEXT("SH: field_pic_flag", u1_field_pic_flag);
1183 u1_bottom_field_flag = 0;
1184
1185 if(u1_field_pic_flag)
1186 {
1187 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
1188 u1_bottom_field_flag = ih264d_get_bit_h264(ps_bitstrm);
1189 COPYTHECONTEXT("SH: bottom_field_flag", u1_bottom_field_flag);
1190
1191 }
1192 else
1193 {
1194 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
1195 }
1196 }
1197 else
1198 {
1199 u1_field_pic_flag = 0;
1200 u1_bottom_field_flag = 0;
1201
1202 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
1203 }
1204
1205 u1_nal_unit_type = SLICE_NAL;
1206 if(u1_is_idr_slice)
1207 {
1208 if(0 == u1_field_pic_flag)
1209 {
1210 ps_dec->u1_top_bottom_decoded = TOP_FIELD_ONLY | BOT_FIELD_ONLY;
1211 }
1212 u1_nal_unit_type = IDR_SLICE_NAL;
1213 u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst,
1214 pu4_bitstrm_buf);
1215 if(u4_idr_pic_id > 65535)
1216 return ERROR_INV_SPS_PPS_T;
1217 COPYTHECONTEXT("SH: ", u4_idr_pic_id);
1218 }
1219
1220 /* read delta pic order count information*/
1221 i_delta_poc[0] = i_delta_poc[1] = 0;
1222 s_tmp_poc.i4_pic_order_cnt_lsb = 0;
1223 s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
1224 u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type;
1225 if(u1_pic_order_cnt_type == 0)
1226 {
1227 i_temp = ih264d_get_bits_h264(
1228 ps_bitstrm,
1229 ps_seq->u1_log2_max_pic_order_cnt_lsb_minus);
1230 if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb)
1231 return ERROR_INV_SPS_PPS_T;
1232 s_tmp_poc.i4_pic_order_cnt_lsb = i_temp;
1233 COPYTHECONTEXT("SH: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb);
1234
1235 if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag))
1236 {
1237 s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev(
1238 pu4_bitstrm_ofst, pu4_bitstrm_buf);
1239 //if(s_tmp_poc.i4_delta_pic_order_cnt_bottom > ps_seq->i4_max_pic_order_cntLsb)
1240 COPYTHECONTEXT("SH: delta_pic_order_cnt_bottom",
1241 s_tmp_poc.i4_delta_pic_order_cnt_bottom);
1242 }
1243 }
1244
1245 s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
1246 s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
1247 if(u1_pic_order_cnt_type == 1
1248 && (!ps_seq->u1_delta_pic_order_always_zero_flag))
1249 {
1250 s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst,
1251 pu4_bitstrm_buf);
1252 COPYTHECONTEXT("SH: delta_pic_order_cnt[0]",
1253 s_tmp_poc.i4_delta_pic_order_cnt[0]);
1254
1255 if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag)
1256 {
1257 s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev(
1258 pu4_bitstrm_ofst, pu4_bitstrm_buf);
1259 COPYTHECONTEXT("SH: delta_pic_order_cnt[1]",
1260 s_tmp_poc.i4_delta_pic_order_cnt[1]);
1261 }
1262 }
1263
1264 if(ps_pps->u1_redundant_pic_cnt_present_flag)
1265 {
1266 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1267 if(u4_temp > MAX_REDUNDANT_PIC_CNT)
1268 return ERROR_INV_SPS_PPS_T;
1269 u1_redundant_pic_cnt = u4_temp;
1270 COPYTHECONTEXT("SH: redundant_pic_cnt", u1_redundant_pic_cnt);
1271 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001272
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301273 /*--------------------------------------------------------------------*/
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001274 /* Check if the slice is part of new picture */
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301275 /*--------------------------------------------------------------------*/
1276 i1_is_end_of_poc = 0;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001277 if(!ps_dec->u1_first_slice_in_stream)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301278 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301279 i1_is_end_of_poc = ih264d_is_end_of_pic(u2_frame_num, u1_nal_ref_idc,
1280 &s_tmp_poc, &ps_dec->s_cur_pic_poc,
1281 ps_cur_slice, u1_pic_order_cnt_type,
1282 u1_nal_unit_type, u4_idr_pic_id,
1283 u1_field_pic_flag,
1284 u1_bottom_field_flag);
1285
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301286 /* since we support only Full frame decode, every new process should
1287 * process a new pic
1288 */
1289 if((ps_dec->u4_first_slice_in_pic == 2) && (i1_is_end_of_poc == 0))
1290 {
1291 /* if it is the first slice is process call ,it should be a new frame. If it is not
1292 * reject current pic and dont add it to dpb
1293 */
1294 ps_dec->ps_dec_err_status->u1_err_flag |= REJECT_CUR_PIC;
1295 i1_is_end_of_poc = 1;
1296 }
1297 else
1298 {
1299 /* reset REJECT_CUR_PIC */
1300 ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC;
1301 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001302 }
1303
1304 /*--------------------------------------------------------------------*/
1305 /* Check for error in slice and parse the missing/corrupted MB's */
1306 /* as skip-MB's in an inserted P-slice */
1307 /*--------------------------------------------------------------------*/
1308 u1_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
1309 prev_slice_err = 0;
1310
1311 if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream)
1312 {
1313 if(u2_frame_num != ps_dec->u2_prv_frame_num
1314 && ps_dec->u1_top_bottom_decoded != 0
1315 && ps_dec->u1_top_bottom_decoded
1316 != (TOP_FIELD_ONLY | BOT_FIELD_ONLY))
1317 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301318 ps_dec->u1_dangling_field = 1;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001319 if(ps_dec->u4_first_slice_in_pic)
1320 {
1321 // first slice - dangling field
1322 prev_slice_err = 1;
1323 }
1324 else
1325 {
1326 // last slice - dangling field
1327 prev_slice_err = 2;
1328 }
1329
1330 if(ps_dec->u1_top_bottom_decoded ==TOP_FIELD_ONLY)
1331 ps_cur_slice->u1_bottom_field_flag = 1;
1332 else
1333 ps_cur_slice->u1_bottom_field_flag = 0;
1334
1335 num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1336 - ps_dec->u2_total_mbs_coded;
1337 ps_cur_poc = &ps_dec->s_cur_pic_poc;
1338
1339 u1_is_idr_slice = ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL;
1340 }
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301341 else if(ps_dec->u4_first_slice_in_pic == 2)
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001342 {
1343 if(u2_first_mb_in_slice > 0)
1344 {
1345 // first slice - missing/header corruption
1346 prev_slice_err = 1;
1347 num_mb_skipped = u2_first_mb_in_slice << u1_mbaff;
1348 ps_cur_poc = &s_tmp_poc;
1349
1350 // initializing slice parameters
1351 ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1352 ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1353 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1354 ps_cur_slice->i4_pic_order_cnt_lsb =
1355 s_tmp_poc.i4_pic_order_cnt_lsb;
1356 ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1357 ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1358 ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1359 ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
Harish Mahendrakar1d5640f2016-12-15 18:04:53 +05301360 ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag
1361 && (!u1_field_pic_flag);
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001362 }
1363 }
1364 else
1365 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301366
1367 if(ps_dec->u4_first_slice_in_pic)
1368 {
1369 /* if valid slice header is not decoded do start of pic processing
1370 * since in the current process call, frame num is not updated in the slice structure yet
1371 * ih264d_is_end_of_pic is checked with valid frame num of previous process call,
1372 * although i1_is_end_of_poc is set there could be more slices in the frame,
1373 * so conceal only till cur slice */
1374 prev_slice_err = 1;
1375 num_mb_skipped = u2_first_mb_in_slice << u1_mbaff;
1376 }
1377 else
1378 {
1379 /* since i1_is_end_of_poc is set ,means new frame num is encountered. so conceal the current frame
1380 * completely */
1381 prev_slice_err = 2;
1382 num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1383 - ps_dec->u2_total_mbs_coded;
1384 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001385 ps_cur_poc = &s_tmp_poc;
1386 }
1387 }
1388 else
1389 {
1390 if((u2_first_mb_in_slice << u1_mbaff) > ps_dec->u2_total_mbs_coded)
1391 {
1392 // previous slice - missing/corruption
1393 prev_slice_err = 2;
1394 num_mb_skipped = (u2_first_mb_in_slice << u1_mbaff)
1395 - ps_dec->u2_total_mbs_coded;
1396 ps_cur_poc = &s_tmp_poc;
1397 }
1398 else if((u2_first_mb_in_slice << u1_mbaff) < ps_dec->u2_total_mbs_coded)
1399 {
1400 return ERROR_CORRUPTED_SLICE;
1401 }
1402 }
1403
1404 if(prev_slice_err)
1405 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301406 ret = ih264d_mark_err_slice_skip(ps_dec, num_mb_skipped, u1_is_idr_slice, u2_frame_num, ps_cur_poc, prev_slice_err);
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001407
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301408 if(ps_dec->u1_dangling_field == 1)
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001409 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301410 ps_dec->u1_second_field = 1 - ps_dec->u1_second_field;
1411 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1412 ps_dec->u2_prv_frame_num = u2_frame_num;
1413 ps_dec->u1_first_slice_in_stream = 0;
1414 return ERROR_DANGLING_FIELD_IN_PIC;
1415 }
1416
1417 if(prev_slice_err == 2)
1418 {
1419 ps_dec->u1_first_slice_in_stream = 0;
1420 return ERROR_INCOMPLETE_FRAME;
1421 }
1422
1423 if(ps_dec->u2_total_mbs_coded
1424 >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1425 {
1426 /* return if all MBs in frame are parsed*/
1427 ps_dec->u1_first_slice_in_stream = 0;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001428 return ERROR_IN_LAST_SLICE_OF_PIC;
1429 }
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301430
1431 if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
1432 {
1433 ih264d_err_pic_dispbuf_mgr(ps_dec);
1434 return ERROR_NEW_FRAME_EXPECTED;
1435 }
1436
1437 if(ret != OK)
1438 return ret;
1439
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001440 i1_is_end_of_poc = 0;
1441 }
1442
1443 if (ps_dec->u4_first_slice_in_pic == 0)
Harish Mahendrakar5e4f64c2016-06-01 13:31:45 +05301444 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001445 ps_dec->ps_parse_cur_slice++;
Harish Mahendrakar5e4f64c2016-06-01 13:31:45 +05301446 ps_dec->u2_cur_slice_num++;
1447 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001448
Harish Mahendrakarbc71ad22016-09-17 17:00:37 +05301449 // in the case of single core increment ps_decode_cur_slice
1450 if((ps_dec->u1_separate_parse == 0) && (ps_dec->u4_first_slice_in_pic == 0))
1451 {
1452 ps_dec->ps_decode_cur_slice++;
1453 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001454 ps_dec->u1_slice_header_done = 0;
1455
1456 /*--------------------------------------------------------------------*/
1457 /* If the slice is part of new picture, do End of Pic processing. */
1458 /*--------------------------------------------------------------------*/
1459 if(!ps_dec->u1_first_slice_in_stream)
1460 {
1461 UWORD8 uc_mbs_exceed = 0;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301462
1463 if(ps_dec->u2_total_mbs_coded
1464 == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1))
1465 {
1466 /*u2_total_mbs_coded is forced to u2_max_mb_addr+ 1 at the end of decode ,so
1467 ,if it is first slice in pic dont consider u2_total_mbs_coded to detect new picture */
1468 if(ps_dec->u4_first_slice_in_pic == 0)
1469 uc_mbs_exceed = 1;
1470 }
1471
1472 if(i1_is_end_of_poc || uc_mbs_exceed)
1473 {
1474
1475 if(1 == ps_dec->u1_last_pic_not_decoded)
1476 {
1477 ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
1478
1479 if(ret != OK)
1480 return ret;
1481
1482 ret = ih264d_end_of_pic(ps_dec, u1_is_idr_slice, u2_frame_num);
1483 if(ret != OK)
1484 return ret;
1485#if WIN32
1486 H264_DEC_DEBUG_PRINT(" ------ PIC SKIPPED ------\n");
1487#endif
1488 return RET_LAST_SKIP;
1489 }
1490 else
1491 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301492 ret = ih264d_end_of_pic(ps_dec, u1_is_idr_slice, u2_frame_num);
1493 if(ret != OK)
1494 return ret;
1495 }
1496
1497 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301498 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001499
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301500 if(u1_field_pic_flag)
1501 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301502 ps_dec->u2_prv_frame_num = u2_frame_num;
1503 }
1504
1505 if(ps_cur_slice->u1_mmco_equalto5)
1506 {
1507 WORD32 i4_temp_poc;
1508 WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
1509
1510 if(!ps_cur_slice->u1_field_pic_flag) // or a complementary field pair
1511 {
1512 i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1513 i4_bot_field_order_poc =
1514 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1515 i4_temp_poc = MIN(i4_top_field_order_poc,
1516 i4_bot_field_order_poc);
1517 }
1518 else if(!ps_cur_slice->u1_bottom_field_flag)
1519 i4_temp_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1520 else
1521 i4_temp_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1522
1523 ps_dec->ps_cur_pic->i4_top_field_order_cnt = i4_temp_poc
1524 - ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1525 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = i4_temp_poc
1526 - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1527 ps_dec->ps_cur_pic->i4_poc = i4_temp_poc;
1528 ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
1529 }
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301530 if(ps_dec->u4_first_slice_in_pic == 2)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301531 {
1532 ret = ih264d_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num,
1533 &ps_dec->s_prev_pic_poc,
1534 &s_tmp_poc, ps_cur_slice, ps_pps,
1535 u1_nal_ref_idc,
1536 u1_bottom_field_flag,
1537 u1_field_pic_flag, &i4_poc);
1538 if(ret != OK)
1539 return ret;
1540 /* Display seq no calculations */
1541 if(i4_poc >= ps_dec->i4_max_poc)
1542 ps_dec->i4_max_poc = i4_poc;
1543 /* IDR Picture or POC wrap around */
1544 if(i4_poc == 0)
1545 {
1546 ps_dec->i4_prev_max_display_seq = ps_dec->i4_prev_max_display_seq
1547 + ps_dec->i4_max_poc
1548 + ps_dec->u1_max_dec_frame_buffering + 1;
1549 ps_dec->i4_max_poc = 0;
1550 }
1551 }
1552
1553 /*--------------------------------------------------------------------*/
1554 /* Copy the values read from the bitstream to the slice header and then*/
1555 /* If the slice is first slice in picture, then do Start of Picture */
1556 /* processing. */
1557 /*--------------------------------------------------------------------*/
1558 ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0];
1559 ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1];
1560 ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1561 ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice;
1562 ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1563 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1564 ps_cur_slice->u1_slice_type = u1_slice_type;
1565 ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
1566
1567 ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1568 ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1569 ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1570 ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
1571
1572 if(ps_seq->u1_frame_mbs_only_flag)
1573 ps_cur_slice->u1_direct_8x8_inference_flag =
1574 ps_seq->u1_direct_8x8_inference_flag;
1575 else
1576 ps_cur_slice->u1_direct_8x8_inference_flag = 1;
1577
1578 if(u1_slice_type == B_SLICE)
1579 {
1580 ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(
1581 ps_bitstrm);
1582 COPYTHECONTEXT("SH: direct_spatial_mv_pred_flag",
1583 ps_cur_slice->u1_direct_spatial_mv_pred_flag);
1584
1585 if(ps_cur_slice->u1_direct_spatial_mv_pred_flag)
1586 ps_cur_slice->pf_decodeDirect = ih264d_decode_spatial_direct;
1587 else
1588 ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct;
1589 if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag)))
1590 ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB;
1591 }
1592 else
1593 {
1594 if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag)))
1595 ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
1596 }
1597
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301598 if(ps_dec->u4_first_slice_in_pic == 2)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301599 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301600 if(u2_first_mb_in_slice == 0)
1601 {
1602 ret = ih264d_start_of_pic(ps_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps);
1603 if(ret != OK)
1604 return ret;
1605 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301606
1607 ps_dec->u4_output_present = 0;
1608
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301609 {
1610 ih264d_get_next_display_field(ps_dec,
1611 ps_dec->ps_out_buffer,
1612 &(ps_dec->s_disp_op));
1613 /* If error code is non-zero then there is no buffer available for display,
1614 hence avoid format conversion */
1615
1616 if(0 != ps_dec->s_disp_op.u4_error_code)
1617 {
1618 ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301619 }
1620 else
1621 ps_dec->u4_output_present = 1;
1622 }
1623 if(ps_dec->u1_separate_parse == 1)
1624 {
1625 if(ps_dec->u4_dec_thread_created == 0)
1626 {
1627 ithread_create(ps_dec->pv_dec_thread_handle, NULL,
1628 (void *)ih264d_decode_picture_thread,
1629 (void *)ps_dec);
1630
1631 ps_dec->u4_dec_thread_created = 1;
1632 }
1633
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001634 if((ps_dec->u4_num_cores == 3) &&
1635 ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301636 && (ps_dec->u4_bs_deblk_thread_created == 0))
1637 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001638 ps_dec->u4_start_recon_deblk = 0;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301639 ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL,
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001640 (void *)ih264d_recon_deblk_thread,
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301641 (void *)ps_dec);
1642 ps_dec->u4_bs_deblk_thread_created = 1;
1643 }
1644 }
1645
1646 }
1647
1648 /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */
1649 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001650 UWORD8 uc_nofield_nombaff;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301651
1652
1653
1654 uc_nofield_nombaff = ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0)
1655 && (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0)
1656 && (u1_slice_type != B_SLICE)
1657 && (ps_dec->ps_cur_pps->u1_wted_pred_flag == 0));
1658
1659 /* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */
1660
1661 if(uc_nofield_nombaff)
1662 {
1663 ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
1664 ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
1665 }
1666 else
1667 {
1668 ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp;
1669 ps_dec->p_motion_compensate = ih264d_motion_compensate_mp;
1670 }
1671
1672
1673 }
1674
1675 /*
1676 * Decide whether to decode the current picture or not
1677 */
1678 {
1679 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
1680 if(ps_err->u4_frm_sei_sync == u2_frame_num)
1681 {
1682 ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1683 ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
1684 }
1685 ps_err->u4_cur_frm = u2_frame_num;
1686 }
1687
1688 /* Decision for decoding if the picture is to be skipped */
1689 {
1690 WORD32 i4_skip_b_pic, i4_skip_p_pic;
1691
1692 i4_skip_b_pic = (ps_dec->u4_skip_frm_mask & B_SLC_BIT)
1693 && (B_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc);
1694
1695 i4_skip_p_pic = (ps_dec->u4_skip_frm_mask & P_SLC_BIT)
1696 && (P_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc);
1697
1698 /**************************************************************/
1699 /* Skip the B picture if skip mask is set for B picture and */
1700 /* Current B picture is a non reference B picture or there is */
1701 /* no user for reference B picture */
1702 /**************************************************************/
1703 if(i4_skip_b_pic)
1704 {
1705 ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1706 /* Don't decode the picture in SKIP-B mode if that picture is B */
1707 /* and also it is not to be used as a reference picture */
1708 ps_dec->u1_last_pic_not_decoded = 1;
1709
1710 return OK;
1711 }
1712 /**************************************************************/
1713 /* Skip the P picture if skip mask is set for P picture and */
1714 /* Current P picture is a non reference P picture or there is */
1715 /* no user for reference P picture */
1716 /**************************************************************/
1717 if(i4_skip_p_pic)
1718 {
1719 ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1720 /* Don't decode the picture in SKIP-P mode if that picture is P */
1721 /* and also it is not to be used as a reference picture */
1722 ps_dec->u1_last_pic_not_decoded = 1;
1723
1724 return OK;
1725 }
1726 }
1727
1728 {
1729 UWORD16 u2_mb_x, u2_mb_y;
1730
1731 ps_dec->i4_submb_ofst = ((u2_first_mb_in_slice
1732 << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE)
1733 - SUB_BLK_SIZE;
1734 if(u2_first_mb_in_slice)
1735 {
1736 UWORD8 u1_mb_aff;
1737 UWORD8 u1_field_pic;
1738 UWORD16 u2_frm_wd_in_mbs;
1739 u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
1740 u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag;
1741 u1_field_pic = ps_cur_slice->u1_field_pic_flag;
1742
1743 {
1744 UWORD32 x_offset;
1745 UWORD32 y_offset;
1746 UWORD32 u4_frame_stride;
1747 tfr_ctxt_t *ps_trns_addr; // = &ps_dec->s_tran_addrecon_parse;
1748
1749 if(ps_dec->u1_separate_parse)
1750 {
1751 ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1752 }
1753 else
1754 {
1755 ps_trns_addr = &ps_dec->s_tran_addrecon;
1756 }
1757 u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1758 u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1759
1760 u2_mb_y <<= u1_mb_aff;
1761
1762 if((u2_mb_x > u2_frm_wd_in_mbs - 1)
1763 || (u2_mb_y > ps_dec->u2_frm_ht_in_mbs - 1))
1764 {
1765 return ERROR_CORRUPTED_SLICE;
1766 }
1767
1768 u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic;
1769 x_offset = u2_mb_x << 4;
1770 y_offset = (u2_mb_y * u4_frame_stride) << 4;
1771
1772 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset
1773 + y_offset;
1774
1775 u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic;
1776 x_offset >>= 1;
1777 y_offset = (u2_mb_y * u4_frame_stride) << 3;
1778
1779 x_offset *= YUV420SP_FACTOR;
1780
1781 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset
1782 + y_offset;
1783 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset
1784 + y_offset;
1785
1786 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1787 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1788 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1789
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301790
1791 // assign the deblock structure pointers to start of slice
1792 if(ps_dec->u1_separate_parse == 1)
1793 {
1794 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic
1795 + (u2_first_mb_in_slice << u1_mb_aff);
1796 }
1797 else
1798 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301799 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic
1800 + (u2_first_mb_in_slice << u1_mb_aff);
1801 }
1802
1803 ps_dec->u2_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff);
1804
1805 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv
1806 + ((u2_first_mb_in_slice << u1_mb_aff) << 4);
1807 }
1808 }
1809 else
1810 {
1811 tfr_ctxt_t *ps_trns_addr;
1812
1813 if(ps_dec->u1_separate_parse)
1814 {
1815 ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1816 }
1817 else
1818 {
1819 ps_trns_addr = &ps_dec->s_tran_addrecon;
1820 }
1821
1822 u2_mb_x = 0xffff;
1823 u2_mb_y = 0;
1824 // assign the deblock structure pointers to start of slice
1825 ps_dec->u2_cur_mb_addr = 0;
1826 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301827 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
1828 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
1829 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
1830 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
1831
1832 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1833 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1834 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1835
1836 }
1837
1838 ps_dec->ps_part = ps_dec->ps_parse_part_params;
1839
1840 ps_dec->u2_mbx =
1841 (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1842 ps_dec->u2_mby =
1843 (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1844 ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag;
1845 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1846 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1847 }
1848
1849 /* RBSP stop bit is used for CABAC decoding*/
1850 ps_bitstrm->u4_max_ofst += ps_dec->ps_cur_pps->u1_entropy_coding_mode;
1851
1852 ps_dec->u1_B = (u1_slice_type == B_SLICE);
1853 ps_dec->u4_next_mb_skip = 0;
1854
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301855 ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice =
1856 ps_dec->ps_cur_slice->u2_first_mb_in_slice;
1857 ps_dec->ps_parse_cur_slice->slice_type =
1858 ps_dec->ps_cur_slice->u1_slice_type;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301859
1860
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001861 ps_dec->u4_start_recon_deblk = 1;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301862 {
1863 WORD32 num_entries;
1864 WORD32 size;
1865 UWORD8 *pu1_buf;
1866
1867 num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init);
1868 num_entries = 2 * ((2 * num_entries) + 1);
1869
1870 size = num_entries * sizeof(void *);
1871 size += PAD_MAP_IDX_POC * sizeof(void *);
1872
1873 pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
1874 pu1_buf += size * ps_dec->u2_cur_slice_num;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001875 ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = ( void *)pu1_buf;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301876 }
1877
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001878 if(ps_dec->u1_separate_parse)
1879 {
1880 ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
1881 }
1882 else
1883 {
1884 ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1885 }
1886
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301887 if(u1_slice_type == I_SLICE)
1888 {
1889 ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT;
1890
1891 ret = ih264d_parse_islice(ps_dec, u2_first_mb_in_slice);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301892
1893 if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE)
1894 ps_dec->i4_pic_type = I_SLICE;
1895
1896 }
1897 else if(u1_slice_type == P_SLICE)
1898 {
1899 ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1900 ret = ih264d_parse_pslice(ps_dec, u2_first_mb_in_slice);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301901 ps_dec->u1_pr_sl_type = u1_slice_type;
1902 if(ps_dec->i4_pic_type != B_SLICE)
1903 ps_dec->i4_pic_type = P_SLICE;
1904 }
1905 else if(u1_slice_type == B_SLICE)
1906 {
1907 ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1908 ret = ih264d_parse_bslice(ps_dec, u2_first_mb_in_slice);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301909 ps_dec->u1_pr_sl_type = u1_slice_type;
1910 ps_dec->i4_pic_type = B_SLICE;
1911 }
1912 else
1913 return ERROR_INV_SLC_TYPE_T;
1914
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001915 if(ps_dec->u1_slice_header_done)
1916 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301917 /* set to zero to indicate a valid slice has been decoded */
1918 /* first slice header successfully decoded */
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001919 ps_dec->u4_first_slice_in_pic = 0;
1920 ps_dec->u1_first_slice_in_stream = 0;
1921 }
1922
1923 if(ret != OK)
1924 return ret;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301925
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301926 /* storing last Mb X and MbY of the slice */
1927 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1928 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001929
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301930 /* End of Picture detection */
1931
1932 if(ps_dec->u2_total_mbs_coded >= (ps_seq->u2_max_mb_addr + 1))
1933 {
1934 ps_dec->u1_pic_decode_done = 1;
1935
1936 }
1937
1938 {
1939 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
1940 if((ps_err->u1_err_flag & REJECT_PB_PICS)
1941 && (ps_err->u1_cur_pic_type == PIC_TYPE_I))
1942 {
1943 ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1944 }
1945 }
1946
1947 PRINT_BIN_BIT_RATIO(ps_dec)
1948
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001949 return ret;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301950}
1951