1/******************************************************************************
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#ifndef _IH264D_STRUCTS_H_
21#define _IH264D_STRUCTS_H_
22
23#include "ih264_typedefs.h"
24#include "ih264_macros.h"
25#include "ih264_platform_macros.h"
26#include "iv.h"
27#include "ivd.h"
28
29#include "ih264d_transfer_address.h"
30#include "ih264d_defs.h"
31#include "ih264d_defs.h"
32#include "ih264d_bitstrm.h"
33#include "ih264d_debug.h"
34#include "ih264d_dpb_manager.h"
35/* includes for CABAC */
36#include "ih264d_cabac.h"
37#include "ih264d_dpb_manager.h"
38
39#include "ih264d_vui.h"
40#include "ih264d_sei.h"
41#include "iv.h"
42#include "ivd.h"
43
44#include "ih264_weighted_pred.h"
45#include "ih264_trans_quant_itrans_iquant.h"
46#include "ih264_inter_pred_filters.h"
47#include "ih264_mem_fns.h"
48#include "ih264_padding.h"
49#include "ih264_intra_pred_filters.h"
50#include "ih264_deblk_edge_filters.h"
51
52
53
54
55
56/** Number of Mb's whoose syntax will be read */
57/************************************************************/
58/* MB_GROUP should be a multiple of 2                       */
59/************************************************************/
60#define PARSE_MB_GROUP_4            4
61
62/* MV_SCRATCH_BUFS assumed to be pow(2) */
63#define MV_SCRATCH_BUFS             4
64
65#define TOP_FIELD_ONLY      0x02
66#define BOT_FIELD_ONLY      0x01
67
68#define MAX_REF_BUF_SIZE       (3776*2*2)
69
70struct _DecStruct;
71struct _DecMbInfo;
72
73typedef enum
74{
75    MB_TYPE_SI_SLICE = 0,
76    MB_TYPE_I_SLICE = 3,
77    MB_SKIP_FLAG_P_SLICE = 11,
78    MB_TYPE_P_SLICE = 14,
79    SUB_MB_TYPE_P_SLICE = 21,
80    MB_SKIP_FLAG_B_SLICE = 24,
81    MB_TYPE_B_SLICE = 27,
82    SUB_MB_TYPE_B_SLICE = 36,
83    MVD_X = 40,
84    MVD_Y = 47,
85    REF_IDX = 54,
86    MB_QP_DELTA = 60,
87    INTRA_CHROMA_PRED_MODE = 64,
88    PREV_INTRA4X4_PRED_MODE_FLAG = 68,
89    REM_INTRA4X4_PRED_MODE = 69,
90    MB_FIELD_DECODING_FLAG = 70,
91    CBP_LUMA = 73,
92    CBP_CHROMA = 77,
93    CBF = 85,
94    SIGNIFICANT_COEFF_FLAG_FRAME = 105,
95    SIGNIFICANT_COEFF_FLAG_FLD = 277,
96    LAST_SIGNIFICANT_COEFF_FLAG_FRAME = 166,
97    LAST_SIGNIFICANT_COEFF_FLAG_FLD = 338,
98    COEFF_ABS_LEVEL_MINUS1 = 227,
99
100    /* High profile related Syntax element CABAC offsets */
101    TRANSFORM_SIZE_8X8_FLAG = 399,
102    SIGNIFICANT_COEFF_FLAG_8X8_FRAME = 402,
103    LAST_SIGNIFICANT_COEFF_FLAG_8X8_FRAME = 417,
104    COEFF_ABS_LEVEL_MINUS1_8X8 = 426,
105    SIGNIFICANT_COEFF_FLAG_8X8_FIELD = 436,
106    LAST_SIGNIFICANT_COEFF_FLAG_8X8_FIELD = 451
107
108} cabac_table_num_t;
109
110typedef enum
111{
112    SIG_COEFF_CTXT_CAT_0_OFFSET = 0,
113    SIG_COEFF_CTXT_CAT_1_OFFSET = 15,
114    SIG_COEFF_CTXT_CAT_2_OFFSET = 29,
115    SIG_COEFF_CTXT_CAT_3_OFFSET = 44,
116    SIG_COEFF_CTXT_CAT_4_OFFSET = 47,
117    SIG_COEFF_CTXT_CAT_5_OFFSET = 0,
118    COEFF_ABS_LEVEL_CAT_0_OFFSET = 0,
119    COEFF_ABS_LEVEL_CAT_1_OFFSET = 10,
120    COEFF_ABS_LEVEL_CAT_2_OFFSET = 20,
121    COEFF_ABS_LEVEL_CAT_3_OFFSET = 30,
122    COEFF_ABS_LEVEL_CAT_4_OFFSET = 39,
123    COEFF_ABS_LEVEL_CAT_5_OFFSET = 0
124} cabac_blk_cat_offset_t;
125
126/** Structure for the MV bank */
127typedef struct _mv_pred_t
128{
129    WORD16 i2_mv[4]; /** 0- mvFwdX, 1- mvFwdY, 2- mvBwdX, 3- mvBwdY */
130    WORD8 i1_ref_frame[2];
131
132    UWORD8 u1_col_ref_pic_idx; /** Idx into the pic buff array */
133    UWORD8 u1_pic_type; /** Idx into the pic buff array */
134
135} mv_pred_t;
136
137typedef struct
138{
139    WORD32 i4_mv_indices[16];
140    WORD8 i1_submb_num[16];
141    WORD8 i1_partitionsize[16];
142    WORD8 i1_num_partitions;
143    WORD8 u1_vert_mv_scale;
144    UWORD8 u1_col_zeroflag_change;
145} directmv_t;
146
147typedef struct pic_buffer_t
148{
149    /**Different components of the picture */
150    UWORD8 *pu1_buf1;
151    UWORD8 *pu1_buf2;
152    UWORD8 *pu1_buf3;
153    UWORD16 u2_disp_width; /** Width of the display luma frame in pixels */
154    UWORD16 u2_disp_height; /** Height of the display luma frame in pixels */
155    UWORD32 u4_time_stamp; /** Time at which frame has to be displayed */
156    UWORD16 u2_frm_wd_y; /** Width of the luma frame in pixels */
157    UWORD16 u2_frm_wd_uv; /** Width of the chroma frame */
158    UWORD16 u2_frm_ht_y; /** Height of the luma frame in pixels */
159    UWORD16 u2_frm_ht_uv; /** Height of the chroma frame */
160    /* Upto this is resembling the structure IH264DEC_DispUnit */
161
162    /* If any member is to be added, add below this            */
163
164    /* u4_ofst from start of picture buffer to display position for Y buffer  */
165    UWORD16 u2_crop_offset_y;
166
167    /* u4_ofst from start of picture buffer to display position for UV buffer */
168    UWORD16 u2_crop_offset_uv;
169
170    UWORD8 u1_is_short; /** (1: short 0: long) term ref pic */
171    UWORD8 u1_pic_type; /** frame / field / complementary field pair */
172    UWORD8 u1_pic_buf_id; /** Idx into the picBufAPI array */
173    UWORD8 u1_mv_buf_id;
174    WORD32 i4_seq;
175    UWORD8 *pu1_col_zero_flag;
176    mv_pred_t *ps_mv; /** Pointer to the MV bank array */
177    WORD32 i4_poc; /** POC */
178    WORD32 i4_pic_num;
179    WORD32 i4_frame_num;
180    WORD32 i4_top_field_order_cnt; /** TopPOC */
181    WORD32 i4_bottom_field_order_cnt; /** BottomPOC */
182    WORD32 i4_avg_poc; /** minPOC */
183    UWORD8 u1_picturetype; /*Same as u1_pic_type..u1_pic_type gets overwritten whereas
184     this doesnot get overwritten ...stores the pictype of
185     frame/complementary field pair/ mbaff */
186    UWORD8 u1_long_term_frm_idx;
187    UWORD8 u1_long_term_pic_num;
188    UWORD32 u4_pack_slc_typ; /* It will contain information about types of slices */
189
190    /* ! */
191    UWORD32 u4_ts;
192    UWORD8 u1_pic_struct;/* Refer to SEI table D-1 */
193
194} pic_buffer_t;
195
196typedef struct
197{
198    void *u4_add[4];
199} neighbouradd_t;
200
201typedef struct
202{
203    const UWORD8 *pu1_inv_scan;
204    void *pv_table[6];
205} cavlc_cntxt_t;
206
207/**
208 ************************************************************************
209 * \file ih264d_structs.h
210 *
211 * \brief
212 *    Structures used in the H.264 decoder
213 *
214 * \date
215 *    18/11/2002
216 *
217 * \author  Sriram Sethuraman
218 *
219 ************************************************************************
220 */
221
222/**
223 * Structure to represent a MV Bank buffer and col flag
224 */
225typedef struct
226{
227    /**
228     *  Pointer to buffer that holds col flag.
229     */
230    void *pv_col_zero_flag;
231
232    /**
233     * Pointer to buffer that holds mv_pred
234     */
235    void *pv_mv;
236
237 }col_mv_buf_t;
238
239
240typedef struct
241{
242    UWORD8 u1_dydx; /** 4*dy + dx for Y comp / 8*dy + dx for UV comp */
243    UWORD8 u1_is_bi_direct; /** 1: is bi-direct 0: forward / backward only   */
244    UWORD8 u1_wght_pred_type; /** 0-default 1-singleWeighted 2-BiWeighted      */
245    WORD8 i1_mb_partwidth; /** Width of MB partition                        */
246    WORD8 i1_mb_partheight; /** Height of MB partition                       */
247    WORD8 i1_mc_wd; /** Number of bytes in a DMA stride              */
248    WORD8 i1_dma_ht; /** Number of strides                            */
249
250    WORD8 i1_pod_ht; /** Flag specifying height of pad on demand      */
251    /** 0 (No pod) -ve(Top pod) +ve(Bottom pod)      */
252    UWORD16 u2_dst_stride; /** Stride value of the destination              */
253    UWORD16 u2_u1_ref_buf_wd; /** Width of the ref buffer                      */
254    UWORD16 u2_frm_wd;
255    UWORD16 u2_dummy;
256
257    UWORD8 *u1_pi1_wt_ofst_rec_v; /** Pointer to packed weight and u4_ofst          */
258    UWORD8 *pu1_rec_y_u; /** MB partition address in row buffer           */
259    UWORD8 *pu1_dma_dest_addr; /** Destination address for DMA transfer         */
260    UWORD8 *pu1_y_ref;
261    UWORD8 *pu1_u_ref;
262    UWORD8 *pu1_v_ref;
263
264    UWORD8 *pu1_pred;
265    UWORD8 *pu1_pred_u;
266    UWORD8 *pu1_pred_v;
267    UWORD8 u1_dma_wd_y;
268    UWORD8 u1_dma_ht_y;
269    UWORD8 u1_dma_wd_uv;
270    UWORD8 u1_dma_ht_uv;
271} pred_info_t;
272
273typedef struct
274{
275    UWORD32 *pu4_wt_offst;
276    WORD16 i2_mv[2];
277
278    /***************************************************/
279    /*packing information  i1_size_pos_info             */
280    /* bit 1:0 -> X position in terms of  (4x4) units   */
281    /* bit 3:2 -> Y position in terms of  (4x4) units   */
282    /* bit 5:4 -> PU width 0:4,1:8,2:16                 */
283    /* bit 7:6 -> PU height 0:4,1:8,2:16                */
284     /***************************************************/
285    WORD8 i1_size_pos_info;
286
287    /***************************************************/
288    /*packing information ref idx info                 */
289    /* bit 5:0 ->ref_idx                              */
290    /* bit 6:7   -> 0:l0,1:l1,2:bipred                  */
291     /***************************************************/
292    WORD8 i1_ref_idx_info;
293
294    WORD8 i1_buf_id;
295
296
297    UWORD8 u1_pic_type; /** frame /top field/bottom field/mbaff / complementary field pair */
298
299}pred_info_pkd_t;
300/*! Sequence level parameters */
301
302typedef struct
303{
304    UWORD8 u1_seq_parameter_set_id; /** id for the seq par set 0-31 */
305    UWORD8 u1_is_valid; /** is Seq Param set valid */
306
307    UWORD16 u2_frm_wd_in_mbs; /** Frame width expressed in MB units */
308    UWORD16 u2_frm_ht_in_mbs; /** Frame height expressed in MB units */
309
310    /* Following are derived from the above two */
311    UWORD16 u2_fld_ht_in_mbs; /** Field height expressed in MB units */
312    UWORD16 u2_max_mb_addr; /** Total number of macroblocks in a coded picture */
313    UWORD16 u2_total_num_of_mbs; /** Total number of macroblocks in a coded picture */
314    UWORD32 u4_fld_ht; /** field height */
315    UWORD32 u4_cwidth; /** chroma width */
316    UWORD32 u4_chr_frm_ht; /** chroma height */
317    UWORD32 u4_chr_fld_ht; /** chroma field height */
318    UWORD8 u1_mb_aff_flag; /** 0 - no mb_aff; 1 - uses mb_aff */
319
320    UWORD8 u1_profile_idc; /** profile value */
321    UWORD8 u1_level_idc; /** level value */
322
323    /* high profile related syntax elements   */
324    WORD32 i4_chroma_format_idc;
325    WORD32 i4_bit_depth_luma_minus8;
326    WORD32 i4_bit_depth_chroma_minus8;
327    WORD32 i4_qpprime_y_zero_transform_bypass_flag;
328    WORD32 i4_seq_scaling_matrix_present_flag;
329    UWORD8 u1_seq_scaling_list_present_flag[8];
330    UWORD8 u1_use_default_scaling_matrix_flag[8];
331    WORD16 i2_scalinglist4x4[6][16];
332    WORD16 i2_scalinglist8x8[2][64];
333    UWORD8 u1_more_than_one_slice_group_allowed_flag;
334    UWORD8 u1_arbitrary_slice_order_allowed_flag;
335    UWORD8 u1_redundant_slices_allowed_flag;
336    UWORD8 u1_bits_in_frm_num; /** Number of bits in frame num */
337    UWORD16 u2_u4_max_pic_num_minus1; /** Maximum frame num minus 1 */
338    UWORD8 u1_pic_order_cnt_type; /** 0 - 2 indicates the method to code picture order count */
339    UWORD8 u1_log2_max_pic_order_cnt_lsb_minus;
340    WORD32 i4_max_pic_order_cntLsb;
341    UWORD8 u1_num_ref_frames_in_pic_order_cnt_cycle;
342    UWORD8 u1_delta_pic_order_always_zero_flag;
343    WORD32 i4_ofst_for_non_ref_pic;
344    WORD32 i4_ofst_for_top_to_bottom_field;
345    WORD32 i4_ofst_for_ref_frame[MAX_NUM_REF_FRAMES_OFFSET];
346    UWORD8 u1_num_ref_frames;
347    UWORD8 u1_gaps_in_frame_num_value_allowed_flag;
348    UWORD8 u1_frame_mbs_only_flag; /** 1 - frame only; 0 - field/frame pic */
349    UWORD8 u1_direct_8x8_inference_flag;
350    UWORD8 u1_vui_parameters_present_flag;
351    vui_t s_vui;
352} dec_seq_params_t;
353
354typedef struct
355{
356    UWORD16 u2_frm_wd_in_mbs; /** Frame width expressed in MB units    */
357    UWORD16 u2_frm_ht_in_mbs; /** Frame height expressed in MB units   */
358    UWORD8 u1_frame_mbs_only_flag; /** 1 - frame only; 0 - field/frame pic  */
359    UWORD8 u1_profile_idc; /** profile value                        */
360    UWORD8 u1_level_idc; /** level value                          */
361    UWORD8 u1_direct_8x8_inference_flag;
362    UWORD8 u1_eoseq_pending;
363} prev_seq_params_t;
364
365/** Picture level parameters */
366typedef struct
367{
368    dec_seq_params_t *ps_sps; /** applicable seq. parameter set */
369
370    /* High profile related syntax elements */
371    WORD32 i4_transform_8x8_mode_flag;
372    WORD32 i4_pic_scaling_matrix_present_flag;
373    UWORD8 u1_pic_scaling_list_present_flag[8];
374    UWORD8 u1_pic_use_default_scaling_matrix_flag[8];
375    WORD16 i2_pic_scalinglist4x4[6][16];
376    WORD16 i2_pic_scalinglist8x8[2][64];
377    WORD8 i1_second_chroma_qp_index_offset;
378
379    UWORD32 u4_slice_group_change_rate;
380    UWORD8 *pu1_slice_groupmb_map; /** MB map with slice membership labels */
381    UWORD8 u1_pic_parameter_set_id; /** id for the picture par set 0-255*/
382    UWORD8 u1_entropy_coding_mode; /** Entropy coding : 0-VLC; 1 - CABAC */
383    UWORD8 u1_num_slice_groups; /** Number of slice groups */
384    UWORD8 u1_pic_init_qp; /** Initial QPY for the picture {-26,25}*/
385    WORD8 i1_chroma_qp_index_offset; /** Chroma QP u4_ofst w.r.t QPY {-12,12} */
386    UWORD8 u1_dblk_filter_parms_flag; /** Slice layer has deblocking filter parameters */
387    UWORD8 u1_constrained_intra_pred_flag; /** Constrained intra prediction u4_flag */
388    UWORD8 u1_redundant_pic_cnt_present_flag; /** Redundant_pic_cnt is in slices using this PPS */
389    UWORD8 u1_pic_order_present_flag; /** Pic order present u4_flag */
390    UWORD8 u1_num_ref_idx_lx_active[2]; /** Maximum reference picture index in the reference list 0 : range [1 - 15] */
391    UWORD8 u1_wted_pred_flag;
392    UWORD8 u1_wted_bipred_idc;
393    UWORD8 u1_pic_init_qs;
394    UWORD8 u1_deblocking_filter_parameters_present_flag;
395    UWORD8 u1_vui_pic_parameters_flag;
396    UWORD8 u1_mb_slice_group_map_type;
397    UWORD8 u1_slice_group_change_direction_flag;
398    UWORD8 u1_frame_cropping_flag;
399    UWORD8 u1_frame_cropping_rect_left_ofst;
400    UWORD8 u1_frame_cropping_rect_right_ofst;
401    UWORD8 u1_frame_cropping_rect_top_ofst;
402    UWORD8 u1_frame_cropping_rect_bottom_ofst;
403    void * pv_codec_handle; /* For Error Handling */
404    WORD32 i4_top_field_order_cnt;
405    WORD32 i4_bottom_field_order_cnt;
406    WORD32 i4_avg_poc;
407    UWORD8 u1_is_valid; /** is Pic Param set valid */
408} dec_pic_params_t;
409
410/** Picture Order Count Paramsters */
411typedef struct
412{
413    WORD32 i4_pic_order_cnt_lsb;
414    WORD32 i4_pic_order_cnt_msb;
415    WORD32 i4_delta_pic_order_cnt_bottom;
416    WORD32 i4_delta_pic_order_cnt[2];
417    WORD32 i4_prev_frame_num_ofst;
418    UWORD8 u1_mmco_equalto5;
419    UWORD8 u1_bot_field;
420    UWORD16 u2_frame_num;
421    WORD32 i4_top_field_order_count;
422    WORD32 i4_bottom_field_order_count;
423} pocstruct_t;
424
425/*****************************************************************************/
426/* parse_mb_pers_info contains necessary mb info data required persistently  */
427/* in the form of top and left neighbours.                                   */
428/*****************************************************************************/
429typedef struct
430{
431    void *u4_pic_addrress[4]; /* picture address for BS calc */
432    WORD8 pi1_intrapredmodes[4]; /* calc Intra pred modes */
433    UWORD8 pu1_nnz_y[4];
434    UWORD8 pu1_nnz_uv[4];
435    UWORD8 u1_mb_fld;
436    UWORD8 u1_mb_type;
437    UWORD16 u2_luma_csbp; /* Luma csbp used for BS calc */
438    UWORD8 u1_tran_form8x8;
439} mb_neigbour_params_t;
440
441/* This info is required for decoding purposes except Deblockng */
442typedef struct _DecMbInfo
443{
444    UWORD8 u1_mb_type; /** macroblock type: I/P/B/SI/SP */
445    UWORD8 u1_chroma_pred_mode;
446    UWORD8 u1_cbp;
447    UWORD8 u1_mb_mc_mode; /** 16x16, 2 16x8, 2 8x16, 4 8x8 */
448    UWORD8 u1_topmb; /** top Mb u4_flag */
449    UWORD8 u1_mb_ngbr_availablity;
450    UWORD8 u1_end_of_slice;
451    UWORD8 u1_mb_field_decodingflag;
452    UWORD8 u1_topleft_mb_fld;
453    UWORD8 u1_topleft_mbtype;
454    WORD8 i1_offset;
455    UWORD8 u1_Mux;
456    UWORD8 u1_qp_div6;
457    UWORD8 u1_qp_rem6;
458    UWORD8 u1_qpc_div6;
459    UWORD8 u1_qpcr_div6;
460    UWORD8 u1_qpc_rem6;
461    UWORD8 u1_qpcr_rem6;
462    UWORD8 u1_tran_form8x8;
463    UWORD8 u1_num_pred_parts;
464    UWORD8 u1_yuv_dc_block_flag;
465    UWORD16 u2_top_right_avail_mask;
466    UWORD16 u2_top_left_avail_mask;
467    UWORD16 u2_luma_csbp; /** Coded 4x4 Sub Block Pattern */
468    UWORD16 u2_chroma_csbp; /** Coded 4x4 Sub Block Pattern */
469    UWORD16 u2_mbx;
470    UWORD16 u2_mby;
471    UWORD16 u2_mask[2];
472
473    UWORD32 u4_pred_info_pkd_idx;
474
475    mb_neigbour_params_t *ps_left_mb;
476    mb_neigbour_params_t *ps_top_mb;
477    mb_neigbour_params_t *ps_top_right_mb;
478    mb_neigbour_params_t *ps_curmb;
479} dec_mb_info_t;
480
481
482/** Slice level parameters */
483typedef struct
484{
485    dec_pic_params_t *ps_pps; /** PPS used */
486    WORD32 i4_delta_pic_order_cnt[2];
487    WORD32 i4_poc; /** Pic order cnt of picture to which slice belongs*/
488    UWORD32 u4_idr_pic_id; /** IDR pic ID */
489    UWORD16 u2_first_mb_in_slice; /** Address of first MB in slice*/
490    UWORD16 u2_frame_num; /** Frame number from prev IDR pic */
491
492    UWORD8 u1_mbaff_frame_flag; /** Mb adaptive frame field u4_flag */
493    UWORD8 u1_field_pic_flag; /** Field picture or not */
494    UWORD8 u1_bottom_field_flag; /** If slice belongs to bot field pic */
495    UWORD8 u1_slice_type; /** I/P/B/SI/SP */
496    WORD32 i4_pic_order_cnt_lsb; /** Picture Order Count */
497    UWORD8 u1_slice_qp; /** Add slice_qp_delta to pic_init_QP */
498    UWORD8 u1_disable_dblk_filter_idc; /** 0-dblk all edges; 1 - suppress; 2 - suppress only edges */
499    WORD8 i1_slice_alpha_c0_offset; /** dblk: alpha and C0 table u4_ofst {-12,12}*/
500    WORD8 i1_slice_beta_offset; /** dblk: beta table u4_ofst {-12, 12}*/
501    UWORD8 u1_sp_for_switch_flag;
502    UWORD8 u1_no_output_of_prior_pics_flag;
503    UWORD8 u1_long_term_reference_flag;
504    UWORD8 u1_num_ref_idx_lx_active[2];
505    UWORD8 u1_cabac_init_idc; /** cabac_init_idc */
506    UWORD8 u1_num_ref_idx_active_override_flag;
507    UWORD8 u1_direct_spatial_mv_pred_flag;
508    WORD32 (*pf_decodeDirect)(struct _DecStruct *ps_dec,
509                              UWORD8 u1_wd_x,
510                              dec_mb_info_t *ps_cur_mb_info,
511                              UWORD8 u1_mb_num);
512    UWORD8 u1_redundant_pic_cnt;
513    WORD8 i1_slice_qs_delta;
514    UWORD8 u1_nal_ref_idc; /** NAL ref idc of the Slice NAL unit */
515    UWORD8 u1_nal_unit_type; /** NAL unit type of the Slice NAL */
516    UWORD8 u1_direct_8x8_inference_flag;
517    UWORD8 u1_mmco_equalto5; /** any of the MMCO command equal to 5 */
518    UWORD8 u1_pic_order_cnt_type;
519    pocstruct_t s_POC;
520    /* DataStructures required for weighted prediction */
521    UWORD16 u2_log2Y_crwd; /** Packed luma and chroma log2_weight_denom */
522    /* [list0/list1]:[ref pics index]:[0-Y 1-Cb 2-Cr] [weight/u4_ofst],
523     weights and offsets are signed numbers, since they are packed, it is defined
524     unsigned. LSB byte : weight and MSB byte: u4_ofst */
525    UWORD32 u4_wt_ofst_lx[2][MAX_REF_BUFS][3];
526    void * pv_codec_handle; /* For Error Handling */
527
528    /*  This is used when reordering is done in Forward or    */
529    /*  backward lists. This is because reordering can point  */
530    /*  to any valid entry in initial list irrespective of    */
531    /*  num_ref_idx_active which could be overwritten using   */
532    /*  ref_idx_reorder_flag                                  */
533    UWORD8 u1_initial_list_size[2];
534    UWORD32 u4_mbs_in_slice;
535} dec_slice_params_t;
536
537
538typedef struct
539{
540    UWORD8 u1_mb_type; /* Bit representations, X- reserved */
541    /** |Field/Frame|X|X|X|X|Bslice u4_flag|PRED_NON_16x16 u4_flag |Intra Mbflag| */
542    UWORD8 u1_mb_qp;
543    UWORD8 u1_deblocking_mode; /** dblk: Mode [ NO / NO TOP / NO LEFT] filter */
544    WORD8 i1_slice_alpha_c0_offset; /** dblk: alpha and C0 table u4_ofst {-12,12}*/
545    WORD8 i1_slice_beta_offset; /** dblk: beta table u4_ofst {-12, 12}*/
546    UWORD8 u1_single_call;
547    UWORD8 u1_topmb_qp;
548    UWORD8 u1_left_mb_qp;
549    UWORD32 u4_bs_table[10]; /* Boundary strength */
550
551} deblk_mb_t;
552
553typedef struct
554{
555    UWORD8 u1_mb_type;
556    UWORD8 u1_mb_qp;
557} deblkmb_neighbour_t;
558
559#define MAX_MV_RESIDUAL_INFO_PER_MB    32
560#define MAX_REFIDX_INFO_PER_MB         4
561#define PART_NOT_DIRECT                0
562#define PART_DIRECT_8x8                1
563#define PART_DIRECT_16x16              2
564typedef struct
565{
566    UWORD8 u1_is_direct;
567    UWORD8 u1_pred_mode;
568    UWORD8 u1_sub_mb_num;
569    UWORD8 u1_partheight;
570    UWORD8 u1_partwidth;
571} parse_part_params_t;
572
573typedef struct
574{
575    UWORD8 u1_isI_mb;
576    UWORD8 u1_num_part;
577    UWORD32 *pu4_wt_offst[MAX_REFIDX_INFO_PER_MB];
578    WORD8 i1_ref_idx[2][MAX_REFIDX_INFO_PER_MB];
579    UWORD8 u1_col_info[MAX_REFIDX_INFO_PER_MB];
580} parse_pmbarams_t;
581
582typedef struct
583{
584    UWORD8 u1_vert_pad_top; /* flip-flop u4_flag remembering pad area (Vert) */
585    UWORD8 u1_vert_pad_bot; /* flip-flop u4_flag remembering pad area (Vert) */
586    UWORD8 u1_horz_pad; /* flip-flop u4_flag remembering pad area (Vert) */
587    UWORD8 u1_pad_len_y_v; /* vertical pad amount for luma               */
588    UWORD8 u1_pad_len_cr_v; /* vertical pad amount for chroma             */
589} pad_mgr_t;
590
591
592#define ACCEPT_ALL_PICS   (0x00)
593#define REJECT_CUR_PIC    (0x01)
594#define REJECT_PB_PICS    (0x02)
595
596#define MASK_REJECT_CUR_PIC (0xFE)
597#define MASK_REJECT_PB_PICS (0xFD)
598
599#define PIC_TYPE_UNKNOWN  (0xFF)
600#define PIC_TYPE_I        (0x00)
601#define SYNC_FRM_DEFAULT  (0xFFFFFFFF)
602#define INIT_FRAME        (0xFFFFFF)
603
604typedef struct dec_err_status_t
605{
606    UWORD8 u1_cur_pic_type;
607    UWORD8 u1_pic_aud_i;
608    UWORD8 u1_err_flag;
609    UWORD32 u4_frm_sei_sync;
610    UWORD32 u4_cur_frm;
611} dec_err_status_t;
612
613/**************************************************************************/
614/* Structure holds information about all high profile toolsets            */
615/**************************************************************************/
616typedef struct
617{
618    /*****************************************/
619    /* variables required for scaling        */
620    /*****************************************/
621    UWORD8 u1_scaling_present;
622    WORD16 *pi2_scale_mat[8];
623
624    /*************************************************/
625    /* scaling matrices for frame macroblocks after  */
626    /* inverse scanning                              */
627    /*************************************************/
628    WORD16 i2_scalinglist4x4[6][16];
629    WORD16 i2_scalinglist8x8[2][64];
630
631
632    /*****************************************/
633    /* variables required for transform8x8   */
634    /*****************************************/
635    UWORD8 u1_transform8x8_present;
636    UWORD8 u1_direct_8x8_inference_flag;
637    /* temporary variable to get noSubMbPartSizeLessThan8x8Flag from ih264d_parse_bmb_non_direct_cavlc */
638    UWORD8 u1_no_submb_part_size_lt8x8_flag;
639
640    /* needed for inverse scanning */
641    cavlc_cntxt_t s_cavlc_ctxt;
642
643    /* contexts for the CABAC related parsing */
644    bin_ctxt_model_t *ps_transform8x8_flag;
645    bin_ctxt_model_t *ps_sigcoeff_8x8_frame;
646    bin_ctxt_model_t *ps_last_sigcoeff_8x8_frame;
647    bin_ctxt_model_t *ps_coeff_abs_levelminus1;
648    bin_ctxt_model_t *ps_sigcoeff_8x8_field;
649    bin_ctxt_model_t *ps_last_sigcoeff_8x8_field;
650
651/* variables required for intra8x8 */
652
653/* variables required for handling different Qp for Cb and Cr */
654
655} high_profile_tools_t;
656
657typedef struct
658{
659    UWORD32 u4_num_bufs; /* Number of buffers in each display frame. 2 for 420SP and 3 for 420P and so on */
660    void *buf[3]; /* Pointers to each of the components */
661    UWORD32 u4_bufsize[3];
662    UWORD32 u4_ofst[3];
663} disp_buf_t;
664typedef struct _dec_slice_struct
665{
666    volatile UWORD32 u4_first_mb_in_slice;
667    volatile UWORD32 slice_type;
668    volatile UWORD16 u2_log2Y_crwd;
669    volatile void **ppv_map_ref_idx_to_poc;
670    volatile void *pv_tu_coeff_data_start;
671} dec_slice_struct_t;
672
673/**
674 * Structure to hold coefficient info for a 4x4 transform
675 */
676typedef struct
677{
678    /**
679     * significant coefficient map
680     */
681    UWORD16 u2_sig_coeff_map;
682
683    /**
684     * holds coefficients
685     */
686    WORD16  ai2_level[16];
687}tu_sblk4x4_coeff_data_t;
688
689/**
690 * Structure to hold coefficient info for a 8x8 transform
691 */
692typedef struct
693{
694
695    /**
696     * significant coefficient map
697     */
698    UWORD32 au4_sig_coeff_map[2];
699
700    /**
701     * holds coefficients
702     */
703    WORD16  ai2_level[64];
704}tu_blk8x8_coeff_data_t;
705
706/** Aggregating structure that is globally available */
707typedef struct _DecStruct
708{
709
710    /* Add below all other static memory allocations and pointers to items
711     that are dynamically allocated once per session */
712    dec_bit_stream_t *ps_bitstrm;
713    dec_seq_params_t *ps_cur_sps;
714    dec_pic_params_t *ps_cur_pps;
715    dec_slice_params_t *ps_cur_slice;
716
717    dec_pic_params_t *ps_pps;
718    dec_seq_params_t *ps_sps;
719    const UWORD16 *pu2_quant_scale_y;
720    const UWORD16 *pu2_quant_scale_u;
721    const UWORD16 *pu2_quant_scale_v;
722    UWORD16 u2_mbx;
723    UWORD16 u2_mby;
724
725    UWORD16 u2_frm_wd_y; /** Width for luma buff */
726    UWORD16 u2_frm_ht_y; /** Height for luma buff */
727    UWORD16 u2_frm_wd_uv; /** Width for chroma buff */
728    UWORD16 u2_frm_ht_uv; /** Height for chroma buff */
729    UWORD16 u2_frm_wd_in_mbs; /** Frame width expressed in MB units */
730    UWORD16 u2_frm_ht_in_mbs; /** Frame height expressed in MB units */
731    WORD32 i4_submb_ofst; /** Offset in subMbs from the top left edge */
732    /* Pointer to colocated Zero frame Image, will be used in B_DIRECT mode */
733    /* colZeroFlag | // 0th bit
734     field_flag  | // 1st bit
735     XX          | // 2:3 bit don't cares
736     subMbMode   | // 4:5 bit
737     MbMode      | // 6:7 bit */
738
739    UWORD8 *pu1_col_zero_flag;
740
741    UWORD16 u2_pic_wd; /** Width of the picture being decoded */
742    UWORD16 u2_pic_ht; /** Height of the picture being decoded */
743
744    UWORD8 u1_first_slice_in_stream;
745    UWORD8 u1_mb_ngbr_availablity;
746    UWORD8 u1_ref_idxl0_active_minus1;
747    UWORD8 u1_qp;
748    UWORD8 u1_qp_y_div6;
749    UWORD8 u1_qp_u_div6;
750    UWORD8 u1_qp_y_rem6;
751    UWORD8 u1_qp_u_rem6;
752
753    /*********************************/
754    /* configurable mb-group numbers */
755    /* very critical to the decoder  */
756    /*********************************/
757    /************************************************************/
758    /* MB_GROUP should be a multiple of 2                       */
759    /************************************************************/
760    UWORD8 u1_recon_mb_grp;
761    UWORD8 u1_recon_mb_grp_pair;
762    /* Variables to handle Cabac */
763    decoding_envirnoment_t s_cab_dec_env; /* < Structure for decoding_envirnoment_t */
764    /* These things need to be updated at each MbLevel */
765    WORD8 i1_next_ctxt_idx; /* < next Ctxt Index */
766    UWORD8 u1_currB_type;
767    WORD8 i1_prev_mb_qp_delta; /* Prev MbQpDelta */
768    UWORD8 u1_nal_unit_type;
769
770    ctxt_inc_mb_info_t *p_ctxt_inc_mb_map; /* Pointer to ctxt_inc_mb_info_t map */
771    ctxt_inc_mb_info_t *p_left_ctxt_mb_info; /* Pointer to left ctxt_inc_mb_info_t */
772    ctxt_inc_mb_info_t *p_top_ctxt_mb_info; /* Pointer to top ctxt_inc_mb_info_t */
773    ctxt_inc_mb_info_t *ps_curr_ctxt_mb_info; /* Pointer to current ctxt_inc_mb_info_t */
774    ctxt_inc_mb_info_t *ps_def_ctxt_mb_info; /* Pointer to default ctxt_inc_mb_info_t */
775
776    /* mv contexts for mv decoding using cabac */
777    //UWORD8   u1_top_mv_ctxt_inc[4][4];
778    /* Dimensions for u1_left_mv_ctxt_inc_arr is [2][4][4] for Mbaff case */
779    UWORD8 u1_left_mv_ctxt_inc_arr[2][4][4];
780    UWORD8 (*pu1_left_mv_ctxt_inc)[4];
781
782    UWORD8 u1_sub_mb_num;
783    UWORD8 u1_B; /** if B slice u1_B = 1 else 0 */
784    WORD16 i2_only_backwarddma_info_idx;
785    mv_pred_t *ps_mv; /** Pointer to the MV bank array */
786    mv_pred_t *ps_mv_bank_cur; /** Pointer to the MV bank array */
787    mv_pred_t s_default_mv_pred; /** Structure containing the default values
788     for MV predictor */
789
790    pred_info_t *ps_pred; /** Stores info to cfg MC */
791    pred_info_t *ps_pred_start;
792
793    UWORD32 u4_pred_info_idx;
794    pred_info_pkd_t *ps_pred_pkd;
795    pred_info_pkd_t *ps_pred_pkd_start;
796    UWORD32 u4_pred_info_pkd_idx;
797    UWORD8 *pu1_ref_buff; /** Destination buffer for DMAs */
798    UWORD32 u4_dma_buf_idx;
799
800    UWORD8 *pu1_y;
801    UWORD8 *pu1_u;
802    UWORD8 *pu1_v;
803
804    WORD16 *pi2_y_coeff;
805    UWORD8 *pu1_inv_scan;
806
807    /**
808     * Pointer frame level TU subblock coeff data
809     */
810    void *pv_pic_tu_coeff_data;
811
812    /**
813     * Pointer to TU subblock coeff data and number of subblocks and scan idx
814     * Incremented each time a coded subblock is processed
815     *
816     */
817    void *pv_parse_tu_coeff_data;
818    void *pv_prev_mb_parse_tu_coeff_data;
819
820    void *pv_proc_tu_coeff_data;
821
822    WORD16 *pi2_coeff_data;
823
824    cavlc_cntxt_t s_cavlc_ctxt;
825
826    UWORD32 u4_n_leftY[2];
827    UWORD32 u4_n_left_cr[2];
828    UWORD32 u4_n_left_temp_y;
829
830    UWORD8 pu1_left_nnz_y[4];
831    UWORD8 pu1_left_nnz_uv[4];
832    UWORD32 u4_n_left_temp_uv;
833    /***************************************************************************/
834    /*          Base pointer to all the cabac contexts                         */
835    /***************************************************************************/
836    bin_ctxt_model_t *p_cabac_ctxt_table_t;
837
838    /***************************************************************************/
839    /* cabac context pointers for every SE mapped into in p_cabac_ctxt_table_t */
840    /***************************************************************************/
841    bin_ctxt_model_t *p_mb_type_t;
842    bin_ctxt_model_t *p_mb_skip_flag_t;
843    bin_ctxt_model_t *p_sub_mb_type_t;
844    bin_ctxt_model_t *p_mvd_x_t;
845    bin_ctxt_model_t *p_mvd_y_t;
846    bin_ctxt_model_t *p_ref_idx_t;
847    bin_ctxt_model_t *p_mb_qp_delta_t;
848    bin_ctxt_model_t *p_intra_chroma_pred_mode_t;
849    bin_ctxt_model_t *p_prev_intra4x4_pred_mode_flag_t;
850    bin_ctxt_model_t *p_rem_intra4x4_pred_mode_t;
851    bin_ctxt_model_t *p_mb_field_dec_flag_t;
852    bin_ctxt_model_t *p_cbp_luma_t;
853    bin_ctxt_model_t *p_cbp_chroma_t;
854    bin_ctxt_model_t *p_cbf_t[NUM_CTX_CAT];
855    bin_ctxt_model_t *p_significant_coeff_flag_t[NUM_CTX_CAT];
856    bin_ctxt_model_t *p_coeff_abs_level_minus1_t[NUM_CTX_CAT];
857
858    UWORD32 u4_num_pmbair; /** MB pair number */
859    mv_pred_t *ps_mv_left; /** Pointer to left motion vector bank */
860    mv_pred_t *ps_mv_top_left; /** Pointer to top left motion vector bank */
861    mv_pred_t *ps_mv_top_right; /** Pointer to top right motion vector bank */
862
863    UWORD8 *pu1_left_yuv_dc_csbp;
864
865
866    deblkmb_neighbour_t deblk_left_mb[2];
867    deblkmb_neighbour_t *ps_deblk_top_mb;
868    neighbouradd_t (*ps_left_mvpred_addr)[2]; /* Left MvPred Address Ping Pong*/
869
870    /***************************************************************************/
871    /*       Ref_idx contexts  are stored in the following way                 */
872    /*  Array Idx 0,1 for reference indices in Forward direction               */
873    /*  Array Idx 2,3 for reference indices in backward direction              */
874    /***************************************************************************/
875
876    /* Dimensions for u1_left_ref_ctxt_inc_arr is [2][4] for Mbaff:Top and Bot */
877    WORD8 i1_left_ref_idx_ctx_inc_arr[2][4];
878    WORD8 *pi1_left_ref_idx_ctxt_inc;
879
880    /*************************************************************************/
881    /*               Arrangnment of DC CSBP                                  */
882    /*        bits:  b7  b6  b5  b4  b3  b2  b1  b0                          */
883    /*        CSBP:   x   x   x   x   x  Vdc Udc Ydc                         */
884    /*************************************************************************/
885    /*************************************************************************/
886    /*  Points either to u1_yuv_dc_csbp_topmb or  u1_yuv_dc_csbp_bot_mb     */
887    /*************************************************************************/
888    UWORD8 u1_yuv_dc_csbp_topmb;
889    UWORD8 u1_yuv_dc_csbp_bot_mb;
890
891    /* DMA SETUP */
892    tfr_ctxt_t s_tran_addrecon_parse;
893    tfr_ctxt_t s_tran_addrecon;
894    tfr_ctxt_t s_tran_iprecon;
895    tfr_ctxt_t *ps_frame_buf_ip_recon;
896    WORD8 i1_recon_in_thread3_flag;
897
898    /* slice Header Simplification */
899    UWORD8 u1_pr_sl_type;
900    WORD32 i4_frametype;
901    UWORD32 u4_app_disp_width;
902    WORD32 i4_error_code;
903    UWORD32 u4_bitoffset;
904
905    /* Variables added to handle field pics */
906
907    UWORD8 u1_second_field;
908    WORD32 i4_pic_type;
909    WORD32 i4_content_type;
910    WORD32 i4_decode_header;
911    WORD32 i4_header_decoded;
912    UWORD32 u4_total_frames_decoded;
913
914    ctxt_inc_mb_info_t *ps_left_mb_ctxt_info; /* structure containing the left MB's
915     context info, incase of Mbaff */
916    pocstruct_t s_prev_pic_poc;
917    pocstruct_t s_cur_pic_poc;
918    WORD32 i4_cur_display_seq;
919    WORD32 i4_prev_max_display_seq;
920    WORD32 i4_max_poc;
921    deblk_mb_t *ps_cur_deblk_mb;
922
923    /* Pointers to local scratch buffers */
924    deblk_mb_t *ps_deblk_pic;
925
926    /* Pointers to Picture Buffers (Given by BufAPI Lib) */
927    struct pic_buffer_t *ps_cur_pic; /** Pointer to Current picture buffer */
928
929    /* Scratch Picture Buffers (Given by BufAPI Lib) */
930    struct pic_buffer_t s_cur_pic;
931
932    /* Current Slice related information */
933    volatile UWORD16 u2_cur_slice_num;
934    volatile UWORD16 u2_cur_slice_num_dec_thread;
935
936    /* Variables needed for Buffer API handling */
937    UWORD8 u1_nal_buf_id;
938    UWORD8 u1_pic_buf_id;
939    UWORD8 u1_pic_bufs;
940
941    WORD16 *pi2_pred1; //[441];  /** Temp predictor buffer for MC */
942    /* Pointer to refernce Pic buffers list, 0:fwd, 1:bwd */
943    pic_buffer_t **ps_ref_pic_buf_lx[2];
944    /* refIdx to POC mapping */
945    void **ppv_map_ref_idx_to_poc;
946    void **ppv_map_ref_idx_to_poc_base;
947    UWORD32 *pu4_wts_ofsts_mat;
948    UWORD32 *pu4_wt_ofsts;
949    UWORD32 *pu4_mbaff_wt_mat;
950    /* Function pointers to read Params common to CAVLC and CABAC */
951    WORD32 (*pf_parse_inter_mb)(struct _DecStruct * ps_dec,
952                                dec_mb_info_t * ps_cur_mb_info,
953                                UWORD8 u1_mb_num,
954                                UWORD8 u1_num_mbsNby2);
955    WORD32 (*pf_mvpred_ref_tfr_nby2mb)(struct _DecStruct * ps_dec,
956                                     UWORD8 u1_num_mbs,
957                                     UWORD8 u1_num_mbsNby2);
958
959    WORD32 (*pf_parse_inter_slice)(struct _DecStruct * ps_dec,
960                                   dec_slice_params_t * ps_slice,
961                                   UWORD16 u2_first_mb_in_slice);
962
963    UWORD32 (*pf_get_mb_info)(struct _DecStruct * ps_dec,
964                              const UWORD16 u2_cur_mb_address,
965                              dec_mb_info_t * ps_cur_mb_info,
966                              UWORD32 u4_mbskip_run);
967
968    /* Variables for Decode Buffer Management */
969    dpb_manager_t *ps_dpb_mgr;
970    dpb_commands_t *ps_dpb_cmds;
971    dpb_commands_t s_dpb_cmds_scratch;
972
973    /* Variables Required for N MB design */
974    dec_mb_info_t *ps_nmb_info;
975
976    UWORD8 *pu1_y_intra_pred_line;
977    UWORD8 *pu1_u_intra_pred_line;
978    UWORD8 *pu1_v_intra_pred_line;
979
980    UWORD8 *pu1_cur_y_intra_pred_line;
981    UWORD8 *pu1_cur_u_intra_pred_line;
982    UWORD8 *pu1_cur_v_intra_pred_line;
983
984    UWORD8 *pu1_cur_y_intra_pred_line_base;
985    UWORD8 *pu1_cur_u_intra_pred_line_base;
986    UWORD8 *pu1_cur_v_intra_pred_line_base;
987
988    UWORD8 *pu1_prev_y_intra_pred_line;
989    UWORD8 *pu1_prev_u_intra_pred_line;
990    UWORD8 *pu1_prev_v_intra_pred_line;
991
992    UWORD32 u4_intra_pred_line_ofst;
993
994    UWORD8 u1_res_changed;
995
996    mv_pred_t *ps_mv_cur; /** pointer to current motion vector bank */
997    mv_pred_t *ps_mv_top; /** pointer to top motion vector bank */
998    mv_pred_t *ps_mv_top_right2;/** Pointer to top right motion vector bank */
999    mv_pred_t *ps_mv_p[2]; /** Scratch ping motion vector bank */
1000    mv_pred_t *ps_mv_top_p[MV_SCRATCH_BUFS]; /** Scratch top pong motion vector bank */
1001    UWORD8 u1_mv_top_p;
1002
1003    deblk_mb_t *ps_deblk_mbn;
1004
1005    UWORD8 *pu1_temp_mc_buffer;
1006
1007    struct _sei *ps_sei;
1008    UWORD8 u1_pic_struct_copy;
1009    /* Variables required for cropping */
1010    UWORD16 u2_disp_width;
1011    UWORD16 u2_disp_height;
1012    UWORD16 u2_crop_offset_y;
1013    UWORD16 u2_crop_offset_uv;
1014
1015    /* Variable required to get presentation time stamp through application */
1016    UWORD32 u4_pts;
1017
1018    /* Variables used for gaps in frame number */
1019    UWORD16 u2_prev_ref_frame_num;
1020
1021    UWORD8 u1_mb_idx;
1022    struct pic_buffer_t *ps_col_pic;
1023    void (*pf_parse_mvdirect)(struct _DecStruct*,
1024                           struct pic_buffer_t*,
1025                           directmv_t*,
1026                           UWORD8,
1027                           WORD32,
1028                           dec_mb_info_t *);
1029    void *pv_dec_out;
1030    void *pv_dec_in;
1031    void *pv_scratch_sps_pps; /*used temeporarily store sps/ spps while parsing*/
1032
1033    /* state pointers to mb and partition information */
1034    parse_pmbarams_t *ps_parse_mb_data;
1035    parse_part_params_t *ps_parse_part_params;
1036
1037    /* scratch pointers to mb and partition information */
1038    parse_part_params_t *ps_part;
1039
1040    UWORD8 u1_max_dec_frame_buffering;
1041    pad_mgr_t s_pad_mgr;
1042    UWORD8 (*pf_mvpred)(struct _DecStruct *ps_dec,
1043                        struct _DecMbInfo *ps_cur_mb_info,
1044                        mv_pred_t *ps_mv_pred,
1045                        mv_pred_t *ps_mv_nmb,
1046                        mv_pred_t *ps_mv_ntop,
1047                        UWORD8 u1_sub_mb_num,
1048                        UWORD8 uc_mb_part_width,
1049                        UWORD8 uc_lxstart,
1050                        UWORD8 uc_lxend,
1051                        UWORD8 u1_mb_mc_mode);
1052    void (*pf_compute_bs)(struct _DecStruct * ps_dec,
1053                         struct _DecMbInfo * ps_cur_mb_info,
1054                         const UWORD16 u2_mbxn_mb);
1055    UWORD8 u1_init_dec_flag;
1056    prev_seq_params_t s_prev_seq_params;
1057    UWORD8 u1_cur_mb_fld_dec_flag; /* current Mb fld or Frm */
1058
1059    UWORD8 u1_topleft_mb_fld;
1060    UWORD8 u1_topleft_mbtype;
1061    UWORD8 u1_topleft_mb_fld_bot;
1062    UWORD8 u1_topleft_mbtype_bot;
1063    WORD16 i2_prev_slice_mbx;
1064    WORD16 i2_prev_slice_mby;
1065    UWORD16 u2_top_left_mask;
1066    UWORD16 u2_top_right_mask;
1067    dec_err_status_t * ps_dec_err_status;
1068    /* Ensure pi1_left_pred_mode is aligned to 4 byte boundary,
1069    by declaring this after a pointer or an integer */
1070    WORD8 pi1_left_pred_mode[8];
1071
1072    UWORD8 u1_mb_idx_mv;
1073    UWORD16 u2_mv_2mb[2];
1074    UWORD32 u4_skip_frm_mask;
1075
1076    /* variable for finding the no.of mbs decoded in the current picture */
1077    UWORD16 u2_total_mbs_coded;
1078    /* member added for supporting fragmented annex - B */
1079//  frg_annex_read_t s_frag_annex_read;
1080    /* added for vui_t, sei support*/
1081    WORD32 i4_vui_frame_rate;
1082    /* To Store the value of ref_idx_active for previous slice */
1083    /* useful in error handling                                */
1084    UWORD8 u1_num_ref_idx_lx_active_prev;
1085    /* Flag added to come out of process call in annex-b if&if frame is decoded */
1086    /* presence of access unit delimters and pps and sps                        */
1087    UWORD8 u1_frame_decoded_flag;
1088
1089    /* To keep track of whether the last picture was decoded or not */
1090    /* in case of skip mode set by the application                  */
1091    UWORD8 u1_last_pic_not_decoded;
1092
1093    WORD32 e_dec_status;
1094    UWORD32 u4_num_fld_in_frm;
1095
1096    /* Function pointer for 4x4 residual cavlc parsing based on total coeff */
1097    WORD32 (*pf_cavlc_4x4res_block[3])(UWORD32 u4_isdc,
1098                                    UWORD32 u4_total_coeff_trail_one, /**TotalCoefficients<<16+trailingones*/
1099                                    dec_bit_stream_t *ps_bitstrm);
1100
1101    /* Function pointer array for interpolate functions in called from motion compensattion module */
1102    void (*p_mc_interpolate_x_y[16][3])(UWORD8*,
1103                                        UWORD8*,
1104                                        UWORD8*,
1105                                        UWORD8,
1106                                        UWORD16,
1107                                        UWORD16,
1108                                        UWORD8);
1109
1110    /**************************************************************************/
1111    /* Function pointer for 4x4 totalcoeff, trlone and residual cavlc parsing */
1112    /* based on u4_n (neigbourinng nnz average)                               */
1113    /* These point to two functions depending on (u4_n > 7) and (u4_n <= 7)   */
1114    /**************************************************************************/
1115    WORD32 (*pf_cavlc_parse4x4coeff[2])(WORD16 *pi2_coeff_block,
1116                                        UWORD32 u4_isdc, /* is it a DC block */
1117                                        WORD32 u4_n,
1118                                        struct _DecStruct *ps_dec, /** Decoder Parameters */
1119                                        UWORD32 *pu4_total_coeff);
1120
1121    /**************************************************************************/
1122    /* Function pointer for luma 8x8block cavlc parsing based on top and left */
1123    /* neigbour availability.                                                 */
1124    /**************************************************************************/
1125    WORD32 (*pf_cavlc_parse_8x8block[4])(WORD16 *pi2_coeff_block,
1126                                         UWORD32 u4_sub_block_strd,
1127                                         UWORD32 u4_isdc,
1128                                         struct _DecStruct *ps_dec,
1129                                         UWORD8 *pu1_top_nnz,
1130                                         UWORD8 *pu1_left_nnz,
1131                                         UWORD8 u1_tran_form8x8,
1132                                         UWORD8 u1_mb_field_decodingflag,
1133                                         UWORD32 *pu4_csbp);
1134
1135    /**************************************************************************/
1136    /* Ping pong top and current rows of mb neigbour_params                   */
1137    /**************************************************************************/
1138    mb_neigbour_params_t *ps_nbr_mb_row;
1139    mb_neigbour_params_t *ps_cur_mb_row;
1140    mb_neigbour_params_t *ps_top_mb_row;
1141
1142    /**************************************************************************/
1143    /* Function pointer for 16x16 and non16x16 Bs1 calculations depending on   */
1144    /* P and B slice.                                                          */
1145    /***************************************************************************/
1146    void (*pf_fill_bs1[2][2])(mv_pred_t *ps_cur_mv_pred,
1147                              mv_pred_t *ps_top_mv_pred,
1148                              void **ppv_map_ref_idx_to_poc,
1149                              UWORD32 *pu4_bs_table, /* pointer to the BsTable array */
1150                              mv_pred_t *ps_leftmost_mv_pred,
1151                              neighbouradd_t *ps_left_addr,
1152                              void **u4_pic_addrress,
1153                              WORD32 i4_ver_mvlimit);
1154
1155    void (*pf_fill_bs_xtra_left_edge[2])(UWORD32 *pu4_bs, /* Base pointer of BS table */
1156                                         WORD32 u4_left_mb_t_csbp, /* left mbpair's top csbp   */
1157                                         WORD32 u4_left_mb_b_csbp, /* left mbpair's bottom csbp*/
1158                                         WORD32 u4_cur_mb_csbp, /* csbp of current mb */
1159                                         UWORD32 u4_cur_mb_bot /* is top or bottom mb */
1160
1161                                         );
1162    /* Function pointer array for BP and MP functions for MC*/
1163    void (*p_motion_compensate)(struct _DecStruct * ps_dec,
1164                               dec_mb_info_t *ps_cur_mb_info);
1165
1166
1167    void (*p_mc_dec_thread)(struct _DecStruct * ps_dec, dec_mb_info_t *ps_cur_mb_info);
1168
1169    /* Function pointer array for BP and MP functions for formMbPartInfo*/
1170
1171    WORD32 (*p_form_mb_part_info)(pred_info_pkd_t *ps_pred_pkd,
1172                                struct _DecStruct * ps_dec,
1173                                     UWORD16 u2_mb_x,
1174                                     UWORD16 u2_mb_y,
1175                                     WORD32 mb_index,
1176                                     dec_mb_info_t *ps_cur_mb_info);
1177
1178    WORD32 (*p_form_mb_part_info_thread)(pred_info_pkd_t *ps_pred_pkd,
1179                                struct _DecStruct * ps_dec,
1180                                     UWORD16 u2_mb_x,
1181                                     UWORD16 u2_mb_y,
1182                                     WORD32 mb_index,
1183                                     dec_mb_info_t *ps_cur_mb_info);
1184
1185
1186    /* Required for cabac mbaff bottom mb */
1187    UWORD32 u4_next_mb_skip;
1188
1189    void (*p_DeblockPicture[2])(struct _DecStruct *);
1190
1191    /* ! */
1192    UWORD32 u4_ts;
1193    UWORD8 u1_flushfrm;
1194
1195    /* Output format sent by the application */
1196    UWORD8 u1_chroma_format;
1197    UWORD8 u1_pic_decode_done;
1198    UWORD8 u1_slice_header_done;
1199    WORD32 init_done;
1200
1201    /******************************************/
1202    /* For the high profile related variables */
1203    /******************************************/
1204    high_profile_tools_t s_high_profile;
1205    /* CBCR */
1206    UWORD8 u1_qp_v_div6;
1207    UWORD8 u1_qp_v_rem6;
1208    /*
1209     * TO help solve the dangling field case.
1210     * Check for the previous frame number and the current frame number.
1211     */
1212    UWORD16 u2_prv_frame_num;
1213    UWORD8 u1_top_bottom_decoded;
1214    UWORD8 u1_dangling_field;
1215
1216    IVD_DISPLAY_FRAME_OUT_MODE_T                e_frm_out_mode;
1217
1218    UWORD8 *pu1_bits_buf_static;
1219    UWORD8 *pu1_bits_buf_dynamic;
1220
1221    UWORD32 u4_static_bits_buf_size;
1222    UWORD32 u4_dynamic_bits_buf_size;
1223
1224    UWORD32 u4_num_disp_bufs_requested;
1225    WORD32 i4_display_delay;
1226    UWORD32 u4_slice_start_code_found;
1227
1228    UWORD32 u4_nmb_deblk;
1229    UWORD32 u4_use_intrapred_line_copy;
1230    UWORD32 u4_num_mbs_prev_nmb;
1231    UWORD32 u4_num_mbs_cur_nmb;
1232    UWORD32 u4_app_deblk_disable_level;
1233    UWORD32 u4_app_disable_deblk_frm;
1234    WORD32 i4_app_skip_mode;
1235    WORD32 i4_mv_frac_mask;
1236
1237    disp_buf_t disp_bufs[MAX_DISP_BUFS_NEW];
1238    UWORD32 u4_disp_buf_mapping[MAX_DISP_BUFS_NEW];
1239    UWORD32 u4_disp_buf_to_be_freed[MAX_DISP_BUFS_NEW];
1240    UWORD32 u4_share_disp_buf;
1241    UWORD32 u4_num_disp_bufs;
1242    UWORD32 u4_prev_nal_skipped;
1243    UWORD32 u4_return_to_app;
1244    WORD32 i4_dec_skip_mode;
1245
1246    UWORD32 u4_bs_deblk_thread_created;
1247    volatile UWORD32 u4_start_recon_deblk;
1248    void *pv_bs_deblk_thread_handle;
1249
1250    UWORD32 u4_cur_bs_mb_num;
1251    UWORD32 u4_bs_cur_slice_num_mbs;
1252    UWORD32 u4_cur_deblk_mb_num;
1253    UWORD32 u4_sps_cnt_in_process;
1254    volatile UWORD16 u2_cur_slice_num_bs;
1255
1256    UWORD32 u4_deblk_mb_x;
1257    UWORD32 u4_deblk_mb_y;
1258
1259
1260
1261    iv_yuv_buf_t s_disp_frame_info;
1262    UWORD32 u4_fmt_conv_num_rows;
1263    UWORD32 u4_fmt_conv_cur_row;
1264    ivd_out_bufdesc_t *ps_out_buffer;
1265    ivd_get_display_frame_op_t s_disp_op;
1266    UWORD32 u4_output_present;
1267
1268    volatile UWORD16 cur_dec_mb_num;
1269    volatile UWORD16 cur_recon_mb_num;
1270    volatile UWORD16 u2_cur_mb_addr;
1271    WORD16 i2_dec_thread_mb_y;
1272    WORD16 i2_recon_thread_mb_y;
1273
1274    UWORD8 u1_separate_parse;
1275    UWORD32 u4_dec_thread_created;
1276    void *pv_dec_thread_handle;
1277    volatile UWORD8 *pu1_dec_mb_map;
1278    volatile UWORD8 *pu1_recon_mb_map;
1279    volatile UWORD16 *pu2_slice_num_map;
1280    dec_slice_struct_t *ps_dec_slice_buf;
1281    void *pv_map_ref_idx_to_poc_buf;
1282    dec_mb_info_t *ps_frm_mb_info;
1283    volatile dec_slice_struct_t * volatile ps_parse_cur_slice;
1284    volatile dec_slice_struct_t * volatile ps_decode_cur_slice;
1285    volatile dec_slice_struct_t * volatile ps_computebs_cur_slice;
1286    UWORD32 u4_cur_slice_decode_done;
1287    UWORD32 u4_extra_mem_used;
1288
1289    /* 2 first slice not parsed , 1 :first slice parsed , 0 :first valid slice header parsed*/
1290    UWORD32 u4_first_slice_in_pic;
1291    UWORD32 u4_num_cores;
1292    IVD_ARCH_T e_processor_arch;
1293    IVD_SOC_T e_processor_soc;
1294
1295    /**
1296     * Pictures that are are degraded
1297     * 0 : No degrade
1298     * 1 : Only on non-reference frames
1299     * 2 : Use interval specified by u4_nondegrade_interval
1300     * 3 : All non-key frames
1301     * 4 : All frames
1302     */
1303    WORD32 i4_degrade_pics;
1304
1305    /**
1306     * Interval for pictures which are completely decoded without any degradation
1307     */
1308    WORD32 i4_nondegrade_interval;
1309
1310    /**
1311     * bit position (lsb is zero): Type of degradation
1312     * 1 : Disable deblocking
1313     * 2 : Faster inter prediction filters
1314     * 3 : Fastest inter prediction filters
1315     */
1316    WORD32 i4_degrade_type;
1317
1318    /** Degrade pic count, Used to maintain the interval between non-degraded pics
1319     *
1320     */
1321    WORD32 i4_degrade_pic_cnt;
1322
1323    UWORD32 u4_pic_buf_got;
1324
1325    /**
1326     * Col flag and mv pred buffer manager
1327     */
1328    void *pv_mv_buf_mgr;
1329
1330    /**
1331     * Picture buffer manager
1332     */
1333    void *pv_pic_buf_mgr;
1334
1335    /**
1336     * Display buffer manager
1337     */
1338    void *pv_disp_buf_mgr;
1339
1340    void *apv_buf_id_pic_buf_map[MAX_DISP_BUFS_NEW];
1341
1342    UWORD8 au1_pic_buf_id_mv_buf_id_map[MAX_DISP_BUFS_NEW];
1343
1344    UWORD8 au1_pic_buf_ref_flag[MAX_DISP_BUFS_NEW];
1345
1346    struct pic_buffer_t *ps_pic_buf_base;
1347
1348    UWORD8 *pu1_ref_buff_base;
1349    col_mv_buf_t *ps_col_mv_base;
1350    void *(*pf_aligned_alloc)(void *pv_mem_ctxt, WORD32 alignment, WORD32 size);
1351    void (*pf_aligned_free)(void *pv_mem_ctxt, void *pv_buf);
1352    void *pv_mem_ctxt;
1353
1354    UWORD8 *pu1_pic_buf_base;
1355    UWORD8 *pu1_mv_bank_buf_base;
1356    UWORD8 *pu1_init_dpb_base;
1357
1358    ih264_default_weighted_pred_ft *pf_default_weighted_pred_luma;
1359
1360    ih264_default_weighted_pred_ft *pf_default_weighted_pred_chroma;
1361
1362    ih264_weighted_pred_ft *pf_weighted_pred_luma;
1363
1364    ih264_weighted_pred_ft *pf_weighted_pred_chroma;
1365
1366    ih264_weighted_bi_pred_ft *pf_weighted_bi_pred_luma;
1367
1368    ih264_weighted_bi_pred_ft *pf_weighted_bi_pred_chroma;
1369
1370    ih264_pad *pf_pad_top;
1371    ih264_pad *pf_pad_bottom;
1372    ih264_pad *pf_pad_left_luma;
1373    ih264_pad *pf_pad_left_chroma;
1374    ih264_pad *pf_pad_right_luma;
1375    ih264_pad *pf_pad_right_chroma;
1376
1377    ih264_inter_pred_chroma_ft *pf_inter_pred_chroma;
1378
1379    ih264_inter_pred_luma_ft *apf_inter_pred_luma[16];
1380
1381    ih264_intra_pred_luma_ft *apf_intra_pred_luma_16x16[4];
1382
1383    ih264_intra_pred_luma_ft *apf_intra_pred_luma_8x8[9];
1384
1385    ih264_intra_pred_luma_ft *apf_intra_pred_luma_4x4[9];
1386
1387    ih264_intra_pred_ref_filtering_ft *pf_intra_pred_ref_filtering;
1388
1389    ih264_intra_pred_chroma_ft *apf_intra_pred_chroma[4];
1390
1391    ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_luma_4x4;
1392
1393    ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_luma_4x4_dc;
1394
1395    ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_luma_8x8;
1396
1397    ih264_iquant_itrans_recon_ft *pf_iquant_itrans_recon_luma_8x8_dc;
1398
1399    ih264_iquant_itrans_recon_chroma_ft *pf_iquant_itrans_recon_chroma_4x4;
1400
1401    ih264_iquant_itrans_recon_chroma_ft *pf_iquant_itrans_recon_chroma_4x4_dc;
1402
1403    ih264_ihadamard_scaling_ft *pf_ihadamard_scaling_4x4;
1404
1405    /**
1406     * deblock vertical luma edge with blocking strength 4
1407     */
1408    ih264_deblk_edge_bs4_ft *pf_deblk_luma_vert_bs4;
1409
1410    /**
1411     * deblock vertical luma edge with blocking strength less than 4
1412     */
1413    ih264_deblk_edge_bslt4_ft *pf_deblk_luma_vert_bslt4;
1414
1415    /**
1416     * deblock vertical luma edge with blocking strength 4 for mbaff
1417     */
1418    ih264_deblk_edge_bs4_ft *pf_deblk_luma_vert_bs4_mbaff;
1419
1420    /**
1421     * deblock vertical luma edge with blocking strength less than 4 for mbaff
1422     */
1423    ih264_deblk_edge_bslt4_ft *pf_deblk_luma_vert_bslt4_mbaff;
1424
1425    /**
1426     * deblock vertical chroma edge with blocking strength 4
1427     */
1428    ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_vert_bs4;
1429
1430    /**
1431     * deblock vertical chroma edge with blocking strength less than 4
1432     */
1433    ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_vert_bslt4;
1434
1435    /**
1436     * deblock vertical chroma edge with blocking strength 4 for mbaff
1437     */
1438    ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_vert_bs4_mbaff;
1439
1440    /**
1441     * deblock vertical chroma edge with blocking strength less than 4 for mbaff
1442     */
1443    ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_vert_bslt4_mbaff;
1444
1445    /**
1446     * deblock horizontal luma edge with blocking strength 4
1447     */
1448    ih264_deblk_edge_bs4_ft *pf_deblk_luma_horz_bs4;
1449
1450    /**
1451     * deblock horizontal luma edge with blocking strength less than 4
1452     */
1453    ih264_deblk_edge_bslt4_ft *pf_deblk_luma_horz_bslt4;
1454
1455    /**
1456     * deblock horizontal chroma edge with blocking strength 4
1457     */
1458    ih264_deblk_chroma_edge_bs4_ft *pf_deblk_chroma_horz_bs4;
1459
1460    /**
1461     * deblock horizontal chroma edge with blocking strength less than 4
1462     */
1463    ih264_deblk_chroma_edge_bslt4_ft *pf_deblk_chroma_horz_bslt4;
1464
1465
1466} dec_struct_t;
1467
1468#endif /* _H264_DEC_STRUCTS_H */
1469