1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker
21*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
22*495ae853SAndroid Build Coastguard Worker /* */
23*495ae853SAndroid Build Coastguard Worker /* File Name : imvcd_utils.c */
24*495ae853SAndroid Build Coastguard Worker /* */
25*495ae853SAndroid Build Coastguard Worker /* Description : MVCD Utility functions used by 'imvcd_api.c' */
26*495ae853SAndroid Build Coastguard Worker /* */
27*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
28*495ae853SAndroid Build Coastguard Worker #include <string.h>
29*495ae853SAndroid Build Coastguard Worker
30*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
31*495ae853SAndroid Build Coastguard Worker #include "iv.h"
32*495ae853SAndroid Build Coastguard Worker #include "ih264_debug.h"
33*495ae853SAndroid Build Coastguard Worker #include "ih264_disp_mgr.h"
34*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
35*495ae853SAndroid Build Coastguard Worker #include "ih264d_error_handler.h"
36*495ae853SAndroid Build Coastguard Worker #include "ih264d_format_conv.h"
37*495ae853SAndroid Build Coastguard Worker #include "ih264d_utils.h"
38*495ae853SAndroid Build Coastguard Worker #include "imvcd_structs.h"
39*495ae853SAndroid Build Coastguard Worker #include "imvcd_utils.h"
40*495ae853SAndroid Build Coastguard Worker
imvcd_free_ref_bufs(mvc_au_buf_mgr_t * ps_mvc_au_buf_mgr,mvc_au_mv_pred_buf_mgr_t * ps_mvc_au_mv_pred_buf_mgr,WORD32 i4_pic_buf_id)41*495ae853SAndroid Build Coastguard Worker void imvcd_free_ref_bufs(mvc_au_buf_mgr_t *ps_mvc_au_buf_mgr,
42*495ae853SAndroid Build Coastguard Worker mvc_au_mv_pred_buf_mgr_t *ps_mvc_au_mv_pred_buf_mgr, WORD32 i4_pic_buf_id)
43*495ae853SAndroid Build Coastguard Worker {
44*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release(ps_mvc_au_buf_mgr->ps_buf_mgr_ctxt, i4_pic_buf_id, BUF_MGR_REF);
45*495ae853SAndroid Build Coastguard Worker
46*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release(ps_mvc_au_mv_pred_buf_mgr->ps_buf_mgr_ctxt,
47*495ae853SAndroid Build Coastguard Worker ps_mvc_au_buf_mgr->au1_au_buf_id_to_mv_buf_id_map[i4_pic_buf_id],
48*495ae853SAndroid Build Coastguard Worker BUF_MGR_REF);
49*495ae853SAndroid Build Coastguard Worker }
50*495ae853SAndroid Build Coastguard Worker
imvcd_release_all_ref_bufs(mvc_dec_ctxt_t * ps_mvcd_ctxt,WORD32 i4_num_bufs)51*495ae853SAndroid Build Coastguard Worker void imvcd_release_all_ref_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt, WORD32 i4_num_bufs)
52*495ae853SAndroid Build Coastguard Worker {
53*495ae853SAndroid Build Coastguard Worker WORD32 i;
54*495ae853SAndroid Build Coastguard Worker
55*495ae853SAndroid Build Coastguard Worker for(i = 0; i < i4_num_bufs; i++)
56*495ae853SAndroid Build Coastguard Worker {
57*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release(ps_mvcd_ctxt->s_mvc_au_buf_mgr.ps_buf_mgr_ctxt, i, BUF_MGR_REF);
58*495ae853SAndroid Build Coastguard Worker
59*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release(ps_mvcd_ctxt->s_mvc_au_mv_pred_buf_mgr.ps_buf_mgr_ctxt,
60*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->s_mvc_au_buf_mgr.au1_au_buf_id_to_mv_buf_id_map[i],
61*495ae853SAndroid Build Coastguard Worker BUF_MGR_REF);
62*495ae853SAndroid Build Coastguard Worker }
63*495ae853SAndroid Build Coastguard Worker }
64*495ae853SAndroid Build Coastguard Worker
imvcd_free_ref_and_io_bufs(mvc_au_buf_mgr_t * ps_mvc_au_buf_mgr,mvc_au_mv_pred_buf_mgr_t * ps_mvc_au_mv_pred_buf_mgr,WORD32 i4_pic_buf_id)65*495ae853SAndroid Build Coastguard Worker void imvcd_free_ref_and_io_bufs(mvc_au_buf_mgr_t *ps_mvc_au_buf_mgr,
66*495ae853SAndroid Build Coastguard Worker mvc_au_mv_pred_buf_mgr_t *ps_mvc_au_mv_pred_buf_mgr,
67*495ae853SAndroid Build Coastguard Worker WORD32 i4_pic_buf_id)
68*495ae853SAndroid Build Coastguard Worker {
69*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release(ps_mvc_au_buf_mgr->ps_buf_mgr_ctxt, i4_pic_buf_id,
70*495ae853SAndroid Build Coastguard Worker BUF_MGR_REF | BUF_MGR_IO);
71*495ae853SAndroid Build Coastguard Worker
72*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release(ps_mvc_au_mv_pred_buf_mgr->ps_buf_mgr_ctxt,
73*495ae853SAndroid Build Coastguard Worker ps_mvc_au_buf_mgr->au1_au_buf_id_to_mv_buf_id_map[i4_pic_buf_id],
74*495ae853SAndroid Build Coastguard Worker BUF_MGR_REF | BUF_MGR_IO);
75*495ae853SAndroid Build Coastguard Worker }
76*495ae853SAndroid Build Coastguard Worker
imvcd_release_all_ref_and_io_bufs(mvc_dec_ctxt_t * ps_mvcd_ctxt,WORD32 i4_num_bufs)77*495ae853SAndroid Build Coastguard Worker void imvcd_release_all_ref_and_io_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt, WORD32 i4_num_bufs)
78*495ae853SAndroid Build Coastguard Worker {
79*495ae853SAndroid Build Coastguard Worker WORD32 i;
80*495ae853SAndroid Build Coastguard Worker
81*495ae853SAndroid Build Coastguard Worker for(i = 0; i < i4_num_bufs; i++)
82*495ae853SAndroid Build Coastguard Worker {
83*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release(ps_mvcd_ctxt->s_mvc_au_buf_mgr.ps_buf_mgr_ctxt, i,
84*495ae853SAndroid Build Coastguard Worker BUF_MGR_REF | BUF_MGR_IO);
85*495ae853SAndroid Build Coastguard Worker
86*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release(ps_mvcd_ctxt->s_mvc_au_mv_pred_buf_mgr.ps_buf_mgr_ctxt,
87*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->s_mvc_au_buf_mgr.au1_au_buf_id_to_mv_buf_id_map[i],
88*495ae853SAndroid Build Coastguard Worker BUF_MGR_REF | BUF_MGR_IO);
89*495ae853SAndroid Build Coastguard Worker }
90*495ae853SAndroid Build Coastguard Worker }
91*495ae853SAndroid Build Coastguard Worker
is_header_decoded(WORD32 i4_header_decoded,AVC_EXT_NALU_ID_T e_nalu_id)92*495ae853SAndroid Build Coastguard Worker bool is_header_decoded(WORD32 i4_header_decoded, AVC_EXT_NALU_ID_T e_nalu_id)
93*495ae853SAndroid Build Coastguard Worker {
94*495ae853SAndroid Build Coastguard Worker /* Accounting for idiocy in 'ih264d_parse_nal_unit' */
95*495ae853SAndroid Build Coastguard Worker e_nalu_id = (SPS == e_nalu_id) ? UNSPEC_0 : ((PPS == e_nalu_id) ? SLICE_NON_IDR : e_nalu_id);
96*495ae853SAndroid Build Coastguard Worker return !!(i4_header_decoded & (1 << e_nalu_id));
97*495ae853SAndroid Build Coastguard Worker }
98*495ae853SAndroid Build Coastguard Worker
is_mvc_nalu(AVC_EXT_NALU_ID_T e_nalu_id)99*495ae853SAndroid Build Coastguard Worker bool is_mvc_nalu(AVC_EXT_NALU_ID_T e_nalu_id)
100*495ae853SAndroid Build Coastguard Worker {
101*495ae853SAndroid Build Coastguard Worker switch(e_nalu_id)
102*495ae853SAndroid Build Coastguard Worker {
103*495ae853SAndroid Build Coastguard Worker case SLICE_NON_IDR:
104*495ae853SAndroid Build Coastguard Worker case SLICE_DPA:
105*495ae853SAndroid Build Coastguard Worker case SLICE_DPB:
106*495ae853SAndroid Build Coastguard Worker case SLICE_DPC:
107*495ae853SAndroid Build Coastguard Worker case SLICE_IDR:
108*495ae853SAndroid Build Coastguard Worker case PREFIX_NAL:
109*495ae853SAndroid Build Coastguard Worker case SUBSET_SPS:
110*495ae853SAndroid Build Coastguard Worker case CODED_SLICE_EXTENSION:
111*495ae853SAndroid Build Coastguard Worker {
112*495ae853SAndroid Build Coastguard Worker return true;
113*495ae853SAndroid Build Coastguard Worker }
114*495ae853SAndroid Build Coastguard Worker default:
115*495ae853SAndroid Build Coastguard Worker {
116*495ae853SAndroid Build Coastguard Worker return false;
117*495ae853SAndroid Build Coastguard Worker }
118*495ae853SAndroid Build Coastguard Worker }
119*495ae853SAndroid Build Coastguard Worker }
120*495ae853SAndroid Build Coastguard Worker
is_slice_nalu_type(AVC_EXT_NALU_ID_T e_nalu_id)121*495ae853SAndroid Build Coastguard Worker bool is_slice_nalu_type(AVC_EXT_NALU_ID_T e_nalu_id)
122*495ae853SAndroid Build Coastguard Worker {
123*495ae853SAndroid Build Coastguard Worker switch(e_nalu_id)
124*495ae853SAndroid Build Coastguard Worker {
125*495ae853SAndroid Build Coastguard Worker case SLICE_NON_IDR:
126*495ae853SAndroid Build Coastguard Worker case SLICE_DPA:
127*495ae853SAndroid Build Coastguard Worker case SLICE_DPB:
128*495ae853SAndroid Build Coastguard Worker case SLICE_DPC:
129*495ae853SAndroid Build Coastguard Worker case SLICE_IDR:
130*495ae853SAndroid Build Coastguard Worker case CODED_SLICE_EXTENSION:
131*495ae853SAndroid Build Coastguard Worker case PREFIX_NAL:
132*495ae853SAndroid Build Coastguard Worker {
133*495ae853SAndroid Build Coastguard Worker return true;
134*495ae853SAndroid Build Coastguard Worker }
135*495ae853SAndroid Build Coastguard Worker default:
136*495ae853SAndroid Build Coastguard Worker {
137*495ae853SAndroid Build Coastguard Worker return false;
138*495ae853SAndroid Build Coastguard Worker }
139*495ae853SAndroid Build Coastguard Worker }
140*495ae853SAndroid Build Coastguard Worker }
141*495ae853SAndroid Build Coastguard Worker
imvcd_get_cur_nalu_mvc_ext(mvc_dec_ctxt_t * ps_mvcd_ctxt)142*495ae853SAndroid Build Coastguard Worker nalu_mvc_ext_t *imvcd_get_cur_nalu_mvc_ext(mvc_dec_ctxt_t *ps_mvcd_ctxt)
143*495ae853SAndroid Build Coastguard Worker {
144*495ae853SAndroid Build Coastguard Worker return &ps_mvcd_ctxt->as_nalu_mvc_ext[ps_mvcd_ctxt->u2_num_views_decoded];
145*495ae853SAndroid Build Coastguard Worker }
146*495ae853SAndroid Build Coastguard Worker
imvcd_get_nalu_mvc_ext(nalu_mvc_ext_t * ps_nalu_mvc_exts,UWORD16 u2_num_views_decoded,UWORD16 u2_view_id)147*495ae853SAndroid Build Coastguard Worker nalu_mvc_ext_t *imvcd_get_nalu_mvc_ext(nalu_mvc_ext_t *ps_nalu_mvc_exts,
148*495ae853SAndroid Build Coastguard Worker UWORD16 u2_num_views_decoded, UWORD16 u2_view_id)
149*495ae853SAndroid Build Coastguard Worker {
150*495ae853SAndroid Build Coastguard Worker WORD32 i;
151*495ae853SAndroid Build Coastguard Worker
152*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u2_num_views_decoded; i++)
153*495ae853SAndroid Build Coastguard Worker {
154*495ae853SAndroid Build Coastguard Worker if(ps_nalu_mvc_exts[i].u2_view_id == u2_view_id)
155*495ae853SAndroid Build Coastguard Worker {
156*495ae853SAndroid Build Coastguard Worker return &ps_nalu_mvc_exts[i];
157*495ae853SAndroid Build Coastguard Worker }
158*495ae853SAndroid Build Coastguard Worker }
159*495ae853SAndroid Build Coastguard Worker
160*495ae853SAndroid Build Coastguard Worker return NULL;
161*495ae853SAndroid Build Coastguard Worker }
162*495ae853SAndroid Build Coastguard Worker
imvcd_get_cur_ref_pic_list_mod_data(mvc_dec_ctxt_t * ps_mvcd_ctxt)163*495ae853SAndroid Build Coastguard Worker ref_pic_list_mod_data_t *imvcd_get_cur_ref_pic_list_mod_data(mvc_dec_ctxt_t *ps_mvcd_ctxt)
164*495ae853SAndroid Build Coastguard Worker {
165*495ae853SAndroid Build Coastguard Worker return &ps_mvcd_ctxt->as_ref_pic_list_mod_data[ps_mvcd_ctxt->u2_num_views_decoded];
166*495ae853SAndroid Build Coastguard Worker }
167*495ae853SAndroid Build Coastguard Worker
imvcd_get_valid_subset_sps(mvc_dec_ctxt_t * ps_mvcd_ctxt)168*495ae853SAndroid Build Coastguard Worker subset_sps_t *imvcd_get_valid_subset_sps(mvc_dec_ctxt_t *ps_mvcd_ctxt)
169*495ae853SAndroid Build Coastguard Worker {
170*495ae853SAndroid Build Coastguard Worker if(0 != ps_mvcd_ctxt->u2_num_views_decoded)
171*495ae853SAndroid Build Coastguard Worker {
172*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
173*495ae853SAndroid Build Coastguard Worker
174*495ae853SAndroid Build Coastguard Worker return ps_mvcd_ctxt
175*495ae853SAndroid Build Coastguard Worker ->aps_pps_id_to_subset_sps_map[ps_view_ctxt->ps_cur_pps->u1_pic_parameter_set_id];
176*495ae853SAndroid Build Coastguard Worker }
177*495ae853SAndroid Build Coastguard Worker else
178*495ae853SAndroid Build Coastguard Worker {
179*495ae853SAndroid Build Coastguard Worker WORD32 i;
180*495ae853SAndroid Build Coastguard Worker
181*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MAX_NUM_SEQ_PARAMS; i++)
182*495ae853SAndroid Build Coastguard Worker {
183*495ae853SAndroid Build Coastguard Worker if(ps_mvcd_ctxt->as_subset_sps[i].s_sps_data.u1_is_valid)
184*495ae853SAndroid Build Coastguard Worker {
185*495ae853SAndroid Build Coastguard Worker return &ps_mvcd_ctxt->as_subset_sps[i];
186*495ae853SAndroid Build Coastguard Worker }
187*495ae853SAndroid Build Coastguard Worker }
188*495ae853SAndroid Build Coastguard Worker
189*495ae853SAndroid Build Coastguard Worker return NULL;
190*495ae853SAndroid Build Coastguard Worker }
191*495ae853SAndroid Build Coastguard Worker }
192*495ae853SAndroid Build Coastguard Worker
imvcd_modulate_max_disp_seq(dec_struct_t * ps_view_ctxt)193*495ae853SAndroid Build Coastguard Worker void imvcd_modulate_max_disp_seq(dec_struct_t *ps_view_ctxt)
194*495ae853SAndroid Build Coastguard Worker {
195*495ae853SAndroid Build Coastguard Worker WORD64 i8_temp;
196*495ae853SAndroid Build Coastguard Worker
197*495ae853SAndroid Build Coastguard Worker i8_temp = ((WORD64) ps_view_ctxt->i4_prev_max_display_seq) +
198*495ae853SAndroid Build Coastguard Worker ((WORD64) ps_view_ctxt->i4_max_poc) +
199*495ae853SAndroid Build Coastguard Worker ((WORD64) ps_view_ctxt->u1_max_dec_frame_buffering) + 1ll;
200*495ae853SAndroid Build Coastguard Worker
201*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->i4_prev_max_display_seq = IS_OUT_OF_RANGE_S32(i8_temp) ? 0 : ((WORD32) i8_temp);
202*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->i4_max_poc = 0;
203*495ae853SAndroid Build Coastguard Worker }
204*495ae853SAndroid Build Coastguard Worker
imvcd_get_default_mv_pred(void)205*495ae853SAndroid Build Coastguard Worker mv_pred_t imvcd_get_default_mv_pred(void)
206*495ae853SAndroid Build Coastguard Worker {
207*495ae853SAndroid Build Coastguard Worker mv_pred_t s_mv_pred = {.i2_mv = {0},
208*495ae853SAndroid Build Coastguard Worker .i1_ref_frame = {OUT_OF_RANGE_REF, OUT_OF_RANGE_REF},
209*495ae853SAndroid Build Coastguard Worker .u1_col_ref_pic_idx = UINT8_MAX,
210*495ae853SAndroid Build Coastguard Worker .u1_pic_type = UINT8_MAX};
211*495ae853SAndroid Build Coastguard Worker
212*495ae853SAndroid Build Coastguard Worker return s_mv_pred;
213*495ae853SAndroid Build Coastguard Worker }
214*495ae853SAndroid Build Coastguard Worker
imvcd_get_max_num_ivp_refs(mvc_dec_ctxt_t * ps_mvcd_ctxt)215*495ae853SAndroid Build Coastguard Worker UWORD32 imvcd_get_max_num_ivp_refs(mvc_dec_ctxt_t *ps_mvcd_ctxt)
216*495ae853SAndroid Build Coastguard Worker {
217*495ae853SAndroid Build Coastguard Worker WORD32 i;
218*495ae853SAndroid Build Coastguard Worker
219*495ae853SAndroid Build Coastguard Worker subset_sps_t *ps_subset_sps = imvcd_get_valid_subset_sps(ps_mvcd_ctxt);
220*495ae853SAndroid Build Coastguard Worker
221*495ae853SAndroid Build Coastguard Worker UWORD32 u4_max_ivp_refs = 0;
222*495ae853SAndroid Build Coastguard Worker
223*495ae853SAndroid Build Coastguard Worker if(!ps_subset_sps)
224*495ae853SAndroid Build Coastguard Worker {
225*495ae853SAndroid Build Coastguard Worker return u4_max_ivp_refs;
226*495ae853SAndroid Build Coastguard Worker }
227*495ae853SAndroid Build Coastguard Worker
228*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_subset_sps->s_sps_mvc_ext.u2_num_views; i++)
229*495ae853SAndroid Build Coastguard Worker {
230*495ae853SAndroid Build Coastguard Worker u4_max_ivp_refs = MAX(
231*495ae853SAndroid Build Coastguard Worker u4_max_ivp_refs, ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[0][i].u1_num_refs +
232*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_anchor_ref_data[1][i].u1_num_refs);
233*495ae853SAndroid Build Coastguard Worker u4_max_ivp_refs =
234*495ae853SAndroid Build Coastguard Worker MAX(u4_max_ivp_refs,
235*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[0][i].u1_num_refs +
236*495ae853SAndroid Build Coastguard Worker ps_subset_sps->s_sps_mvc_ext.as_non_anchor_ref_data[1][i].u1_num_refs);
237*495ae853SAndroid Build Coastguard Worker }
238*495ae853SAndroid Build Coastguard Worker
239*495ae853SAndroid Build Coastguard Worker return u4_max_ivp_refs;
240*495ae853SAndroid Build Coastguard Worker }
241*495ae853SAndroid Build Coastguard Worker
imvcd_is_idr_au(mvc_dec_ctxt_t * ps_mvcd_ctxt)242*495ae853SAndroid Build Coastguard Worker bool imvcd_is_idr_au(mvc_dec_ctxt_t *ps_mvcd_ctxt)
243*495ae853SAndroid Build Coastguard Worker {
244*495ae853SAndroid Build Coastguard Worker return (ps_mvcd_ctxt->u2_num_views_decoded > 1)
245*495ae853SAndroid Build Coastguard Worker ? !ps_mvcd_ctxt->as_nalu_mvc_ext->u1_non_idr_flag
246*495ae853SAndroid Build Coastguard Worker : (ps_mvcd_ctxt->ae_nalu_id[0] == SLICE_IDR);
247*495ae853SAndroid Build Coastguard Worker }
248*495ae853SAndroid Build Coastguard Worker
imvcd_get_buf_pad_dims(bool b_is_chroma)249*495ae853SAndroid Build Coastguard Worker coordinates_t imvcd_get_buf_pad_dims(bool b_is_chroma)
250*495ae853SAndroid Build Coastguard Worker {
251*495ae853SAndroid Build Coastguard Worker coordinates_t s_dims;
252*495ae853SAndroid Build Coastguard Worker
253*495ae853SAndroid Build Coastguard Worker /* Vert pad is '4 * PAD_LEN_UV_V' to account for field Pics */
254*495ae853SAndroid Build Coastguard Worker if(b_is_chroma)
255*495ae853SAndroid Build Coastguard Worker {
256*495ae853SAndroid Build Coastguard Worker s_dims.i4_abscissa = (PAD_LEN_UV_H * 4);
257*495ae853SAndroid Build Coastguard Worker s_dims.i4_ordinate = (PAD_LEN_UV_V * 4);
258*495ae853SAndroid Build Coastguard Worker }
259*495ae853SAndroid Build Coastguard Worker else
260*495ae853SAndroid Build Coastguard Worker {
261*495ae853SAndroid Build Coastguard Worker s_dims.i4_abscissa = (PAD_LEN_Y_H * 2);
262*495ae853SAndroid Build Coastguard Worker s_dims.i4_ordinate = (PAD_LEN_Y_V * 4);
263*495ae853SAndroid Build Coastguard Worker }
264*495ae853SAndroid Build Coastguard Worker
265*495ae853SAndroid Build Coastguard Worker return s_dims;
266*495ae853SAndroid Build Coastguard Worker }
267*495ae853SAndroid Build Coastguard Worker
imvcd_get_ref_pic_pad_offset(WORD32 i4_stride,bool b_is_chroma)268*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_get_ref_pic_pad_offset(WORD32 i4_stride, bool b_is_chroma)
269*495ae853SAndroid Build Coastguard Worker {
270*495ae853SAndroid Build Coastguard Worker return !b_is_chroma ? (i4_stride * PAD_LEN_Y_V * 2 + PAD_LEN_Y_H)
271*495ae853SAndroid Build Coastguard Worker : (i4_stride * PAD_LEN_UV_V * 2 + PAD_LEN_UV_H * 2);
272*495ae853SAndroid Build Coastguard Worker }
273*495ae853SAndroid Build Coastguard Worker
imvcd_get_next_bits(dec_bit_stream_t * ps_bitstream)274*495ae853SAndroid Build Coastguard Worker UWORD32 imvcd_get_next_bits(dec_bit_stream_t *ps_bitstream)
275*495ae853SAndroid Build Coastguard Worker {
276*495ae853SAndroid Build Coastguard Worker UWORD32 u4_next_word;
277*495ae853SAndroid Build Coastguard Worker
278*495ae853SAndroid Build Coastguard Worker NEXTBITS(u4_next_word, ps_bitstream->u4_ofst, ps_bitstream->pu4_buffer, 32);
279*495ae853SAndroid Build Coastguard Worker
280*495ae853SAndroid Build Coastguard Worker return u4_next_word;
281*495ae853SAndroid Build Coastguard Worker }
282*495ae853SAndroid Build Coastguard Worker
imvcd_set_view_buf_id_to_buf_map(dec_struct_t * ps_view_ctxt)283*495ae853SAndroid Build Coastguard Worker void imvcd_set_view_buf_id_to_buf_map(dec_struct_t *ps_view_ctxt)
284*495ae853SAndroid Build Coastguard Worker {
285*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
286*495ae853SAndroid Build Coastguard Worker
287*495ae853SAndroid Build Coastguard Worker memset(ps_view_ctxt->apv_buf_id_pic_buf_map, 0, sizeof(ps_view_ctxt->apv_buf_id_pic_buf_map));
288*495ae853SAndroid Build Coastguard Worker
289*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 2; i++)
290*495ae853SAndroid Build Coastguard Worker {
291*495ae853SAndroid Build Coastguard Worker for(j = 0; j < ps_view_ctxt->ps_cur_slice->u1_num_ref_idx_lx_active[i]; j++)
292*495ae853SAndroid Build Coastguard Worker {
293*495ae853SAndroid Build Coastguard Worker ps_view_ctxt
294*495ae853SAndroid Build Coastguard Worker ->apv_buf_id_pic_buf_map[ps_view_ctxt->ps_ref_pic_buf_lx[i][j]->u1_pic_buf_id] =
295*495ae853SAndroid Build Coastguard Worker (void *) ps_view_ctxt->ps_ref_pic_buf_lx[i][j];
296*495ae853SAndroid Build Coastguard Worker }
297*495ae853SAndroid Build Coastguard Worker }
298*495ae853SAndroid Build Coastguard Worker }
299*495ae853SAndroid Build Coastguard Worker
imvcd_get_next_display_au_buf(mvc_dec_ctxt_t * ps_mvcd_ctxt)300*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T imvcd_get_next_display_au_buf(mvc_dec_ctxt_t *ps_mvcd_ctxt)
301*495ae853SAndroid Build Coastguard Worker {
302*495ae853SAndroid Build Coastguard Worker mvc_au_buffer_t *ps_au_buf;
303*495ae853SAndroid Build Coastguard Worker
304*495ae853SAndroid Build Coastguard Worker IV_API_CALL_STATUS_T e_retval = IV_FAIL;
305*495ae853SAndroid Build Coastguard Worker
306*495ae853SAndroid Build Coastguard Worker UWORD32 i;
307*495ae853SAndroid Build Coastguard Worker WORD32 i4_buf_id;
308*495ae853SAndroid Build Coastguard Worker
309*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
310*495ae853SAndroid Build Coastguard Worker
311*495ae853SAndroid Build Coastguard Worker ps_au_buf =
312*495ae853SAndroid Build Coastguard Worker (mvc_au_buffer_t *) ih264_disp_mgr_get(&ps_mvcd_ctxt->s_mvc_disp_buf_mgr, &i4_buf_id);
313*495ae853SAndroid Build Coastguard Worker
314*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->i4_display_index = DEFAULT_POC;
315*495ae853SAndroid Build Coastguard Worker
316*495ae853SAndroid Build Coastguard Worker if(ps_au_buf != NULL)
317*495ae853SAndroid Build Coastguard Worker {
318*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pv_disp_sei_params = &ps_au_buf->s_sei_pic;
319*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->i4_display_index = ps_au_buf->i4_poc;
320*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->u4_num_fld_in_frm += 2;
321*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->s_disp_op.u4_ts = ps_au_buf->u4_time_stamp;
322*495ae853SAndroid Build Coastguard Worker
323*495ae853SAndroid Build Coastguard Worker e_retval = IV_SUCCESS;
324*495ae853SAndroid Build Coastguard Worker }
325*495ae853SAndroid Build Coastguard Worker
326*495ae853SAndroid Build Coastguard Worker if(ps_au_buf)
327*495ae853SAndroid Build Coastguard Worker {
328*495ae853SAndroid Build Coastguard Worker for(i = 0; i < ps_mvcd_ctxt->u2_num_views; i++)
329*495ae853SAndroid Build Coastguard Worker {
330*495ae853SAndroid Build Coastguard Worker yuv_buf_props_t *ps_src = &ps_au_buf->as_view_buffers[i];
331*495ae853SAndroid Build Coastguard Worker yuv_buf_props_t *ps_dst = &ps_mvcd_ctxt->s_out_buffer.as_view_buf_props[i];
332*495ae853SAndroid Build Coastguard Worker
333*495ae853SAndroid Build Coastguard Worker WORD32 i4_y_src_stride = ps_src->as_component_bufs[Y].i4_data_stride;
334*495ae853SAndroid Build Coastguard Worker WORD32 i4_uv_src_stride = ps_src->as_component_bufs[UV].i4_data_stride;
335*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_y_src = (UWORD8 *) ps_src->as_component_bufs[Y].pv_data;
336*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_uv_src = (UWORD8 *) ps_src->as_component_bufs[UV].pv_data;
337*495ae853SAndroid Build Coastguard Worker
338*495ae853SAndroid Build Coastguard Worker pu1_y_src += (0 == i) ? ps_view_ctxt->u2_crop_offset_y
339*495ae853SAndroid Build Coastguard Worker : (ps_au_buf->as_disp_offsets[i].u2_left_offset +
340*495ae853SAndroid Build Coastguard Worker ps_au_buf->as_disp_offsets[i].u2_top_offset * i4_y_src_stride);
341*495ae853SAndroid Build Coastguard Worker pu1_uv_src +=
342*495ae853SAndroid Build Coastguard Worker (0 == i) ? ps_view_ctxt->u2_crop_offset_uv
343*495ae853SAndroid Build Coastguard Worker : (ps_au_buf->as_disp_offsets[i].u2_left_offset +
344*495ae853SAndroid Build Coastguard Worker (ps_au_buf->as_disp_offsets[i].u2_top_offset * i4_uv_src_stride) / 2);
345*495ae853SAndroid Build Coastguard Worker
346*495ae853SAndroid Build Coastguard Worker ps_dst->u2_width = ps_au_buf->u2_disp_width;
347*495ae853SAndroid Build Coastguard Worker ps_dst->u2_height = ps_au_buf->u2_disp_height;
348*495ae853SAndroid Build Coastguard Worker
349*495ae853SAndroid Build Coastguard Worker ASSERT(ps_dst->as_component_bufs[U].i4_data_stride ==
350*495ae853SAndroid Build Coastguard Worker ps_dst->as_component_bufs[V].i4_data_stride);
351*495ae853SAndroid Build Coastguard Worker
352*495ae853SAndroid Build Coastguard Worker ih264d_fmt_conv_420sp_to_420p(
353*495ae853SAndroid Build Coastguard Worker pu1_y_src, pu1_uv_src, (UWORD8 *) ps_dst->as_component_bufs[Y].pv_data,
354*495ae853SAndroid Build Coastguard Worker (UWORD8 *) ps_dst->as_component_bufs[U].pv_data,
355*495ae853SAndroid Build Coastguard Worker (UWORD8 *) ps_dst->as_component_bufs[V].pv_data, ps_dst->u2_width,
356*495ae853SAndroid Build Coastguard Worker ps_dst->u2_height, i4_y_src_stride, i4_uv_src_stride,
357*495ae853SAndroid Build Coastguard Worker ps_dst->as_component_bufs[Y].i4_data_stride,
358*495ae853SAndroid Build Coastguard Worker ps_dst->as_component_bufs[U].i4_data_stride, 1, 0);
359*495ae853SAndroid Build Coastguard Worker }
360*495ae853SAndroid Build Coastguard Worker
361*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_release(ps_mvcd_ctxt->s_mvc_au_buf_mgr.ps_buf_mgr_ctxt,
362*495ae853SAndroid Build Coastguard Worker ps_au_buf->i4_pic_buf_id, BUF_MGR_IO);
363*495ae853SAndroid Build Coastguard Worker }
364*495ae853SAndroid Build Coastguard Worker
365*495ae853SAndroid Build Coastguard Worker return e_retval;
366*495ae853SAndroid Build Coastguard Worker }
367*495ae853SAndroid Build Coastguard Worker
imvcd_get_num_mbs_in_level(UWORD8 u1_level_idc)368*495ae853SAndroid Build Coastguard Worker UWORD32 imvcd_get_num_mbs_in_level(UWORD8 u1_level_idc)
369*495ae853SAndroid Build Coastguard Worker {
370*495ae853SAndroid Build Coastguard Worker switch(u1_level_idc)
371*495ae853SAndroid Build Coastguard Worker {
372*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_1_0:
373*495ae853SAndroid Build Coastguard Worker {
374*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_10;
375*495ae853SAndroid Build Coastguard Worker }
376*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_1_1:
377*495ae853SAndroid Build Coastguard Worker {
378*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_11;
379*495ae853SAndroid Build Coastguard Worker }
380*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_1_2:
381*495ae853SAndroid Build Coastguard Worker {
382*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_12;
383*495ae853SAndroid Build Coastguard Worker }
384*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_1_3:
385*495ae853SAndroid Build Coastguard Worker {
386*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_13;
387*495ae853SAndroid Build Coastguard Worker }
388*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_2_0:
389*495ae853SAndroid Build Coastguard Worker {
390*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_20;
391*495ae853SAndroid Build Coastguard Worker }
392*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_2_1:
393*495ae853SAndroid Build Coastguard Worker {
394*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_21;
395*495ae853SAndroid Build Coastguard Worker }
396*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_2_2:
397*495ae853SAndroid Build Coastguard Worker {
398*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_22;
399*495ae853SAndroid Build Coastguard Worker }
400*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_3_0:
401*495ae853SAndroid Build Coastguard Worker {
402*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_30;
403*495ae853SAndroid Build Coastguard Worker }
404*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_3_1:
405*495ae853SAndroid Build Coastguard Worker {
406*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_31;
407*495ae853SAndroid Build Coastguard Worker }
408*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_3_2:
409*495ae853SAndroid Build Coastguard Worker {
410*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_32;
411*495ae853SAndroid Build Coastguard Worker }
412*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_4_0:
413*495ae853SAndroid Build Coastguard Worker {
414*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_40;
415*495ae853SAndroid Build Coastguard Worker }
416*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_4_1:
417*495ae853SAndroid Build Coastguard Worker {
418*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_41;
419*495ae853SAndroid Build Coastguard Worker }
420*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_4_2:
421*495ae853SAndroid Build Coastguard Worker {
422*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_42;
423*495ae853SAndroid Build Coastguard Worker }
424*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_5_0:
425*495ae853SAndroid Build Coastguard Worker {
426*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_50;
427*495ae853SAndroid Build Coastguard Worker }
428*495ae853SAndroid Build Coastguard Worker case H264_LEVEL_5_1:
429*495ae853SAndroid Build Coastguard Worker default:
430*495ae853SAndroid Build Coastguard Worker {
431*495ae853SAndroid Build Coastguard Worker return MAX_MBS_LEVEL_51;
432*495ae853SAndroid Build Coastguard Worker }
433*495ae853SAndroid Build Coastguard Worker }
434*495ae853SAndroid Build Coastguard Worker }
435*495ae853SAndroid Build Coastguard Worker
imvcd_free_dynamic_bufs(mvc_dec_ctxt_t * ps_mvcd_ctxt)436*495ae853SAndroid Build Coastguard Worker WORD16 imvcd_free_dynamic_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt)
437*495ae853SAndroid Build Coastguard Worker {
438*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
439*495ae853SAndroid Build Coastguard Worker
440*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_deblk_pic);
441*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->pu1_dec_mb_map);
442*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->pu1_recon_mb_map);
443*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->pu2_slice_num_map);
444*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_dec_slice_buf);
445*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_frm_mb_info);
446*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->pi2_coeff_data);
447*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_parse_mb_data);
448*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_parse_part_params);
449*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_deblk_top_mb);
450*495ae853SAndroid Build Coastguard Worker
451*495ae853SAndroid Build Coastguard Worker if(ps_view_ctxt->p_ctxt_inc_mb_map)
452*495ae853SAndroid Build Coastguard Worker {
453*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_ctxt_inc_mb_map -= 1;
454*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->p_ctxt_inc_mb_map);
455*495ae853SAndroid Build Coastguard Worker }
456*495ae853SAndroid Build Coastguard Worker
457*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_mv_p[0]);
458*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_mv_p[1]);
459*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_pred_pkd);
460*495ae853SAndroid Build Coastguard Worker {
461*495ae853SAndroid Build Coastguard Worker UWORD8 i;
462*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MV_SCRATCH_BUFS; i++)
463*495ae853SAndroid Build Coastguard Worker {
464*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_mv_top_p[i]);
465*495ae853SAndroid Build Coastguard Worker }
466*495ae853SAndroid Build Coastguard Worker }
467*495ae853SAndroid Build Coastguard Worker
468*495ae853SAndroid Build Coastguard Worker if(ps_view_ctxt->pu1_y_intra_pred_line)
469*495ae853SAndroid Build Coastguard Worker {
470*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_y_intra_pred_line -= MB_SIZE;
471*495ae853SAndroid Build Coastguard Worker }
472*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->pu1_y_intra_pred_line);
473*495ae853SAndroid Build Coastguard Worker
474*495ae853SAndroid Build Coastguard Worker if(ps_view_ctxt->pu1_u_intra_pred_line)
475*495ae853SAndroid Build Coastguard Worker {
476*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_u_intra_pred_line -= MB_SIZE;
477*495ae853SAndroid Build Coastguard Worker }
478*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->pu1_u_intra_pred_line);
479*495ae853SAndroid Build Coastguard Worker
480*495ae853SAndroid Build Coastguard Worker if(ps_view_ctxt->pu1_v_intra_pred_line)
481*495ae853SAndroid Build Coastguard Worker {
482*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_v_intra_pred_line -= MB_SIZE;
483*495ae853SAndroid Build Coastguard Worker }
484*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->pu1_v_intra_pred_line);
485*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_view_ctxt->ps_nbr_mb_row);
486*495ae853SAndroid Build Coastguard Worker
487*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt, ps_mvcd_ctxt->s_mvc_au_buf_mgr.pv_au_buf_base);
488*495ae853SAndroid Build Coastguard Worker PS_DEC_ALIGNED_FREE(ps_view_ctxt,
489*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->s_mvc_au_mv_pred_buf_mgr.pv_au_mv_pred_buf_base);
490*495ae853SAndroid Build Coastguard Worker
491*495ae853SAndroid Build Coastguard Worker return OK;
492*495ae853SAndroid Build Coastguard Worker }
493*495ae853SAndroid Build Coastguard Worker
imvcd_get_num_au_data_bufs(mvc_dec_ctxt_t * ps_mvcd_ctxt)494*495ae853SAndroid Build Coastguard Worker static UWORD32 imvcd_get_num_au_data_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt)
495*495ae853SAndroid Build Coastguard Worker {
496*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
497*495ae853SAndroid Build Coastguard Worker
498*495ae853SAndroid Build Coastguard Worker return ps_view_ctxt->u1_pic_bufs;
499*495ae853SAndroid Build Coastguard Worker }
500*495ae853SAndroid Build Coastguard Worker
imvcd_get_num_elements_in_mv_pred_buf(UWORD32 u4_view_wd,UWORD32 u4_view_ht)501*495ae853SAndroid Build Coastguard Worker static UWORD32 imvcd_get_num_elements_in_mv_pred_buf(UWORD32 u4_view_wd, UWORD32 u4_view_ht)
502*495ae853SAndroid Build Coastguard Worker {
503*495ae853SAndroid Build Coastguard Worker return (u4_view_wd * (u4_view_ht + PAD_MV_BANK_ROW)) / MB_SIZE;
504*495ae853SAndroid Build Coastguard Worker }
505*495ae853SAndroid Build Coastguard Worker
imvcd_get_mv_pred_buf_padding_length(UWORD32 u4_view_wd)506*495ae853SAndroid Build Coastguard Worker static UWORD32 imvcd_get_mv_pred_buf_padding_length(UWORD32 u4_view_wd)
507*495ae853SAndroid Build Coastguard Worker {
508*495ae853SAndroid Build Coastguard Worker return (u4_view_wd * OFFSET_MV_BANK_ROW) / MB_SIZE;
509*495ae853SAndroid Build Coastguard Worker }
510*495ae853SAndroid Build Coastguard Worker
imvcd_get_au_mv_pred_buf_size(mvc_dec_ctxt_t * ps_mvcd_ctxt)511*495ae853SAndroid Build Coastguard Worker static UWORD32 imvcd_get_au_mv_pred_buf_size(mvc_dec_ctxt_t *ps_mvcd_ctxt)
512*495ae853SAndroid Build Coastguard Worker {
513*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
514*495ae853SAndroid Build Coastguard Worker
515*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_bufs = imvcd_get_num_au_data_bufs(ps_mvcd_ctxt);
516*495ae853SAndroid Build Coastguard Worker
517*495ae853SAndroid Build Coastguard Worker UWORD32 u4_size = 0;
518*495ae853SAndroid Build Coastguard Worker
519*495ae853SAndroid Build Coastguard Worker u4_size += sizeof(mvc_au_mv_pred_t);
520*495ae853SAndroid Build Coastguard Worker
521*495ae853SAndroid Build Coastguard Worker u4_size +=
522*495ae853SAndroid Build Coastguard Worker imvcd_get_num_elements_in_mv_pred_buf(ps_view_ctxt->u2_pic_wd, ps_view_ctxt->u2_pic_ht) *
523*495ae853SAndroid Build Coastguard Worker (sizeof(mv_pred_t) + sizeof(UWORD8));
524*495ae853SAndroid Build Coastguard Worker
525*495ae853SAndroid Build Coastguard Worker u4_size *= u4_num_bufs;
526*495ae853SAndroid Build Coastguard Worker u4_size *= ps_mvcd_ctxt->u2_num_views;
527*495ae853SAndroid Build Coastguard Worker
528*495ae853SAndroid Build Coastguard Worker return u4_size;
529*495ae853SAndroid Build Coastguard Worker }
530*495ae853SAndroid Build Coastguard Worker
imvcd_get_au_buf_size(mvc_dec_ctxt_t * ps_mvcd_ctxt)531*495ae853SAndroid Build Coastguard Worker static UWORD32 imvcd_get_au_buf_size(mvc_dec_ctxt_t *ps_mvcd_ctxt)
532*495ae853SAndroid Build Coastguard Worker {
533*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
534*495ae853SAndroid Build Coastguard Worker
535*495ae853SAndroid Build Coastguard Worker UWORD32 u4_size = 0;
536*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_bufs = imvcd_get_num_au_data_bufs(ps_mvcd_ctxt);
537*495ae853SAndroid Build Coastguard Worker
538*495ae853SAndroid Build Coastguard Worker u4_size += sizeof(mvc_au_buffer_t);
539*495ae853SAndroid Build Coastguard Worker
540*495ae853SAndroid Build Coastguard Worker /* All rvalues below incorporate both padding and pic dimensions */
541*495ae853SAndroid Build Coastguard Worker u4_size += ALIGN64(ps_view_ctxt->u2_frm_wd_y * ps_view_ctxt->u2_frm_ht_y) * sizeof(UWORD8);
542*495ae853SAndroid Build Coastguard Worker u4_size += ALIGN64(ps_view_ctxt->u2_frm_wd_uv * ps_view_ctxt->u2_frm_ht_uv) * sizeof(UWORD8);
543*495ae853SAndroid Build Coastguard Worker
544*495ae853SAndroid Build Coastguard Worker u4_size *= ps_mvcd_ctxt->u2_num_views;
545*495ae853SAndroid Build Coastguard Worker u4_size *= u4_num_bufs;
546*495ae853SAndroid Build Coastguard Worker
547*495ae853SAndroid Build Coastguard Worker return u4_size;
548*495ae853SAndroid Build Coastguard Worker }
549*495ae853SAndroid Build Coastguard Worker
imvcd_init_au_buffers(mvc_dec_ctxt_t * ps_mvcd_ctxt)550*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_init_au_buffers(mvc_dec_ctxt_t *ps_mvcd_ctxt)
551*495ae853SAndroid Build Coastguard Worker {
552*495ae853SAndroid Build Coastguard Worker UWORD32 i, j;
553*495ae853SAndroid Build Coastguard Worker UWORD32 u4_luma_size, u4_chroma_size;
554*495ae853SAndroid Build Coastguard Worker WORD32 i4_error_code;
555*495ae853SAndroid Build Coastguard Worker
556*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
557*495ae853SAndroid Build Coastguard Worker
558*495ae853SAndroid Build Coastguard Worker WORD64 i8_alloc_mem_size = imvcd_get_au_buf_size(ps_mvcd_ctxt);
559*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf = (UWORD8 *) ps_mvcd_ctxt->s_mvc_au_buf_mgr.pv_au_buf_base;
560*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_bufs = imvcd_get_num_au_data_bufs(ps_mvcd_ctxt);
561*495ae853SAndroid Build Coastguard Worker
562*495ae853SAndroid Build Coastguard Worker if(ps_mvcd_ctxt->u2_num_views > MAX_NUM_VIEWS)
563*495ae853SAndroid Build Coastguard Worker {
564*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->i4_error_code = ERROR_BUF_MGR;
565*495ae853SAndroid Build Coastguard Worker return ERROR_BUF_MGR;
566*495ae853SAndroid Build Coastguard Worker }
567*495ae853SAndroid Build Coastguard Worker
568*495ae853SAndroid Build Coastguard Worker u4_luma_size = ps_view_ctxt->u2_frm_wd_y * ps_view_ctxt->u2_frm_ht_y;
569*495ae853SAndroid Build Coastguard Worker u4_chroma_size = ps_view_ctxt->u2_frm_wd_uv * ps_view_ctxt->u2_frm_ht_uv;
570*495ae853SAndroid Build Coastguard Worker
571*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u4_num_bufs; i++)
572*495ae853SAndroid Build Coastguard Worker {
573*495ae853SAndroid Build Coastguard Worker WORD32 i4_stride;
574*495ae853SAndroid Build Coastguard Worker
575*495ae853SAndroid Build Coastguard Worker mvc_au_buffer_t *ps_au_buf = (mvc_au_buffer_t *) pu1_buf;
576*495ae853SAndroid Build Coastguard Worker
577*495ae853SAndroid Build Coastguard Worker pu1_buf += sizeof(ps_au_buf[0]);
578*495ae853SAndroid Build Coastguard Worker
579*495ae853SAndroid Build Coastguard Worker for(j = 0; j < ps_mvcd_ctxt->u2_num_views; j++)
580*495ae853SAndroid Build Coastguard Worker {
581*495ae853SAndroid Build Coastguard Worker i4_stride = ps_view_ctxt->u2_frm_wd_y;
582*495ae853SAndroid Build Coastguard Worker ps_au_buf->as_view_buffers[j].as_component_bufs[Y].i4_data_stride = i4_stride;
583*495ae853SAndroid Build Coastguard Worker ps_au_buf->as_view_buffers[j].as_component_bufs[Y].pv_data =
584*495ae853SAndroid Build Coastguard Worker pu1_buf + imvcd_get_ref_pic_pad_offset(i4_stride, false);
585*495ae853SAndroid Build Coastguard Worker pu1_buf += ALIGN64(u4_luma_size) * sizeof(pu1_buf[0]);
586*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= ALIGN64(u4_luma_size) * sizeof(pu1_buf[0]);
587*495ae853SAndroid Build Coastguard Worker
588*495ae853SAndroid Build Coastguard Worker i4_stride = ps_view_ctxt->u2_frm_wd_uv;
589*495ae853SAndroid Build Coastguard Worker ps_au_buf->as_view_buffers[j].as_component_bufs[UV].i4_data_stride = i4_stride;
590*495ae853SAndroid Build Coastguard Worker ps_au_buf->as_view_buffers[j].as_component_bufs[UV].pv_data =
591*495ae853SAndroid Build Coastguard Worker pu1_buf + imvcd_get_ref_pic_pad_offset(i4_stride, true);
592*495ae853SAndroid Build Coastguard Worker pu1_buf += ALIGN64(u4_chroma_size) * sizeof(pu1_buf[0]);
593*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= ALIGN64(u4_chroma_size) * sizeof(pu1_buf[0]);
594*495ae853SAndroid Build Coastguard Worker
595*495ae853SAndroid Build Coastguard Worker ps_au_buf->as_view_buffers[j].as_component_bufs[V].pv_data = NULL;
596*495ae853SAndroid Build Coastguard Worker
597*495ae853SAndroid Build Coastguard Worker ps_au_buf->as_view_buffers[j].u2_height =
598*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_cur_sps->u2_frm_ht_in_mbs * MB_SIZE;
599*495ae853SAndroid Build Coastguard Worker ps_au_buf->as_view_buffers[j].u2_width =
600*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_cur_sps->u2_frm_wd_in_mbs * MB_SIZE;
601*495ae853SAndroid Build Coastguard Worker ps_au_buf->as_view_buffers[j].u1_bit_depth = 8;
602*495ae853SAndroid Build Coastguard Worker
603*495ae853SAndroid Build Coastguard Worker ASSERT(i8_alloc_mem_size >= 0);
604*495ae853SAndroid Build Coastguard Worker }
605*495ae853SAndroid Build Coastguard Worker
606*495ae853SAndroid Build Coastguard Worker ps_au_buf->i4_pic_buf_id = i;
607*495ae853SAndroid Build Coastguard Worker
608*495ae853SAndroid Build Coastguard Worker i4_error_code =
609*495ae853SAndroid Build Coastguard Worker ih264_buf_mgr_add(ps_mvcd_ctxt->s_mvc_au_buf_mgr.ps_buf_mgr_ctxt, ps_au_buf, i);
610*495ae853SAndroid Build Coastguard Worker
611*495ae853SAndroid Build Coastguard Worker if(0 != i4_error_code)
612*495ae853SAndroid Build Coastguard Worker {
613*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->i4_error_code = ERROR_BUF_MGR;
614*495ae853SAndroid Build Coastguard Worker
615*495ae853SAndroid Build Coastguard Worker return ERROR_BUF_MGR;
616*495ae853SAndroid Build Coastguard Worker }
617*495ae853SAndroid Build Coastguard Worker
618*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->s_mvc_au_buf_mgr.aps_buf_id_to_au_buf_map[i] = ps_au_buf;
619*495ae853SAndroid Build Coastguard Worker }
620*495ae853SAndroid Build Coastguard Worker
621*495ae853SAndroid Build Coastguard Worker return OK;
622*495ae853SAndroid Build Coastguard Worker }
623*495ae853SAndroid Build Coastguard Worker
imvcd_init_au_mv_pred_bufs(mvc_dec_ctxt_t * ps_mvcd_ctxt)624*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_init_au_mv_pred_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt)
625*495ae853SAndroid Build Coastguard Worker {
626*495ae853SAndroid Build Coastguard Worker UWORD32 i, j;
627*495ae853SAndroid Build Coastguard Worker WORD32 buf_ret;
628*495ae853SAndroid Build Coastguard Worker
629*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
630*495ae853SAndroid Build Coastguard Worker
631*495ae853SAndroid Build Coastguard Worker UWORD32 u4_width = ps_view_ctxt->u2_pic_wd;
632*495ae853SAndroid Build Coastguard Worker UWORD32 u4_height = ps_view_ctxt->u2_pic_ht;
633*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mode_info_buf_size = imvcd_get_num_elements_in_mv_pred_buf(u4_width, u4_height);
634*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf = ps_mvcd_ctxt->s_mvc_au_mv_pred_buf_mgr.pv_au_mv_pred_buf_base;
635*495ae853SAndroid Build Coastguard Worker WORD64 i8_alloc_mem_size = imvcd_get_au_mv_pred_buf_size(ps_mvcd_ctxt);
636*495ae853SAndroid Build Coastguard Worker UWORD32 u4_num_bufs = imvcd_get_num_au_data_bufs(ps_mvcd_ctxt);
637*495ae853SAndroid Build Coastguard Worker
638*495ae853SAndroid Build Coastguard Worker if(ps_mvcd_ctxt->u2_num_views > MAX_NUM_VIEWS)
639*495ae853SAndroid Build Coastguard Worker {
640*495ae853SAndroid Build Coastguard Worker return ERROR_BUF_MGR;
641*495ae853SAndroid Build Coastguard Worker }
642*495ae853SAndroid Build Coastguard Worker
643*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u4_num_bufs; i++)
644*495ae853SAndroid Build Coastguard Worker {
645*495ae853SAndroid Build Coastguard Worker mvc_au_mv_pred_t *ps_au_mv_data = (mvc_au_mv_pred_t *) pu1_buf;
646*495ae853SAndroid Build Coastguard Worker
647*495ae853SAndroid Build Coastguard Worker pu1_buf += sizeof(ps_au_mv_data[0]);
648*495ae853SAndroid Build Coastguard Worker
649*495ae853SAndroid Build Coastguard Worker buf_ret = ih264_buf_mgr_add(ps_mvcd_ctxt->s_mvc_au_mv_pred_buf_mgr.ps_buf_mgr_ctxt,
650*495ae853SAndroid Build Coastguard Worker ps_au_mv_data, i);
651*495ae853SAndroid Build Coastguard Worker
652*495ae853SAndroid Build Coastguard Worker if(0 != buf_ret)
653*495ae853SAndroid Build Coastguard Worker {
654*495ae853SAndroid Build Coastguard Worker return ERROR_BUF_MGR;
655*495ae853SAndroid Build Coastguard Worker }
656*495ae853SAndroid Build Coastguard Worker
657*495ae853SAndroid Build Coastguard Worker for(j = 0; j < ps_mvcd_ctxt->u2_num_views; j++)
658*495ae853SAndroid Build Coastguard Worker {
659*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mv_buf_size = u4_mode_info_buf_size * sizeof(ps_au_mv_data->aps_mvs[j][0]);
660*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mode_desc_buf_size =
661*495ae853SAndroid Build Coastguard Worker u4_mode_info_buf_size * sizeof(ps_au_mv_data->apu1_mode_descriptors[j][0]);
662*495ae853SAndroid Build Coastguard Worker
663*495ae853SAndroid Build Coastguard Worker ps_au_mv_data->aps_mvs[j] = (mv_pred_t *) pu1_buf;
664*495ae853SAndroid Build Coastguard Worker ps_au_mv_data->aps_mvs[j] += imvcd_get_mv_pred_buf_padding_length(u4_width);
665*495ae853SAndroid Build Coastguard Worker pu1_buf += u4_mv_buf_size;
666*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= u4_mv_buf_size;
667*495ae853SAndroid Build Coastguard Worker
668*495ae853SAndroid Build Coastguard Worker ps_au_mv_data->apu1_mode_descriptors[j] = pu1_buf;
669*495ae853SAndroid Build Coastguard Worker pu1_buf += u4_mode_desc_buf_size;
670*495ae853SAndroid Build Coastguard Worker i8_alloc_mem_size -= u4_mode_desc_buf_size;
671*495ae853SAndroid Build Coastguard Worker
672*495ae853SAndroid Build Coastguard Worker memset(ps_au_mv_data->aps_mvs[j] - imvcd_get_mv_pred_buf_padding_length(u4_width), 0,
673*495ae853SAndroid Build Coastguard Worker u4_mv_buf_size);
674*495ae853SAndroid Build Coastguard Worker
675*495ae853SAndroid Build Coastguard Worker memset(ps_au_mv_data->apu1_mode_descriptors[j], 0, u4_mode_desc_buf_size);
676*495ae853SAndroid Build Coastguard Worker
677*495ae853SAndroid Build Coastguard Worker ASSERT(i8_alloc_mem_size >= 0);
678*495ae853SAndroid Build Coastguard Worker }
679*495ae853SAndroid Build Coastguard Worker }
680*495ae853SAndroid Build Coastguard Worker
681*495ae853SAndroid Build Coastguard Worker return OK;
682*495ae853SAndroid Build Coastguard Worker }
683*495ae853SAndroid Build Coastguard Worker
imvcd_allocate_dynamic_bufs(mvc_dec_ctxt_t * ps_mvcd_ctxt)684*495ae853SAndroid Build Coastguard Worker WORD32 imvcd_allocate_dynamic_bufs(mvc_dec_ctxt_t *ps_mvcd_ctxt)
685*495ae853SAndroid Build Coastguard Worker {
686*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
687*495ae853SAndroid Build Coastguard Worker dec_seq_params_t *ps_sps = ps_view_ctxt->ps_cur_sps;
688*495ae853SAndroid Build Coastguard Worker
689*495ae853SAndroid Build Coastguard Worker UWORD32 u4_total_mbs = ps_sps->u2_total_num_of_mbs;
690*495ae853SAndroid Build Coastguard Worker UWORD32 u4_wd_mbs = ps_view_ctxt->u2_frm_wd_in_mbs;
691*495ae853SAndroid Build Coastguard Worker UWORD32 u4_ht_mbs = ps_view_ctxt->u2_frm_ht_in_mbs;
692*495ae853SAndroid Build Coastguard Worker const WORD32 i4_default_alignment = 128;
693*495ae853SAndroid Build Coastguard Worker void *pv_mem_ctxt = ps_view_ctxt->pv_mem_ctxt;
694*495ae853SAndroid Build Coastguard Worker
695*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_buf;
696*495ae853SAndroid Build Coastguard Worker WORD32 i4_mem_size;
697*495ae853SAndroid Build Coastguard Worker WORD32 i;
698*495ae853SAndroid Build Coastguard Worker void *pv_buf;
699*495ae853SAndroid Build Coastguard Worker WORD32 i4_num_entries;
700*495ae853SAndroid Build Coastguard Worker
701*495ae853SAndroid Build Coastguard Worker if(ps_mvcd_ctxt->u2_num_views > MAX_NUM_VIEWS)
702*495ae853SAndroid Build Coastguard Worker {
703*495ae853SAndroid Build Coastguard Worker return IV_FAIL;
704*495ae853SAndroid Build Coastguard Worker }
705*495ae853SAndroid Build Coastguard Worker
706*495ae853SAndroid Build Coastguard Worker i4_mem_size = u4_total_mbs * sizeof(ps_view_ctxt->pu1_dec_mb_map[0]);
707*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
708*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
709*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
710*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_dec_mb_map = pv_buf;
711*495ae853SAndroid Build Coastguard Worker
712*495ae853SAndroid Build Coastguard Worker i4_mem_size = u4_total_mbs * sizeof(ps_view_ctxt->pu1_recon_mb_map[0]);
713*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
714*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
715*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
716*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_recon_mb_map = pv_buf;
717*495ae853SAndroid Build Coastguard Worker
718*495ae853SAndroid Build Coastguard Worker i4_mem_size = u4_total_mbs * sizeof(ps_view_ctxt->pu2_slice_num_map[0]);
719*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
720*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
721*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
722*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu2_slice_num_map = pv_buf;
723*495ae853SAndroid Build Coastguard Worker
724*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_parse_cur_slice = ps_view_ctxt->ps_dec_slice_buf;
725*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_decode_cur_slice = ps_view_ctxt->ps_dec_slice_buf;
726*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_computebs_cur_slice = ps_view_ctxt->ps_dec_slice_buf;
727*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_pred_start = ps_view_ctxt->ps_pred;
728*495ae853SAndroid Build Coastguard Worker
729*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(parse_pmbarams_t) * (ps_view_ctxt->u1_recon_mb_grp);
730*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
731*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
732*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
733*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_parse_mb_data = pv_buf;
734*495ae853SAndroid Build Coastguard Worker
735*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(parse_part_params_t) * ((ps_view_ctxt->u1_recon_mb_grp) << 4);
736*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
737*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
738*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
739*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_parse_part_params = pv_buf;
740*495ae853SAndroid Build Coastguard Worker
741*495ae853SAndroid Build Coastguard Worker i4_mem_size = (u4_wd_mbs * sizeof(deblkmb_neighbour_t));
742*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
743*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
744*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
745*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_deblk_top_mb = pv_buf;
746*495ae853SAndroid Build Coastguard Worker
747*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(ctxt_inc_mb_info_t) * (u4_wd_mbs + 2);
748*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
749*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
750*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
751*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_ctxt_inc_mb_map = pv_buf;
752*495ae853SAndroid Build Coastguard Worker /* 0th entry of CtxtIncMbMap will be always be containing default values
753*495ae853SAndroid Build Coastguard Worker for CABAC context representing MB not available */
754*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_ctxt_inc_mb_map += 1;
755*495ae853SAndroid Build Coastguard Worker
756*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(mv_pred_t) * ps_view_ctxt->u1_recon_mb_grp * 16;
757*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
758*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
759*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
760*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_mv_p[0] = pv_buf;
761*495ae853SAndroid Build Coastguard Worker
762*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(mv_pred_t) * ps_view_ctxt->u1_recon_mb_grp * 16;
763*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
764*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
765*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
766*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_mv_p[1] = pv_buf;
767*495ae853SAndroid Build Coastguard Worker
768*495ae853SAndroid Build Coastguard Worker for(i = 0; i < MV_SCRATCH_BUFS; i++)
769*495ae853SAndroid Build Coastguard Worker {
770*495ae853SAndroid Build Coastguard Worker i4_mem_size = (sizeof(mv_pred_t) * ps_view_ctxt->u1_recon_mb_grp * 4);
771*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
772*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
773*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
774*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_mv_top_p[i] = pv_buf;
775*495ae853SAndroid Build Coastguard Worker }
776*495ae853SAndroid Build Coastguard Worker
777*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(UWORD8) * ((u4_wd_mbs + 2) * MB_SIZE) * 2;
778*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
779*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
780*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_y_intra_pred_line = pv_buf;
781*495ae853SAndroid Build Coastguard Worker memset(ps_view_ctxt->pu1_y_intra_pred_line, 0, i4_mem_size);
782*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_y_intra_pred_line += MB_SIZE;
783*495ae853SAndroid Build Coastguard Worker
784*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(UWORD8) * ((u4_wd_mbs + 2) * MB_SIZE) * 2;
785*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
786*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
787*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_u_intra_pred_line = pv_buf;
788*495ae853SAndroid Build Coastguard Worker memset(ps_view_ctxt->pu1_u_intra_pred_line, 0, i4_mem_size);
789*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_u_intra_pred_line += MB_SIZE;
790*495ae853SAndroid Build Coastguard Worker
791*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(UWORD8) * ((u4_wd_mbs + 2) * MB_SIZE) * 2;
792*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
793*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
794*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_v_intra_pred_line = pv_buf;
795*495ae853SAndroid Build Coastguard Worker memset(ps_view_ctxt->pu1_v_intra_pred_line, 0, i4_mem_size);
796*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pu1_v_intra_pred_line += MB_SIZE;
797*495ae853SAndroid Build Coastguard Worker
798*495ae853SAndroid Build Coastguard Worker if(ps_view_ctxt->u1_separate_parse)
799*495ae853SAndroid Build Coastguard Worker {
800*495ae853SAndroid Build Coastguard Worker /* Needs one extra row of info, to hold top row data */
801*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(mb_neigbour_params_t) * 2 * ((u4_wd_mbs + 2) * (u4_ht_mbs + 1));
802*495ae853SAndroid Build Coastguard Worker }
803*495ae853SAndroid Build Coastguard Worker else
804*495ae853SAndroid Build Coastguard Worker {
805*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(mb_neigbour_params_t) * 2 * (u4_wd_mbs + 2);
806*495ae853SAndroid Build Coastguard Worker }
807*495ae853SAndroid Build Coastguard Worker
808*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
809*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
810*495ae853SAndroid Build Coastguard Worker
811*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_nbr_mb_row = pv_buf;
812*495ae853SAndroid Build Coastguard Worker memset(ps_view_ctxt->ps_nbr_mb_row, 0, i4_mem_size);
813*495ae853SAndroid Build Coastguard Worker
814*495ae853SAndroid Build Coastguard Worker i4_mem_size = (u4_total_mbs + u4_wd_mbs) * sizeof(deblk_mb_t);
815*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
816*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
817*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_deblk_pic = pv_buf;
818*495ae853SAndroid Build Coastguard Worker memset(ps_view_ctxt->ps_deblk_pic, 0, i4_mem_size);
819*495ae853SAndroid Build Coastguard Worker
820*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(dec_mb_info_t) * u4_total_mbs;
821*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
822*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
823*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_frm_mb_info = pv_buf;
824*495ae853SAndroid Build Coastguard Worker memset(ps_view_ctxt->ps_frm_mb_info, 0, i4_mem_size);
825*495ae853SAndroid Build Coastguard Worker
826*495ae853SAndroid Build Coastguard Worker if((1 >= ps_view_ctxt->ps_cur_sps->u1_num_ref_frames) && (0 == ps_view_ctxt->i4_display_delay))
827*495ae853SAndroid Build Coastguard Worker {
828*495ae853SAndroid Build Coastguard Worker i4_num_entries = 1;
829*495ae853SAndroid Build Coastguard Worker }
830*495ae853SAndroid Build Coastguard Worker else
831*495ae853SAndroid Build Coastguard Worker {
832*495ae853SAndroid Build Coastguard Worker i4_num_entries = MAX_FRAMES;
833*495ae853SAndroid Build Coastguard Worker }
834*495ae853SAndroid Build Coastguard Worker
835*495ae853SAndroid Build Coastguard Worker i4_num_entries = (2 * i4_num_entries) + 1;
836*495ae853SAndroid Build Coastguard Worker i4_num_entries *= 2;
837*495ae853SAndroid Build Coastguard Worker
838*495ae853SAndroid Build Coastguard Worker i4_mem_size = i4_num_entries * sizeof(void *);
839*495ae853SAndroid Build Coastguard Worker i4_mem_size += PAD_MAP_IDX_POC * sizeof(void *);
840*495ae853SAndroid Build Coastguard Worker i4_mem_size *= u4_total_mbs;
841*495ae853SAndroid Build Coastguard Worker i4_mem_size += sizeof(dec_slice_struct_t) * u4_total_mbs;
842*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
843*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
844*495ae853SAndroid Build Coastguard Worker
845*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_dec_slice_buf = pv_buf;
846*495ae853SAndroid Build Coastguard Worker memset(ps_view_ctxt->ps_dec_slice_buf, 0, i4_mem_size);
847*495ae853SAndroid Build Coastguard Worker pu1_buf = (UWORD8 *) ps_view_ctxt->ps_dec_slice_buf;
848*495ae853SAndroid Build Coastguard Worker pu1_buf += sizeof(dec_slice_struct_t) * u4_total_mbs;
849*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pv_map_ref_idx_to_poc_buf = (void *) pu1_buf;
850*495ae853SAndroid Build Coastguard Worker
851*495ae853SAndroid Build Coastguard Worker /* Allocate memory for packed pred info */
852*495ae853SAndroid Build Coastguard Worker i4_num_entries = u4_total_mbs;
853*495ae853SAndroid Build Coastguard Worker i4_num_entries *= 16 * 2;
854*495ae853SAndroid Build Coastguard Worker
855*495ae853SAndroid Build Coastguard Worker i4_mem_size = sizeof(pred_info_pkd_t) * i4_num_entries;
856*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
857*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
858*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
859*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ps_pred_pkd = pv_buf;
860*495ae853SAndroid Build Coastguard Worker
861*495ae853SAndroid Build Coastguard Worker /* Allocate memory for coeff data */
862*495ae853SAndroid Build Coastguard Worker i4_mem_size = MB_LUM_SIZE * sizeof(WORD16);
863*495ae853SAndroid Build Coastguard Worker /*For I16x16 MBs, 16 4x4 AC coeffs and 1 4x4 DC coeff TU blocks will be sent
864*495ae853SAndroid Build Coastguard Worker For all MBs along with 8 4x4 AC coeffs 2 2x2 DC coeff TU blocks will be sent
865*495ae853SAndroid Build Coastguard Worker So use 17 4x4 TU blocks for luma and 9 4x4 TU blocks for chroma */
866*495ae853SAndroid Build Coastguard Worker i4_mem_size += u4_total_mbs *
867*495ae853SAndroid Build Coastguard Worker (MAX(17 * sizeof(tu_sblk4x4_coeff_data_t), 4 * sizeof(tu_blk8x8_coeff_data_t)) +
868*495ae853SAndroid Build Coastguard Worker 9 * sizeof(tu_sblk4x4_coeff_data_t));
869*495ae853SAndroid Build Coastguard Worker // 32 bytes for each mb to store u1_prev_intra4x4_pred_mode and
870*495ae853SAndroid Build Coastguard Worker // u1_rem_intra4x4_pred_mode data
871*495ae853SAndroid Build Coastguard Worker i4_mem_size += u4_total_mbs * 32;
872*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
873*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
874*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
875*495ae853SAndroid Build Coastguard Worker
876*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pi2_coeff_data = pv_buf;
877*495ae853SAndroid Build Coastguard Worker
878*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->pv_pic_tu_coeff_data = (void *) (ps_view_ctxt->pi2_coeff_data + MB_LUM_SIZE);
879*495ae853SAndroid Build Coastguard Worker
880*495ae853SAndroid Build Coastguard Worker i4_mem_size = imvcd_get_au_mv_pred_buf_size(ps_mvcd_ctxt);
881*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
882*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
883*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
884*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->s_mvc_au_mv_pred_buf_mgr.pv_au_mv_pred_buf_base = pv_buf;
885*495ae853SAndroid Build Coastguard Worker
886*495ae853SAndroid Build Coastguard Worker i4_mem_size = imvcd_get_au_buf_size(ps_mvcd_ctxt);
887*495ae853SAndroid Build Coastguard Worker pv_buf = ps_view_ctxt->pf_aligned_alloc(pv_mem_ctxt, i4_default_alignment, i4_mem_size);
888*495ae853SAndroid Build Coastguard Worker RETURN_IF((NULL == pv_buf), IV_FAIL);
889*495ae853SAndroid Build Coastguard Worker memset(pv_buf, 0, i4_mem_size);
890*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->s_mvc_au_buf_mgr.pv_au_buf_base = pv_buf;
891*495ae853SAndroid Build Coastguard Worker
892*495ae853SAndroid Build Coastguard Worker /***************************************************************************/
893*495ae853SAndroid Build Coastguard Worker /*Initialize cabac context pointers for every SE that has fixed contextIdx */
894*495ae853SAndroid Build Coastguard Worker /***************************************************************************/
895*495ae853SAndroid Build Coastguard Worker {
896*495ae853SAndroid Build Coastguard Worker bin_ctxt_model_t *const p_cabac_ctxt_table_t = ps_view_ctxt->p_cabac_ctxt_table_t;
897*495ae853SAndroid Build Coastguard Worker bin_ctxt_model_t **p_coeff_abs_level_minus1_t = ps_view_ctxt->p_coeff_abs_level_minus1_t;
898*495ae853SAndroid Build Coastguard Worker bin_ctxt_model_t **p_cbf_t = ps_view_ctxt->p_cbf_t;
899*495ae853SAndroid Build Coastguard Worker
900*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_mb_field_dec_flag_t = p_cabac_ctxt_table_t + MB_FIELD_DECODING_FLAG;
901*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_prev_intra4x4_pred_mode_flag_t =
902*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + PREV_INTRA4X4_PRED_MODE_FLAG;
903*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_rem_intra4x4_pred_mode_t = p_cabac_ctxt_table_t + REM_INTRA4X4_PRED_MODE;
904*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_intra_chroma_pred_mode_t = p_cabac_ctxt_table_t + INTRA_CHROMA_PRED_MODE;
905*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_mb_qp_delta_t = p_cabac_ctxt_table_t + MB_QP_DELTA;
906*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_ref_idx_t = p_cabac_ctxt_table_t + REF_IDX;
907*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_mvd_x_t = p_cabac_ctxt_table_t + MVD_X;
908*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_mvd_y_t = p_cabac_ctxt_table_t + MVD_Y;
909*495ae853SAndroid Build Coastguard Worker p_cbf_t[0] = p_cabac_ctxt_table_t + CBF + 0;
910*495ae853SAndroid Build Coastguard Worker p_cbf_t[1] = p_cabac_ctxt_table_t + CBF + 4;
911*495ae853SAndroid Build Coastguard Worker p_cbf_t[2] = p_cabac_ctxt_table_t + CBF + 8;
912*495ae853SAndroid Build Coastguard Worker p_cbf_t[3] = p_cabac_ctxt_table_t + CBF + 12;
913*495ae853SAndroid Build Coastguard Worker p_cbf_t[4] = p_cabac_ctxt_table_t + CBF + 16;
914*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_cbp_luma_t = p_cabac_ctxt_table_t + CBP_LUMA;
915*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->p_cbp_chroma_t = p_cabac_ctxt_table_t + CBP_CHROMA;
916*495ae853SAndroid Build Coastguard Worker
917*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[LUMA_DC_CTXCAT] =
918*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_0_OFFSET;
919*495ae853SAndroid Build Coastguard Worker
920*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[LUMA_AC_CTXCAT] =
921*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_1_OFFSET;
922*495ae853SAndroid Build Coastguard Worker
923*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[LUMA_4X4_CTXCAT] =
924*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_2_OFFSET;
925*495ae853SAndroid Build Coastguard Worker
926*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[CHROMA_DC_CTXCAT] =
927*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_3_OFFSET;
928*495ae853SAndroid Build Coastguard Worker
929*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[CHROMA_AC_CTXCAT] =
930*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + COEFF_ABS_LEVEL_MINUS1 + COEFF_ABS_LEVEL_CAT_4_OFFSET;
931*495ae853SAndroid Build Coastguard Worker
932*495ae853SAndroid Build Coastguard Worker p_coeff_abs_level_minus1_t[LUMA_8X8_CTXCAT] =
933*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + COEFF_ABS_LEVEL_MINUS1_8X8 + COEFF_ABS_LEVEL_CAT_5_OFFSET;
934*495ae853SAndroid Build Coastguard Worker
935*495ae853SAndroid Build Coastguard Worker /********************************************************/
936*495ae853SAndroid Build Coastguard Worker /* context for the high profile related syntax elements */
937*495ae853SAndroid Build Coastguard Worker /* This is maintained seperately in s_high_profile */
938*495ae853SAndroid Build Coastguard Worker /********************************************************/
939*495ae853SAndroid Build Coastguard Worker {
940*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->s_high_profile.ps_transform8x8_flag =
941*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + TRANSFORM_SIZE_8X8_FLAG;
942*495ae853SAndroid Build Coastguard Worker
943*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->s_high_profile.ps_sigcoeff_8x8_frame =
944*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + SIGNIFICANT_COEFF_FLAG_8X8_FRAME;
945*495ae853SAndroid Build Coastguard Worker
946*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->s_high_profile.ps_last_sigcoeff_8x8_frame =
947*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + LAST_SIGNIFICANT_COEFF_FLAG_8X8_FRAME;
948*495ae853SAndroid Build Coastguard Worker
949*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->s_high_profile.ps_coeff_abs_levelminus1 =
950*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + COEFF_ABS_LEVEL_MINUS1_8X8;
951*495ae853SAndroid Build Coastguard Worker
952*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->s_high_profile.ps_sigcoeff_8x8_field =
953*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + SIGNIFICANT_COEFF_FLAG_8X8_FIELD;
954*495ae853SAndroid Build Coastguard Worker
955*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->s_high_profile.ps_last_sigcoeff_8x8_field =
956*495ae853SAndroid Build Coastguard Worker p_cabac_ctxt_table_t + LAST_SIGNIFICANT_COEFF_FLAG_8X8_FIELD;
957*495ae853SAndroid Build Coastguard Worker }
958*495ae853SAndroid Build Coastguard Worker }
959*495ae853SAndroid Build Coastguard Worker
960*495ae853SAndroid Build Coastguard Worker return OK;
961*495ae853SAndroid Build Coastguard Worker }
962*495ae853SAndroid Build Coastguard Worker
imvcd_convert_au_buf_to_view_buf(mvc_au_buffer_t * ps_au_buf,pic_buffer_t * ps_view_buf,UWORD16 u2_view_order_id,UWORD16 u2_view_id)963*495ae853SAndroid Build Coastguard Worker void imvcd_convert_au_buf_to_view_buf(mvc_au_buffer_t *ps_au_buf, pic_buffer_t *ps_view_buf,
964*495ae853SAndroid Build Coastguard Worker UWORD16 u2_view_order_id, UWORD16 u2_view_id)
965*495ae853SAndroid Build Coastguard Worker {
966*495ae853SAndroid Build Coastguard Worker yuv_buf_props_t *ps_view_buffer = &ps_au_buf->as_view_buffers[u2_view_id];
967*495ae853SAndroid Build Coastguard Worker offsets_t *ps_disp_offsets = &ps_au_buf->as_disp_offsets[u2_view_id];
968*495ae853SAndroid Build Coastguard Worker mvc_au_mv_pred_t *ps_au_mv_data = ps_au_buf->ps_au_mv_data;
969*495ae853SAndroid Build Coastguard Worker
970*495ae853SAndroid Build Coastguard Worker ps_view_buf->pu1_buf1 = ps_view_buffer->as_component_bufs[Y].pv_data;
971*495ae853SAndroid Build Coastguard Worker ps_view_buf->pu1_buf2 = ps_view_buffer->as_component_bufs[UV].pv_data;
972*495ae853SAndroid Build Coastguard Worker ps_view_buf->pu1_buf3 = NULL;
973*495ae853SAndroid Build Coastguard Worker ps_view_buf->u2_frm_wd_y = ps_view_buffer->as_component_bufs[Y].i4_data_stride;
974*495ae853SAndroid Build Coastguard Worker ps_view_buf->u2_frm_wd_uv = ps_view_buffer->as_component_bufs[UV].i4_data_stride;
975*495ae853SAndroid Build Coastguard Worker ps_view_buf->pu1_buf3 = NULL;
976*495ae853SAndroid Build Coastguard Worker
977*495ae853SAndroid Build Coastguard Worker ps_view_buf->u2_disp_width = ps_au_buf->u2_disp_width;
978*495ae853SAndroid Build Coastguard Worker ps_view_buf->u2_disp_height = ps_au_buf->u2_disp_height;
979*495ae853SAndroid Build Coastguard Worker ps_view_buf->u2_frm_ht_y = ps_view_buffer->u2_height;
980*495ae853SAndroid Build Coastguard Worker ps_view_buf->u2_frm_ht_uv = ps_view_buffer->u2_height / 2;
981*495ae853SAndroid Build Coastguard Worker
982*495ae853SAndroid Build Coastguard Worker ps_view_buf->u4_time_stamp = ps_au_buf->u4_time_stamp;
983*495ae853SAndroid Build Coastguard Worker ps_view_buf->u4_ts = ps_au_buf->u4_time_stamp;
984*495ae853SAndroid Build Coastguard Worker
985*495ae853SAndroid Build Coastguard Worker ps_view_buf->u2_crop_offset_y =
986*495ae853SAndroid Build Coastguard Worker ps_disp_offsets->u2_left_offset + ps_disp_offsets->u2_top_offset * ps_view_buf->u2_frm_wd_y;
987*495ae853SAndroid Build Coastguard Worker ps_view_buf->u2_crop_offset_uv =
988*495ae853SAndroid Build Coastguard Worker ps_disp_offsets->u2_left_offset +
989*495ae853SAndroid Build Coastguard Worker (ps_disp_offsets->u2_top_offset / 2) * ps_view_buf->u2_frm_wd_uv;
990*495ae853SAndroid Build Coastguard Worker
991*495ae853SAndroid Build Coastguard Worker ps_view_buf->i4_poc = ps_au_buf->i4_poc;
992*495ae853SAndroid Build Coastguard Worker ps_view_buf->i4_pic_num = ps_au_buf->i4_frame_num;
993*495ae853SAndroid Build Coastguard Worker ps_view_buf->i4_frame_num = ps_au_buf->i4_frame_num;
994*495ae853SAndroid Build Coastguard Worker ps_view_buf->i4_avg_poc = ps_au_buf->i4_poc;
995*495ae853SAndroid Build Coastguard Worker ps_view_buf->u1_is_short = ps_au_buf->b_is_short_term_ref;
996*495ae853SAndroid Build Coastguard Worker ps_view_buf->u1_pic_type = ps_au_buf->u1_pic_type;
997*495ae853SAndroid Build Coastguard Worker ps_view_buf->i4_top_field_order_cnt = ps_au_buf->i4_poc;
998*495ae853SAndroid Build Coastguard Worker ps_view_buf->i4_bottom_field_order_cnt = ps_au_buf->i4_poc;
999*495ae853SAndroid Build Coastguard Worker ps_view_buf->u1_picturetype = FRM_PIC;
1000*495ae853SAndroid Build Coastguard Worker ps_view_buf->u1_long_term_frm_idx = ps_au_buf->u1_long_term_frm_idx;
1001*495ae853SAndroid Build Coastguard Worker ps_view_buf->u1_long_term_pic_num = ps_au_buf->u1_long_term_pic_num;
1002*495ae853SAndroid Build Coastguard Worker ps_view_buf->u4_pack_slc_typ = ps_au_buf->au4_pack_slc_typ[u2_view_order_id];
1003*495ae853SAndroid Build Coastguard Worker ps_view_buf->u1_pic_struct = ps_au_buf->u1_pic_struct;
1004*495ae853SAndroid Build Coastguard Worker ps_view_buf->s_sei_pic = ps_au_buf->s_sei_pic;
1005*495ae853SAndroid Build Coastguard Worker
1006*495ae853SAndroid Build Coastguard Worker ps_view_buf->u1_pic_buf_id = ps_au_buf->i4_pic_buf_id;
1007*495ae853SAndroid Build Coastguard Worker ps_view_buf->u1_mv_buf_id = ps_au_buf->i4_mv_buf_id;
1008*495ae853SAndroid Build Coastguard Worker
1009*495ae853SAndroid Build Coastguard Worker ps_view_buf->pu1_col_zero_flag = ps_au_mv_data->apu1_mode_descriptors[u2_view_id];
1010*495ae853SAndroid Build Coastguard Worker ps_view_buf->ps_mv = ps_au_mv_data->aps_mvs[u2_view_id];
1011*495ae853SAndroid Build Coastguard Worker }
1012*495ae853SAndroid Build Coastguard Worker
imvcd_init_ref_idx_to_ref_buf_map(mvc_dec_ctxt_t * ps_mvcd_ctxt)1013*495ae853SAndroid Build Coastguard Worker void imvcd_init_ref_idx_to_ref_buf_map(mvc_dec_ctxt_t *ps_mvcd_ctxt)
1014*495ae853SAndroid Build Coastguard Worker {
1015*495ae853SAndroid Build Coastguard Worker pic_buffer_t *ps_pic;
1016*495ae853SAndroid Build Coastguard Worker
1017*495ae853SAndroid Build Coastguard Worker void **ppv_map_ref_idx_to_poc_lx;
1018*495ae853SAndroid Build Coastguard Worker WORD8 i, j;
1019*495ae853SAndroid Build Coastguard Worker
1020*495ae853SAndroid Build Coastguard Worker dec_struct_t *ps_view_ctxt = &ps_mvcd_ctxt->s_view_dec_ctxt;
1021*495ae853SAndroid Build Coastguard Worker
1022*495ae853SAndroid Build Coastguard Worker bool b_is_b_pic = !!(
1023*495ae853SAndroid Build Coastguard Worker ps_mvcd_ctxt->ps_cur_au->au4_pack_slc_typ[ps_mvcd_ctxt->u2_num_views_decoded] & B_SLC_BIT);
1024*495ae853SAndroid Build Coastguard Worker
1025*495ae853SAndroid Build Coastguard Worker for(i = 0; i < 1 + ((WORD32) b_is_b_pic); i++)
1026*495ae853SAndroid Build Coastguard Worker {
1027*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_lx =
1028*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ppv_map_ref_idx_to_poc + ((0 == i) ? FRM_LIST_L0 : FRM_LIST_L1);
1029*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_lx[0] = NULL;
1030*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_lx++;
1031*495ae853SAndroid Build Coastguard Worker
1032*495ae853SAndroid Build Coastguard Worker for(j = 0; j < ps_view_ctxt->ps_cur_slice->u1_num_ref_idx_lx_active[i]; j++)
1033*495ae853SAndroid Build Coastguard Worker {
1034*495ae853SAndroid Build Coastguard Worker ps_pic = ps_view_ctxt->ps_ref_pic_buf_lx[i][j];
1035*495ae853SAndroid Build Coastguard Worker
1036*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_lx[j] = ps_pic->pu1_buf1;
1037*495ae853SAndroid Build Coastguard Worker }
1038*495ae853SAndroid Build Coastguard Worker }
1039*495ae853SAndroid Build Coastguard Worker
1040*495ae853SAndroid Build Coastguard Worker if(!b_is_b_pic)
1041*495ae853SAndroid Build Coastguard Worker {
1042*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_lx = ps_view_ctxt->ppv_map_ref_idx_to_poc + FRM_LIST_L1;
1043*495ae853SAndroid Build Coastguard Worker ppv_map_ref_idx_to_poc_lx[0] = NULL;
1044*495ae853SAndroid Build Coastguard Worker }
1045*495ae853SAndroid Build Coastguard Worker
1046*495ae853SAndroid Build Coastguard Worker if(ps_view_ctxt->u4_num_cores >= 3)
1047*495ae853SAndroid Build Coastguard Worker {
1048*495ae853SAndroid Build Coastguard Worker WORD32 i4_size;
1049*495ae853SAndroid Build Coastguard Worker
1050*495ae853SAndroid Build Coastguard Worker WORD32 i4_num_entries = MAX_FRAMES;
1051*495ae853SAndroid Build Coastguard Worker
1052*495ae853SAndroid Build Coastguard Worker if((1 >= ps_view_ctxt->ps_cur_sps->u1_num_ref_frames) &&
1053*495ae853SAndroid Build Coastguard Worker (0 == ps_view_ctxt->i4_display_delay))
1054*495ae853SAndroid Build Coastguard Worker {
1055*495ae853SAndroid Build Coastguard Worker i4_num_entries = 1;
1056*495ae853SAndroid Build Coastguard Worker }
1057*495ae853SAndroid Build Coastguard Worker
1058*495ae853SAndroid Build Coastguard Worker i4_num_entries = 2 * i4_num_entries + 1;
1059*495ae853SAndroid Build Coastguard Worker i4_num_entries *= 2;
1060*495ae853SAndroid Build Coastguard Worker
1061*495ae853SAndroid Build Coastguard Worker i4_size = i4_num_entries * sizeof(void *);
1062*495ae853SAndroid Build Coastguard Worker i4_size += PAD_MAP_IDX_POC * sizeof(void *);
1063*495ae853SAndroid Build Coastguard Worker
1064*495ae853SAndroid Build Coastguard Worker memcpy(ps_view_ctxt->ps_parse_cur_slice->ppv_map_ref_idx_to_poc,
1065*495ae853SAndroid Build Coastguard Worker ps_view_ctxt->ppv_map_ref_idx_to_poc, i4_size);
1066*495ae853SAndroid Build Coastguard Worker }
1067*495ae853SAndroid Build Coastguard Worker }
1068*495ae853SAndroid Build Coastguard Worker
imvcd_ivp_buf_copier(mvc_au_buffer_t * ps_au_buf_src,mvc_au_buffer_t * ps_au_buf_dst,mvc_au_mv_pred_t * ps_au_mv_data_src,mvc_au_mv_pred_t * ps_au_mv_data_dst,UWORD16 u2_src_view_id,UWORD16 u2_dst_view_id)1069*495ae853SAndroid Build Coastguard Worker void imvcd_ivp_buf_copier(mvc_au_buffer_t *ps_au_buf_src, mvc_au_buffer_t *ps_au_buf_dst,
1070*495ae853SAndroid Build Coastguard Worker mvc_au_mv_pred_t *ps_au_mv_data_src, mvc_au_mv_pred_t *ps_au_mv_data_dst,
1071*495ae853SAndroid Build Coastguard Worker UWORD16 u2_src_view_id, UWORD16 u2_dst_view_id)
1072*495ae853SAndroid Build Coastguard Worker {
1073*495ae853SAndroid Build Coastguard Worker UWORD32 i, j;
1074*495ae853SAndroid Build Coastguard Worker
1075*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_mode_info_src = ps_au_mv_data_src->aps_mvs[u2_src_view_id];
1076*495ae853SAndroid Build Coastguard Worker mv_pred_t *ps_mode_info_dst = ps_au_mv_data_dst->aps_mvs[u2_dst_view_id];
1077*495ae853SAndroid Build Coastguard Worker
1078*495ae853SAndroid Build Coastguard Worker UWORD32 u4_view_wd = ps_au_buf_src->as_view_buffers[u2_src_view_id].u2_width;
1079*495ae853SAndroid Build Coastguard Worker UWORD32 u4_view_ht = ps_au_buf_src->as_view_buffers[u2_src_view_id].u2_height;
1080*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mode_info_buf_size = imvcd_get_num_elements_in_mv_pred_buf(u4_view_wd, u4_view_ht);
1081*495ae853SAndroid Build Coastguard Worker UWORD32 u4_mode_info_pad_size = imvcd_get_mv_pred_buf_padding_length(u4_view_wd);
1082*495ae853SAndroid Build Coastguard Worker
1083*495ae853SAndroid Build Coastguard Worker ps_mode_info_src -= u4_mode_info_pad_size;
1084*495ae853SAndroid Build Coastguard Worker ps_mode_info_dst -= u4_mode_info_pad_size;
1085*495ae853SAndroid Build Coastguard Worker
1086*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->ps_au_mv_data = ps_au_mv_data_dst;
1087*495ae853SAndroid Build Coastguard Worker
1088*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->as_disp_offsets[u2_dst_view_id] = ps_au_buf_src->as_disp_offsets[u2_src_view_id];
1089*495ae853SAndroid Build Coastguard Worker
1090*495ae853SAndroid Build Coastguard Worker for(i = 0; i < NUM_SP_COMPONENTS; i++)
1091*495ae853SAndroid Build Coastguard Worker {
1092*495ae853SAndroid Build Coastguard Worker bool b_is_chroma = ((COMPONENT_TYPES_T) i) != Y;
1093*495ae853SAndroid Build Coastguard Worker
1094*495ae853SAndroid Build Coastguard Worker coordinates_t s_pad_dims = imvcd_get_buf_pad_dims(b_is_chroma);
1095*495ae853SAndroid Build Coastguard Worker buffer_container_t *ps_src =
1096*495ae853SAndroid Build Coastguard Worker &ps_au_buf_src->as_view_buffers[u2_src_view_id].as_component_bufs[i];
1097*495ae853SAndroid Build Coastguard Worker buffer_container_t *ps_dst =
1098*495ae853SAndroid Build Coastguard Worker &ps_au_buf_dst->as_view_buffers[u2_dst_view_id].as_component_bufs[i];
1099*495ae853SAndroid Build Coastguard Worker
1100*495ae853SAndroid Build Coastguard Worker WORD32 i4_src_pad_offset =
1101*495ae853SAndroid Build Coastguard Worker imvcd_get_ref_pic_pad_offset(ps_src->i4_data_stride, b_is_chroma);
1102*495ae853SAndroid Build Coastguard Worker WORD32 i4_dst_pad_offset =
1103*495ae853SAndroid Build Coastguard Worker imvcd_get_ref_pic_pad_offset(ps_dst->i4_data_stride, b_is_chroma);
1104*495ae853SAndroid Build Coastguard Worker
1105*495ae853SAndroid Build Coastguard Worker for(j = 0; j < ((u4_view_ht >> b_is_chroma) + s_pad_dims.i4_ordinate); j++)
1106*495ae853SAndroid Build Coastguard Worker {
1107*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_src =
1108*495ae853SAndroid Build Coastguard Worker ((UWORD8 *) ps_src->pv_data) + j * ps_src->i4_data_stride - i4_src_pad_offset;
1109*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_dst =
1110*495ae853SAndroid Build Coastguard Worker ((UWORD8 *) ps_dst->pv_data) + j * ps_dst->i4_data_stride - i4_dst_pad_offset;
1111*495ae853SAndroid Build Coastguard Worker
1112*495ae853SAndroid Build Coastguard Worker memcpy(pu1_dst, pu1_src, (u4_view_wd + s_pad_dims.i4_abscissa) * sizeof(pu1_dst[0]));
1113*495ae853SAndroid Build Coastguard Worker }
1114*495ae853SAndroid Build Coastguard Worker }
1115*495ae853SAndroid Build Coastguard Worker
1116*495ae853SAndroid Build Coastguard Worker memcpy(ps_mode_info_dst, ps_mode_info_src, u4_mode_info_buf_size * sizeof(ps_mode_info_dst[0]));
1117*495ae853SAndroid Build Coastguard Worker
1118*495ae853SAndroid Build Coastguard Worker for(i = 0; i < u4_mode_info_buf_size; i++)
1119*495ae853SAndroid Build Coastguard Worker {
1120*495ae853SAndroid Build Coastguard Worker /* In accordance with 'H.8.4' */
1121*495ae853SAndroid Build Coastguard Worker ps_au_mv_data_dst->apu1_mode_descriptors[u2_dst_view_id][i] =
1122*495ae853SAndroid Build Coastguard Worker ps_au_mv_data_src->apu1_mode_descriptors[u2_src_view_id][i] & 0xFE;
1123*495ae853SAndroid Build Coastguard Worker }
1124*495ae853SAndroid Build Coastguard Worker
1125*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->au4_pack_slc_typ[u2_dst_view_id] =
1126*495ae853SAndroid Build Coastguard Worker ps_au_buf_src->au4_pack_slc_typ[u2_src_view_id];
1127*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->b_is_short_term_ref = ps_au_buf_src->b_is_short_term_ref;
1128*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->i4_avg_poc = ps_au_buf_src->i4_avg_poc;
1129*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->i4_frame_num = ps_au_buf_src->i4_frame_num;
1130*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->i4_pic_num = ps_au_buf_src->i4_pic_num;
1131*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->i4_poc = ps_au_buf_src->i4_poc;
1132*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->s_sei_pic = ps_au_buf_src->s_sei_pic;
1133*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->u1_long_term_frm_idx = ps_au_buf_src->u1_long_term_frm_idx;
1134*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->u1_long_term_pic_num = ps_au_buf_src->u1_long_term_pic_num;
1135*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->u1_picturetype = ps_au_buf_src->u1_picturetype;
1136*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->u1_pic_struct = ps_au_buf_src->u1_pic_struct;
1137*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->u2_disp_height = ps_au_buf_src->u2_disp_height;
1138*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->u2_disp_width = ps_au_buf_src->u2_disp_width;
1139*495ae853SAndroid Build Coastguard Worker ps_au_buf_dst->u4_time_stamp = ps_au_buf_src->u4_time_stamp;
1140*495ae853SAndroid Build Coastguard Worker }
1141