blob: 5dfba33da9997c5be4b0e6b6de0d778595d78598 [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_process_bslice.c
23 *
24 * \brief
25 * Contains routines that decode B slice type
26 *
27 * Detailed_description
28 *
29 * \date
30 * 21/12/2002
31 *
32 * \author NS
33 **************************************************************************
34 */
35#include "ih264_typedefs.h"
36#include "ih264_macros.h"
37#include "ih264_platform_macros.h"
38
39#include <string.h>
40#include "ih264d_structs.h"
41#include "ih264d_bitstrm.h"
42#include "ih264d_parse_cavlc.h"
43#include "ih264d_mb_utils.h"
44#include "ih264d_mvpred.h"
45#include "ih264d_inter_pred.h"
46#include "ih264d_process_pslice.h"
47#include "ih264d_error_handler.h"
48#include "ih264d_tables.h"
49#include "ih264d_parse_slice.h"
50#include "ih264d_process_pslice.h"
51#include "ih264d_process_bslice.h"
52#include "ih264d_tables.h"
53#include "ih264d_parse_islice.h"
54#include "ih264d_mvpred.h"
55
56void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec);
57//UWORD32 g_hits = 0;
58//UWORD32 g_miss = 0;
59/*!
60 **************************************************************************
61 * \if Function name : ih264d_decode_spatial_direct \endif
62 *
63 * \brief
64 * Decodes spatial direct mode.
65 *
66 * \return
67 * None.
68 * Arunoday T
69 **************************************************************************
70 */
71WORD32 ih264d_decode_spatial_direct(dec_struct_t * ps_dec,
72 UWORD8 u1_wd_x,
73 dec_mb_info_t * ps_cur_mb_info,
74 UWORD8 u1_mb_num)
75{
76 mv_pred_t s_mv_pred, *ps_mv;
77 UWORD8 u1_col_zero_flag, u1_sub_mb_num, u1_direct_zero_pred_flag = 0;
78 UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
79 mv_pred_t *ps_mv_ntop_start;
80 mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_mb_num << 4);
81 UWORD8 partition_size, sub_partition, u1_mb_partw, u1_mb_parth;
82 UWORD8 i;
83 WORD8 i1_pred, i1_ref_frame0, i1_ref_frame1;
84 struct pic_buffer_t *ps_ref_frame = NULL, *ps_col_pic, *ps_pic_buff0 = NULL,
85 *ps_pic_buff1 = NULL;
86
87 UWORD8 u1_zero_pred_cond_f, u1_zero_pred_cond_b;
88 WORD16 i2_def_mv[2], i2_spat_pred_mv[4], *pi2_final_mv0, *pi2_final_mv1;
89 UWORD16 ui2_mask_fwd = 0, ui2_mask_bwd = 0, u2_mask = 0;
90 UWORD32 *pui32_weight_ofsts = NULL;
91 directmv_t s_mvdirect;
92 UWORD8 u1_colz;
93 UWORD8 u1_final_ref_idx = 0;
94 const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
95 const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
96 const UWORD16 sub_mask_table[] =
97 { 0x33, 0x3, 0x11, 0x1 };
98 const UWORD16 mask_table[] =
99 { 0xffff, /*16x16 NA */
100 0xff, /* 16x8*/
101 0x3333, /* 8x16*/
102 0x33 };/* 8x8*/
103 mv_pred_t s_temp_mv_pred;
104 WORD32 ret = 0;
105
106 /* CHANGED CODE */
107 ps_mv_ntop_start = ps_dec->ps_mv_cur + (u1_mb_num << 4)
108 - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12;
109
110 /* assign default values for MotionVector as zero */
111 i2_def_mv[0] = 0;
112 i2_def_mv[1] = 0;
113
114 u1_direct_zero_pred_flag = ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb_start,
115 ps_mv_ntop_start, &s_mv_pred, 0, 4,
116 0, 1, B_DIRECT_SPATIAL);
117
118 i2_spat_pred_mv[0] = s_mv_pred.i2_mv[0];
119 i2_spat_pred_mv[1] = s_mv_pred.i2_mv[1];
120 i2_spat_pred_mv[2] = s_mv_pred.i2_mv[2];
121 i2_spat_pred_mv[3] = s_mv_pred.i2_mv[3];
122
123 i1_ref_frame0 = s_mv_pred.i1_ref_frame[0];
124 i1_ref_frame1 = s_mv_pred.i1_ref_frame[1];
125
126 i1_ref_frame0 = (i1_ref_frame0 < 0) ? -1 : i1_ref_frame0;
127 i1_ref_frame1 = (i1_ref_frame1 < 0) ? -1 : i1_ref_frame1;
128
129 i1_pred = 0;
130
131 {
132 WORD8 u1_ref_idx, u1_ref_idx1;
133 UWORD32 uc_Idx, uc_Idx1;
134 UWORD8 u1_scale_ref = (ps_dec->ps_cur_slice->u1_mbaff_frame_flag
135 && ps_cur_mb_info->u1_mb_field_decodingflag);
136 u1_final_ref_idx = i1_ref_frame0;
137 if(i1_ref_frame0 >= 0)
138 {
139 /* convert RefIdx if it is MbAff */
140 u1_ref_idx = i1_ref_frame0;
141 u1_ref_idx1 = i1_ref_frame0;
142 if(u1_scale_ref)
143 {
144 u1_ref_idx1 = u1_ref_idx >> 1;
145 if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb))
146 u1_ref_idx1 += MAX_REF_BUFS;
147 }
148 /* If i1_ref_frame0 < 0 then refIdxCol is obtained from ps_pic_buff1 */
149 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx1];
150 ps_ref_frame = ps_pic_buff0;
151 i1_pred = PRED_L0;
152 }
153
154 if(i1_ref_frame1 >= 0)
155 {
156 /* convert RefIdx if it is MbAff */
157 u1_ref_idx = i1_ref_frame1;
158 u1_ref_idx1 = i1_ref_frame1;
159 if(u1_scale_ref)
160 {
161 u1_ref_idx1 = u1_ref_idx >> 1;
162 if((u1_ref_idx & 0x01) != (1 - ps_cur_mb_info->u1_topmb))
163 u1_ref_idx1 += MAX_REF_BUFS;
164 }
165 ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u1_ref_idx1];
166 i1_pred = i1_pred | PRED_L1;
167 }
168 if(i1_ref_frame0 < 0)
169 {
170 ps_ref_frame = ps_pic_buff1;
171 u1_final_ref_idx = i1_ref_frame1;
172 }
173
174 u1_zero_pred_cond_f = (u1_direct_zero_pred_flag) || (i1_ref_frame0 < 0);
175 u1_zero_pred_cond_b = (u1_direct_zero_pred_flag) || (i1_ref_frame1 < 0);
176
177 if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
178 {
179 uc_Idx = ((i1_ref_frame0 < 1) ? 0 : i1_ref_frame0)
180 * ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
181 if(u1_scale_ref)
182 uc_Idx >>= 1;
183 uc_Idx1 = (i1_ref_frame1 < 0) ? 0 : i1_ref_frame1;
184 uc_Idx += (u1_scale_ref) ? (uc_Idx1 >> 1) : uc_Idx1;
185 pui32_weight_ofsts =
186 (UWORD32*)&ps_dec->pu4_wt_ofsts[2 * X3(uc_Idx)];
187
188 if(i1_ref_frame0 < 0)
189 pui32_weight_ofsts += 1;
190
191 if(u1_scale_ref && (ps_dec->ps_cur_pps->u1_wted_bipred_idc == 2))
192 {
193 WORD16 i2_ref_idx;
194 i2_ref_idx = MAX(i1_ref_frame0, 0);
195 i2_ref_idx *= (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
196 << 1);
197 i2_ref_idx += MAX(i1_ref_frame1, 0);
198 if(!ps_cur_mb_info->u1_topmb)
199 i2_ref_idx +=
200 (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
201 << 1)
202 * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
203 << 1);
204 pui32_weight_ofsts = (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2
205 * X3(i2_ref_idx)];
206 }
207 }
208 }
209
210 s_temp_mv_pred.i1_ref_frame[0] = i1_ref_frame0;
211 s_temp_mv_pred.i1_ref_frame[1] = i1_ref_frame1;
212 s_temp_mv_pred.u1_col_ref_pic_idx = ps_ref_frame->u1_mv_buf_id;
213 s_temp_mv_pred.u1_pic_type = ps_ref_frame->u1_pic_type;
214
215 /**********************************************************************/
216 /* Call the function which gets the number of partitions and */
217 /* partition info of colocated Mb */
218 /**********************************************************************/
219
220 ps_dec->pf_parse_mvdirect(ps_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x,
221 ps_dec->i4_submb_ofst, ps_cur_mb_info);
222 ps_col_pic = ps_dec->ps_col_pic;
223 if((s_mvdirect.u1_col_zeroflag_change == 0) || u1_direct_zero_pred_flag)
224 {
225 WORD16 i2_mv_x, i2_mv_y, i2_mvX1, i2_mvY1;
226 /* Most probable case */
227 u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag
228 + s_mvdirect.i4_mv_indices[0]);
229 u1_col_zero_flag = u1_col_zero_flag & 0x01;
230
231 if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1)))
232 {
233 i2_mv_x = 0;
234 i2_mv_y = 0;
235 }
236 else
237 {
238 i2_mv_x = i2_spat_pred_mv[0];
239 i2_mv_y = i2_spat_pred_mv[1];
240
241 }
242
243 if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1)))
244 {
245 i2_mvX1 = 0;
246 i2_mvY1 = 0;
247 }
248 else
249 {
250 i2_mvX1 = i2_spat_pred_mv[2];
251 i2_mvY1 = i2_spat_pred_mv[3];
252 }
253
254 u1_sub_mb_num = ps_dec->u1_sub_mb_num;
255 u1_mb_partw = (u1_wd_x >> 2);
256
257
258 if(i1_ref_frame0 >= 0)
259 {
260 {
261 pred_info_pkd_t *ps_pred_pkd;
262 WORD16 i2_mv[2];
263 WORD8 i1_ref_idx= 0;
264
265 i2_mv[0] = i2_mv_x;
266 i2_mv[1] = i2_mv_y;
267
268 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
269 ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_partw,u1_sub_mb_num,i1_pred,
270 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
271 ps_pic_buff0->u1_pic_type);
272 ps_dec->u4_pred_info_pkd_idx++;
273 ps_cur_mb_info->u1_num_pred_parts++;
274
275
276 }
277
278 }
279
280 if(i1_ref_frame1 >= 0)
281 {
282 {
283 pred_info_pkd_t *ps_pred_pkd;
284 WORD16 i2_mv[2];
285 WORD8 i1_ref_idx= 0;
286
287 i2_mv[0] = i2_mvX1;
288 i2_mv[1] = i2_mvY1;
289
290 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
291 ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_partw,u1_sub_mb_num,i1_pred,
292 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
293 ps_pic_buff1->u1_pic_type);
294 ps_dec->u4_pred_info_pkd_idx++;
295 ps_cur_mb_info->u1_num_pred_parts++;
296
297
298 }
299 }
300
301
302 /* Replication optimisation */
303 s_temp_mv_pred.i2_mv[0] = i2_mv_x;
304 s_temp_mv_pred.i2_mv[1] = i2_mv_y;
305 s_temp_mv_pred.i2_mv[2] = i2_mvX1;
306 s_temp_mv_pred.i2_mv[3] = i2_mvY1;
307
308 /* Calculating colocated zero information */
309 {
310 /*************************************/
311 /* If(bit2 and bit3 set) */
312 /* then */
313 /* (bit0 and bit1) => submmbmode */
314 /* (bit2 and bit3) => mbmode */
315 /* else */
316 /* (bit0 and bit1) => mbmode */
317 /*************************************/
318 /*UWORD8 u1_packed_mb_sub_mb_mode = sub_partition ?
319 (s_mvdirect.i1_partitionsize[0]) : ((s_mvdirect.i1_partitionsize[0]) << 2);*/
320 UWORD8 u1_packed_mb_sub_mb_mode = (u1_mb_partw == 2) ? 0x03 : 0;
321
322 if(i1_ref_frame0 < 0)
323 {
324 i2_mv_x = i2_mvX1;
325 i2_mv_y = i2_mvY1;
326 }
327
328 /* Change from left shift 4 to 6 - Varun */
329 u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1)
330 | ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1)
331 && (ABS(i2_mv_y) <= 1));
332 u1_colz |= (u1_packed_mb_sub_mb_mode << 6);
333 }
334 ps_mv = ps_mv_nmb_start + u1_sub_mb_num;
335 ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz,
336 u1_mb_partw, u1_mb_partw);
337 if(u1_wd_x == MB_SIZE)
338 ps_dec->u1_currB_type = 0;
339
340
341
342 return OK;
343 }
344 /***************************************************************************/
345 /* If present MB is 16x16 and the partition of colocated Mb is >= PRED_8x8 */
346 /* i.e 8x8 or less than 8x8 partitions then set up DMA for (0,0) and */
347 /* spatially predicted motion vector and do the multiplexing after */
348 /* motion compensation */
349 /***************************************************************************/
350
351
352 if((u1_wd_x == MB_SIZE) && (s_mvdirect.i1_num_partitions > 2))
353 {
354 ps_cur_mb_info->u1_Mux = 1;
355 if(i1_ref_frame0 >= 0)
356 {
357
358 {
359 pred_info_pkd_t *ps_pred_pkd;
360 WORD8 i1_ref_idx= 0;
361
362 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
363 ih264d_fill_pred_info(&(i2_spat_pred_mv[0]),4,4,0,i1_pred,
364 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
365 ps_pic_buff0->u1_pic_type);
366 ps_dec->u4_pred_info_pkd_idx++;
367 ps_cur_mb_info->u1_num_pred_parts++;
368
369
370 }
371
372 /****** (0,0) Motion vectors DMA *****/
373 {
374 pred_info_pkd_t *ps_pred_pkd;
375 WORD16 i2_mv[2];
376 WORD8 i1_ref_idx= 0;
377
378 i2_mv[0] = 0;
379 i2_mv[1] = 0;
380
381 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
382 ih264d_fill_pred_info(i2_mv,4,4,0,i1_pred,
383 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
384 ps_pic_buff0->u1_pic_type);
385 ps_dec->u4_pred_info_pkd_idx++;
386 ps_cur_mb_info->u1_num_pred_parts++;
387
388
389 }
390 }
391 if(i1_ref_frame1 >= 0)
392 {
393 {
394 pred_info_pkd_t *ps_pred_pkd;
395 WORD16 i2_mv[2];
396 WORD8 i1_ref_idx= 0;
397
398 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
399 ih264d_fill_pred_info(&(i2_spat_pred_mv[2]),4,4,0,i1_pred,
400 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
401 ps_pic_buff1->u1_pic_type);
402 ps_dec->u4_pred_info_pkd_idx++;
403 ps_cur_mb_info->u1_num_pred_parts++;
404
405
406 }
407
408 /****** (0,0) Motion vectors DMA *****/
409
410 {
411 pred_info_pkd_t *ps_pred_pkd;
412 WORD16 i2_mv[2];
413 WORD8 i1_ref_idx= 0;
414
415 i2_mv[0] = 0;
416 i2_mv[1] = 0;
417
418 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
419 ih264d_fill_pred_info(i2_mv,4,4,0,i1_pred,
420 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
421 ps_pic_buff1->u1_pic_type);
422 ps_dec->u4_pred_info_pkd_idx++;
423 ps_cur_mb_info->u1_num_pred_parts++;
424
425
426 }
427 }
428 }
429
430 /*u1_col = *(ps_col_pic->pu1_col_zero_flag + s_mvdirect.i4_mv_indices[0]);
431 u1_col &= 1;
432 u1_init = 0;*/
433
434 for(i = 0; i < s_mvdirect.i1_num_partitions; i++)
435 {
436 partition_size = s_mvdirect.i1_partitionsize[i];
437 u1_sub_mb_num = s_mvdirect.i1_submb_num[i];
438
439 sub_partition = partition_size >> 2;
440 partition_size &= 0x3;
441 u1_mb_partw = pu1_mb_partw[partition_size];
442 u1_mb_parth = pu1_mb_parth[partition_size];
443 u2_mask = mask_table[partition_size];
444 if(sub_partition != 0)
445 {
446 u1_mb_partw >>= 1;
447 u1_mb_parth >>= 1;
448 u2_mask = sub_mask_table[partition_size];
449 }
450
451 u1_col_zero_flag = *(ps_col_pic->pu1_col_zero_flag
452 + s_mvdirect.i4_mv_indices[i]);
453 u1_col_zero_flag = u1_col_zero_flag & 0x01;
454
455 /*if(u1_col != u1_col_zero_flag)
456 u1_init = 1;*/
457
458 if(u1_zero_pred_cond_f || ((i1_ref_frame0 == 0) && (u1_col_zero_flag == 1)))
459 {
460 pi2_final_mv0 = &i2_def_mv[0];
461 ui2_mask_fwd |= (u2_mask << u1_sub_mb_num);
462 }
463 else
464 pi2_final_mv0 = &i2_spat_pred_mv[0];
465
466 if(u1_zero_pred_cond_b || ((i1_ref_frame1 == 0) && (u1_col_zero_flag == 1)))
467 {
468 pi2_final_mv1 = &i2_def_mv[0];
469 ui2_mask_bwd |= (u2_mask << u1_sub_mb_num);
470 }
471 else
472 pi2_final_mv1 = &i2_spat_pred_mv[2];
473
474 if(ps_cur_mb_info->u1_Mux != 1)
475 {
476 /*u1_sub_mb_x = u1_sub_mb_num & 0x03;
477 uc_sub_mb_y = (u1_sub_mb_num >> 2);*/
478 if(i1_ref_frame0 >= 0)
479 {
480
481 {
482 pred_info_pkd_t *ps_pred_pkd;
483 WORD8 i1_ref_idx= 0;
484
485 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
486 ih264d_fill_pred_info(pi2_final_mv0,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,i1_pred,
487 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
488 ps_pic_buff0->u1_pic_type);
489 ps_dec->u4_pred_info_pkd_idx++;
490 ps_cur_mb_info->u1_num_pred_parts++;
491
492
493 }
494
495 }
496
497 if(i1_ref_frame1 >= 0)
498 {
499 {
500 pred_info_pkd_t *ps_pred_pkd;
501 WORD8 i1_ref_idx= 0;
502
503 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
504 ih264d_fill_pred_info(pi2_final_mv1,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,i1_pred,
505 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
506 ps_pic_buff1->u1_pic_type);
507 ps_dec->u4_pred_info_pkd_idx++;
508 ps_cur_mb_info->u1_num_pred_parts++;
509
510
511 }
512 }
513 }
514
515 /* Replication optimisation */
516 s_temp_mv_pred.i2_mv[0] = pi2_final_mv0[0];
517 s_temp_mv_pred.i2_mv[1] = pi2_final_mv0[1];
518 s_temp_mv_pred.i2_mv[2] = pi2_final_mv1[0];
519 s_temp_mv_pred.i2_mv[3] = pi2_final_mv1[1];
520
521 /* Calculating colocated zero information */
522 {
523 WORD16 i2_mv_x = 0, i2_mv_y = 0;
524 /*************************************/
525 /* If(bit2 and bit3 set) */
526 /* then */
527 /* (bit0 and bit1) => submmbmode */
528 /* (bit2 and bit3) => mbmode */
529 /* else */
530 /* (bit0 and bit1) => mbmode */
531 /*************************************/
532 UWORD8 u1_packed_mb_sub_mb_mode =
533 sub_partition ? (s_mvdirect.i1_partitionsize[i]) : ((s_mvdirect.i1_partitionsize[i])
534 << 2);
535
536 if(i1_ref_frame0 >= 0)
537 {
538 i2_mv_x = pi2_final_mv0[0];
539 i2_mv_y = pi2_final_mv0[1];
540 }
541 else
542 {
543 i2_mv_x = pi2_final_mv1[0];
544 i2_mv_y = pi2_final_mv1[1];
545 }
546
547 u1_colz = (ps_cur_mb_info->u1_mb_field_decodingflag << 1)
548 | ((u1_final_ref_idx == 0) && (ABS(i2_mv_x) <= 1)
549 && (ABS(i2_mv_y) <= 1));
550 u1_colz |= (u1_packed_mb_sub_mb_mode << 4);
551 }
552 ps_mv = ps_mv_nmb_start + u1_sub_mb_num;
553 ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num, u1_colz,
554 u1_mb_parth, u1_mb_partw);
555 }
556 i = 0;
557 if(i1_ref_frame0 >= 0)
558 ps_cur_mb_info->u2_mask[i++] = ui2_mask_fwd;
559 if(i1_ref_frame1 >= 0)
560 ps_cur_mb_info->u2_mask[i] = ui2_mask_bwd;
561
562 /*if(u1_init)
563 H264_DEC_DEBUG_PRINT("hit\n");
564 else
565 H264_DEC_DEBUG_PRINT("miss\n");*/
566
567 return OK;
568}
569
570/*!
571 **************************************************************************
572 * \if Function name : ih264d_decode_temporal_direct \endif
573 *
574 * \brief
575 * Decodes temporal direct mode.
576 *
577 * \return
578 * None.
579 *
580 **************************************************************************
581 */
582WORD32 ih264d_decode_temporal_direct(dec_struct_t * ps_dec,
583 UWORD8 u1_wd_x,
584 dec_mb_info_t * ps_cur_mb_info,
585 UWORD8 u1_mb_num)
586{
587 struct pic_buffer_t *ps_pic_buff0, *ps_pic_buff1, *ps_col_pic;
588 mv_pred_t *ps_mv, s_temp_mv_pred;
589 UWORD8 u1_sub_mb_num;
590 UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
591 WORD16 i2_mv_x0, i2_mv_y0, i2_mv_x1, i2_mv_y1;
592 UWORD8 u1_mb_partw, u1_mb_parth;
593 UWORD8 i, partition_size, sub_partition;
594 UWORD32 *pui32_weight_ofsts = NULL;
595 directmv_t s_mvdirect;
596 const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth;
597 const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw;
598 WORD8 c_refFrm0, c_refFrm1;
599 UWORD8 u1_ref_idx0, u1_is_cur_mb_fld;
Isha Shrikant Kulkarnifc7139a2019-01-11 12:13:14 +0530600 WORD32 pic0_poc, pic1_poc, cur_poc;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530601 WORD32 ret = 0;
602
603 u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
604 ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][0];
605
606 /**********************************************************************/
607 /* Call the function which gets the number of partitions and */
608 /* partition info of colocated Mb */
609 /**********************************************************************/
610 ps_dec->pf_parse_mvdirect(ps_dec, ps_dec->ps_col_pic, &s_mvdirect, u1_wd_x,
611 ps_dec->i4_submb_ofst, ps_cur_mb_info);
612 ps_col_pic = ps_dec->ps_col_pic;
613
614 for(i = 0; i < s_mvdirect.i1_num_partitions; i++)
615 {
616 UWORD8 u1_colz;
617 partition_size = s_mvdirect.i1_partitionsize[i];
618 u1_sub_mb_num = s_mvdirect.i1_submb_num[i];
619 ps_mv = ps_col_pic->ps_mv + s_mvdirect.i4_mv_indices[i];
620
621 /* This should be removed to catch unitialized memory read */
622 u1_ref_idx0 = 0;
623
624 sub_partition = partition_size >> 2;
625 partition_size &= 0x3;
626 u1_mb_partw = pu1_mb_partw[partition_size];
627 u1_mb_parth = pu1_mb_parth[partition_size];
628 if(sub_partition != 0)
629 {
630 u1_mb_partw >>= 1;
631 u1_mb_parth >>= 1;
632 }
633 c_refFrm0 = ps_mv->i1_ref_frame[0];
634 c_refFrm1 = ps_mv->i1_ref_frame[1];
635
636 if((c_refFrm0 == -1) && (c_refFrm1 == -1))
637 {
638 u1_ref_idx0 = 0;
639 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][0];
640 if(u1_mbaff && u1_is_cur_mb_fld)
641 {
642 if(ps_cur_mb_info->u1_topmb)
643 {
644 pic0_poc = ps_pic_buff0->i4_top_field_order_cnt;
645 pic1_poc = ps_pic_buff1->i4_top_field_order_cnt;
646 cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
647 }
648 else
649 {
650 pic1_poc = ps_pic_buff1->i4_bottom_field_order_cnt;
651 cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
652 ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
653 pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt;
654 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][MAX_REF_BUFS];
655 }
656 }
657 else
658 {
659 pic0_poc = ps_pic_buff0->i4_avg_poc;
660 pic1_poc = ps_pic_buff1->i4_avg_poc;
661 cur_poc = ps_dec->ps_cur_pic->i4_poc;
662 }
663 }
664 else
665 {
666 UWORD8 uc_i, u1_num_frw_ref_pics;
667 UWORD8 buf_id, u1_pic_type;
668 buf_id = ps_mv->u1_col_ref_pic_idx;
669 u1_pic_type = ps_mv->u1_pic_type;
670 if(ps_dec->ps_cur_slice->u1_field_pic_flag)
671 {
672 if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD)
673 {
674 u1_pic_type = TOP_FLD;
675 if(ps_dec->ps_cur_slice->u1_bottom_field_flag)
676 u1_pic_type = BOT_FLD;
677 }
678 }
679 u1_num_frw_ref_pics =
680 ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
681
682 for(uc_i = 0; uc_i < u1_num_frw_ref_pics; uc_i++)
683 {
684 if(ps_dec->ps_cur_slice->u1_field_pic_flag)
685 {
686 if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_mv_buf_id == buf_id)
687 {
688 if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_pic_type
689 == u1_pic_type)
690 {
691 u1_ref_idx0 = uc_i;
692 break;
693 }
694 }
695 }
696 else
697 {
698 if(ps_dec->ps_ref_pic_buf_lx[0][uc_i]->u1_mv_buf_id == buf_id)
699 {
700 u1_ref_idx0 = uc_i;
701 break;
702 }
703 }
704 }
705
706 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u1_ref_idx0];
707 ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][0];
708
709 if(u1_mbaff && u1_is_cur_mb_fld)
710 {
711 pic0_poc = ps_pic_buff0->i4_top_field_order_cnt;
712 u1_ref_idx0 <<= 1;
713 if(s_mvdirect.u1_vert_mv_scale == ONE_TO_ONE)
714 {
715 if(u1_pic_type == BOT_FLD)
716 {
717 pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt;
718 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][(u1_ref_idx0
719 >> 1) + MAX_REF_BUFS];
720 if(ps_cur_mb_info->u1_topmb)
721 u1_ref_idx0++;
722 }
723 else
724 {
725 if(1 - ps_cur_mb_info->u1_topmb)
726 u1_ref_idx0++;
727 }
728 }
729 if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD)
730 {
731 if(1 - ps_cur_mb_info->u1_topmb)
732 {
733 pic0_poc = ps_pic_buff0->i4_bottom_field_order_cnt;
734 ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][(u1_ref_idx0
735 >> 1) + MAX_REF_BUFS];
736 }
737 }
738 if(ps_cur_mb_info->u1_topmb)
739 {
740 pic1_poc = ps_pic_buff1->i4_top_field_order_cnt;
741 cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt;
742 }
743 else
744 {
745 pic1_poc = ps_pic_buff1->i4_bottom_field_order_cnt;
746 cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt;
747 ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
748 }
749 }
750 else
751 {
752 pic0_poc = ps_pic_buff0->i4_avg_poc;
753 pic1_poc = ps_pic_buff1->i4_avg_poc;
754 cur_poc = ps_dec->ps_cur_pic->i4_poc;
755 }
756 }
757 {
758 WORD16 i16_td;
Isha Shrikant Kulkarnifc7139a2019-01-11 12:13:14 +0530759 WORD32 diff;
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530760 if(c_refFrm0 >= 0)
761 {
762 i2_mv_x0 = ps_mv->i2_mv[0];
763 i2_mv_y0 = ps_mv->i2_mv[1];
764 }
765 else if(c_refFrm1 >= 0)
766 {
767 i2_mv_x0 = ps_mv->i2_mv[2];
768 i2_mv_y0 = ps_mv->i2_mv[3];
769 }
770 else
771 {
772 i2_mv_x0 = 0;
773 i2_mv_y0 = 0;
774 }
775 /* If FRM_TO_FLD or FLD_TO_FRM scale the "y" component of the colocated Mv*/
776 if(s_mvdirect.u1_vert_mv_scale == FRM_TO_FLD)
777 {
778 i2_mv_y0 /= 2;
779 }
780 else if(s_mvdirect.u1_vert_mv_scale == FLD_TO_FRM)
781 {
782 i2_mv_y0 *= 2;
783 }
784
Isha Shrikant Kulkarnifc7139a2019-01-11 12:13:14 +0530785 diff = pic1_poc - pic0_poc;
786 i16_td = CLIP_S8(diff);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530787 if((ps_pic_buff0->u1_is_short == 0) || (i16_td == 0))
788 {
789 i2_mv_x1 = 0;
790 i2_mv_y1 = 0;
791 }
792 else
793 {
794 WORD16 i16_tb, i16_tx, i2_dist_scale_factor, i16_temp;
795
Isha Shrikant Kulkarnifc7139a2019-01-11 12:13:14 +0530796 diff = cur_poc - pic0_poc;
797 i16_tb = CLIP_S8(diff);
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530798
799 i16_tx = (16384 + ABS(SIGN_POW2_DIV(i16_td, 1))) / i16_td;
Isha Shrikant Kulkarnifc7139a2019-01-11 12:13:14 +0530800 i2_dist_scale_factor = CLIP_S11(
Hamsalekha S8d3d3032015-03-13 21:24:58 +0530801 (((i16_tb * i16_tx) + 32) >> 6));
802 i16_temp = (i2_mv_x0 * i2_dist_scale_factor + 128) >> 8;
803 i2_mv_x1 = i16_temp - i2_mv_x0;
804 i2_mv_x0 = i16_temp;
805
806 i16_temp = (i2_mv_y0 * i2_dist_scale_factor + 128) >> 8;
807 i2_mv_y1 = i16_temp - i2_mv_y0;
808 i2_mv_y0 = i16_temp;
809 }
810 {
811 mv_pred_t *ps_mv;
812
813 /*u1_sub_mb_x = u1_sub_mb_num & 0x03;
814 uc_sub_mb_y = u1_sub_mb_num >> 2;*/
815 if(ps_dec->ps_cur_pps->u1_wted_bipred_idc)
816 {
817 UWORD8 u1_idx =
818 u1_ref_idx0
819 * ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
820 UWORD8 u1_scale_ref = u1_mbaff && u1_is_cur_mb_fld;
821 if(u1_scale_ref)
822 u1_idx >>= 1;
823 pui32_weight_ofsts = (UWORD32*)&ps_dec->pu4_wt_ofsts[2
824 * X3(u1_idx)];
825 if(u1_scale_ref
826 && (ps_dec->ps_cur_pps->u1_wted_bipred_idc
827 == 2))
828 {
829 WORD16 i2_ref_idx;
830 i2_ref_idx = u1_ref_idx0;
831 i2_ref_idx *=
832 (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
833 << 1);
834 if(!ps_cur_mb_info->u1_topmb)
835 i2_ref_idx +=
836 (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]
837 << 1)
838 * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]
839 << 1);
840 pui32_weight_ofsts =
841 (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2
842 * X3(i2_ref_idx)];
843 }
844 }
845 {
846 pred_info_pkd_t *ps_pred_pkd;
847 WORD16 i2_mv[2];
848 WORD8 i1_ref_idx= 0;
849
850 i2_mv[0] = i2_mv_x0;
851 i2_mv[1] = i2_mv_y0;
852
853 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
854 ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,PRED_L0 | PRED_L1,
855 ps_pred_pkd,ps_pic_buff0->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
856 ps_pic_buff0->u1_pic_type);
857 ps_dec->u4_pred_info_pkd_idx++;
858 ps_cur_mb_info->u1_num_pred_parts++;
859
860
861 }
862 {
863 pred_info_pkd_t *ps_pred_pkd;
864 WORD16 i2_mv[2];
865 WORD8 i1_ref_idx= 0;
866
867 i2_mv[0] = i2_mv_x1;
868 i2_mv[1] = i2_mv_y1;
869
870 ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx;
871 ih264d_fill_pred_info(i2_mv,u1_mb_partw,u1_mb_parth,u1_sub_mb_num,PRED_L0 | PRED_L1,
872 ps_pred_pkd,ps_pic_buff1->u1_pic_buf_id,i1_ref_idx,pui32_weight_ofsts,
873 ps_pic_buff1->u1_pic_type);
874 ps_dec->u4_pred_info_pkd_idx++;
875 ps_cur_mb_info->u1_num_pred_parts++;
876
877
878 }
879
880 /* Replication optimisation */
881 s_temp_mv_pred.i2_mv[0] = i2_mv_x0;
882 s_temp_mv_pred.i2_mv[1] = i2_mv_y0;
883 s_temp_mv_pred.i2_mv[2] = i2_mv_x1;
884 s_temp_mv_pred.i2_mv[3] = i2_mv_y1;
885 s_temp_mv_pred.i1_ref_frame[0] = u1_ref_idx0;
886 s_temp_mv_pred.i1_ref_frame[1] = 0;
887 s_temp_mv_pred.u1_col_ref_pic_idx = ps_pic_buff0->u1_mv_buf_id;
888 s_temp_mv_pred.u1_pic_type = ps_pic_buff0->u1_pic_type;
889 ps_mv = ps_dec->ps_mv_cur + (u1_mb_num << 4) + u1_sub_mb_num;
890
891 {
892 WORD16 i2_mv_x = 0, i2_mv_y = 0;
893 UWORD8 u1_packed_mb_sub_mb_mode =
894 sub_partition ? (s_mvdirect.i1_partitionsize[i]) : ((s_mvdirect.i1_partitionsize[i])
895 << 2);
896
897 if(c_refFrm0 >= 0)
898 {
899 i2_mv_x = i2_mv_x0;
900 i2_mv_y = i2_mv_y0;
901 }
902 else
903 {
904 i2_mv_x = i2_mv_x1;
905 i2_mv_y = i2_mv_y1;
906 }
907
908 u1_colz =
909 (ps_cur_mb_info->u1_mb_field_decodingflag << 1)
910 | ((u1_ref_idx0 == 0)
911 && (ABS(i2_mv_x)
912 <= 1)
913 && (ABS(i2_mv_y)
914 <= 1));
915 u1_colz |= (u1_packed_mb_sub_mb_mode << 4);
916 }
917 ih264d_rep_mv_colz(ps_dec, &s_temp_mv_pred, ps_mv, u1_sub_mb_num,
918 u1_colz, u1_mb_parth, u1_mb_partw);
919 }
920 }
921 }
922 /* return value set to UWORD8 to make it homogeneous */
923 /* with decodespatialdirect */
924 return OK;
925}
926
927void ih264d_convert_frm_to_fld_list(struct pic_buffer_t *ps_ref_pic_buf_lx,
928 UWORD8 *pu1_L0,
929 dec_struct_t *ps_dec,
930 UWORD8 u1_num_short_term_bufs)
931{
932 UWORD8 uc_count = *pu1_L0, i, uc_l1, uc_lx, j;
933 struct pic_buffer_t *ps_ref_lx[2], *ps_ref_pic_lx;
934 UWORD8 u1_bottom_field_flag;
935 dec_slice_params_t *ps_cur_slice;
936 UWORD8 u1_ref[2], u1_fld[2], u1_same_fld, u1_op_fld;
937 UWORD32 ui_half_num_of_sub_mbs;
938
939 uc_l1 = 0;
940 uc_lx = 0;
941 ps_cur_slice = ps_dec->ps_cur_slice;
942 ps_ref_pic_lx = ps_ref_pic_buf_lx - MAX_REF_BUFS;
943 ps_ref_lx[0] = ps_ref_pic_buf_lx;
944 ps_ref_lx[1] = ps_ref_pic_buf_lx;
945 u1_bottom_field_flag = ps_cur_slice->u1_bottom_field_flag;
946 ui_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
947 if(u1_bottom_field_flag)
948 {
949 u1_ref[0] = BOT_REF;
950 u1_ref[1] = TOP_REF;
951 u1_fld[0] = BOT_FLD;
952 u1_fld[1] = TOP_FLD;
953 u1_same_fld = BOT_FLD;
954 u1_op_fld = TOP_FLD;
955 }
956 else
957 {
958 u1_ref[0] = TOP_REF;
959 u1_ref[1] = BOT_REF;
960 u1_fld[0] = TOP_FLD;
961 u1_fld[1] = BOT_FLD;
962 u1_same_fld = TOP_FLD;
963 u1_op_fld = BOT_FLD;
964 }
965
966 /* Create the field list starting with all the short term */
967 /* frames followed by all the long term frames. No long term */
968 /* reference field should have a list idx less than a short */
969 /* term reference field during initiailization. */
970
971 for(j = 0; j < 2; j++)
972 {
973 i = ((j == 0) ? 0 : u1_num_short_term_bufs);
974 uc_count = ((j == 0) ? u1_num_short_term_bufs : *pu1_L0);
975 for(; i < uc_count; i++, ps_ref_lx[0]++)
976 {
977 /* Search field of same parity in Frame list */
978 if((ps_ref_lx[0]->u1_pic_type & u1_ref[0])) // || ((ps_ref_lx[0]->u1_picturetype & 0x3) == 0))
979 {
980 /* Insert PIC of same parity in RefPicList */
981 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx, ps_ref_lx[0]);
982 ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2 + 1);
983 ps_ref_pic_lx->u1_long_term_pic_num =
984 (ps_ref_pic_lx->u1_long_term_frm_idx * 2 + 1);
985 ps_ref_pic_lx->u1_pic_type = u1_same_fld;
986 if(u1_fld[0] & BOT_FLD)
987 {
988 ps_ref_pic_lx->u1_pic_type = BOT_FLD;
989 ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y;
990 ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv;
991 ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv;
992 if(ps_ref_pic_lx->u1_picturetype & 0x3)
993 {
994 ps_ref_pic_lx->pu1_col_zero_flag += ui_half_num_of_sub_mbs;
995 ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs;
996 }
997 ps_ref_pic_lx->i4_poc =
998 ps_ref_pic_lx->i4_bottom_field_order_cnt;
999 ps_ref_pic_lx->i4_avg_poc =
1000 ps_ref_pic_lx->i4_bottom_field_order_cnt;
1001 }
1002 else
1003 {
1004 ps_ref_pic_lx->u1_pic_type = TOP_FLD;
1005 ps_ref_pic_lx->i4_poc = ps_ref_pic_lx->i4_top_field_order_cnt;
1006 ps_ref_pic_lx->i4_avg_poc =
1007 ps_ref_pic_lx->i4_top_field_order_cnt;
1008 }
1009
1010 ps_ref_pic_lx++;
1011 uc_lx++;
1012 /* Find field of opposite parity */
1013 if(uc_l1 < uc_count && ps_ref_lx[1])
1014 {
1015 while(!(ps_ref_lx[1]->u1_pic_type & u1_ref[1]))
1016 {
1017 ps_ref_lx[1]++;
1018 uc_l1++;
1019 if(uc_l1 >= uc_count)
1020 ps_ref_lx[1] = 0;
1021 if(!ps_ref_lx[1])
1022 break;
1023 }
1024
1025 if(ps_ref_lx[1])
1026 {
1027 uc_l1++;
1028 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx,
1029 ps_ref_lx[1]);
1030 ps_ref_pic_lx->u1_pic_type = u1_op_fld;
1031 ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2);
1032 ps_ref_pic_lx->u1_long_term_pic_num =
1033 (ps_ref_pic_lx->u1_long_term_frm_idx * 2);
1034 if(u1_fld[1] & BOT_FLD)
1035 {
1036 ps_ref_pic_lx->u1_pic_type = BOT_FLD;
1037 ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y;
1038 ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv;
1039 ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv;
1040 if(ps_ref_pic_lx->u1_picturetype & 0x3)
1041 {
1042 ps_ref_pic_lx->pu1_col_zero_flag +=
1043 ui_half_num_of_sub_mbs;
1044 ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs;
1045 }
1046 ps_ref_pic_lx->i4_poc =
1047 ps_ref_pic_lx->i4_bottom_field_order_cnt;
1048 ps_ref_pic_lx->i4_avg_poc =
1049 ps_ref_pic_lx->i4_bottom_field_order_cnt;
1050 }
1051 else
1052 {
1053 ps_ref_pic_lx->u1_pic_type = TOP_FLD;
1054 ps_ref_pic_lx->i4_poc =
1055 ps_ref_pic_lx->i4_top_field_order_cnt;
1056 ps_ref_pic_lx->i4_avg_poc =
1057 ps_ref_pic_lx->i4_top_field_order_cnt;
1058 }
1059 ps_ref_pic_lx++;
1060 uc_lx++;
1061 ps_ref_lx[1]++;
1062 }
1063 }
1064 }
1065 }
1066
1067 /* Same parity fields are over, now insert left over opposite parity fields */
1068 /** Added if(ps_ref_lx[1]) for error checks */
1069 if(ps_ref_lx[1])
1070 {
1071 for(; uc_l1 < uc_count; uc_l1++)
1072 {
1073 if(ps_ref_lx[1]->u1_pic_type & u1_ref[1])
1074 {
1075 /* Insert PIC of opposite parity in RefPicList */
1076 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_lx,
1077 ps_ref_lx[1]);
1078 ps_ref_pic_lx->u1_pic_type = u1_op_fld;
1079 ps_ref_pic_lx->i4_pic_num = (ps_ref_pic_lx->i4_pic_num * 2);
1080 ps_ref_pic_lx->u1_long_term_pic_num =
1081 (ps_ref_pic_lx->u1_long_term_frm_idx * 2);
1082 if(u1_op_fld == BOT_FLD)
1083 {
1084 ps_ref_pic_lx->u1_pic_type = BOT_FLD;
1085 ps_ref_pic_lx->pu1_buf1 += ps_ref_pic_lx->u2_frm_wd_y;
1086 ps_ref_pic_lx->pu1_buf2 += ps_ref_pic_lx->u2_frm_wd_uv;
1087 ps_ref_pic_lx->pu1_buf3 += ps_ref_pic_lx->u2_frm_wd_uv;
1088 if(ps_ref_pic_lx->u1_picturetype & 0x3)
1089 {
1090 ps_ref_pic_lx->pu1_col_zero_flag +=
1091 ui_half_num_of_sub_mbs;
1092 ps_ref_pic_lx->ps_mv += ui_half_num_of_sub_mbs;
1093 }
1094 ps_ref_pic_lx->i4_poc =
1095 ps_ref_pic_lx->i4_bottom_field_order_cnt;
1096 ps_ref_pic_lx->i4_avg_poc =
1097 ps_ref_pic_lx->i4_bottom_field_order_cnt;
1098 }
1099 else
1100 {
1101 ps_ref_pic_lx->i4_poc =
1102 ps_ref_pic_lx->i4_top_field_order_cnt;
1103 ps_ref_pic_lx->i4_avg_poc =
1104 ps_ref_pic_lx->i4_top_field_order_cnt;
1105 }
1106 ps_ref_pic_lx++;
1107 uc_lx++;
1108 ps_ref_lx[1]++;
1109 }
1110 }
1111 }
1112 }
1113 *pu1_L0 = uc_lx;
1114}
1115
1116void ih264d_convert_frm_mbaff_list(dec_struct_t *ps_dec)
1117{
1118 struct pic_buffer_t **ps_ref_pic_lx;
1119 UWORD8 u1_max_ref_idx, idx;
1120 UWORD16 u2_frm_wd_y, u2_frm_wd_uv;
1121 struct pic_buffer_t **ps_ref_pic_buf_lx;
1122 UWORD32 u4_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht * ps_dec->u2_pic_wd) >> 5);
1123
1124 ps_ref_pic_buf_lx = ps_dec->ps_ref_pic_buf_lx[0];
1125 ps_ref_pic_lx = ps_dec->ps_ref_pic_buf_lx[0];
1126 u1_max_ref_idx = ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0];
1127 for(idx = 0; idx < u1_max_ref_idx; idx++)
1128 {
1129 ps_ref_pic_lx[idx]->u1_pic_type = TOP_FLD;
1130 ps_ref_pic_lx[idx]->i4_poc = ps_ref_pic_lx[idx]->i4_top_field_order_cnt;
1131
1132 }
1133 u2_frm_wd_y = ps_dec->u2_frm_wd_y;
1134 u2_frm_wd_uv = ps_dec->u2_frm_wd_uv;
1135
1136 for(idx = 0; idx < u1_max_ref_idx; idx++)
1137 {
1138 *ps_ref_pic_lx[idx + MAX_REF_BUFS] = *ps_ref_pic_buf_lx[idx];
1139 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf1 =
1140 ps_ref_pic_buf_lx[idx]->pu1_buf1 + u2_frm_wd_y;
1141 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf2 =
1142 ps_ref_pic_buf_lx[idx]->pu1_buf2 + u2_frm_wd_uv;
1143 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf3 =
1144 ps_ref_pic_buf_lx[idx]->pu1_buf3 + u2_frm_wd_uv;
1145
1146 ps_ref_pic_lx[idx + MAX_REF_BUFS]->u1_pic_type = BOT_FLD;
1147 ps_ref_pic_lx[idx + MAX_REF_BUFS]->i4_poc =
1148 ps_ref_pic_buf_lx[idx]->i4_bottom_field_order_cnt;
1149 if(ps_ref_pic_buf_lx[idx]->u1_picturetype & 0x3)
1150 {
1151 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_col_zero_flag =
1152 ps_ref_pic_buf_lx[idx]->pu1_col_zero_flag
1153 + u4_half_num_of_sub_mbs;
1154 ps_ref_pic_lx[idx + MAX_REF_BUFS]->ps_mv =
1155 ps_ref_pic_buf_lx[idx]->ps_mv + u4_half_num_of_sub_mbs;
1156 }
1157 }
1158
1159 if(ps_dec->u1_B)
1160 {
1161 ps_ref_pic_buf_lx = ps_dec->ps_ref_pic_buf_lx[1];
1162 ps_ref_pic_lx = ps_dec->ps_ref_pic_buf_lx[1];
1163 u1_max_ref_idx = ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1];
1164 for(idx = 0; idx < u1_max_ref_idx; idx++)
1165 {
1166 ps_ref_pic_lx[idx]->u1_pic_type = TOP_FLD;
1167 ps_ref_pic_lx[idx]->i4_poc = ps_ref_pic_lx[idx]->i4_top_field_order_cnt;
1168
1169 }
1170
1171 for(idx = 0; idx < u1_max_ref_idx; idx++)
1172 {
1173 *ps_ref_pic_lx[idx + MAX_REF_BUFS] = *ps_ref_pic_buf_lx[idx];
1174 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf1 =
1175 ps_ref_pic_buf_lx[idx]->pu1_buf1 + u2_frm_wd_y;
1176 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf2 =
1177 ps_ref_pic_buf_lx[idx]->pu1_buf2 + u2_frm_wd_uv;
1178 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_buf3 =
1179 ps_ref_pic_buf_lx[idx]->pu1_buf3 + u2_frm_wd_uv;
1180 ps_ref_pic_lx[idx + MAX_REF_BUFS]->u1_pic_type = BOT_FLD;
1181 ps_ref_pic_lx[idx + MAX_REF_BUFS]->i4_poc =
1182 ps_ref_pic_buf_lx[idx]->i4_bottom_field_order_cnt;
1183
1184 if(ps_ref_pic_buf_lx[idx]->u1_picturetype & 0x3)
1185 {
1186 ps_ref_pic_lx[idx + MAX_REF_BUFS]->pu1_col_zero_flag =
1187 ps_ref_pic_buf_lx[idx]->pu1_col_zero_flag
1188 + u4_half_num_of_sub_mbs;
1189 ps_ref_pic_lx[idx + MAX_REF_BUFS]->ps_mv =
1190 ps_ref_pic_buf_lx[idx]->ps_mv
1191 + u4_half_num_of_sub_mbs;
1192 }
1193 }
1194 }
1195}
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001196static int poc_compare(const void *pv_pic1, const void *pv_pic2)
1197{
1198 struct pic_buffer_t *ps_pic1 = *(struct pic_buffer_t **) pv_pic1;
1199 struct pic_buffer_t *ps_pic2 = *(struct pic_buffer_t **) pv_pic2;
1200 if (ps_pic1->i4_poc < ps_pic2->i4_poc)
1201 {
1202 return -1;
1203 }
1204 else if (ps_pic1->i4_poc > ps_pic2->i4_poc)
1205 {
1206 return 1;
1207 }
1208 else
1209 {
1210 return 0;
1211 }
1212}
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301213/*!
1214 **************************************************************************
1215 * \if Function name : ih264d_init_ref_idx_lx_b \endif
1216 *
1217 * \brief
1218 * Initializes forward and backward refernce lists for B slice decoding.
1219 *
1220 *
1221 * \return
1222 * 0 on Success and Error code otherwise
1223 **************************************************************************
1224 */
1225void ih264d_init_ref_idx_lx_b(dec_struct_t *ps_dec)
1226{
1227 struct pic_buffer_t *ps_ref_pic_buf_lx;
1228 dpb_manager_t *ps_dpb_mgr;
1229 struct dpb_info_t *ps_next_dpb;
1230 WORD32 i_cur_poc, i_max_st_poc, i_min_st_poc, i_ref_poc, i_temp_poc;
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001231 WORD8 i, j;
Hamsalekha Scbcd2842017-06-16 16:33:48 +05301232 UWORD8 u1_max_lt_index, u1_min_lt_index;
1233 UWORD32 u4_lt_index;
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001234 WORD32 i_cur_idx;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301235 UWORD8 u1_field_pic_flag;
1236 dec_slice_params_t *ps_cur_slice;
1237 UWORD8 u1_L0, u1_L1;
1238 UWORD8 u1_num_short_term_bufs;
1239 UWORD8 u1_max_ref_idx_l0, u1_max_ref_idx_l1;
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001240 struct pic_buffer_t *aps_st_pic_bufs[2 * MAX_REF_BUFS] = {NULL};
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301241 ps_cur_slice = ps_dec->ps_cur_slice;
1242 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag;
1243 u1_max_ref_idx_l0 = ps_cur_slice->u1_num_ref_idx_lx_active[0]
1244 << u1_field_pic_flag;
1245 u1_max_ref_idx_l1 = ps_cur_slice->u1_num_ref_idx_lx_active[1]
1246 << u1_field_pic_flag;
1247
1248 ps_dpb_mgr = ps_dec->ps_dpb_mgr;
1249 /* Get the current POC */
1250 i_cur_poc = ps_dec->ps_cur_pic->i4_poc;
1251
1252 /* Get MaxStPOC,MinStPOC,MaxLt,MinLt */
1253 i_max_st_poc = i_cur_poc;
1254 i_min_st_poc = i_cur_poc;
1255 u1_max_lt_index = MAX_REF_BUFS + 1;
1256 u1_min_lt_index = MAX_REF_BUFS + 1;
1257 /* Start from ST head */
1258 ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1259 for(i = 0; i < ps_dpb_mgr->u1_num_st_ref_bufs; i++)
1260 {
1261 i_ref_poc = ps_next_dpb->ps_pic_buf->i4_poc;
1262 if(i_ref_poc < i_cur_poc)
1263 {
1264 /* RefPic Buf POC is before Current POC in display order */
1265 i_min_st_poc = MIN(i_min_st_poc, i_ref_poc);
1266 }
1267 else
1268 {
1269 /* RefPic Buf POC is after Current POC in display order */
1270 i_max_st_poc = MAX(i_max_st_poc, i_ref_poc);
1271 }
1272
1273 /* Chase the next link */
1274 ps_next_dpb = ps_next_dpb->ps_prev_short;
1275 }
1276
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001277 /* Sort ST ref pocs in ascending order */
1278 ps_next_dpb = ps_dpb_mgr->ps_dpb_st_head;
1279 for (j = 0; j < ps_dpb_mgr->u1_num_st_ref_bufs; j++)
1280 {
1281 aps_st_pic_bufs[j] = ps_next_dpb->ps_pic_buf;
1282 ps_next_dpb = ps_next_dpb->ps_prev_short;
1283 }
1284 qsort(aps_st_pic_bufs, ps_dpb_mgr->u1_num_st_ref_bufs,
1285 sizeof(aps_st_pic_bufs[0]), poc_compare);
1286
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301287 /* Start from LT head */
1288 ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
1289 if(ps_next_dpb)
1290 {
1291 u1_max_lt_index = ps_next_dpb->u1_lt_idx;
1292 u1_min_lt_index = ps_next_dpb->u1_lt_idx;
1293 }
1294 for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
1295 {
Hamsalekha Scbcd2842017-06-16 16:33:48 +05301296 u4_lt_index = ps_next_dpb->u1_lt_idx;
1297 u1_max_lt_index = (UWORD8)(MAX(u1_max_lt_index, u4_lt_index));
1298 u1_min_lt_index = (UWORD8)(MIN(u1_min_lt_index, u4_lt_index));
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301299
1300 /* Chase the next link */
1301 ps_next_dpb = ps_next_dpb->ps_prev_long;
1302 }
1303
1304 /* 1. Initialize refIdxL0 */
1305 u1_L0 = 0;
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001306 i_temp_poc = i_cur_poc;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301307 if(u1_field_pic_flag)
1308 {
1309 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0];
1310 ps_ref_pic_buf_lx += MAX_REF_BUFS;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301311 }
1312 else
1313 {
1314 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0];
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001315 /* Avoid integer overflow while decrementing by one */
1316 if (i_temp_poc > INT32_MIN)
1317 i_temp_poc--;
1318 }
1319
1320 i_cur_idx = -1;
1321 for(j = 0; j < ps_dpb_mgr->u1_num_st_ref_bufs; j++)
1322 {
1323 if (NULL == aps_st_pic_bufs[j])
1324 {
1325 break;
1326 }
1327 if (aps_st_pic_bufs[j]->i4_poc <= i_temp_poc)
1328 {
1329 i_cur_idx = j;
1330 }
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301331 }
1332 /* Arrange all short term buffers in output order as given by POC */
1333 /* 1.1 Arrange POC's less than CurrPOC in the descending POC order starting
1334 from (CurrPOC - 1)*/
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001335 for(j = i_cur_idx; j >= 0; j--)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301336 {
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001337 if(aps_st_pic_bufs[j])
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301338 {
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001339 /* Copy info in pic buffer */
1340 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1341 aps_st_pic_bufs[j]);
1342 ps_ref_pic_buf_lx++;
1343 u1_L0++;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301344 }
1345 }
1346
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001347 /* 1.2. Arrange POC's more than CurrPOC in the ascending POC order starting
1348 from (CurrPOC + 1)*/
1349 for(j = i_cur_idx + 1; j < ps_dpb_mgr->u1_num_st_ref_bufs; j++)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301350 {
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001351 if(aps_st_pic_bufs[j])
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301352 {
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001353 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1354 aps_st_pic_bufs[j]);
1355 ps_ref_pic_buf_lx++;
1356 u1_L0++;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301357 }
1358 }
1359
1360 /* 1.3 Arrange all Long term buffers in ascending order, in LongtermIndex */
1361 /* Start from ST head */
1362
1363 u1_num_short_term_bufs = u1_L0;
Hamsalekha Scbcd2842017-06-16 16:33:48 +05301364 for(u4_lt_index = u1_min_lt_index; u4_lt_index <= u1_max_lt_index; u4_lt_index++)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301365 {
1366 ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
1367 for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
1368 {
Hamsalekha Scbcd2842017-06-16 16:33:48 +05301369 if(ps_next_dpb->u1_lt_idx == u4_lt_index)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301370 {
1371 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1372 ps_next_dpb->ps_pic_buf);
1373 ps_ref_pic_buf_lx->u1_long_term_pic_num =
1374 ps_ref_pic_buf_lx->u1_long_term_frm_idx;
1375
1376 ps_ref_pic_buf_lx++;
1377 u1_L0++;
1378 break;
1379 }
1380 ps_next_dpb = ps_next_dpb->ps_prev_long;
1381 }
1382 }
1383
1384 if(u1_field_pic_flag)
1385 {
1386 /* Initialize the rest of the entries in the */
1387 /* reference list to handle of errors */
1388 {
1389 UWORD8 u1_i;
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301390 pic_buffer_t ref_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301391
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301392 ref_pic = *(ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301393
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301394 if(NULL == ref_pic.pu1_buf1)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301395 {
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301396 ref_pic = *ps_dec->ps_cur_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301397 }
1398 for(u1_i = u1_L0; u1_i < u1_max_ref_idx_l0; u1_i++)
1399 {
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301400 *ps_ref_pic_buf_lx = ref_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301401 ps_ref_pic_buf_lx++;
1402 }
1403 }
1404 ih264d_convert_frm_to_fld_list(
1405 ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS, &u1_L0,
1406 ps_dec, u1_num_short_term_bufs);
1407
1408 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[0][0] + u1_L0;
1409 }
1410
1411 ps_dec->ps_cur_slice->u1_initial_list_size[0] = u1_L0;
1412
1413 /* Initialize the rest of the entries in the */
1414 /* reference list to handle of errors */
1415 {
1416 UWORD8 u1_i;
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301417 pic_buffer_t ref_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301418
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301419 ref_pic = *(ps_dpb_mgr->ps_init_dpb[0][0]);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301420
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301421 if(NULL == ref_pic.pu1_buf1)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301422 {
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301423 ref_pic = *ps_dec->ps_cur_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301424 }
1425 for(u1_i = u1_L0; u1_i < u1_max_ref_idx_l0; u1_i++)
1426 {
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301427 *ps_ref_pic_buf_lx = ref_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301428 ps_ref_pic_buf_lx++;
1429 }
1430 }
1431 {
1432 /* 2. Initialize refIdxL1 */
1433 u1_L1 = 0;
1434 if(u1_field_pic_flag)
1435 {
1436 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0] + MAX_REF_BUFS;
1437 }
1438 else
1439 {
1440 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0];
1441 }
1442
1443 /* 2.1. Arrange POC's more than CurrPOC in the ascending POC order starting
1444 from (CurrPOC + 1)*/
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001445 for(j = i_cur_idx + 1; j < ps_dpb_mgr->u1_num_st_ref_bufs; j++)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301446 {
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001447 if(aps_st_pic_bufs[j])
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301448 {
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001449 /* Start from ST head */
1450 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1451 aps_st_pic_bufs[j]);
1452 ps_ref_pic_buf_lx++;
1453 u1_L1++;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301454 }
1455 }
1456
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301457 /* Arrange all short term buffers in output order as given by POC */
1458 /* 2.2 Arrange POC's less than CurrPOC in the descending POC order starting
1459 from (CurrPOC - 1)*/
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001460 for(j = i_cur_idx; j >= 0; j--)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301461 {
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001462 if(aps_st_pic_bufs[j])
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301463 {
Harish Mahendrakaref807fd2019-07-03 15:02:43 -07001464 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1465 aps_st_pic_bufs[j]);
1466 ps_ref_pic_buf_lx++;
1467 u1_L1++;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301468 }
1469 }
1470
1471 /* 2.3 Arrange all Long term buffers in ascending order, in LongtermIndex */
1472 /* Start from ST head */
1473 u1_num_short_term_bufs = u1_L1;
Harish Mahendrakar54cbe1b2016-12-05 12:24:09 +05301474
Hamsalekha Scbcd2842017-06-16 16:33:48 +05301475 for(u4_lt_index = u1_min_lt_index; u4_lt_index <= u1_max_lt_index;
1476 u4_lt_index++)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301477 {
Harish Mahendrakar54cbe1b2016-12-05 12:24:09 +05301478 ps_next_dpb = ps_dpb_mgr->ps_dpb_ht_head;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301479 for(i = 0; i < ps_dpb_mgr->u1_num_lt_ref_bufs; i++)
1480 {
Hamsalekha Scbcd2842017-06-16 16:33:48 +05301481 if(ps_next_dpb->u1_lt_idx == u4_lt_index)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301482 {
1483 ih264d_insert_pic_in_ref_pic_listx(ps_ref_pic_buf_lx,
1484 ps_next_dpb->ps_pic_buf);
1485 ps_ref_pic_buf_lx->u1_long_term_pic_num =
1486 ps_ref_pic_buf_lx->u1_long_term_frm_idx;
1487 ps_ref_pic_buf_lx++;
1488 u1_L1++;
1489 break;
1490 }
1491 ps_next_dpb = ps_next_dpb->ps_prev_long;
1492 }
1493 }
1494
1495 if(u1_field_pic_flag)
1496 {
1497 /* Initialize the rest of the entries in the */
1498 /* reference list to handle of errors */
1499 {
1500 UWORD8 u1_i;
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301501 pic_buffer_t ref_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301502
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301503 ref_pic = *(ps_dpb_mgr->ps_init_dpb[0][0] + MAX_REF_BUFS);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301504
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301505 if(NULL == ref_pic.pu1_buf1)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301506 {
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301507 ref_pic = *ps_dec->ps_cur_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301508 }
1509 for(u1_i = u1_L1; u1_i < u1_max_ref_idx_l1; u1_i++)
1510 {
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301511 *ps_ref_pic_buf_lx = ref_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301512 ps_ref_pic_buf_lx++;
1513 }
1514 }
1515
1516 ih264d_convert_frm_to_fld_list(
1517 ps_dpb_mgr->ps_init_dpb[1][0] + MAX_REF_BUFS,
1518 &u1_L1, ps_dec, u1_num_short_term_bufs);
1519 ps_ref_pic_buf_lx = ps_dpb_mgr->ps_init_dpb[1][0] + u1_L1;
1520 }
1521
1522 ps_dec->ps_cur_slice->u1_initial_list_size[1] = u1_L1;
1523
1524 /* Initialize the rest of the entries in the */
1525 /* reference list to handle of errors */
1526 {
1527 UWORD8 u1_i;
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301528 pic_buffer_t ref_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301529
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301530 ref_pic = *(ps_dpb_mgr->ps_init_dpb[0][0]);
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301531
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301532 if(NULL == ref_pic.pu1_buf1)
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301533 {
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301534 ref_pic = *ps_dec->ps_cur_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301535 }
1536 for(u1_i = u1_L1; u1_i < u1_max_ref_idx_l1; u1_i++)
1537 {
Isha Kulkarni2f8dcdd2019-05-10 12:16:01 +05301538 *ps_ref_pic_buf_lx = ref_pic;
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301539 ps_ref_pic_buf_lx++;
1540 }
1541 }
1542
1543 /* If list0 and list 1 ebtries are same then swap the 0th and 1st entry */
1544 /* of list 1 */
1545 {
1546 struct pic_buffer_t *ps_ref_pic1_buf_l0, *ps_ref_pic1_buf_l1;
1547 struct pic_buffer_t s_ref_pic1_buf_temp;
1548
1549 ps_ref_pic1_buf_l0 = ps_dpb_mgr->ps_init_dpb[0][0];
1550 ps_ref_pic1_buf_l1 = ps_dpb_mgr->ps_init_dpb[1][0];
1551
1552 if((u1_L0 == u1_L1) && (u1_L0 > 1))
1553 {
1554 WORD32 i_index, i_swap;
1555
1556 i_swap = 1;
1557
1558 for(i_index = 0; i_index < u1_L0; i_index++)
1559 {
1560 if((ps_ref_pic1_buf_l0[i_index]).pu1_buf1
1561 != (ps_ref_pic1_buf_l1[i_index]).pu1_buf1)
1562 {
1563 i_swap = 0;
1564 break;
1565 }
1566 }
1567 if(1 == i_swap)
1568 {
1569 memcpy(&s_ref_pic1_buf_temp, &ps_ref_pic1_buf_l1[1],
1570 sizeof(struct pic_buffer_t));
1571 memcpy(&ps_ref_pic1_buf_l1[1], &ps_ref_pic1_buf_l1[0],
1572 sizeof(struct pic_buffer_t));
1573 memcpy(&ps_ref_pic1_buf_l1[0], &s_ref_pic1_buf_temp,
1574 sizeof(struct pic_buffer_t));
1575 }
1576 }
1577 }
1578 }
1579}
1580
1581
1582
1583void ih264d_get_implicit_weights(dec_struct_t *ps_dec);
1584
1585/*!
1586 **************************************************************************
1587 * \if Function name : ih264d_one_to_one \endif
1588 *
1589 * \brief
1590 * Initializes forward and backward refernce lists for B slice decoding.
1591 *
1592 *
1593 * \return
1594 * 0 on Success and Error code otherwise
1595 **************************************************************************
1596 */
1597void ih264d_one_to_one(dec_struct_t *ps_dec,
1598 struct pic_buffer_t *ps_col_pic,
1599 directmv_t *ps_direct,
1600 UWORD8 u1_wd_x,
1601 WORD32 u2_sub_mb_ofst,
1602 dec_mb_info_t * ps_cur_mb_info)
1603{
1604 UWORD8 *pu1_col_zero_flag_start, u1_col_mb_pred_mode, u1_num_blks, u1_sub_mb_num;
1605 UWORD8 u1_init_colzero_flag;
1606 UNUSED(ps_cur_mb_info);
1607 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
1608 u1_col_mb_pred_mode = pu1_col_zero_flag_start[ps_dec->u1_sub_mb_num];
1609 u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
1610 u1_col_mb_pred_mode >>= 6;
1611 ps_direct->u1_vert_mv_scale = ONE_TO_ONE;
1612 ps_direct->u1_col_zeroflag_change = 0;
1613
1614 if(u1_wd_x == MB_SIZE)
1615 {
1616 ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode);
1617 if(u1_col_mb_pred_mode == PRED_16x16)
1618 {
1619 ps_direct->i1_num_partitions = 1;
1620 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
1621 ps_direct->i1_submb_num[0] = 0;
1622 ps_direct->i1_partitionsize[0] = PRED_16x16;
1623
1624 return;
1625 }
1626 else if(u1_col_mb_pred_mode < PRED_8x8)
1627 {
1628 ps_direct->i1_num_partitions = 2;
1629 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
1630 ps_direct->i1_submb_num[0] = 0;
1631 ps_direct->i1_partitionsize[0] = u1_col_mb_pred_mode;
1632 u1_sub_mb_num = (u1_col_mb_pred_mode == PRED_16x8) ? 8 : 2;
1633 ps_direct->i1_submb_num[1] = u1_sub_mb_num;
1634 ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst
1635 + ps_direct->i1_submb_num[1];
1636 ps_direct->i1_partitionsize[1] = u1_col_mb_pred_mode;
1637 if((pu1_col_zero_flag_start[u1_sub_mb_num] & 1) != u1_init_colzero_flag)
1638 ps_direct->u1_col_zeroflag_change = 1;
1639 return;
1640 }
1641 else
1642 {
1643 u1_num_blks = 4;
1644 }
1645 }
1646 else
1647 {
1648 u1_num_blks = 1;
1649 }
1650
1651 {
1652 const UWORD8 *pu1_top_lt_mb_part_idx;
1653 UWORD8 u1_col_sub_mb_pred_mode, uc_blk, u1_sub_blk, u1_submb_col = 0;
1654 UWORD8 u1_num_sub_blks, uc_direct8x8inf, *pu1_col_zero_flag, u1_sub_mb_num;
1655 const UWORD8 *pu1_num_sub_mb_part =
1656 (const UWORD8 *)gau1_ih264d_num_submb_part;
1657 UWORD8 i1_num_partitions = 0, partition_size;
1658 WORD32 mv_index;
1659 const UWORD8 *pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct;
1660
1661 u1_sub_mb_num = ps_dec->u1_sub_mb_num;
1662 uc_direct8x8inf = ps_dec->ps_cur_slice->u1_direct_8x8_inference_flag;
1663 pu1_top_lt_mb_part_idx = gau1_ih264d_top_left_mb_part_indx_mod
1664 + (PRED_8x8 << 1) + 1;
1665
1666 for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
1667 {
1668 partition_size = PRED_8x8;
1669 pu1_top_lt_sub_mb_idx = gau1_ih264d_submb_indx_mod_sp_drct;
1670 if(uc_direct8x8inf == 1)
1671 {
1672 u1_submb_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
1673 mv_index = u2_sub_mb_ofst + u1_submb_col;
1674 u1_num_sub_blks = 1;
1675 }
1676 else
1677 {
1678 /* colMbPart is either 8x8, 8x4, 4x8, 4x4 */
1679 pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
1680 u1_col_sub_mb_pred_mode = *pu1_col_zero_flag;
1681 u1_col_sub_mb_pred_mode = (u1_col_sub_mb_pred_mode & 0x30) >> 4;
1682 partition_size = (UWORD8)((u1_col_sub_mb_pred_mode)
1683 | (PRED_8x8 << 2));
1684 mv_index = u2_sub_mb_ofst + u1_sub_mb_num;
1685 pu1_top_lt_sub_mb_idx += (u1_col_sub_mb_pred_mode << 1);
1686 u1_num_sub_blks = pu1_num_sub_mb_part[u1_col_sub_mb_pred_mode];
1687
1688 }
1689
1690 for(u1_sub_blk = 0; u1_sub_blk < u1_num_sub_blks;
1691 u1_sub_blk++, pu1_top_lt_sub_mb_idx++)
1692 {
1693 u1_sub_mb_num += *pu1_top_lt_sub_mb_idx;
1694 mv_index += *pu1_top_lt_sub_mb_idx;
1695 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
1696 ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
1697 ps_direct->i1_partitionsize[i1_num_partitions] = partition_size;
1698 i1_num_partitions++;
1699 if(!uc_direct8x8inf)
1700 u1_submb_col = u1_sub_mb_num;
1701 if((pu1_col_zero_flag_start[u1_submb_col] & 1)
1702 != u1_init_colzero_flag)
1703 ps_direct->u1_col_zeroflag_change = 1;
1704 }
1705 u1_sub_mb_num = *pu1_top_lt_mb_part_idx++;
1706 }
1707 ps_direct->i1_num_partitions = i1_num_partitions;
1708 }
1709}
1710/*!
1711 **************************************************************************
1712 * \if Function name : ih264d_mbaff_cross_pmbair \endif
1713 *
1714 * \brief
1715 * Initializes forward and backward refernce lists for B slice decoding.
1716 *
1717 *
1718 * \return
1719 * 0 on Success and Error code otherwise
1720 **************************************************************************
1721 */
1722void ih264d_mbaff_cross_pmbair(dec_struct_t *ps_dec,
1723 struct pic_buffer_t *ps_col_pic,
1724 directmv_t *ps_direct,
1725 UWORD8 u1_wd_x,
1726 WORD32 u2_sub_mb_ofst,
1727 dec_mb_info_t * ps_cur_mb_info)
1728{
1729 UWORD8 *pu1_col_zero_flag_start, *pu1_col_zero_flag, u1_sub_mb_num,
1730 uc_sub_mb_num_col;
1731 UWORD8 *pu1_col_zero_flag_right_half;
1732 WORD32 i4_force_8X8;
1733 UWORD8 u1_num_blks, u1_col_mb_pred_mode, uc_blk, u1_col_sub_mb_pred_mode,
1734 u1_col_sub_mb_pred_mode_rt;
1735 UWORD8 i1_num_partitions = 0, partition_size;
1736
1737 WORD32 mv_index;
1738
1739 UWORD8 u1_num_sub_blks;
1740 UWORD8 u1_is_cur_mb_fld, i;
1741 UWORD8 u1_init_colzero_flag;
1742
1743 u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
1744 u1_sub_mb_num = ps_dec->u1_sub_mb_num;
1745 ps_direct->u1_col_zeroflag_change = 0;
1746 /*pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
1747 u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num];
1748 u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
1749 u1_col_mb_pred_mode >>= 6; */
1750 if(0 == u1_is_cur_mb_fld)
1751 {
1752 ps_direct->u1_vert_mv_scale = FLD_TO_FRM;
1753 if(u1_wd_x == MB_SIZE)
1754 {
1755 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
1756 + u2_sub_mb_ofst;
1757 u1_col_mb_pred_mode = pu1_col_zero_flag_start[0];
1758 u1_init_colzero_flag = u1_col_mb_pred_mode & 1;
1759 u1_col_mb_pred_mode >>= 6;
1760
1761
1762 if(u1_col_mb_pred_mode & 0x2)
1763 {
1764 ps_dec->u1_currB_type = 1;
1765 if(u1_col_mb_pred_mode == PRED_8x16)
1766 {
1767 ps_direct->i1_num_partitions = 2;
1768 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
1769 ps_direct->i1_submb_num[0] = 0;
1770 ps_direct->i1_partitionsize[0] = PRED_8x16;
1771 ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + 2;
1772 ps_direct->i1_submb_num[1] = 2;
1773 ps_direct->i1_partitionsize[1] = PRED_8x16;
1774 if((pu1_col_zero_flag_start[2] & 1) != u1_init_colzero_flag)
1775 ps_direct->u1_col_zeroflag_change = 1;
1776 }
1777 else
1778 {
1779 pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
1780 u1_col_sub_mb_pred_mode = (*pu1_col_zero_flag & 0x10);/* 8x4 or 4x4 mode */
1781
1782 pu1_col_zero_flag_right_half = pu1_col_zero_flag_start
1783 + u1_sub_mb_num + 2;
1784 u1_col_sub_mb_pred_mode_rt =
1785 (*pu1_col_zero_flag_right_half & 0x10);/* 8x4 or 4x4 mode */
1786
1787 i4_force_8X8 = (u1_col_sub_mb_pred_mode)
1788 || (u1_col_sub_mb_pred_mode_rt);
1789 if(i4_force_8X8)
1790 {
1791 u1_num_sub_blks = 2;
1792 partition_size = PRED_8x8;
1793 }
1794 else
1795 {
1796 partition_size = PRED_8x16;
1797 u1_num_sub_blks = 1;
1798 }
1799
1800 for(i = 0; i < 2; i++)
1801 {
1802 for(uc_blk = 0; uc_blk < u1_num_sub_blks; uc_blk++)
1803 {
1804 uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
1805 uc_sub_mb_num_col &= 0x7;
1806 mv_index = u2_sub_mb_ofst + uc_sub_mb_num_col;
1807
1808 ps_direct->i4_mv_indices[i1_num_partitions] =
1809 mv_index;
1810 ps_direct->i1_submb_num[i1_num_partitions] =
1811 u1_sub_mb_num;
1812 ps_direct->i1_partitionsize[i1_num_partitions] =
1813 partition_size;
1814 i1_num_partitions++;
1815 if((pu1_col_zero_flag_start[uc_sub_mb_num_col] & 1)
1816 != u1_init_colzero_flag)
1817 ps_direct->u1_col_zeroflag_change = 1;
1818 u1_sub_mb_num += 8;
1819 }
1820 u1_sub_mb_num = 2; /* move to second half of Cur MB */
1821 }
1822 ps_direct->i1_num_partitions = i1_num_partitions;
1823 return;
1824 }
1825 }
1826 else
1827 {
1828 ps_direct->i1_num_partitions = 1;
1829 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
1830 ps_direct->i1_submb_num[0] = 0;
1831 ps_direct->i1_partitionsize[0] = PRED_16x16;
1832 ps_dec->u1_currB_type = 0;
1833 return;
1834 }
1835 }
1836 else
1837 {
1838 uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
1839 uc_sub_mb_num_col &= 0x7;
1840
1841 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col;
1842 ps_direct->i1_submb_num[0] = u1_sub_mb_num;
1843 ps_direct->i1_partitionsize[0] = PRED_8x8;
1844 ps_direct->i1_num_partitions = 1;
1845 }
1846 }
1847 else
1848 {
1849 ps_direct->u1_vert_mv_scale = FRM_TO_FLD;
1850 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
1851 u1_init_colzero_flag = pu1_col_zero_flag_start[0] & 1;
1852
1853 if(u1_wd_x == MB_SIZE)
1854 {
1855 UWORD8 u1_submb_col;
1856 UWORD8 *puc_colZeroFlagStart_bot_mb, uc_colMbPredMode_bot_mb;
1857
1858 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
1859 + u2_sub_mb_ofst;
1860 u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num] >> 6;
1861
1862 puc_colZeroFlagStart_bot_mb = ps_col_pic->pu1_col_zero_flag
1863 + u2_sub_mb_ofst + 16;
1864 uc_colMbPredMode_bot_mb = puc_colZeroFlagStart_bot_mb[8] >> 6;
1865
1866 i4_force_8X8 = (u1_col_mb_pred_mode & 0x2)
1867 || (uc_colMbPredMode_bot_mb & 0x2);
1868 if(i4_force_8X8)
1869 {
1870 u1_num_blks = 2;
1871 partition_size = PRED_8x8;
1872 }
1873 else
1874 {
1875 u1_num_blks = 1;
1876 partition_size = PRED_16x8;
1877 }
1878
1879 ps_dec->u1_currB_type = 1;
1880 /*As this mb is derived from 2 Mbs min no of partitions = 2*/
1881 for(i = 0; i < 2; i++)
1882 {
1883
1884 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
1885 + u2_sub_mb_ofst;
1886 u1_col_mb_pred_mode = pu1_col_zero_flag_start[u1_sub_mb_num] >> 6;
1887
1888 for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
1889 {
1890 u1_submb_col = (u1_sub_mb_num & 0x7) ? 1 : 0;
1891 u1_submb_col += u1_sub_mb_num;
1892 mv_index = u2_sub_mb_ofst + u1_submb_col;
1893
1894
1895 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
1896 ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
1897 ps_direct->i1_partitionsize[i1_num_partitions] =
1898 partition_size;
1899 i1_num_partitions++;
1900 if((pu1_col_zero_flag_start[u1_submb_col] & 1)
1901 != u1_init_colzero_flag)
1902 ps_direct->u1_col_zeroflag_change = 1;
1903 u1_sub_mb_num += 2;
1904 }
1905 u1_sub_mb_num = 8; /* move to second half of Cur MB */
1906 u2_sub_mb_ofst += 16;/* move to next Colocated MB */
1907 }
1908 ps_direct->i1_num_partitions = i1_num_partitions;
1909 return;
1910 }
1911 else
1912 {
1913 uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
1914 uc_sub_mb_num_col &= 0xb;
1915 u2_sub_mb_ofst += (u1_sub_mb_num >> 3) ? 16 : 0;
1916
1917 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col;
1918 ps_direct->i1_submb_num[0] = u1_sub_mb_num;
1919 ps_direct->i1_partitionsize[0] = PRED_8x8;
1920 ps_direct->i1_num_partitions = 1;
1921 return;
1922 }
1923 }
1924}
1925/*!
1926 **************************************************************************
1927 * \if Function name : ih264d_cal_col_pic \endif
1928 *
1929 * \brief
1930 * Finds the colocated picture.
1931 *
1932 *
1933 * \return
1934 * 0 on Success and Error code otherwise
1935 **************************************************************************
1936 */
1937WORD32 ih264d_cal_col_pic(dec_struct_t *ps_dec)
1938{
1939 struct pic_buffer_t* ps_col_pic = ps_dec->ps_col_pic;
1940 UWORD8 uc_curpictype, uc_colpictype;
1941 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][0];
1942 uc_curpictype = (ps_dec->ps_cur_pic->u1_picturetype & 0x7);
1943 uc_colpictype = (ps_col_pic->u1_picturetype & 0x7);
1944 if(uc_curpictype == FRM_PIC)
1945 {
1946 if(uc_colpictype == FRM_PIC)
1947 ps_dec->pf_parse_mvdirect = ih264d_one_to_one;
1948 else if(uc_colpictype == COMP_FLD_PAIR)
1949 {
1950 ps_dec->pf_parse_mvdirect = ih264d_fld_to_frm;
1951 if(ps_col_pic->i4_top_field_order_cnt
1952 >= ps_col_pic->i4_bottom_field_order_cnt)
1953 {
1954 struct pic_buffer_t* ps_tempPic = ps_col_pic;
1955 UWORD32 ui_half_num_of_sub_mbs = ((ps_dec->u2_pic_ht
1956 * ps_dec->u2_pic_wd) >> 5);
1957 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
1958 /* memcpy ps_tempPic to ps_col_pic */
1959 *ps_col_pic = *ps_tempPic;
1960 ps_col_pic->pu1_buf1 = ps_tempPic->pu1_buf1
1961 + ps_tempPic->u2_frm_wd_y;
1962 ps_col_pic->pu1_buf2 = ps_tempPic->pu1_buf2
1963 + ps_tempPic->u2_frm_wd_uv;
1964 ps_col_pic->pu1_buf3 = ps_tempPic->pu1_buf3
1965 + ps_tempPic->u2_frm_wd_uv;
1966 ps_col_pic->pu1_col_zero_flag = ps_tempPic->pu1_col_zero_flag
1967 + ui_half_num_of_sub_mbs;
1968 ps_col_pic->ps_mv = ps_tempPic->ps_mv + ui_half_num_of_sub_mbs;
1969
1970
1971 ps_col_pic->u1_pic_type = 0;/*complementary reference field pair-refering as frame */
1972
1973
1974
1975 }
1976 }
1977 else
1978 {
1979 UWORD32 i4_error_code;
1980 i4_error_code = ERROR_DBP_MANAGER_T;
1981// i4_error_code |= 1<<IVD_CORRUPTEDDATA;
1982 return i4_error_code;
1983 }
1984 }
1985 else if(uc_curpictype == AFRM_PIC)
1986 {
1987 ps_dec->pf_parse_mvdirect = ih264d_fld_to_mbaff;
1988 }
1989 else /* must be a field*/
1990 {
1991 if(uc_colpictype == FRM_PIC)
1992 ps_dec->pf_parse_mvdirect = ih264d_frm_to_fld;
1993 else if(uc_colpictype == AFRM_PIC)
1994 ps_dec->pf_parse_mvdirect = ih264d_mbaff_to_fld;
1995 else
1996 ps_dec->pf_parse_mvdirect = ih264d_one_to_one;
1997 }
1998 ps_dec->ps_col_pic = ps_col_pic;
1999 return OK;
2000}
2001
2002/*!
2003 **************************************************************************
2004 * \if Function name : ih264d_frm_to_fld \endif
2005 *
2006 * \brief
2007 * Initializes forward and backward refernce lists for B slice decoding.
2008 *
2009 *
2010 * \return
2011 * 0 on Success and Error code otherwise
2012 **************************************************************************
2013 */
2014void ih264d_frm_to_fld(dec_struct_t *ps_dec,
2015 struct pic_buffer_t *ps_col_pic,
2016 directmv_t *ps_direct,
2017 UWORD8 u1_wd_x,
2018 WORD32 u2_sub_mb_ofst,
2019 dec_mb_info_t * ps_cur_mb_info)
2020{
2021 UWORD8 *pu1_col_zero_flag_start, u1_sub_mb_num;
2022 UWORD8 u1_num_blks, u1_col_mb_pred_mode, uc_blk;
2023 UWORD8 i1_num_partitions = 0, partition_size, i;
2024 WORD32 mv_index;
2025 UWORD32 increment;
2026 WORD32 i4_force_8X8;
2027 UNUSED(ps_cur_mb_info);
2028 ps_direct->u1_col_zeroflag_change = 1;
2029 ps_direct->u1_vert_mv_scale = FRM_TO_FLD;
2030 u1_sub_mb_num = ps_dec->u1_sub_mb_num;
2031
2032 /* new calculation specific to this function */
2033 if((ps_col_pic->u1_picturetype & 0x7) == FRM_PIC)
2034 {
2035 UWORD16 u2_frm_wd_in_mbs = ps_dec->u2_frm_wd_in_mbs;
2036 increment = (u2_frm_wd_in_mbs << 4);
2037 /*mbAddrCol = mbAddrCol1 */
2038 u2_sub_mb_ofst = (ps_dec->u2_mbx
2039 + (2 * ps_dec->u2_mby * u2_frm_wd_in_mbs)) << 4;
2040 }
2041 else
2042 increment = 16;
2043
2044 if(u1_wd_x == MB_SIZE)
2045 {
2046 ps_dec->u1_currB_type = 1;
2047
2048 {
2049 UWORD8 *puc_colZeroFlagStart_bot_mb, uc_colMbPredMode_bot_mb;
2050
2051 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag
2052 + u2_sub_mb_ofst;
2053 u1_col_mb_pred_mode = (*pu1_col_zero_flag_start >> 6);
2054
2055 puc_colZeroFlagStart_bot_mb = ps_col_pic->pu1_col_zero_flag
2056 + u2_sub_mb_ofst + increment;
2057 uc_colMbPredMode_bot_mb = (*puc_colZeroFlagStart_bot_mb >> 6);
2058
2059 i4_force_8X8 = (u1_col_mb_pred_mode & 0x2)
2060 || (uc_colMbPredMode_bot_mb & 0x2);
2061
2062 if(i4_force_8X8)
2063 {
2064 u1_num_blks = 2;
2065 partition_size = PRED_8x8;
2066 }
2067 else
2068 {
2069 partition_size = PRED_16x8;
2070 u1_num_blks = 1;
2071 }
2072 }
2073
2074 /*As this mb is derived from 2 Mbs, min no of partitions = 2*/
2075 for(i = 0; i < 2; i++)
2076 {
2077 for(uc_blk = 0; uc_blk < u1_num_blks; uc_blk++)
2078 {
2079 mv_index = u2_sub_mb_ofst + u1_sub_mb_num;
2080 mv_index += (u1_sub_mb_num & 0x7) ? 1 : 0;
2081
2082 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
2083 ps_direct->i1_submb_num[i1_num_partitions] = u1_sub_mb_num;
2084 ps_direct->i1_partitionsize[i1_num_partitions] = partition_size;
2085 i1_num_partitions++;
2086
2087 u1_sub_mb_num += 2;
2088 }
2089 u1_sub_mb_num = 8; /* move to second half of Cur MB */
2090 u2_sub_mb_ofst += increment;/* move to next Colocated MB */
2091 }
2092 ps_direct->i1_num_partitions = i1_num_partitions;
2093 return;
2094 }
2095 else
2096 {
2097 UWORD8 u1_sub_mb_num_col;
2098 u1_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
2099 u1_sub_mb_num_col &= 0xb;
2100 u2_sub_mb_ofst += (u1_sub_mb_num >> 3) ? increment : 0;
2101
2102 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + u1_sub_mb_num_col;
2103 ps_direct->i1_submb_num[0] = u1_sub_mb_num;
2104 ps_direct->i1_partitionsize[0] = PRED_8x8;
2105 ps_direct->i1_num_partitions = 1;
2106 return;
2107 }
2108}
2109/*!
2110 **************************************************************************
2111 * \if Function name : ih264d_fld_to_frm \endif
2112 *
2113 * \brief
2114 * Initializes forward and backward refernce lists for B slice decoding.
2115 *
2116 *
2117 * \return
2118 * 0 on Success and Error code otherwise
2119 **************************************************************************
2120 */
2121void ih264d_fld_to_frm(dec_struct_t *ps_dec,
2122 struct pic_buffer_t *ps_col_pic,
2123 directmv_t *ps_direct,
2124 UWORD8 u1_wd_x,
2125 WORD32 u2_sub_mb_ofst,
2126 dec_mb_info_t * ps_cur_mb_info)
2127{
2128 UWORD8 *pu1_col_zero_flag_start, *pu1_col_zero_flag,
2129 *pu1_col_zero_flag_right_half, u1_sub_mb_num, uc_sub_mb_num_col;
2130 UWORD8 u1_col_mb_pred_mode, uc_blk;
2131 WORD32 i4_force_8X8;
2132
2133 UNUSED(ps_cur_mb_info);
2134 ps_direct->u1_vert_mv_scale = FLD_TO_FRM;
2135 ps_direct->u1_col_zeroflag_change = 1;
2136 /* new calculation specific to this function for u2_sub_mb_ofst*/
2137 u2_sub_mb_ofst = (ps_dec->u2_mbx
2138 + ((ps_dec->u2_mby >> 1) * ps_dec->u2_frm_wd_in_mbs)) << 4;
2139 u2_sub_mb_ofst += ((ps_dec->u2_mby & 1) << 3);
2140
2141 if(u1_wd_x == MB_SIZE)
2142 {
2143 pu1_col_zero_flag_start = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
2144 u1_col_mb_pred_mode = (*pu1_col_zero_flag_start >> 6);
2145 ps_dec->u1_currB_type = (!!u1_col_mb_pred_mode);
2146
2147 if(u1_col_mb_pred_mode & 0x2)
2148 {
2149 if(u1_col_mb_pred_mode == PRED_8x16)
2150 {
2151 ps_direct->i1_num_partitions = 2;
2152 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
2153 ps_direct->i1_submb_num[0] = 0;
2154 ps_direct->i1_partitionsize[0] = PRED_8x16;
2155 ps_direct->i4_mv_indices[1] = u2_sub_mb_ofst + 2;
2156 ps_direct->i1_submb_num[1] = 2;
2157 ps_direct->i1_partitionsize[1] = PRED_8x16;
2158 }
2159 else
2160 {
2161 UWORD8 i1_num_partitions = 0, partition_size;
2162 UWORD32 mv_index;
2163 UWORD8 u1_num_sub_blks, i, u1_col_sub_mb_pred_mode,
2164 u1_col_sub_mb_pred_mode_rt;
2165
2166 u1_sub_mb_num = ps_dec->u1_sub_mb_num;
2167
2168 pu1_col_zero_flag = pu1_col_zero_flag_start + u1_sub_mb_num;
2169 u1_col_sub_mb_pred_mode = (*pu1_col_zero_flag & 0x10);/* 8x4 or 4x4 mode */
2170
2171 pu1_col_zero_flag_right_half = pu1_col_zero_flag_start + u1_sub_mb_num
2172 + 2;
2173 u1_col_sub_mb_pred_mode_rt = (*pu1_col_zero_flag_right_half
2174 & 0x10);/* 8x4 or 4x4 mode */
2175
2176 i4_force_8X8 = (u1_col_sub_mb_pred_mode)
2177 || (u1_col_sub_mb_pred_mode_rt);
2178 if(i4_force_8X8)
2179 {
2180 u1_num_sub_blks = 2;
2181 partition_size = PRED_8x8;
2182 }
2183 else
2184 {
2185 partition_size = PRED_8x16;
2186 u1_num_sub_blks = 1;
2187 }
2188
2189 for(i = 0; i < 2; i++)
2190 {
2191 for(uc_blk = 0; uc_blk < u1_num_sub_blks; uc_blk++)
2192 {
2193 uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
2194 uc_sub_mb_num_col &= 0x7;
2195 mv_index = u2_sub_mb_ofst + uc_sub_mb_num_col;
2196
2197 ps_direct->i4_mv_indices[i1_num_partitions] = mv_index;
2198 ps_direct->i1_submb_num[i1_num_partitions] =
2199 u1_sub_mb_num;
2200 ps_direct->i1_partitionsize[i1_num_partitions] =
2201 partition_size;
2202 i1_num_partitions++;
2203 u1_sub_mb_num += 8;
2204 }
2205
2206 u1_sub_mb_num = 2; /* move to second half of Cur MB */
2207
2208 }
2209 ps_direct->i1_num_partitions = i1_num_partitions;
2210 return;
2211 }
2212 }
2213 else
2214 {
2215 ps_direct->i1_num_partitions = 1;
2216 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst;
2217 ps_direct->i1_submb_num[0] = 0;
2218 ps_direct->i1_partitionsize[0] = PRED_16x16;
2219 return;
2220 }
2221 }
2222 else
2223 {
2224 u1_sub_mb_num = ps_dec->u1_sub_mb_num;
2225 uc_sub_mb_num_col = u1_sub_mb_num | (u1_sub_mb_num >> 1);
2226 uc_sub_mb_num_col &= 0x7;
2227
2228 ps_direct->i4_mv_indices[0] = u2_sub_mb_ofst + uc_sub_mb_num_col;
2229 ps_direct->i1_submb_num[0] = u1_sub_mb_num;
2230 ps_direct->i1_partitionsize[0] = PRED_8x8;
2231 ps_direct->i1_num_partitions = 1;
2232 }
2233}
2234/*!
2235 **************************************************************************
2236 * \if Function name : ih264d_one_to_one \endif
2237 *
2238 * \brief
2239 * Initializes forward and backward refernce lists for B slice decoding.
2240 *
2241 *
2242 * \return
2243 * 0 on Success and Error code otherwise
2244 **************************************************************************
2245 */
2246void ih264d_mbaff_to_fld(dec_struct_t *ps_dec,
2247 struct pic_buffer_t *ps_col_pic,
2248 directmv_t *ps_direct,
2249 UWORD8 u1_wd_x,
2250 WORD32 u2_sub_mb_ofst,
2251 dec_mb_info_t * ps_cur_mb_info)
2252{
2253 UWORD8* pu1_col_zero_flag, u1_iscol_mb_fld;
2254 u2_sub_mb_ofst <<= 1;
2255 pu1_col_zero_flag = ps_col_pic->pu1_col_zero_flag + u2_sub_mb_ofst;
2256 u1_iscol_mb_fld = (*pu1_col_zero_flag & 0x2) >> 1;
2257 if(u1_iscol_mb_fld)
2258 {
2259 u2_sub_mb_ofst += (ps_dec->ps_cur_slice->u1_bottom_field_flag << 4);
2260 ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2261 u2_sub_mb_ofst, ps_cur_mb_info);
2262 }
2263 else
2264 ih264d_frm_to_fld(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2265 u2_sub_mb_ofst, ps_cur_mb_info);
2266}
2267/*!
2268 **************************************************************************
2269 * \if Function name : ih264d_one_to_one \endif
2270 *
2271 * \brief
2272 * Initializes forward and backward refernce lists for B slice decoding.
2273 *
2274 *
2275 * \return
2276 * 0 on Success and Error code otherwise
2277 **************************************************************************
2278 */
2279void ih264d_fld_to_mbaff(dec_struct_t *ps_dec,
2280 struct pic_buffer_t *ps_col_pic,
2281 directmv_t *ps_direct,
2282 UWORD8 u1_wd_x,
2283 WORD32 u2_sub_mb_ofst,
2284 dec_mb_info_t * ps_cur_mb_info)
2285{
2286 if((ps_col_pic->u1_picturetype & 0x7) == COMP_FLD_PAIR)
2287 {
2288 /* first calculate the colocated picture which varies with Mb */
2289 UWORD8 u1_is_cur_mb_fld;
2290 u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
2291 u2_sub_mb_ofst = (u2_sub_mb_ofst & 0xffe0); /* mbaddrCol5 = curmbaddr/2;*/
2292 u2_sub_mb_ofst >>= 1;
2293
2294 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][0];
2295 if(u1_is_cur_mb_fld)
2296 {
2297 if(1 - ps_cur_mb_info->u1_topmb)
2298 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
2299
2300 ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2301 u2_sub_mb_ofst, ps_cur_mb_info);
2302 }
2303 else
2304 {
2305
2306 if(ABS(ps_col_pic->i4_top_field_order_cnt
2307 - ps_dec->ps_cur_pic->i4_poc) >=
2308 ABS(ps_dec->ps_cur_pic->i4_poc - ps_col_pic->i4_bottom_field_order_cnt))
2309 {
2310 ps_col_pic = ps_dec->ps_ref_pic_buf_lx[1][MAX_REF_BUFS];
2311 }
2312
2313 if(ps_cur_mb_info->u1_topmb == 0)
2314 u2_sub_mb_ofst += 8;
2315 ih264d_mbaff_cross_pmbair(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2316 u2_sub_mb_ofst, ps_cur_mb_info);
2317 }
2318 ps_dec->ps_col_pic = ps_col_pic;
2319 }
2320 else
2321 {
2322 UWORD8* pu1_col_zero_flag = ps_col_pic->pu1_col_zero_flag
2323 + u2_sub_mb_ofst;
2324 UWORD8 temp, u1_is_cur_mb_fld, u1_iscol_mb_fld;
2325
2326 u1_iscol_mb_fld = (*pu1_col_zero_flag & 0x2) >> 1;
2327 u1_is_cur_mb_fld = ps_cur_mb_info->u1_mb_field_decodingflag;
2328 temp = (u1_iscol_mb_fld ^ u1_is_cur_mb_fld);
2329
2330 if(temp == 0)
2331 ih264d_one_to_one(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2332 u2_sub_mb_ofst, ps_cur_mb_info);
2333 else
2334 {
2335 u2_sub_mb_ofst &= 0xffef;
2336 if(u1_is_cur_mb_fld == 0)
2337 {
2338 if(ABS(ps_col_pic->i4_top_field_order_cnt
2339 - ps_dec->ps_cur_pic->i4_poc) >=
2340 ABS(ps_dec->ps_cur_pic->i4_poc - ps_col_pic->i4_bottom_field_order_cnt))
2341 {
2342 u2_sub_mb_ofst += 0x10;
2343 }
2344 if(ps_cur_mb_info->u1_topmb == 0)
2345 u2_sub_mb_ofst += 8;
2346 }
2347 ih264d_mbaff_cross_pmbair(ps_dec, ps_col_pic, ps_direct, u1_wd_x,
2348 u2_sub_mb_ofst, ps_cur_mb_info);
2349 }
2350 }
2351}
2352