blob: 3608c6c9f404ecc7fcae34450063d0fe42a6bacf [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
Hamsalekha S3f6c9412017-06-01 11:44:39 +053075WORD32 check_app_out_buf_size(dec_struct_t *ps_dec);
Hamsalekha S8d3d3032015-03-13 21:24:58 +053076/*!
77 **************************************************************************
78 * \if Function name : ih264d_form_pred_weight_matrix \endif
79 *
80 * \brief
81 * Forms pred weight matrix.
82 *
83 * \return
84 * None
85 *
86 **************************************************************************
87 */
88
89void ih264d_form_pred_weight_matrix(dec_struct_t *ps_dec)
90{
91 dec_slice_params_t *ps_cur_slice;
92 UWORD8 uc_num_ref_idx_l0_active, uc_num_ref_idx_l1_active;
93 UWORD8 i, j;
94 UWORD32 *pu4_mat_iwt_ofst;
95 UWORD16 i2_idx;
96 UWORD32 *pui32_weight_offset_l0, *pui32_weight_offset_l1;
97 UWORD32 u4_temp;
98
99 ps_cur_slice = ps_dec->ps_cur_slice;
100 uc_num_ref_idx_l0_active = ps_cur_slice->u1_num_ref_idx_lx_active[0];
101 uc_num_ref_idx_l1_active = ps_cur_slice->u1_num_ref_idx_lx_active[1];
102
103 pu4_mat_iwt_ofst = ps_dec->pu4_wts_ofsts_mat;
104
105 if(ps_cur_slice->u1_slice_type == B_SLICE)
106 {
107 for(i = 0; i < uc_num_ref_idx_l0_active; i++)
108 {
109 pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i];
110 for(j = 0; j < uc_num_ref_idx_l1_active; j++)
111 {
112 pui32_weight_offset_l1 = ps_cur_slice->u4_wt_ofst_lx[1][j];
113 i2_idx = i * uc_num_ref_idx_l0_active + j;
114 i2_idx = X3(i2_idx);
115 /* u4_temp = (pui32_weight_offset_l0[0] | (pui32_weight_offset_l1[0] << 16));
116 pu4_mat_iwt_ofst[0] = u4_temp;
117 u4_temp = (pui32_weight_offset_l0[1] | (pui32_weight_offset_l1[1] << 16));
118 pu4_mat_iwt_ofst[1] = u4_temp;
119 u4_temp = (pui32_weight_offset_l0[2] | (pui32_weight_offset_l1[2] << 16));
120 pu4_mat_iwt_ofst[2] = u4_temp;
121 pu4_mat_iwt_ofst += 3;*/
122 pu4_mat_iwt_ofst[0] = pui32_weight_offset_l0[0];
123 pu4_mat_iwt_ofst[1] = pui32_weight_offset_l1[0];
124 pu4_mat_iwt_ofst[2] = pui32_weight_offset_l0[1];
125 pu4_mat_iwt_ofst[3] = pui32_weight_offset_l1[1];
126 pu4_mat_iwt_ofst[4] = pui32_weight_offset_l0[2];
127 pu4_mat_iwt_ofst[5] = pui32_weight_offset_l1[2];
128 pu4_mat_iwt_ofst += 6;
129 }
130 }
131 }
132 else
133 {
134 for(i = 0; i < uc_num_ref_idx_l0_active; i++)
135 {
136 pui32_weight_offset_l0 = ps_cur_slice->u4_wt_ofst_lx[0][i];
137 i2_idx = X3(i);
138 u4_temp = (UWORD32)pui32_weight_offset_l0[0];
139 pu4_mat_iwt_ofst[0] = u4_temp;
140 u4_temp = (UWORD32)pui32_weight_offset_l0[1];
141 pu4_mat_iwt_ofst[2] = u4_temp;
142 u4_temp = (UWORD32)pui32_weight_offset_l0[2];
143 pu4_mat_iwt_ofst[4] = u4_temp;
144 pu4_mat_iwt_ofst += 6;
145 }
146 }
147}
148
149
150/*!
151 **************************************************************************
152 * \if Function name : init_firstSliceParam \endif
153 *
154 * \brief
155 * Initialize the Parameter required for all the slices for a picture
156 *
157 * \return : Nothing
158 *
159 **************************************************************************
160 */
161
162WORD32 ih264d_start_of_pic(dec_struct_t *ps_dec,
163 WORD32 i4_poc,
164 pocstruct_t *ps_temp_poc,
165 UWORD16 u2_frame_num,
166 dec_pic_params_t *ps_pps)
167{
168 pocstruct_t *ps_prev_poc = &ps_dec->s_cur_pic_poc;
169 pocstruct_t *ps_cur_poc = ps_temp_poc;
170
171 pic_buffer_t *pic_buf;
172
173 ivd_video_decode_op_t * ps_dec_output =
174 (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
175 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
176 dec_seq_params_t *ps_seq = ps_pps->ps_sps;
177 UWORD8 u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag;
178 UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
179 /* high profile related declarations */
180 high_profile_tools_t s_high_profile;
181 WORD32 ret;
182
183 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
184
Hamsalekha S3f6c9412017-06-01 11:44:39 +0530185 /* check output buffer size given by the application */
186 if(check_app_out_buf_size(ps_dec) != IV_SUCCESS)
187 return IVD_DISP_FRM_ZERO_OP_BUF_SIZE;
188
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530189 ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
190 ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
191 ps_prev_poc->i4_delta_pic_order_cnt_bottom =
192 ps_cur_poc->i4_delta_pic_order_cnt_bottom;
193 ps_prev_poc->i4_delta_pic_order_cnt[0] =
194 ps_cur_poc->i4_delta_pic_order_cnt[0];
195 ps_prev_poc->i4_delta_pic_order_cnt[1] =
196 ps_cur_poc->i4_delta_pic_order_cnt[1];
197 ps_prev_poc->u1_bot_field = ps_dec->ps_cur_slice->u1_bottom_field_flag;
198 ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
199 ps_prev_poc->u2_frame_num = u2_frame_num;
200 ps_dec->i1_prev_mb_qp_delta = 0;
201 ps_dec->i1_next_ctxt_idx = 0;
202
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530203
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700204 ps_dec->u4_nmb_deblk = 0;
205 if(ps_dec->u4_num_cores == 1)
206 ps_dec->u4_nmb_deblk = 1;
207
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530208
209
210 if(ps_seq->u1_mb_aff_flag == 1)
211 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700212 ps_dec->u4_nmb_deblk = 0;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530213 if(ps_dec->u4_num_cores > 2)
214 ps_dec->u4_num_cores = 2;
215 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700216
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530217 ps_dec->u4_use_intrapred_line_copy = 0;
218
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700219
220
221 if (ps_seq->u1_mb_aff_flag == 0)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530222 {
223 ps_dec->u4_use_intrapred_line_copy = 1;
224 }
225
226 ps_dec->u4_app_disable_deblk_frm = 0;
227 /* If degrade is enabled, set the degrade flags appropriately */
228 if(ps_dec->i4_degrade_type && ps_dec->i4_degrade_pics)
229 {
230 WORD32 degrade_pic;
231 ps_dec->i4_degrade_pic_cnt++;
232 degrade_pic = 0;
233
234 /* If degrade is to be done in all frames, then do not check further */
235 switch(ps_dec->i4_degrade_pics)
236 {
237 case 4:
238 {
239 degrade_pic = 1;
240 break;
241 }
242 case 3:
243 {
244 if(ps_cur_slice->u1_slice_type != I_SLICE)
245 degrade_pic = 1;
246
247 break;
248 }
249 case 2:
250 {
251
252 /* If pic count hits non-degrade interval or it is an islice, then do not degrade */
253 if((ps_cur_slice->u1_slice_type != I_SLICE)
254 && (ps_dec->i4_degrade_pic_cnt
255 != ps_dec->i4_nondegrade_interval))
256 degrade_pic = 1;
257
258 break;
259 }
260 case 1:
261 {
262 /* Check if the current picture is non-ref */
263 if(0 == ps_cur_slice->u1_nal_ref_idc)
264 {
265 degrade_pic = 1;
266 }
267 break;
268 }
269
270 }
271 if(degrade_pic)
272 {
273 if(ps_dec->i4_degrade_type & 0x2)
274 ps_dec->u4_app_disable_deblk_frm = 1;
275
276 /* MC degrading is done only for non-ref pictures */
277 if(0 == ps_cur_slice->u1_nal_ref_idc)
278 {
279 if(ps_dec->i4_degrade_type & 0x4)
280 ps_dec->i4_mv_frac_mask = 0;
281
282 if(ps_dec->i4_degrade_type & 0x8)
283 ps_dec->i4_mv_frac_mask = 0;
284 }
285 }
286 else
287 ps_dec->i4_degrade_pic_cnt = 0;
288 }
289
290 {
291 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
Hamsalekha Sf9d3f9a2017-05-23 11:53:52 +0530292 if((ps_cur_slice->u1_slice_type == I_SLICE)
293 || (ps_cur_slice->u1_slice_type == SI_SLICE))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530294 ps_err->u1_cur_pic_type = PIC_TYPE_I;
295 else
296 ps_err->u1_cur_pic_type = PIC_TYPE_UNKNOWN;
297
298 if(ps_err->u1_pic_aud_i == PIC_TYPE_I)
299 {
300 ps_err->u1_cur_pic_type = PIC_TYPE_I;
301 ps_err->u1_pic_aud_i = PIC_TYPE_UNKNOWN;
302 }
303
304 if(ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL)
305 {
306 if(ps_err->u1_err_flag)
307 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
308 ps_err->u1_err_flag = ACCEPT_ALL_PICS;
309 }
310 }
311
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530312 if(ps_dec->u1_init_dec_flag && ps_dec->s_prev_seq_params.u1_eoseq_pending)
313 {
314 /* Reset the decoder picture buffers */
315 WORD32 j;
316 for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
317 {
318
319 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
320 j,
321 BUF_MGR_REF);
322 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
323 ps_dec->au1_pic_buf_id_mv_buf_id_map[j],
324 BUF_MGR_REF);
325 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
326 j,
327 BUF_MGR_IO);
328 }
329
330 /* reset the decoder structure parameters related to buffer handling */
331 ps_dec->u1_second_field = 0;
332 ps_dec->i4_cur_display_seq = 0;
333
334 /********************************************************************/
335 /* indicate in the decoder output i4_status that some frames are being */
336 /* dropped, so that it resets timestamp and wait for a new sequence */
337 /********************************************************************/
338
339 ps_dec->s_prev_seq_params.u1_eoseq_pending = 0;
340 }
341 ret = ih264d_init_pic(ps_dec, u2_frame_num, i4_poc, ps_pps);
342 if(ret != OK)
343 return ret;
344
345 ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data;
346 ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_pic_tu_coeff_data;
347 ps_dec->ps_nmb_info = ps_dec->ps_frm_mb_info;
348 if(ps_dec->u1_separate_parse)
349 {
Harish Mahendrakar251b0072015-08-04 09:55:15 +0530350 UWORD16 pic_wd;
351 UWORD16 pic_ht;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530352 UWORD32 num_mbs;
353
Harish Mahendrakar251b0072015-08-04 09:55:15 +0530354 pic_wd = ps_dec->u2_pic_wd;
355 pic_ht = ps_dec->u2_pic_ht;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530356 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 {
Hamsalekha Sb8d36252017-06-06 10:26:16 +0530444 /*make first entry of list0 and list1 point to cur pic,
445 *so that if first slice is in error, ref pic struct will have valid entries*/
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700446 ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
Hamsalekha Sb8d36252017-06-06 10:26:16 +0530447 ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_init_dpb[1];
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700448 *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic;
Harish Mahendrakarbc71ad22016-09-17 17:00:37 +0530449 /* Initialize for field reference as well */
450 *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
Hamsalekha Sb8d36252017-06-06 10:26:16 +0530451
452 *(ps_dec->ps_dpb_mgr->ps_mod_dpb[0][0]) = *ps_cur_pic;
453 /* Initialize for field reference as well */
454 *(ps_dec->ps_dpb_mgr->ps_mod_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
455 *(ps_dec->ps_dpb_mgr->ps_init_dpb[1][0]) = *ps_cur_pic;
456 /* Initialize for field reference as well */
457 *(ps_dec->ps_dpb_mgr->ps_init_dpb[1][MAX_REF_BUFS]) = *ps_cur_pic;
458 *(ps_dec->ps_dpb_mgr->ps_mod_dpb[1][0]) = *ps_cur_pic;
459 /* Initialize for field reference as well */
460 *(ps_dec->ps_dpb_mgr->ps_mod_dpb[1][MAX_REF_BUFS]) = *ps_cur_pic;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700461 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530462
463 if(!ps_dec->ps_cur_pic)
464 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530465 WORD32 j;
Martin Storsjo086dd8e2015-06-13 00:35:01 +0300466 H264_DEC_DEBUG_PRINT("------- Display Buffers Reset --------\n");
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530467 for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
468 {
469
470 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
471 j,
472 BUF_MGR_REF);
473 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
474 ps_dec->au1_pic_buf_id_mv_buf_id_map[j],
475 BUF_MGR_REF);
476 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
477 j,
478 BUF_MGR_IO);
479 }
480
481 ps_dec->i4_cur_display_seq = 0;
482 ps_dec->i4_prev_max_display_seq = 0;
483 ps_dec->i4_max_poc = 0;
484
485 ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free(
486 (buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
487 &cur_pic_buf_id);
488 if(ps_cur_pic == NULL)
489 {
490 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
491 return ERROR_UNAVAIL_PICBUF_T;
492 }
493
494 ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
495 &cur_mv_buf_id);
496 if(ps_col_mv == NULL)
497 {
498 ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
499 return ERROR_UNAVAIL_MVBUF_T;
500 }
501
502 ps_dec->ps_cur_pic = ps_cur_pic;
503 ps_dec->u1_pic_buf_id = cur_pic_buf_id;
504 ps_cur_pic->u4_ts = ps_dec->u4_ts;
505 ps_dec->apv_buf_id_pic_buf_map[cur_pic_buf_id] = (void *)ps_cur_pic;
506
507 ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
508 ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id;
509
510 ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag;
511 ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv;
512 ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
513
514 }
515
516 ps_dec->ps_cur_pic->u1_picturetype = u1_field_pic_flag;
517 ps_dec->ps_cur_pic->u4_pack_slc_typ = SKIP_NONE;
518 H264_DEC_DEBUG_PRINT("got a buffer\n");
519 }
520 else
521 {
522 H264_DEC_DEBUG_PRINT("did not get a buffer\n");
523 }
524
525 ps_dec->u4_pic_buf_got = 1;
526
527 ps_dec->ps_cur_pic->i4_poc = i4_poc;
528 ps_dec->ps_cur_pic->i4_frame_num = u2_frame_num;
529 ps_dec->ps_cur_pic->i4_pic_num = u2_frame_num;
530 ps_dec->ps_cur_pic->i4_top_field_order_cnt = ps_pps->i4_top_field_order_cnt;
531 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt =
532 ps_pps->i4_bottom_field_order_cnt;
533 ps_dec->ps_cur_pic->i4_avg_poc = ps_pps->i4_avg_poc;
534 ps_dec->ps_cur_pic->u4_time_stamp = ps_dec->u4_pts;
535
536 ps_dec->s_cur_pic = *(ps_dec->ps_cur_pic);
537 if(u1_field_pic_flag && u1_bottom_field_flag)
538 {
539 WORD32 i4_temp_poc;
540 WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
541 /* Point to odd lines, since it's bottom field */
542 ps_dec->s_cur_pic.pu1_buf1 += ps_dec->s_cur_pic.u2_frm_wd_y;
543 ps_dec->s_cur_pic.pu1_buf2 += ps_dec->s_cur_pic.u2_frm_wd_uv;
544 ps_dec->s_cur_pic.pu1_buf3 += ps_dec->s_cur_pic.u2_frm_wd_uv;
545 ps_dec->s_cur_pic.ps_mv +=
546 ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
547 ps_dec->s_cur_pic.pu1_col_zero_flag += ((ps_dec->u2_pic_ht
548 * ps_dec->u2_pic_wd) >> 5);
549 ps_dec->ps_cur_pic->u1_picturetype |= BOT_FLD;
550 i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
551 i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
552 i4_temp_poc = MIN(i4_top_field_order_poc,
553 i4_bot_field_order_poc);
554 ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
555 }
556
557 ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag
558 && (!u1_field_pic_flag);
559
560 ps_dec->ps_cur_pic->u1_picturetype |= (ps_cur_slice->u1_mbaff_frame_flag
561 << 2);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530562
563 ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row; //[0];
Harish Mahendrakar251b0072015-08-04 09:55:15 +0530564 //Increment by 2 ,so that left mb (mbaff decrements by 2) will always be valid
565 ps_dec->ps_cur_mb_row += 2;
566 ps_dec->ps_top_mb_row = ps_dec->ps_nbr_mb_row;
567 ps_dec->ps_top_mb_row += ((ps_dec->u2_frm_wd_in_mbs + 2) << (1 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag));
568 //Increment by 2 ,so that left mb (mbaff decrements by 2) will always be valid
569 ps_dec->ps_top_mb_row += 2;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530570
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530571 /* CHANGED CODE */
572 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
573 ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0];
574 /* CHANGED CODE */
575 ps_dec->u1_mv_top_p = 0;
576 ps_dec->u1_mb_idx = 0;
577 /* CHANGED CODE */
578 ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530579 ps_dec->u2_total_mbs_coded = 0;
580 ps_dec->i4_submb_ofst = -(SUB_BLK_SIZE);
581 ps_dec->u4_pred_info_idx = 0;
582 ps_dec->u4_pred_info_pkd_idx = 0;
583 ps_dec->u4_dma_buf_idx = 0;
584 ps_dec->ps_mv = ps_dec->s_cur_pic.ps_mv;
585 ps_dec->ps_mv_bank_cur = ps_dec->s_cur_pic.ps_mv;
586 ps_dec->pu1_col_zero_flag = ps_dec->s_cur_pic.pu1_col_zero_flag;
587 ps_dec->ps_part = ps_dec->ps_parse_part_params;
588 ps_dec->i2_prev_slice_mbx = -1;
589 ps_dec->i2_prev_slice_mby = 0;
590 ps_dec->u2_mv_2mb[0] = 0;
591 ps_dec->u2_mv_2mb[1] = 0;
592 ps_dec->u1_last_pic_not_decoded = 0;
593
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530594 ps_dec->u2_cur_slice_num_dec_thread = 0;
595 ps_dec->u2_cur_slice_num_bs = 0;
596 ps_dec->u4_intra_pred_line_ofst = 0;
597 ps_dec->pu1_cur_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line;
598 ps_dec->pu1_cur_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line;
599 ps_dec->pu1_cur_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line;
600
601 ps_dec->pu1_cur_y_intra_pred_line_base = ps_dec->pu1_y_intra_pred_line;
602 ps_dec->pu1_cur_u_intra_pred_line_base = ps_dec->pu1_u_intra_pred_line;
603 ps_dec->pu1_cur_v_intra_pred_line_base = ps_dec->pu1_v_intra_pred_line;
604
605
606
607
608
609 ps_dec->pu1_prev_y_intra_pred_line = ps_dec->pu1_y_intra_pred_line
610 + (ps_dec->u2_frm_wd_in_mbs * MB_SIZE);
611
612 ps_dec->pu1_prev_u_intra_pred_line = ps_dec->pu1_u_intra_pred_line
613 + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE * YUV420SP_FACTOR;
614 ps_dec->pu1_prev_v_intra_pred_line = ps_dec->pu1_v_intra_pred_line
615 + ps_dec->u2_frm_wd_in_mbs * BLK8x8SIZE;
616
617 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530618 /* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag */
619 {
620 if(ps_cur_slice->u1_mbaff_frame_flag)
621 {
622 ps_dec->pf_compute_bs = ih264d_compute_bs_mbaff;
623 ps_dec->pf_mvpred = ih264d_mvpred_mbaff;
624 }
625 else
626 {
627 ps_dec->pf_compute_bs = ih264d_compute_bs_non_mbaff;
628 ps_dec->u1_cur_mb_fld_dec_flag = ps_cur_slice->u1_field_pic_flag;
629 }
630 }
631 /* Set up the Parameter for DMA transfer */
632 {
633 UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
634
635 UWORD8 u1_mbaff = ps_cur_slice->u1_mbaff_frame_flag;
636
637 UWORD8 uc_lastmbs = (((ps_dec->u2_pic_wd) >> 4)
638 % (ps_dec->u1_recon_mb_grp >> u1_mbaff));
639 UWORD16 ui16_lastmbs_widthY =
640 (uc_lastmbs ? (uc_lastmbs << 4) : ((ps_dec->u1_recon_mb_grp
641 >> u1_mbaff) << 4));
642 UWORD16 ui16_lastmbs_widthUV =
643 uc_lastmbs ? (uc_lastmbs << 3) : ((ps_dec->u1_recon_mb_grp
644 >> u1_mbaff) << 3);
645
646 ps_dec->s_tran_addrecon.pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
647 ps_dec->s_tran_addrecon.pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
648 ps_dec->s_tran_addrecon.pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
649
650 ps_dec->s_tran_addrecon.u2_frm_wd_y = ps_dec->u2_frm_wd_y
651 << u1_field_pic_flag;
652 ps_dec->s_tran_addrecon.u2_frm_wd_uv = ps_dec->u2_frm_wd_uv
653 << u1_field_pic_flag;
654
655 if(u1_field_pic_flag)
656 {
657 ui16_lastmbs_widthY += ps_dec->u2_frm_wd_y;
658 ui16_lastmbs_widthUV += ps_dec->u2_frm_wd_uv;
659 }
660
661 /* Normal Increment of Pointer */
662 ps_dec->s_tran_addrecon.u4_inc_y[0] = ((ps_dec->u1_recon_mb_grp << 4)
663 >> u1_mbaff);
664 ps_dec->s_tran_addrecon.u4_inc_uv[0] = ((ps_dec->u1_recon_mb_grp << 4)
665 >> u1_mbaff);
666
667 /* End of Row Increment */
668 ps_dec->s_tran_addrecon.u4_inc_y[1] = (ui16_lastmbs_widthY
669 + (PAD_LEN_Y_H << 1)
670 + ps_dec->s_tran_addrecon.u2_frm_wd_y
671 * ((15 << u1_mbaff) + u1_mbaff));
672 ps_dec->s_tran_addrecon.u4_inc_uv[1] = (ui16_lastmbs_widthUV
673 + (PAD_LEN_UV_H << 2)
674 + ps_dec->s_tran_addrecon.u2_frm_wd_uv
675 * ((15 << u1_mbaff) + u1_mbaff));
676
677 /* Assign picture numbers to each frame/field */
678 /* only once per picture. */
679 ih264d_assign_pic_num(ps_dec);
680 ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (ps_dec->u1_recon_mb_grp
681 << 2) - 1 - (u1_mbaff << 2);
682 ps_dec->s_tran_addrecon.u2_mv_left_inc = ((ps_dec->u1_recon_mb_grp
683 >> u1_mbaff) - 1) << (4 + u1_mbaff);
684 }
685 /**********************************************************************/
686 /* High profile related initialization at pictrue level */
687 /**********************************************************************/
688 if(ps_seq->u1_profile_idc == HIGH_PROFILE_IDC)
689 {
690 if((ps_seq->i4_seq_scaling_matrix_present_flag)
691 || (ps_pps->i4_pic_scaling_matrix_present_flag))
692 {
693 ih264d_form_scaling_matrix_picture(ps_seq, ps_pps, ps_dec);
694 ps_dec->s_high_profile.u1_scaling_present = 1;
695 }
696 else
697 {
698 ih264d_form_default_scaling_matrix(ps_dec);
699 }
700
701 if(ps_pps->i4_transform_8x8_mode_flag)
702 {
703 ps_dec->s_high_profile.u1_transform8x8_present = 1;
704 }
705 }
706 else
707 {
708 ih264d_form_default_scaling_matrix(ps_dec);
709 }
710
711 /* required while reading the transform_size_8x8 u4_flag */
712 ps_dec->s_high_profile.u1_direct_8x8_inference_flag =
713 ps_seq->u1_direct_8x8_inference_flag;
714 ps_dec->s_high_profile.s_cavlc_ctxt = ps_dec->s_cavlc_ctxt;
715
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700716 ps_dec->i1_recon_in_thread3_flag = 1;
717 ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_addrecon;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530718 if(ps_dec->u1_separate_parse)
719 {
720 memcpy(&ps_dec->s_tran_addrecon_parse, &ps_dec->s_tran_addrecon,
721 sizeof(tfr_ctxt_t));
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700722 if(ps_dec->u4_num_cores >= 3 && ps_dec->i1_recon_in_thread3_flag)
723 {
724 memcpy(&ps_dec->s_tran_iprecon, &ps_dec->s_tran_addrecon,
725 sizeof(tfr_ctxt_t));
726 ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_iprecon;
727 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530728 }
729
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700730
731 ih264d_init_deblk_tfr_ctxt(ps_dec,&(ps_dec->s_pad_mgr), &(ps_dec->s_tran_addrecon),
732 ps_dec->u2_frm_wd_in_mbs, 0);
733
734 ps_dec->ps_cur_deblk_mb = ps_dec->ps_deblk_pic;
735 ps_dec->u4_cur_deblk_mb_num = 0;
736
737 ps_dec->u4_deblk_mb_x = 0;
738 ps_dec->u4_deblk_mb_y = 0;
Harish Mahendrakar33db7a02016-04-20 16:13:52 +0530739 ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700740
Harish Mahendrakar0b23c812017-01-16 14:43:42 +0530741 ps_dec->u4_first_slice_in_pic = 0;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530742 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
743 return OK;
744}
745
746/*!
747 **************************************************************************
748 * \if Function name : ih264d_deblock_display \endif
749 *
750 * \brief : The function callls the deblocking routine and manages
751 : the Recon buffers and displays .
752 * \return : Nothing
753 *
754 **************************************************************************
755 */
756WORD32 ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec)
757{
758 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
759 UWORD8 u1_num_of_users = 0;
760 WORD32 ret;
761
762 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
763 if(1)
764 {
765
766 {
767 ih264d_delete_nonref_nondisplay_pics(ps_dec->ps_dpb_mgr);
768 if(ps_cur_slice->u1_mmco_equalto5
769 || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
770 {
771 ps_dec->ps_cur_pic->i4_poc = 0;
772 if(ps_dec->u2_total_mbs_coded
773 == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1))
774 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
775 ih264d_release_display_bufs(ps_dec);
776 }
Harish Mahendrakar251b0072015-08-04 09:55:15 +0530777 if(IVD_DECODE_FRAME_OUT != ps_dec->e_frm_out_mode)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530778 {
779 ret = ih264d_assign_display_seq(ps_dec);
780 if(ret != OK)
781 return ret;
782 }
783 }
784
785 if(ps_cur_slice->u1_nal_ref_idc)
786 {
787 /* Mark pic buf as needed for reference */
788 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
789 ps_dec->u1_pic_buf_id,
790 BUF_MGR_REF);
791 /* Mark mv buf as needed for reference */
792 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
793 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
794 BUF_MGR_REF);
795 ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 1;
796 }
797
798 /* 420 consumer */
799 /* Increment the number of users by 1 for display based upon */
800 /*the SEEK KEY FRAME control sent to decoder */
801 if(((0 == ps_dec->u1_last_pic_not_decoded)
802 && (0
803 == (ps_dec->ps_cur_pic->u4_pack_slc_typ
804 & ps_dec->u4_skip_frm_mask)))
805 || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
806 {
807 /* Mark pic buf as needed for display */
808 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
809 ps_dec->u1_pic_buf_id,
810 BUF_MGR_IO);
811
812 }
813
814 if(!ps_cur_slice->u1_field_pic_flag
815 || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
816 != ps_dec->u1_top_bottom_decoded))
817 {
818 pic_buffer_t *ps_cur_pic = ps_dec->ps_cur_pic;
819 ps_cur_pic->u2_disp_width = ps_dec->u2_disp_width;
820 ps_cur_pic->u2_disp_height = ps_dec->u2_disp_height >> 1;
821
822 ps_cur_pic->u2_crop_offset_y = ps_dec->u2_crop_offset_y;
823 ps_cur_pic->u2_crop_offset_uv = ps_dec->u2_crop_offset_uv;
824 ps_cur_pic->u1_pic_type = 0;
825
826 ret = ih264d_insert_pic_in_display_list(
827 ps_dec->ps_dpb_mgr,
828 ps_dec->u1_pic_buf_id,
829 ps_dec->i4_prev_max_display_seq
830 + ps_dec->ps_cur_pic->i4_poc,
831 ps_dec->ps_cur_pic->i4_frame_num);
832 if(ret != OK)
833 return ret;
834
835 {
836 ivd_video_decode_op_t * ps_dec_output =
837 (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
838
839 ps_dec_output->u4_frame_decoded_flag = 1;
840 }
841 if(ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] == 0)
842 {
843 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
844 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
845 BUF_MGR_REF);
846 ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 0;
847
848 }
849 }
850 else
851 {
852 H264_DEC_DEBUG_PRINT("pic not inserted display %d %d\n",
853 ps_cur_slice->u1_field_pic_flag,
854 ps_dec->u1_second_field);
855 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530856
857 if(!ps_cur_slice->u1_field_pic_flag
858 || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
859 == ps_dec->u1_top_bottom_decoded))
860 {
Harish Mahendrakar251b0072015-08-04 09:55:15 +0530861 if(IVD_DECODE_FRAME_OUT == ps_dec->e_frm_out_mode)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530862 {
863 ret = ih264d_assign_display_seq(ps_dec);
864 if(ret != OK)
865 return ret;
866 }
867 }
868 }
869
870 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
871
872 return OK;
873}
874
875void ih264d_err_pic_dispbuf_mgr(dec_struct_t *ps_dec)
876{
877 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
878 ivd_video_decode_op_t * ps_dec_output =
879 (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
880
881 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
882 ps_dec->u1_pic_buf_id,
883 BUF_MGR_REF);
884 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
885 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
886 BUF_MGR_REF);
887 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
888 ps_dec->u1_pic_buf_id,
889 BUF_MGR_IO);
890}
891
892void ih264d_deblock_picture(void *ptr)
893{
894 dec_struct_t *ps_dec = (dec_struct_t *)ptr;
895
896 {
897 /*Deblock picture only if all the mb's in the frame have been decoded*/
898 if(ps_dec->u1_pic_decode_done == 1)
899 {
900 if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag
901 || ps_dec->ps_cur_slice->u1_field_pic_flag)
902 {
903 ps_dec->p_DeblockPicture[ps_dec->ps_cur_slice->u1_mbaff_frame_flag](
904 ps_dec);
905 }
906 else
907
908 {
909
910 ih264d_deblock_picture_progressive(ps_dec);
911 }
912
913 }
914 }
915
916}
917
918/*!
919 **************************************************************************
920 * \if Function name : ih264d_deblock_display \endif
921 *
922 * \brief : The function callls the deblocking routine and manages
923 : the Recon buffers and displays .
924 * \return : Nothing
925 *
926 **************************************************************************
927 */
928WORD32 ih264d_deblock_display(dec_struct_t *ps_dec)
929{
930 WORD32 ret;
931 /* Call deblocking */
932 ih264d_deblock_picture(ps_dec);
933
934 ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
935 if(ret != OK)
936 return ret;
937
938 return OK;
939}
940
941/*
942 *!
943 **************************************************************************
944 * \if Function name : EndofPoc \endif
945 *
946 * \brief
947 * EndofPoc Processing
948 *
949 * \return
950 * 0 on Success and Error code otherwise
951 **************************************************************************
952 */
953
Harish Mahendrakar49456122017-01-05 12:10:47 +0530954WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530955{
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 {
960 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
961 if(ps_err->u1_err_flag & REJECT_CUR_PIC)
962 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530963 ih264d_err_pic_dispbuf_mgr(ps_dec);
Hamsalekha S9f0dcba2015-06-09 15:54:31 +0530964 return ERROR_NEW_FRAME_EXPECTED;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530965 }
966 }
967
968 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
969 ret = ih264d_end_of_pic_processing(ps_dec);
970 if(ret != OK)
971 return ret;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530972 /*--------------------------------------------------------------------*/
973 /* ih264d_decode_pic_order_cnt - calculate the Pic Order Cnt */
974 /* Needed to detect end of picture */
975 /*--------------------------------------------------------------------*/
Hamsalekha S9f0dcba2015-06-09 15:54:31 +0530976
977 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530978
979 return OK;
980}
981
982/*!
983 **************************************************************************
984 * \if Function name : DecodeSlice \endif
985 *
986 * \brief
987 * Parses a slice
988 *
989 * \return
990 * 0 on Success and Error code otherwise
991 **************************************************************************
992 */
993
994WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,
995 UWORD8 u1_nal_ref_idc,
996 dec_struct_t *ps_dec /* Decoder parameters */
997 )
998{
999 dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
1000 dec_pic_params_t *ps_pps;
1001 dec_seq_params_t *ps_seq;
1002 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
1003 pocstruct_t s_tmp_poc;
1004 WORD32 i_delta_poc[2];
1005 WORD32 i4_poc = 0;
1006 UWORD16 u2_first_mb_in_slice, u2_frame_num;
1007 UWORD8 u1_field_pic_flag, u1_redundant_pic_cnt = 0, u1_slice_type;
1008 UWORD32 u4_idr_pic_id = 0;
1009 UWORD8 u1_bottom_field_flag, u1_pic_order_cnt_type;
1010
1011 UWORD8 u1_nal_unit_type;
1012 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1013 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1014 WORD8 i1_is_end_of_poc;
1015
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001016 WORD32 ret, end_of_frame;
1017 WORD32 prev_slice_err, num_mb_skipped;
1018 UWORD8 u1_mbaff;
1019 pocstruct_t *ps_cur_poc;
1020
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301021 UWORD32 u4_temp;
1022 WORD32 i_temp;
1023 UWORD32 u4_call_end_of_pic = 0;
1024
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301025 /* read FirstMbInSlice and slice type*/
1026 ps_dec->ps_dpb_cmds->u1_dpb_commands_read_slc = 0;
1027 u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst,
1028 pu4_bitstrm_buf);
1029 if(u2_first_mb_in_slice
1030 > (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs))
1031 {
1032
1033 return ERROR_CORRUPTED_SLICE;
1034 }
1035
1036 /*we currently don not support ASO*/
1037 if(((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag)
Harish Mahendrakaref274332017-01-16 17:10:07 +05301038 <= ps_dec->u2_cur_mb_addr) && (ps_dec->u4_first_slice_in_pic == 0))
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301039 {
1040 return ERROR_CORRUPTED_SLICE;
1041 }
1042
1043 COPYTHECONTEXT("SH: first_mb_in_slice",u2_first_mb_in_slice);
1044
1045 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1046
1047 if(u4_temp > 9)
1048 return ERROR_INV_SLC_TYPE_T;
1049
1050 u1_slice_type = u4_temp;
1051 COPYTHECONTEXT("SH: slice_type",(u1_slice_type));
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301052 /* Find Out the Slice Type is 5 to 9 or not then Set the Flag */
1053 /* u1_sl_typ_5_9 = 1 .Which tells that all the slices in the Pic*/
1054 /* will be of same type of current */
1055 if(u1_slice_type > 4)
1056 {
1057 u1_slice_type -= 5;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301058 }
1059
1060 {
1061 UWORD32 skip;
1062
1063 if((ps_dec->i4_app_skip_mode == IVD_SKIP_PB)
1064 || (ps_dec->i4_dec_skip_mode == IVD_SKIP_PB))
1065 {
1066 UWORD32 u4_bit_stream_offset = 0;
1067
1068 if(ps_dec->u1_nal_unit_type == IDR_SLICE_NAL)
1069 {
1070 skip = 0;
1071
1072 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE;
1073 }
1074 else if((I_SLICE == u1_slice_type)
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001075 && (1 >= ps_dec->ps_cur_sps->u1_num_ref_frames))
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301076 {
1077 skip = 0;
1078
1079 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE;
1080 }
1081 else
1082 {
1083 skip = 1;
1084 }
1085
1086 /* If one frame worth of data is already skipped, do not skip the next one */
1087 if((0 == u2_first_mb_in_slice) && (1 == ps_dec->u4_prev_nal_skipped))
1088 {
1089 skip = 0;
1090 }
1091
1092 if(skip)
1093 {
1094 ps_dec->u4_prev_nal_skipped = 1;
1095 ps_dec->i4_dec_skip_mode = IVD_SKIP_PB;
1096 return 0;
1097 }
1098 else
1099 {
1100 /* If the previous NAL was skipped, then
1101 do not process that buffer in this call.
1102 Return to app and process it in the next call.
1103 This is necessary to handle cases where I/IDR is not complete in
1104 the current buffer and application intends to fill the remaining part of the bitstream
1105 later. This ensures we process only frame worth of data in every call */
1106 if(1 == ps_dec->u4_prev_nal_skipped)
1107 {
1108 ps_dec->u4_return_to_app = 1;
1109 return 0;
1110 }
1111 }
1112 }
1113
1114 }
1115
1116 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1117 if(u4_temp & MASK_ERR_PIC_SET_ID)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301118 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301119 /* discard slice if pic param is invalid */
1120 COPYTHECONTEXT("SH: pic_parameter_set_id", u4_temp);
1121 ps_pps = &ps_dec->ps_pps[u4_temp];
1122 if(FALSE == ps_pps->u1_is_valid)
1123 {
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301124 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301125 }
1126 ps_seq = ps_pps->ps_sps;
1127 if(!ps_seq)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301128 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301129 if(FALSE == ps_seq->u1_is_valid)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301130 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301131
1132 /* Get the frame num */
1133 u2_frame_num = ih264d_get_bits_h264(ps_bitstrm,
1134 ps_seq->u1_bits_in_frm_num);
1135// H264_DEC_DEBUG_PRINT("FRAME %d First MB in slice: %d\n", u2_frame_num, u2_first_mb_in_slice);
1136
1137 COPYTHECONTEXT("SH: frame_num", u2_frame_num);
1138// 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);
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301139 if(!ps_dec->u1_first_slice_in_stream && ps_dec->u4_first_slice_in_pic)
Harish Mahendrakar49456122017-01-05 12:10:47 +05301140 {
1141 pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
1142 pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301143
Harish Mahendrakar49456122017-01-05 12:10:47 +05301144 ps_dec->u2_mbx = 0xffff;
1145 ps_dec->u2_mby = 0;
1146
1147 if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
1148 ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
1149
1150 if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5)
1151 ps_dec->u2_prev_ref_frame_num = 0;
1152
1153 if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag)
1154 {
1155 ih264d_decode_gaps_in_frame_num(ps_dec, u2_frame_num);
1156 }
1157
1158 ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
1159 ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
1160 ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
1161 if(ps_cur_slice->u1_nal_ref_idc)
1162 {
1163 ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
1164 ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
1165 ps_prev_poc->i4_delta_pic_order_cnt_bottom =
1166 ps_cur_poc->i4_delta_pic_order_cnt_bottom;
1167 ps_prev_poc->i4_delta_pic_order_cnt[0] =
1168 ps_cur_poc->i4_delta_pic_order_cnt[0];
1169 ps_prev_poc->i4_delta_pic_order_cnt[1] =
1170 ps_cur_poc->i4_delta_pic_order_cnt[1];
1171 ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
1172 }
1173
1174 ps_dec->u2_total_mbs_coded = 0;
1175 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301176 /* Get the field related flags */
1177 if(!ps_seq->u1_frame_mbs_only_flag)
1178 {
1179
1180 u1_field_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
1181 COPYTHECONTEXT("SH: field_pic_flag", u1_field_pic_flag);
1182 u1_bottom_field_flag = 0;
1183
1184 if(u1_field_pic_flag)
1185 {
1186 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
1187 u1_bottom_field_flag = ih264d_get_bit_h264(ps_bitstrm);
1188 COPYTHECONTEXT("SH: bottom_field_flag", u1_bottom_field_flag);
1189
1190 }
1191 else
1192 {
1193 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
1194 }
1195 }
1196 else
1197 {
1198 u1_field_pic_flag = 0;
1199 u1_bottom_field_flag = 0;
1200
1201 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
1202 }
1203
1204 u1_nal_unit_type = SLICE_NAL;
1205 if(u1_is_idr_slice)
1206 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301207 u1_nal_unit_type = IDR_SLICE_NAL;
1208 u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst,
1209 pu4_bitstrm_buf);
1210 if(u4_idr_pic_id > 65535)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301211 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301212 COPYTHECONTEXT("SH: ", u4_idr_pic_id);
1213 }
1214
1215 /* read delta pic order count information*/
1216 i_delta_poc[0] = i_delta_poc[1] = 0;
1217 s_tmp_poc.i4_pic_order_cnt_lsb = 0;
1218 s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
1219 u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type;
1220 if(u1_pic_order_cnt_type == 0)
1221 {
1222 i_temp = ih264d_get_bits_h264(
1223 ps_bitstrm,
1224 ps_seq->u1_log2_max_pic_order_cnt_lsb_minus);
1225 if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301226 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301227 s_tmp_poc.i4_pic_order_cnt_lsb = i_temp;
1228 COPYTHECONTEXT("SH: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb);
1229
1230 if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag))
1231 {
1232 s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev(
1233 pu4_bitstrm_ofst, pu4_bitstrm_buf);
1234 //if(s_tmp_poc.i4_delta_pic_order_cnt_bottom > ps_seq->i4_max_pic_order_cntLsb)
1235 COPYTHECONTEXT("SH: delta_pic_order_cnt_bottom",
1236 s_tmp_poc.i4_delta_pic_order_cnt_bottom);
1237 }
1238 }
1239
1240 s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
1241 s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
1242 if(u1_pic_order_cnt_type == 1
1243 && (!ps_seq->u1_delta_pic_order_always_zero_flag))
1244 {
1245 s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst,
1246 pu4_bitstrm_buf);
1247 COPYTHECONTEXT("SH: delta_pic_order_cnt[0]",
1248 s_tmp_poc.i4_delta_pic_order_cnt[0]);
1249
1250 if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag)
1251 {
1252 s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev(
1253 pu4_bitstrm_ofst, pu4_bitstrm_buf);
1254 COPYTHECONTEXT("SH: delta_pic_order_cnt[1]",
1255 s_tmp_poc.i4_delta_pic_order_cnt[1]);
1256 }
1257 }
1258
1259 if(ps_pps->u1_redundant_pic_cnt_present_flag)
1260 {
1261 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1262 if(u4_temp > MAX_REDUNDANT_PIC_CNT)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301263 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301264 u1_redundant_pic_cnt = u4_temp;
1265 COPYTHECONTEXT("SH: redundant_pic_cnt", u1_redundant_pic_cnt);
1266 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001267
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301268 /*--------------------------------------------------------------------*/
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001269 /* Check if the slice is part of new picture */
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301270 /*--------------------------------------------------------------------*/
Harish Mahendrakar8b5fd8f2016-04-26 16:36:03 +05301271 /* First slice of a picture is always considered as part of new picture */
1272 i1_is_end_of_poc = 1;
1273 ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC;
1274
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301275 if(ps_dec->u4_first_slice_in_pic == 0)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301276 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301277 i1_is_end_of_poc = ih264d_is_end_of_pic(u2_frame_num, u1_nal_ref_idc,
1278 &s_tmp_poc, &ps_dec->s_cur_pic_poc,
1279 ps_cur_slice, u1_pic_order_cnt_type,
1280 u1_nal_unit_type, u4_idr_pic_id,
1281 u1_field_pic_flag,
1282 u1_bottom_field_flag);
Harish Mahendrakar49456122017-01-05 12:10:47 +05301283 if(i1_is_end_of_poc)
1284 {
1285 ps_dec->u1_first_slice_in_stream = 0;
1286 return ERROR_INCOMPLETE_FRAME;
1287 }
1288
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001289 }
1290
1291 /*--------------------------------------------------------------------*/
1292 /* Check for error in slice and parse the missing/corrupted MB's */
1293 /* as skip-MB's in an inserted P-slice */
1294 /*--------------------------------------------------------------------*/
1295 u1_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
1296 prev_slice_err = 0;
1297
1298 if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream)
1299 {
1300 if(u2_frame_num != ps_dec->u2_prv_frame_num
1301 && ps_dec->u1_top_bottom_decoded != 0
1302 && ps_dec->u1_top_bottom_decoded
1303 != (TOP_FIELD_ONLY | BOT_FIELD_ONLY))
1304 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301305 ps_dec->u1_dangling_field = 1;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001306 if(ps_dec->u4_first_slice_in_pic)
1307 {
1308 // first slice - dangling field
1309 prev_slice_err = 1;
1310 }
1311 else
1312 {
1313 // last slice - dangling field
1314 prev_slice_err = 2;
1315 }
1316
1317 if(ps_dec->u1_top_bottom_decoded ==TOP_FIELD_ONLY)
1318 ps_cur_slice->u1_bottom_field_flag = 1;
1319 else
1320 ps_cur_slice->u1_bottom_field_flag = 0;
1321
1322 num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1323 - ps_dec->u2_total_mbs_coded;
1324 ps_cur_poc = &ps_dec->s_cur_pic_poc;
1325
1326 u1_is_idr_slice = ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL;
1327 }
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301328 else if(ps_dec->u4_first_slice_in_pic)
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001329 {
1330 if(u2_first_mb_in_slice > 0)
1331 {
1332 // first slice - missing/header corruption
1333 prev_slice_err = 1;
1334 num_mb_skipped = u2_first_mb_in_slice << u1_mbaff;
1335 ps_cur_poc = &s_tmp_poc;
1336
1337 // initializing slice parameters
1338 ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1339 ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1340 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1341 ps_cur_slice->i4_pic_order_cnt_lsb =
1342 s_tmp_poc.i4_pic_order_cnt_lsb;
1343 ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1344 ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1345 ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1346 ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
Harish Mahendrakar1d5640f2016-12-15 18:04:53 +05301347 ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag
1348 && (!u1_field_pic_flag);
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001349 }
1350 }
1351 else
1352 {
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301353 /* since i1_is_end_of_poc is set ,means new frame num is encountered. so conceal the current frame
1354 * completely */
1355 prev_slice_err = 2;
1356 num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs
1357 * ps_dec->u2_frm_wd_in_mbs)
1358 - ps_dec->u2_total_mbs_coded;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001359 ps_cur_poc = &s_tmp_poc;
1360 }
1361 }
1362 else
1363 {
1364 if((u2_first_mb_in_slice << u1_mbaff) > ps_dec->u2_total_mbs_coded)
1365 {
1366 // previous slice - missing/corruption
1367 prev_slice_err = 2;
1368 num_mb_skipped = (u2_first_mb_in_slice << u1_mbaff)
1369 - ps_dec->u2_total_mbs_coded;
1370 ps_cur_poc = &s_tmp_poc;
1371 }
1372 else if((u2_first_mb_in_slice << u1_mbaff) < ps_dec->u2_total_mbs_coded)
1373 {
1374 return ERROR_CORRUPTED_SLICE;
1375 }
1376 }
1377
1378 if(prev_slice_err)
1379 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301380 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 -07001381
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301382 if(ps_dec->u1_dangling_field == 1)
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001383 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301384 ps_dec->u1_second_field = 1 - ps_dec->u1_second_field;
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301385 ps_dec->u1_first_slice_in_stream = 0;
Hamsalekha S252628c2017-08-01 14:51:55 +05301386 ps_dec->u1_top_bottom_decoded = TOP_FIELD_ONLY | BOT_FIELD_ONLY;
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301387 return ERROR_DANGLING_FIELD_IN_PIC;
1388 }
1389
1390 if(prev_slice_err == 2)
1391 {
1392 ps_dec->u1_first_slice_in_stream = 0;
1393 return ERROR_INCOMPLETE_FRAME;
1394 }
1395
1396 if(ps_dec->u2_total_mbs_coded
1397 >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1398 {
1399 /* return if all MBs in frame are parsed*/
1400 ps_dec->u1_first_slice_in_stream = 0;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001401 return ERROR_IN_LAST_SLICE_OF_PIC;
1402 }
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301403
1404 if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
1405 {
1406 ih264d_err_pic_dispbuf_mgr(ps_dec);
1407 return ERROR_NEW_FRAME_EXPECTED;
1408 }
1409
1410 if(ret != OK)
1411 return ret;
1412
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001413 i1_is_end_of_poc = 0;
1414 }
1415
1416 if (ps_dec->u4_first_slice_in_pic == 0)
Harish Mahendrakar5e4f64c2016-06-01 13:31:45 +05301417 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001418 ps_dec->ps_parse_cur_slice++;
Harish Mahendrakar5e4f64c2016-06-01 13:31:45 +05301419 ps_dec->u2_cur_slice_num++;
1420 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001421
Harish Mahendrakarbc71ad22016-09-17 17:00:37 +05301422 // in the case of single core increment ps_decode_cur_slice
1423 if((ps_dec->u1_separate_parse == 0) && (ps_dec->u4_first_slice_in_pic == 0))
1424 {
1425 ps_dec->ps_decode_cur_slice++;
1426 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001427 ps_dec->u1_slice_header_done = 0;
1428
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001429
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301430 if(u1_field_pic_flag)
1431 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301432 ps_dec->u2_prv_frame_num = u2_frame_num;
1433 }
1434
1435 if(ps_cur_slice->u1_mmco_equalto5)
1436 {
1437 WORD32 i4_temp_poc;
1438 WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
1439
1440 if(!ps_cur_slice->u1_field_pic_flag) // or a complementary field pair
1441 {
1442 i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1443 i4_bot_field_order_poc =
1444 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1445 i4_temp_poc = MIN(i4_top_field_order_poc,
1446 i4_bot_field_order_poc);
1447 }
1448 else if(!ps_cur_slice->u1_bottom_field_flag)
1449 i4_temp_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1450 else
1451 i4_temp_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1452
1453 ps_dec->ps_cur_pic->i4_top_field_order_cnt = i4_temp_poc
1454 - ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1455 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = i4_temp_poc
1456 - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1457 ps_dec->ps_cur_pic->i4_poc = i4_temp_poc;
1458 ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
1459 }
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301460 if(ps_dec->u4_first_slice_in_pic)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301461 {
1462 ret = ih264d_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num,
1463 &ps_dec->s_prev_pic_poc,
1464 &s_tmp_poc, ps_cur_slice, ps_pps,
1465 u1_nal_ref_idc,
1466 u1_bottom_field_flag,
1467 u1_field_pic_flag, &i4_poc);
1468 if(ret != OK)
1469 return ret;
1470 /* Display seq no calculations */
1471 if(i4_poc >= ps_dec->i4_max_poc)
1472 ps_dec->i4_max_poc = i4_poc;
1473 /* IDR Picture or POC wrap around */
1474 if(i4_poc == 0)
1475 {
Ritu Baldwa49afc8f2018-04-10 18:20:17 +05301476 UWORD64 u8_temp;
1477 u8_temp = (UWORD64)ps_dec->i4_prev_max_display_seq
1478 + ps_dec->i4_max_poc
1479 + ps_dec->u1_max_dec_frame_buffering + 1;
1480 /*If i4_prev_max_display_seq overflows integer range, reset it */
1481 ps_dec->i4_prev_max_display_seq = (u8_temp > 0x7fffffff)?
1482 0 : u8_temp;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301483 ps_dec->i4_max_poc = 0;
1484 }
1485 }
1486
1487 /*--------------------------------------------------------------------*/
1488 /* Copy the values read from the bitstream to the slice header and then*/
1489 /* If the slice is first slice in picture, then do Start of Picture */
1490 /* processing. */
1491 /*--------------------------------------------------------------------*/
1492 ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0];
1493 ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1];
1494 ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1495 ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice;
1496 ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1497 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1498 ps_cur_slice->u1_slice_type = u1_slice_type;
1499 ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
1500
1501 ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1502 ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1503 ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1504 ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
1505
1506 if(ps_seq->u1_frame_mbs_only_flag)
1507 ps_cur_slice->u1_direct_8x8_inference_flag =
1508 ps_seq->u1_direct_8x8_inference_flag;
1509 else
1510 ps_cur_slice->u1_direct_8x8_inference_flag = 1;
1511
1512 if(u1_slice_type == B_SLICE)
1513 {
1514 ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(
1515 ps_bitstrm);
1516 COPYTHECONTEXT("SH: direct_spatial_mv_pred_flag",
1517 ps_cur_slice->u1_direct_spatial_mv_pred_flag);
1518
1519 if(ps_cur_slice->u1_direct_spatial_mv_pred_flag)
1520 ps_cur_slice->pf_decodeDirect = ih264d_decode_spatial_direct;
1521 else
1522 ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct;
1523 if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag)))
1524 ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB;
1525 }
1526 else
1527 {
1528 if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag)))
1529 ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
1530 }
1531
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301532 if(ps_dec->u4_first_slice_in_pic)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301533 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301534 if(u2_first_mb_in_slice == 0)
1535 {
1536 ret = ih264d_start_of_pic(ps_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps);
1537 if(ret != OK)
1538 return ret;
1539 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301540
1541 ps_dec->u4_output_present = 0;
1542
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301543 {
1544 ih264d_get_next_display_field(ps_dec,
1545 ps_dec->ps_out_buffer,
1546 &(ps_dec->s_disp_op));
1547 /* If error code is non-zero then there is no buffer available for display,
1548 hence avoid format conversion */
1549
1550 if(0 != ps_dec->s_disp_op.u4_error_code)
1551 {
1552 ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301553 }
1554 else
1555 ps_dec->u4_output_present = 1;
1556 }
1557 if(ps_dec->u1_separate_parse == 1)
1558 {
1559 if(ps_dec->u4_dec_thread_created == 0)
1560 {
1561 ithread_create(ps_dec->pv_dec_thread_handle, NULL,
1562 (void *)ih264d_decode_picture_thread,
1563 (void *)ps_dec);
1564
1565 ps_dec->u4_dec_thread_created = 1;
1566 }
1567
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001568 if((ps_dec->u4_num_cores == 3) &&
1569 ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301570 && (ps_dec->u4_bs_deblk_thread_created == 0))
1571 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001572 ps_dec->u4_start_recon_deblk = 0;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301573 ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL,
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001574 (void *)ih264d_recon_deblk_thread,
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301575 (void *)ps_dec);
1576 ps_dec->u4_bs_deblk_thread_created = 1;
1577 }
1578 }
1579
1580 }
1581
1582 /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */
1583 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001584 UWORD8 uc_nofield_nombaff;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301585
1586
1587
1588 uc_nofield_nombaff = ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0)
1589 && (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0)
1590 && (u1_slice_type != B_SLICE)
1591 && (ps_dec->ps_cur_pps->u1_wted_pred_flag == 0));
1592
1593 /* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */
1594
1595 if(uc_nofield_nombaff)
1596 {
1597 ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
1598 ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
1599 }
1600 else
1601 {
1602 ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp;
1603 ps_dec->p_motion_compensate = ih264d_motion_compensate_mp;
1604 }
1605
1606
1607 }
1608
1609 /*
1610 * Decide whether to decode the current picture or not
1611 */
1612 {
1613 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
1614 if(ps_err->u4_frm_sei_sync == u2_frame_num)
1615 {
1616 ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1617 ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
1618 }
1619 ps_err->u4_cur_frm = u2_frame_num;
1620 }
1621
1622 /* Decision for decoding if the picture is to be skipped */
1623 {
1624 WORD32 i4_skip_b_pic, i4_skip_p_pic;
1625
1626 i4_skip_b_pic = (ps_dec->u4_skip_frm_mask & B_SLC_BIT)
1627 && (B_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc);
1628
1629 i4_skip_p_pic = (ps_dec->u4_skip_frm_mask & P_SLC_BIT)
1630 && (P_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc);
1631
1632 /**************************************************************/
1633 /* Skip the B picture if skip mask is set for B picture and */
1634 /* Current B picture is a non reference B picture or there is */
1635 /* no user for reference B picture */
1636 /**************************************************************/
1637 if(i4_skip_b_pic)
1638 {
1639 ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1640 /* Don't decode the picture in SKIP-B mode if that picture is B */
1641 /* and also it is not to be used as a reference picture */
1642 ps_dec->u1_last_pic_not_decoded = 1;
1643
1644 return OK;
1645 }
1646 /**************************************************************/
1647 /* Skip the P picture if skip mask is set for P picture and */
1648 /* Current P picture is a non reference P picture or there is */
1649 /* no user for reference P picture */
1650 /**************************************************************/
1651 if(i4_skip_p_pic)
1652 {
1653 ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1654 /* Don't decode the picture in SKIP-P mode if that picture is P */
1655 /* and also it is not to be used as a reference picture */
1656 ps_dec->u1_last_pic_not_decoded = 1;
1657
1658 return OK;
1659 }
1660 }
1661
1662 {
1663 UWORD16 u2_mb_x, u2_mb_y;
1664
1665 ps_dec->i4_submb_ofst = ((u2_first_mb_in_slice
1666 << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE)
1667 - SUB_BLK_SIZE;
1668 if(u2_first_mb_in_slice)
1669 {
1670 UWORD8 u1_mb_aff;
1671 UWORD8 u1_field_pic;
1672 UWORD16 u2_frm_wd_in_mbs;
1673 u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
1674 u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag;
1675 u1_field_pic = ps_cur_slice->u1_field_pic_flag;
1676
1677 {
1678 UWORD32 x_offset;
1679 UWORD32 y_offset;
1680 UWORD32 u4_frame_stride;
1681 tfr_ctxt_t *ps_trns_addr; // = &ps_dec->s_tran_addrecon_parse;
1682
1683 if(ps_dec->u1_separate_parse)
1684 {
1685 ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1686 }
1687 else
1688 {
1689 ps_trns_addr = &ps_dec->s_tran_addrecon;
1690 }
1691 u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1692 u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1693
1694 u2_mb_y <<= u1_mb_aff;
1695
1696 if((u2_mb_x > u2_frm_wd_in_mbs - 1)
1697 || (u2_mb_y > ps_dec->u2_frm_ht_in_mbs - 1))
1698 {
1699 return ERROR_CORRUPTED_SLICE;
1700 }
1701
1702 u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic;
1703 x_offset = u2_mb_x << 4;
1704 y_offset = (u2_mb_y * u4_frame_stride) << 4;
1705
1706 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset
1707 + y_offset;
1708
1709 u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic;
1710 x_offset >>= 1;
1711 y_offset = (u2_mb_y * u4_frame_stride) << 3;
1712
1713 x_offset *= YUV420SP_FACTOR;
1714
1715 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset
1716 + y_offset;
1717 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset
1718 + y_offset;
1719
1720 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1721 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1722 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1723
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301724
1725 // assign the deblock structure pointers to start of slice
1726 if(ps_dec->u1_separate_parse == 1)
1727 {
1728 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic
1729 + (u2_first_mb_in_slice << u1_mb_aff);
1730 }
1731 else
1732 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301733 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic
1734 + (u2_first_mb_in_slice << u1_mb_aff);
1735 }
1736
1737 ps_dec->u2_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff);
1738
1739 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv
1740 + ((u2_first_mb_in_slice << u1_mb_aff) << 4);
1741 }
1742 }
1743 else
1744 {
1745 tfr_ctxt_t *ps_trns_addr;
1746
1747 if(ps_dec->u1_separate_parse)
1748 {
1749 ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1750 }
1751 else
1752 {
1753 ps_trns_addr = &ps_dec->s_tran_addrecon;
1754 }
1755
1756 u2_mb_x = 0xffff;
1757 u2_mb_y = 0;
1758 // assign the deblock structure pointers to start of slice
1759 ps_dec->u2_cur_mb_addr = 0;
1760 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301761 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
1762 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
1763 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
1764 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
1765
1766 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1767 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1768 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1769
1770 }
1771
1772 ps_dec->ps_part = ps_dec->ps_parse_part_params;
1773
1774 ps_dec->u2_mbx =
1775 (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1776 ps_dec->u2_mby =
1777 (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1778 ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag;
1779 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1780 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1781 }
1782
1783 /* RBSP stop bit is used for CABAC decoding*/
1784 ps_bitstrm->u4_max_ofst += ps_dec->ps_cur_pps->u1_entropy_coding_mode;
1785
1786 ps_dec->u1_B = (u1_slice_type == B_SLICE);
1787 ps_dec->u4_next_mb_skip = 0;
1788
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301789 ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice =
1790 ps_dec->ps_cur_slice->u2_first_mb_in_slice;
1791 ps_dec->ps_parse_cur_slice->slice_type =
1792 ps_dec->ps_cur_slice->u1_slice_type;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301793
1794
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001795 ps_dec->u4_start_recon_deblk = 1;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301796 {
1797 WORD32 num_entries;
1798 WORD32 size;
1799 UWORD8 *pu1_buf;
1800
Harish Mahendrakar251b0072015-08-04 09:55:15 +05301801 num_entries = MAX_FRAMES;
1802 if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) &&
1803 (0 == ps_dec->i4_display_delay))
1804 {
1805 num_entries = 1;
1806 }
1807 num_entries = ((2 * num_entries) + 1);
Hamsalekha Sa925a6b2017-04-21 11:01:52 +05301808 num_entries *= 2;
1809
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301810
1811 size = num_entries * sizeof(void *);
1812 size += PAD_MAP_IDX_POC * sizeof(void *);
1813
1814 pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
1815 pu1_buf += size * ps_dec->u2_cur_slice_num;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001816 ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = ( void *)pu1_buf;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301817 }
1818
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001819 if(ps_dec->u1_separate_parse)
1820 {
1821 ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
1822 }
1823 else
1824 {
1825 ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1826 }
1827
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301828 if(u1_slice_type == I_SLICE)
1829 {
1830 ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT;
1831
1832 ret = ih264d_parse_islice(ps_dec, u2_first_mb_in_slice);
Ritu Baldwaaecdfd12018-01-16 13:48:41 +05301833 ps_dec->u1_pr_sl_type = u1_slice_type;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301834 if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE)
1835 ps_dec->i4_pic_type = I_SLICE;
1836
1837 }
1838 else if(u1_slice_type == P_SLICE)
1839 {
1840 ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1841 ret = ih264d_parse_pslice(ps_dec, u2_first_mb_in_slice);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301842 ps_dec->u1_pr_sl_type = u1_slice_type;
1843 if(ps_dec->i4_pic_type != B_SLICE)
1844 ps_dec->i4_pic_type = P_SLICE;
1845 }
1846 else if(u1_slice_type == B_SLICE)
1847 {
1848 ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1849 ret = ih264d_parse_bslice(ps_dec, u2_first_mb_in_slice);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301850 ps_dec->u1_pr_sl_type = u1_slice_type;
1851 ps_dec->i4_pic_type = B_SLICE;
1852 }
1853 else
1854 return ERROR_INV_SLC_TYPE_T;
1855
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001856 if(ps_dec->u1_slice_header_done)
1857 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301858 /* set to zero to indicate a valid slice has been decoded */
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001859 ps_dec->u1_first_slice_in_stream = 0;
1860 }
1861
1862 if(ret != OK)
1863 return ret;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301864
Ritu Baldwa3c70b9a2017-10-09 13:52:45 +05301865 if(u1_nal_ref_idc != 0)
1866 {
1867 if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read)
1868 {
1869 memcpy((void *)ps_dec->ps_dpb_cmds, (void *)(&(ps_dec->s_dpb_cmds_scratch)),
1870 sizeof(dpb_commands_t));
1871 }
1872 }
1873
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301874 /* storing last Mb X and MbY of the slice */
1875 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1876 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001877
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301878 /* End of Picture detection */
1879
1880 if(ps_dec->u2_total_mbs_coded >= (ps_seq->u2_max_mb_addr + 1))
1881 {
1882 ps_dec->u1_pic_decode_done = 1;
1883
1884 }
1885
1886 {
1887 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
1888 if((ps_err->u1_err_flag & REJECT_PB_PICS)
1889 && (ps_err->u1_cur_pic_type == PIC_TYPE_I))
1890 {
1891 ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1892 }
1893 }
1894
1895 PRINT_BIN_BIT_RATIO(ps_dec)
1896
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001897 return ret;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301898}
1899