blob: 944d58027a6d05d9a84394a15f0a38963e63253e [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 {
350 UWORD16 pic_wd = ps_dec->u4_width_at_init;
351 UWORD16 pic_ht = ps_dec->u4_height_at_init;
352 UWORD32 num_mbs;
353
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700354 if((NULL != ps_dec->ps_cur_sps) && (1 == (ps_dec->ps_cur_sps->u1_is_valid)))
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530355 {
356 pic_wd = ps_dec->u2_pic_wd;
357 pic_ht = ps_dec->u2_pic_ht;
358 }
359 num_mbs = (pic_wd * pic_ht) >> 8;
360
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530361 if(ps_dec->pu1_dec_mb_map)
362 {
363 memset((void *)ps_dec->pu1_dec_mb_map, 0, num_mbs);
364 }
365
366 if(ps_dec->pu1_recon_mb_map)
367 {
368
369 memset((void *)ps_dec->pu1_recon_mb_map, 0, num_mbs);
370 }
371
372 if(ps_dec->pu2_slice_num_map)
373 {
374 memset((void *)ps_dec->pu2_slice_num_map, 0,
375 (num_mbs * sizeof(UWORD16)));
376 }
377
378 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530379
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700380 ps_dec->ps_parse_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
381 ps_dec->ps_decode_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
382 ps_dec->ps_computebs_cur_slice = &(ps_dec->ps_dec_slice_buf[0]);
Harish Mahendrakar5e4f64c2016-06-01 13:31:45 +0530383 ps_dec->u2_cur_slice_num = 0;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530384
385 /* Initialize all the HP toolsets to zero */
386 ps_dec->s_high_profile.u1_scaling_present = 0;
387 ps_dec->s_high_profile.u1_transform8x8_present = 0;
388
389 /* Get Next Free Picture */
390 if(1 == ps_dec->u4_share_disp_buf)
391 {
392 UWORD32 i;
393 /* Free any buffer that is in the queue to be freed */
394 for(i = 0; i < MAX_DISP_BUFS_NEW; i++)
395 {
396 if(0 == ps_dec->u4_disp_buf_to_be_freed[i])
397 continue;
398 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr, i,
399 BUF_MGR_IO);
400 ps_dec->u4_disp_buf_to_be_freed[i] = 0;
401 ps_dec->u4_disp_buf_mapping[i] = 0;
402
403 }
404 }
405 if(!(u1_field_pic_flag && 0 != ps_dec->u1_top_bottom_decoded)) //ps_dec->u1_second_field))
406 {
407 pic_buffer_t *ps_cur_pic;
408 WORD32 cur_pic_buf_id, cur_mv_buf_id;
409 col_mv_buf_t *ps_col_mv;
410 while(1)
411 {
412 ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free(
413 (buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
414 &cur_pic_buf_id);
415 if(ps_cur_pic == NULL)
416 {
417 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
418 return ERROR_UNAVAIL_PICBUF_T;
419 }
420 if(0 == ps_dec->u4_disp_buf_mapping[cur_pic_buf_id])
421 {
422 break;
423 }
424
425 }
426 ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
427 &cur_mv_buf_id);
428 if(ps_col_mv == NULL)
429 {
430 ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
431 return ERROR_UNAVAIL_MVBUF_T;
432 }
433
434 ps_dec->ps_cur_pic = ps_cur_pic;
435 ps_dec->u1_pic_buf_id = cur_pic_buf_id;
436 ps_cur_pic->u4_ts = ps_dec->u4_ts;
437
438
439 ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
440 ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id;
441
442 ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag;
443 ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv;
444 ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
Harish Mahendrakarf6344812016-12-15 18:04:53 +0530445
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700446 {
447 /*make first entry of list0 point to cur pic,so that if first Islice is in error, ref pic struct will have valid entries*/
448 ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0];
449 *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][0]) = *ps_cur_pic;
Harish Mahendrakarbc71ad22016-09-17 17:00:37 +0530450 /* Initialize for field reference as well */
451 *(ps_dec->ps_dpb_mgr->ps_init_dpb[0][MAX_REF_BUFS]) = *ps_cur_pic;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700452 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530453
454 if(!ps_dec->ps_cur_pic)
455 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530456 WORD32 j;
Martin Storsjo086dd8e2015-06-13 00:35:01 +0300457 H264_DEC_DEBUG_PRINT("------- Display Buffers Reset --------\n");
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530458 for(j = 0; j < MAX_DISP_BUFS_NEW; j++)
459 {
460
461 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
462 j,
463 BUF_MGR_REF);
464 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
465 ps_dec->au1_pic_buf_id_mv_buf_id_map[j],
466 BUF_MGR_REF);
467 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
468 j,
469 BUF_MGR_IO);
470 }
471
472 ps_dec->i4_cur_display_seq = 0;
473 ps_dec->i4_prev_max_display_seq = 0;
474 ps_dec->i4_max_poc = 0;
475
476 ps_cur_pic = (pic_buffer_t *)ih264_buf_mgr_get_next_free(
477 (buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
478 &cur_pic_buf_id);
479 if(ps_cur_pic == NULL)
480 {
481 ps_dec->i4_error_code = ERROR_UNAVAIL_PICBUF_T;
482 return ERROR_UNAVAIL_PICBUF_T;
483 }
484
485 ps_col_mv = (col_mv_buf_t *)ih264_buf_mgr_get_next_free((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
486 &cur_mv_buf_id);
487 if(ps_col_mv == NULL)
488 {
489 ps_dec->i4_error_code = ERROR_UNAVAIL_MVBUF_T;
490 return ERROR_UNAVAIL_MVBUF_T;
491 }
492
493 ps_dec->ps_cur_pic = ps_cur_pic;
494 ps_dec->u1_pic_buf_id = cur_pic_buf_id;
495 ps_cur_pic->u4_ts = ps_dec->u4_ts;
496 ps_dec->apv_buf_id_pic_buf_map[cur_pic_buf_id] = (void *)ps_cur_pic;
497
498 ps_cur_pic->u1_mv_buf_id = cur_mv_buf_id;
499 ps_dec->au1_pic_buf_id_mv_buf_id_map[cur_pic_buf_id] = cur_mv_buf_id;
500
501 ps_cur_pic->pu1_col_zero_flag = (UWORD8 *)ps_col_mv->pv_col_zero_flag;
502 ps_cur_pic->ps_mv = (mv_pred_t *)ps_col_mv->pv_mv;
503 ps_dec->au1_pic_buf_ref_flag[cur_pic_buf_id] = 0;
504
505 }
506
507 ps_dec->ps_cur_pic->u1_picturetype = u1_field_pic_flag;
508 ps_dec->ps_cur_pic->u4_pack_slc_typ = SKIP_NONE;
509 H264_DEC_DEBUG_PRINT("got a buffer\n");
510 }
511 else
512 {
513 H264_DEC_DEBUG_PRINT("did not get a buffer\n");
514 }
515
516 ps_dec->u4_pic_buf_got = 1;
517
518 ps_dec->ps_cur_pic->i4_poc = i4_poc;
519 ps_dec->ps_cur_pic->i4_frame_num = u2_frame_num;
520 ps_dec->ps_cur_pic->i4_pic_num = u2_frame_num;
521 ps_dec->ps_cur_pic->i4_top_field_order_cnt = ps_pps->i4_top_field_order_cnt;
522 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt =
523 ps_pps->i4_bottom_field_order_cnt;
524 ps_dec->ps_cur_pic->i4_avg_poc = ps_pps->i4_avg_poc;
525 ps_dec->ps_cur_pic->u4_time_stamp = ps_dec->u4_pts;
526
527 ps_dec->s_cur_pic = *(ps_dec->ps_cur_pic);
528 if(u1_field_pic_flag && u1_bottom_field_flag)
529 {
530 WORD32 i4_temp_poc;
531 WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
532 /* Point to odd lines, since it's bottom field */
533 ps_dec->s_cur_pic.pu1_buf1 += ps_dec->s_cur_pic.u2_frm_wd_y;
534 ps_dec->s_cur_pic.pu1_buf2 += ps_dec->s_cur_pic.u2_frm_wd_uv;
535 ps_dec->s_cur_pic.pu1_buf3 += ps_dec->s_cur_pic.u2_frm_wd_uv;
536 ps_dec->s_cur_pic.ps_mv +=
537 ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
538 ps_dec->s_cur_pic.pu1_col_zero_flag += ((ps_dec->u2_pic_ht
539 * ps_dec->u2_pic_wd) >> 5);
540 ps_dec->ps_cur_pic->u1_picturetype |= BOT_FLD;
541 i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
542 i4_bot_field_order_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
543 i4_temp_poc = MIN(i4_top_field_order_poc,
544 i4_bot_field_order_poc);
545 ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
546 }
547
548 ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag
549 && (!u1_field_pic_flag);
550
551 ps_dec->ps_cur_pic->u1_picturetype |= (ps_cur_slice->u1_mbaff_frame_flag
552 << 2);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530553
554 ps_dec->ps_cur_mb_row = ps_dec->ps_nbr_mb_row; //[0];
555 ps_dec->ps_cur_mb_row++; //Increment by 1 ,so that left mb will always be valid
556 ps_dec->ps_top_mb_row =
557 ps_dec->ps_nbr_mb_row
558 + ((ps_dec->u2_frm_wd_in_mbs + 1)
559 << (1
560 - ps_dec->ps_cur_sps->u1_frame_mbs_only_flag));
561 ps_dec->ps_top_mb_row++; //Increment by 1 ,so that left mb will always be valid
562
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530563 ps_dec->pu1_y = ps_dec->pu1_y_scratch[0];
564 ps_dec->pu1_u = ps_dec->pu1_u_scratch[0];
565 ps_dec->pu1_v = ps_dec->pu1_v_scratch[0];
566 ps_dec->u1_yuv_scratch_idx = 0;
567 /* CHANGED CODE */
568 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
569 ps_dec->ps_mv_top = ps_dec->ps_mv_top_p[0];
570 /* CHANGED CODE */
571 ps_dec->u1_mv_top_p = 0;
572 ps_dec->u1_mb_idx = 0;
573 /* CHANGED CODE */
574 ps_dec->ps_mv_left = ps_dec->s_cur_pic.ps_mv;
575 ps_dec->pu1_yleft = 0;
576 ps_dec->pu1_uleft = 0;
577 ps_dec->pu1_vleft = 0;
578 ps_dec->u1_not_wait_rec = 2;
579 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;
618 ps_dec->ps_deblk_mbn_curr = ps_dec->ps_deblk_mbn;
619 ps_dec->ps_deblk_mbn_prev = ps_dec->ps_deblk_mbn + ps_dec->u1_recon_mb_grp;
620 /* Initialize The Function Pointer Depending Upon the Entropy and MbAff Flag */
621 {
622 if(ps_cur_slice->u1_mbaff_frame_flag)
623 {
624 ps_dec->pf_compute_bs = ih264d_compute_bs_mbaff;
625 ps_dec->pf_mvpred = ih264d_mvpred_mbaff;
626 }
627 else
628 {
629 ps_dec->pf_compute_bs = ih264d_compute_bs_non_mbaff;
630 ps_dec->u1_cur_mb_fld_dec_flag = ps_cur_slice->u1_field_pic_flag;
631 }
632 }
633 /* Set up the Parameter for DMA transfer */
634 {
635 UWORD8 u1_field_pic_flag = ps_dec->ps_cur_slice->u1_field_pic_flag;
636
637 UWORD8 u1_mbaff = ps_cur_slice->u1_mbaff_frame_flag;
638
639 UWORD8 uc_lastmbs = (((ps_dec->u2_pic_wd) >> 4)
640 % (ps_dec->u1_recon_mb_grp >> u1_mbaff));
641 UWORD16 ui16_lastmbs_widthY =
642 (uc_lastmbs ? (uc_lastmbs << 4) : ((ps_dec->u1_recon_mb_grp
643 >> u1_mbaff) << 4));
644 UWORD16 ui16_lastmbs_widthUV =
645 uc_lastmbs ? (uc_lastmbs << 3) : ((ps_dec->u1_recon_mb_grp
646 >> u1_mbaff) << 3);
647
648 ps_dec->s_tran_addrecon.pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
649 ps_dec->s_tran_addrecon.pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
650 ps_dec->s_tran_addrecon.pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
651
652 ps_dec->s_tran_addrecon.u2_frm_wd_y = ps_dec->u2_frm_wd_y
653 << u1_field_pic_flag;
654 ps_dec->s_tran_addrecon.u2_frm_wd_uv = ps_dec->u2_frm_wd_uv
655 << u1_field_pic_flag;
656
657 if(u1_field_pic_flag)
658 {
659 ui16_lastmbs_widthY += ps_dec->u2_frm_wd_y;
660 ui16_lastmbs_widthUV += ps_dec->u2_frm_wd_uv;
661 }
662
663 /* Normal Increment of Pointer */
664 ps_dec->s_tran_addrecon.u4_inc_y[0] = ((ps_dec->u1_recon_mb_grp << 4)
665 >> u1_mbaff);
666 ps_dec->s_tran_addrecon.u4_inc_uv[0] = ((ps_dec->u1_recon_mb_grp << 4)
667 >> u1_mbaff);
668
669 /* End of Row Increment */
670 ps_dec->s_tran_addrecon.u4_inc_y[1] = (ui16_lastmbs_widthY
671 + (PAD_LEN_Y_H << 1)
672 + ps_dec->s_tran_addrecon.u2_frm_wd_y
673 * ((15 << u1_mbaff) + u1_mbaff));
674 ps_dec->s_tran_addrecon.u4_inc_uv[1] = (ui16_lastmbs_widthUV
675 + (PAD_LEN_UV_H << 2)
676 + ps_dec->s_tran_addrecon.u2_frm_wd_uv
677 * ((15 << u1_mbaff) + u1_mbaff));
678
679 /* Assign picture numbers to each frame/field */
680 /* only once per picture. */
681 ih264d_assign_pic_num(ps_dec);
682 ps_dec->s_tran_addrecon.u2_mv_top_left_inc = (ps_dec->u1_recon_mb_grp
683 << 2) - 1 - (u1_mbaff << 2);
684 ps_dec->s_tran_addrecon.u2_mv_left_inc = ((ps_dec->u1_recon_mb_grp
685 >> u1_mbaff) - 1) << (4 + u1_mbaff);
686 }
687 /**********************************************************************/
688 /* High profile related initialization at pictrue level */
689 /**********************************************************************/
690 if(ps_seq->u1_profile_idc == HIGH_PROFILE_IDC)
691 {
692 if((ps_seq->i4_seq_scaling_matrix_present_flag)
693 || (ps_pps->i4_pic_scaling_matrix_present_flag))
694 {
695 ih264d_form_scaling_matrix_picture(ps_seq, ps_pps, ps_dec);
696 ps_dec->s_high_profile.u1_scaling_present = 1;
697 }
698 else
699 {
700 ih264d_form_default_scaling_matrix(ps_dec);
701 }
702
703 if(ps_pps->i4_transform_8x8_mode_flag)
704 {
705 ps_dec->s_high_profile.u1_transform8x8_present = 1;
706 }
707 }
708 else
709 {
710 ih264d_form_default_scaling_matrix(ps_dec);
711 }
712
713 /* required while reading the transform_size_8x8 u4_flag */
714 ps_dec->s_high_profile.u1_direct_8x8_inference_flag =
715 ps_seq->u1_direct_8x8_inference_flag;
716 ps_dec->s_high_profile.s_cavlc_ctxt = ps_dec->s_cavlc_ctxt;
717
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700718 ps_dec->i1_recon_in_thread3_flag = 1;
719 ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_addrecon;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530720 if(ps_dec->u1_separate_parse)
721 {
722 memcpy(&ps_dec->s_tran_addrecon_parse, &ps_dec->s_tran_addrecon,
723 sizeof(tfr_ctxt_t));
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700724 if(ps_dec->u4_num_cores >= 3 && ps_dec->i1_recon_in_thread3_flag)
725 {
726 memcpy(&ps_dec->s_tran_iprecon, &ps_dec->s_tran_addrecon,
727 sizeof(tfr_ctxt_t));
728 ps_dec->ps_frame_buf_ip_recon = &ps_dec->s_tran_iprecon;
729 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530730 }
731
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700732
733 ih264d_init_deblk_tfr_ctxt(ps_dec,&(ps_dec->s_pad_mgr), &(ps_dec->s_tran_addrecon),
734 ps_dec->u2_frm_wd_in_mbs, 0);
735
736 ps_dec->ps_cur_deblk_mb = ps_dec->ps_deblk_pic;
737 ps_dec->u4_cur_deblk_mb_num = 0;
738
739 ps_dec->u4_deblk_mb_x = 0;
740 ps_dec->u4_deblk_mb_y = 0;
Harish Mahendrakar33db7a02016-04-20 16:13:52 +0530741 ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -0700742
Harish Mahendrakar0b23c812017-01-16 14:43:42 +0530743 ps_dec->u4_first_slice_in_pic = 0;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530744 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
745 return OK;
746}
747
748/*!
749 **************************************************************************
750 * \if Function name : ih264d_deblock_display \endif
751 *
752 * \brief : The function callls the deblocking routine and manages
753 : the Recon buffers and displays .
754 * \return : Nothing
755 *
756 **************************************************************************
757 */
758WORD32 ih264d_end_of_pic_dispbuf_mgr(dec_struct_t * ps_dec)
759{
760 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
761 UWORD8 u1_num_of_users = 0;
762 WORD32 ret;
763
764 H264_MUTEX_LOCK(&ps_dec->process_disp_mutex);
765 if(1)
766 {
767
768 {
769 ih264d_delete_nonref_nondisplay_pics(ps_dec->ps_dpb_mgr);
770 if(ps_cur_slice->u1_mmco_equalto5
771 || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
772 {
773 ps_dec->ps_cur_pic->i4_poc = 0;
774 if(ps_dec->u2_total_mbs_coded
775 == (ps_dec->ps_cur_sps->u2_max_mb_addr + 1))
776 ih264d_reset_ref_bufs(ps_dec->ps_dpb_mgr);
777 ih264d_release_display_bufs(ps_dec);
778 }
779 if(ps_dec->u4_num_reorder_frames_at_init != 0)
780 {
781 ret = ih264d_assign_display_seq(ps_dec);
782 if(ret != OK)
783 return ret;
784 }
785 }
786
787 if(ps_cur_slice->u1_nal_ref_idc)
788 {
789 /* Mark pic buf as needed for reference */
790 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
791 ps_dec->u1_pic_buf_id,
792 BUF_MGR_REF);
793 /* Mark mv buf as needed for reference */
794 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
795 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
796 BUF_MGR_REF);
797 ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 1;
798 }
799
800 /* 420 consumer */
801 /* Increment the number of users by 1 for display based upon */
802 /*the SEEK KEY FRAME control sent to decoder */
803 if(((0 == ps_dec->u1_last_pic_not_decoded)
804 && (0
805 == (ps_dec->ps_cur_pic->u4_pack_slc_typ
806 & ps_dec->u4_skip_frm_mask)))
807 || (ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL))
808 {
809 /* Mark pic buf as needed for display */
810 ih264_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
811 ps_dec->u1_pic_buf_id,
812 BUF_MGR_IO);
813
814 }
815
816 if(!ps_cur_slice->u1_field_pic_flag
817 || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
818 != ps_dec->u1_top_bottom_decoded))
819 {
820 pic_buffer_t *ps_cur_pic = ps_dec->ps_cur_pic;
821 ps_cur_pic->u2_disp_width = ps_dec->u2_disp_width;
822 ps_cur_pic->u2_disp_height = ps_dec->u2_disp_height >> 1;
823
824 ps_cur_pic->u2_crop_offset_y = ps_dec->u2_crop_offset_y;
825 ps_cur_pic->u2_crop_offset_uv = ps_dec->u2_crop_offset_uv;
826 ps_cur_pic->u1_pic_type = 0;
827
828 ret = ih264d_insert_pic_in_display_list(
829 ps_dec->ps_dpb_mgr,
830 ps_dec->u1_pic_buf_id,
831 ps_dec->i4_prev_max_display_seq
832 + ps_dec->ps_cur_pic->i4_poc,
833 ps_dec->ps_cur_pic->i4_frame_num);
834 if(ret != OK)
835 return ret;
836
837 {
838 ivd_video_decode_op_t * ps_dec_output =
839 (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
840
841 ps_dec_output->u4_frame_decoded_flag = 1;
842 }
843 if(ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] == 0)
844 {
845 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
846 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
847 BUF_MGR_REF);
848 ps_dec->au1_pic_buf_ref_flag[ps_dec->u1_pic_buf_id] = 0;
849
850 }
851 }
852 else
853 {
854 H264_DEC_DEBUG_PRINT("pic not inserted display %d %d\n",
855 ps_cur_slice->u1_field_pic_flag,
856 ps_dec->u1_second_field);
857 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530858
859 if(!ps_cur_slice->u1_field_pic_flag
860 || ((TOP_FIELD_ONLY | BOT_FIELD_ONLY)
861 == ps_dec->u1_top_bottom_decoded))
862 {
863 if(ps_dec->u4_num_reorder_frames_at_init == 0)
864 {
865 ret = ih264d_assign_display_seq(ps_dec);
866 if(ret != OK)
867 return ret;
868 }
869 }
870 }
871
872 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
873
874 return OK;
875}
876
877void ih264d_err_pic_dispbuf_mgr(dec_struct_t *ps_dec)
878{
879 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
880 ivd_video_decode_op_t * ps_dec_output =
881 (ivd_video_decode_op_t *)ps_dec->pv_dec_out;
882
883 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
884 ps_dec->u1_pic_buf_id,
885 BUF_MGR_REF);
886 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_mv_buf_mgr,
887 ps_dec->au1_pic_buf_id_mv_buf_id_map[ps_dec->u1_pic_buf_id],
888 BUF_MGR_REF);
889 ih264_buf_mgr_release((buf_mgr_t *)ps_dec->pv_pic_buf_mgr,
890 ps_dec->u1_pic_buf_id,
891 BUF_MGR_IO);
892}
893
894void ih264d_deblock_picture(void *ptr)
895{
896 dec_struct_t *ps_dec = (dec_struct_t *)ptr;
897
898 {
899 /*Deblock picture only if all the mb's in the frame have been decoded*/
900 if(ps_dec->u1_pic_decode_done == 1)
901 {
902 if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag
903 || ps_dec->ps_cur_slice->u1_field_pic_flag)
904 {
905 ps_dec->p_DeblockPicture[ps_dec->ps_cur_slice->u1_mbaff_frame_flag](
906 ps_dec);
907 }
908 else
909
910 {
911
912 ih264d_deblock_picture_progressive(ps_dec);
913 }
914
915 }
916 }
917
918}
919
920/*!
921 **************************************************************************
922 * \if Function name : ih264d_deblock_display \endif
923 *
924 * \brief : The function callls the deblocking routine and manages
925 : the Recon buffers and displays .
926 * \return : Nothing
927 *
928 **************************************************************************
929 */
930WORD32 ih264d_deblock_display(dec_struct_t *ps_dec)
931{
932 WORD32 ret;
933 /* Call deblocking */
934 ih264d_deblock_picture(ps_dec);
935
936 ret = ih264d_end_of_pic_dispbuf_mgr(ps_dec);
937 if(ret != OK)
938 return ret;
939
940 return OK;
941}
942
943/*
944 *!
945 **************************************************************************
946 * \if Function name : EndofPoc \endif
947 *
948 * \brief
949 * EndofPoc Processing
950 *
951 * \return
952 * 0 on Success and Error code otherwise
953 **************************************************************************
954 */
955
Harish Mahendrakar49456122017-01-05 12:10:47 +0530956WORD32 ih264d_end_of_pic(dec_struct_t *ps_dec)
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530957{
958 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
959 WORD32 ret;
960
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530961 {
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;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530974 /*--------------------------------------------------------------------*/
975 /* ih264d_decode_pic_order_cnt - calculate the Pic Order Cnt */
976 /* Needed to detect end of picture */
977 /*--------------------------------------------------------------------*/
Hamsalekha S9f0dcba2015-06-09 15:54:31 +0530978
979 H264_MUTEX_UNLOCK(&ps_dec->process_disp_mutex);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530980
981 return OK;
982}
983
984/*!
985 **************************************************************************
986 * \if Function name : DecodeSlice \endif
987 *
988 * \brief
989 * Parses a slice
990 *
991 * \return
992 * 0 on Success and Error code otherwise
993 **************************************************************************
994 */
995
996WORD32 ih264d_parse_decode_slice(UWORD8 u1_is_idr_slice,
997 UWORD8 u1_nal_ref_idc,
998 dec_struct_t *ps_dec /* Decoder parameters */
999 )
1000{
1001 dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
1002 dec_pic_params_t *ps_pps;
1003 dec_seq_params_t *ps_seq;
1004 dec_slice_params_t *ps_cur_slice = ps_dec->ps_cur_slice;
1005 pocstruct_t s_tmp_poc;
1006 WORD32 i_delta_poc[2];
1007 WORD32 i4_poc = 0;
1008 UWORD16 u2_first_mb_in_slice, u2_frame_num;
1009 UWORD8 u1_field_pic_flag, u1_redundant_pic_cnt = 0, u1_slice_type;
1010 UWORD32 u4_idr_pic_id = 0;
1011 UWORD8 u1_bottom_field_flag, u1_pic_order_cnt_type;
1012
1013 UWORD8 u1_nal_unit_type;
1014 UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer;
1015 UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst;
1016 WORD8 i1_is_end_of_poc;
1017
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001018 WORD32 ret, end_of_frame;
1019 WORD32 prev_slice_err, num_mb_skipped;
1020 UWORD8 u1_mbaff;
1021 pocstruct_t *ps_cur_poc;
1022
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301023 UWORD32 u4_temp;
1024 WORD32 i_temp;
1025 UWORD32 u4_call_end_of_pic = 0;
1026
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301027 /* read FirstMbInSlice and slice type*/
1028 ps_dec->ps_dpb_cmds->u1_dpb_commands_read_slc = 0;
1029 u2_first_mb_in_slice = ih264d_uev(pu4_bitstrm_ofst,
1030 pu4_bitstrm_buf);
1031 if(u2_first_mb_in_slice
1032 > (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs))
1033 {
1034
1035 return ERROR_CORRUPTED_SLICE;
1036 }
1037
1038 /*we currently don not support ASO*/
1039 if(((u2_first_mb_in_slice << ps_cur_slice->u1_mbaff_frame_flag)
Harish Mahendrakaref274332017-01-16 17:10:07 +05301040 <= ps_dec->u2_cur_mb_addr) && (ps_dec->u4_first_slice_in_pic == 0))
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301041 {
1042 return ERROR_CORRUPTED_SLICE;
1043 }
1044
1045 COPYTHECONTEXT("SH: first_mb_in_slice",u2_first_mb_in_slice);
1046
1047 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1048
1049 if(u4_temp > 9)
1050 return ERROR_INV_SLC_TYPE_T;
1051
1052 u1_slice_type = u4_temp;
1053 COPYTHECONTEXT("SH: slice_type",(u1_slice_type));
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301054 /* Find Out the Slice Type is 5 to 9 or not then Set the Flag */
1055 /* u1_sl_typ_5_9 = 1 .Which tells that all the slices in the Pic*/
1056 /* will be of same type of current */
1057 if(u1_slice_type > 4)
1058 {
1059 u1_slice_type -= 5;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301060 }
1061
1062 {
1063 UWORD32 skip;
1064
1065 if((ps_dec->i4_app_skip_mode == IVD_SKIP_PB)
1066 || (ps_dec->i4_dec_skip_mode == IVD_SKIP_PB))
1067 {
1068 UWORD32 u4_bit_stream_offset = 0;
1069
1070 if(ps_dec->u1_nal_unit_type == IDR_SLICE_NAL)
1071 {
1072 skip = 0;
1073
1074 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE;
1075 }
1076 else if((I_SLICE == u1_slice_type)
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001077 && (1 >= ps_dec->ps_cur_sps->u1_num_ref_frames))
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301078 {
1079 skip = 0;
1080
1081 ps_dec->i4_dec_skip_mode = IVD_SKIP_NONE;
1082 }
1083 else
1084 {
1085 skip = 1;
1086 }
1087
1088 /* If one frame worth of data is already skipped, do not skip the next one */
1089 if((0 == u2_first_mb_in_slice) && (1 == ps_dec->u4_prev_nal_skipped))
1090 {
1091 skip = 0;
1092 }
1093
1094 if(skip)
1095 {
1096 ps_dec->u4_prev_nal_skipped = 1;
1097 ps_dec->i4_dec_skip_mode = IVD_SKIP_PB;
1098 return 0;
1099 }
1100 else
1101 {
1102 /* If the previous NAL was skipped, then
1103 do not process that buffer in this call.
1104 Return to app and process it in the next call.
1105 This is necessary to handle cases where I/IDR is not complete in
1106 the current buffer and application intends to fill the remaining part of the bitstream
1107 later. This ensures we process only frame worth of data in every call */
1108 if(1 == ps_dec->u4_prev_nal_skipped)
1109 {
1110 ps_dec->u4_return_to_app = 1;
1111 return 0;
1112 }
1113 }
1114 }
1115
1116 }
1117
1118 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1119 if(u4_temp & MASK_ERR_PIC_SET_ID)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301120 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301121 /* discard slice if pic param is invalid */
1122 COPYTHECONTEXT("SH: pic_parameter_set_id", u4_temp);
1123 ps_pps = &ps_dec->ps_pps[u4_temp];
1124 if(FALSE == ps_pps->u1_is_valid)
1125 {
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301126 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301127 }
1128 ps_seq = ps_pps->ps_sps;
1129 if(!ps_seq)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301130 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301131 if(FALSE == ps_seq->u1_is_valid)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301132 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301133
1134 /* Get the frame num */
1135 u2_frame_num = ih264d_get_bits_h264(ps_bitstrm,
1136 ps_seq->u1_bits_in_frm_num);
1137// H264_DEC_DEBUG_PRINT("FRAME %d First MB in slice: %d\n", u2_frame_num, u2_first_mb_in_slice);
1138
1139 COPYTHECONTEXT("SH: frame_num", u2_frame_num);
1140// 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 +05301141 if(!ps_dec->u1_first_slice_in_stream && ps_dec->u4_first_slice_in_pic)
Harish Mahendrakar49456122017-01-05 12:10:47 +05301142 {
1143 pocstruct_t *ps_prev_poc = &ps_dec->s_prev_pic_poc;
1144 pocstruct_t *ps_cur_poc = &ps_dec->s_cur_pic_poc;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301145
Harish Mahendrakar49456122017-01-05 12:10:47 +05301146 ps_dec->u2_mbx = 0xffff;
1147 ps_dec->u2_mby = 0;
1148
1149 if((0 == u1_is_idr_slice) && ps_cur_slice->u1_nal_ref_idc)
1150 ps_dec->u2_prev_ref_frame_num = ps_cur_slice->u2_frame_num;
1151
1152 if(u1_is_idr_slice || ps_cur_slice->u1_mmco_equalto5)
1153 ps_dec->u2_prev_ref_frame_num = 0;
1154
1155 if(ps_dec->ps_cur_sps->u1_gaps_in_frame_num_value_allowed_flag)
1156 {
1157 ih264d_decode_gaps_in_frame_num(ps_dec, u2_frame_num);
1158 }
1159
1160 ps_prev_poc->i4_prev_frame_num_ofst = ps_cur_poc->i4_prev_frame_num_ofst;
1161 ps_prev_poc->u2_frame_num = ps_cur_poc->u2_frame_num;
1162 ps_prev_poc->u1_mmco_equalto5 = ps_cur_slice->u1_mmco_equalto5;
1163 if(ps_cur_slice->u1_nal_ref_idc)
1164 {
1165 ps_prev_poc->i4_pic_order_cnt_lsb = ps_cur_poc->i4_pic_order_cnt_lsb;
1166 ps_prev_poc->i4_pic_order_cnt_msb = ps_cur_poc->i4_pic_order_cnt_msb;
1167 ps_prev_poc->i4_delta_pic_order_cnt_bottom =
1168 ps_cur_poc->i4_delta_pic_order_cnt_bottom;
1169 ps_prev_poc->i4_delta_pic_order_cnt[0] =
1170 ps_cur_poc->i4_delta_pic_order_cnt[0];
1171 ps_prev_poc->i4_delta_pic_order_cnt[1] =
1172 ps_cur_poc->i4_delta_pic_order_cnt[1];
1173 ps_prev_poc->u1_bot_field = ps_cur_poc->u1_bot_field;
1174 }
1175
1176 ps_dec->u2_total_mbs_coded = 0;
1177 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301178 /* Get the field related flags */
1179 if(!ps_seq->u1_frame_mbs_only_flag)
1180 {
1181
1182 u1_field_pic_flag = ih264d_get_bit_h264(ps_bitstrm);
1183 COPYTHECONTEXT("SH: field_pic_flag", u1_field_pic_flag);
1184 u1_bottom_field_flag = 0;
1185
1186 if(u1_field_pic_flag)
1187 {
1188 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
1189 u1_bottom_field_flag = ih264d_get_bit_h264(ps_bitstrm);
1190 COPYTHECONTEXT("SH: bottom_field_flag", u1_bottom_field_flag);
1191
1192 }
1193 else
1194 {
1195 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
1196 }
1197 }
1198 else
1199 {
1200 u1_field_pic_flag = 0;
1201 u1_bottom_field_flag = 0;
1202
1203 ps_dec->pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
1204 }
1205
1206 u1_nal_unit_type = SLICE_NAL;
1207 if(u1_is_idr_slice)
1208 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301209 u1_nal_unit_type = IDR_SLICE_NAL;
1210 u4_idr_pic_id = ih264d_uev(pu4_bitstrm_ofst,
1211 pu4_bitstrm_buf);
1212 if(u4_idr_pic_id > 65535)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301213 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301214 COPYTHECONTEXT("SH: ", u4_idr_pic_id);
1215 }
1216
1217 /* read delta pic order count information*/
1218 i_delta_poc[0] = i_delta_poc[1] = 0;
1219 s_tmp_poc.i4_pic_order_cnt_lsb = 0;
1220 s_tmp_poc.i4_delta_pic_order_cnt_bottom = 0;
1221 u1_pic_order_cnt_type = ps_seq->u1_pic_order_cnt_type;
1222 if(u1_pic_order_cnt_type == 0)
1223 {
1224 i_temp = ih264d_get_bits_h264(
1225 ps_bitstrm,
1226 ps_seq->u1_log2_max_pic_order_cnt_lsb_minus);
1227 if(i_temp < 0 || i_temp >= ps_seq->i4_max_pic_order_cntLsb)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301228 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301229 s_tmp_poc.i4_pic_order_cnt_lsb = i_temp;
1230 COPYTHECONTEXT("SH: pic_order_cnt_lsb", s_tmp_poc.i4_pic_order_cnt_lsb);
1231
1232 if((ps_pps->u1_pic_order_present_flag == 1) && (!u1_field_pic_flag))
1233 {
1234 s_tmp_poc.i4_delta_pic_order_cnt_bottom = ih264d_sev(
1235 pu4_bitstrm_ofst, pu4_bitstrm_buf);
1236 //if(s_tmp_poc.i4_delta_pic_order_cnt_bottom > ps_seq->i4_max_pic_order_cntLsb)
1237 COPYTHECONTEXT("SH: delta_pic_order_cnt_bottom",
1238 s_tmp_poc.i4_delta_pic_order_cnt_bottom);
1239 }
1240 }
1241
1242 s_tmp_poc.i4_delta_pic_order_cnt[0] = 0;
1243 s_tmp_poc.i4_delta_pic_order_cnt[1] = 0;
1244 if(u1_pic_order_cnt_type == 1
1245 && (!ps_seq->u1_delta_pic_order_always_zero_flag))
1246 {
1247 s_tmp_poc.i4_delta_pic_order_cnt[0] = ih264d_sev(pu4_bitstrm_ofst,
1248 pu4_bitstrm_buf);
1249 COPYTHECONTEXT("SH: delta_pic_order_cnt[0]",
1250 s_tmp_poc.i4_delta_pic_order_cnt[0]);
1251
1252 if(ps_pps->u1_pic_order_present_flag && !u1_field_pic_flag)
1253 {
1254 s_tmp_poc.i4_delta_pic_order_cnt[1] = ih264d_sev(
1255 pu4_bitstrm_ofst, pu4_bitstrm_buf);
1256 COPYTHECONTEXT("SH: delta_pic_order_cnt[1]",
1257 s_tmp_poc.i4_delta_pic_order_cnt[1]);
1258 }
1259 }
1260
1261 if(ps_pps->u1_redundant_pic_cnt_present_flag)
1262 {
1263 u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf);
1264 if(u4_temp > MAX_REDUNDANT_PIC_CNT)
Harish Mahendrakar9a00f562017-01-05 13:48:55 +05301265 return ERROR_INV_SLICE_HDR_T;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301266 u1_redundant_pic_cnt = u4_temp;
1267 COPYTHECONTEXT("SH: redundant_pic_cnt", u1_redundant_pic_cnt);
1268 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001269
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301270 /*--------------------------------------------------------------------*/
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001271 /* Check if the slice is part of new picture */
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301272 /*--------------------------------------------------------------------*/
Harish Mahendrakar8b5fd8f2016-04-26 16:36:03 +05301273 /* First slice of a picture is always considered as part of new picture */
1274 i1_is_end_of_poc = 1;
1275 ps_dec->ps_dec_err_status->u1_err_flag &= MASK_REJECT_CUR_PIC;
1276
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301277 if(ps_dec->u4_first_slice_in_pic == 0)
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);
Harish Mahendrakar49456122017-01-05 12:10:47 +05301285 if(i1_is_end_of_poc)
1286 {
1287 ps_dec->u1_first_slice_in_stream = 0;
1288 return ERROR_INCOMPLETE_FRAME;
1289 }
1290
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001291 }
1292
1293 /*--------------------------------------------------------------------*/
1294 /* Check for error in slice and parse the missing/corrupted MB's */
1295 /* as skip-MB's in an inserted P-slice */
1296 /*--------------------------------------------------------------------*/
1297 u1_mbaff = ps_seq->u1_mb_aff_flag && (!u1_field_pic_flag);
1298 prev_slice_err = 0;
1299
1300 if(i1_is_end_of_poc || ps_dec->u1_first_slice_in_stream)
1301 {
1302 if(u2_frame_num != ps_dec->u2_prv_frame_num
1303 && ps_dec->u1_top_bottom_decoded != 0
1304 && ps_dec->u1_top_bottom_decoded
1305 != (TOP_FIELD_ONLY | BOT_FIELD_ONLY))
1306 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301307 ps_dec->u1_dangling_field = 1;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001308 if(ps_dec->u4_first_slice_in_pic)
1309 {
1310 // first slice - dangling field
1311 prev_slice_err = 1;
1312 }
1313 else
1314 {
1315 // last slice - dangling field
1316 prev_slice_err = 2;
1317 }
1318
1319 if(ps_dec->u1_top_bottom_decoded ==TOP_FIELD_ONLY)
1320 ps_cur_slice->u1_bottom_field_flag = 1;
1321 else
1322 ps_cur_slice->u1_bottom_field_flag = 0;
1323
1324 num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1325 - ps_dec->u2_total_mbs_coded;
1326 ps_cur_poc = &ps_dec->s_cur_pic_poc;
1327
1328 u1_is_idr_slice = ps_cur_slice->u1_nal_unit_type == IDR_SLICE_NAL;
1329 }
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301330 else if(ps_dec->u4_first_slice_in_pic)
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001331 {
1332 if(u2_first_mb_in_slice > 0)
1333 {
1334 // first slice - missing/header corruption
1335 prev_slice_err = 1;
1336 num_mb_skipped = u2_first_mb_in_slice << u1_mbaff;
1337 ps_cur_poc = &s_tmp_poc;
1338
1339 // initializing slice parameters
1340 ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1341 ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1342 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1343 ps_cur_slice->i4_pic_order_cnt_lsb =
1344 s_tmp_poc.i4_pic_order_cnt_lsb;
1345 ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1346 ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1347 ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1348 ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
Harish Mahendrakar1d5640f2016-12-15 18:04:53 +05301349 ps_cur_slice->u1_mbaff_frame_flag = ps_seq->u1_mb_aff_flag
1350 && (!u1_field_pic_flag);
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001351 }
1352 }
1353 else
1354 {
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301355 /* since i1_is_end_of_poc is set ,means new frame num is encountered. so conceal the current frame
1356 * completely */
1357 prev_slice_err = 2;
1358 num_mb_skipped = (ps_dec->u2_frm_ht_in_mbs
1359 * ps_dec->u2_frm_wd_in_mbs)
1360 - ps_dec->u2_total_mbs_coded;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001361 ps_cur_poc = &s_tmp_poc;
1362 }
1363 }
1364 else
1365 {
1366 if((u2_first_mb_in_slice << u1_mbaff) > ps_dec->u2_total_mbs_coded)
1367 {
1368 // previous slice - missing/corruption
1369 prev_slice_err = 2;
1370 num_mb_skipped = (u2_first_mb_in_slice << u1_mbaff)
1371 - ps_dec->u2_total_mbs_coded;
1372 ps_cur_poc = &s_tmp_poc;
1373 }
1374 else if((u2_first_mb_in_slice << u1_mbaff) < ps_dec->u2_total_mbs_coded)
1375 {
1376 return ERROR_CORRUPTED_SLICE;
1377 }
1378 }
1379
1380 if(prev_slice_err)
1381 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301382 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 -07001383
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301384 if(ps_dec->u1_dangling_field == 1)
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001385 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301386 ps_dec->u1_second_field = 1 - ps_dec->u1_second_field;
1387 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1388 ps_dec->u2_prv_frame_num = u2_frame_num;
1389 ps_dec->u1_first_slice_in_stream = 0;
1390 return ERROR_DANGLING_FIELD_IN_PIC;
1391 }
1392
1393 if(prev_slice_err == 2)
1394 {
1395 ps_dec->u1_first_slice_in_stream = 0;
1396 return ERROR_INCOMPLETE_FRAME;
1397 }
1398
1399 if(ps_dec->u2_total_mbs_coded
1400 >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs)
1401 {
1402 /* return if all MBs in frame are parsed*/
1403 ps_dec->u1_first_slice_in_stream = 0;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001404 return ERROR_IN_LAST_SLICE_OF_PIC;
1405 }
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301406
1407 if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC)
1408 {
1409 ih264d_err_pic_dispbuf_mgr(ps_dec);
1410 return ERROR_NEW_FRAME_EXPECTED;
1411 }
1412
1413 if(ret != OK)
1414 return ret;
1415
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001416 i1_is_end_of_poc = 0;
1417 }
1418
1419 if (ps_dec->u4_first_slice_in_pic == 0)
Harish Mahendrakar5e4f64c2016-06-01 13:31:45 +05301420 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001421 ps_dec->ps_parse_cur_slice++;
Harish Mahendrakar5e4f64c2016-06-01 13:31:45 +05301422 ps_dec->u2_cur_slice_num++;
1423 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001424
Harish Mahendrakarbc71ad22016-09-17 17:00:37 +05301425 // in the case of single core increment ps_decode_cur_slice
1426 if((ps_dec->u1_separate_parse == 0) && (ps_dec->u4_first_slice_in_pic == 0))
1427 {
1428 ps_dec->ps_decode_cur_slice++;
1429 }
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001430 ps_dec->u1_slice_header_done = 0;
1431
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001432
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301433 if(u1_field_pic_flag)
1434 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301435 ps_dec->u2_prv_frame_num = u2_frame_num;
1436 }
1437
1438 if(ps_cur_slice->u1_mmco_equalto5)
1439 {
1440 WORD32 i4_temp_poc;
1441 WORD32 i4_top_field_order_poc, i4_bot_field_order_poc;
1442
1443 if(!ps_cur_slice->u1_field_pic_flag) // or a complementary field pair
1444 {
1445 i4_top_field_order_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1446 i4_bot_field_order_poc =
1447 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1448 i4_temp_poc = MIN(i4_top_field_order_poc,
1449 i4_bot_field_order_poc);
1450 }
1451 else if(!ps_cur_slice->u1_bottom_field_flag)
1452 i4_temp_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1453 else
1454 i4_temp_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1455
1456 ps_dec->ps_cur_pic->i4_top_field_order_cnt = i4_temp_poc
1457 - ps_dec->ps_cur_pic->i4_top_field_order_cnt;
1458 ps_dec->ps_cur_pic->i4_bottom_field_order_cnt = i4_temp_poc
1459 - ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
1460 ps_dec->ps_cur_pic->i4_poc = i4_temp_poc;
1461 ps_dec->ps_cur_pic->i4_avg_poc = i4_temp_poc;
1462 }
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301463 if(ps_dec->u4_first_slice_in_pic)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301464 {
1465 ret = ih264d_decode_pic_order_cnt(u1_is_idr_slice, u2_frame_num,
1466 &ps_dec->s_prev_pic_poc,
1467 &s_tmp_poc, ps_cur_slice, ps_pps,
1468 u1_nal_ref_idc,
1469 u1_bottom_field_flag,
1470 u1_field_pic_flag, &i4_poc);
1471 if(ret != OK)
1472 return ret;
1473 /* Display seq no calculations */
1474 if(i4_poc >= ps_dec->i4_max_poc)
1475 ps_dec->i4_max_poc = i4_poc;
1476 /* IDR Picture or POC wrap around */
1477 if(i4_poc == 0)
1478 {
1479 ps_dec->i4_prev_max_display_seq = ps_dec->i4_prev_max_display_seq
1480 + ps_dec->i4_max_poc
1481 + ps_dec->u1_max_dec_frame_buffering + 1;
1482 ps_dec->i4_max_poc = 0;
1483 }
1484 }
1485
1486 /*--------------------------------------------------------------------*/
1487 /* Copy the values read from the bitstream to the slice header and then*/
1488 /* If the slice is first slice in picture, then do Start of Picture */
1489 /* processing. */
1490 /*--------------------------------------------------------------------*/
1491 ps_cur_slice->i4_delta_pic_order_cnt[0] = i_delta_poc[0];
1492 ps_cur_slice->i4_delta_pic_order_cnt[1] = i_delta_poc[1];
1493 ps_cur_slice->u4_idr_pic_id = u4_idr_pic_id;
1494 ps_cur_slice->u2_first_mb_in_slice = u2_first_mb_in_slice;
1495 ps_cur_slice->u1_field_pic_flag = u1_field_pic_flag;
1496 ps_cur_slice->u1_bottom_field_flag = u1_bottom_field_flag;
1497 ps_cur_slice->u1_slice_type = u1_slice_type;
1498 ps_cur_slice->i4_pic_order_cnt_lsb = s_tmp_poc.i4_pic_order_cnt_lsb;
1499
1500 ps_cur_slice->u1_nal_unit_type = u1_nal_unit_type;
1501 ps_cur_slice->u1_redundant_pic_cnt = u1_redundant_pic_cnt;
1502 ps_cur_slice->u1_nal_ref_idc = u1_nal_ref_idc;
1503 ps_cur_slice->u1_pic_order_cnt_type = u1_pic_order_cnt_type;
1504
1505 if(ps_seq->u1_frame_mbs_only_flag)
1506 ps_cur_slice->u1_direct_8x8_inference_flag =
1507 ps_seq->u1_direct_8x8_inference_flag;
1508 else
1509 ps_cur_slice->u1_direct_8x8_inference_flag = 1;
1510
1511 if(u1_slice_type == B_SLICE)
1512 {
1513 ps_cur_slice->u1_direct_spatial_mv_pred_flag = ih264d_get_bit_h264(
1514 ps_bitstrm);
1515 COPYTHECONTEXT("SH: direct_spatial_mv_pred_flag",
1516 ps_cur_slice->u1_direct_spatial_mv_pred_flag);
1517
1518 if(ps_cur_slice->u1_direct_spatial_mv_pred_flag)
1519 ps_cur_slice->pf_decodeDirect = ih264d_decode_spatial_direct;
1520 else
1521 ps_cur_slice->pf_decodeDirect = ih264d_decode_temporal_direct;
1522 if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag)))
1523 ps_dec->pf_mvpred = ih264d_mvpred_nonmbaffB;
1524 }
1525 else
1526 {
1527 if(!((ps_pps->ps_sps->u1_mb_aff_flag) && (!u1_field_pic_flag)))
1528 ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff;
1529 }
1530
Harish Mahendrakar0b23c812017-01-16 14:43:42 +05301531 if(ps_dec->u4_first_slice_in_pic)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301532 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301533 if(u2_first_mb_in_slice == 0)
1534 {
1535 ret = ih264d_start_of_pic(ps_dec, i4_poc, &s_tmp_poc, u2_frame_num, ps_pps);
1536 if(ret != OK)
1537 return ret;
1538 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301539
1540 ps_dec->u4_output_present = 0;
1541
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301542 {
1543 ih264d_get_next_display_field(ps_dec,
1544 ps_dec->ps_out_buffer,
1545 &(ps_dec->s_disp_op));
1546 /* If error code is non-zero then there is no buffer available for display,
1547 hence avoid format conversion */
1548
1549 if(0 != ps_dec->s_disp_op.u4_error_code)
1550 {
1551 ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301552 }
1553 else
1554 ps_dec->u4_output_present = 1;
1555 }
1556 if(ps_dec->u1_separate_parse == 1)
1557 {
1558 if(ps_dec->u4_dec_thread_created == 0)
1559 {
1560 ithread_create(ps_dec->pv_dec_thread_handle, NULL,
1561 (void *)ih264d_decode_picture_thread,
1562 (void *)ps_dec);
1563
1564 ps_dec->u4_dec_thread_created = 1;
1565 }
1566
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001567 if((ps_dec->u4_num_cores == 3) &&
1568 ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301569 && (ps_dec->u4_bs_deblk_thread_created == 0))
1570 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001571 ps_dec->u4_start_recon_deblk = 0;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301572 ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL,
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001573 (void *)ih264d_recon_deblk_thread,
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301574 (void *)ps_dec);
1575 ps_dec->u4_bs_deblk_thread_created = 1;
1576 }
1577 }
1578
1579 }
1580
1581 /* INITIALIZATION of fn ptrs for MC and formMbPartInfo functions */
1582 {
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001583 UWORD8 uc_nofield_nombaff;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301584
1585
1586
1587 uc_nofield_nombaff = ((ps_dec->ps_cur_slice->u1_field_pic_flag == 0)
1588 && (ps_dec->ps_cur_slice->u1_mbaff_frame_flag == 0)
1589 && (u1_slice_type != B_SLICE)
1590 && (ps_dec->ps_cur_pps->u1_wted_pred_flag == 0));
1591
1592 /* Initialise MC and formMbPartInfo fn ptrs one time based on profile_idc */
1593
1594 if(uc_nofield_nombaff)
1595 {
1596 ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp;
1597 ps_dec->p_motion_compensate = ih264d_motion_compensate_bp;
1598 }
1599 else
1600 {
1601 ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_mp;
1602 ps_dec->p_motion_compensate = ih264d_motion_compensate_mp;
1603 }
1604
1605
1606 }
1607
1608 /*
1609 * Decide whether to decode the current picture or not
1610 */
1611 {
1612 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
1613 if(ps_err->u4_frm_sei_sync == u2_frame_num)
1614 {
1615 ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1616 ps_err->u4_frm_sei_sync = SYNC_FRM_DEFAULT;
1617 }
1618 ps_err->u4_cur_frm = u2_frame_num;
1619 }
1620
1621 /* Decision for decoding if the picture is to be skipped */
1622 {
1623 WORD32 i4_skip_b_pic, i4_skip_p_pic;
1624
1625 i4_skip_b_pic = (ps_dec->u4_skip_frm_mask & B_SLC_BIT)
1626 && (B_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc);
1627
1628 i4_skip_p_pic = (ps_dec->u4_skip_frm_mask & P_SLC_BIT)
1629 && (P_SLICE == u1_slice_type) && (0 == u1_nal_ref_idc);
1630
1631 /**************************************************************/
1632 /* Skip the B picture if skip mask is set for B picture and */
1633 /* Current B picture is a non reference B picture or there is */
1634 /* no user for reference B picture */
1635 /**************************************************************/
1636 if(i4_skip_b_pic)
1637 {
1638 ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1639 /* Don't decode the picture in SKIP-B mode if that picture is B */
1640 /* and also it is not to be used as a reference picture */
1641 ps_dec->u1_last_pic_not_decoded = 1;
1642
1643 return OK;
1644 }
1645 /**************************************************************/
1646 /* Skip the P picture if skip mask is set for P picture and */
1647 /* Current P picture is a non reference P picture or there is */
1648 /* no user for reference P picture */
1649 /**************************************************************/
1650 if(i4_skip_p_pic)
1651 {
1652 ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1653 /* Don't decode the picture in SKIP-P mode if that picture is P */
1654 /* and also it is not to be used as a reference picture */
1655 ps_dec->u1_last_pic_not_decoded = 1;
1656
1657 return OK;
1658 }
1659 }
1660
1661 {
1662 UWORD16 u2_mb_x, u2_mb_y;
1663
1664 ps_dec->i4_submb_ofst = ((u2_first_mb_in_slice
1665 << ps_cur_slice->u1_mbaff_frame_flag) * SUB_BLK_SIZE)
1666 - SUB_BLK_SIZE;
1667 if(u2_first_mb_in_slice)
1668 {
1669 UWORD8 u1_mb_aff;
1670 UWORD8 u1_field_pic;
1671 UWORD16 u2_frm_wd_in_mbs;
1672 u2_frm_wd_in_mbs = ps_seq->u2_frm_wd_in_mbs;
1673 u1_mb_aff = ps_cur_slice->u1_mbaff_frame_flag;
1674 u1_field_pic = ps_cur_slice->u1_field_pic_flag;
1675
1676 {
1677 UWORD32 x_offset;
1678 UWORD32 y_offset;
1679 UWORD32 u4_frame_stride;
1680 tfr_ctxt_t *ps_trns_addr; // = &ps_dec->s_tran_addrecon_parse;
1681
1682 if(ps_dec->u1_separate_parse)
1683 {
1684 ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1685 }
1686 else
1687 {
1688 ps_trns_addr = &ps_dec->s_tran_addrecon;
1689 }
1690 u2_mb_x = MOD(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1691 u2_mb_y = DIV(u2_first_mb_in_slice, u2_frm_wd_in_mbs);
1692
1693 u2_mb_y <<= u1_mb_aff;
1694
1695 if((u2_mb_x > u2_frm_wd_in_mbs - 1)
1696 || (u2_mb_y > ps_dec->u2_frm_ht_in_mbs - 1))
1697 {
1698 return ERROR_CORRUPTED_SLICE;
1699 }
1700
1701 u4_frame_stride = ps_dec->u2_frm_wd_y << u1_field_pic;
1702 x_offset = u2_mb_x << 4;
1703 y_offset = (u2_mb_y * u4_frame_stride) << 4;
1704
1705 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1 + x_offset
1706 + y_offset;
1707
1708 u4_frame_stride = ps_dec->u2_frm_wd_uv << u1_field_pic;
1709 x_offset >>= 1;
1710 y_offset = (u2_mb_y * u4_frame_stride) << 3;
1711
1712 x_offset *= YUV420SP_FACTOR;
1713
1714 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2 + x_offset
1715 + y_offset;
1716 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3 + x_offset
1717 + y_offset;
1718
1719 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1720 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1721 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1722
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301723
1724 // assign the deblock structure pointers to start of slice
1725 if(ps_dec->u1_separate_parse == 1)
1726 {
1727 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic
1728 + (u2_first_mb_in_slice << u1_mb_aff);
1729 }
1730 else
1731 {
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301732 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic
1733 + (u2_first_mb_in_slice << u1_mb_aff);
1734 }
1735
1736 ps_dec->u2_cur_mb_addr = (u2_first_mb_in_slice << u1_mb_aff);
1737
1738 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv
1739 + ((u2_first_mb_in_slice << u1_mb_aff) << 4);
1740 }
1741 }
1742 else
1743 {
1744 tfr_ctxt_t *ps_trns_addr;
1745
1746 if(ps_dec->u1_separate_parse)
1747 {
1748 ps_trns_addr = &ps_dec->s_tran_addrecon_parse;
1749 }
1750 else
1751 {
1752 ps_trns_addr = &ps_dec->s_tran_addrecon;
1753 }
1754
1755 u2_mb_x = 0xffff;
1756 u2_mb_y = 0;
1757 // assign the deblock structure pointers to start of slice
1758 ps_dec->u2_cur_mb_addr = 0;
1759 ps_dec->ps_deblk_mbn = ps_dec->ps_deblk_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301760 ps_dec->ps_mv_cur = ps_dec->s_cur_pic.ps_mv;
1761 ps_trns_addr->pu1_dest_y = ps_dec->s_cur_pic.pu1_buf1;
1762 ps_trns_addr->pu1_dest_u = ps_dec->s_cur_pic.pu1_buf2;
1763 ps_trns_addr->pu1_dest_v = ps_dec->s_cur_pic.pu1_buf3;
1764
1765 ps_trns_addr->pu1_mb_y = ps_trns_addr->pu1_dest_y;
1766 ps_trns_addr->pu1_mb_u = ps_trns_addr->pu1_dest_u;
1767 ps_trns_addr->pu1_mb_v = ps_trns_addr->pu1_dest_v;
1768
1769 }
1770
1771 ps_dec->ps_part = ps_dec->ps_parse_part_params;
1772
1773 ps_dec->u2_mbx =
1774 (MOD(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1775 ps_dec->u2_mby =
1776 (DIV(u2_first_mb_in_slice - 1, ps_seq->u2_frm_wd_in_mbs));
1777 ps_dec->u2_mby <<= ps_cur_slice->u1_mbaff_frame_flag;
1778 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1779 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
1780 }
1781
1782 /* RBSP stop bit is used for CABAC decoding*/
1783 ps_bitstrm->u4_max_ofst += ps_dec->ps_cur_pps->u1_entropy_coding_mode;
1784
1785 ps_dec->u1_B = (u1_slice_type == B_SLICE);
1786 ps_dec->u4_next_mb_skip = 0;
1787
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301788 ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice =
1789 ps_dec->ps_cur_slice->u2_first_mb_in_slice;
1790 ps_dec->ps_parse_cur_slice->slice_type =
1791 ps_dec->ps_cur_slice->u1_slice_type;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301792
1793
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001794 ps_dec->u4_start_recon_deblk = 1;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301795 {
1796 WORD32 num_entries;
1797 WORD32 size;
1798 UWORD8 *pu1_buf;
1799
1800 num_entries = MIN(MAX_FRAMES, ps_dec->u4_num_ref_frames_at_init);
1801 num_entries = 2 * ((2 * num_entries) + 1);
1802
1803 size = num_entries * sizeof(void *);
1804 size += PAD_MAP_IDX_POC * sizeof(void *);
1805
1806 pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf;
1807 pu1_buf += size * ps_dec->u2_cur_slice_num;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001808 ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = ( void *)pu1_buf;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301809 }
1810
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001811 if(ps_dec->u1_separate_parse)
1812 {
1813 ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data;
1814 }
1815 else
1816 {
1817 ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data;
1818 }
1819
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301820 if(u1_slice_type == I_SLICE)
1821 {
1822 ps_dec->ps_cur_pic->u4_pack_slc_typ |= I_SLC_BIT;
1823
1824 ret = ih264d_parse_islice(ps_dec, u2_first_mb_in_slice);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301825
1826 if(ps_dec->i4_pic_type != B_SLICE && ps_dec->i4_pic_type != P_SLICE)
1827 ps_dec->i4_pic_type = I_SLICE;
1828
1829 }
1830 else if(u1_slice_type == P_SLICE)
1831 {
1832 ps_dec->ps_cur_pic->u4_pack_slc_typ |= P_SLC_BIT;
1833 ret = ih264d_parse_pslice(ps_dec, u2_first_mb_in_slice);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301834 ps_dec->u1_pr_sl_type = u1_slice_type;
1835 if(ps_dec->i4_pic_type != B_SLICE)
1836 ps_dec->i4_pic_type = P_SLICE;
1837 }
1838 else if(u1_slice_type == B_SLICE)
1839 {
1840 ps_dec->ps_cur_pic->u4_pack_slc_typ |= B_SLC_BIT;
1841 ret = ih264d_parse_bslice(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 ps_dec->i4_pic_type = B_SLICE;
1844 }
1845 else
1846 return ERROR_INV_SLC_TYPE_T;
1847
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001848 if(ps_dec->u1_slice_header_done)
1849 {
Hamsalekha S9f0dcba2015-06-09 15:54:31 +05301850 /* set to zero to indicate a valid slice has been decoded */
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001851 ps_dec->u1_first_slice_in_stream = 0;
1852 }
1853
1854 if(ret != OK)
1855 return ret;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301856
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301857 /* storing last Mb X and MbY of the slice */
1858 ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx;
1859 ps_dec->i2_prev_slice_mby = ps_dec->u2_mby;
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001860
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301861 /* End of Picture detection */
1862
1863 if(ps_dec->u2_total_mbs_coded >= (ps_seq->u2_max_mb_addr + 1))
1864 {
1865 ps_dec->u1_pic_decode_done = 1;
1866
1867 }
1868
1869 {
1870 dec_err_status_t * ps_err = ps_dec->ps_dec_err_status;
1871 if((ps_err->u1_err_flag & REJECT_PB_PICS)
1872 && (ps_err->u1_cur_pic_type == PIC_TYPE_I))
1873 {
1874 ps_err->u1_err_flag = ACCEPT_ALL_PICS;
1875 }
1876 }
1877
1878 PRINT_BIN_BIT_RATIO(ps_dec)
1879
Marco Nelissen8ef4c3f2015-06-03 07:26:32 -07001880 return ret;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301881}
1882