/src/libavc/decoder/ih264d_parse_pslice.c
Line | Count | Source |
1 | | /****************************************************************************** |
2 | | * |
3 | | * Copyright (C) 2015 The Android Open Source Project |
4 | | * |
5 | | * Licensed under the Apache License, Version 2.0 (the "License"); |
6 | | * you may not use this file except in compliance with the License. |
7 | | * You may obtain a copy of the License at: |
8 | | * |
9 | | * http://www.apache.org/licenses/LICENSE-2.0 |
10 | | * |
11 | | * Unless required by applicable law or agreed to in writing, software |
12 | | * distributed under the License is distributed on an "AS IS" BASIS, |
13 | | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
14 | | * See the License for the specific language governing permissions and |
15 | | * limitations under the License. |
16 | | * |
17 | | ***************************************************************************** |
18 | | * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore |
19 | | */ |
20 | | |
21 | | /*! |
22 | | ************************************************************************** |
23 | | * \file ih264d_parse_pslice.c |
24 | | * |
25 | | * \brief |
26 | | * Contains routines that decode a I slice type |
27 | | * |
28 | | * Detailed_description |
29 | | * |
30 | | * \date |
31 | | * 07/07/2003 |
32 | | * |
33 | | * \author NS |
34 | | ************************************************************************** |
35 | | */ |
36 | | |
37 | | #include <string.h> |
38 | | #include "ih264_defs.h" |
39 | | #include "ih264d_bitstrm.h" |
40 | | #include "ih264d_defs.h" |
41 | | #include "ih264d_debug.h" |
42 | | #include "ih264d_tables.h" |
43 | | #include "ih264d_structs.h" |
44 | | #include "ih264d_defs.h" |
45 | | #include "ih264d_parse_cavlc.h" |
46 | | #include "ih264d_mb_utils.h" |
47 | | #include "ih264d_parse_slice.h" |
48 | | #include "ih264d_mvpred.h" |
49 | | #include "ih264d_parse_islice.h" |
50 | | #include "ih264d_process_intra_mb.h" |
51 | | #include "ih264d_inter_pred.h" |
52 | | #include "ih264d_process_pslice.h" |
53 | | #include "ih264d_deblocking.h" |
54 | | #include "ih264d_cabac.h" |
55 | | #include "ih264d_parse_mb_header.h" |
56 | | #include "ih264d_error_handler.h" |
57 | | #include "ih264d_defs.h" |
58 | | #include "ih264d_format_conv.h" |
59 | | #include "ih264d_quant_scaling.h" |
60 | | #include "ih264d_thread_parse_decode.h" |
61 | | #include "ih264d_thread_compute_bs.h" |
62 | | #include "ih264d_process_bslice.h" |
63 | | #include "ithread.h" |
64 | | #include "ih264d_utils.h" |
65 | | #include "ih264d_format_conv.h" |
66 | | |
67 | | void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec); |
68 | | void ih264d_deblock_mb_level(dec_struct_t *ps_dec, |
69 | | dec_mb_info_t *ps_cur_mb_info, |
70 | | UWORD32 nmb_index); |
71 | | |
72 | | /*! |
73 | | ************************************************************************** |
74 | | * \if Function name : ih264d_parse_pmb_cavlc \endif |
75 | | * |
76 | | * \brief |
77 | | * This function parses CAVLC syntax of a P MB. |
78 | | * |
79 | | * \return |
80 | | * 0 on Success and Error code otherwise |
81 | | ************************************************************************** |
82 | | */ |
83 | | WORD32 ih264d_parse_pmb_cavlc(dec_struct_t * ps_dec, |
84 | | dec_mb_info_t * ps_cur_mb_info, |
85 | | UWORD32 u4_mb_num, |
86 | | UWORD32 u4_num_mbsNby2) |
87 | 109k | { |
88 | 109k | UWORD32 u1_num_mb_part; |
89 | 109k | UWORD32 uc_sub_mb; |
90 | 109k | dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
91 | 109k | UWORD32 * const pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
92 | 109k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
93 | | |
94 | 109k | parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data |
95 | 109k | + u4_num_mbsNby2; |
96 | 109k | WORD8 * pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0]; |
97 | 109k | const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; |
98 | 109k | const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part; |
99 | 109k | UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info; |
100 | | |
101 | 109k | UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type; |
102 | 109k | UWORD32 u4_sum_mb_mode_pack = 0; |
103 | 109k | WORD32 ret; |
104 | | |
105 | 109k | UWORD8 u1_no_submb_part_size_lt8x8_flag = 1; |
106 | 109k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
107 | 109k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
108 | | |
109 | 109k | ps_cur_mb_info->u1_yuv_dc_block_flag = 0; |
110 | | |
111 | 109k | ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type; |
112 | 109k | uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0)); |
113 | | |
114 | | /* Reading the subMB type */ |
115 | 109k | if(uc_sub_mb) |
116 | 9.15k | { |
117 | 9.15k | WORD32 i; |
118 | 9.15k | UWORD8 u1_colz = (PRED_8x8 << 6); |
119 | | |
120 | 44.2k | for(i = 0; i < 4; i++) |
121 | 35.6k | { |
122 | 35.6k | UWORD32 ui_sub_mb_mode; |
123 | | |
124 | | //Inlined ih264d_uev |
125 | 35.6k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
126 | 35.6k | UWORD32 u4_word, u4_ldz; |
127 | | |
128 | | /***************************************************************/ |
129 | | /* Find leading zeros in next 32 bits */ |
130 | | /***************************************************************/ |
131 | 35.6k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
132 | 35.6k | u4_ldz = CLZ(u4_word); |
133 | | /* Flush the ps_bitstrm */ |
134 | 35.6k | u4_bitstream_offset += (u4_ldz + 1); |
135 | | /* Read the suffix from the ps_bitstrm */ |
136 | 35.6k | u4_word = 0; |
137 | 35.6k | if(u4_ldz) |
138 | 27.0k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, |
139 | 35.6k | u4_ldz); |
140 | 35.6k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
141 | 35.6k | ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1); |
142 | | //Inlined ih264d_uev |
143 | | |
144 | 35.6k | if(ui_sub_mb_mode > 3) |
145 | 538 | { |
146 | 538 | return ERROR_SUB_MB_TYPE; |
147 | 538 | } |
148 | 35.1k | else |
149 | 35.1k | { |
150 | 35.1k | u4_sum_mb_mode_pack = (u4_sum_mb_mode_pack << 8) | ui_sub_mb_mode; |
151 | | /* Storing collocated information */ |
152 | 35.1k | *pu1_col_info++ = u1_colz | (UWORD8)(ui_sub_mb_mode << 4); |
153 | | |
154 | 35.1k | COPYTHECONTEXT("sub_mb_type", ui_sub_mb_mode); |
155 | 35.1k | } |
156 | | |
157 | | /* check if Motion compensation is done below 8x8 */ |
158 | 35.1k | if(ui_sub_mb_mode != P_L0_8x8) |
159 | 26.4k | { |
160 | 26.4k | u1_no_submb_part_size_lt8x8_flag = 0; |
161 | 26.4k | } |
162 | 35.1k | } |
163 | | |
164 | | // |
165 | 8.61k | u1_num_mb_part = 4; |
166 | 8.61k | } |
167 | 99.8k | else |
168 | 99.8k | { |
169 | 99.8k | *pu1_col_info++ = (u1_mb_type << 6); |
170 | 99.8k | if(u1_mb_type) |
171 | 24.0k | *pu1_col_info++ = (u1_mb_type << 6); |
172 | 99.8k | u1_num_mb_part = pu1_num_mb_part[u1_mb_type]; |
173 | | |
174 | 99.8k | } |
175 | | |
176 | | /* Decoding reference index 0: For simple profile the following */ |
177 | | /* conditions are always true (mb_field_decoding_flag == 0); */ |
178 | | /* (MbPartPredMode != PredL1) */ |
179 | | |
180 | 108k | { |
181 | | |
182 | 108k | UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag; |
183 | 108k | UWORD8 uc_num_ref_idx_l0_active_minus1 = |
184 | 108k | (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] |
185 | 108k | << (u1_mbaff & uc_field)) - 1; |
186 | | |
187 | 108k | if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0)) |
188 | 63.5k | { |
189 | 63.5k | if(1 == uc_num_ref_idx_l0_active_minus1) |
190 | 16.8k | ih264d_parse_pmb_ref_index_cavlc_range1( |
191 | 16.8k | u1_num_mb_part, ps_bitstrm, pi1_ref_idx, |
192 | 16.8k | uc_num_ref_idx_l0_active_minus1); |
193 | 46.6k | else |
194 | 46.6k | { |
195 | 46.6k | ret = ih264d_parse_pmb_ref_index_cavlc( |
196 | 46.6k | u1_num_mb_part, ps_bitstrm, pi1_ref_idx, |
197 | 46.6k | uc_num_ref_idx_l0_active_minus1); |
198 | 46.6k | if(ret != OK) |
199 | 503 | return ret; |
200 | 46.6k | } |
201 | 63.5k | } |
202 | 44.9k | else |
203 | 44.9k | { |
204 | | /* When there exists only a single frame to predict from */ |
205 | 44.9k | UWORD32 uc_i; |
206 | 109k | for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++) |
207 | | /* Storing Reference Idx Information */ |
208 | 64.2k | pi1_ref_idx[uc_i] = 0; |
209 | 44.9k | } |
210 | 108k | } |
211 | | |
212 | 107k | { |
213 | 107k | UWORD8 u1_p_idx; |
214 | 107k | UWORD32 uc_i; |
215 | 107k | parse_part_params_t * ps_part = ps_dec->ps_part; |
216 | 107k | UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height; |
217 | 107k | UWORD32 u4_sub_mb_num; |
218 | 107k | const UWORD8 * pu1_top_left_sub_mb_indx; |
219 | 107k | mv_pred_t * ps_mv, *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4); |
220 | | /* Loading the table pointers */ |
221 | 107k | const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw; |
222 | 107k | const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth; |
223 | 107k | const UWORD8 * pu1_sub_mb_indx_mod = |
224 | 107k | (const UWORD8 *)(gau1_ih264d_submb_indx_mod) |
225 | 107k | + (uc_sub_mb * 6); |
226 | 107k | const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw; |
227 | 107k | const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth; |
228 | 107k | const UWORD8 * pu1_num_sub_mb_part = |
229 | 107k | (const UWORD8 *)gau1_ih264d_num_submb_part; |
230 | | |
231 | 107k | UWORD16 u2_sub_mb_num = 0x028A; |
232 | | |
233 | | /*********************************************************/ |
234 | | /* default initialisations for condition (uc_sub_mb == 0) */ |
235 | | /* i.e. all are subpartitions of 8x8 */ |
236 | | /*********************************************************/ |
237 | 107k | u1_sub_mb_mode = 0; |
238 | 107k | u1_num_subpart = 1; |
239 | 107k | u1_mb_part_width = pu1_mb_partw[u1_mb_type]; |
240 | 107k | u1_mb_part_height = pu1_mb_parth[u1_mb_type]; |
241 | 107k | pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1); |
242 | 107k | u4_sub_mb_num = 0; |
243 | | |
244 | | /* Loop on number of partitions */ |
245 | 265k | for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++) |
246 | 157k | { |
247 | 157k | UWORD8 uc_j; |
248 | 157k | if(uc_sub_mb) |
249 | 34.4k | { |
250 | 34.4k | u1_sub_mb_mode = u4_sum_mb_mode_pack >> 24; |
251 | 34.4k | u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode]; |
252 | 34.4k | u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode]; |
253 | 34.4k | u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode]; |
254 | 34.4k | pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1); |
255 | 34.4k | u4_sub_mb_num = u2_sub_mb_num >> 12; |
256 | 34.4k | u4_sum_mb_mode_pack <<= 8; |
257 | 34.4k | u2_sub_mb_num <<= 4; |
258 | 34.4k | } |
259 | | |
260 | | /* Loop on Number of sub-partitions */ |
261 | 364k | for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++) |
262 | 207k | { |
263 | 207k | WORD16 i2_mvx, i2_mvy; |
264 | 207k | u4_sub_mb_num += *pu1_top_left_sub_mb_indx; |
265 | 207k | ps_mv = ps_mv_start + u4_sub_mb_num; |
266 | | |
267 | | /* Reading the differential Mv from the bitstream */ |
268 | | //i2_mvx = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
269 | | //inlining ih264d_sev |
270 | 207k | { |
271 | 207k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
272 | 207k | UWORD32 u4_word, u4_ldz, u4_abs_val; |
273 | | |
274 | | /***************************************************************/ |
275 | | /* Find leading zeros in next 32 bits */ |
276 | | /***************************************************************/ |
277 | 207k | NEXTBITS_32(u4_word, u4_bitstream_offset, |
278 | 207k | pu4_bitstrm_buf); |
279 | 207k | u4_ldz = CLZ(u4_word); |
280 | | |
281 | | /* Flush the ps_bitstrm */ |
282 | 207k | u4_bitstream_offset += (u4_ldz + 1); |
283 | | |
284 | | /* Read the suffix from the ps_bitstrm */ |
285 | 207k | u4_word = 0; |
286 | 207k | if(u4_ldz) |
287 | 121k | GETBITS(u4_word, u4_bitstream_offset, |
288 | 207k | pu4_bitstrm_buf, u4_ldz); |
289 | | |
290 | 207k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
291 | 207k | u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; |
292 | | |
293 | 207k | if(u4_word & 0x1) |
294 | 33.6k | i2_mvx = (-(WORD32)u4_abs_val); |
295 | 173k | else |
296 | 173k | i2_mvx = (u4_abs_val); |
297 | 207k | } |
298 | | //inlinined ih264d_sev |
299 | 207k | COPYTHECONTEXT("MVD", i2_mvx); |
300 | 207k | i2_mvy = ih264d_sev(pu4_bitstrm_ofst, |
301 | 207k | pu4_bitstrm_buf); |
302 | 207k | COPYTHECONTEXT("MVD", i2_mvy); |
303 | | |
304 | | /* Storing Info for partitions */ |
305 | 207k | ps_part->u1_is_direct = PART_NOT_DIRECT; |
306 | 207k | ps_part->u1_sub_mb_num = u4_sub_mb_num; |
307 | 207k | ps_part->u1_partheight = u1_mb_part_height; |
308 | 207k | ps_part->u1_partwidth = u1_mb_part_width; |
309 | | |
310 | | /* Storing Mv residuals */ |
311 | 207k | ps_mv->i2_mv[0] = i2_mvx; |
312 | 207k | ps_mv->i2_mv[1] = i2_mvy; |
313 | | |
314 | | /* Increment partition Index */ |
315 | 207k | u1_p_idx++; |
316 | 207k | ps_part++; |
317 | 207k | } |
318 | 157k | } |
319 | 107k | ps_parse_mb_data->u1_num_part = u1_p_idx; |
320 | 107k | ps_dec->ps_part = ps_part; |
321 | 107k | } |
322 | | |
323 | 107k | { |
324 | 107k | UWORD32 u4_cbp; |
325 | | |
326 | | /* Read the Coded block pattern */ |
327 | 107k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
328 | 107k | UWORD32 u4_word, u4_ldz; |
329 | | |
330 | | /***************************************************************/ |
331 | | /* Find leading zeros in next 32 bits */ |
332 | | /***************************************************************/ |
333 | 107k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
334 | 107k | u4_ldz = CLZ(u4_word); |
335 | | /* Flush the ps_bitstrm */ |
336 | 107k | u4_bitstream_offset += (u4_ldz + 1); |
337 | | /* Read the suffix from the ps_bitstrm */ |
338 | 107k | u4_word = 0; |
339 | 107k | if(u4_ldz) |
340 | 36.7k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
341 | 107k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
342 | 107k | u4_cbp = ((1 << u4_ldz) + u4_word - 1); |
343 | | |
344 | 107k | if(u4_cbp > 47) |
345 | 1.40k | return ERROR_CBP; |
346 | | |
347 | 106k | u4_cbp = *((UWORD8*)gau1_ih264d_cbp_inter + u4_cbp); |
348 | 106k | COPYTHECONTEXT("coded_block_pattern", u4_cbp); |
349 | 106k | ps_cur_mb_info->u1_cbp = u4_cbp; |
350 | | |
351 | | /* Read the transform8x8 u4_flag if present */ |
352 | 106k | if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & 0xf) |
353 | 4.45k | && u1_no_submb_part_size_lt8x8_flag) |
354 | 3.81k | { |
355 | 3.81k | ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm); |
356 | 3.81k | COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8); |
357 | 3.81k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8; |
358 | 3.81k | } |
359 | | |
360 | | /* Read mb_qp_delta */ |
361 | 106k | if(u4_cbp) |
362 | 35.2k | { |
363 | 35.2k | WORD32 i_temp; |
364 | | |
365 | 35.2k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
366 | 35.2k | UWORD32 u4_word, u4_ldz, u4_abs_val; |
367 | | |
368 | | /***************************************************************/ |
369 | | /* Find leading zeros in next 32 bits */ |
370 | | /***************************************************************/ |
371 | 35.2k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
372 | 35.2k | u4_ldz = CLZ(u4_word); |
373 | | |
374 | | /* Flush the ps_bitstrm */ |
375 | 35.2k | u4_bitstream_offset += (u4_ldz + 1); |
376 | | |
377 | | /* Read the suffix from the ps_bitstrm */ |
378 | 35.2k | u4_word = 0; |
379 | 35.2k | if(u4_ldz) |
380 | 14.8k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, |
381 | 35.2k | u4_ldz); |
382 | | |
383 | 35.2k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
384 | 35.2k | u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; |
385 | | |
386 | 35.2k | if(u4_word & 0x1) |
387 | 5.12k | i_temp = (-(WORD32)u4_abs_val); |
388 | 30.1k | else |
389 | 30.1k | i_temp = (u4_abs_val); |
390 | | |
391 | 35.2k | if((i_temp < -26) || (i_temp > 25)) |
392 | 413 | return ERROR_INV_RANGE_QP_T; |
393 | | //inlinined ih264d_sev |
394 | | |
395 | 34.8k | COPYTHECONTEXT("mb_qp_delta", i_temp); |
396 | 34.8k | if(i_temp) |
397 | 14.4k | { |
398 | 14.4k | ret = ih264d_update_qp(ps_dec, (WORD8)i_temp); |
399 | 14.4k | if(ret != OK) |
400 | 0 | return ret; |
401 | 14.4k | } |
402 | | |
403 | 34.8k | ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0); |
404 | 34.8k | if(ret != OK) |
405 | 2.68k | return ret; |
406 | 32.1k | if(EXCEED_OFFSET(ps_bitstrm)) |
407 | 794 | return ERROR_EOB_TERMINATE_T; |
408 | 32.1k | } |
409 | 71.2k | else |
410 | 71.2k | { |
411 | 71.2k | ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); |
412 | 71.2k | } |
413 | | |
414 | | |
415 | | |
416 | 106k | } |
417 | | |
418 | 102k | return OK; |
419 | 106k | } |
420 | | |
421 | | /*! |
422 | | ************************************************************************** |
423 | | * \if Function name : ih264d_parse_pmb_cabac \endif |
424 | | * |
425 | | * \brief |
426 | | * This function parses CABAC syntax of a P MB. |
427 | | * |
428 | | * \return |
429 | | * 0 on Success and Error code otherwise |
430 | | ************************************************************************** |
431 | | */ |
432 | | WORD32 ih264d_parse_pmb_cabac(dec_struct_t * ps_dec, |
433 | | dec_mb_info_t * ps_cur_mb_info, |
434 | | UWORD32 u4_mb_num, |
435 | | UWORD32 u4_num_mbsNby2) |
436 | 280k | { |
437 | 280k | UWORD32 u1_num_mb_part; |
438 | 280k | UWORD32 uc_sub_mb; |
439 | 280k | parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data |
440 | 280k | + u4_num_mbsNby2; |
441 | 280k | WORD8 * pi1_ref_idx = ps_parse_mb_data->i1_ref_idx[0]; |
442 | 280k | const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part; |
443 | 280k | const UWORD32 u1_mb_type = ps_cur_mb_info->u1_mb_type; |
444 | 280k | UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info; |
445 | 280k | UWORD32 u1_mb_mc_mode = u1_mb_type; |
446 | 280k | ctxt_inc_mb_info_t * p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info; |
447 | 280k | decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
448 | 280k | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
449 | 280k | UWORD32 u4_sub_mb_pack = 0; |
450 | 280k | WORD32 ret; |
451 | | |
452 | 280k | UWORD8 u1_no_submb_part_size_lt8x8_flag = 1; |
453 | 280k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
454 | 280k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
455 | | |
456 | 280k | ps_cur_mb_info->u1_yuv_dc_block_flag = 0; |
457 | | |
458 | 280k | p_curr_ctxt->u1_mb_type = CAB_P; |
459 | 280k | ps_cur_mb_info->u1_mb_mc_mode = u1_mb_type; |
460 | 280k | uc_sub_mb = ((u1_mb_type == PRED_8x8) | (u1_mb_type == PRED_8x8R0)); |
461 | | |
462 | | /* Reading the subMB type */ |
463 | 280k | if(uc_sub_mb) |
464 | 41.3k | { |
465 | | |
466 | 41.3k | UWORD8 u1_colz = (PRED_8x8 << 6); |
467 | 41.3k | u1_mb_mc_mode = 0; |
468 | | |
469 | 41.3k | { |
470 | 41.3k | UWORD8 u1_sub_mb_mode; |
471 | 41.3k | u1_sub_mb_mode = ih264d_parse_submb_type_cabac( |
472 | 41.3k | 0, ps_cab_env, ps_bitstrm, |
473 | 41.3k | ps_dec->p_sub_mb_type_t); |
474 | 41.3k | if(u1_sub_mb_mode > 3) |
475 | 0 | return ERROR_SUB_MB_TYPE; |
476 | | |
477 | 41.3k | u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode; |
478 | | /* Storing collocated information */ |
479 | 41.3k | *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4)); |
480 | 41.3k | COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode); |
481 | | /* check if Motion compensation is done below 8x8 */ |
482 | 41.3k | if(u1_sub_mb_mode != P_L0_8x8) |
483 | 19.8k | { |
484 | 19.8k | u1_no_submb_part_size_lt8x8_flag = 0; |
485 | 19.8k | } |
486 | 41.3k | } |
487 | 0 | { |
488 | 41.3k | UWORD8 u1_sub_mb_mode; |
489 | 41.3k | u1_sub_mb_mode = ih264d_parse_submb_type_cabac( |
490 | 41.3k | 0, ps_cab_env, ps_bitstrm, |
491 | 41.3k | ps_dec->p_sub_mb_type_t); |
492 | 41.3k | if(u1_sub_mb_mode > 3) |
493 | 0 | return ERROR_SUB_MB_TYPE; |
494 | | |
495 | 41.3k | u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode; |
496 | | /* Storing collocated information */ |
497 | 41.3k | *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4)); |
498 | 41.3k | COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode); |
499 | | /* check if Motion compensation is done below 8x8 */ |
500 | 41.3k | if(u1_sub_mb_mode != P_L0_8x8) |
501 | 20.7k | { |
502 | 20.7k | u1_no_submb_part_size_lt8x8_flag = 0; |
503 | 20.7k | } |
504 | 41.3k | } |
505 | 0 | { |
506 | 41.3k | UWORD8 u1_sub_mb_mode; |
507 | 41.3k | u1_sub_mb_mode = ih264d_parse_submb_type_cabac( |
508 | 41.3k | 0, ps_cab_env, ps_bitstrm, |
509 | 41.3k | ps_dec->p_sub_mb_type_t); |
510 | 41.3k | if(u1_sub_mb_mode > 3) |
511 | 0 | return ERROR_SUB_MB_TYPE; |
512 | | |
513 | 41.3k | u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode; |
514 | | /* Storing collocated information */ |
515 | 41.3k | *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4)); |
516 | 41.3k | COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode); |
517 | | /* check if Motion compensation is done below 8x8 */ |
518 | 41.3k | if(u1_sub_mb_mode != P_L0_8x8) |
519 | 21.1k | { |
520 | 21.1k | u1_no_submb_part_size_lt8x8_flag = 0; |
521 | 21.1k | } |
522 | 41.3k | } |
523 | 0 | { |
524 | 41.3k | UWORD8 u1_sub_mb_mode; |
525 | 41.3k | u1_sub_mb_mode = ih264d_parse_submb_type_cabac( |
526 | 41.3k | 0, ps_cab_env, ps_bitstrm, |
527 | 41.3k | ps_dec->p_sub_mb_type_t); |
528 | 41.3k | if(u1_sub_mb_mode > 3) |
529 | 0 | return ERROR_SUB_MB_TYPE; |
530 | | |
531 | 41.3k | u4_sub_mb_pack = (u4_sub_mb_pack << 8) | u1_sub_mb_mode; |
532 | | /* Storing collocated information */ |
533 | 41.3k | *pu1_col_info++ = u1_colz | ((UWORD8)(u1_sub_mb_mode << 4)); |
534 | 41.3k | COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode); |
535 | | /* check if Motion compensation is done below 8x8 */ |
536 | 41.3k | if(u1_sub_mb_mode != P_L0_8x8) |
537 | 20.1k | { |
538 | 20.1k | u1_no_submb_part_size_lt8x8_flag = 0; |
539 | 20.1k | } |
540 | 41.3k | } |
541 | 0 | u1_num_mb_part = 4; |
542 | 41.3k | } |
543 | 239k | else |
544 | 239k | { |
545 | 239k | u1_num_mb_part = pu1_num_mb_part[u1_mb_type]; |
546 | | /* Storing collocated Mb and SubMb mode information */ |
547 | 239k | *pu1_col_info++ = (u1_mb_type << 6); |
548 | 239k | if(u1_mb_type) |
549 | 139k | *pu1_col_info++ = (u1_mb_type << 6); |
550 | 239k | } |
551 | | /* Decoding reference index 0: For simple profile the following */ |
552 | | /* conditions are always true (mb_field_decoding_flag == 0); */ |
553 | | /* (MbPartPredMode != PredL1) */ |
554 | 280k | { |
555 | 280k | WORD8 * pi1_top_ref_idx_ctx_inc_arr = p_curr_ctxt->i1_ref_idx; |
556 | 280k | WORD8 * pi1_left_ref_idx_ctxt_inc = ps_dec->pi1_left_ref_idx_ctxt_inc; |
557 | 280k | UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; |
558 | 280k | UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag; |
559 | 280k | UWORD8 uc_num_ref_idx_l0_active_minus1 = |
560 | 280k | (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] |
561 | 280k | << (u1_mbaff & uc_field)) - 1; |
562 | | |
563 | 280k | if((uc_num_ref_idx_l0_active_minus1 > 0) & (u1_mb_type != PRED_8x8R0)) |
564 | 219k | { |
565 | | /* force the routine to decode ref idx for each partition */ |
566 | 219k | *((UWORD32 *)pi1_ref_idx) = 0x01010101; |
567 | 219k | ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0, |
568 | 219k | uc_num_ref_idx_l0_active_minus1, |
569 | 219k | u1_mb_mc_mode, pi1_ref_idx, |
570 | 219k | pi1_left_ref_idx_ctxt_inc, |
571 | 219k | pi1_top_ref_idx_ctx_inc_arr, ps_cab_env, |
572 | 219k | ps_bitstrm, ps_dec->p_ref_idx_t); |
573 | 219k | if(ret != OK) |
574 | 192 | return ret; |
575 | 219k | } |
576 | 61.5k | else |
577 | 61.5k | { |
578 | | /* When there exists only a single frame to predict from */ |
579 | 61.5k | pi1_left_ref_idx_ctxt_inc[0] = 0; |
580 | 61.5k | pi1_left_ref_idx_ctxt_inc[1] = 0; |
581 | 61.5k | pi1_top_ref_idx_ctx_inc_arr[0] = 0; |
582 | 61.5k | pi1_top_ref_idx_ctx_inc_arr[1] = 0; |
583 | 61.5k | *((UWORD32 *)pi1_ref_idx) = 0; |
584 | 61.5k | } |
585 | 280k | } |
586 | | |
587 | 280k | { |
588 | 280k | UWORD8 u1_p_idx; |
589 | 280k | UWORD32 uc_i; |
590 | 280k | parse_part_params_t * ps_part = ps_dec->ps_part; |
591 | 280k | UWORD8 u1_sub_mb_mode, u1_num_subpart, u1_mb_part_width, u1_mb_part_height; |
592 | 280k | UWORD32 u4_sub_mb_num; |
593 | 280k | const UWORD8 * pu1_top_left_sub_mb_indx; |
594 | 280k | mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4); |
595 | 280k | UWORD16 u2_sub_mb_num_pack = 0x028A; |
596 | | |
597 | | /* Loading the table pointers */ |
598 | 280k | const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw; |
599 | 280k | const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth; |
600 | 280k | const UWORD8 * pu1_sub_mb_indx_mod = |
601 | 280k | (const UWORD8 *)(gau1_ih264d_submb_indx_mod) |
602 | 280k | + (uc_sub_mb * 6); |
603 | 280k | const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw; |
604 | 280k | const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth; |
605 | 280k | const UWORD8 * pu1_num_sub_mb_part = |
606 | 280k | (const UWORD8 *)gau1_ih264d_num_submb_part; |
607 | | |
608 | | /*********************************************************/ |
609 | | /* default initialisations for condition (uc_sub_mb == 0) */ |
610 | | /* i.e. all are subpartitions of 8x8 */ |
611 | | /*********************************************************/ |
612 | 280k | u1_sub_mb_mode = 0; |
613 | 280k | u1_num_subpart = 1; |
614 | 280k | u1_mb_part_width = pu1_mb_partw[u1_mb_type]; |
615 | 280k | u1_mb_part_height = pu1_mb_parth[u1_mb_type]; |
616 | 280k | pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_type << 1); |
617 | 280k | u4_sub_mb_num = 0; |
618 | | |
619 | | /* Loop on number of partitions */ |
620 | 823k | for(uc_i = 0, u1_p_idx = 0; uc_i < u1_num_mb_part; uc_i++) |
621 | 543k | { |
622 | 543k | UWORD8 uc_j; |
623 | 543k | if(uc_sub_mb) |
624 | 164k | { |
625 | 164k | u1_sub_mb_mode = u4_sub_mb_pack >> 24; |
626 | 164k | u1_num_subpart = pu1_num_sub_mb_part[u1_sub_mb_mode]; |
627 | 164k | u1_mb_part_width = pu1_sub_mb_partw[u1_sub_mb_mode]; |
628 | 164k | u1_mb_part_height = pu1_sub_mb_parth[u1_sub_mb_mode]; |
629 | 164k | pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_sub_mb_mode << 1); |
630 | 164k | u4_sub_mb_num = u2_sub_mb_num_pack >> 12; |
631 | 164k | u4_sub_mb_pack <<= 8; |
632 | 164k | u2_sub_mb_num_pack <<= 4; |
633 | 164k | } |
634 | | /* Loop on Number of sub-partitions */ |
635 | 1.19M | for(uc_j = 0; uc_j < u1_num_subpart; uc_j++, pu1_top_left_sub_mb_indx++) |
636 | 650k | { |
637 | 650k | mv_pred_t * ps_mv; |
638 | | |
639 | 650k | u4_sub_mb_num += *pu1_top_left_sub_mb_indx; |
640 | 650k | ps_mv = ps_mv_start + u4_sub_mb_num; |
641 | | |
642 | | /* Storing Info for partitions */ |
643 | 650k | ps_part->u1_is_direct = PART_NOT_DIRECT; |
644 | 650k | ps_part->u1_sub_mb_num = u4_sub_mb_num; |
645 | 650k | ps_part->u1_partheight = u1_mb_part_height; |
646 | 650k | ps_part->u1_partwidth = u1_mb_part_width; |
647 | | |
648 | | /* Increment partition Index */ |
649 | 650k | u1_p_idx++; |
650 | 650k | ps_part++; |
651 | | |
652 | 650k | ih264d_get_mvd_cabac(u4_sub_mb_num, 0, u1_mb_part_width, |
653 | 650k | u1_mb_part_height, 1, ps_dec, ps_mv); |
654 | 650k | } |
655 | 543k | } |
656 | 280k | ps_parse_mb_data->u1_num_part = u1_p_idx; |
657 | 280k | ps_dec->ps_part = ps_part; |
658 | 280k | } |
659 | 280k | { |
660 | 280k | UWORD8 u1_cbp; |
661 | | |
662 | | /* Read the Coded block pattern */ |
663 | 280k | u1_cbp = (WORD8)ih264d_parse_ctx_cbp_cabac(ps_dec); |
664 | 280k | COPYTHECONTEXT("coded_block_pattern", u1_cbp); |
665 | 280k | ps_cur_mb_info->u1_cbp = u1_cbp; |
666 | 280k | p_curr_ctxt->u1_cbp = u1_cbp; |
667 | 280k | p_curr_ctxt->u1_intra_chroma_pred_mode = 0; |
668 | 280k | p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE; |
669 | 280k | ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6; |
670 | | |
671 | 280k | if(u1_cbp > 47) |
672 | 0 | return ERROR_CBP; |
673 | | |
674 | 280k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
675 | 280k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
676 | | |
677 | | /* Read the transform8x8 u4_flag if present */ |
678 | 280k | if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & 0xf) |
679 | 60.1k | && u1_no_submb_part_size_lt8x8_flag) |
680 | 52.6k | { |
681 | 52.6k | ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac( |
682 | 52.6k | ps_dec, ps_cur_mb_info); |
683 | 52.6k | COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8); |
684 | 52.6k | p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8; |
685 | 52.6k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8; |
686 | | |
687 | 52.6k | } |
688 | 227k | else |
689 | 227k | { |
690 | 227k | p_curr_ctxt->u1_transform8x8_ctxt = 0; |
691 | 227k | } |
692 | | |
693 | | /* Read mb_qp_delta */ |
694 | 280k | if(u1_cbp) |
695 | 99.0k | { |
696 | 99.0k | WORD8 c_temp; |
697 | 99.0k | ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp); |
698 | 99.0k | if(ret != OK) |
699 | 73 | return ret; |
700 | 98.9k | COPYTHECONTEXT("mb_qp_delta", c_temp); |
701 | 98.9k | if(c_temp != 0) |
702 | 22.1k | { |
703 | 22.1k | ret = ih264d_update_qp(ps_dec, c_temp); |
704 | 22.1k | if(ret != OK) |
705 | 0 | return ret; |
706 | 22.1k | } |
707 | 98.9k | } |
708 | 181k | else |
709 | 181k | ps_dec->i1_prev_mb_qp_delta = 0; |
710 | | |
711 | | |
712 | | |
713 | 280k | ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0); |
714 | 280k | if(EXCEED_OFFSET(ps_dec->ps_bitstrm)) |
715 | 2.91k | return ERROR_EOB_TERMINATE_T; |
716 | 280k | } |
717 | 277k | return OK; |
718 | 280k | } |
719 | | |
720 | | /*! |
721 | | ************************************************************************** |
722 | | * \if Function name : parsePSliceData \endif |
723 | | * |
724 | | * \brief |
725 | | * This function parses CAVLC syntax of N MB's of a P slice. |
726 | | * 1. After parsing syntax of N MB's, for those N MB's (less than N, incase |
727 | | * of end of slice or end of row), MB is decoded. This process is carried |
728 | | * for one complete MB row or till end of slice. |
729 | | * 2. Bottom one row of current MB is copied to IntraPredLine buffers. |
730 | | * IntraPredLine buffers are used for Intra prediction of next row. |
731 | | * 3. Current MB row along with previous 4 rows of Luma (and 2 of Chroma) are |
732 | | * deblocked. |
733 | | * 4. 4 rows (2 for Chroma) previous row and 12 rows (6 for Chroma) are |
734 | | * DMA'ed to picture buffers. |
735 | | * |
736 | | * \return |
737 | | * 0 on Success and Error code otherwise |
738 | | ************************************************************************** |
739 | | */ |
740 | | |
741 | | /*! |
742 | | ************************************************************************** |
743 | | * \if Function name : ih264d_update_nnz_for_skipmb \endif |
744 | | * |
745 | | * \brief |
746 | | * |
747 | | * \return |
748 | | * None |
749 | | * |
750 | | ************************************************************************** |
751 | | */ |
752 | | void ih264d_update_nnz_for_skipmb(dec_struct_t * ps_dec, |
753 | | dec_mb_info_t * ps_cur_mb_info, |
754 | | UWORD8 u1_entrpy) |
755 | 33.0M | { |
756 | 33.0M | UWORD32 *pu4_buf; |
757 | 33.0M | UWORD8 *pu1_buf; |
758 | 33.0M | UNUSED(u1_entrpy); |
759 | 33.0M | pu1_buf = ps_dec->pu1_left_nnz_y; |
760 | 33.0M | pu4_buf = (UWORD32 *)pu1_buf; |
761 | 33.0M | *pu4_buf = 0; |
762 | 33.0M | pu1_buf = ps_dec->pu1_left_nnz_uv; |
763 | 33.0M | pu4_buf = (UWORD32 *)pu1_buf; |
764 | 33.0M | *pu4_buf = 0; |
765 | 33.0M | pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_y; |
766 | 33.0M | pu4_buf = (UWORD32 *)pu1_buf; |
767 | 33.0M | *pu4_buf = 0; |
768 | 33.0M | pu1_buf = ps_cur_mb_info->ps_curmb->pu1_nnz_uv; |
769 | 33.0M | pu4_buf = (UWORD32 *)pu1_buf; |
770 | 33.0M | *pu4_buf = 0; |
771 | 33.0M | ps_cur_mb_info->ps_curmb->u2_luma_csbp = 0; |
772 | 33.0M | ps_cur_mb_info->u2_luma_csbp = 0; |
773 | 33.0M | ps_cur_mb_info->u2_chroma_csbp = 0; |
774 | 33.0M | } |
775 | | |
776 | | |
777 | | |
778 | | /*****************************************************************************/ |
779 | | /* */ |
780 | | /* Function Name : ih264d_parse_inter_slice_data_cabac */ |
781 | | /* */ |
782 | | /* Description : This function parses cabac syntax of a inter slice on */ |
783 | | /* N MB basis. */ |
784 | | /* */ |
785 | | /* Inputs : ps_dec */ |
786 | | /* sliceparams */ |
787 | | /* firstMbInSlice */ |
788 | | /* */ |
789 | | /* Processing : 1. After parsing syntax for N MBs those N MBs are */ |
790 | | /* decoded till the end of slice. */ |
791 | | /* 2. MV prediction and DMA happens on a N/2 MB basis. */ |
792 | | /* */ |
793 | | /* Returns : 0 */ |
794 | | /* */ |
795 | | /* Issues : <List any issues or problems with this function> */ |
796 | | /* */ |
797 | | /* Revision History: */ |
798 | | /* */ |
799 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
800 | | /* 13 07 2002 Jay Draft */ |
801 | | /* */ |
802 | | /*****************************************************************************/ |
803 | | WORD32 ih264d_parse_inter_slice_data_cabac(dec_struct_t * ps_dec, |
804 | | dec_slice_params_t * ps_slice, |
805 | | UWORD16 u2_first_mb_in_slice) |
806 | 10.4k | { |
807 | 10.4k | UWORD32 uc_more_data_flag; |
808 | 10.4k | WORD32 i2_cur_mb_addr; |
809 | 10.4k | UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx; |
810 | 10.4k | UWORD32 u1_mbaff; |
811 | 10.4k | UWORD32 u1_num_mbs_next, u1_end_of_row; |
812 | 10.4k | const UWORD16 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; |
813 | 10.4k | UWORD32 u1_slice_end = 0; |
814 | 10.4k | UWORD32 u1_tfr_n_mb = 0; |
815 | 10.4k | UWORD32 u1_decode_nmb = 0; |
816 | | |
817 | | |
818 | 10.4k | deblk_mb_t *ps_cur_deblk_mb; |
819 | 10.4k | dec_mb_info_t *ps_cur_mb_info; |
820 | | |
821 | 10.4k | parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data; |
822 | 10.4k | UWORD32 u1_inter_mb_skip_type; |
823 | 10.4k | UWORD32 u1_inter_mb_type; |
824 | 10.4k | UWORD32 u1_deblk_mb_type; |
825 | 10.4k | UWORD32 u1_mb_threshold; |
826 | 10.4k | dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
827 | 10.4k | WORD32 ret = OK; |
828 | | |
829 | | /******************************************************/ |
830 | | /* Initialisations specific to B or P slice */ |
831 | | /******************************************************/ |
832 | 10.4k | if(ps_slice->u1_slice_type == P_SLICE) |
833 | 4.15k | { |
834 | 4.15k | u1_inter_mb_skip_type = CAB_P_SKIP; |
835 | 4.15k | u1_inter_mb_type = P_MB; |
836 | 4.15k | u1_deblk_mb_type = D_INTER_MB; |
837 | 4.15k | u1_mb_threshold = 5; |
838 | 4.15k | } |
839 | 6.26k | else // B_SLICE |
840 | 6.26k | { |
841 | 6.26k | u1_inter_mb_skip_type = CAB_B_SKIP; |
842 | 6.26k | u1_inter_mb_type = B_MB; |
843 | 6.26k | u1_deblk_mb_type = D_B_SLICE; |
844 | 6.26k | u1_mb_threshold = 23; |
845 | 6.26k | } |
846 | | |
847 | | /******************************************************/ |
848 | | /* Slice Level Initialisations */ |
849 | | /******************************************************/ |
850 | 10.4k | i2_cur_mb_addr = u2_first_mb_in_slice; |
851 | 10.4k | ps_dec->u1_qp = ps_slice->u1_slice_qp; |
852 | 10.4k | ih264d_update_qp(ps_dec, 0); |
853 | 10.4k | u1_mb_idx = ps_dec->u4_mb_idx; |
854 | 10.4k | u1_num_mbs = u1_mb_idx; |
855 | 10.4k | u1_num_mbsNby2 = 0; |
856 | 10.4k | u1_mbaff = ps_slice->u1_mbaff_frame_flag; |
857 | 10.4k | i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff; |
858 | 10.4k | uc_more_data_flag = 1; |
859 | | |
860 | | /* Initialisations specific to cabac */ |
861 | 10.4k | if(ps_bitstrm->u4_ofst & 0x07) |
862 | 8.44k | { |
863 | 8.44k | ps_bitstrm->u4_ofst += 8; |
864 | 8.44k | ps_bitstrm->u4_ofst &= 0xFFFFFFF8; |
865 | 8.44k | } |
866 | | |
867 | 10.4k | ret = ih264d_init_cabac_dec_envirnoment(&(ps_dec->s_cab_dec_env), ps_bitstrm); |
868 | 10.4k | if(ret != OK) |
869 | 81 | return ret; |
870 | | |
871 | 10.3k | ps_dec->i1_prev_mb_qp_delta = 0; |
872 | | |
873 | 856k | while(!u1_slice_end) |
874 | 852k | { |
875 | 852k | UWORD8 u1_mb_type; |
876 | 852k | UWORD32 u4_mb_skip; |
877 | | |
878 | 852k | ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; |
879 | | |
880 | 852k | if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr) |
881 | 5.25k | { |
882 | 5.25k | break; |
883 | 5.25k | } |
884 | | |
885 | 847k | ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; |
886 | 847k | ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; |
887 | | |
888 | 847k | ps_cur_mb_info->u1_Mux = 0; |
889 | 847k | ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); |
890 | 847k | ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; |
891 | | |
892 | 847k | ps_cur_mb_info->u1_end_of_slice = 0; |
893 | | |
894 | | /* Storing Default partition info */ |
895 | 847k | ps_parse_mb_data->u1_num_part = 1; |
896 | 847k | ps_parse_mb_data->u4_isI_mb = 0; |
897 | | |
898 | | /***************************************************************/ |
899 | | /* Get the required information for decoding of MB */ |
900 | | /* mb_x, mb_y , neighbour availablity, */ |
901 | | /***************************************************************/ |
902 | 847k | u4_mb_skip = ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, 1); |
903 | | |
904 | | /*********************************************************************/ |
905 | | /* initialize u1_tran_form8x8 to zero to aviod uninitialized accesses */ |
906 | | /*********************************************************************/ |
907 | 847k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
908 | 847k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
909 | | |
910 | | /***************************************************************/ |
911 | | /* Set the deblocking parameters for this MB */ |
912 | | /***************************************************************/ |
913 | 847k | if(ps_dec->u4_app_disable_deblk_frm == 0) |
914 | 847k | ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, |
915 | 847k | ps_dec->u1_mb_ngbr_availablity, |
916 | 847k | ps_dec->u1_cur_mb_fld_dec_flag); |
917 | | |
918 | 847k | if(u4_mb_skip) |
919 | 547k | { |
920 | | |
921 | | /* Set appropriate flags in ps_cur_mb_info and ps_dec */ |
922 | 547k | memset(ps_dec->ps_curr_ctxt_mb_info, 0, sizeof(ctxt_inc_mb_info_t)); |
923 | 547k | ps_dec->ps_curr_ctxt_mb_info->u1_mb_type = u1_inter_mb_skip_type; |
924 | | |
925 | 547k | MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0); |
926 | | |
927 | 547k | *((UWORD32 *)ps_dec->pi1_left_ref_idx_ctxt_inc) = 0; |
928 | 547k | *(ps_dec->pu1_left_yuv_dc_csbp) = 0; |
929 | | |
930 | 547k | ps_dec->i1_prev_mb_qp_delta = 0; |
931 | 547k | ps_cur_mb_info->u1_mb_type = MB_SKIP; |
932 | 547k | ps_cur_mb_info->u1_cbp = 0; |
933 | | |
934 | 547k | { |
935 | | /* Storing Skip partition info */ |
936 | 547k | parse_part_params_t *ps_part_info = ps_dec->ps_part; |
937 | 547k | ps_part_info->u1_is_direct = PART_DIRECT_16x16; |
938 | 547k | ps_part_info->u1_sub_mb_num = 0; |
939 | 547k | ps_dec->ps_part++; |
940 | 547k | } |
941 | | |
942 | | /* Update Nnzs */ |
943 | 547k | ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CABAC); |
944 | | |
945 | 547k | ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; |
946 | 547k | ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; |
947 | 547k | ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; |
948 | | |
949 | 547k | } |
950 | 299k | else |
951 | 299k | { |
952 | | |
953 | | /* Macroblock Layer Begins */ |
954 | | /* Decode the u1_mb_type */ |
955 | 299k | u1_mb_type = ih264d_parse_mb_type_cabac(ps_dec); |
956 | 299k | ps_cur_mb_info->u1_mb_type = u1_mb_type; |
957 | 299k | if(u1_mb_type > (25 + u1_mb_threshold)) |
958 | 0 | return ERROR_MB_TYPE; |
959 | | |
960 | | /* Parse Macroblock Data */ |
961 | 299k | if(u1_mb_type < u1_mb_threshold) |
962 | 268k | { |
963 | 268k | ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; |
964 | 268k | *(ps_dec->pu1_left_yuv_dc_csbp) &= 0x6; |
965 | | |
966 | 268k | ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs, |
967 | 268k | u1_num_mbsNby2); |
968 | 268k | if(ret != OK) |
969 | 1.20k | return ret; |
970 | 266k | ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; |
971 | 266k | ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; |
972 | 266k | } |
973 | 31.4k | else |
974 | 31.4k | { |
975 | | /* Storing Intra partition info */ |
976 | 31.4k | ps_parse_mb_data->u1_num_part = 0; |
977 | 31.4k | ps_parse_mb_data->u4_isI_mb = 1; |
978 | | |
979 | 31.4k | if((25 + u1_mb_threshold) == u1_mb_type) |
980 | 438 | { |
981 | | /* I_PCM_MB */ |
982 | 438 | ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB; |
983 | 438 | ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs); |
984 | 438 | if(ret != OK) |
985 | 87 | return ret; |
986 | 351 | ps_cur_deblk_mb->u1_mb_qp = 0; |
987 | 351 | } |
988 | 30.9k | else |
989 | 30.9k | { |
990 | 30.9k | if(u1_mb_type == u1_mb_threshold) |
991 | 16.9k | ps_cur_mb_info->ps_curmb->u1_mb_type = I_4x4_MB; |
992 | 14.0k | else |
993 | 14.0k | ps_cur_mb_info->ps_curmb->u1_mb_type = I_16x16_MB; |
994 | | |
995 | 30.9k | ret = ih264d_parse_imb_cabac( |
996 | 30.9k | ps_dec, ps_cur_mb_info, |
997 | 30.9k | (UWORD8)(u1_mb_type - u1_mb_threshold)); |
998 | 30.9k | if(ret != OK) |
999 | 152 | return ret; |
1000 | 30.8k | ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; |
1001 | 30.8k | } |
1002 | 31.1k | ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB; |
1003 | | |
1004 | 31.1k | } |
1005 | | |
1006 | 299k | } |
1007 | | |
1008 | 845k | if(ps_dec->u1_enable_mb_info) |
1009 | 0 | { |
1010 | 0 | ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1, |
1011 | 0 | ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp); |
1012 | 0 | } |
1013 | | |
1014 | 845k | if(u1_mbaff) |
1015 | 147k | { |
1016 | 147k | ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); |
1017 | 147k | } |
1018 | | |
1019 | | |
1020 | 845k | if(ps_cur_mb_info->u1_topmb && u1_mbaff) |
1021 | 74.0k | uc_more_data_flag = 1; |
1022 | 771k | else |
1023 | 771k | { |
1024 | 771k | uc_more_data_flag = ih264d_decode_terminate(&ps_dec->s_cab_dec_env, |
1025 | 771k | ps_bitstrm); |
1026 | 771k | uc_more_data_flag = !uc_more_data_flag; |
1027 | 771k | COPYTHECONTEXT("Decode Sliceterm",!uc_more_data_flag); |
1028 | 771k | } |
1029 | | |
1030 | 845k | if(u1_mbaff) |
1031 | 147k | { |
1032 | 147k | if(!uc_more_data_flag && (0 == (i2_cur_mb_addr & 1))) |
1033 | 0 | { |
1034 | 0 | return ERROR_EOB_FLUSHBITS_T; |
1035 | 0 | } |
1036 | 147k | } |
1037 | | /* Next macroblock information */ |
1038 | 845k | i2_cur_mb_addr++; |
1039 | 845k | u1_num_mbs++; |
1040 | 845k | u1_num_mbsNby2++; |
1041 | 845k | ps_parse_mb_data++; |
1042 | | |
1043 | | /****************************************************************/ |
1044 | | /* Check for End Of Row and other flags that determine when to */ |
1045 | | /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for */ |
1046 | | /* N-Mb */ |
1047 | | /****************************************************************/ |
1048 | 845k | u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; |
1049 | 845k | u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); |
1050 | 845k | u1_slice_end = !uc_more_data_flag; |
1051 | 845k | u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row |
1052 | 810k | || u1_slice_end; |
1053 | 845k | u1_decode_nmb = u1_tfr_n_mb || u1_slice_end; |
1054 | 845k | ps_cur_mb_info->u1_end_of_slice = u1_slice_end; |
1055 | | /*u1_dma_nby2mb = u1_decode_nmb || |
1056 | | (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/ |
1057 | | |
1058 | | //if(u1_dma_nby2mb) |
1059 | 845k | if(u1_decode_nmb) |
1060 | 37.8k | { |
1061 | | |
1062 | 37.8k | ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); |
1063 | 37.8k | u1_num_mbsNby2 = 0; |
1064 | | |
1065 | 37.8k | { |
1066 | 37.8k | ps_parse_mb_data = ps_dec->ps_parse_mb_data; |
1067 | 37.8k | ps_dec->ps_part = ps_dec->ps_parse_part_params; |
1068 | 37.8k | } |
1069 | 37.8k | } |
1070 | | |
1071 | | /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d", |
1072 | | ps_slice->i4_poc >> ps_slice->u1_field_pic_flag, |
1073 | | ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb)); |
1074 | | H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d, u1_num_mbs: %d", u1_decode_nmb, u1_num_mbs);*/ |
1075 | 845k | if(u1_decode_nmb) |
1076 | 37.8k | { |
1077 | | |
1078 | 37.8k | if(ps_dec->u1_separate_parse) |
1079 | 24.5k | { |
1080 | 24.5k | ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, |
1081 | 24.5k | u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); |
1082 | 24.5k | ps_dec->ps_nmb_info += u1_num_mbs; |
1083 | 24.5k | } |
1084 | 13.3k | else |
1085 | 13.3k | { |
1086 | 13.3k | ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, |
1087 | 13.3k | u1_num_mbs_next, u1_tfr_n_mb, |
1088 | 13.3k | u1_end_of_row); |
1089 | 13.3k | } |
1090 | 37.8k | ps_dec->u4_total_mbs_coded += u1_num_mbs; |
1091 | 37.8k | if(u1_tfr_n_mb) |
1092 | 37.8k | u1_num_mbs = 0; |
1093 | 37.8k | u1_mb_idx = u1_num_mbs; |
1094 | 37.8k | ps_dec->u4_mb_idx = u1_num_mbs; |
1095 | | |
1096 | 37.8k | } |
1097 | 845k | } |
1098 | | |
1099 | | |
1100 | 8.89k | ps_dec->u4_num_mbs_cur_nmb = 0; |
1101 | 8.89k | ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr |
1102 | | |
1103 | 8.89k | - (u2_first_mb_in_slice << u1_mbaff); |
1104 | | |
1105 | 8.89k | return ret; |
1106 | 10.3k | } |
1107 | | |
1108 | | /*****************************************************************************/ |
1109 | | /* */ |
1110 | | /* Function Name : ih264d_parse_inter_slice_data_cavlc */ |
1111 | | /* */ |
1112 | | /* Description : This function parses cavlc syntax of a inter slice on */ |
1113 | | /* N MB basis. */ |
1114 | | /* */ |
1115 | | /* Inputs : ps_dec */ |
1116 | | /* sliceparams */ |
1117 | | /* firstMbInSlice */ |
1118 | | /* */ |
1119 | | /* Processing : 1. After parsing syntax for N MBs those N MBs are */ |
1120 | | /* decoded till the end of slice. */ |
1121 | | /* 2. MV prediction and DMA happens on a N/2 MB basis. */ |
1122 | | /* */ |
1123 | | /* Returns : 0 */ |
1124 | | /* */ |
1125 | | /* Issues : <List any issues or problems with this function> */ |
1126 | | /* */ |
1127 | | /* Revision History: */ |
1128 | | /* */ |
1129 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1130 | | /* 13 07 2002 Jay Draft */ |
1131 | | /* */ |
1132 | | /*****************************************************************************/ |
1133 | | |
1134 | | WORD32 ih264d_parse_inter_slice_data_cavlc(dec_struct_t * ps_dec, |
1135 | | dec_slice_params_t * ps_slice, |
1136 | | UWORD16 u2_first_mb_in_slice) |
1137 | 55.9k | { |
1138 | 55.9k | UWORD32 uc_more_data_flag; |
1139 | 55.9k | WORD32 i2_cur_mb_addr; |
1140 | 55.9k | UWORD32 u1_num_mbs, u1_num_mbsNby2, u1_mb_idx; |
1141 | 55.9k | UWORD32 i2_mb_skip_run; |
1142 | 55.9k | UWORD32 u1_read_mb_type; |
1143 | | |
1144 | 55.9k | UWORD32 u1_mbaff; |
1145 | 55.9k | UWORD32 u1_num_mbs_next, u1_end_of_row; |
1146 | 55.9k | const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; |
1147 | 55.9k | UWORD32 u1_slice_end = 0; |
1148 | 55.9k | UWORD32 u1_tfr_n_mb = 0; |
1149 | 55.9k | UWORD32 u1_decode_nmb = 0; |
1150 | | |
1151 | 55.9k | dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
1152 | 55.9k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
1153 | 55.9k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
1154 | 55.9k | deblk_mb_t *ps_cur_deblk_mb; |
1155 | 55.9k | dec_mb_info_t *ps_cur_mb_info; |
1156 | 55.9k | parse_pmbarams_t *ps_parse_mb_data = ps_dec->ps_parse_mb_data; |
1157 | 55.9k | UWORD32 u1_inter_mb_type; |
1158 | 55.9k | UWORD32 u1_deblk_mb_type; |
1159 | 55.9k | UWORD32 u1_mb_threshold; |
1160 | 55.9k | WORD32 ret = OK; |
1161 | | |
1162 | | /******************************************************/ |
1163 | | /* Initialisations specific to B or P slice */ |
1164 | | /******************************************************/ |
1165 | | |
1166 | 55.9k | if(ps_slice->u1_slice_type == P_SLICE) |
1167 | 32.6k | { |
1168 | 32.6k | u1_inter_mb_type = P_MB; |
1169 | 32.6k | u1_deblk_mb_type = D_INTER_MB; |
1170 | 32.6k | u1_mb_threshold = 5; |
1171 | 32.6k | } |
1172 | 23.2k | else // B_SLICE |
1173 | 23.2k | { |
1174 | 23.2k | u1_inter_mb_type = B_MB; |
1175 | 23.2k | u1_deblk_mb_type = D_B_SLICE; |
1176 | 23.2k | u1_mb_threshold = 23; |
1177 | 23.2k | } |
1178 | | /******************************************************/ |
1179 | | /* Slice Level Initialisations */ |
1180 | | /******************************************************/ |
1181 | 55.9k | ps_dec->u1_qp = ps_slice->u1_slice_qp; |
1182 | 55.9k | ih264d_update_qp(ps_dec, 0); |
1183 | 55.9k | u1_mb_idx = ps_dec->u4_mb_idx; |
1184 | 55.9k | u1_num_mbs = u1_mb_idx; |
1185 | | |
1186 | 55.9k | u1_num_mbsNby2 = 0; |
1187 | 55.9k | u1_mbaff = ps_slice->u1_mbaff_frame_flag; |
1188 | 55.9k | i2_cur_mb_addr = u2_first_mb_in_slice << u1_mbaff; |
1189 | 55.9k | i2_mb_skip_run = 0; |
1190 | 55.9k | uc_more_data_flag = 1; |
1191 | 55.9k | u1_read_mb_type = 0; |
1192 | | |
1193 | 5.02M | while(!u1_slice_end) |
1194 | 5.01M | { |
1195 | 5.01M | UWORD8 u1_mb_type; |
1196 | | |
1197 | 5.01M | ps_dec->pv_prev_mb_parse_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; |
1198 | | |
1199 | 5.01M | if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr) |
1200 | 44.2k | { |
1201 | 44.2k | break; |
1202 | 44.2k | } |
1203 | | |
1204 | | |
1205 | 4.97M | ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; |
1206 | 4.97M | ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; |
1207 | | |
1208 | 4.97M | ps_cur_mb_info->u1_Mux = 0; |
1209 | 4.97M | ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); |
1210 | 4.97M | ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; |
1211 | | |
1212 | 4.97M | ps_cur_mb_info->u1_end_of_slice = 0; |
1213 | | |
1214 | | /* Storing Default partition info */ |
1215 | 4.97M | ps_parse_mb_data->u1_num_part = 1; |
1216 | 4.97M | ps_parse_mb_data->u4_isI_mb = 0; |
1217 | | |
1218 | 4.97M | if((!i2_mb_skip_run) && (!u1_read_mb_type)) |
1219 | 259k | { |
1220 | | |
1221 | | //Inlined ih264d_uev |
1222 | 259k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
1223 | 259k | UWORD32 u4_word, u4_ldz; |
1224 | | |
1225 | | /***************************************************************/ |
1226 | | /* Find leading zeros in next 32 bits */ |
1227 | | /***************************************************************/ |
1228 | 259k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
1229 | | |
1230 | 259k | u4_ldz = CLZ(u4_word); |
1231 | | |
1232 | | /* Flush the ps_bitstrm */ |
1233 | 259k | u4_bitstream_offset += (u4_ldz + 1); |
1234 | | /* Read the suffix from the ps_bitstrm */ |
1235 | 259k | u4_word = 0; |
1236 | 259k | if(u4_ldz) |
1237 | 105k | { |
1238 | 105k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, |
1239 | 105k | u4_ldz); |
1240 | 105k | } |
1241 | 259k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
1242 | 259k | i2_mb_skip_run = ((1 << u4_ldz) + u4_word - 1); |
1243 | | //Inlined ih264d_uev |
1244 | 259k | COPYTHECONTEXT("mb_skip_run", i2_mb_skip_run); |
1245 | 259k | uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm); |
1246 | 259k | u1_read_mb_type = uc_more_data_flag; |
1247 | 259k | } |
1248 | | |
1249 | | /***************************************************************/ |
1250 | | /* Get the required information for decoding of MB */ |
1251 | | /* mb_x, mb_y , neighbour availablity, */ |
1252 | | /***************************************************************/ |
1253 | 4.97M | ps_dec->pf_get_mb_info(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); |
1254 | | |
1255 | | /***************************************************************/ |
1256 | | /* Set the deblocking parameters for this MB */ |
1257 | | /***************************************************************/ |
1258 | 4.97M | if(ps_dec->u4_app_disable_deblk_frm == 0) |
1259 | 4.97M | ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, |
1260 | 4.97M | ps_dec->u1_mb_ngbr_availablity, |
1261 | 4.97M | ps_dec->u1_cur_mb_fld_dec_flag); |
1262 | | |
1263 | 4.97M | if(i2_mb_skip_run) |
1264 | 4.75M | { |
1265 | | /* Set appropriate flags in ps_cur_mb_info and ps_dec */ |
1266 | 4.75M | ps_dec->i1_prev_mb_qp_delta = 0; |
1267 | 4.75M | ps_dec->u1_sub_mb_num = 0; |
1268 | 4.75M | ps_cur_mb_info->u1_mb_type = MB_SKIP; |
1269 | 4.75M | ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16; |
1270 | 4.75M | ps_cur_mb_info->u1_cbp = 0; |
1271 | | |
1272 | 4.75M | { |
1273 | | /* Storing Skip partition info */ |
1274 | 4.75M | parse_part_params_t *ps_part_info = ps_dec->ps_part; |
1275 | 4.75M | ps_part_info->u1_is_direct = PART_DIRECT_16x16; |
1276 | 4.75M | ps_part_info->u1_sub_mb_num = 0; |
1277 | 4.75M | ps_dec->ps_part++; |
1278 | 4.75M | } |
1279 | | |
1280 | | /* Update Nnzs */ |
1281 | 4.75M | ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); |
1282 | | |
1283 | 4.75M | ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; |
1284 | 4.75M | ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; |
1285 | | |
1286 | 4.75M | i2_mb_skip_run--; |
1287 | 4.75M | } |
1288 | 218k | else |
1289 | 218k | { |
1290 | 218k | u1_read_mb_type = 0; |
1291 | | /**************************************************************/ |
1292 | | /* Macroblock Layer Begins, Decode the u1_mb_type */ |
1293 | | /**************************************************************/ |
1294 | 218k | { |
1295 | 218k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
1296 | 218k | UWORD32 u4_word, u4_ldz, u4_temp; |
1297 | | |
1298 | | |
1299 | | //Inlined ih264d_uev |
1300 | | /***************************************************************/ |
1301 | | /* Find leading zeros in next 32 bits */ |
1302 | | /***************************************************************/ |
1303 | 218k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
1304 | 218k | u4_ldz = CLZ(u4_word); |
1305 | | /* Flush the ps_bitstrm */ |
1306 | 218k | u4_bitstream_offset += (u4_ldz + 1); |
1307 | | /* Read the suffix from the ps_bitstrm */ |
1308 | 218k | u4_word = 0; |
1309 | 218k | if(u4_ldz) |
1310 | 133k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, |
1311 | 218k | u4_ldz); |
1312 | 218k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
1313 | 218k | u4_temp = ((1 << u4_ldz) + u4_word - 1); |
1314 | | //Inlined ih264d_uev |
1315 | 218k | if(u4_temp > (UWORD32)(25 + u1_mb_threshold)) |
1316 | 104 | return ERROR_MB_TYPE; |
1317 | 218k | u1_mb_type = u4_temp; |
1318 | 218k | COPYTHECONTEXT("u1_mb_type", u1_mb_type); |
1319 | 218k | } |
1320 | 0 | ps_cur_mb_info->u1_mb_type = u1_mb_type; |
1321 | | |
1322 | | /**************************************************************/ |
1323 | | /* Parse Macroblock data */ |
1324 | | /**************************************************************/ |
1325 | 218k | if(u1_mb_type < u1_mb_threshold) |
1326 | 215k | { |
1327 | 215k | ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; |
1328 | | |
1329 | 215k | ret = ps_dec->pf_parse_inter_mb(ps_dec, ps_cur_mb_info, u1_num_mbs, |
1330 | 215k | u1_num_mbsNby2); |
1331 | 215k | if(ret != OK) |
1332 | 685 | return ret; |
1333 | 214k | ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; |
1334 | 214k | } |
1335 | 3.46k | else |
1336 | 3.46k | { |
1337 | | /* Storing Intra partition info */ |
1338 | 3.46k | ps_parse_mb_data->u1_num_part = 0; |
1339 | 3.46k | ps_parse_mb_data->u4_isI_mb = 1; |
1340 | | |
1341 | 3.46k | if((25 + u1_mb_threshold) == u1_mb_type) |
1342 | 1.81k | { |
1343 | | /* I_PCM_MB */ |
1344 | 1.81k | ps_cur_mb_info->ps_curmb->u1_mb_type = I_PCM_MB; |
1345 | 1.81k | ret = ih264d_parse_ipcm_mb(ps_dec, ps_cur_mb_info, u1_num_mbs); |
1346 | 1.81k | if(ret != OK) |
1347 | 0 | return ret; |
1348 | 1.81k | ps_dec->u1_qp = 0; |
1349 | 1.81k | } |
1350 | 1.64k | else |
1351 | 1.64k | { |
1352 | 1.64k | ret = ih264d_parse_imb_cavlc( |
1353 | 1.64k | ps_dec, ps_cur_mb_info, u1_num_mbs, |
1354 | 1.64k | (UWORD8)(u1_mb_type - u1_mb_threshold)); |
1355 | 1.64k | if(ret != OK) |
1356 | 78 | return ret; |
1357 | 1.64k | } |
1358 | | |
1359 | 3.38k | ps_cur_deblk_mb->u1_mb_type |= D_INTRA_MB; |
1360 | 3.38k | } |
1361 | 217k | uc_more_data_flag = MORE_RBSP_DATA(ps_bitstrm); |
1362 | 217k | } |
1363 | 4.97M | ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; |
1364 | | |
1365 | 4.97M | if(ps_dec->u1_enable_mb_info) |
1366 | 0 | { |
1367 | 0 | ih264d_populate_mb_info_map(ps_dec, ps_cur_mb_info, ps_cur_mb_info->u2_mbx << 1, |
1368 | 0 | ps_cur_mb_info->u2_mby << 1, ps_cur_deblk_mb->u1_mb_qp); |
1369 | 0 | } |
1370 | | |
1371 | 4.97M | if(u1_mbaff) |
1372 | 9.95k | { |
1373 | 9.95k | ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); |
1374 | 9.95k | if(!uc_more_data_flag && !i2_mb_skip_run && (0 == (i2_cur_mb_addr & 1))) |
1375 | 20 | { |
1376 | 20 | return ERROR_EOB_FLUSHBITS_T; |
1377 | 20 | } |
1378 | 9.95k | } |
1379 | | /**************************************************************/ |
1380 | | /* Get next Macroblock address */ |
1381 | | /**************************************************************/ |
1382 | 4.97M | i2_cur_mb_addr++; |
1383 | | |
1384 | 4.97M | u1_num_mbs++; |
1385 | 4.97M | u1_num_mbsNby2++; |
1386 | 4.97M | ps_parse_mb_data++; |
1387 | | |
1388 | | /****************************************************************/ |
1389 | | /* Check for End Of Row and other flags that determine when to */ |
1390 | | /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for */ |
1391 | | /* N-Mb */ |
1392 | | /****************************************************************/ |
1393 | 4.97M | u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; |
1394 | 4.97M | u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); |
1395 | 4.97M | u1_slice_end = (!(uc_more_data_flag || i2_mb_skip_run)); |
1396 | 4.97M | u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row |
1397 | 4.82M | || u1_slice_end; |
1398 | 4.97M | u1_decode_nmb = u1_tfr_n_mb || u1_slice_end; |
1399 | 4.97M | ps_cur_mb_info->u1_end_of_slice = u1_slice_end; |
1400 | | |
1401 | | /*u1_dma_nby2mb = u1_decode_nmb || |
1402 | | (u1_num_mbsNby2 == ps_dec->u1_recon_mb_grp_pair);*/ |
1403 | | |
1404 | | //if(u1_dma_nby2mb) |
1405 | 4.97M | if(u1_decode_nmb) |
1406 | 145k | { |
1407 | 145k | ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); |
1408 | 145k | u1_num_mbsNby2 = 0; |
1409 | | |
1410 | 145k | { |
1411 | 145k | ps_parse_mb_data = ps_dec->ps_parse_mb_data; |
1412 | 145k | ps_dec->ps_part = ps_dec->ps_parse_part_params; |
1413 | 145k | } |
1414 | 145k | } |
1415 | | |
1416 | | /*H264_DEC_DEBUG_PRINT("Pic: %d Mb_X=%d Mb_Y=%d", |
1417 | | ps_slice->i4_poc >> ps_slice->u1_field_pic_flag, |
1418 | | ps_dec->u2_mbx,ps_dec->u2_mby + (1 - ps_cur_mb_info->u1_topmb)); |
1419 | | H264_DEC_DEBUG_PRINT("u1_decode_nmb: %d", u1_decode_nmb);*/ |
1420 | 4.97M | if(u1_decode_nmb) |
1421 | 145k | { |
1422 | | |
1423 | | |
1424 | | |
1425 | 145k | if(ps_dec->u1_separate_parse) |
1426 | 116k | { |
1427 | 116k | ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, |
1428 | 116k | u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); |
1429 | 116k | ps_dec->ps_nmb_info += u1_num_mbs; |
1430 | 116k | } |
1431 | 29.8k | else |
1432 | 29.8k | { |
1433 | 29.8k | ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, |
1434 | 29.8k | u1_num_mbs_next, u1_tfr_n_mb, |
1435 | 29.8k | u1_end_of_row); |
1436 | 29.8k | } |
1437 | 145k | ps_dec->u4_total_mbs_coded += u1_num_mbs; |
1438 | 145k | if(u1_tfr_n_mb) |
1439 | 145k | u1_num_mbs = 0; |
1440 | 145k | u1_mb_idx = u1_num_mbs; |
1441 | 145k | ps_dec->u4_mb_idx = u1_num_mbs; |
1442 | | |
1443 | 145k | } |
1444 | | //ps_dec->ps_pred++; |
1445 | 4.97M | } |
1446 | | |
1447 | 55.0k | ps_dec->u4_num_mbs_cur_nmb = 0; |
1448 | 55.0k | ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr |
1449 | 55.0k | - (u2_first_mb_in_slice << u1_mbaff); |
1450 | | |
1451 | | |
1452 | 55.0k | return ret; |
1453 | 55.9k | } |
1454 | | |
1455 | | WORD32 ih264d_mark_err_slice_skip(dec_struct_t * ps_dec, |
1456 | | WORD32 num_mb_skip, |
1457 | | UWORD8 u1_is_idr_slice, |
1458 | | UWORD16 u2_frame_num, |
1459 | | pocstruct_t *ps_cur_poc, |
1460 | | WORD32 prev_slice_err) |
1461 | 13.9k | { |
1462 | 13.9k | WORD32 i2_cur_mb_addr; |
1463 | 13.9k | UWORD32 u1_num_mbs, u1_num_mbsNby2; |
1464 | 13.9k | UWORD32 u1_mb_idx = ps_dec->u4_mb_idx; |
1465 | 13.9k | UWORD32 i2_mb_skip_run; |
1466 | | |
1467 | 13.9k | UWORD32 u1_num_mbs_next, u1_end_of_row; |
1468 | 13.9k | const UWORD32 i2_pic_wdin_mbs = ps_dec->u2_frm_wd_in_mbs; |
1469 | 13.9k | UWORD32 u1_slice_end; |
1470 | 13.9k | UWORD32 u1_tfr_n_mb; |
1471 | 13.9k | UWORD32 u1_decode_nmb; |
1472 | 13.9k | dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
1473 | 13.9k | dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice; |
1474 | 13.9k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
1475 | 13.9k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
1476 | 13.9k | deblk_mb_t *ps_cur_deblk_mb; |
1477 | 13.9k | dec_mb_info_t *ps_cur_mb_info; |
1478 | 13.9k | parse_pmbarams_t *ps_parse_mb_data; |
1479 | 13.9k | UWORD32 u1_inter_mb_type; |
1480 | 13.9k | UWORD32 u1_deblk_mb_type; |
1481 | 13.9k | UWORD16 u2_total_mbs_coded; |
1482 | 13.9k | UWORD32 u1_mbaff; |
1483 | 13.9k | parse_part_params_t *ps_part_info; |
1484 | 13.9k | WORD32 ret; |
1485 | 13.9k | UNUSED(u1_is_idr_slice); |
1486 | | |
1487 | 13.9k | if(ps_dec->ps_dec_err_status->u1_err_flag & REJECT_CUR_PIC) |
1488 | 0 | { |
1489 | 0 | ih264d_err_pic_dispbuf_mgr(ps_dec); |
1490 | 0 | return 0; |
1491 | 0 | } |
1492 | | |
1493 | 13.9k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag && (num_mb_skip & 1)) |
1494 | 0 | { |
1495 | 0 | num_mb_skip++; |
1496 | 0 | } |
1497 | 13.9k | ps_dec->ps_dpb_cmds->u1_long_term_reference_flag = 0; |
1498 | 13.9k | if(prev_slice_err == 1) |
1499 | 5.58k | { |
1500 | | /* first slice - missing/header corruption */ |
1501 | 5.58k | ps_dec->ps_cur_slice->u2_frame_num = u2_frame_num; |
1502 | 5.58k | { |
1503 | 5.58k | WORD32 i, j, poc = 0; |
1504 | | |
1505 | 5.58k | ps_dec->ps_cur_slice->u2_first_mb_in_slice = 0; |
1506 | | |
1507 | 5.58k | ps_dec->pf_mvpred = ih264d_mvpred_nonmbaff; |
1508 | 5.58k | ps_dec->p_form_mb_part_info = ih264d_form_mb_part_info_bp; |
1509 | 5.58k | ps_dec->p_motion_compensate = ih264d_motion_compensate_bp; |
1510 | | |
1511 | 5.58k | if(ps_dec->ps_cur_pic != NULL) |
1512 | 5.43k | { |
1513 | 5.43k | poc = ps_dec->ps_cur_pic->i4_poc; |
1514 | 5.43k | if (poc <= INT32_MAX - 2) |
1515 | 5.43k | poc += 2; |
1516 | 5.43k | } |
1517 | | |
1518 | 5.58k | j = -1; |
1519 | 6.87k | for(i = 0; i < MAX_NUM_PIC_PARAMS; i++) |
1520 | 6.87k | { |
1521 | 6.87k | if(ps_dec->ps_pps[i].u1_is_valid == TRUE) |
1522 | 5.58k | { |
1523 | 5.58k | if(ps_dec->ps_pps[i].ps_sps->u1_is_valid == TRUE) |
1524 | 5.58k | { |
1525 | 5.58k | j = i; |
1526 | 5.58k | break; |
1527 | 5.58k | } |
1528 | 5.58k | } |
1529 | 6.87k | } |
1530 | | |
1531 | | //if valid SPS PPS is not found return error |
1532 | 5.58k | if(j == -1) |
1533 | 0 | { |
1534 | 0 | return ERROR_INV_SLICE_HDR_T; |
1535 | 0 | } |
1536 | | |
1537 | | /* call ih264d_start_of_pic only if it was not called earlier*/ |
1538 | 5.58k | if(ps_dec->u4_pic_buf_got == 0) |
1539 | 5.58k | { |
1540 | | //initialize slice params required by ih264d_start_of_pic to valid values |
1541 | 5.58k | ps_dec->ps_cur_slice->u1_slice_type = P_SLICE; |
1542 | 5.58k | ps_dec->ps_cur_slice->u1_nal_ref_idc = 1; |
1543 | 5.58k | ps_dec->ps_cur_slice->u1_nal_unit_type = 1; |
1544 | 5.58k | ret = ih264d_start_of_pic(ps_dec, poc, ps_cur_poc, |
1545 | 5.58k | ps_dec->ps_cur_slice->u2_frame_num, |
1546 | 5.58k | &ps_dec->ps_pps[j]); |
1547 | | |
1548 | 5.58k | if(ret != OK) |
1549 | 845 | { |
1550 | 845 | return ret; |
1551 | 845 | } |
1552 | 5.58k | } |
1553 | | |
1554 | 4.73k | ps_dec->ps_ref_pic_buf_lx[0][0]->u1_pic_buf_id = 0; |
1555 | | |
1556 | 4.73k | ps_dec->u4_output_present = 0; |
1557 | | |
1558 | 4.73k | { |
1559 | 4.73k | ih264d_get_next_display_field(ps_dec, |
1560 | 4.73k | ps_dec->ps_out_buffer, |
1561 | 4.73k | &(ps_dec->s_disp_op)); |
1562 | | /* If error code is non-zero then there is no buffer available for display, |
1563 | | hence avoid format conversion */ |
1564 | | |
1565 | 4.73k | if(0 != ps_dec->s_disp_op.u4_error_code) |
1566 | 1.29k | { |
1567 | 1.29k | ps_dec->u4_fmt_conv_cur_row = ps_dec->s_disp_frame_info.u4_y_ht; |
1568 | 1.29k | } |
1569 | 3.43k | else |
1570 | 3.43k | ps_dec->u4_output_present = 1; |
1571 | 4.73k | } |
1572 | | |
1573 | 4.73k | if(ps_dec->u1_separate_parse == 1) |
1574 | 2.61k | { |
1575 | 2.61k | if(ps_dec->u4_dec_thread_created == 0) |
1576 | 70 | { |
1577 | 70 | ithread_create(ps_dec->pv_dec_thread_handle, NULL, |
1578 | 70 | (void *)ih264d_decode_picture_thread, |
1579 | 70 | (void *)ps_dec); |
1580 | | |
1581 | 70 | ps_dec->u4_dec_thread_created = 1; |
1582 | 70 | } |
1583 | 2.61k | if(ps_dec->i4_threads_active) |
1584 | 2.61k | { |
1585 | 2.61k | ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[0]); |
1586 | 2.61k | RETURN_IF((ret != IV_SUCCESS), ret); |
1587 | | |
1588 | 2.61k | ps_dec->ai4_process_start[0] = PROC_START; |
1589 | 2.61k | ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[0]); |
1590 | 2.61k | RETURN_IF((ret != IV_SUCCESS), ret); |
1591 | | |
1592 | 2.61k | ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[0]); |
1593 | 2.61k | RETURN_IF((ret != IV_SUCCESS), ret); |
1594 | 2.61k | } |
1595 | | |
1596 | 2.61k | if((ps_dec->u4_num_cores == 3) && |
1597 | 1.34k | ((ps_dec->u4_app_disable_deblk_frm == 0) || ps_dec->i1_recon_in_thread3_flag) |
1598 | 1.34k | && (ps_dec->u4_bs_deblk_thread_created == 0)) |
1599 | 26 | { |
1600 | 26 | ps_dec->u4_start_recon_deblk = 0; |
1601 | 26 | ithread_create(ps_dec->pv_bs_deblk_thread_handle, NULL, |
1602 | 26 | (void *)ih264d_recon_deblk_thread, |
1603 | 26 | (void *)ps_dec); |
1604 | 26 | ps_dec->u4_bs_deblk_thread_created = 1; |
1605 | 26 | } |
1606 | 2.61k | if(ps_dec->i4_threads_active) |
1607 | 2.61k | { |
1608 | 2.61k | if (ps_dec->u4_bs_deblk_thread_created) |
1609 | 1.34k | { |
1610 | 1.34k | ret = ithread_mutex_lock(ps_dec->apv_proc_start_mutex[1]); |
1611 | 1.34k | RETURN_IF((ret != IV_SUCCESS), ret); |
1612 | | |
1613 | 1.34k | ps_dec->ai4_process_start[1] = PROC_START; |
1614 | 1.34k | ret = ithread_cond_signal(ps_dec->apv_proc_start_condition[1]); |
1615 | 1.34k | RETURN_IF((ret != IV_SUCCESS), ret); |
1616 | | |
1617 | 1.34k | ret = ithread_mutex_unlock(ps_dec->apv_proc_start_mutex[1]); |
1618 | 1.34k | RETURN_IF((ret != IV_SUCCESS), ret); |
1619 | 1.34k | } |
1620 | 2.61k | } |
1621 | 2.61k | } |
1622 | 4.73k | } |
1623 | 4.73k | } |
1624 | 8.39k | else |
1625 | 8.39k | { |
1626 | | // Middle / last slice |
1627 | | |
1628 | 8.39k | dec_slice_struct_t *ps_parse_cur_slice; |
1629 | 8.39k | ps_parse_cur_slice = ps_dec->ps_dec_slice_buf + ps_dec->u2_cur_slice_num; |
1630 | | |
1631 | 8.39k | if(ps_dec->u1_slice_header_done |
1632 | 6.75k | && ps_parse_cur_slice == ps_dec->ps_parse_cur_slice) |
1633 | 6.75k | { |
1634 | | // Slice data corrupted |
1635 | | // in the case of mbaff, conceal from the even mb. |
1636 | 6.75k | if((ps_dec->ps_cur_slice->u1_mbaff_frame_flag) && (ps_dec->u4_num_mbs_cur_nmb & 1)) |
1637 | 677 | { |
1638 | 677 | ps_dec->u4_num_mbs_cur_nmb = ps_dec->u4_num_mbs_cur_nmb - 1; |
1639 | 677 | ps_dec->u4_cur_mb_addr--; |
1640 | 677 | } |
1641 | | |
1642 | 6.75k | u1_num_mbs = ps_dec->u4_num_mbs_cur_nmb; |
1643 | 6.75k | if(u1_num_mbs) |
1644 | 2.35k | { |
1645 | 2.35k | ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs - 1; |
1646 | 2.35k | } |
1647 | 4.40k | else |
1648 | 4.40k | { |
1649 | 4.40k | if(ps_dec->u1_separate_parse) |
1650 | 2.65k | { |
1651 | 2.65k | ps_cur_mb_info = ps_dec->ps_nmb_info; |
1652 | 2.65k | } |
1653 | 1.74k | else |
1654 | 1.74k | { |
1655 | 1.74k | ps_cur_mb_info = ps_dec->ps_nmb_info |
1656 | 1.74k | + ps_dec->u4_num_mbs_prev_nmb - 1; |
1657 | 1.74k | } |
1658 | 4.40k | } |
1659 | | |
1660 | 6.75k | ps_dec->u2_mby = ps_cur_mb_info->u2_mby; |
1661 | 6.75k | ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx; |
1662 | | |
1663 | 6.75k | ps_dec->u1_mb_ngbr_availablity = |
1664 | 6.75k | ps_cur_mb_info->u1_mb_ngbr_availablity; |
1665 | | |
1666 | 6.75k | if(u1_num_mbs) |
1667 | 2.35k | { |
1668 | | // Going back 1 mb |
1669 | 2.35k | ps_dec->pv_parse_tu_coeff_data = ps_dec->pv_prev_mb_parse_tu_coeff_data; |
1670 | 2.35k | ps_dec->u4_cur_mb_addr--; |
1671 | 2.35k | ps_dec->i4_submb_ofst -= SUB_BLK_SIZE; |
1672 | | |
1673 | | // Parse/decode N-MB left unparsed |
1674 | 2.35k | if (ps_dec->u1_pr_sl_type == P_SLICE |
1675 | 1.57k | || ps_dec->u1_pr_sl_type == B_SLICE) |
1676 | 1.39k | { |
1677 | 1.39k | ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); |
1678 | 1.39k | ps_dec->ps_part = ps_dec->ps_parse_part_params; |
1679 | 1.39k | } |
1680 | | |
1681 | 2.35k | u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; |
1682 | 2.35k | u1_end_of_row = (!u1_num_mbs_next) |
1683 | 0 | && (!(ps_dec->ps_cur_slice->u1_mbaff_frame_flag && (u1_num_mbs & 0x01))); |
1684 | 2.35k | u1_slice_end = 1; |
1685 | 2.35k | u1_tfr_n_mb = 1; |
1686 | 2.35k | ps_cur_mb_info->u1_end_of_slice = u1_slice_end; |
1687 | | |
1688 | 2.35k | if(ps_dec->u1_separate_parse) |
1689 | 1.38k | { |
1690 | 1.38k | ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, |
1691 | 1.38k | u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); |
1692 | 1.38k | ps_dec->ps_nmb_info += u1_num_mbs; |
1693 | 1.38k | } |
1694 | 974 | else |
1695 | 974 | { |
1696 | 974 | ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, |
1697 | 974 | u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); |
1698 | 974 | } |
1699 | 2.35k | ps_dec->u4_total_mbs_coded += u1_num_mbs; |
1700 | 2.35k | ps_dec->u4_mb_idx = 0; |
1701 | 2.35k | ps_dec->u4_num_mbs_cur_nmb = 0; |
1702 | 2.35k | } |
1703 | | |
1704 | 6.75k | if(ps_dec->u4_total_mbs_coded |
1705 | 6.75k | >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) |
1706 | 0 | { |
1707 | 0 | ps_dec->u1_pic_decode_done = 1; |
1708 | 0 | return 0; |
1709 | 0 | } |
1710 | | |
1711 | | /* Inserting new slice only if the current slice has atleast 1 MB*/ |
1712 | 6.75k | if(ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice < |
1713 | 6.75k | (UWORD32)(ps_dec->u4_total_mbs_coded >> ps_slice->u1_mbaff_frame_flag)) |
1714 | 5.56k | { |
1715 | 5.56k | ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; |
1716 | 5.56k | ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; |
1717 | 5.56k | ps_dec->u2_cur_slice_num++; |
1718 | 5.56k | ps_dec->ps_parse_cur_slice++; |
1719 | 5.56k | } |
1720 | | |
1721 | 6.75k | } |
1722 | 1.63k | else |
1723 | 1.63k | { |
1724 | | // Slice missing / header corrupted |
1725 | 1.63k | ps_dec->ps_parse_cur_slice = ps_dec->ps_dec_slice_buf |
1726 | 1.63k | + ps_dec->u2_cur_slice_num; |
1727 | 1.63k | } |
1728 | 8.39k | } |
1729 | | |
1730 | | /******************************************************/ |
1731 | | /* Initializations to new slice */ |
1732 | | /******************************************************/ |
1733 | 13.1k | { |
1734 | 13.1k | WORD32 num_entries; |
1735 | 13.1k | WORD32 size; |
1736 | 13.1k | UWORD8 *pu1_buf; |
1737 | | |
1738 | 13.1k | num_entries = MAX_FRAMES; |
1739 | 13.1k | if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) && |
1740 | 3.38k | (0 == ps_dec->i4_display_delay)) |
1741 | 0 | { |
1742 | 0 | num_entries = 1; |
1743 | 0 | } |
1744 | 13.1k | num_entries = ((2 * num_entries) + 1); |
1745 | 13.1k | num_entries *= 2; |
1746 | | |
1747 | 13.1k | size = num_entries * sizeof(void *); |
1748 | 13.1k | size += PAD_MAP_IDX_POC * sizeof(void *); |
1749 | | |
1750 | 13.1k | pu1_buf = (UWORD8 *)ps_dec->pv_map_ref_idx_to_poc_buf; |
1751 | 13.1k | pu1_buf += size * ps_dec->u2_cur_slice_num; |
1752 | 13.1k | ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc = (volatile void **)pu1_buf; |
1753 | 13.1k | } |
1754 | 13.1k | u1_mbaff = ps_slice->u1_mbaff_frame_flag; |
1755 | 13.1k | ps_dec->ps_cur_slice->u2_first_mb_in_slice = ps_dec->u4_total_mbs_coded >> u1_mbaff; |
1756 | 13.1k | ps_dec->ps_cur_slice->i1_slice_alpha_c0_offset = 0; |
1757 | 13.1k | ps_dec->ps_cur_slice->i1_slice_beta_offset = 0; |
1758 | | |
1759 | 13.1k | if(ps_dec->ps_cur_slice->u1_field_pic_flag) |
1760 | 3.94k | ps_dec->u2_prv_frame_num = ps_dec->ps_cur_slice->u2_frame_num; |
1761 | | |
1762 | 13.1k | ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice = ps_dec->u4_total_mbs_coded >> u1_mbaff; |
1763 | 13.1k | ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = ps_dec->ps_cur_slice->u2_log2Y_crwd; |
1764 | | |
1765 | | |
1766 | 13.1k | if(ps_dec->u1_separate_parse) |
1767 | 7.27k | { |
1768 | 7.27k | ps_dec->ps_parse_cur_slice->pv_tu_coeff_data_start = ps_dec->pv_parse_tu_coeff_data; |
1769 | 7.27k | } |
1770 | 5.85k | else |
1771 | 5.85k | { |
1772 | 5.85k | ps_dec->pv_proc_tu_coeff_data = ps_dec->pv_parse_tu_coeff_data; |
1773 | 5.85k | } |
1774 | | |
1775 | | /******************************************************/ |
1776 | | /* Initializations specific to P slice */ |
1777 | | /******************************************************/ |
1778 | 13.1k | u1_inter_mb_type = P_MB; |
1779 | 13.1k | u1_deblk_mb_type = D_INTER_MB; |
1780 | | |
1781 | 13.1k | ps_dec->ps_cur_slice->u1_slice_type = P_SLICE; |
1782 | 13.1k | ps_dec->ps_parse_cur_slice->slice_type = P_SLICE; |
1783 | 13.1k | ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb; |
1784 | 13.1k | ps_dec->ps_part = ps_dec->ps_parse_part_params; |
1785 | 13.1k | ps_dec->u2_mbx = |
1786 | 13.1k | (MOD(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs)); |
1787 | 13.1k | ps_dec->u2_mby = |
1788 | 13.1k | (DIV(ps_dec->ps_cur_slice->u2_first_mb_in_slice - 1, ps_dec->u2_frm_wd_in_mbs)); |
1789 | 13.1k | ps_dec->u2_mby <<= u1_mbaff; |
1790 | | |
1791 | | /******************************************************/ |
1792 | | /* Parsing / decoding the slice */ |
1793 | | /******************************************************/ |
1794 | 13.1k | ps_dec->u1_slice_header_done = 2; |
1795 | 13.1k | ps_dec->u1_qp = ps_slice->u1_slice_qp; |
1796 | 13.1k | ih264d_update_qp(ps_dec, 0); |
1797 | 13.1k | u1_mb_idx = ps_dec->u4_mb_idx; |
1798 | 13.1k | ps_parse_mb_data = ps_dec->ps_parse_mb_data; |
1799 | 13.1k | u1_num_mbs = u1_mb_idx; |
1800 | | |
1801 | 13.1k | u1_slice_end = 0; |
1802 | 13.1k | u1_tfr_n_mb = 0; |
1803 | 13.1k | u1_decode_nmb = 0; |
1804 | 13.1k | u1_num_mbsNby2 = 0; |
1805 | 13.1k | i2_cur_mb_addr = ps_dec->u4_total_mbs_coded; |
1806 | 13.1k | i2_mb_skip_run = num_mb_skip; |
1807 | | |
1808 | 15.4M | while(!u1_slice_end) |
1809 | 15.4M | { |
1810 | 15.4M | UWORD8 u1_mb_type; |
1811 | | |
1812 | 15.4M | if(i2_cur_mb_addr > ps_dec->ps_cur_sps->u4_max_mb_addr) |
1813 | 1.97k | break; |
1814 | | |
1815 | 15.4M | ps_cur_mb_info = ps_dec->ps_nmb_info + u1_num_mbs; |
1816 | 15.4M | ps_dec->u4_num_mbs_cur_nmb = u1_num_mbs; |
1817 | | |
1818 | 15.4M | ps_cur_mb_info->u1_Mux = 0; |
1819 | 15.4M | ps_dec->u4_num_pmbair = (u1_num_mbs >> u1_mbaff); |
1820 | 15.4M | ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u1_num_mbs; |
1821 | | |
1822 | 15.4M | ps_cur_mb_info->u1_end_of_slice = 0; |
1823 | | |
1824 | | /* Storing Default partition info */ |
1825 | 15.4M | ps_parse_mb_data->u1_num_part = 1; |
1826 | 15.4M | ps_parse_mb_data->u4_isI_mb = 0; |
1827 | | |
1828 | | /**************************************************************/ |
1829 | | /* Get the required information for decoding of MB */ |
1830 | | /**************************************************************/ |
1831 | | /* mb_x, mb_y, neighbor availablity, */ |
1832 | 15.4M | if (u1_mbaff) |
1833 | 2.03M | ih264d_get_mb_info_cavlc_mbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); |
1834 | 13.3M | else |
1835 | 13.3M | ih264d_get_mb_info_cavlc_nonmbaff(ps_dec, i2_cur_mb_addr, ps_cur_mb_info, i2_mb_skip_run); |
1836 | | |
1837 | | /* Set the deblocking parameters for this MB */ |
1838 | 15.4M | if(ps_dec->u4_app_disable_deblk_frm == 0) |
1839 | 15.4M | { |
1840 | 15.4M | ih264d_set_deblocking_parameters(ps_cur_deblk_mb, ps_slice, |
1841 | 15.4M | ps_dec->u1_mb_ngbr_availablity, |
1842 | 15.4M | ps_dec->u1_cur_mb_fld_dec_flag); |
1843 | 15.4M | } |
1844 | | |
1845 | | /* Set appropriate flags in ps_cur_mb_info and ps_dec */ |
1846 | 15.4M | ps_dec->i1_prev_mb_qp_delta = 0; |
1847 | 15.4M | ps_dec->u1_sub_mb_num = 0; |
1848 | 15.4M | ps_cur_mb_info->u1_mb_type = MB_SKIP; |
1849 | 15.4M | ps_cur_mb_info->u1_mb_mc_mode = PRED_16x16; |
1850 | 15.4M | ps_cur_mb_info->u1_cbp = 0; |
1851 | | |
1852 | | /* Storing Skip partition info */ |
1853 | 15.4M | ps_part_info = ps_dec->ps_part; |
1854 | 15.4M | ps_part_info->u1_is_direct = PART_DIRECT_16x16; |
1855 | 15.4M | ps_part_info->u1_sub_mb_num = 0; |
1856 | 15.4M | ps_dec->ps_part++; |
1857 | | |
1858 | | /* Update Nnzs */ |
1859 | 15.4M | ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); |
1860 | | |
1861 | 15.4M | ps_cur_mb_info->ps_curmb->u1_mb_type = u1_inter_mb_type; |
1862 | 15.4M | ps_cur_deblk_mb->u1_mb_type |= u1_deblk_mb_type; |
1863 | | |
1864 | 15.4M | i2_mb_skip_run--; |
1865 | | |
1866 | 15.4M | ps_cur_deblk_mb->u1_mb_qp = ps_dec->u1_qp; |
1867 | | |
1868 | 15.4M | if (u1_mbaff) |
1869 | 2.03M | { |
1870 | 2.03M | ih264d_update_mbaff_left_nnz(ps_dec, ps_cur_mb_info); |
1871 | 2.03M | } |
1872 | | |
1873 | | /**************************************************************/ |
1874 | | /* Get next Macroblock address */ |
1875 | | /**************************************************************/ |
1876 | 15.4M | i2_cur_mb_addr++; |
1877 | | |
1878 | 15.4M | u1_num_mbs++; |
1879 | 15.4M | u1_num_mbsNby2++; |
1880 | 15.4M | ps_parse_mb_data++; |
1881 | | |
1882 | | /****************************************************************/ |
1883 | | /* Check for End Of Row and other flags that determine when to */ |
1884 | | /* do DMA setup for N/2-Mb, Decode for N-Mb, and Transfer for */ |
1885 | | /* N-Mb */ |
1886 | | /****************************************************************/ |
1887 | 15.4M | u1_num_mbs_next = i2_pic_wdin_mbs - ps_dec->u2_mbx - 1; |
1888 | 15.4M | u1_end_of_row = (!u1_num_mbs_next) && (!(u1_mbaff && (u1_num_mbs & 0x01))); |
1889 | 15.4M | u1_slice_end = !i2_mb_skip_run; |
1890 | 15.4M | u1_tfr_n_mb = (u1_num_mbs == ps_dec->u4_recon_mb_grp) || u1_end_of_row |
1891 | 15.2M | || u1_slice_end; |
1892 | 15.4M | u1_decode_nmb = u1_tfr_n_mb || u1_slice_end; |
1893 | 15.4M | ps_cur_mb_info->u1_end_of_slice = u1_slice_end; |
1894 | | |
1895 | 15.4M | if(u1_decode_nmb) |
1896 | 211k | { |
1897 | 211k | ps_dec->pf_mvpred_ref_tfr_nby2mb(ps_dec, u1_mb_idx, u1_num_mbs); |
1898 | 211k | u1_num_mbsNby2 = 0; |
1899 | | |
1900 | 211k | ps_parse_mb_data = ps_dec->ps_parse_mb_data; |
1901 | 211k | ps_dec->ps_part = ps_dec->ps_parse_part_params; |
1902 | | |
1903 | 211k | if(ps_dec->u1_separate_parse) |
1904 | 141k | { |
1905 | 141k | ih264d_parse_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, |
1906 | 141k | u1_num_mbs_next, u1_tfr_n_mb, u1_end_of_row); |
1907 | 141k | ps_dec->ps_nmb_info += u1_num_mbs; |
1908 | 141k | } |
1909 | 69.8k | else |
1910 | 69.8k | { |
1911 | 69.8k | ih264d_decode_recon_tfr_nmb(ps_dec, u1_mb_idx, u1_num_mbs, u1_num_mbs_next, |
1912 | 69.8k | u1_tfr_n_mb, u1_end_of_row); |
1913 | 69.8k | } |
1914 | 211k | ps_dec->u4_total_mbs_coded += u1_num_mbs; |
1915 | 211k | if(u1_tfr_n_mb) |
1916 | 211k | u1_num_mbs = 0; |
1917 | 211k | u1_mb_idx = u1_num_mbs; |
1918 | 211k | ps_dec->u4_mb_idx = u1_num_mbs; |
1919 | 211k | } |
1920 | 15.4M | } |
1921 | | |
1922 | 13.1k | ps_dec->u4_num_mbs_cur_nmb = 0; |
1923 | 13.1k | ps_dec->ps_cur_slice->u4_mbs_in_slice = i2_cur_mb_addr |
1924 | 13.1k | - ps_dec->ps_parse_cur_slice->u4_first_mb_in_slice; |
1925 | | |
1926 | 13.1k | H264_DEC_DEBUG_PRINT("Mbs in slice: %d\n", ps_dec->ps_cur_slice->u4_mbs_in_slice); |
1927 | | |
1928 | | |
1929 | | /* incremented here only if first slice is inserted */ |
1930 | 13.1k | if(ps_dec->u4_first_slice_in_pic != 0) |
1931 | 0 | { |
1932 | 0 | ps_dec->ps_parse_cur_slice++; |
1933 | 0 | ps_dec->u2_cur_slice_num++; |
1934 | 0 | } |
1935 | | |
1936 | 13.1k | ps_dec->i2_prev_slice_mbx = ps_dec->u2_mbx; |
1937 | 13.1k | ps_dec->i2_prev_slice_mby = ps_dec->u2_mby; |
1938 | | |
1939 | 13.1k | if(ps_dec->u4_total_mbs_coded |
1940 | 13.1k | >= ps_dec->u2_frm_ht_in_mbs * ps_dec->u2_frm_wd_in_mbs) |
1941 | 7.67k | { |
1942 | 7.67k | ps_dec->u1_pic_decode_done = 1; |
1943 | 7.67k | } |
1944 | | |
1945 | 13.1k | return 0; |
1946 | | |
1947 | 13.9k | } |
1948 | | |
1949 | | /*! |
1950 | | ************************************************************************** |
1951 | | * \if Function name : ih264d_decode_pslice \endif |
1952 | | * |
1953 | | * \brief |
1954 | | * Decodes a P Slice |
1955 | | * |
1956 | | * |
1957 | | * \return |
1958 | | * 0 on Success and Error code otherwise |
1959 | | ************************************************************************** |
1960 | | */ |
1961 | | WORD32 ih264d_parse_pslice(dec_struct_t *ps_dec, UWORD16 u2_first_mb_in_slice) |
1962 | 4.55k | { |
1963 | 4.55k | dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps; |
1964 | 4.55k | dec_slice_params_t * ps_cur_slice = ps_dec->ps_cur_slice; |
1965 | 4.55k | dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm; |
1966 | 4.55k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
1967 | 4.55k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
1968 | 4.55k | UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; //ps_dec->ps_cur_sps->u1_mb_aff_flag; |
1969 | 4.55k | UWORD8 u1_field_pic_flag = ps_cur_slice->u1_field_pic_flag; |
1970 | | |
1971 | 4.55k | UWORD64 u8_ref_idx_l0; |
1972 | 4.55k | UWORD32 u4_temp; |
1973 | 4.55k | WORD32 i_temp; |
1974 | 4.55k | WORD32 ret; |
1975 | | |
1976 | | /*--------------------------------------------------------------------*/ |
1977 | | /* Read remaining contents of the slice header */ |
1978 | | /*--------------------------------------------------------------------*/ |
1979 | 4.55k | { |
1980 | 4.55k | WORD8 *pi1_buf; |
1981 | 4.55k | WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv; |
1982 | 4.55k | WORD32 *pi4_mv = (WORD32*)pi2_mv; |
1983 | 4.55k | WORD16 *pi16_refFrame; |
1984 | | |
1985 | 4.55k | pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame; |
1986 | 4.55k | pi16_refFrame = (WORD16*)pi1_buf; |
1987 | 4.55k | *pi4_mv = 0; |
1988 | 4.55k | *(pi4_mv + 1) = 0; |
1989 | 4.55k | *pi16_refFrame = OUT_OF_RANGE_REF; |
1990 | 4.55k | ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1; |
1991 | 4.55k | ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1; |
1992 | 4.55k | } |
1993 | | |
1994 | 4.55k | ps_cur_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264( |
1995 | 4.55k | ps_bitstrm); |
1996 | | |
1997 | 4.55k | COPYTHECONTEXT("SH: num_ref_idx_override_flag", |
1998 | 4.55k | ps_cur_slice->u1_num_ref_idx_active_override_flag); |
1999 | | |
2000 | 4.55k | u8_ref_idx_l0 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0]; |
2001 | 4.55k | if(ps_cur_slice->u1_num_ref_idx_active_override_flag) |
2002 | 2.24k | { |
2003 | 2.24k | u8_ref_idx_l0 = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf) + (UWORD64)1; |
2004 | 2.24k | } |
2005 | | |
2006 | 4.55k | { |
2007 | 4.55k | UWORD8 u1_max_ref_idx = H264_MAX_REF_PICS << u1_field_pic_flag; |
2008 | 4.55k | if(u8_ref_idx_l0 > u1_max_ref_idx) |
2009 | 19 | { |
2010 | 19 | return ERROR_NUM_REF; |
2011 | 19 | } |
2012 | 4.53k | ps_cur_slice->u1_num_ref_idx_lx_active[0] = u8_ref_idx_l0; |
2013 | 4.53k | COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1", |
2014 | 4.53k | ps_cur_slice->u1_num_ref_idx_lx_active[0] - 1); |
2015 | | |
2016 | 4.53k | } |
2017 | | |
2018 | 0 | { |
2019 | 4.53k | UWORD8 uc_refIdxReFlagL0 = ih264d_get_bit_h264(ps_bitstrm); |
2020 | 4.53k | COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",uc_refIdxReFlagL0); |
2021 | | |
2022 | 4.53k | ih264d_init_ref_idx_lx_p(ps_dec); |
2023 | | /* Store the value for future slices in the same picture */ |
2024 | 4.53k | ps_dec->u1_num_ref_idx_lx_active_prev = |
2025 | 4.53k | ps_cur_slice->u1_num_ref_idx_lx_active[0]; |
2026 | | |
2027 | | /* Modified temporarily */ |
2028 | 4.53k | if(uc_refIdxReFlagL0) |
2029 | 1.53k | { |
2030 | 1.53k | WORD8 ret; |
2031 | 1.53k | ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0]; |
2032 | 1.53k | ret = ih264d_ref_idx_reordering(ps_dec, 0); |
2033 | 1.53k | if(ret == -1) |
2034 | 0 | return ERROR_REFIDX_ORDER_T; |
2035 | 1.53k | ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0]; |
2036 | 1.53k | } |
2037 | 3.00k | else |
2038 | 3.00k | ps_dec->ps_ref_pic_buf_lx[0] = |
2039 | 3.00k | ps_dec->ps_dpb_mgr->ps_init_dpb[0]; |
2040 | 4.53k | } |
2041 | | /* Create refIdx to POC mapping */ |
2042 | 4.53k | { |
2043 | 4.53k | void **pui_map_ref_idx_to_poc_lx0, **pui_map_ref_idx_to_poc_lx1; |
2044 | 4.53k | WORD8 idx; |
2045 | 4.53k | struct pic_buffer_t *ps_pic; |
2046 | | |
2047 | 4.53k | pui_map_ref_idx_to_poc_lx0 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0; |
2048 | 4.53k | pui_map_ref_idx_to_poc_lx0[0] = 0; //For ref_idx = -1 |
2049 | 4.53k | pui_map_ref_idx_to_poc_lx0++; |
2050 | 19.5k | for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++) |
2051 | 15.0k | { |
2052 | 15.0k | ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx]; |
2053 | 15.0k | pui_map_ref_idx_to_poc_lx0[idx] = (ps_pic->pu1_buf1); |
2054 | 15.0k | } |
2055 | | |
2056 | | /* Bug Fix Deblocking */ |
2057 | 4.53k | pui_map_ref_idx_to_poc_lx1 = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1; |
2058 | 4.53k | pui_map_ref_idx_to_poc_lx1[0] = 0; |
2059 | | |
2060 | 4.53k | if(u1_mbaff) |
2061 | 909 | { |
2062 | 909 | void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b; |
2063 | 909 | void **ppv_map_ref_idx_to_poc_lx_t1, **ppv_map_ref_idx_to_poc_lx_b1; |
2064 | 909 | ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc |
2065 | 909 | + TOP_LIST_FLD_L0; |
2066 | 909 | ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc |
2067 | 909 | + BOT_LIST_FLD_L0; |
2068 | | |
2069 | 909 | ppv_map_ref_idx_to_poc_lx_t[0] = 0; // For ref_idx = -1 |
2070 | 909 | ppv_map_ref_idx_to_poc_lx_t++; |
2071 | 909 | ppv_map_ref_idx_to_poc_lx_b[0] = 0; // For ref_idx = -1 |
2072 | 909 | ppv_map_ref_idx_to_poc_lx_b++; |
2073 | | |
2074 | 909 | idx = 0; |
2075 | 7.75k | for(idx = 0; idx < ps_cur_slice->u1_num_ref_idx_lx_active[0]; idx++) |
2076 | 6.84k | { |
2077 | 6.84k | ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx]; |
2078 | 6.84k | ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1); |
2079 | 6.84k | ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1); |
2080 | | |
2081 | 6.84k | ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1; |
2082 | 6.84k | ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1; |
2083 | | |
2084 | 6.84k | ppv_map_ref_idx_to_poc_lx_t += 2; |
2085 | 6.84k | ppv_map_ref_idx_to_poc_lx_b += 2; |
2086 | 6.84k | } |
2087 | 909 | ppv_map_ref_idx_to_poc_lx_t1 = ps_dec->ppv_map_ref_idx_to_poc |
2088 | 909 | + TOP_LIST_FLD_L1; |
2089 | 909 | ppv_map_ref_idx_to_poc_lx_t1[0] = 0; |
2090 | 909 | ppv_map_ref_idx_to_poc_lx_b1 = ps_dec->ppv_map_ref_idx_to_poc |
2091 | 909 | + BOT_LIST_FLD_L1; |
2092 | 909 | ppv_map_ref_idx_to_poc_lx_b1[0] = 0; |
2093 | | |
2094 | 909 | } |
2095 | | |
2096 | 4.53k | if(ps_dec->u4_num_cores >= 3) |
2097 | 2.26k | { |
2098 | 2.26k | WORD32 num_entries; |
2099 | 2.26k | WORD32 size; |
2100 | | |
2101 | 2.26k | num_entries = MAX_FRAMES; |
2102 | 2.26k | if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) && |
2103 | 730 | (0 == ps_dec->i4_display_delay)) |
2104 | 0 | { |
2105 | 0 | num_entries = 1; |
2106 | 0 | } |
2107 | 2.26k | num_entries = ((2 * num_entries) + 1); |
2108 | 2.26k | num_entries *= 2; |
2109 | | |
2110 | 2.26k | size = num_entries * sizeof(void *); |
2111 | 2.26k | size += PAD_MAP_IDX_POC * sizeof(void *); |
2112 | | |
2113 | 2.26k | memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc, |
2114 | 2.26k | ps_dec->ppv_map_ref_idx_to_poc, |
2115 | 2.26k | size); |
2116 | 2.26k | } |
2117 | | |
2118 | | |
2119 | 4.53k | } |
2120 | 4.53k | if(ps_pps->u1_wted_pred_flag) |
2121 | 1.48k | { |
2122 | 1.48k | ret = ih264d_parse_pred_weight_table(ps_cur_slice, ps_bitstrm); |
2123 | 1.48k | if(ret != OK) |
2124 | 187 | return ret; |
2125 | 1.29k | ih264d_form_pred_weight_matrix(ps_dec); |
2126 | 1.29k | ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; |
2127 | 1.29k | } |
2128 | 3.05k | else |
2129 | 3.05k | { |
2130 | 3.05k | ps_dec->ps_cur_slice->u2_log2Y_crwd = 0; |
2131 | 3.05k | ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; |
2132 | 3.05k | } |
2133 | | |
2134 | 4.34k | ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = |
2135 | 4.34k | ps_dec->ps_cur_slice->u2_log2Y_crwd; |
2136 | | |
2137 | 4.34k | if(u1_mbaff && (u1_field_pic_flag == 0)) |
2138 | 848 | { |
2139 | 848 | ih264d_convert_frm_mbaff_list(ps_dec); |
2140 | 848 | } |
2141 | | |
2142 | | /* G050 */ |
2143 | 4.34k | if(ps_cur_slice->u1_nal_ref_idc != 0) |
2144 | 3.16k | { |
2145 | 3.16k | if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read) |
2146 | 1.45k | { |
2147 | 1.45k | i_temp = ih264d_read_mmco_commands(ps_dec); |
2148 | 1.45k | if (i_temp < 0) |
2149 | 0 | { |
2150 | 0 | return ERROR_DBP_MANAGER_T; |
2151 | 0 | } |
2152 | 1.45k | ps_dec->u4_bitoffset = i_temp; |
2153 | 1.45k | } |
2154 | 1.71k | else |
2155 | 1.71k | ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset; |
2156 | | |
2157 | 3.16k | } |
2158 | | /* G050 */ |
2159 | | |
2160 | 4.34k | if(ps_pps->u1_entropy_coding_mode == CABAC) |
2161 | 2.02k | { |
2162 | 2.02k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
2163 | | |
2164 | 2.02k | if(u4_temp > MAX_CABAC_INIT_IDC) |
2165 | 80 | { |
2166 | 80 | return ERROR_INV_SLICE_HDR_T; |
2167 | 80 | } |
2168 | 1.94k | ps_cur_slice->u1_cabac_init_idc = u4_temp; |
2169 | 1.94k | COPYTHECONTEXT("SH: cabac_init_idc",ps_cur_slice->u1_cabac_init_idc); |
2170 | 1.94k | } |
2171 | 4.26k | { |
2172 | 4.26k | WORD64 i8_temp; |
2173 | | /* Read slice_qp_delta */ |
2174 | 4.26k | i8_temp = (WORD64)ps_pps->u1_pic_init_qp |
2175 | 4.26k | + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
2176 | 4.26k | if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) |
2177 | 489 | { |
2178 | 489 | return ERROR_INV_RANGE_QP_T; |
2179 | 489 | } |
2180 | 3.77k | ps_cur_slice->u1_slice_qp = i8_temp; |
2181 | 3.77k | COPYTHECONTEXT("SH: slice_qp_delta", |
2182 | 3.77k | (WORD8)(ps_cur_slice->u1_slice_qp - ps_pps->u1_pic_init_qp)); |
2183 | 3.77k | } |
2184 | | |
2185 | 3.77k | if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1) |
2186 | 2.55k | { |
2187 | 2.55k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
2188 | 2.55k | if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED) |
2189 | 50 | { |
2190 | 50 | return ERROR_INV_SLICE_HDR_T; |
2191 | 50 | } |
2192 | | |
2193 | 2.50k | COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp); |
2194 | 2.50k | ps_cur_slice->u1_disable_dblk_filter_idc = u4_temp; |
2195 | 2.50k | if(u4_temp != 1) |
2196 | 2.49k | { |
2197 | 2.49k | i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) |
2198 | 2.49k | << 1; |
2199 | 2.49k | if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) |
2200 | 1 | { |
2201 | 1 | return ERROR_INV_SLICE_HDR_T; |
2202 | 1 | } |
2203 | 2.49k | ps_cur_slice->i1_slice_alpha_c0_offset = i_temp; |
2204 | 2.49k | COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2", |
2205 | 2.49k | ps_cur_slice->i1_slice_alpha_c0_offset >> 1); |
2206 | | |
2207 | 2.49k | i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) |
2208 | 2.49k | << 1; |
2209 | 2.49k | if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) |
2210 | 6 | { |
2211 | 6 | return ERROR_INV_SLICE_HDR_T; |
2212 | 6 | } |
2213 | 2.48k | ps_cur_slice->i1_slice_beta_offset = i_temp; |
2214 | 2.48k | COPYTHECONTEXT("SH: slice_beta_offset_div2", |
2215 | 2.48k | ps_cur_slice->i1_slice_beta_offset >> 1); |
2216 | 2.48k | } |
2217 | 6 | else |
2218 | 6 | { |
2219 | 6 | ps_cur_slice->i1_slice_alpha_c0_offset = 0; |
2220 | 6 | ps_cur_slice->i1_slice_beta_offset = 0; |
2221 | 6 | } |
2222 | 2.50k | } |
2223 | 1.22k | else |
2224 | 1.22k | { |
2225 | 1.22k | ps_cur_slice->u1_disable_dblk_filter_idc = 0; |
2226 | 1.22k | ps_cur_slice->i1_slice_alpha_c0_offset = 0; |
2227 | 1.22k | ps_cur_slice->i1_slice_beta_offset = 0; |
2228 | 1.22k | } |
2229 | | |
2230 | 3.72k | ps_dec->u1_slice_header_done = 2; |
2231 | | |
2232 | 3.72k | if(ps_pps->u1_entropy_coding_mode) |
2233 | 1.89k | { |
2234 | 1.89k | SWITCHOFFTRACE; SWITCHONTRACECABAC; |
2235 | 1.89k | ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac; |
2236 | 1.89k | ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cabac; |
2237 | 1.89k | ih264d_init_cabac_contexts(P_SLICE, ps_dec); |
2238 | | |
2239 | 1.89k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
2240 | 572 | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff; |
2241 | 1.32k | else |
2242 | 1.32k | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff; |
2243 | 1.89k | } |
2244 | 1.82k | else |
2245 | 1.82k | { |
2246 | 1.82k | SWITCHONTRACE; SWITCHOFFTRACECABAC; |
2247 | 1.82k | ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc; |
2248 | 1.82k | ps_dec->pf_parse_inter_mb = ih264d_parse_pmb_cavlc; |
2249 | 1.82k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
2250 | 183 | { |
2251 | 183 | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff; |
2252 | 183 | } |
2253 | 1.64k | else |
2254 | 1.64k | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff; |
2255 | 1.82k | } |
2256 | | |
2257 | 3.72k | ps_dec->u1_B = 0; |
2258 | 3.72k | ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_pmb; |
2259 | 3.72k | ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_cur_slice, u2_first_mb_in_slice); |
2260 | 3.72k | if(ret != OK) |
2261 | 1.02k | return ret; |
2262 | | // ps_dec->curr_slice_in_error = 0 ; |
2263 | 2.70k | return OK; |
2264 | 3.72k | } |