/src/libavc/decoder/svc/isvcd_parse_eislice.c
Line | Count | Source (jump to first uncovered line) |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2022 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | /** |
21 | | ******************************************************************************* |
22 | | * @file |
23 | | * isvcd_parse_eislice.c |
24 | | * |
25 | | * @brief |
26 | | * Contains routines that decode a EI slice type |
27 | | * |
28 | | * @author |
29 | | * Kishore |
30 | | * |
31 | | * @par List of Functions: |
32 | | * - isvcd_parse_islice_data_cabac() |
33 | | * - isvcd_parse_islice_data_cavlc() |
34 | | * - isvcd_parse_imb_cavlc() |
35 | | * - isvcd_parse_eislice() |
36 | | * - isvcd_parse_eislice_data_cabac() |
37 | | * - isvcd_parse_eislice_data_cavlc() |
38 | | * - isvcd_parse_imb_cabac() |
39 | | * - isvcd_parse_islice() |
40 | | * |
41 | | * @remarks |
42 | | * None |
43 | | * |
44 | | ******************************************************************************* |
45 | | */ |
46 | | |
47 | | #include <string.h> |
48 | | #include "ih264_defs.h" |
49 | | #include "ih264d_error_handler.h" |
50 | | #include "ih264d_debug.h" |
51 | | #include "ih264d_bitstrm.h" |
52 | | #include "ih264d_defs.h" |
53 | | #include "ih264d_tables.h" |
54 | | #include "isvcd_structs.h" |
55 | | #include "ih264d_parse_cavlc.h" |
56 | | #include "ih264d_mb_utils.h" |
57 | | #include "ih264d_deblocking.h" |
58 | | #include "ih264d_cabac.h" |
59 | | #include "ih264d_parse_cabac.h" |
60 | | #include "ih264d_parse_mb_header.h" |
61 | | #include "ih264d_parse_slice.h" |
62 | | #include "ih264d_process_pslice.h" |
63 | | #include "isvcd_process_epslice.h" |
64 | | #include "ih264d_process_intra_mb.h" |
65 | | #include "ih264d_parse_islice.h" |
66 | | #include "ih264d_error_handler.h" |
67 | | #include "ih264d_mvpred.h" |
68 | | #include "ih264d_thread_parse_decode.h" |
69 | | #include "ithread.h" |
70 | | #include "ih264d_parse_mb_header.h" |
71 | | #include "assert.h" |
72 | | #include "ih264d_utils.h" |
73 | | #include "ih264d_format_conv.h" |
74 | | #include "ih264d_parse_headers.h" |
75 | | #include "isvcd_parse_headers.h" |
76 | | #include "isvcd_parse_slice.h" |
77 | | #include "isvcd_mb_utils.h" |
78 | | |
79 | | void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t *ps_dec); |
80 | | void isvcd_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t *ps_dec); |
81 | | |
82 | | /*****************************************************************************/ |
83 | | /* */ |
84 | | /* Function Name : isvcd_parse_islice_data_cabac */ |
85 | | /* */ |
86 | | /* Description : This function parses cabac syntax of a inter slice on */ |
87 | | /* N MB basis. */ |
88 | | /* */ |
89 | | /* Inputs : ps_dec */ |
90 | | /* sliceparams */ |
91 | | /* firstMbInSlice */ |
92 | | /* */ |
93 | | /* Processing : 1. After parsing syntax for N MBs those N MBs are */ |
94 | | /* decoded till the end of slice. */ |
95 | | /* */ |
96 | | /* Returns : 0 */ |
97 | | /* */ |
98 | | /* Issues : <List any issues or problems with this function> */ |
99 | | /* */ |
100 | | /* Revision History: */ |
101 | | /* */ |
102 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
103 | | /* 24 06 2005 Kishore Draft */ |
104 | | /* */ |
105 | | /*****************************************************************************/ |
106 | | WORD32 isvcd_parse_islice_data_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec, |
107 | | dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice) |
108 | 3.39k | { |
109 | 3.39k | UWORD8 uc_more_data_flag; |
110 | 3.39k | UWORD32 u4_num_mbs, u4_mb_idx; |
111 | 3.39k | dec_mb_info_t *ps_cur_mb_info; |
112 | 3.39k | deblk_mb_t *ps_cur_deblk_mb; |
113 | 3.39k | dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec; |
114 | 3.39k | dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm; |
115 | 3.39k | UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; |
116 | 3.39k | WORD32 i4_cur_mb_addr; |
117 | 3.39k | UWORD8 u1_mbaff; |
118 | 3.39k | UWORD32 u4_num_mbs_next, u4_end_of_row, u4_tfr_n_mb; |
119 | 3.39k | WORD32 ret = OK; |
120 | | |
121 | 3.39k | ps_dec->u1_qp = ps_slice->u1_slice_qp; |
122 | 3.39k | ih264d_update_qp(ps_dec, 0); |
123 | 3.39k | u1_mbaff = ps_slice->u1_mbaff_frame_flag; |
124 | | |
125 | 3.39k | if(ps_bitstrm->u4_ofst & 0x07) |
126 | 2.76k | { |
127 | 2.76k | ps_bitstrm->u4_ofst += 8; |
128 | 2.76k | ps_bitstrm->u4_ofst &= 0xFFFFFFF8; |
129 | 2.76k | } |
130 | 3.39k | ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm); |
131 | 3.39k | if(ret != OK) return ret; |
132 | 3.15k | ih264d_init_cabac_contexts(I_SLICE, ps_dec); |
133 | | |
134 | 3.15k | ps_dec->i1_prev_mb_qp_delta = 0; |
135 | | |
136 | | /* initializations */ |
137 | 3.15k | u4_mb_idx = ps_dec->u4_mb_idx; |
138 | 3.15k | u4_num_mbs = u4_mb_idx; |
139 | 3.15k | uc_more_data_flag = 1; |
140 | 3.15k | i4_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff; |
141 | 3.15k | do |
142 | 80.5k | { |
143 | 80.5k | UWORD16 u2_mbx; |
144 | 80.5k | ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; |
145 | | |
146 | 80.5k | if(i4_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr) |
147 | 107 | { |
148 | 107 | break; |
149 | 107 | } |
150 | | |
151 | 80.4k | { |
152 | 80.4k | UWORD8 u1_mb_type; |
153 | 80.4k | ps_cur_mb_info = ps_dec->ps_nmb_info + u4_num_mbs; |
154 | 80.4k | ps_dec->u4_num_mbs_cur_nmb = u4_num_mbs; |
155 | 80.4k | ps_dec->u4_num_pmbair = (u4_num_mbs >> u1_mbaff); |
156 | 80.4k | ps_cur_mb_info->u1_end_of_slice = 0; |
157 | | |
158 | | /***************************************************************/ |
159 | | /* Get the required information for decoding of MB */ |
160 | | /* mb_x, mb_y , neighbour availablity, */ |
161 | | /***************************************************************/ |
162 | 80.4k | ps_dec->pf_get_mb_info(ps_dec, i4_cur_mb_addr, ps_cur_mb_info, 0); |
163 | 80.4k | u2_mbx = ps_dec->u2_mbx; |
164 | | |
165 | | /*********************************************************************/ |
166 | | /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */ |
167 | | /*********************************************************************/ |
168 | 80.4k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
169 | 80.4k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
170 | | |
171 | | /***************************************************************/ |
172 | | /* Set the deblocking parameters for this MB */ |
173 | | /***************************************************************/ |
174 | 80.4k | ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u4_num_mbs; |
175 | 80.4k | if(ps_dec->u4_app_disable_deblk_frm == 0) |
176 | 80.4k | ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, |
177 | 80.4k | ps_dec->u1_mb_ngbr_availablity, |
178 | 80.4k | ps_dec->u1_cur_mb_fld_dec_flag); |
179 | | |
180 | 80.4k | ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB; |
181 | | |
182 | | /* Macroblock Layer Begins */ |
183 | | /* Decode the u1_mb_type */ |
184 | 80.4k | u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec); |
185 | 80.4k | if(u1_mb_type > 25) return ERROR_MB_TYPE; |
186 | 80.4k | ps_cur_mb_info->u1_mb_type = u1_mb_type; |
187 | 80.4k | COPYTHECONTEXT("u1_mb_type", u1_mb_type); |
188 | | |
189 | | /* Parse Macroblock Data */ |
190 | 80.4k | if(25 == u1_mb_type) |
191 | 312 | { |
192 | | /* I_PCM_MB */ |
193 | 312 | ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB; |
194 | 312 | ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u4_num_mbs); |
195 | 312 | if(ret != OK) return ret; |
196 | 75 | ps_cur_deblk_mb->u1_mb_qp = 0; |
197 | 75 | } |
198 | 80.1k | else |
199 | 80.1k | { |
200 | 80.1k | ret = ih264d_parse_imb_cabac(ps_dec, ps_cur_mb_info, u1_mb_type); |
201 | 80.1k | if(ret != OK) return ret; |
202 | 77.7k | ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; |
203 | 77.7k | } |
204 | | |
205 | 77.8k | if(ps_dec->u1_enable_mb_info) |
206 | 0 | { |
207 | 0 | ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1, |
208 | 0 | ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp); |
209 | 0 | } |
210 | 77.8k | if(u1_mbaff) |
211 | 0 | { |
212 | 0 | ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); |
213 | 0 | } |
214 | | |
215 | 77.8k | if(ps_cur_mb_info->u1_topmb && u1_mbaff) |
216 | 0 | uc_more_data_flag = 1; |
217 | 77.8k | else |
218 | 77.8k | { |
219 | 77.8k | uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm); |
220 | 77.8k | uc_more_data_flag = !uc_more_data_flag; |
221 | 77.8k | COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag); |
222 | 77.8k | } |
223 | | |
224 | 77.8k | if(u1_mbaff) |
225 | 0 | { |
226 | 0 | if(!uc_more_data_flag && (0 == (i4_cur_mb_addr & 1))) |
227 | 0 | { |
228 | 0 | return ERROR_EOB_FLUSHBITS_T; |
229 | 0 | } |
230 | 0 | } |
231 | | /* Next macroblock information */ |
232 | 77.8k | i4_cur_mb_addr++; |
233 | | /* Store the colocated information */ |
234 | 77.8k | { |
235 | 77.8k | mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u4_num_mbs << 4); |
236 | 77.8k | mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0}; |
237 | 77.8k | ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0, |
238 | 77.8k | (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4); |
239 | 77.8k | } |
240 | | /*if num _cores is set to 3,compute bs will be done in another thread*/ |
241 | 77.8k | if(ps_dec->u4_num_cores < 3) |
242 | 77.8k | { |
243 | 77.8k | if(ps_dec->u4_app_disable_deblk_frm == 0) |
244 | 77.8k | ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info, |
245 | 77.8k | (UWORD16) (u4_num_mbs >> u1_mbaff)); |
246 | 77.8k | } |
247 | 77.8k | u4_num_mbs++; |
248 | 77.8k | } |
249 | | |
250 | | /****************************************************************/ |
251 | | /* Check for End Of Row */ |
252 | | /****************************************************************/ |
253 | 0 | u4_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1; |
254 | 77.8k | u4_end_of_row = (!u4_num_mbs_next) && (!(u1_mbaff && (u4_num_mbs & 0x01))); |
255 | 77.8k | u4_tfr_n_mb = |
256 | 77.8k | (u4_num_mbs == ps_dec->u4_recon_mb_grp) || u4_end_of_row || (!uc_more_data_flag); |
257 | 77.8k | ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag); |
258 | | |
259 | 77.8k | if(u4_tfr_n_mb || (!uc_more_data_flag)) |
260 | 13.0k | { |
261 | 13.0k | if(ps_dec->u1_separate_parse) |
262 | 4.14k | { |
263 | 4.14k | ih264d_parse_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next, u4_tfr_n_mb, |
264 | 4.14k | u4_end_of_row); |
265 | 4.14k | ps_dec->ps_nmb_info += u4_num_mbs; |
266 | 4.14k | ps_svc_lyr_dec->ps_svc_nmb_info += u4_num_mbs; |
267 | 4.14k | } |
268 | 8.93k | else |
269 | 8.93k | { |
270 | 8.93k | if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) |
271 | 7.27k | { |
272 | 7.27k | ih264d_decode_recon_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next, |
273 | 7.27k | u4_tfr_n_mb, u4_end_of_row); |
274 | 7.27k | } |
275 | 1.65k | else |
276 | 1.65k | { |
277 | 1.65k | isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u4_mb_idx, u4_num_mbs, |
278 | 1.65k | u4_num_mbs_next, u4_tfr_n_mb, |
279 | 1.65k | u4_end_of_row); |
280 | 1.65k | } |
281 | 8.93k | } |
282 | 13.0k | ps_dec->u4_total_mbs_coded += u4_num_mbs; |
283 | 13.0k | if(u4_tfr_n_mb) u4_num_mbs = 0; |
284 | 13.0k | u4_mb_idx = u4_num_mbs; |
285 | 13.0k | ps_dec->u4_mb_idx = u4_num_mbs; |
286 | 13.0k | } |
287 | 77.8k | } while(uc_more_data_flag); |
288 | | |
289 | 561 | ps_dec->u4_num_mbs_cur_nmb = 0; |
290 | 561 | ps_dec->ps_cur_slice->u4_mbs_in_slice = i4_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff); |
291 | | |
292 | 561 | return ret; |
293 | 3.15k | } |
294 | | |
295 | | /*****************************************************************************/ |
296 | | /* */ |
297 | | /* Function Name : isvcd_parse_islice_data_cavlc */ |
298 | | /* */ |
299 | | /* Description : This function parses cabac syntax of a inter slice on */ |
300 | | /* N MB basis. */ |
301 | | /* */ |
302 | | /* Inputs : ps_dec */ |
303 | | /* sliceparams */ |
304 | | /* firstMbInSlice */ |
305 | | /* */ |
306 | | /* Processing : 1. After parsing syntax for N MBs those N MBs are */ |
307 | | /* decoded till the end of slice. */ |
308 | | /* */ |
309 | | /* Returns : 0 */ |
310 | | /* */ |
311 | | /* Issues : <List any issues or problems with this function> */ |
312 | | /* */ |
313 | | /* Revision History: */ |
314 | | /* */ |
315 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
316 | | /* 24 06 2005 Kishore Draft */ |
317 | | /* */ |
318 | | /*****************************************************************************/ |
319 | | |
320 | | WORD32 isvcd_parse_islice_data_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec, |
321 | | dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice) |
322 | 2.20k | { |
323 | 2.20k | UWORD8 uc_more_data_flag; |
324 | 2.20k | UWORD32 u4_num_mbs, u4_mb_idx; |
325 | 2.20k | dec_mb_info_t *ps_cur_mb_info; |
326 | 2.20k | deblk_mb_t *ps_cur_deblk_mb; |
327 | 2.20k | dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec; |
328 | 2.20k | dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm; |
329 | 2.20k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
330 | 2.20k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
331 | 2.20k | UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; |
332 | 2.20k | WORD32 i4_cur_mb_addr; |
333 | 2.20k | UWORD8 u1_mbaff; |
334 | 2.20k | UWORD32 u4_num_mbs_next, u4_end_of_row, u4_tfr_n_mb; |
335 | 2.20k | WORD32 ret = OK; |
336 | | |
337 | 2.20k | ps_dec->u1_qp = ps_slice->u1_slice_qp; |
338 | 2.20k | ih264d_update_qp(ps_dec, 0); |
339 | 2.20k | u1_mbaff = ps_slice->u1_mbaff_frame_flag; |
340 | | |
341 | | /* initializations */ |
342 | 2.20k | u4_mb_idx = ps_dec->u4_mb_idx; |
343 | 2.20k | u4_num_mbs = u4_mb_idx; |
344 | | |
345 | 2.20k | uc_more_data_flag = 1; |
346 | 2.20k | i4_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff; |
347 | 2.20k | do |
348 | 52.1k | { |
349 | 52.1k | UWORD8 u1_mb_type; |
350 | 52.1k | ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; |
351 | 52.1k | if(i4_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr) |
352 | 91 | { |
353 | 91 | break; |
354 | 91 | } |
355 | | |
356 | 52.0k | ps_cur_mb_info = ps_dec->ps_nmb_info + u4_num_mbs; |
357 | 52.0k | ps_dec->u4_num_mbs_cur_nmb = u4_num_mbs; |
358 | 52.0k | ps_dec->u4_num_pmbair = (u4_num_mbs >> u1_mbaff); |
359 | 52.0k | ps_cur_mb_info->u1_end_of_slice = 0; |
360 | | |
361 | | /***************************************************************/ |
362 | | /* Get the required information for decoding of MB */ |
363 | | /* mb_x, mb_y , neighbour availablity, */ |
364 | | /***************************************************************/ |
365 | 52.0k | ps_dec->pf_get_mb_info(ps_dec, i4_cur_mb_addr, ps_cur_mb_info, 0); |
366 | | |
367 | | /***************************************************************/ |
368 | | /* Set the deblocking parameters for this MB */ |
369 | | /***************************************************************/ |
370 | 52.0k | ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u4_num_mbs; |
371 | 52.0k | if(ps_dec->u4_app_disable_deblk_frm == 0) |
372 | 52.0k | ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, |
373 | 52.0k | ps_dec->u1_mb_ngbr_availablity, |
374 | 52.0k | ps_dec->u1_cur_mb_fld_dec_flag); |
375 | | |
376 | 52.0k | ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB; |
377 | | |
378 | | /**************************************************************/ |
379 | | /* Macroblock Layer Begins, Decode the u1_mb_type */ |
380 | | /**************************************************************/ |
381 | | /* Inlined ih264d_uev */ |
382 | 52.0k | { |
383 | 52.0k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
384 | 52.0k | UWORD32 u4_word, u4_ldz, u4_temp; |
385 | | |
386 | | /***************************************************************/ |
387 | | /* Find leading zeros in next 32 bits */ |
388 | | /***************************************************************/ |
389 | 52.0k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
390 | 52.0k | u4_ldz = CLZ(u4_word); |
391 | | /* Flush the ps_bitstrm */ |
392 | 52.0k | u4_bitstream_offset += (u4_ldz + 1); |
393 | | /* Read the suffix from the ps_bitstrm */ |
394 | 52.0k | u4_word = 0; |
395 | 52.0k | if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
396 | 52.0k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
397 | 52.0k | u4_temp = ((1 << u4_ldz) + u4_word - 1); |
398 | 52.0k | if(u4_temp > 25) return ERROR_MB_TYPE; |
399 | 51.8k | u1_mb_type = u4_temp; |
400 | 51.8k | } |
401 | | /* Inlined ih264d_uev */ |
402 | 0 | ps_cur_mb_info->u1_mb_type = u1_mb_type; |
403 | 51.8k | COPYTHECONTEXT("u1_mb_type", u1_mb_type); |
404 | | |
405 | | /**************************************************************/ |
406 | | /* Parse Macroblock data */ |
407 | | /**************************************************************/ |
408 | 51.8k | if(25 == u1_mb_type) |
409 | 72 | { |
410 | | /* I_PCM_MB */ |
411 | 72 | ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB; |
412 | 72 | ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u4_num_mbs); |
413 | 72 | if(ret != OK) return ret; |
414 | 72 | ps_cur_deblk_mb->u1_mb_qp = 0; |
415 | 72 | } |
416 | 51.7k | else |
417 | 51.7k | { |
418 | 51.7k | ret = ih264d_parse_imb_cavlc(ps_dec, ps_cur_mb_info, u4_num_mbs, u1_mb_type); |
419 | 51.7k | if(ret != OK) return ret; |
420 | 49.9k | ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; |
421 | 49.9k | } |
422 | 50.0k | if(ps_dec->u1_enable_mb_info) |
423 | 0 | { |
424 | 0 | ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1, |
425 | 0 | ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp); |
426 | 0 | } |
427 | 50.0k | uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm); |
428 | 50.0k | if(u1_mbaff) |
429 | 0 | { |
430 | 0 | ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); |
431 | 0 | if(!uc_more_data_flag && (0 == (i4_cur_mb_addr & 1))) |
432 | 0 | { |
433 | 0 | return ERROR_EOB_FLUSHBITS_T; |
434 | 0 | } |
435 | 0 | } |
436 | | /**************************************************************/ |
437 | | /* Get next Macroblock address */ |
438 | | /**************************************************************/ |
439 | 50.0k | i4_cur_mb_addr++; |
440 | | /* Store the colocated information */ |
441 | 50.0k | { |
442 | 50.0k | mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u4_num_mbs << 4); |
443 | 50.0k | mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0}; |
444 | 50.0k | ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0, |
445 | 50.0k | (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4); |
446 | 50.0k | } |
447 | | |
448 | | /*if num _cores is set to 3,compute bs will be done in another thread*/ |
449 | 50.0k | if(ps_dec->u4_num_cores < 3) |
450 | 50.0k | { |
451 | 50.0k | if(ps_dec->u4_app_disable_deblk_frm == 0) |
452 | 50.0k | ps_svc_lyr_dec->pf_svc_compute_bs(ps_svc_lyr_dec, ps_cur_mb_info, |
453 | 50.0k | (UWORD16) (u4_num_mbs >> u1_mbaff)); |
454 | 50.0k | } |
455 | 50.0k | u4_num_mbs++; |
456 | | |
457 | | /****************************************************************/ |
458 | | /* Check for End Of Row */ |
459 | | /****************************************************************/ |
460 | 50.0k | u4_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; |
461 | 50.0k | u4_end_of_row = (!u4_num_mbs_next) && (!(u1_mbaff && (u4_num_mbs & 0x01))); |
462 | 50.0k | u4_tfr_n_mb = |
463 | 50.0k | (u4_num_mbs == ps_dec->u4_recon_mb_grp) || u4_end_of_row || (!uc_more_data_flag); |
464 | 50.0k | ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag); |
465 | | |
466 | 50.0k | if(u4_tfr_n_mb || (!uc_more_data_flag)) |
467 | 5.57k | { |
468 | 5.57k | if(ps_dec->u1_separate_parse) |
469 | 1.96k | { |
470 | 1.96k | ih264d_parse_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next, u4_tfr_n_mb, |
471 | 1.96k | u4_end_of_row); |
472 | 1.96k | ps_dec->ps_nmb_info += u4_num_mbs; |
473 | 1.96k | ps_svc_lyr_dec->ps_svc_nmb_info += u4_num_mbs; |
474 | 1.96k | } |
475 | 3.61k | else |
476 | 3.61k | { |
477 | 3.61k | if(ps_svc_lyr_dec->u1_layer_identifier == TARGET_LAYER) |
478 | 3.32k | { |
479 | 3.32k | ih264d_decode_recon_tfr_nmb(ps_dec, u4_mb_idx, u4_num_mbs, u4_num_mbs_next, |
480 | 3.32k | u4_tfr_n_mb, u4_end_of_row); |
481 | 3.32k | } |
482 | 291 | else |
483 | 291 | { |
484 | 291 | isvcd_decode_recon_tfr_nmb_base_lyr(ps_svc_lyr_dec, u4_mb_idx, u4_num_mbs, |
485 | 291 | u4_num_mbs_next, u4_tfr_n_mb, |
486 | 291 | u4_end_of_row); |
487 | 291 | } |
488 | 3.61k | } |
489 | 5.57k | ps_dec->u4_total_mbs_coded += u4_num_mbs; |
490 | 5.57k | if(u4_tfr_n_mb) u4_num_mbs = 0; |
491 | 5.57k | u4_mb_idx = u4_num_mbs; |
492 | 5.57k | ps_dec->u4_mb_idx = u4_num_mbs; |
493 | 5.57k | } |
494 | 50.0k | } while(uc_more_data_flag); |
495 | | |
496 | 249 | ps_dec->u4_num_mbs_cur_nmb = 0; |
497 | 249 | ps_dec->ps_cur_slice->u4_mbs_in_slice = i4_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff); |
498 | | |
499 | 249 | return ret; |
500 | 2.20k | } |
501 | | /*! |
502 | | ************************************************************************** |
503 | | * \if Function name : ParseIMb \endif |
504 | | * |
505 | | * \brief |
506 | | * This function parses CAVLC syntax of a I MB. If 16x16 Luma DC transform |
507 | | * is also done here. Transformed Luma DC values are copied in their |
508 | | * 0th pixel location of corrosponding CoeffBlock. |
509 | | * |
510 | | * \return |
511 | | * 0 on Success and Error code otherwise |
512 | | ************************************************************************** |
513 | | */ |
514 | | WORD32 isvcd_parse_imb_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info, |
515 | | dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD32 u4_mb_num, |
516 | | UWORD8 u1_mb_type) |
517 | 218k | { |
518 | 218k | dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec; |
519 | 218k | WORD32 i4_delta_qp; |
520 | 218k | UWORD32 u4_temp; |
521 | 218k | UWORD32 ui_is_top_mb_available; |
522 | 218k | UWORD32 ui_is_left_mb_available; |
523 | 218k | UWORD32 u4_cbp; |
524 | 218k | UWORD32 u4_offset; |
525 | 218k | UWORD32 *pu4_bitstrm_buf; |
526 | 218k | WORD32 ret; |
527 | 218k | dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm; |
528 | 218k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
529 | 218k | UNUSED(u4_mb_num); |
530 | | |
531 | 218k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
532 | 218k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
533 | 218k | ps_cur_mb_info->u1_yuv_dc_block_flag = 0; |
534 | 218k | u4_temp = ps_dec->u1_mb_ngbr_availablity; |
535 | 218k | ui_is_top_mb_available = BOOLEAN(u4_temp & TOP_MB_AVAILABLE_MASK); |
536 | 218k | ui_is_left_mb_available = BOOLEAN(u4_temp & LEFT_MB_AVAILABLE_MASK); |
537 | 218k | pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
538 | | |
539 | 218k | ps_cur_mb_info->ps_curmb->u1_mb_type = P_MB; |
540 | 218k | if(!ps_svc_cur_mb_info->u1_base_mode_flag) |
541 | 16.3k | { |
542 | 16.3k | if(u1_mb_type == I_4x4_MB) |
543 | 7.13k | { |
544 | 7.13k | ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB; |
545 | 7.13k | u4_offset = 0; |
546 | | |
547 | | /*--------------------------------------------------------------------*/ |
548 | | /* Read transform_size_8x8_flag if present */ |
549 | | /*--------------------------------------------------------------------*/ |
550 | 7.13k | if(ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) |
551 | 4.93k | { |
552 | 4.93k | ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm); |
553 | 4.93k | COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8); |
554 | 4.93k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8; |
555 | 4.93k | } |
556 | | |
557 | | /*--------------------------------------------------------------------*/ |
558 | | /* Read the IntraPrediction modes for LUMA */ |
559 | | /*--------------------------------------------------------------------*/ |
560 | 7.13k | if(!ps_cur_mb_info->u1_tran_form8x8) |
561 | 2.84k | { |
562 | 2.84k | UWORD8 *pu1_temp; |
563 | 2.84k | ih264d_read_intra_pred_modes(ps_dec, ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data), |
564 | 2.84k | ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 16), |
565 | 2.84k | ps_cur_mb_info->u1_tran_form8x8); |
566 | 2.84k | pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data; |
567 | 2.84k | pu1_temp += 32; |
568 | 2.84k | ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp; |
569 | 2.84k | } |
570 | 4.29k | else |
571 | 4.29k | { |
572 | 4.29k | UWORD8 *pu1_temp; |
573 | 4.29k | ih264d_read_intra_pred_modes(ps_dec, ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data), |
574 | 4.29k | ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 4), |
575 | 4.29k | ps_cur_mb_info->u1_tran_form8x8); |
576 | 4.29k | pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data; |
577 | 4.29k | pu1_temp += 8; |
578 | 4.29k | ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp; |
579 | 4.29k | } |
580 | | /*--------------------------------------------------------------------*/ |
581 | | /* Read the IntraPrediction mode for CHROMA */ |
582 | | /*--------------------------------------------------------------------*/ |
583 | | /* Inlined ih264d_uev */ |
584 | 7.13k | { |
585 | 7.13k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
586 | 7.13k | UWORD32 u4_word, u4_ldz, u4_temp; |
587 | | |
588 | | /***************************************************************/ |
589 | | /* Find leading zeros in next 32 bits */ |
590 | | /***************************************************************/ |
591 | 7.13k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
592 | 7.13k | u4_ldz = CLZ(u4_word); |
593 | | /* Flush the ps_bitstrm */ |
594 | 7.13k | u4_bitstream_offset += (u4_ldz + 1); |
595 | | /* Read the suffix from the ps_bitstrm */ |
596 | 7.13k | u4_word = 0; |
597 | 7.13k | if(u4_ldz) |
598 | 2.42k | { |
599 | 2.42k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
600 | 2.42k | } |
601 | 7.13k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
602 | 7.13k | u4_temp = ((1 << u4_ldz) + u4_word - 1); |
603 | 7.13k | if(u4_temp > 3) |
604 | 240 | { |
605 | 240 | return ERROR_CHROMA_PRED_MODE; |
606 | 240 | } |
607 | 6.89k | ps_cur_mb_info->u1_chroma_pred_mode = u4_temp; |
608 | 6.89k | COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode); |
609 | 6.89k | } |
610 | | /*--------------------------------------------------------------------*/ |
611 | | /* Read the Coded block pattern */ |
612 | | /*--------------------------------------------------------------------*/ |
613 | 0 | { |
614 | 6.89k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
615 | 6.89k | UWORD32 u4_word, u4_ldz; |
616 | | |
617 | | /***************************************************************/ |
618 | | /* Find leading zeros in next 32 bits */ |
619 | | /***************************************************************/ |
620 | 6.89k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
621 | 6.89k | u4_ldz = CLZ(u4_word); |
622 | | /* Flush the ps_bitstrm */ |
623 | 6.89k | u4_bitstream_offset += (u4_ldz + 1); |
624 | | /* Read the suffix from the ps_bitstrm */ |
625 | 6.89k | u4_word = 0; |
626 | 6.89k | if(u4_ldz) |
627 | 2.36k | { |
628 | 2.36k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
629 | 2.36k | } |
630 | 6.89k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
631 | 6.89k | u4_cbp = ((1 << u4_ldz) + u4_word - 1); |
632 | 6.89k | } |
633 | 6.89k | if(u4_cbp > 47) |
634 | 139 | { |
635 | 139 | return ERROR_CBP; |
636 | 139 | } |
637 | | |
638 | 6.75k | u4_cbp = gau1_ih264d_cbp_table[u4_cbp][0]; |
639 | 6.75k | COPYTHECONTEXT("coded_block_pattern", u4_cbp); |
640 | 6.75k | ps_cur_mb_info->u1_cbp = u4_cbp; |
641 | | |
642 | | /*--------------------------------------------------------------------*/ |
643 | | /* Read mb_qp_delta */ |
644 | | /*--------------------------------------------------------------------*/ |
645 | 6.75k | if(ps_cur_mb_info->u1_cbp) |
646 | 6.29k | { |
647 | 6.29k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
648 | 6.29k | UWORD32 u4_word, u4_ldz, u4_abs_val; |
649 | | |
650 | | /***************************************************************/ |
651 | | /* Find leading zeros in next 32 bits */ |
652 | | /***************************************************************/ |
653 | 6.29k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
654 | 6.29k | u4_ldz = CLZ(u4_word); |
655 | | |
656 | | /* Flush the ps_bitstrm */ |
657 | 6.29k | u4_bitstream_offset += (u4_ldz + 1); |
658 | | |
659 | | /* Read the suffix from the ps_bitstrm */ |
660 | 6.29k | u4_word = 0; |
661 | 6.29k | if(u4_ldz) |
662 | 3.07k | { |
663 | 3.07k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
664 | 3.07k | } |
665 | | |
666 | 6.29k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
667 | 6.29k | u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; |
668 | | |
669 | 6.29k | if(u4_word & 0x1) |
670 | 1.60k | { |
671 | 1.60k | i4_delta_qp = (-(WORD32) u4_abs_val); |
672 | 1.60k | } |
673 | 4.69k | else |
674 | 4.69k | { |
675 | 4.69k | i4_delta_qp = (u4_abs_val); |
676 | 4.69k | } |
677 | | |
678 | 6.29k | if((i4_delta_qp < -26) || (i4_delta_qp > 25)) |
679 | 432 | { |
680 | 432 | return ERROR_INV_RANGE_QP_T; |
681 | 432 | } |
682 | | |
683 | 5.86k | COPYTHECONTEXT("mb_qp_delta", i1_delta_qp); |
684 | 5.86k | if(i4_delta_qp != 0) |
685 | 2.64k | { |
686 | 2.64k | ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp); |
687 | 2.64k | if(ret != OK) return ret; |
688 | 2.64k | } |
689 | 5.86k | } |
690 | 6.75k | } |
691 | 9.23k | else |
692 | 9.23k | { |
693 | 9.23k | u4_offset = 1; |
694 | 9.23k | ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB; |
695 | | /*-------------------------------------------------------------------*/ |
696 | | /* Read the IntraPrediction mode for CHROMA */ |
697 | | /*-------------------------------------------------------------------*/ |
698 | 9.23k | { |
699 | 9.23k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
700 | 9.23k | UWORD32 u4_word, u4_ldz; |
701 | | |
702 | | /***************************************************************/ |
703 | | /* Find leading zeros in next 32 bits */ |
704 | | /***************************************************************/ |
705 | 9.23k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
706 | 9.23k | u4_ldz = CLZ(u4_word); |
707 | | /* Flush the ps_bitstrm */ |
708 | 9.23k | u4_bitstream_offset += (u4_ldz + 1); |
709 | | /* Read the suffix from the ps_bitstrm */ |
710 | 9.23k | u4_word = 0; |
711 | 9.23k | if(u4_ldz) |
712 | 2.82k | { |
713 | 2.82k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
714 | 2.82k | } |
715 | 9.23k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
716 | 9.23k | u4_temp = ((1 << u4_ldz) + u4_word - 1); |
717 | | |
718 | | /* Inlined ih264d_uev */ |
719 | 9.23k | if(u4_temp > 3) |
720 | 648 | { |
721 | 648 | return ERROR_CHROMA_PRED_MODE; |
722 | 648 | } |
723 | 8.59k | ps_cur_mb_info->u1_chroma_pred_mode = u4_temp; |
724 | 8.59k | COPYTHECONTEXT("intra_chroma_pred_mode", ps_cur_mb_info->u1_chroma_pred_mode); |
725 | 8.59k | } |
726 | | /*-------------------------------------------------------------------*/ |
727 | | /* Read the Coded block pattern */ |
728 | | /*-------------------------------------------------------------------*/ |
729 | 0 | u4_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2]; |
730 | 8.59k | ps_cur_mb_info->u1_cbp = u4_cbp; |
731 | | |
732 | | /*-------------------------------------------------------------------*/ |
733 | | /* Read mb_qp_delta */ |
734 | | /*-------------------------------------------------------------------*/ |
735 | 8.59k | { |
736 | 8.59k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
737 | 8.59k | UWORD32 u4_word, u4_ldz, u4_abs_val; |
738 | | |
739 | | /***************************************************************/ |
740 | | /* Find leading zeros in next 32 bits */ |
741 | | /***************************************************************/ |
742 | 8.59k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
743 | 8.59k | u4_ldz = CLZ(u4_word); |
744 | | |
745 | | /* Flush the ps_bitstrm */ |
746 | 8.59k | u4_bitstream_offset += (u4_ldz + 1); |
747 | | |
748 | | /* Read the suffix from the ps_bitstrm */ |
749 | 8.59k | u4_word = 0; |
750 | 8.59k | if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
751 | | |
752 | 8.59k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
753 | 8.59k | u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; |
754 | | |
755 | 8.59k | if(u4_word & 0x1) |
756 | 1.40k | i4_delta_qp = (-(WORD32) u4_abs_val); |
757 | 7.18k | else |
758 | 7.18k | i4_delta_qp = (u4_abs_val); |
759 | | |
760 | 8.59k | if((i4_delta_qp < -26) || (i4_delta_qp > 25)) return ERROR_INV_RANGE_QP_T; |
761 | 8.59k | } |
762 | | /* inlinined ih264d_sev */ |
763 | 8.43k | COPYTHECONTEXT("Delta quant", i1_delta_qp); |
764 | | |
765 | 8.43k | if(i4_delta_qp != 0) |
766 | 3.46k | { |
767 | 3.46k | ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp); |
768 | 3.46k | if(ret != OK) return ret; |
769 | 3.46k | } |
770 | | |
771 | 8.43k | { |
772 | 8.43k | WORD16 i_scaleFactor; |
773 | 8.43k | UWORD32 ui_N = 0; |
774 | 8.43k | WORD16 *pi2_scale_matrix_ptr; |
775 | | /*******************************************************************/ |
776 | | /* for luma DC coefficients the scaling is done during the parsing */ |
777 | | /* to preserve the precision */ |
778 | | /*******************************************************************/ |
779 | 8.43k | if(ps_dec->s_high_profile.u1_scaling_present) |
780 | 3.39k | { |
781 | 3.39k | pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist4x4[0]; |
782 | 3.39k | } |
783 | 5.03k | else |
784 | 5.03k | { |
785 | 5.03k | i_scaleFactor = 16; |
786 | 5.03k | pi2_scale_matrix_ptr = &i_scaleFactor; |
787 | 5.03k | } |
788 | | |
789 | | /*---------------------------------------------------------------*/ |
790 | | /* Decode DC coefficients */ |
791 | | /*---------------------------------------------------------------*/ |
792 | | /*---------------------------------------------------------------*/ |
793 | | /* Calculation of N */ |
794 | | /*---------------------------------------------------------------*/ |
795 | 8.43k | if(ui_is_left_mb_available) |
796 | 5.49k | { |
797 | 5.49k | if(ui_is_top_mb_available) |
798 | 4.46k | { |
799 | 4.46k | ui_N = ((ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0] + |
800 | 4.46k | ps_dec->pu1_left_nnz_y[0] + 1) >> |
801 | 4.46k | 1); |
802 | 4.46k | } |
803 | 1.03k | else |
804 | 1.03k | { |
805 | 1.03k | ui_N = ps_dec->pu1_left_nnz_y[0]; |
806 | 1.03k | } |
807 | 5.49k | } |
808 | 2.93k | else if(ui_is_top_mb_available) |
809 | 2.04k | { |
810 | 2.04k | ui_N = ps_cur_mb_info->ps_top_mb->pu1_nnz_y[0]; |
811 | 2.04k | } |
812 | | |
813 | 8.43k | { |
814 | 8.43k | WORD16 pi2_dc_coef[16] = {0}; |
815 | 8.43k | WORD32 pi4_tmp[16] = {0}; |
816 | 8.43k | tu_sblk4x4_coeff_data_t *ps_tu_4x4 = |
817 | 8.43k | (tu_sblk4x4_coeff_data_t *) ps_dec->pv_parse_tu_coeff_data; |
818 | 8.43k | WORD16 *pi2_coeff_block = (WORD16 *) ps_dec->pv_parse_tu_coeff_data; |
819 | 8.43k | UWORD32 u4_num_coeff; |
820 | 8.43k | ps_tu_4x4->u2_sig_coeff_map = 0; |
821 | 8.43k | ret = ps_dec->pf_cavlc_parse4x4coeff[(ui_N > 7)](pi2_dc_coef, 0, ui_N, ps_dec, |
822 | 8.43k | &u4_num_coeff); |
823 | 8.43k | if(ret != OK) return ret; |
824 | | |
825 | 8.33k | if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T; |
826 | 8.24k | if(ps_tu_4x4->u2_sig_coeff_map) |
827 | 1.93k | { |
828 | 1.93k | memset(pi2_dc_coef, 0, sizeof(pi2_dc_coef)); |
829 | 1.93k | ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, pi2_dc_coef, |
830 | 1.93k | ps_dec->pu1_inv_scan); |
831 | | |
832 | 1.93k | PROFILE_DISABLE_IQ_IT_RECON() |
833 | 1.93k | ps_dec->pf_ihadamard_scaling_4x4( |
834 | 1.93k | pi2_dc_coef, pi2_coeff_block, ps_dec->pu2_quant_scale_y, |
835 | 1.93k | (UWORD16 *) pi2_scale_matrix_ptr, ps_dec->u1_qp_y_div6, pi4_tmp); |
836 | 1.93k | pi2_coeff_block += 16; |
837 | 1.93k | ps_dec->pv_parse_tu_coeff_data = (void *) pi2_coeff_block; |
838 | 1.93k | SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 0); |
839 | 1.93k | } |
840 | 8.24k | } |
841 | 8.24k | } |
842 | 8.24k | } |
843 | 16.3k | } |
844 | 201k | else |
845 | 201k | { |
846 | 201k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
847 | 201k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
848 | 201k | u4_offset = 0; |
849 | | /*--------------------------------------------------------------------*/ |
850 | | /* Read the Coded block pattern */ |
851 | | /*--------------------------------------------------------------------*/ |
852 | 201k | { |
853 | 201k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
854 | 201k | UWORD32 u4_word, u4_ldz; |
855 | | |
856 | | /***************************************************************/ |
857 | | /* Find leading zeros in next 32 bits */ |
858 | | /***************************************************************/ |
859 | 201k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
860 | 201k | u4_ldz = CLZ(u4_word); |
861 | | /* Flush the ps_bitstrm */ |
862 | 201k | u4_bitstream_offset += (u4_ldz + 1); |
863 | | /* Read the suffix from the ps_bitstrm */ |
864 | 201k | u4_word = 0; |
865 | 201k | if(u4_ldz) |
866 | 21.6k | { |
867 | 21.6k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
868 | 21.6k | } |
869 | 201k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
870 | 201k | u4_cbp = ((1 << u4_ldz) + u4_word - 1); |
871 | 201k | } |
872 | 201k | if(u4_cbp > 47) |
873 | 682 | { |
874 | 682 | return ERROR_CBP; |
875 | 682 | } |
876 | | |
877 | | /* inter cbp table to be used for base mode flag*/ |
878 | 201k | u4_cbp = gau1_ih264d_cbp_table[u4_cbp][1]; |
879 | 201k | COPYTHECONTEXT("coded_block_pattern", u4_cbp); |
880 | 201k | ps_cur_mb_info->u1_cbp = u4_cbp; |
881 | 201k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
882 | 201k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
883 | | |
884 | | /*--------------------------------------------------------------------*/ |
885 | | /* Read transform_size_8x8_flag if present */ |
886 | | /*--------------------------------------------------------------------*/ |
887 | 201k | if((ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) && (ps_cur_mb_info->u1_cbp & 0xf)) |
888 | 5.45k | { |
889 | 5.45k | ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm); |
890 | 5.45k | COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8); |
891 | 5.45k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8; |
892 | 5.45k | } |
893 | | /*--------------------------------------------------------------------*/ |
894 | | /* Read mb_qp_delta */ |
895 | | /*--------------------------------------------------------------------*/ |
896 | 201k | if(ps_cur_mb_info->u1_cbp) |
897 | 20.9k | { |
898 | 20.9k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
899 | 20.9k | UWORD32 u4_word, u4_ldz, u4_abs_val; |
900 | | |
901 | | /***************************************************************/ |
902 | | /* Find leading zeros in next 32 bits */ |
903 | | /***************************************************************/ |
904 | 20.9k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
905 | 20.9k | u4_ldz = CLZ(u4_word); |
906 | | |
907 | | /* Flush the ps_bitstrm */ |
908 | 20.9k | u4_bitstream_offset += (u4_ldz + 1); |
909 | | |
910 | | /* Read the suffix from the ps_bitstrm */ |
911 | 20.9k | u4_word = 0; |
912 | 20.9k | if(u4_ldz) |
913 | 8.52k | { |
914 | 8.52k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
915 | 8.52k | } |
916 | | |
917 | 20.9k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
918 | 20.9k | u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; |
919 | | |
920 | 20.9k | if(u4_word & 0x1) |
921 | 3.38k | { |
922 | 3.38k | i4_delta_qp = (-(WORD32) u4_abs_val); |
923 | 3.38k | } |
924 | 17.5k | else |
925 | 17.5k | { |
926 | 17.5k | i4_delta_qp = (u4_abs_val); |
927 | 17.5k | } |
928 | | |
929 | 20.9k | if((i4_delta_qp < -26) || (i4_delta_qp > 25)) |
930 | 443 | { |
931 | 443 | return ERROR_INV_RANGE_QP_T; |
932 | 443 | } |
933 | | |
934 | 20.4k | COPYTHECONTEXT("mb_qp_delta", i4_delta_qp); |
935 | 20.4k | if(i4_delta_qp != 0) |
936 | 8.08k | { |
937 | 8.08k | ret = ih264d_update_qp(ps_dec, (WORD8) i4_delta_qp); |
938 | 8.08k | if(ret != OK) return ret; |
939 | 8.08k | } |
940 | 20.4k | } |
941 | 201k | } |
942 | 215k | if(u4_cbp) |
943 | 26.7k | { |
944 | 26.7k | ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, (UWORD8) u4_offset); |
945 | 26.7k | if(ret != OK) return ret; |
946 | 25.8k | if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T; |
947 | | |
948 | | /* Store Left Mb NNZ and TOP chroma NNZ */ |
949 | 25.8k | } |
950 | 188k | else |
951 | 188k | { |
952 | 188k | ps_cur_mb_info->u1_qp_div6 = ps_dec->u1_qp_y_div6; |
953 | 188k | ps_cur_mb_info->u1_qpc_div6 = ps_dec->u1_qp_u_div6; |
954 | 188k | ps_cur_mb_info->u1_qpcr_div6 = ps_dec->u1_qp_v_div6; |
955 | 188k | ps_cur_mb_info->u1_qp_rem6 = ps_dec->u1_qp_y_rem6; |
956 | 188k | ps_cur_mb_info->u1_qpc_rem6 = ps_dec->u1_qp_u_rem6; |
957 | 188k | ps_cur_mb_info->u1_qpcr_rem6 = ps_dec->u1_qp_v_rem6; |
958 | 188k | ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); |
959 | 188k | } |
960 | | |
961 | 213k | return OK; |
962 | 215k | } |
963 | | |
964 | | /*! |
965 | | ************************************************************************** |
966 | | * \if Function name : ih264d_decode_eislice \endif |
967 | | * |
968 | | * \brief |
969 | | * Decodes an EI Slice |
970 | | * |
971 | | * |
972 | | * \return |
973 | | * 0 on Success and Error code otherwise |
974 | | ************************************************************************** |
975 | | */ |
976 | | WORD32 isvcd_parse_eislice(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD16 u2_first_mb_in_slice) |
977 | 6.16k | { |
978 | 6.16k | dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec; |
979 | 6.16k | WORD32 i_status = OK; |
980 | 6.16k | dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps; |
981 | 6.16k | dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice; |
982 | 6.16k | dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm; |
983 | 6.16k | dec_seq_params_t *ps_seq; |
984 | 6.16k | dec_svc_seq_params_t *ps_subset_seq; |
985 | 6.16k | dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL; |
986 | 6.16k | dec_subset_seq_params_t *ps_sps_svc_ext = NULL; |
987 | 6.16k | dec_nal_unit_svc_ext_params_t *ps_nal_svc_ext = NULL; |
988 | 6.16k | UWORD32 u4_temp; |
989 | 6.16k | WORD32 i_temp; |
990 | 6.16k | WORD32 ret; |
991 | 6.16k | UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer; |
992 | 6.16k | UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst; |
993 | | |
994 | 6.16k | ps_nal_svc_ext = ps_svc_lyr_dec->ps_nal_svc_ext; |
995 | 6.16k | ps_seq = ps_dec->ps_cur_sps; |
996 | 6.16k | ps_subset_seq = |
997 | 6.16k | &ps_svc_lyr_dec->ps_subset_sps[MAX_NUM_SEQ_PARAMS + ps_seq->u1_seq_parameter_set_id]; |
998 | 6.16k | ps_sps_svc_ext = &ps_subset_seq->s_sps_svc_ext; |
999 | 6.16k | ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params; |
1000 | | |
1001 | 6.16k | if(0 == ps_svc_lyr_dec->ps_nal_svc_ext->u1_quality_id) |
1002 | 6.16k | { |
1003 | | /*--------------------------------------------------------------------*/ |
1004 | | /* Read remaining contents of the slice header */ |
1005 | | /*--------------------------------------------------------------------*/ |
1006 | | /* dec_ref_pic_marking function */ |
1007 | | /* G050 */ |
1008 | 6.16k | if(ps_slice->u1_nal_ref_idc != 0) |
1009 | 6.07k | { |
1010 | 6.07k | if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read) |
1011 | 6.07k | { |
1012 | 6.07k | dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps; |
1013 | 6.07k | dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps; |
1014 | 6.07k | UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type; |
1015 | | |
1016 | 6.07k | ps_pps->ps_sps = ps_dec->ps_cur_sps; |
1017 | 6.07k | if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag) |
1018 | 4.27k | ps_dec->u1_nal_unit_type = IDR_SLICE_NAL; |
1019 | | |
1020 | 6.07k | i_temp = ih264d_read_mmco_commands(ps_dec); |
1021 | | |
1022 | 6.07k | ps_pps->ps_sps = ps_sps_tmp; |
1023 | 6.07k | ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp; |
1024 | 6.07k | if(i_temp < 0) |
1025 | 75 | { |
1026 | 75 | return ERROR_DBP_MANAGER_T; |
1027 | 75 | } |
1028 | 5.99k | ps_dec->u4_bitoffset = i_temp; |
1029 | 5.99k | } |
1030 | 1 | else |
1031 | 1 | ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset; |
1032 | | |
1033 | 6.00k | if(!ps_sps_svc_ext->u1_slice_header_restriction_flag) |
1034 | 4.30k | { |
1035 | 4.30k | ps_svc_slice_params->u1_store_ref_base_pic_flag = ih264d_get_bit_h264(ps_bitstrm); |
1036 | 4.30k | COPYTHECONTEXT("SPS_SVC_EXT: u1_store_ref_base_pic_flag", |
1037 | 4.30k | ps_svc_slice_params->u1_store_ref_base_pic_flag); |
1038 | | |
1039 | 4.30k | if(0 != ps_svc_slice_params->u1_store_ref_base_pic_flag) |
1040 | 187 | { |
1041 | 187 | return NOT_OK; |
1042 | 187 | } |
1043 | 4.12k | if(((1 == ps_nal_svc_ext->u1_use_ref_base_pic_flag) || |
1044 | 4.12k | (1 == ps_svc_slice_params->u1_store_ref_base_pic_flag)) && |
1045 | 4.12k | (!ps_nal_svc_ext->u1_idr_flag)) |
1046 | 0 | { |
1047 | 0 | i_status = isvcd_dec_ref_base_pic_marking( |
1048 | 0 | &ps_svc_slice_params->s_ref_base_pic_marking_svc_ext, ps_bitstrm); |
1049 | 0 | if(i_status != OK) |
1050 | 0 | { |
1051 | 0 | return i_status; |
1052 | 0 | } |
1053 | 0 | } |
1054 | 4.12k | } |
1055 | 6.00k | } |
1056 | 6.16k | } |
1057 | | |
1058 | 5.89k | { |
1059 | | /* G050 */ |
1060 | | /* Read slice_qp_delta */ |
1061 | 5.89k | WORD64 i8_temp = |
1062 | 5.89k | (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
1063 | 5.89k | if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T; |
1064 | 5.58k | ps_slice->u1_slice_qp = (UWORD8) i8_temp; |
1065 | 5.58k | COPYTHECONTEXT("Slice Header SVC ext: slice_qp_delta", |
1066 | 5.58k | ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp); |
1067 | 5.58k | } |
1068 | | |
1069 | 5.58k | if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1) |
1070 | 3.27k | { |
1071 | 3.27k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
1072 | 3.27k | COPYTHECONTEXT("Slice Header SVC ext: disable_deblocking_filter_idc", u4_temp); |
1073 | | |
1074 | 3.27k | if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED) |
1075 | 183 | { |
1076 | 183 | return ERROR_INV_SLICE_HDR_T; |
1077 | 183 | } |
1078 | 3.09k | ps_slice->u1_disable_dblk_filter_idc = u4_temp; |
1079 | 3.09k | if(u4_temp != 1) |
1080 | 2.71k | { |
1081 | 2.71k | i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1; |
1082 | 2.71k | if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) |
1083 | 180 | { |
1084 | 180 | return ERROR_INV_SLICE_HDR_T; |
1085 | 180 | } |
1086 | 2.53k | ps_slice->i1_slice_alpha_c0_offset = i_temp; |
1087 | 2.53k | COPYTHECONTEXT("Slice Header SVC ext: slice_alpha_c0_offset_div2", |
1088 | 2.53k | ps_slice->i1_slice_alpha_c0_offset >> 1); |
1089 | | |
1090 | 2.53k | i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1; |
1091 | 2.53k | if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) |
1092 | 169 | { |
1093 | 169 | return ERROR_INV_SLICE_HDR_T; |
1094 | 169 | } |
1095 | 2.36k | ps_slice->i1_slice_beta_offset = i_temp; |
1096 | 2.36k | COPYTHECONTEXT("Slice Header SVC ext: slice_beta_offset_div2", |
1097 | 2.36k | ps_slice->i1_slice_beta_offset >> 1); |
1098 | 2.36k | } |
1099 | 374 | else |
1100 | 374 | { |
1101 | 374 | ps_slice->i1_slice_alpha_c0_offset = 0; |
1102 | 374 | ps_slice->i1_slice_beta_offset = 0; |
1103 | 374 | } |
1104 | 3.09k | } |
1105 | 2.31k | else |
1106 | 2.31k | { |
1107 | 2.31k | ps_slice->u1_disable_dblk_filter_idc = 0; |
1108 | 2.31k | ps_slice->i1_slice_alpha_c0_offset = 0; |
1109 | 2.31k | ps_slice->i1_slice_beta_offset = 0; |
1110 | 2.31k | } |
1111 | | |
1112 | | /* add the remaining part of the code for svc extension from reference */ |
1113 | 5.05k | ret = isvcd_set_default_slice_header_ext(ps_svc_lyr_dec); |
1114 | 5.05k | if(ret != OK) |
1115 | 0 | { |
1116 | 0 | return ERROR_INV_SLICE_HDR_T; |
1117 | 0 | } |
1118 | | |
1119 | 5.05k | ret = isvcd_parse_slice_header(ps_svc_lyr_dec); |
1120 | 5.05k | if(ret != OK) |
1121 | 273 | { |
1122 | 273 | return ERROR_INV_SLICE_HDR_T; |
1123 | 273 | } |
1124 | | |
1125 | | /* Initialization to check if number of motion vector per 2 Mbs */ |
1126 | | /* are exceeding the range or not */ |
1127 | 4.77k | ps_dec->u2_mv_2mb[0] = 0; |
1128 | 4.77k | ps_dec->u2_mv_2mb[1] = 0; |
1129 | | |
1130 | | /*set slice header cone to 2 ,to indicate correct header*/ |
1131 | 4.77k | ps_dec->u1_slice_header_done = 2; |
1132 | | |
1133 | 4.77k | if(!ps_svc_slice_params->u1_slice_skip_flag) |
1134 | 4.56k | { |
1135 | 4.56k | if(ps_pps->u1_entropy_coding_mode) |
1136 | 1.24k | { |
1137 | 1.24k | SWITCHOFFTRACE; |
1138 | 1.24k | SWITCHONTRACECABAC; |
1139 | 1.24k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
1140 | 0 | { |
1141 | 0 | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff; |
1142 | 0 | } |
1143 | 1.24k | else |
1144 | 1.24k | ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff; |
1145 | | |
1146 | 1.24k | ret = isvcd_parse_eislice_data_cabac(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice); |
1147 | 1.24k | if(ret != OK) return ret; |
1148 | 428 | SWITCHONTRACE; |
1149 | 428 | SWITCHOFFTRACECABAC; |
1150 | 428 | } |
1151 | 3.32k | else |
1152 | 3.32k | { |
1153 | 3.32k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
1154 | 0 | { |
1155 | 0 | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff; |
1156 | 0 | } |
1157 | 3.32k | else |
1158 | 3.32k | ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff; |
1159 | 3.32k | ret = isvcd_parse_eislice_data_cavlc(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice); |
1160 | 3.32k | if(ret != OK) return ret; |
1161 | 3.32k | } |
1162 | 4.56k | } |
1163 | 212 | else |
1164 | 212 | { |
1165 | 212 | return ERROR_FEATURE_UNAVAIL; |
1166 | 212 | } |
1167 | | |
1168 | 1.82k | return OK; |
1169 | 4.77k | } |
1170 | | |
1171 | | /*****************************************************************************/ |
1172 | | /* */ |
1173 | | /* Function Name : isvcd_parse_eislice_data_cabac */ |
1174 | | /* */ |
1175 | | /* Description : This function parses cabac syntax of a inter slice on */ |
1176 | | /* N MB basis. */ |
1177 | | /* */ |
1178 | | /* Inputs : ps_dec */ |
1179 | | /* sliceparams */ |
1180 | | /* firstMbInSlice */ |
1181 | | /* */ |
1182 | | /* Processing : 1. After parsing syntax for N MBs those N MBs are */ |
1183 | | /* decoded till the end of slice. */ |
1184 | | /* */ |
1185 | | /* Returns : 0 */ |
1186 | | /* */ |
1187 | | /* Issues : <List any issues or problems with this function> */ |
1188 | | /* */ |
1189 | | /* Revision History: */ |
1190 | | /* */ |
1191 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1192 | | /* 24 06 2005 Kishore Draft */ |
1193 | | /* */ |
1194 | | /*****************************************************************************/ |
1195 | | WORD32 isvcd_parse_eislice_data_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec, |
1196 | | dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice) |
1197 | 1.24k | { |
1198 | 1.24k | dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec; |
1199 | 1.24k | UWORD8 uc_more_data_flag; |
1200 | 1.24k | UWORD8 u1_num_mbs, u1_mb_idx; |
1201 | 1.24k | dec_mb_info_t *ps_cur_mb_info; |
1202 | 1.24k | dec_svc_mb_info_t *ps_svc_cur_mb_info; |
1203 | 1.24k | deblk_mb_t *ps_cur_deblk_mb; |
1204 | 1.24k | dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm; |
1205 | 1.24k | UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; |
1206 | 1.24k | WORD16 i2_cur_mb_addr; |
1207 | 1.24k | UWORD8 u1_mbaff; |
1208 | 1.24k | UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb; |
1209 | 1.24k | WORD32 ret = OK; |
1210 | 1.24k | decoding_envirnoment_t *ps_cab_env; |
1211 | 1.24k | UWORD8 *pu1_cur_svc_base_mode_flag; |
1212 | 1.24k | UWORD8 u1_left_svc_base_mode_flag; |
1213 | 1.24k | UWORD8 u1_top_svc_base_mode_flag; |
1214 | 1.24k | UWORD32 u4_a, u4_b, u4_ctxt_inc; |
1215 | 1.24k | dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL; |
1216 | | |
1217 | 1.24k | ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params; |
1218 | 1.24k | ps_dec->u1_qp = ps_slice->u1_slice_qp; |
1219 | 1.24k | ih264d_update_qp(ps_dec, 0); |
1220 | 1.24k | u1_mbaff = ps_slice->u1_mbaff_frame_flag; |
1221 | | |
1222 | 1.24k | if(ps_bitstrm->u4_ofst & 0x07) |
1223 | 952 | { |
1224 | 952 | ps_bitstrm->u4_ofst += 8; |
1225 | 952 | ps_bitstrm->u4_ofst &= 0xFFFFFFF8; |
1226 | 952 | } |
1227 | 1.24k | ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm); |
1228 | 1.24k | if(ret != OK) return ret; |
1229 | 1.13k | isvcd_init_cabac_contexts(I_SLICE, ps_dec); |
1230 | 1.13k | ps_dec->i1_prev_mb_qp_delta = 0; |
1231 | 1.13k | ps_cab_env = &ps_dec->s_cab_dec_env; |
1232 | | /* initializations */ |
1233 | 1.13k | u1_mb_idx = ps_dec->u4_mb_idx; |
1234 | 1.13k | u1_num_mbs = u1_mb_idx; |
1235 | 1.13k | uc_more_data_flag = 1; |
1236 | 1.13k | i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff; |
1237 | 1.13k | do |
1238 | 20.3k | { |
1239 | 20.3k | UWORD16 u2_mbx; |
1240 | 20.3k | ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; |
1241 | 20.3k | if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr) |
1242 | 348 | { |
1243 | 348 | break; |
1244 | 348 | } |
1245 | | |
1246 | 19.9k | { |
1247 | 19.9k | UWORD8 u1_mb_type; |
1248 | 19.9k | ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; |
1249 | 19.9k | ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs; |
1250 | 19.9k | ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; |
1251 | 19.9k | ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); |
1252 | 19.9k | ps_cur_mb_info->u1_end_of_slice = 0; |
1253 | | /***************************************************************/ |
1254 | | /* Get the required information for decoding of MB */ |
1255 | | /* mb_x, mb_y , neighbour availablity, */ |
1256 | | /***************************************************************/ |
1257 | 19.9k | ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0); |
1258 | 19.9k | u2_mbx = ps_dec->u2_mbx; |
1259 | 19.9k | ps_svc_cur_mb_info->u1_crop_window_flag = |
1260 | 19.9k | *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx + |
1261 | 19.9k | (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs)); |
1262 | | /*********************************************************************/ |
1263 | | /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */ |
1264 | | /*********************************************************************/ |
1265 | 19.9k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
1266 | 19.9k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
1267 | | /***************************************************************/ |
1268 | | /* Set the deblocking parameters for this MB */ |
1269 | | /***************************************************************/ |
1270 | 19.9k | ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; |
1271 | 19.9k | if(ps_dec->u4_app_disable_deblk_frm == 0) |
1272 | 19.9k | ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, |
1273 | 19.9k | ps_dec->u1_mb_ngbr_availablity, |
1274 | 19.9k | ps_dec->u1_cur_mb_fld_dec_flag); |
1275 | | |
1276 | 19.9k | ps_svc_cur_mb_info->u1_base_mode_flag = 0; |
1277 | | /* Macroblock Layer Begins */ |
1278 | 19.9k | if(ps_svc_cur_mb_info->u1_crop_window_flag && |
1279 | 19.9k | ps_svc_slice_params->u1_adaptive_base_mode_flag) |
1280 | 14.7k | { |
1281 | 14.7k | pu1_cur_svc_base_mode_flag = |
1282 | 14.7k | ps_svc_lyr_dec->pu1_svc_base_mode_flag + ps_cur_mb_info->u2_mbx; |
1283 | 14.7k | pu1_cur_svc_base_mode_flag += |
1284 | 14.7k | ps_cur_mb_info->u2_mby * ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride; |
1285 | | |
1286 | 14.7k | u1_left_svc_base_mode_flag = 0; |
1287 | 14.7k | if(ps_dec->u1_mb_ngbr_availablity & LEFT_MB_AVAILABLE_MASK) |
1288 | 10.8k | u1_left_svc_base_mode_flag = *(pu1_cur_svc_base_mode_flag - 1); |
1289 | | |
1290 | 14.7k | u1_top_svc_base_mode_flag = 0; |
1291 | 14.7k | if(ps_dec->u1_mb_ngbr_availablity & TOP_MB_AVAILABLE_MASK) |
1292 | 12.0k | u1_top_svc_base_mode_flag = |
1293 | 12.0k | *(pu1_cur_svc_base_mode_flag - |
1294 | 12.0k | ps_svc_lyr_dec->i4_frm_svc_base_mode_cabac_stride); |
1295 | | |
1296 | 14.7k | u4_a = 1; |
1297 | 14.7k | u4_b = 1; |
1298 | | |
1299 | 14.7k | if(u1_top_svc_base_mode_flag) |
1300 | 9.20k | { |
1301 | 9.20k | u4_a = 0; |
1302 | 9.20k | } |
1303 | | |
1304 | 14.7k | if(u1_left_svc_base_mode_flag) |
1305 | 8.24k | { |
1306 | 8.24k | u4_b = 0; |
1307 | 8.24k | } |
1308 | | |
1309 | 14.7k | u4_ctxt_inc = u4_a + u4_b; |
1310 | 14.7k | ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_decode_bin( |
1311 | 14.7k | u4_ctxt_inc, ps_svc_lyr_dec->ps_base_mode_flag, ps_bitstrm, ps_cab_env); |
1312 | 14.7k | COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag); |
1313 | 14.7k | *pu1_cur_svc_base_mode_flag = ps_svc_cur_mb_info->u1_base_mode_flag; |
1314 | 14.7k | } |
1315 | 5.17k | else if(ps_svc_cur_mb_info->u1_crop_window_flag) |
1316 | 4.97k | { |
1317 | 4.97k | ps_svc_cur_mb_info->u1_base_mode_flag = |
1318 | 4.97k | ps_svc_slice_params->u1_default_base_mode_flag; |
1319 | 4.97k | } |
1320 | | |
1321 | 19.9k | if(!ps_svc_cur_mb_info->u1_base_mode_flag) |
1322 | 8.19k | { |
1323 | | /* Decode the u1_mb_type */ |
1324 | 8.19k | u1_mb_type = ih264d_parse_mb_type_intra_cabac(0, ps_dec); |
1325 | 8.19k | if(u1_mb_type > 25) return ERROR_MB_TYPE; |
1326 | 8.19k | ps_cur_mb_info->u1_mb_type = u1_mb_type; |
1327 | 8.19k | COPYTHECONTEXT("u1_mb_type", u1_mb_type); |
1328 | 8.19k | ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB; |
1329 | 8.19k | } |
1330 | 11.7k | else |
1331 | 11.7k | { |
1332 | 11.7k | ps_cur_mb_info->u1_mb_type = MB_INFER; |
1333 | 11.7k | ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_IBL; |
1334 | 11.7k | } |
1335 | | /* Parse Macroblock Data */ |
1336 | 19.9k | u1_mb_type = ps_cur_mb_info->u1_mb_type; |
1337 | 19.9k | if(25 == u1_mb_type) |
1338 | 154 | { |
1339 | | /* I_PCM_MB */ |
1340 | 154 | ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB; |
1341 | 154 | ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs); |
1342 | 154 | if(ret != OK) return ret; |
1343 | 66 | ps_cur_deblk_mb->u1_mb_qp = 0; |
1344 | 66 | } |
1345 | 19.8k | else |
1346 | 19.8k | { |
1347 | 19.8k | ret = isvcd_parse_imb_cabac(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info, |
1348 | 19.8k | u1_mb_type); |
1349 | 19.8k | if(ret != OK) return ret; |
1350 | 19.1k | ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; |
1351 | 19.1k | } |
1352 | | |
1353 | 19.2k | if(ps_dec->u1_enable_mb_info) |
1354 | 0 | { |
1355 | 0 | ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1, |
1356 | 0 | ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp); |
1357 | 0 | } |
1358 | 19.2k | if(u1_mbaff) |
1359 | 0 | { |
1360 | 0 | ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); |
1361 | 0 | } |
1362 | | |
1363 | 19.2k | if(ps_cur_mb_info->u1_topmb && u1_mbaff) |
1364 | 0 | uc_more_data_flag = 1; |
1365 | 19.2k | else |
1366 | 19.2k | { |
1367 | 19.2k | uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, ps_bitstrm); |
1368 | 19.2k | uc_more_data_flag = !uc_more_data_flag; |
1369 | 19.2k | COPYTHECONTEXT("Decode Sliceterm", !uc_more_data_flag); |
1370 | 19.2k | } |
1371 | | |
1372 | 19.2k | if(u1_mbaff) |
1373 | 0 | { |
1374 | 0 | if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1))) |
1375 | 0 | { |
1376 | 0 | return ERROR_EOB_FLUSHBITS_T; |
1377 | 0 | } |
1378 | 0 | } |
1379 | | /* Next macroblock information */ |
1380 | 19.2k | i2_cur_mb_addr++; |
1381 | | /* Store the colocated information */ |
1382 | 19.2k | { |
1383 | 19.2k | mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4); |
1384 | 19.2k | mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0}; |
1385 | 19.2k | if(ps_mv_nmb_start) |
1386 | 19.2k | { |
1387 | 19.2k | ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0, |
1388 | 19.2k | (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4); |
1389 | 19.2k | } |
1390 | 0 | else |
1391 | 0 | { |
1392 | 0 | return NOT_OK; |
1393 | 0 | } |
1394 | 19.2k | } |
1395 | | |
1396 | 19.2k | u1_num_mbs++; |
1397 | 19.2k | } |
1398 | | |
1399 | | /****************************************************************/ |
1400 | | /* Check for End Of Row */ |
1401 | | /****************************************************************/ |
1402 | 0 | u1_num_mbs_next = i2_pic_wdin_mbs - u2_mbx - 1; |
1403 | 19.2k | u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); |
1404 | 19.2k | u1_tfr_n_mb = |
1405 | 19.2k | (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag); |
1406 | 19.2k | ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag); |
1407 | | |
1408 | 19.2k | if(u1_tfr_n_mb || (!uc_more_data_flag)) |
1409 | 4.63k | { |
1410 | 4.63k | if(ps_dec->u1_separate_parse) |
1411 | 1.66k | { |
1412 | 1.66k | ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb, |
1413 | 1.66k | u1_end_of_row); |
1414 | 1.66k | ps_dec->ps_nmb_info += u1_num_mbs; |
1415 | 1.66k | ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs; |
1416 | 1.66k | } |
1417 | 2.97k | else |
1418 | 2.97k | { |
1419 | 2.97k | ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs, |
1420 | 2.97k | u1_num_mbs_next, u1_tfr_n_mb, |
1421 | 2.97k | u1_end_of_row); |
1422 | 2.97k | if(ret != OK) return ret; |
1423 | 2.97k | } |
1424 | 4.63k | ps_dec->u4_total_mbs_coded += u1_num_mbs; |
1425 | 4.63k | if(u1_tfr_n_mb) u1_num_mbs = 0; |
1426 | 4.63k | u1_mb_idx = u1_num_mbs; |
1427 | 4.63k | ps_dec->u4_mb_idx = u1_num_mbs; |
1428 | 4.63k | } |
1429 | 19.2k | } while(uc_more_data_flag); |
1430 | | |
1431 | 428 | ps_dec->u4_num_mbs_cur_nmb = 0; |
1432 | 428 | ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff); |
1433 | | |
1434 | 428 | return ret; |
1435 | 1.13k | } |
1436 | | |
1437 | | /*****************************************************************************/ |
1438 | | /* */ |
1439 | | /* Function Name : isvcd_parse_eislice_data_cavlc */ |
1440 | | /* */ |
1441 | | /* Description : This function parses cabac syntax of a inter slice on */ |
1442 | | /* N MB basis. */ |
1443 | | /* */ |
1444 | | /* Inputs : ps_dec */ |
1445 | | /* sliceparams */ |
1446 | | /* firstMbInSlice */ |
1447 | | /* */ |
1448 | | /* Processing : 1. After parsing syntax for N MBs those N MBs are */ |
1449 | | /* decoded till the end of slice. */ |
1450 | | /* */ |
1451 | | /* Returns : 0 */ |
1452 | | /* */ |
1453 | | /* Issues : <List any issues or problems with this function> */ |
1454 | | /* */ |
1455 | | /* Revision History: */ |
1456 | | /* */ |
1457 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1458 | | /* 24 06 2005 Kishore Draft */ |
1459 | | /* */ |
1460 | | /*****************************************************************************/ |
1461 | | WORD32 isvcd_parse_eislice_data_cavlc(svc_dec_lyr_struct_t *ps_svc_lyr_dec, |
1462 | | dec_slice_params_t *ps_slice, UWORD16 u2_first_mb_in_slice) |
1463 | 3.32k | { |
1464 | 3.32k | dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec; |
1465 | 3.32k | UWORD8 uc_more_data_flag; |
1466 | 3.32k | UWORD8 u1_num_mbs, u1_mb_idx; |
1467 | 3.32k | dec_mb_info_t *ps_cur_mb_info; |
1468 | 3.32k | dec_svc_mb_info_t *ps_svc_cur_mb_info; |
1469 | 3.32k | deblk_mb_t *ps_cur_deblk_mb; |
1470 | 3.32k | dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm; |
1471 | 3.32k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
1472 | 3.32k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
1473 | 3.32k | UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; |
1474 | 3.32k | WORD16 i2_cur_mb_addr; |
1475 | 3.32k | UWORD8 u1_mbaff; |
1476 | 3.32k | UWORD8 u1_num_mbs_next, u1_end_of_row, u1_tfr_n_mb; |
1477 | 3.32k | WORD32 ret = OK; |
1478 | 3.32k | dec_slice_svc_ext_params_t *ps_svc_slice_params = NULL; |
1479 | | |
1480 | 3.32k | ps_svc_slice_params = &ps_svc_lyr_dec->s_svc_slice_params; |
1481 | 3.32k | ps_dec->u1_qp = ps_slice->u1_slice_qp; |
1482 | 3.32k | ih264d_update_qp(ps_dec, 0); |
1483 | 3.32k | u1_mbaff = ps_slice->u1_mbaff_frame_flag; |
1484 | | |
1485 | 3.32k | u1_mb_idx = ps_dec->u4_mb_idx; |
1486 | 3.32k | u1_num_mbs = u1_mb_idx; |
1487 | 3.32k | uc_more_data_flag = 1; |
1488 | 3.32k | i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff; |
1489 | | |
1490 | 3.32k | do |
1491 | 76.1k | { |
1492 | 76.1k | UWORD8 u1_mb_type; |
1493 | 76.1k | ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; |
1494 | 76.1k | if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr) |
1495 | 1.08k | { |
1496 | 1.08k | break; |
1497 | 1.08k | } |
1498 | | |
1499 | 75.1k | ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; |
1500 | 75.1k | ps_svc_cur_mb_info = ps_svc_lyr_dec->ps_svc_nmb_info + u1_num_mbs; |
1501 | 75.1k | ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; |
1502 | 75.1k | ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); |
1503 | 75.1k | ps_cur_mb_info->u1_end_of_slice = 0; |
1504 | | /***************************************************************/ |
1505 | | /* Get the required information for decoding of MB */ |
1506 | | /* mb_x, mb_y , neighbour availablity, */ |
1507 | | /***************************************************************/ |
1508 | 75.1k | ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 0); |
1509 | 75.1k | ps_svc_cur_mb_info->u1_crop_window_flag = |
1510 | 75.1k | *(ps_svc_lyr_dec->pu1_crop_wnd_flag + ps_cur_mb_info->u2_mbx + |
1511 | 75.1k | (ps_cur_mb_info->u2_mby * ps_dec->u2_frm_wd_in_mbs)); |
1512 | | |
1513 | | /***************************************************************/ |
1514 | | /* Set the deblocking parameters for this MB */ |
1515 | | /***************************************************************/ |
1516 | 75.1k | ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; |
1517 | 75.1k | if(ps_dec->u4_app_disable_deblk_frm == 0) |
1518 | 75.1k | ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, |
1519 | 75.1k | ps_dec->u1_mb_ngbr_availablity, |
1520 | 75.1k | ps_dec->u1_cur_mb_fld_dec_flag); |
1521 | | |
1522 | 75.1k | ps_svc_cur_mb_info->u1_base_mode_flag = 0; |
1523 | 75.1k | if(ps_svc_cur_mb_info->u1_crop_window_flag && |
1524 | 75.1k | ps_svc_slice_params->u1_adaptive_base_mode_flag) |
1525 | 47.0k | { |
1526 | 47.0k | ps_svc_cur_mb_info->u1_base_mode_flag = ih264d_get_bit_h264(ps_bitstrm); |
1527 | 47.0k | COPYTHECONTEXT("SVC ext: u1_base_mode_flag", ps_cur_mb_info->u1_base_mode_flag); |
1528 | 47.0k | } |
1529 | 28.0k | else if(ps_svc_cur_mb_info->u1_crop_window_flag) |
1530 | 27.8k | { |
1531 | 27.8k | ps_svc_cur_mb_info->u1_base_mode_flag = ps_svc_slice_params->u1_default_base_mode_flag; |
1532 | 27.8k | } |
1533 | | |
1534 | | /**************************************************************/ |
1535 | | /* Macroblock Layer Begins, Decode the u1_mb_type */ |
1536 | | /**************************************************************/ |
1537 | 75.1k | if(!ps_svc_cur_mb_info->u1_base_mode_flag) /* Inlined ih264d_uev */ |
1538 | 14.7k | { |
1539 | 14.7k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
1540 | 14.7k | UWORD32 u4_word, u4_ldz, u4_temp; |
1541 | | |
1542 | | /***************************************************************/ |
1543 | | /* Find leading zeros in next 32 bits */ |
1544 | | /***************************************************************/ |
1545 | 14.7k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
1546 | 14.7k | u4_ldz = CLZ(u4_word); |
1547 | | /* Flush the ps_bitstrm */ |
1548 | 14.7k | u4_bitstream_offset += (u4_ldz + 1); |
1549 | | /* Read the suffix from the ps_bitstrm */ |
1550 | 14.7k | u4_word = 0; |
1551 | 14.7k | if(u4_ldz) GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
1552 | 14.7k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
1553 | 14.7k | u4_temp = ((1 << u4_ldz) + u4_word - 1); |
1554 | 14.7k | if(u4_temp > 25) return ERROR_MB_TYPE; |
1555 | 14.5k | u1_mb_type = u4_temp; |
1556 | | |
1557 | | /* Inlined ih264d_uev */ |
1558 | 14.5k | ps_cur_mb_info->u1_mb_type = u1_mb_type; |
1559 | 14.5k | COPYTHECONTEXT("u1_mb_type", u1_mb_type); |
1560 | | |
1561 | 14.5k | ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_MB; |
1562 | 14.5k | } |
1563 | 60.3k | else |
1564 | 60.3k | { |
1565 | 60.3k | ps_cur_mb_info->u1_mb_type = MB_INFER; |
1566 | 60.3k | ps_cur_deblk_mb->u1_mb_type = ps_cur_deblk_mb->u1_mb_type | D_INTRA_IBL; |
1567 | 60.3k | } |
1568 | | |
1569 | | /**************************************************************/ |
1570 | | /* Parse Macroblock data */ |
1571 | | /**************************************************************/ |
1572 | 74.8k | u1_mb_type = ps_cur_mb_info->u1_mb_type; |
1573 | 74.8k | if(25 == u1_mb_type) |
1574 | 75 | { |
1575 | | /* I_PCM_MB */ |
1576 | 75 | ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB; |
1577 | 75 | ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs); |
1578 | 75 | if(ret != OK) return ret; |
1579 | 75 | ps_cur_deblk_mb->u1_mb_qp = 0; |
1580 | 75 | } |
1581 | 74.8k | else |
1582 | 74.8k | { |
1583 | 74.8k | ret = isvcd_parse_imb_cavlc(ps_svc_lyr_dec, ps_cur_mb_info, ps_svc_cur_mb_info, |
1584 | 74.8k | u1_num_mbs, u1_mb_type); |
1585 | 74.8k | if(ret != OK) return ret; |
1586 | 73.0k | ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; |
1587 | 73.0k | } |
1588 | | |
1589 | 73.1k | if(ps_dec->u1_enable_mb_info) |
1590 | 0 | { |
1591 | 0 | ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1, |
1592 | 0 | ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp); |
1593 | 0 | } |
1594 | 73.1k | uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm); |
1595 | | |
1596 | 73.1k | if(u1_mbaff) |
1597 | 0 | { |
1598 | 0 | ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); |
1599 | 0 | if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1))) |
1600 | 0 | { |
1601 | 0 | return ERROR_EOB_FLUSHBITS_T; |
1602 | 0 | } |
1603 | 0 | } |
1604 | | /**************************************************************/ |
1605 | | /* Get next Macroblock address */ |
1606 | | /**************************************************************/ |
1607 | 73.1k | i2_cur_mb_addr++; |
1608 | | /* Store the colocated information */ |
1609 | 73.1k | { |
1610 | 73.1k | mv_pred_t *ps_mv_nmb_start = ps_dec->ps_mv_cur + (u1_num_mbs << 4); |
1611 | 73.1k | mv_pred_t s_mvPred = {{0, 0, 0, 0}, {-1, -1}, 0, 0}; |
1612 | 73.1k | if(ps_mv_nmb_start) |
1613 | 73.1k | { |
1614 | 73.1k | ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0, |
1615 | 73.1k | (UWORD8) (ps_dec->u1_cur_mb_fld_dec_flag << 1), 4, 4); |
1616 | 73.1k | } |
1617 | 0 | else |
1618 | 0 | { |
1619 | 0 | return NOT_OK; |
1620 | 0 | } |
1621 | 73.1k | } |
1622 | 73.1k | u1_num_mbs++; |
1623 | | |
1624 | | /****************************************************************/ |
1625 | | /* Check for End Of Row */ |
1626 | | /****************************************************************/ |
1627 | 73.1k | u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; |
1628 | 73.1k | u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); |
1629 | 73.1k | u1_tfr_n_mb = |
1630 | 73.1k | (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row || (!uc_more_data_flag); |
1631 | 73.1k | ps_cur_mb_info->u1_end_of_slice = (!uc_more_data_flag); |
1632 | | |
1633 | 73.1k | if(u1_tfr_n_mb || (!uc_more_data_flag)) |
1634 | 20.4k | { |
1635 | 20.4k | if(ps_dec->u1_separate_parse) |
1636 | 13.4k | { |
1637 | 13.4k | ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, u1_tfr_n_mb, |
1638 | 13.4k | u1_end_of_row); |
1639 | 13.4k | ps_dec->ps_nmb_info += u1_num_mbs; |
1640 | 13.4k | ps_svc_lyr_dec->ps_svc_nmb_info += u1_num_mbs; |
1641 | 13.4k | } |
1642 | 6.98k | else |
1643 | 6.98k | { |
1644 | 6.98k | ret = isvcd_decode_recon_tfr_nmb_non_base_lyr(ps_svc_lyr_dec, u1_mb_idx, u1_num_mbs, |
1645 | 6.98k | u1_num_mbs_next, u1_tfr_n_mb, |
1646 | 6.98k | u1_end_of_row); |
1647 | 6.98k | if(ret != OK) return ret; |
1648 | 6.98k | } |
1649 | 20.4k | ps_dec->u4_total_mbs_coded += u1_num_mbs; |
1650 | 20.4k | if(u1_tfr_n_mb) u1_num_mbs = 0; |
1651 | 20.4k | u1_mb_idx = u1_num_mbs; |
1652 | 20.4k | ps_dec->u4_mb_idx = u1_num_mbs; |
1653 | 20.4k | } |
1654 | 73.1k | } while(uc_more_data_flag); |
1655 | | |
1656 | 1.40k | ps_dec->u4_num_mbs_cur_nmb = 0; |
1657 | 1.40k | ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr - (u2_first_mb_in_slice << u1_mbaff); |
1658 | | |
1659 | 1.40k | return ret; |
1660 | 3.32k | } |
1661 | | |
1662 | | /*! |
1663 | | ************************************************************************** |
1664 | | * \if Function name : ParseIMbCab \endif |
1665 | | * |
1666 | | * \brief |
1667 | | * This function parses CABAC syntax of a I MB. If 16x16 Luma DC transform |
1668 | | * is also done here. Transformed Luma DC values are copied in their |
1669 | | * 0th pixel location of corrosponding CoeffBlock. |
1670 | | * |
1671 | | * \return |
1672 | | * 0 on Success and Error code otherwise |
1673 | | ************************************************************************** |
1674 | | */ |
1675 | | WORD32 isvcd_parse_imb_cabac(svc_dec_lyr_struct_t *ps_svc_lyr_dec, dec_mb_info_t *ps_cur_mb_info, |
1676 | | dec_svc_mb_info_t *ps_svc_cur_mb_info, UWORD8 u1_mb_type) |
1677 | 47.2k | { |
1678 | 47.2k | dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec; |
1679 | 47.2k | WORD8 i1_delta_qp; |
1680 | 47.2k | UWORD8 u1_cbp; |
1681 | 47.2k | UWORD8 u1_offset; |
1682 | | /* Variables for handling Cabac contexts */ |
1683 | 47.2k | ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info; |
1684 | 47.2k | ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
1685 | 47.2k | dec_bit_stream_t *const ps_bitstrm = ps_dec->ps_bitstrm; |
1686 | 47.2k | bin_ctxt_model_t *p_bin_ctxt; |
1687 | 47.2k | UWORD8 u1_intra_chrom_pred_mode; |
1688 | 47.2k | UWORD8 u1_dc_block_flag = 0; |
1689 | 47.2k | WORD32 ret; |
1690 | | |
1691 | 47.2k | ps_cur_mb_info->u1_yuv_dc_block_flag = 0; |
1692 | | |
1693 | 47.2k | if(ps_left_ctxt == ps_dec->ps_def_ctxt_mb_info) |
1694 | 11.9k | { |
1695 | 11.9k | ps_dec->pu1_left_yuv_dc_csbp[0] = 0xf; |
1696 | 11.9k | } |
1697 | | |
1698 | 47.2k | if(ps_dec->ps_cur_slice->u1_slice_type != I_SLICE) |
1699 | 27.4k | { |
1700 | 27.4k | MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0); |
1701 | 27.4k | *((UWORD32 *) ps_dec->pi1_left_ref_idx_ctxt_inc) = 0; |
1702 | 27.4k | MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0); |
1703 | 27.4k | memset(p_curr_ctxt->i1_ref_idx, 0, 4); |
1704 | 27.4k | } |
1705 | | |
1706 | | /* default */ |
1707 | 47.2k | ps_cur_mb_info->ps_curmb->u1_mb_type = P_MB; |
1708 | 47.2k | if(!ps_svc_cur_mb_info->u1_base_mode_flag) |
1709 | 10.3k | { |
1710 | 10.3k | if(u1_mb_type == I_4x4_MB) |
1711 | 5.37k | { |
1712 | 5.37k | ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB; |
1713 | 5.37k | p_curr_ctxt->u1_mb_type = CAB_I4x4; |
1714 | 5.37k | u1_offset = 0; |
1715 | 5.37k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
1716 | 5.37k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
1717 | | /*--------------------------------------------------------------------*/ |
1718 | | /* Read transform_size_8x8_flag if present */ |
1719 | | /*--------------------------------------------------------------------*/ |
1720 | 5.37k | if(ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) |
1721 | 4.72k | { |
1722 | 4.72k | ps_cur_mb_info->u1_tran_form8x8 = |
1723 | 4.72k | ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info); |
1724 | 4.72k | COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8); |
1725 | 4.72k | p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8; |
1726 | 4.72k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8; |
1727 | 4.72k | } |
1728 | 651 | else |
1729 | 651 | { |
1730 | 651 | p_curr_ctxt->u1_transform8x8_ctxt = 0; |
1731 | 651 | } |
1732 | | |
1733 | | /*--------------------------------------------------------------------*/ |
1734 | | /* Read the IntraPrediction modes for LUMA */ |
1735 | | /*--------------------------------------------------------------------*/ |
1736 | 5.37k | if(!ps_cur_mb_info->u1_tran_form8x8) |
1737 | 1.16k | { |
1738 | 1.16k | UWORD8 *pu1_temp; |
1739 | 1.16k | ih264d_read_intra_pred_modes_cabac(ps_dec, |
1740 | 1.16k | ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data), |
1741 | 1.16k | ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 16), |
1742 | 1.16k | ps_cur_mb_info->u1_tran_form8x8); |
1743 | 1.16k | pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data; |
1744 | 1.16k | pu1_temp += 32; |
1745 | 1.16k | ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp; |
1746 | 1.16k | } |
1747 | 4.20k | else |
1748 | 4.20k | { |
1749 | 4.20k | UWORD8 *pu1_temp; |
1750 | 4.20k | ih264d_read_intra_pred_modes_cabac(ps_dec, |
1751 | 4.20k | ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data), |
1752 | 4.20k | ((UWORD8 *) ps_dec->pv_parse_tu_coeff_data + 4), |
1753 | 4.20k | ps_cur_mb_info->u1_tran_form8x8); |
1754 | 4.20k | pu1_temp = (UWORD8 *) ps_dec->pv_parse_tu_coeff_data; |
1755 | 4.20k | pu1_temp += 8; |
1756 | 4.20k | ps_dec->pv_parse_tu_coeff_data = (void *) pu1_temp; |
1757 | 4.20k | } |
1758 | | /*--------------------------------------------------------------------*/ |
1759 | | /* Read the IntraPrediction mode for CHROMA */ |
1760 | | /*--------------------------------------------------------------------*/ |
1761 | 5.37k | u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec); |
1762 | 5.37k | COPYTHECONTEXT("intra_chroma_pred_mode", u1_intra_chrom_pred_mode); |
1763 | 5.37k | p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode = |
1764 | 5.37k | u1_intra_chrom_pred_mode; |
1765 | | |
1766 | | /*--------------------------------------------------------------------*/ |
1767 | | /* Read the Coded block pattern */ |
1768 | | /*--------------------------------------------------------------------*/ |
1769 | 5.37k | u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec); |
1770 | 5.37k | COPYTHECONTEXT("coded_block_pattern", u1_cbp); |
1771 | 5.37k | ps_cur_mb_info->u1_cbp = u1_cbp; |
1772 | 5.37k | p_curr_ctxt->u1_cbp = u1_cbp; |
1773 | | |
1774 | | /*--------------------------------------------------------------------*/ |
1775 | | /* Read mb_qp_delta */ |
1776 | | /*--------------------------------------------------------------------*/ |
1777 | 5.37k | if(ps_cur_mb_info->u1_cbp) |
1778 | 4.23k | { |
1779 | 4.23k | ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp); |
1780 | 4.23k | if(ret != OK) return ret; |
1781 | 4.17k | COPYTHECONTEXT("mb_qp_delta", i1_delta_qp); |
1782 | 4.17k | if(i1_delta_qp != 0) |
1783 | 864 | { |
1784 | 864 | ret = ih264d_update_qp(ps_dec, i1_delta_qp); |
1785 | 864 | if(ret != OK) return ret; |
1786 | 864 | } |
1787 | 4.17k | } |
1788 | 1.13k | else |
1789 | 1.13k | ps_dec->i1_prev_mb_qp_delta = 0; |
1790 | 5.30k | p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE; |
1791 | 5.30k | } |
1792 | 4.97k | else |
1793 | 4.97k | { |
1794 | 4.97k | u1_offset = 1; |
1795 | 4.97k | ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB; |
1796 | 4.97k | p_curr_ctxt->u1_mb_type = CAB_I16x16; |
1797 | 4.97k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
1798 | 4.97k | p_curr_ctxt->u1_transform8x8_ctxt = 0; |
1799 | 4.97k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
1800 | | /*--------------------------------------------------------------------*/ |
1801 | | /* Read the IntraPrediction mode for CHROMA */ |
1802 | | /*--------------------------------------------------------------------*/ |
1803 | 4.97k | u1_intra_chrom_pred_mode = ih264d_parse_chroma_pred_mode_cabac(ps_dec); |
1804 | 4.97k | if(u1_intra_chrom_pred_mode > 3) return ERROR_CHROMA_PRED_MODE; |
1805 | | |
1806 | 4.97k | COPYTHECONTEXT("Chroma intra_chroma_pred_mode pred mode", u1_intra_chrom_pred_mode); |
1807 | 4.97k | p_curr_ctxt->u1_intra_chroma_pred_mode = ps_cur_mb_info->u1_chroma_pred_mode = |
1808 | 4.97k | u1_intra_chrom_pred_mode; |
1809 | | |
1810 | | /*--------------------------------------------------------------------*/ |
1811 | | /* Read the Coded block pattern */ |
1812 | | /*--------------------------------------------------------------------*/ |
1813 | 4.97k | u1_cbp = gau1_ih264d_cbp_tab[(u1_mb_type - 1) >> 2]; |
1814 | 4.97k | ps_cur_mb_info->u1_cbp = u1_cbp; |
1815 | 4.97k | p_curr_ctxt->u1_cbp = u1_cbp; |
1816 | | |
1817 | | /*--------------------------------------------------------------------*/ |
1818 | | /* Read mb_qp_delta */ |
1819 | | /*--------------------------------------------------------------------*/ |
1820 | 4.97k | ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp); |
1821 | 4.97k | if(ret != OK) return ret; |
1822 | 4.90k | COPYTHECONTEXT("mb_qp_delta", i1_delta_qp); |
1823 | 4.90k | if(i1_delta_qp != 0) |
1824 | 967 | { |
1825 | 967 | ret = ih264d_update_qp(ps_dec, i1_delta_qp); |
1826 | 967 | if(ret != OK) return ret; |
1827 | 967 | } |
1828 | | |
1829 | 4.90k | { |
1830 | 4.90k | WORD16 i_scaleFactor; |
1831 | 4.90k | WORD16 *pi2_scale_matrix_ptr; |
1832 | | /*******************************************************************/ |
1833 | | /* for luma DC coefficients the scaling is done during the parsing */ |
1834 | | /* to preserve the precision */ |
1835 | | /*******************************************************************/ |
1836 | 4.90k | if(ps_dec->s_high_profile.u1_scaling_present) |
1837 | 1.06k | { |
1838 | 1.06k | pi2_scale_matrix_ptr = ps_dec->s_high_profile.i2_scalinglist4x4[0]; |
1839 | 1.06k | } |
1840 | 3.83k | else |
1841 | 3.83k | { |
1842 | 3.83k | i_scaleFactor = 16; |
1843 | 3.83k | pi2_scale_matrix_ptr = &i_scaleFactor; |
1844 | 3.83k | } |
1845 | 4.90k | { |
1846 | 4.90k | ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
1847 | 4.90k | UWORD8 uc_a, uc_b; |
1848 | 4.90k | UWORD32 u4_ctx_inc; |
1849 | 4.90k | INC_SYM_COUNT(&(ps_dec->s_cab_dec_env)); |
1850 | | |
1851 | | /* if MbAddrN not available then CondTermN = 1 */ |
1852 | 4.90k | uc_b = ((ps_top_ctxt->u1_yuv_dc_csbp) & 0x01); |
1853 | | |
1854 | | /* if MbAddrN not available then CondTermN = 1 */ |
1855 | 4.90k | uc_a = ((ps_dec->pu1_left_yuv_dc_csbp[0]) & 0x01); |
1856 | | |
1857 | 4.90k | u4_ctx_inc = (uc_a + (uc_b << 1)); |
1858 | 4.90k | { |
1859 | 4.90k | WORD16 pi2_dc_coef[16] = {0}; |
1860 | 4.90k | tu_sblk4x4_coeff_data_t *ps_tu_4x4 = |
1861 | 4.90k | (tu_sblk4x4_coeff_data_t *) ps_dec->pv_parse_tu_coeff_data; |
1862 | 4.90k | WORD16 *pi2_coeff_block = (WORD16 *) ps_dec->pv_parse_tu_coeff_data; |
1863 | | |
1864 | 4.90k | p_bin_ctxt = (ps_dec->p_cbf_t[LUMA_DC_CTXCAT]) + u4_ctx_inc; |
1865 | | |
1866 | 4.90k | u1_dc_block_flag = ih264d_read_coeff4x4_cabac( |
1867 | 4.90k | ps_bitstrm, LUMA_DC_CTXCAT, |
1868 | 4.90k | ps_dec->p_significant_coeff_flag_t[LUMA_DC_CTXCAT], ps_dec, p_bin_ctxt); |
1869 | | |
1870 | | /* Store coded_block_flag */ |
1871 | 4.90k | p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE; |
1872 | 4.90k | p_curr_ctxt->u1_yuv_dc_csbp |= u1_dc_block_flag; |
1873 | 4.90k | if(u1_dc_block_flag) |
1874 | 3.18k | { |
1875 | 3.18k | WORD32 pi4_tmp[16] = {0}; |
1876 | 3.18k | memset(pi2_dc_coef, 0, sizeof(pi2_dc_coef)); |
1877 | 3.18k | ih264d_unpack_coeff4x4_dc_4x4blk(ps_tu_4x4, pi2_dc_coef, |
1878 | 3.18k | ps_dec->pu1_inv_scan); |
1879 | | |
1880 | 3.18k | PROFILE_DISABLE_IQ_IT_RECON() |
1881 | 3.18k | ps_dec->pf_ihadamard_scaling_4x4( |
1882 | 3.18k | pi2_dc_coef, pi2_coeff_block, ps_dec->pu2_quant_scale_y, |
1883 | 3.18k | (UWORD16 *) pi2_scale_matrix_ptr, ps_dec->u1_qp_y_div6, pi4_tmp); |
1884 | 3.18k | pi2_coeff_block += 16; |
1885 | 3.18k | ps_dec->pv_parse_tu_coeff_data = (void *) pi2_coeff_block; |
1886 | 3.18k | SET_BIT(ps_cur_mb_info->u1_yuv_dc_block_flag, 0); |
1887 | 3.18k | } |
1888 | 4.90k | } |
1889 | 4.90k | } |
1890 | 4.90k | } |
1891 | 4.90k | } |
1892 | 10.2k | ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6; |
1893 | 10.2k | ps_dec->pu1_left_yuv_dc_csbp[0] |= u1_dc_block_flag; |
1894 | 10.2k | } |
1895 | 36.8k | else |
1896 | 36.8k | { |
1897 | 36.8k | u1_offset = 0; |
1898 | | /*--------------------------------------------------------------------*/ |
1899 | | /* Read the Coded block pattern */ |
1900 | | /*--------------------------------------------------------------------*/ |
1901 | 36.8k | u1_cbp = ih264d_parse_ctx_cbp_cabac(ps_dec); |
1902 | 36.8k | COPYTHECONTEXT("coded_block_pattern", u1_cbp); |
1903 | | |
1904 | 36.8k | ps_cur_mb_info->u1_cbp = u1_cbp; |
1905 | 36.8k | p_curr_ctxt->u1_cbp = u1_cbp; |
1906 | 36.8k | p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE; |
1907 | 36.8k | ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6; |
1908 | 36.8k | p_curr_ctxt->u1_mb_type = CAB_INFERRED; |
1909 | 36.8k | p_curr_ctxt->u1_intra_chroma_pred_mode = 0; |
1910 | 36.8k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
1911 | 36.8k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
1912 | | |
1913 | | /*--------------------------------------------------------------------*/ |
1914 | | /* Read transform_size_8x8_flag if present */ |
1915 | | /*--------------------------------------------------------------------*/ |
1916 | 36.8k | if((ps_dec->ps_cur_pps->i4_transform_8x8_mode_flag) && (u1_cbp & 0xf)) |
1917 | 12.1k | { |
1918 | 12.1k | ps_cur_mb_info->u1_tran_form8x8 = |
1919 | 12.1k | ih264d_parse_transform8x8flag_cabac(ps_dec, ps_cur_mb_info); |
1920 | 12.1k | COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8); |
1921 | 12.1k | p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8; |
1922 | 12.1k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8; |
1923 | 12.1k | } |
1924 | 24.7k | else |
1925 | 24.7k | { |
1926 | 24.7k | p_curr_ctxt->u1_transform8x8_ctxt = 0; |
1927 | 24.7k | } |
1928 | | |
1929 | | /*--------------------------------------------------------------------*/ |
1930 | | /* Read mb_qp_delta */ |
1931 | | /*--------------------------------------------------------------------*/ |
1932 | 36.8k | if(ps_cur_mb_info->u1_cbp) |
1933 | 25.6k | { |
1934 | 25.6k | ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &i1_delta_qp); |
1935 | 25.6k | if(ret != OK) return ret; |
1936 | 25.5k | COPYTHECONTEXT("mb_qp_delta", i1_delta_qp); |
1937 | 25.5k | if(i1_delta_qp != 0) |
1938 | 4.21k | { |
1939 | 4.21k | ret = ih264d_update_qp(ps_dec, i1_delta_qp); |
1940 | 4.21k | if(ret != OK) return ret; |
1941 | 4.21k | } |
1942 | 25.5k | } |
1943 | 11.1k | else |
1944 | 11.1k | ps_dec->i1_prev_mb_qp_delta = 0; |
1945 | 36.8k | } |
1946 | | |
1947 | 46.9k | ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, u1_offset); |
1948 | 46.9k | if(EXCEED_OFFSET(ps_bitstrm)) return ERROR_EOB_TERMINATE_T; |
1949 | 45.7k | return OK; |
1950 | 46.9k | } |
1951 | | |
1952 | | /*! |
1953 | | ************************************************************************** |
1954 | | * \if Function name : isvcd_decode_islice \endif |
1955 | | * |
1956 | | * \brief |
1957 | | * Decodes an I Slice |
1958 | | * |
1959 | | * |
1960 | | * \return |
1961 | | * 0 on Success and Error code otherwise |
1962 | | ************************************************************************** |
1963 | | */ |
1964 | | WORD32 isvcd_parse_islice(svc_dec_lyr_struct_t *ps_svc_lyr_dec, UWORD16 u2_first_mb_in_slice) |
1965 | 7.20k | { |
1966 | 7.20k | dec_struct_t *ps_dec = &ps_svc_lyr_dec->s_dec; |
1967 | 7.20k | dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps; |
1968 | 7.20k | dec_slice_params_t *ps_slice = ps_dec->ps_cur_slice; |
1969 | 7.20k | UWORD32 *pu4_bitstrm_buf = ps_dec->ps_bitstrm->pu4_buffer; |
1970 | 7.20k | UWORD32 *pu4_bitstrm_ofst = &ps_dec->ps_bitstrm->u4_ofst; |
1971 | 7.20k | UWORD32 u4_temp; |
1972 | 7.20k | WORD32 i_temp; |
1973 | 7.20k | WORD32 ret; |
1974 | | |
1975 | | /*--------------------------------------------------------------------*/ |
1976 | | /* Read remaining contents of the slice header */ |
1977 | | /*--------------------------------------------------------------------*/ |
1978 | | /* dec_ref_pic_marking function */ |
1979 | | /* G050 */ |
1980 | 7.20k | if(ps_slice->u1_nal_ref_idc != 0) |
1981 | 6.72k | { |
1982 | 6.72k | if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read) |
1983 | 6.07k | { |
1984 | 6.07k | dec_pic_params_t *ps_pps = ps_dec->ps_cur_pps; |
1985 | 6.07k | dec_seq_params_t *ps_sps_tmp = ps_pps->ps_sps; |
1986 | 6.07k | UWORD8 u1_nal_unit_type_tmp = ps_dec->u1_nal_unit_type; |
1987 | | |
1988 | 6.07k | ps_pps->ps_sps = ps_dec->ps_cur_sps; |
1989 | 6.07k | if(ps_svc_lyr_dec->ps_nal_svc_ext->u1_idr_flag) |
1990 | 5.65k | ps_dec->u1_nal_unit_type = IDR_SLICE_NAL; |
1991 | | |
1992 | 6.07k | i_temp = ih264d_read_mmco_commands(ps_dec); |
1993 | 6.07k | ps_pps->ps_sps = ps_sps_tmp; |
1994 | 6.07k | ps_dec->u1_nal_unit_type = u1_nal_unit_type_tmp; |
1995 | | |
1996 | 6.07k | if(i_temp < 0) |
1997 | 175 | { |
1998 | 175 | return ERROR_DBP_MANAGER_T; |
1999 | 175 | } |
2000 | 5.90k | ps_dec->u4_bitoffset = i_temp; |
2001 | 5.90k | } |
2002 | 644 | else |
2003 | 644 | ps_dec->ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset; |
2004 | 6.72k | } |
2005 | | |
2006 | 7.03k | { |
2007 | | /* G050 */ |
2008 | | /* Read slice_qp_delta */ |
2009 | 7.03k | WORD64 i8_temp = |
2010 | 7.03k | (WORD64) ps_pps->u1_pic_init_qp + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
2011 | 7.03k | if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) return ERROR_INV_RANGE_QP_T; |
2012 | 6.34k | ps_slice->u1_slice_qp = (UWORD8) i8_temp; |
2013 | 6.34k | COPYTHECONTEXT("SH: slice_qp_delta", ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp); |
2014 | 6.34k | } |
2015 | 6.34k | if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1) |
2016 | 3.57k | { |
2017 | 3.57k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
2018 | 3.57k | COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp); |
2019 | | |
2020 | 3.57k | if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED) |
2021 | 228 | { |
2022 | 228 | return ERROR_INV_SLICE_HDR_T; |
2023 | 228 | } |
2024 | 3.34k | ps_slice->u1_disable_dblk_filter_idc = u4_temp; |
2025 | 3.34k | if(u4_temp != 1) |
2026 | 3.08k | { |
2027 | 3.08k | i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1; |
2028 | 3.08k | if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) |
2029 | 233 | { |
2030 | 233 | return ERROR_INV_SLICE_HDR_T; |
2031 | 233 | } |
2032 | 2.85k | ps_slice->i1_slice_alpha_c0_offset = i_temp; |
2033 | 2.85k | COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2", |
2034 | 2.85k | ps_slice->i1_slice_alpha_c0_offset >> 1); |
2035 | | |
2036 | 2.85k | i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) << 1; |
2037 | 2.85k | if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) |
2038 | 281 | { |
2039 | 281 | return ERROR_INV_SLICE_HDR_T; |
2040 | 281 | } |
2041 | 2.57k | ps_slice->i1_slice_beta_offset = i_temp; |
2042 | 2.57k | COPYTHECONTEXT("SH: slice_beta_offset_div2", ps_slice->i1_slice_beta_offset >> 1); |
2043 | 2.57k | } |
2044 | 264 | else |
2045 | 264 | { |
2046 | 264 | ps_slice->i1_slice_alpha_c0_offset = 0; |
2047 | 264 | ps_slice->i1_slice_beta_offset = 0; |
2048 | 264 | } |
2049 | 3.34k | } |
2050 | 2.76k | else |
2051 | 2.76k | { |
2052 | 2.76k | ps_slice->u1_disable_dblk_filter_idc = 0; |
2053 | 2.76k | ps_slice->i1_slice_alpha_c0_offset = 0; |
2054 | 2.76k | ps_slice->i1_slice_beta_offset = 0; |
2055 | 2.76k | } |
2056 | | |
2057 | | /* Initialization to check if number of motion vector per 2 Mbs */ |
2058 | | /* are exceeding the range or not */ |
2059 | 5.59k | ps_dec->u2_mv_2mb[0] = 0; |
2060 | 5.59k | ps_dec->u2_mv_2mb[1] = 0; |
2061 | | |
2062 | | /*set slice header cone to 2 ,to indicate correct header*/ |
2063 | 5.59k | ps_dec->u1_slice_header_done = 2; |
2064 | 5.59k | if(ps_pps->u1_entropy_coding_mode) |
2065 | 3.39k | { |
2066 | 3.39k | SWITCHOFFTRACE; |
2067 | 3.39k | SWITCHONTRACECABAC; |
2068 | 3.39k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
2069 | 0 | { |
2070 | 0 | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff; |
2071 | 0 | } |
2072 | 3.39k | else |
2073 | 3.39k | ps_dec->pf_get_mb_info = isvcd_get_mb_info_cabac_nonmbaff; |
2074 | | |
2075 | 3.39k | ret = isvcd_parse_islice_data_cabac(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice); |
2076 | 3.39k | if(ret != OK) return ret; |
2077 | 561 | SWITCHONTRACE; |
2078 | 561 | SWITCHOFFTRACECABAC; |
2079 | 561 | } |
2080 | 2.20k | else |
2081 | 2.20k | { |
2082 | 2.20k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
2083 | 0 | { |
2084 | 0 | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff; |
2085 | 0 | } |
2086 | 2.20k | else |
2087 | 2.20k | ps_dec->pf_get_mb_info = isvcd_get_mb_info_cavlc_nonmbaff; |
2088 | 2.20k | ret = isvcd_parse_islice_data_cavlc(ps_svc_lyr_dec, ps_slice, u2_first_mb_in_slice); |
2089 | 2.20k | if(ret != OK) return ret; |
2090 | 2.20k | } |
2091 | | |
2092 | 810 | return OK; |
2093 | 5.59k | } |