/src/libavc/decoder/ih264d_parse_bslice.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 | | * \file ih264d_parse_bslice.c |
23 | | * |
24 | | * \brief |
25 | | * Contains routines that decode a I slice type |
26 | | * |
27 | | * Detailed_description |
28 | | * |
29 | | * \date |
30 | | * 07/07/2003 |
31 | | * |
32 | | * \author NS |
33 | | ************************************************************************** |
34 | | */ |
35 | | |
36 | | #include <string.h> |
37 | | #include "ih264_defs.h" |
38 | | #include "ih264d_bitstrm.h" |
39 | | #include "ih264d_defs.h" |
40 | | #include "ih264d_debug.h" |
41 | | #include "ih264d_tables.h" |
42 | | #include "ih264d_structs.h" |
43 | | #include "ih264d_defs.h" |
44 | | #include "ih264d_parse_cavlc.h" |
45 | | #include "ih264d_mb_utils.h" |
46 | | #include "ih264d_parse_slice.h" |
47 | | #include "ih264d_process_intra_mb.h" |
48 | | #include "ih264d_mvpred.h" |
49 | | #include "ih264d_parse_islice.h" |
50 | | #include "ih264d_inter_pred.h" |
51 | | #include "ih264d_process_pslice.h" |
52 | | #include "ih264d_process_bslice.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_mvpred.h" |
58 | | #include "ih264d_cabac.h" |
59 | | #include "ih264d_utils.h" |
60 | | |
61 | | void ih264d_init_cabac_contexts(UWORD8 u1_slice_type, dec_struct_t * ps_dec); |
62 | | |
63 | | /*! |
64 | | ************************************************************************** |
65 | | * \if Function name : ParseMb_SubMb_PredBCav\endif |
66 | | * |
67 | | * \brief |
68 | | * Implements sub_mb_pred() of 7.3.5.2. & mb_pred() of 7.3.5.1 |
69 | | * |
70 | | * \return |
71 | | * None. |
72 | | * |
73 | | ************************************************************************** |
74 | | */ |
75 | | WORD32 ih264d_parse_bmb_non_direct_cavlc(dec_struct_t * ps_dec, |
76 | | dec_mb_info_t * ps_cur_mb_info, |
77 | | UWORD32 u4_mb_num, |
78 | | UWORD32 u4_num_mbsNby2) |
79 | 131k | { |
80 | 131k | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
81 | 131k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
82 | 131k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
83 | 131k | UWORD8 * pu1_sub_mb_pred_modes = (UWORD8 *)(gau1_ih264d_submb_pred_modes) + 4; |
84 | 131k | const UWORD8 (*pu1_mb_pred_modes)[32] = |
85 | 131k | (const UWORD8 (*)[32])gau1_ih264d_mb_pred_modes; |
86 | 131k | const UWORD8 * pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part; |
87 | 131k | const UWORD8 * pu1_sub_mb_mc_mode = (const UWORD8 *)(gau1_ih264d_submb_mc_mode) |
88 | 131k | + 4; |
89 | | |
90 | 131k | parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data |
91 | 131k | + u4_num_mbsNby2; |
92 | 131k | UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info; |
93 | 131k | WORD8 (*pi1_ref_idx)[MAX_REFIDX_INFO_PER_MB] = ps_parse_mb_data->i1_ref_idx; |
94 | 131k | UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type; |
95 | 131k | UWORD8 u1_mb_mc_mode, u1_num_mb_part, u1_sub_mb = !(u1_mb_type ^ B_8x8); |
96 | 131k | UWORD32 u4_mb_mc_mode = 0, u4_mb_pred_mode = 0; |
97 | 131k | WORD32 ret; |
98 | | |
99 | 131k | if(u1_sub_mb) |
100 | 2.87k | { |
101 | 2.87k | UWORD8 uc_i; |
102 | 2.87k | u1_mb_mc_mode = 0; |
103 | 2.87k | u1_num_mb_part = 4; |
104 | | /* Reading the subMB type */ |
105 | 14.1k | for(uc_i = 0; uc_i < 4; uc_i++) |
106 | 11.4k | { |
107 | | |
108 | 11.4k | UWORD32 ui_sub_mb_mode; |
109 | | |
110 | | //Inlined ih264d_uev |
111 | 11.4k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
112 | 11.4k | UWORD32 u4_word, u4_ldz; |
113 | | |
114 | | /***************************************************************/ |
115 | | /* Find leading zeros in next 32 bits */ |
116 | | /***************************************************************/ |
117 | 11.4k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
118 | 11.4k | u4_ldz = CLZ(u4_word); |
119 | | /* Flush the ps_bitstrm */ |
120 | 11.4k | u4_bitstream_offset += (u4_ldz + 1); |
121 | | /* Read the suffix from the ps_bitstrm */ |
122 | 11.4k | u4_word = 0; |
123 | 11.4k | if(u4_ldz) |
124 | 6.38k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, |
125 | 11.4k | u4_ldz); |
126 | 11.4k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
127 | 11.4k | ui_sub_mb_mode = ((1 << u4_ldz) + u4_word - 1); |
128 | | //Inlined ih264d_uev |
129 | | |
130 | 11.4k | if(ui_sub_mb_mode > 12) |
131 | 211 | return ERROR_SUB_MB_TYPE; |
132 | 11.2k | else |
133 | 11.2k | { |
134 | 11.2k | UWORD8 u1_subMbPredMode = pu1_sub_mb_pred_modes[ui_sub_mb_mode]; |
135 | 11.2k | u4_mb_mc_mode = (u4_mb_mc_mode << 8) |
136 | 11.2k | | pu1_sub_mb_mc_mode[ui_sub_mb_mode]; |
137 | 11.2k | u4_mb_pred_mode = (u4_mb_pred_mode << 8) | u1_subMbPredMode; |
138 | 11.2k | pi1_ref_idx[0][uc_i] = ((u1_subMbPredMode & PRED_L0) - 1) >> 1; |
139 | 11.2k | pi1_ref_idx[1][uc_i] = ((u1_subMbPredMode & PRED_L1) - 1) >> 1; |
140 | 11.2k | COPYTHECONTEXT("sub_mb_type", u1_subMbPredMode); |
141 | 11.2k | } |
142 | | /* Storing collocated Mb and SubMb mode information */ |
143 | 11.2k | *pu1_col_info++ = ((PRED_8x8) << 6) |
144 | 11.2k | | ((pu1_sub_mb_mc_mode[ui_sub_mb_mode] << 4)); |
145 | 11.2k | if(ui_sub_mb_mode != B_DIRECT_8x8) |
146 | 6.17k | { |
147 | 6.17k | if(ui_sub_mb_mode > B_BI_8x8) |
148 | 3.99k | { |
149 | 3.99k | ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0; |
150 | 3.99k | } |
151 | 6.17k | } |
152 | 5.08k | else if(!ps_dec->s_high_profile.u1_direct_8x8_inference_flag) |
153 | 3.21k | { |
154 | 3.21k | ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0; |
155 | 3.21k | } |
156 | 11.2k | } |
157 | 2.87k | } |
158 | 128k | else |
159 | 128k | { |
160 | 128k | UWORD8 u1_mb_pred_mode_idx = 5 + u1_mb_type; |
161 | 128k | UWORD8 u1_mb_pred_mode_part0 = pu1_mb_pred_modes[0][u1_mb_pred_mode_idx]; |
162 | 128k | UWORD8 u1_mb_pred_mode_part1 = pu1_mb_pred_modes[1][u1_mb_pred_mode_idx]; |
163 | 128k | u1_mb_mc_mode = ps_cur_mb_info->u1_mb_mc_mode; |
164 | 128k | u1_num_mb_part = pu1_num_mb_part[u1_mb_mc_mode]; |
165 | | |
166 | 128k | pi1_ref_idx[0][0] = ((u1_mb_pred_mode_part0 & PRED_L0) - 1) >> 1; |
167 | 128k | pi1_ref_idx[1][0] = ((u1_mb_pred_mode_part0 & PRED_L1) - 1) >> 1; |
168 | 128k | pi1_ref_idx[0][1] = ((u1_mb_pred_mode_part1 & PRED_L0) - 1) >> 1; |
169 | 128k | pi1_ref_idx[1][1] = ((u1_mb_pred_mode_part1 & PRED_L1) - 1) >> 1; |
170 | | |
171 | 128k | u4_mb_pred_mode = (u1_mb_pred_mode_part0 << 8) | u1_mb_pred_mode_part1; |
172 | 128k | u4_mb_mc_mode = u1_mb_mc_mode | (u1_mb_mc_mode << 8); |
173 | 128k | u4_mb_mc_mode <<= 16; |
174 | 128k | u4_mb_pred_mode <<= 16; |
175 | | |
176 | | /* Storing collocated Mb and SubMb mode information */ |
177 | 128k | *pu1_col_info++ = (u1_mb_mc_mode << 6); |
178 | 128k | if(u1_mb_mc_mode) |
179 | 51.8k | *pu1_col_info++ = (u1_mb_mc_mode << 6); |
180 | 128k | } |
181 | | |
182 | 131k | { |
183 | 131k | UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; |
184 | 131k | UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag; |
185 | 131k | UWORD8 *pu1_num_ref_idx_lx_active = |
186 | 131k | ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active; |
187 | 131k | const UWORD8 u1_mbaff_field = (u1_mbaff & uc_field); |
188 | 131k | UWORD8 u4_num_ref_idx_lx_active; |
189 | | |
190 | 131k | u4_num_ref_idx_lx_active = (pu1_num_ref_idx_lx_active[0] |
191 | 131k | << u1_mbaff_field) - 1; |
192 | | |
193 | 131k | if(u4_num_ref_idx_lx_active) |
194 | 46.2k | { |
195 | 46.2k | if(1 == u4_num_ref_idx_lx_active) |
196 | 5.60k | ih264d_parse_bmb_ref_index_cavlc_range1( |
197 | 5.60k | u1_num_mb_part, ps_bitstrm, pi1_ref_idx[0], |
198 | 5.60k | u4_num_ref_idx_lx_active); |
199 | 40.6k | else |
200 | 40.6k | { |
201 | 40.6k | ret = ih264d_parse_bmb_ref_index_cavlc(u1_num_mb_part, ps_bitstrm, |
202 | 40.6k | pi1_ref_idx[0], |
203 | 40.6k | u4_num_ref_idx_lx_active); |
204 | 40.6k | if(ret != OK) |
205 | 389 | return ret; |
206 | 40.6k | } |
207 | 46.2k | } |
208 | | |
209 | 131k | u4_num_ref_idx_lx_active = (pu1_num_ref_idx_lx_active[1] |
210 | 131k | << u1_mbaff_field) - 1; |
211 | | |
212 | 131k | if(u4_num_ref_idx_lx_active) |
213 | 29.9k | { |
214 | 29.9k | if(1 == u4_num_ref_idx_lx_active) |
215 | 12.2k | ih264d_parse_bmb_ref_index_cavlc_range1( |
216 | 12.2k | u1_num_mb_part, ps_bitstrm, pi1_ref_idx[1], |
217 | 12.2k | u4_num_ref_idx_lx_active); |
218 | 17.6k | else |
219 | 17.6k | { |
220 | 17.6k | ret = ih264d_parse_bmb_ref_index_cavlc(u1_num_mb_part, ps_bitstrm, |
221 | 17.6k | pi1_ref_idx[1], |
222 | 17.6k | u4_num_ref_idx_lx_active); |
223 | 17.6k | if(ret != OK) |
224 | 152 | return ret; |
225 | 17.6k | } |
226 | 29.9k | } |
227 | 131k | } |
228 | | |
229 | | /* Read MotionVectors */ |
230 | 131k | { |
231 | 131k | const UWORD8 * pu1_top_left_sub_mb_indx; |
232 | | |
233 | 131k | const UWORD8 * pu1_sub_mb_indx_mod = |
234 | 131k | (const UWORD8 *)(gau1_ih264d_submb_indx_mod) |
235 | 131k | + (u1_sub_mb * 6); |
236 | 131k | const UWORD8 * pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw; |
237 | 131k | const UWORD8 * pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth; |
238 | 131k | const UWORD8 * pu1_num_sub_mb_part = |
239 | 131k | (const UWORD8 *)gau1_ih264d_num_submb_part; |
240 | 131k | const UWORD8 * pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw; |
241 | 131k | const UWORD8 * pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth; |
242 | 131k | UWORD8 u1_p_idx = 0, u1_num_submb_part, uc_lx; |
243 | 131k | parse_part_params_t * ps_part; |
244 | 131k | mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4); |
245 | 131k | UWORD8 u1_mb_part_wd, u1_mb_part_ht; |
246 | | |
247 | | /* Initialisations */ |
248 | 131k | ps_part = ps_dec->ps_part; |
249 | | /* Default Initialization for Non subMb Case Mode */ |
250 | 131k | u1_mb_part_wd = pu1_mb_partw[u1_mb_mc_mode]; |
251 | 131k | u1_mb_part_ht = pu1_mb_parth[u1_mb_mc_mode]; |
252 | 131k | u1_num_submb_part = 1; |
253 | | |
254 | | /* Decoding the MV for the subMB */ |
255 | 393k | for(uc_lx = 0; uc_lx < 2; uc_lx++) |
256 | 262k | { |
257 | 262k | UWORD8 u1_sub_mb_num = 0, u1_pred_mode, uc_i; |
258 | 262k | UWORD32 u4_mb_mc_mode_tmp = u4_mb_mc_mode; |
259 | 262k | UWORD32 u4_mb_pred_mode_tmp = u4_mb_pred_mode; |
260 | 262k | UWORD16 u2_sub_mb_num = 0x028A; // for sub mb case |
261 | 262k | UWORD8 u1_b2 = uc_lx << 1; |
262 | 262k | u1_pred_mode = (uc_lx) ? PRED_L1 : PRED_L0; |
263 | 262k | pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode << 1); |
264 | | |
265 | 642k | for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++) |
266 | 380k | { |
267 | 380k | UWORD8 u1_mb_mc_mode, uc_j; |
268 | 380k | UWORD8 i1_pred = u4_mb_pred_mode_tmp >> 24; |
269 | 380k | u1_mb_mc_mode = u4_mb_mc_mode_tmp >> 24; |
270 | 380k | u4_mb_pred_mode_tmp <<= 8; |
271 | 380k | u4_mb_mc_mode_tmp <<= 8; |
272 | | /* subMb prediction mode */ |
273 | 380k | if(u1_sub_mb) |
274 | 19.8k | { |
275 | | |
276 | 19.8k | u1_mb_part_wd = pu1_sub_mb_partw[u1_mb_mc_mode]; |
277 | 19.8k | u1_mb_part_ht = pu1_sub_mb_parth[u1_mb_mc_mode]; |
278 | 19.8k | u1_sub_mb_num = u2_sub_mb_num >> 12; |
279 | 19.8k | u1_num_submb_part = pu1_num_sub_mb_part[u1_mb_mc_mode]; |
280 | 19.8k | pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod |
281 | 19.8k | + (u1_mb_mc_mode << 1); |
282 | 19.8k | u2_sub_mb_num <<= 4; |
283 | 19.8k | } |
284 | 775k | for(uc_j = 0; uc_j < u1_num_submb_part; |
285 | 395k | uc_j++, pu1_top_left_sub_mb_indx++) |
286 | 395k | { |
287 | 395k | mv_pred_t * ps_mv; |
288 | 395k | u1_sub_mb_num = u1_sub_mb_num + *pu1_top_left_sub_mb_indx; |
289 | 395k | ps_mv = ps_mv_start + u1_sub_mb_num; |
290 | | |
291 | | /* Storing Info for partitions, writing only once */ |
292 | 395k | if(uc_lx) |
293 | 197k | { |
294 | 197k | ps_part->u1_is_direct = (!i1_pred); |
295 | 197k | ps_part->u1_pred_mode = i1_pred; |
296 | 197k | ps_part->u1_sub_mb_num = u1_sub_mb_num; |
297 | 197k | ps_part->u1_partheight = u1_mb_part_ht; |
298 | 197k | ps_part->u1_partwidth = u1_mb_part_wd; |
299 | | /* Increment partition Index */ |
300 | 197k | u1_p_idx++; |
301 | 197k | ps_part++; |
302 | 197k | } |
303 | | |
304 | 395k | if(i1_pred & u1_pred_mode) |
305 | 210k | { |
306 | 210k | WORD16 i2_mvx, i2_mvy; |
307 | | |
308 | | //inlining ih264d_sev |
309 | 210k | { |
310 | 210k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
311 | 210k | UWORD32 u4_word, u4_ldz, u4_abs_val; |
312 | | |
313 | | /***************************************************************/ |
314 | | /* Find leading zeros in next 32 bits */ |
315 | | /***************************************************************/ |
316 | 210k | NEXTBITS_32(u4_word, u4_bitstream_offset, |
317 | 210k | pu4_bitstrm_buf); |
318 | 210k | u4_ldz = CLZ(u4_word); |
319 | | |
320 | | /* Flush the ps_bitstrm */ |
321 | 210k | u4_bitstream_offset += (u4_ldz + 1); |
322 | | |
323 | | /* Read the suffix from the ps_bitstrm */ |
324 | 210k | u4_word = 0; |
325 | 210k | if(u4_ldz) |
326 | 152k | GETBITS(u4_word, u4_bitstream_offset, |
327 | 210k | pu4_bitstrm_buf, u4_ldz); |
328 | | |
329 | 210k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
330 | 210k | u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; |
331 | | |
332 | 210k | if(u4_word & 0x1) |
333 | 105k | i2_mvx = (-(WORD32)u4_abs_val); |
334 | 104k | else |
335 | 104k | i2_mvx = (u4_abs_val); |
336 | 210k | } |
337 | | //inlinined ih264d_sev |
338 | | |
339 | | //inlining ih264d_sev |
340 | 210k | { |
341 | 210k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
342 | 210k | UWORD32 u4_word, u4_ldz, u4_abs_val; |
343 | | |
344 | | /***************************************************************/ |
345 | | /* Find leading zeros in next 32 bits */ |
346 | | /***************************************************************/ |
347 | 210k | NEXTBITS_32(u4_word, u4_bitstream_offset, |
348 | 210k | pu4_bitstrm_buf); |
349 | 210k | u4_ldz = CLZ(u4_word); |
350 | | |
351 | | /* Flush the ps_bitstrm */ |
352 | 210k | u4_bitstream_offset += (u4_ldz + 1); |
353 | | |
354 | | /* Read the suffix from the ps_bitstrm */ |
355 | 210k | u4_word = 0; |
356 | 210k | if(u4_ldz) |
357 | 144k | GETBITS(u4_word, u4_bitstream_offset, |
358 | 210k | pu4_bitstrm_buf, u4_ldz); |
359 | | |
360 | 210k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
361 | 210k | u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; |
362 | | |
363 | 210k | if(u4_word & 0x1) |
364 | 108k | i2_mvy = (-(WORD32)u4_abs_val); |
365 | 101k | else |
366 | 101k | i2_mvy = (u4_abs_val); |
367 | 210k | } |
368 | | //inlinined ih264d_sev |
369 | | |
370 | | /* Storing Mv residuals */ |
371 | 210k | ps_mv->i2_mv[u1_b2] = i2_mvx; |
372 | 210k | ps_mv->i2_mv[u1_b2 + 1] = i2_mvy; |
373 | 210k | } |
374 | 395k | } |
375 | 380k | } |
376 | 262k | } |
377 | | /* write back to the scratch partition info */ |
378 | 131k | ps_dec->ps_part = ps_part; |
379 | 131k | ps_parse_mb_data->u1_num_part = u1_sub_mb ? u1_p_idx : u1_num_mb_part; |
380 | | |
381 | 131k | } |
382 | 131k | return OK; |
383 | 131k | } |
384 | | |
385 | | /*! |
386 | | ************************************************************************** |
387 | | * \if Function name : ParseMb_SubMb_PredBCab\endif |
388 | | * |
389 | | * \brief |
390 | | * Implements sub_mb_pred() of 7.3.5.2. & mb_pred() of 7.3.5.1 |
391 | | * |
392 | | * \return |
393 | | * None. |
394 | | * |
395 | | ************************************************************************** |
396 | | */ |
397 | | |
398 | | WORD32 ih264d_parse_bmb_non_direct_cabac(dec_struct_t * ps_dec, |
399 | | dec_mb_info_t * ps_cur_mb_info, |
400 | | UWORD32 u4_mb_num, |
401 | | UWORD32 u4_num_mbsNby2) |
402 | 204k | { |
403 | | /* Loads from ps_dec */ |
404 | 204k | decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
405 | 204k | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
406 | 204k | ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info; |
407 | 204k | parse_pmbarams_t * ps_parse_mb_data = ps_dec->ps_parse_mb_data |
408 | 204k | + u4_num_mbsNby2; |
409 | | |
410 | | /* table pointer loads */ |
411 | 204k | const UWORD8 * pu1_sub_mb_pred_modes = (UWORD8 *)(gau1_ih264d_submb_pred_modes) |
412 | 204k | + 4; |
413 | 204k | const UWORD8 (*pu1_mb_pred_modes)[32] = |
414 | 204k | (const UWORD8 (*)[32])gau1_ih264d_mb_pred_modes; |
415 | 204k | const UWORD8 *pu1_num_mb_part = (const UWORD8 *)gau1_ih264d_num_mb_part; |
416 | 204k | const UWORD8 *pu1_sub_mb_mc_mode = (UWORD8 *)(gau1_ih264d_submb_mc_mode) + 4; |
417 | | |
418 | 204k | const UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type; |
419 | 204k | UWORD8 * pu1_col_info = ps_parse_mb_data->u1_col_info; |
420 | 204k | WORD8 *pi1_ref_idx_l0 = &ps_parse_mb_data->i1_ref_idx[0][0]; |
421 | 204k | WORD8 *pi1_ref_idx_l1 = &ps_parse_mb_data->i1_ref_idx[1][0]; |
422 | 204k | UWORD8 u1_dec_ref_l0, u1_dec_ref_l1; |
423 | | |
424 | 204k | UWORD8 u1_num_mb_part, u1_mb_mc_mode, u1_sub_mb, u1_mbpred_mode = 5 |
425 | 204k | + u1_mb_type; |
426 | 204k | UWORD32 u4_mb_mc_mode = 0, u4_mb_pred_mode = 0; |
427 | 204k | WORD32 ret; |
428 | | |
429 | 204k | p_curr_ctxt->u1_mb_type = CAB_NON_BD16x16; |
430 | 204k | u1_sub_mb = !(u1_mb_type ^ B_8x8); |
431 | | |
432 | 204k | { |
433 | 204k | UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; |
434 | 204k | UWORD8 *pu1_num_ref_idx_lx_active = |
435 | 204k | ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active; |
436 | 204k | UWORD8 uc_field = ps_cur_mb_info->u1_mb_field_decodingflag; |
437 | 204k | UWORD8 u1_mbaff_field = (u1_mbaff & uc_field); |
438 | 204k | u1_dec_ref_l0 = (pu1_num_ref_idx_lx_active[0] << u1_mbaff_field) - 1; |
439 | 204k | u1_dec_ref_l1 = (pu1_num_ref_idx_lx_active[1] << u1_mbaff_field) - 1; |
440 | 204k | } |
441 | | |
442 | 204k | if(u1_sub_mb) |
443 | 53.6k | { |
444 | 53.6k | const UWORD8 u1_colz = ((PRED_8x8) << 6); |
445 | 53.6k | UWORD8 uc_i; |
446 | 53.6k | u1_mb_mc_mode = 0; |
447 | 53.6k | u1_num_mb_part = 4; |
448 | | /* Reading the subMB type */ |
449 | 268k | for(uc_i = 0; uc_i < 4; uc_i++) |
450 | 214k | { |
451 | 214k | UWORD8 u1_sub_mb_mode, u1_subMbPredModes; |
452 | 214k | u1_sub_mb_mode = ih264d_parse_submb_type_cabac( |
453 | 214k | 1, ps_cab_env, ps_bitstrm, |
454 | 214k | ps_dec->p_sub_mb_type_t); |
455 | | |
456 | 214k | if(u1_sub_mb_mode > 12) |
457 | 0 | return ERROR_SUB_MB_TYPE; |
458 | | |
459 | 214k | u1_subMbPredModes = pu1_sub_mb_pred_modes[u1_sub_mb_mode]; |
460 | 214k | u4_mb_mc_mode = (u4_mb_mc_mode << 8) | pu1_sub_mb_mc_mode[u1_sub_mb_mode]; |
461 | 214k | u4_mb_pred_mode = (u4_mb_pred_mode << 8) | u1_subMbPredModes; |
462 | 214k | *pi1_ref_idx_l0++ = |
463 | 214k | (u1_subMbPredModes & PRED_L0) ? u1_dec_ref_l0 : -1; |
464 | 214k | *pi1_ref_idx_l1++ = |
465 | 214k | (u1_subMbPredModes & PRED_L1) ? u1_dec_ref_l1 : -1; |
466 | 214k | COPYTHECONTEXT("sub_mb_type", u1_sub_mb_mode); |
467 | | /* Storing collocated Mb and SubMb mode information */ |
468 | 214k | *pu1_col_info++ = |
469 | 214k | (u1_colz | (pu1_sub_mb_mc_mode[u1_sub_mb_mode] << 4)); |
470 | 214k | if(u1_sub_mb_mode != B_DIRECT_8x8) |
471 | 195k | { |
472 | 195k | if(u1_sub_mb_mode > B_BI_8x8) |
473 | 37.7k | { |
474 | 37.7k | ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0; |
475 | 37.7k | } |
476 | 195k | } |
477 | 18.8k | else if(!ps_dec->s_high_profile.u1_direct_8x8_inference_flag) |
478 | 13.0k | { |
479 | 13.0k | ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 0; |
480 | 13.0k | } |
481 | 214k | } |
482 | 53.6k | pi1_ref_idx_l0 -= 4; |
483 | 53.6k | pi1_ref_idx_l1 -= 4; |
484 | 53.6k | } |
485 | 151k | else |
486 | 151k | { |
487 | 151k | UWORD8 u1_mb_pred_mode_part0 = pu1_mb_pred_modes[0][u1_mbpred_mode]; |
488 | 151k | UWORD8 u1_mb_pred_mode_part1 = pu1_mb_pred_modes[1][u1_mbpred_mode]; |
489 | 151k | u1_mb_mc_mode = ps_cur_mb_info->u1_mb_mc_mode; |
490 | 151k | u1_num_mb_part = pu1_num_mb_part[u1_mb_mc_mode]; |
491 | | /* Storing collocated Mb and SubMb mode information */ |
492 | 151k | *pu1_col_info++ = (u1_mb_mc_mode << 6); |
493 | 151k | if(u1_mb_mc_mode) |
494 | 69.3k | *pu1_col_info++ = (u1_mb_mc_mode << 6); |
495 | 151k | u4_mb_mc_mode = u1_mb_mc_mode | (u1_mb_mc_mode << 8); |
496 | 151k | u4_mb_mc_mode <<= 16; |
497 | 151k | u4_mb_pred_mode = ((u1_mb_pred_mode_part0 << 8) | u1_mb_pred_mode_part1) << 16; |
498 | | |
499 | 151k | *pi1_ref_idx_l0++ = (u1_mb_pred_mode_part0 & PRED_L0) ? u1_dec_ref_l0 : -1; |
500 | 151k | *pi1_ref_idx_l0-- = (u1_mb_pred_mode_part1 & PRED_L0) ? u1_dec_ref_l0 : -1; |
501 | 151k | *pi1_ref_idx_l1++ = (u1_mb_pred_mode_part0 & PRED_L1) ? u1_dec_ref_l1 : -1; |
502 | 151k | *pi1_ref_idx_l1-- = (u1_mb_pred_mode_part1 & PRED_L1) ? u1_dec_ref_l1 : -1; |
503 | 151k | } |
504 | 204k | { |
505 | 204k | WORD8 *pi1_lft_cxt = ps_dec->pi1_left_ref_idx_ctxt_inc; |
506 | 204k | WORD8 *pi1_top_cxt = p_curr_ctxt->i1_ref_idx; |
507 | | |
508 | 204k | ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 0, u1_dec_ref_l0, |
509 | 204k | u1_mb_mc_mode, pi1_ref_idx_l0, pi1_lft_cxt, |
510 | 204k | pi1_top_cxt, ps_cab_env, ps_bitstrm, |
511 | 204k | ps_dec->p_ref_idx_t); |
512 | 204k | if(ret != OK) |
513 | 251 | return ret; |
514 | | |
515 | 204k | ret = ih264d_parse_ref_idx_cabac(u1_num_mb_part, 2, u1_dec_ref_l1, |
516 | 204k | u1_mb_mc_mode, pi1_ref_idx_l1, pi1_lft_cxt, |
517 | 204k | pi1_top_cxt, ps_cab_env, ps_bitstrm, |
518 | 204k | ps_dec->p_ref_idx_t); |
519 | 204k | if(ret != OK) |
520 | 217 | return ret; |
521 | 204k | } |
522 | | /* Read MotionVectors */ |
523 | 204k | { |
524 | 204k | const UWORD8 *pu1_top_left_sub_mb_indx; |
525 | 204k | UWORD8 uc_j, uc_lx; |
526 | 204k | UWORD8 u1_mb_part_wd, u1_mb_part_ht; |
527 | | |
528 | 204k | const UWORD8 *pu1_sub_mb_indx_mod = |
529 | 204k | (const UWORD8 *)gau1_ih264d_submb_indx_mod |
530 | 204k | + (u1_sub_mb * 6); |
531 | 204k | const UWORD8 *pu1_sub_mb_partw = (const UWORD8 *)gau1_ih264d_submb_partw; |
532 | 204k | const UWORD8 *pu1_sub_mb_parth = (const UWORD8 *)gau1_ih264d_submb_parth; |
533 | 204k | const UWORD8 *pu1_num_sub_mb_part = |
534 | 204k | (const UWORD8 *)gau1_ih264d_num_submb_part; |
535 | 204k | const UWORD8 *pu1_mb_partw = (const UWORD8 *)gau1_ih264d_mb_partw; |
536 | 204k | const UWORD8 *pu1_mb_parth = (const UWORD8 *)gau1_ih264d_mb_parth; |
537 | | |
538 | 204k | UWORD8 u1_p_idx = 0; |
539 | 204k | UWORD8 u1_num_submb_part; |
540 | 204k | parse_part_params_t *ps_part; |
541 | | /* Initialisations */ |
542 | 204k | mv_pred_t *ps_mv_start = ps_dec->ps_mv_cur + (u4_mb_num << 4); |
543 | 204k | ps_part = ps_dec->ps_part; |
544 | | |
545 | | /* Default initialization for non subMb case */ |
546 | 204k | u1_mb_part_wd = pu1_mb_partw[u1_mb_mc_mode]; |
547 | 204k | u1_mb_part_ht = pu1_mb_parth[u1_mb_mc_mode]; |
548 | 204k | u1_num_submb_part = 1; |
549 | | |
550 | | /* Decoding the MV for the subMB */ |
551 | 612k | for(uc_lx = 0; uc_lx < 2; uc_lx++) |
552 | 408k | { |
553 | 408k | UWORD32 u4_sub_mb_num = 0; |
554 | 408k | UWORD32 u4_mb_pred_mode_tmp = u4_mb_pred_mode; |
555 | 408k | UWORD32 u4_mb_mc_mode_tmp = u4_mb_mc_mode; |
556 | 408k | UWORD8 u1_mb_mc_mode_1, u1_pred_mode, uc_i; |
557 | 408k | UWORD16 u2_sub_mb_num = 0x028A; |
558 | 408k | UWORD8 u1_b2 = uc_lx << 1; |
559 | 408k | u1_pred_mode = (uc_lx) ? PRED_L1 : PRED_L0; |
560 | | /* Default for Cabac */ |
561 | 408k | pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode << 1); |
562 | 1.27M | for(uc_i = 0; uc_i < u1_num_mb_part; uc_i++) |
563 | 868k | { |
564 | | |
565 | 868k | WORD8 i1_pred = (UWORD8)(u4_mb_pred_mode_tmp >> 24); |
566 | 868k | u1_mb_mc_mode_1 = (UWORD8)(u4_mb_mc_mode_tmp >> 24); |
567 | 868k | u4_mb_pred_mode_tmp <<= 8; |
568 | 868k | u4_mb_mc_mode_tmp <<= 8; |
569 | | |
570 | | /* subMb prediction mode */ |
571 | 868k | if(u1_sub_mb) |
572 | 428k | { |
573 | 428k | u1_mb_part_wd = pu1_sub_mb_partw[u1_mb_mc_mode_1]; |
574 | 428k | u1_mb_part_ht = pu1_sub_mb_parth[u1_mb_mc_mode_1]; |
575 | 428k | u4_sub_mb_num = u2_sub_mb_num >> 12; |
576 | 428k | pu1_top_left_sub_mb_indx = pu1_sub_mb_indx_mod + (u1_mb_mc_mode_1 << 1); |
577 | 428k | u1_num_submb_part = pu1_num_sub_mb_part[u1_mb_mc_mode_1]; |
578 | 428k | u2_sub_mb_num = u2_sub_mb_num << 4; |
579 | 428k | } |
580 | | |
581 | 1.83M | for(uc_j = 0; uc_j < u1_num_submb_part; |
582 | 965k | uc_j++, pu1_top_left_sub_mb_indx++) |
583 | 965k | { |
584 | 965k | mv_pred_t *ps_mv; |
585 | 965k | u4_sub_mb_num = u4_sub_mb_num + *pu1_top_left_sub_mb_indx; |
586 | 965k | ps_mv = ps_mv_start + u4_sub_mb_num; |
587 | | |
588 | | /* Storing Info for partitions, writing only once */ |
589 | 965k | if(uc_lx) |
590 | 482k | { |
591 | 482k | ps_part->u1_is_direct = (!i1_pred); |
592 | 482k | ps_part->u1_pred_mode = i1_pred; |
593 | 482k | ps_part->u1_sub_mb_num = u4_sub_mb_num; |
594 | 482k | ps_part->u1_partheight = u1_mb_part_ht; |
595 | 482k | ps_part->u1_partwidth = u1_mb_part_wd; |
596 | | |
597 | | /* Increment partition Index */ |
598 | 482k | u1_p_idx++; |
599 | 482k | ps_part++; |
600 | 482k | } |
601 | | |
602 | 965k | ih264d_get_mvd_cabac(u4_sub_mb_num, u1_b2, u1_mb_part_wd, |
603 | 965k | u1_mb_part_ht, |
604 | 965k | (UWORD8)(i1_pred & u1_pred_mode), ps_dec, |
605 | 965k | ps_mv); |
606 | 965k | } |
607 | 868k | } |
608 | 408k | } |
609 | | /* write back to the scratch partition info */ |
610 | | |
611 | 204k | ps_dec->ps_part = ps_part; |
612 | 204k | ps_parse_mb_data->u1_num_part = u1_sub_mb ? u1_p_idx : u1_num_mb_part; |
613 | | |
614 | 204k | } |
615 | | |
616 | 204k | return OK; |
617 | 204k | } |
618 | | |
619 | | /*! |
620 | | ************************************************************************** |
621 | | * \if Function name : ih264d_parse_bmb_cabac \endif |
622 | | * |
623 | | * \brief |
624 | | * This function parses CABAC syntax of a B MB. |
625 | | * |
626 | | * \return |
627 | | * 0 on Success and Error code otherwise |
628 | | ************************************************************************** |
629 | | */ |
630 | | WORD32 ih264d_parse_bmb_cabac(dec_struct_t * ps_dec, |
631 | | dec_mb_info_t * ps_cur_mb_info, |
632 | | UWORD32 u4_mb_num, |
633 | | UWORD32 u4_num_mbsNby2) |
634 | 213k | { |
635 | 213k | UWORD8 u1_cbp; |
636 | 213k | deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u4_mb_num; |
637 | 213k | const UWORD8 *puc_mb_mc_mode = (const UWORD8 *)gau1_ih264d_mb_mc_mode; |
638 | 213k | UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type; |
639 | 213k | ctxt_inc_mb_info_t *p_curr_ctxt = ps_dec->ps_curr_ctxt_mb_info; |
640 | | |
641 | 213k | WORD32 ret; |
642 | 213k | UWORD8 u1_Bdirect_tranform_read = 1; |
643 | 213k | ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 1; |
644 | | |
645 | 213k | ps_cur_mb_info->u1_mb_mc_mode = puc_mb_mc_mode[5 + u1_mb_type]; |
646 | | |
647 | 213k | ps_cur_mb_info->u1_yuv_dc_block_flag = 0; |
648 | | |
649 | 213k | ps_cur_deblk_mb->u1_mb_type |= D_B_SLICE; |
650 | 213k | if(u1_mb_type != B_DIRECT) |
651 | 204k | { |
652 | 204k | ret = ih264d_parse_bmb_non_direct_cabac(ps_dec, ps_cur_mb_info, u4_mb_num, |
653 | 204k | u4_num_mbsNby2); |
654 | 204k | if(ret != OK) |
655 | 468 | return ret; |
656 | 204k | } |
657 | 8.54k | else |
658 | 8.54k | { |
659 | | |
660 | | /************ STORING PARTITION INFO ***********/ |
661 | 8.54k | parse_part_params_t * ps_part_info; |
662 | 8.54k | ps_part_info = ps_dec->ps_part; |
663 | 8.54k | ps_part_info->u1_is_direct = PART_DIRECT_16x16; |
664 | 8.54k | ps_part_info->u1_sub_mb_num = 0; |
665 | 8.54k | ps_dec->ps_part++; |
666 | 8.54k | p_curr_ctxt->u1_mb_type = CAB_BD16x16; |
667 | | |
668 | 8.54k | MEMSET_16BYTES(&ps_dec->pu1_left_mv_ctxt_inc[0][0], 0); |
669 | 8.54k | memset(ps_dec->pi1_left_ref_idx_ctxt_inc, 0, 4); |
670 | 8.54k | MEMSET_16BYTES(p_curr_ctxt->u1_mv, 0); |
671 | 8.54k | memset(p_curr_ctxt->i1_ref_idx, 0, 4); |
672 | | |
673 | | /* check whether transform8x8 u4_flag to be read or not */ |
674 | 8.54k | u1_Bdirect_tranform_read = |
675 | 8.54k | ps_dec->s_high_profile.u1_direct_8x8_inference_flag; |
676 | 8.54k | } |
677 | | |
678 | | /* Read the Coded block pattern */ |
679 | 212k | u1_cbp = (WORD8)ih264d_parse_ctx_cbp_cabac(ps_dec); |
680 | 212k | p_curr_ctxt->u1_cbp = u1_cbp; |
681 | 212k | ps_cur_mb_info->u1_cbp = u1_cbp; |
682 | | |
683 | 212k | if(u1_cbp > 47) |
684 | 0 | return ERROR_CBP; |
685 | | |
686 | 212k | COPYTHECONTEXT("coded_block_pattern", u1_cbp); |
687 | | |
688 | 212k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
689 | 212k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
690 | | |
691 | 212k | if((ps_dec->s_high_profile.u1_transform8x8_present) && (u1_cbp & (0xf)) |
692 | 35.2k | && (ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag) |
693 | 31.0k | && (u1_Bdirect_tranform_read)) |
694 | 30.1k | { |
695 | 30.1k | ps_cur_mb_info->u1_tran_form8x8 = ih264d_parse_transform8x8flag_cabac( |
696 | 30.1k | ps_dec, ps_cur_mb_info); |
697 | 30.1k | COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8); |
698 | | |
699 | 30.1k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8; |
700 | 30.1k | p_curr_ctxt->u1_transform8x8_ctxt = ps_cur_mb_info->u1_tran_form8x8; |
701 | 30.1k | } |
702 | 182k | else |
703 | 182k | { |
704 | 182k | p_curr_ctxt->u1_transform8x8_ctxt = 0; |
705 | 182k | } |
706 | | |
707 | 212k | p_curr_ctxt->u1_intra_chroma_pred_mode = 0; |
708 | 212k | p_curr_ctxt->u1_yuv_dc_csbp &= 0xFE; |
709 | 212k | ps_dec->pu1_left_yuv_dc_csbp[0] &= 0x6; |
710 | | |
711 | | /* Read mb_qp_delta */ |
712 | 212k | if(u1_cbp) |
713 | 70.8k | { |
714 | 70.8k | WORD8 c_temp; |
715 | 70.8k | ret = ih264d_parse_mb_qp_delta_cabac(ps_dec, &c_temp); |
716 | 70.8k | if(ret != OK) |
717 | 106 | return ret; |
718 | 70.7k | COPYTHECONTEXT("mb_qp_delta", c_temp); |
719 | 70.7k | if(c_temp) |
720 | 8.67k | { |
721 | 8.67k | ret = ih264d_update_qp(ps_dec, c_temp); |
722 | 8.67k | if(ret != OK) |
723 | 0 | return ret; |
724 | 8.67k | } |
725 | 70.7k | } |
726 | 141k | else |
727 | 141k | ps_dec->i1_prev_mb_qp_delta = 0; |
728 | | |
729 | 212k | ih264d_parse_residual4x4_cabac(ps_dec, ps_cur_mb_info, 0); |
730 | 212k | if(EXCEED_OFFSET(ps_dec->ps_bitstrm)) |
731 | 2.12k | return ERROR_EOB_TERMINATE_T; |
732 | 210k | return OK; |
733 | 212k | } |
734 | | /*! |
735 | | ************************************************************************** |
736 | | * \if Function name : ih264d_parse_bmb_cavlc \endif |
737 | | * |
738 | | * \brief |
739 | | * This function parses CAVLC syntax of a B MB. |
740 | | * |
741 | | * \return |
742 | | * 0 on Success and Error code otherwise |
743 | | ************************************************************************** |
744 | | */ |
745 | | WORD32 ih264d_parse_bmb_cavlc(dec_struct_t * ps_dec, |
746 | | dec_mb_info_t * ps_cur_mb_info, |
747 | | UWORD32 u4_mb_num, |
748 | | UWORD32 u4_num_mbsNby2) |
749 | 191k | { |
750 | 191k | UWORD32 u4_cbp; |
751 | 191k | deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + u4_mb_num; |
752 | 191k | dec_bit_stream_t * const ps_bitstrm = ps_dec->ps_bitstrm; |
753 | 191k | UWORD32 * pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
754 | 191k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
755 | 191k | const UWORD8 *puc_mb_mc_mode = (const UWORD8 *)gau1_ih264d_mb_mc_mode; |
756 | 191k | UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type; |
757 | | |
758 | 191k | WORD32 ret; |
759 | 191k | UWORD8 u1_Bdirect_tranform_read = 1; |
760 | 191k | ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag = 1; |
761 | 191k | ps_cur_mb_info->u1_tran_form8x8 = 0; |
762 | 191k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = 0; |
763 | | |
764 | 191k | ps_cur_mb_info->u1_yuv_dc_block_flag = 0; |
765 | | |
766 | 191k | ps_cur_mb_info->u1_mb_mc_mode = puc_mb_mc_mode[5 + u1_mb_type]; |
767 | | |
768 | 191k | ps_cur_deblk_mb->u1_mb_type |= D_B_SLICE; |
769 | 191k | if(u1_mb_type != B_DIRECT) |
770 | 131k | { |
771 | 131k | ret = ih264d_parse_bmb_non_direct_cavlc(ps_dec, ps_cur_mb_info, u4_mb_num, |
772 | 131k | u4_num_mbsNby2); |
773 | 131k | if(ret != OK) |
774 | 752 | return ret; |
775 | 131k | } |
776 | 60.1k | else |
777 | 60.1k | { |
778 | | /************ STORING PARTITION INFO ***********/ |
779 | 60.1k | parse_part_params_t * ps_part_info; |
780 | 60.1k | ps_part_info = ps_dec->ps_part; |
781 | 60.1k | ps_part_info->u1_is_direct = PART_DIRECT_16x16; |
782 | 60.1k | ps_part_info->u1_sub_mb_num = 0; |
783 | 60.1k | ps_dec->ps_part++; |
784 | | /* check whether transform8x8 u4_flag to be read or not */ |
785 | 60.1k | u1_Bdirect_tranform_read = |
786 | 60.1k | ps_dec->s_high_profile.u1_direct_8x8_inference_flag; |
787 | 60.1k | } |
788 | | |
789 | | /* Read the Coded block pattern */ |
790 | 191k | { |
791 | 191k | const UWORD8 * puc_CbpInter = gau1_ih264d_cbp_inter; |
792 | | //Inlined ih264d_uev |
793 | 191k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
794 | 191k | UWORD32 u4_word, u4_ldz; |
795 | | |
796 | | /***************************************************************/ |
797 | | /* Find leading zeros in next 32 bits */ |
798 | | /***************************************************************/ |
799 | 191k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
800 | 191k | u4_ldz = CLZ(u4_word); |
801 | | /* Flush the ps_bitstrm */ |
802 | 191k | u4_bitstream_offset += (u4_ldz + 1); |
803 | | /* Read the suffix from the ps_bitstrm */ |
804 | 191k | u4_word = 0; |
805 | 191k | if(u4_ldz) |
806 | 108k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
807 | 191k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
808 | 191k | u4_cbp = ((1 << u4_ldz) + u4_word - 1); |
809 | | //Inlined ih264d_uev |
810 | 191k | if(u4_cbp > 47) |
811 | 1.08k | return ERROR_CBP; |
812 | 190k | u4_cbp = puc_CbpInter[u4_cbp]; |
813 | | |
814 | 190k | if((ps_dec->s_high_profile.u1_transform8x8_present) && (u4_cbp & (0xf)) |
815 | 36.0k | && (ps_dec->s_high_profile.u1_no_submb_part_size_lt8x8_flag) |
816 | 35.5k | && (u1_Bdirect_tranform_read)) |
817 | 33.5k | { |
818 | 33.5k | ps_cur_mb_info->u1_tran_form8x8 = ih264d_get_bit_h264(ps_bitstrm); |
819 | 33.5k | COPYTHECONTEXT("transform_size_8x8_flag", ps_cur_mb_info->u1_tran_form8x8); |
820 | 33.5k | ps_cur_mb_info->ps_curmb->u1_tran_form8x8 = ps_cur_mb_info->u1_tran_form8x8; |
821 | 33.5k | } |
822 | | |
823 | 190k | } |
824 | | |
825 | 0 | COPYTHECONTEXT("coded_block_pattern", u4_cbp); |
826 | 190k | ps_cur_mb_info->u1_cbp = u4_cbp; |
827 | | |
828 | | /* Read mb_qp_delta */ |
829 | 190k | if(u4_cbp) |
830 | 107k | { |
831 | 107k | WORD32 i_temp; |
832 | | //inlining ih264d_sev |
833 | | |
834 | 107k | UWORD32 u4_bitstream_offset = *pu4_bitstrm_ofst; |
835 | 107k | UWORD32 u4_word, u4_ldz, u4_abs_val; |
836 | | |
837 | | /***************************************************************/ |
838 | | /* Find leading zeros in next 32 bits */ |
839 | | /***************************************************************/ |
840 | 107k | NEXTBITS_32(u4_word, u4_bitstream_offset, pu4_bitstrm_buf); |
841 | 107k | u4_ldz = CLZ(u4_word); |
842 | | |
843 | | /* Flush the ps_bitstrm */ |
844 | 107k | u4_bitstream_offset += (u4_ldz + 1); |
845 | | |
846 | | /* Read the suffix from the ps_bitstrm */ |
847 | 107k | u4_word = 0; |
848 | 107k | if(u4_ldz) |
849 | 92.4k | GETBITS(u4_word, u4_bitstream_offset, pu4_bitstrm_buf, u4_ldz); |
850 | | |
851 | 107k | *pu4_bitstrm_ofst = u4_bitstream_offset; |
852 | 107k | u4_abs_val = ((1 << u4_ldz) + u4_word) >> 1; |
853 | | |
854 | 107k | if(u4_word & 0x1) |
855 | 74.6k | i_temp = (-(WORD32)u4_abs_val); |
856 | 32.7k | else |
857 | 32.7k | i_temp = (u4_abs_val); |
858 | | |
859 | 107k | if(i_temp < -26 || i_temp > 25) |
860 | 378 | return ERROR_INV_RANGE_QP_T; |
861 | | //inlinined ih264d_sev |
862 | 107k | COPYTHECONTEXT("mb_qp_delta", i_temp); |
863 | 107k | if(i_temp) |
864 | 92.0k | { |
865 | 92.0k | ret = ih264d_update_qp(ps_dec, (WORD8)i_temp); |
866 | 92.0k | if(ret != OK) |
867 | 0 | return ret; |
868 | 92.0k | } |
869 | | |
870 | 107k | ret = ih264d_parse_residual4x4_cavlc(ps_dec, ps_cur_mb_info, 0); |
871 | 107k | if(ret != OK) |
872 | 1.06k | return ret; |
873 | 105k | if(EXCEED_OFFSET(ps_bitstrm)) |
874 | 701 | return ERROR_EOB_TERMINATE_T; |
875 | 105k | } |
876 | 82.7k | else |
877 | 82.7k | { |
878 | 82.7k | ps_dec->i1_prev_mb_qp_delta = 0; |
879 | 82.7k | ih264d_update_nnz_for_skipmb(ps_dec, ps_cur_mb_info, CAVLC); |
880 | 82.7k | } |
881 | | |
882 | 187k | return OK; |
883 | 190k | } |
884 | | |
885 | | WORD32 ih264d_mv_pred_ref_tfr_nby2_bmb(dec_struct_t * ps_dec, |
886 | | UWORD32 u4_mb_idx, |
887 | | UWORD32 u4_num_mbs) |
888 | 214k | { |
889 | 214k | parse_pmbarams_t * ps_mb_part_info; |
890 | 214k | parse_part_params_t * ps_part; |
891 | 214k | mv_pred_t *ps_mv_nmb, *ps_mv_nmb_start, *ps_mv_ntop, *ps_mv_ntop_start; |
892 | 214k | pic_buffer_t * ps_ref_frame; |
893 | 214k | UWORD8 u1_direct_mode_width; |
894 | 214k | UWORD32 i; |
895 | 214k | UWORD8 j; |
896 | 214k | dec_mb_info_t * ps_cur_mb_info; |
897 | 214k | const UWORD8 u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag; |
898 | 214k | UWORD8 u1_field; |
899 | 214k | WORD32 ret = 0; |
900 | | |
901 | 214k | ps_dec->i4_submb_ofst -= (WORD32)(u4_num_mbs - u4_mb_idx) << 4; |
902 | 214k | ps_mb_part_info = ps_dec->ps_parse_mb_data; |
903 | 214k | ps_part = ps_dec->ps_parse_part_params; |
904 | | |
905 | | /* N/2 Mb MvPred and Transfer Setup Loop */ |
906 | 6.23M | for(i = u4_mb_idx; i < u4_num_mbs; i++, ps_mb_part_info++) |
907 | 6.02M | { |
908 | 6.02M | UWORD8 u1_colz = 0; |
909 | 6.02M | ps_dec->i4_submb_ofst += SUB_BLK_SIZE; |
910 | | /* Restore the slice scratch MbX and MbY context */ |
911 | 6.02M | ps_cur_mb_info = ps_dec->ps_nmb_info + i; |
912 | | |
913 | | |
914 | 6.02M | u1_field = ps_cur_mb_info->u1_mb_field_decodingflag; |
915 | | |
916 | 6.02M | ps_mv_nmb_start = ps_dec->ps_mv_cur + (i << 4); |
917 | 6.02M | ps_dec->u2_mbx = ps_cur_mb_info->u2_mbx; |
918 | 6.02M | ps_dec->u2_mby = ps_cur_mb_info->u2_mby; |
919 | 6.02M | ps_dec->u1_currB_type = 0; |
920 | 6.02M | ps_dec->u2_mv_2mb[i & 0x1] = 0; |
921 | | |
922 | | /* Look for MV Prediction and Reference Transfer in Non-I Mbs */ |
923 | 6.02M | if(!ps_mb_part_info->u4_isI_mb) |
924 | 6.02M | { |
925 | 6.02M | UWORD8 u1_blk_no; |
926 | 6.02M | WORD16 i1_ref_idx, i1_ref_idx1; |
927 | 6.02M | UWORD8 u1_pred_mode; |
928 | 6.02M | UWORD8 u1_sub_mb_x, u1_sub_mb_y, u1_sub_mb_num; |
929 | 6.02M | UWORD8 u1_lx, u1_lx_start, u1_lxend, u1_tmp_lx; |
930 | 6.02M | UWORD8 u1_num_part, u1_num_ref, u1_wd, u1_ht; |
931 | 6.02M | UWORD32 *pu4_wt_offst; |
932 | 6.02M | UWORD8 u1_scale_ref, u4_bot_mb; |
933 | 6.02M | deblk_mb_t * ps_cur_deblk_mb = ps_dec->ps_deblk_mbn + i; |
934 | 6.02M | WORD8 (*pi1_ref_idx)[MAX_REFIDX_INFO_PER_MB] = |
935 | 6.02M | ps_mb_part_info->i1_ref_idx; |
936 | 6.02M | WORD8 *pi1_ref_idx0 = pi1_ref_idx[0], |
937 | 6.02M | *pi1_ref_idx1 = pi1_ref_idx[1]; |
938 | 6.02M | UWORD32 **ppu4_wt_ofst = ps_mb_part_info->pu4_wt_offst; |
939 | | |
940 | | /* MB Level initialisations */ |
941 | 6.02M | ps_dec->u4_num_pmbair = i >> u1_mbaff; |
942 | 6.02M | ps_dec->u4_mb_idx_mv = i; |
943 | | |
944 | | /* CHANGED CODE */ |
945 | 6.02M | ps_mv_ntop_start = ps_mv_nmb_start |
946 | 6.02M | - (ps_dec->u2_frm_wd_in_mbs << (4 + u1_mbaff)) + 12; |
947 | | |
948 | 6.02M | u1_num_part = ps_mb_part_info->u1_num_part; |
949 | 6.02M | ps_cur_deblk_mb->u1_mb_type |= (u1_num_part > 1) << 1; |
950 | 6.02M | u1_direct_mode_width = (1 == ps_mb_part_info->u1_num_part) ? 16 : 8; |
951 | | |
952 | | |
953 | 6.02M | ps_cur_mb_info->u4_pred_info_pkd_idx = ps_dec->u4_pred_info_pkd_idx; |
954 | 6.02M | ps_cur_mb_info->u1_num_pred_parts = 0; |
955 | | |
956 | | /****************************************************/ |
957 | | /* weighted u4_ofst pointer calculations, this loop */ |
958 | | /* runs maximum 4 times, even in direct cases */ |
959 | | /****************************************************/ |
960 | 6.02M | u1_scale_ref = u1_mbaff & ps_cur_mb_info->u1_mb_field_decodingflag; |
961 | 6.02M | u4_bot_mb = 1 - ps_cur_mb_info->u1_topmb; |
962 | 6.02M | if(ps_dec->ps_cur_pps->u1_wted_bipred_idc) |
963 | 4.77M | { |
964 | 4.77M | u1_num_ref = MIN(u1_num_part, 4); |
965 | 4.77M | if(PART_DIRECT_16x16 != ps_part->u1_is_direct) |
966 | 176k | { |
967 | 456k | for(u1_blk_no = 0; u1_blk_no < u1_num_ref; u1_blk_no++) |
968 | 279k | { |
969 | 279k | i1_ref_idx = MAX(pi1_ref_idx0[u1_blk_no], 0); |
970 | 279k | if(u1_scale_ref) |
971 | 1.25k | i1_ref_idx >>= 1; |
972 | 279k | i1_ref_idx *= |
973 | 279k | ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]; |
974 | 279k | if(u1_scale_ref) |
975 | 1.25k | i1_ref_idx += |
976 | 1.25k | (MAX(pi1_ref_idx1[u1_blk_no], 0) |
977 | 1.25k | >> 1); |
978 | 278k | else |
979 | 278k | i1_ref_idx += MAX(pi1_ref_idx1[u1_blk_no], 0); |
980 | 279k | pu4_wt_offst = (UWORD32*)&ps_dec->pu4_wt_ofsts[2 |
981 | 279k | * X3(i1_ref_idx)]; |
982 | | |
983 | 279k | if(pi1_ref_idx0[u1_blk_no] < 0) |
984 | 145k | pu4_wt_offst += 1; |
985 | | |
986 | 279k | ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst; |
987 | 279k | if(u1_scale_ref |
988 | 1.25k | && (ps_dec->ps_cur_pps->u1_wted_bipred_idc |
989 | 1.25k | == 2)) |
990 | 399 | { |
991 | 399 | i1_ref_idx = MAX(pi1_ref_idx0[u1_blk_no], 0); |
992 | 399 | i1_ref_idx *= |
993 | 399 | (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1] |
994 | 399 | << 1); |
995 | 399 | i1_ref_idx += MAX(pi1_ref_idx1[u1_blk_no], 0); |
996 | 399 | if(u4_bot_mb) |
997 | 125 | { |
998 | 125 | i1_ref_idx += |
999 | 125 | (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0] |
1000 | 125 | << 1) |
1001 | 125 | * (ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1] |
1002 | 125 | << 1); |
1003 | 125 | } |
1004 | 399 | pu4_wt_offst = (UWORD32*)&ps_dec->pu4_mbaff_wt_mat[2 |
1005 | 399 | * X3(i1_ref_idx)]; |
1006 | 399 | ppu4_wt_ofst[u1_blk_no] = pu4_wt_offst; |
1007 | 399 | } |
1008 | 279k | } |
1009 | 176k | } |
1010 | 4.77M | } |
1011 | | |
1012 | | /**************************************************/ |
1013 | | /* Loop on Partitions */ |
1014 | | /* direct mode is reflected as a single partition */ |
1015 | | /**************************************************/ |
1016 | 12.3M | for(j = 0; j < u1_num_part; j++, ps_part++) |
1017 | 6.35M | { |
1018 | 6.35M | u1_sub_mb_num = ps_part->u1_sub_mb_num; |
1019 | 6.35M | ps_dec->u1_sub_mb_num = u1_sub_mb_num; |
1020 | | |
1021 | 6.35M | if(PART_NOT_DIRECT != ps_part->u1_is_direct) |
1022 | 5.71M | { |
1023 | | /**************************************************/ |
1024 | | /* Direct Mode, Call DecodeSpatial/TemporalDirect */ |
1025 | | /* only (those will in turn call FormMbPartInfo) */ |
1026 | | /**************************************************/ |
1027 | 5.71M | ret = ps_dec->ps_cur_slice->pf_decodeDirect(ps_dec, |
1028 | 5.71M | u1_direct_mode_width, |
1029 | 5.71M | ps_cur_mb_info, i); |
1030 | 5.71M | if(ret != OK) |
1031 | 0 | return ret; |
1032 | 5.71M | ps_cur_deblk_mb->u1_mb_type |= (ps_dec->u1_currB_type << 1); |
1033 | | |
1034 | 5.71M | } |
1035 | 636k | else |
1036 | 636k | { |
1037 | 636k | mv_pred_t s_mvPred; |
1038 | | /**************************************************/ |
1039 | | /* Non Direct Mode, Call Motion Vector Predictor */ |
1040 | | /* and FormMbpartInfo */ |
1041 | | /**************************************************/ |
1042 | 636k | u1_sub_mb_x = u1_sub_mb_num & 0x03; |
1043 | 636k | u1_sub_mb_y = u1_sub_mb_num >> 2; |
1044 | 636k | u1_blk_no = |
1045 | 636k | (u1_num_part < 4) ? |
1046 | 392k | j : |
1047 | 636k | (((u1_sub_mb_y >> 1) << 1) |
1048 | 243k | + (u1_sub_mb_x |
1049 | 243k | >> 1)); |
1050 | | |
1051 | 636k | ps_mv_ntop = ps_mv_ntop_start + u1_sub_mb_x; |
1052 | 636k | ps_mv_nmb = ps_mv_nmb_start + u1_sub_mb_num; |
1053 | | |
1054 | 636k | u1_pred_mode = ps_part->u1_pred_mode; |
1055 | 636k | u1_wd = ps_part->u1_partwidth; |
1056 | 636k | u1_ht = ps_part->u1_partheight; |
1057 | | |
1058 | 636k | u1_lx_start = 0; |
1059 | 636k | u1_lxend = 2; |
1060 | 636k | if( PRED_L0 == u1_pred_mode) |
1061 | 234k | { |
1062 | 234k | s_mvPred.i2_mv[2] = 0; |
1063 | 234k | s_mvPred.i2_mv[3] = 0; |
1064 | 234k | u1_lxend = 1; |
1065 | 234k | } |
1066 | 636k | if( PRED_L1 == u1_pred_mode) |
1067 | 257k | { |
1068 | 257k | s_mvPred.i2_mv[0] = 0; |
1069 | 257k | s_mvPred.i2_mv[1] = 0; |
1070 | 257k | u1_lx_start = 1; |
1071 | 257k | } |
1072 | | |
1073 | | /* Populate the colpic info and reference frames */ |
1074 | 636k | s_mvPred.i1_ref_frame[0] = pi1_ref_idx0[u1_blk_no]; |
1075 | 636k | s_mvPred.i1_ref_frame[1] = pi1_ref_idx1[u1_blk_no]; |
1076 | | |
1077 | 636k | ps_dec->pf_mvpred(ps_dec, ps_cur_mb_info, ps_mv_nmb, ps_mv_ntop, |
1078 | 636k | &s_mvPred, u1_sub_mb_num, u1_wd, |
1079 | 636k | u1_lx_start, u1_lxend, |
1080 | 636k | ps_cur_mb_info->u1_mb_mc_mode); |
1081 | | |
1082 | | /**********************************************************/ |
1083 | | /* Loop on number of predictors, 1 Each for Forw Backw */ |
1084 | | /* Loop 2 times for BiDirect mode */ |
1085 | | /**********************************************************/ |
1086 | 1.41M | for(u1_lx = u1_lx_start; u1_lx < u1_lxend; u1_lx++) |
1087 | 779k | { |
1088 | 779k | WORD16 i2_mv_x, i2_mv_y; |
1089 | | |
1090 | | /********************************************************/ |
1091 | | /* Predict Mv */ |
1092 | | /* Add Mv Residuals and store back */ |
1093 | | /********************************************************/ |
1094 | 779k | i1_ref_idx = s_mvPred.i1_ref_frame[u1_lx]; |
1095 | 779k | u1_tmp_lx = (u1_lx << 1); |
1096 | | |
1097 | 779k | i2_mv_x = ps_mv_nmb->i2_mv[u1_tmp_lx]; |
1098 | 779k | i2_mv_y = ps_mv_nmb->i2_mv[u1_tmp_lx + 1]; |
1099 | | |
1100 | 779k | i2_mv_x += s_mvPred.i2_mv[u1_tmp_lx]; |
1101 | 779k | i2_mv_y += s_mvPred.i2_mv[u1_tmp_lx + 1]; |
1102 | 779k | s_mvPred.i2_mv[u1_tmp_lx] = i2_mv_x; |
1103 | 779k | s_mvPred.i2_mv[u1_tmp_lx + 1] = i2_mv_y; |
1104 | | |
1105 | | /********************************************************/ |
1106 | | /* Transfer setup call */ |
1107 | | /* convert RefIdx if it is MbAff */ |
1108 | | /* Pass Weight Offset and refFrame */ |
1109 | | /********************************************************/ |
1110 | 779k | i1_ref_idx1 = i1_ref_idx >> u1_scale_ref; |
1111 | 779k | if(u1_scale_ref && ((i1_ref_idx & 0x01) != u4_bot_mb)) |
1112 | 2.30k | i1_ref_idx1 += MAX_REF_BUFS; |
1113 | 779k | ps_ref_frame = |
1114 | 779k | ps_dec->ps_ref_pic_buf_lx[u1_lx][i1_ref_idx1]; |
1115 | | |
1116 | | /* Storing Colocated-Zero u4_flag */ |
1117 | 779k | if(u1_lx == u1_lx_start) |
1118 | 636k | { |
1119 | | /* Fill colocated info in MvPred structure */ |
1120 | 636k | s_mvPred.u1_col_ref_pic_idx = |
1121 | 636k | ps_ref_frame->u1_mv_buf_id; |
1122 | 636k | s_mvPred.u1_pic_type = ps_ref_frame->u1_pic_type; |
1123 | | |
1124 | | /* Calculating colocated zero information */ |
1125 | 636k | u1_colz = |
1126 | 636k | (u1_field << 1) |
1127 | 636k | | ((i1_ref_idx == 0) |
1128 | 523k | && (ABS(i2_mv_x) |
1129 | 523k | <= 1) |
1130 | 212k | && (ABS(i2_mv_y) |
1131 | 212k | <= 1)); |
1132 | 636k | u1_colz |= ps_mb_part_info->u1_col_info[u1_blk_no]; |
1133 | 636k | } |
1134 | | |
1135 | 779k | pu4_wt_offst = ppu4_wt_ofst[u1_blk_no]; |
1136 | 779k | { |
1137 | 779k | pred_info_pkd_t *ps_pred_pkd; |
1138 | 779k | WORD16 i2_mv[2]; |
1139 | | |
1140 | 779k | i2_mv[0] = i2_mv_x; |
1141 | 779k | i2_mv[1] = i2_mv_y; |
1142 | | |
1143 | 779k | ps_pred_pkd = ps_dec->ps_pred_pkd + ps_dec->u4_pred_info_pkd_idx; |
1144 | 779k | ih264d_fill_pred_info(i2_mv,u1_wd,u1_ht,u1_sub_mb_num,u1_pred_mode, |
1145 | 779k | ps_pred_pkd,ps_ref_frame->u1_pic_buf_id,i1_ref_idx,pu4_wt_offst, |
1146 | 779k | ps_ref_frame->u1_pic_type); |
1147 | 779k | ps_dec->u4_pred_info_pkd_idx++; |
1148 | 779k | ps_cur_mb_info->u1_num_pred_parts++; |
1149 | | |
1150 | | |
1151 | 779k | } |
1152 | | |
1153 | 779k | } |
1154 | 636k | ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb, |
1155 | 636k | u1_sub_mb_num, u1_colz, u1_ht, |
1156 | 636k | u1_wd); |
1157 | 636k | } |
1158 | 6.35M | } |
1159 | | |
1160 | 6.02M | } |
1161 | 3.63k | else |
1162 | 3.63k | { |
1163 | | /* Set zero values in case of Intra Mbs */ |
1164 | 3.63k | mv_pred_t s_mvPred = |
1165 | 3.63k | { |
1166 | 3.63k | { 0, 0, 0, 0 }, |
1167 | 3.63k | { -1, -1 }, 0, 0}; |
1168 | | /* Storing colocated zero information */ |
1169 | 3.63k | ih264d_rep_mv_colz(ps_dec, &s_mvPred, ps_mv_nmb_start, 0, |
1170 | 3.63k | (UWORD8)(u1_field << 1), 4, 4); |
1171 | 3.63k | } |
1172 | | |
1173 | | /*if num _cores is set to 3 ,compute bs will be done in another thread*/ |
1174 | 6.02M | if(ps_dec->u4_num_cores < 3) |
1175 | 1.26M | { |
1176 | 1.26M | if(ps_dec->u4_app_disable_deblk_frm == 0) |
1177 | 1.26M | ps_dec->pf_compute_bs(ps_dec, ps_cur_mb_info, |
1178 | 1.26M | (UWORD16)(i >> u1_mbaff)); |
1179 | 1.26M | } |
1180 | 6.02M | } |
1181 | 214k | return OK; |
1182 | 214k | } |
1183 | | /*! |
1184 | | ************************************************************************** |
1185 | | * \if Function name : ih264d_get_implicit_weights \endif |
1186 | | * |
1187 | | * \brief |
1188 | | * Calculates Implicit Weights. |
1189 | | * |
1190 | | * \return |
1191 | | * None |
1192 | | * |
1193 | | ************************************************************************** |
1194 | | */ |
1195 | | void ih264d_get_implicit_weights(dec_struct_t *ps_dec) |
1196 | 32.2k | { |
1197 | 32.2k | UWORD32 *pu4_iwt_ofst; |
1198 | 32.2k | UWORD8 i, j; |
1199 | 32.2k | struct pic_buffer_t *ps_pic_buff0, *ps_pic_buff1; |
1200 | 32.2k | WORD16 i2_dist_scale_factor; |
1201 | 32.2k | WORD16 i2_tb, i2_td, i2_tx; |
1202 | 32.2k | WORD64 i8_tb, i8_td; |
1203 | 32.2k | WORD32 i4_poc0, i4_poc1; |
1204 | 32.2k | UWORD32 ui_temp0, ui_temp1; |
1205 | 32.2k | UWORD8 uc_num_ref_idx_l0_active, uc_num_ref_idx_l1_active; |
1206 | | |
1207 | 32.2k | pu4_iwt_ofst = ps_dec->pu4_wts_ofsts_mat; |
1208 | 32.2k | uc_num_ref_idx_l0_active = |
1209 | 32.2k | ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]; |
1210 | 32.2k | uc_num_ref_idx_l1_active = |
1211 | 32.2k | ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]; |
1212 | | |
1213 | 109k | for(i = 0; i < uc_num_ref_idx_l0_active; i++) |
1214 | 77.7k | { |
1215 | 77.7k | ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][i]; |
1216 | 77.7k | i4_poc0 = ps_pic_buff0->i4_avg_poc; |
1217 | 251k | for(j = 0; j < uc_num_ref_idx_l1_active; j++) |
1218 | 173k | { |
1219 | 173k | ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][j]; |
1220 | 173k | i4_poc1 = ps_pic_buff1->i4_avg_poc; |
1221 | | |
1222 | 173k | if(i4_poc1 != i4_poc0) |
1223 | 57.2k | { |
1224 | 57.2k | i8_tb = (WORD64)ps_dec->ps_cur_pic->i4_poc - i4_poc0; |
1225 | 57.2k | i2_tb = CLIP_S8(i8_tb); |
1226 | 57.2k | i8_td = (WORD64)i4_poc1 - i4_poc0; |
1227 | 57.2k | i2_td = CLIP_S8(i8_td); |
1228 | 57.2k | i2_tx = (16384 + ABS(SIGN_POW2_DIV(i2_td, 1))) / i2_td; |
1229 | 57.2k | i2_dist_scale_factor = CLIP_S11( |
1230 | 57.2k | (((i2_tb * i2_tx) + 32) >> 6)); |
1231 | | |
1232 | 57.2k | if(/*((u4_poc1 - u4_poc0) == 0) ||*/ |
1233 | 57.2k | (!(ps_pic_buff1->u1_is_short && ps_pic_buff0->u1_is_short)) |
1234 | 18.5k | || ((i2_dist_scale_factor >> 2) < -64) |
1235 | 17.0k | || ((i2_dist_scale_factor >> 2) > 128)) |
1236 | 42.0k | { |
1237 | | /* same for forward and backward, wt=32 and Offset = 0 */ |
1238 | 42.0k | ui_temp0 = 0x00000020; |
1239 | 42.0k | ui_temp1 = 0x00000020; |
1240 | 42.0k | } |
1241 | 15.2k | else |
1242 | 15.2k | { |
1243 | 15.2k | ui_temp0 = 64 - (i2_dist_scale_factor >> 2); |
1244 | 15.2k | ui_temp1 = (i2_dist_scale_factor >> 2); |
1245 | 15.2k | } |
1246 | 57.2k | } |
1247 | 116k | else |
1248 | 116k | { |
1249 | 116k | ui_temp0 = 0x00000020; |
1250 | 116k | ui_temp1 = 0x00000020; |
1251 | 116k | } |
1252 | 173k | pu4_iwt_ofst[0] = pu4_iwt_ofst[2] = pu4_iwt_ofst[4] = ui_temp0; |
1253 | 173k | pu4_iwt_ofst[1] = pu4_iwt_ofst[3] = pu4_iwt_ofst[5] = ui_temp1; |
1254 | 173k | pu4_iwt_ofst += 6; |
1255 | 173k | } |
1256 | 77.7k | } |
1257 | 32.2k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
1258 | 348 | { |
1259 | 348 | UWORD8 k; |
1260 | 348 | WORD32 i4_cur_poc = ps_dec->ps_cur_pic->i4_top_field_order_cnt; |
1261 | 348 | UWORD32* pu4_wt_mat = ps_dec->pu4_mbaff_wt_mat; |
1262 | | /* Form the Implicit Weighted prediction matrix for field MBs also */ |
1263 | 1.04k | for(k = 0; k < 2; k++) |
1264 | 696 | { |
1265 | 4.02k | for(i = 0; i < (uc_num_ref_idx_l0_active << 1); i++) |
1266 | 3.32k | { |
1267 | 3.32k | UWORD16 u2_l0_idx; |
1268 | | |
1269 | | /*u2_l0_idx = (i >= uc_num_ref_idx_l0_active) |
1270 | | ?(MAX_REF_BUFS + i - uc_num_ref_idx_l0_active) : (i) ;*/ |
1271 | | |
1272 | 3.32k | u2_l0_idx = i >> 1; |
1273 | 3.32k | if((i & 0x01) != k) |
1274 | 1.66k | { |
1275 | 1.66k | u2_l0_idx += MAX_REF_BUFS; |
1276 | 1.66k | } |
1277 | 3.32k | ps_pic_buff0 = ps_dec->ps_ref_pic_buf_lx[0][u2_l0_idx]; |
1278 | 3.32k | i4_poc0 = ps_pic_buff0->i4_poc; |
1279 | 12.6k | for(j = 0; j < (uc_num_ref_idx_l1_active << 1); j++) |
1280 | 9.36k | { |
1281 | 9.36k | UWORD16 u2_l1_idx; |
1282 | | /*u2_l1_idx = (j >= uc_num_ref_idx_l1_active) |
1283 | | ? (MAX_REF_BUFS + j - uc_num_ref_idx_l1_active ) : (j) ;*/ |
1284 | | |
1285 | 9.36k | u2_l1_idx = j >> 1; |
1286 | 9.36k | if((j & 0x01) != k) |
1287 | 4.68k | { |
1288 | 4.68k | u2_l1_idx += MAX_REF_BUFS; |
1289 | 4.68k | } |
1290 | 9.36k | ps_pic_buff1 = ps_dec->ps_ref_pic_buf_lx[1][u2_l1_idx]; |
1291 | 9.36k | i4_poc1 = ps_pic_buff1->i4_poc; |
1292 | 9.36k | if(i4_poc1 != i4_poc0) |
1293 | 2.61k | { |
1294 | 2.61k | i8_tb = (WORD64)i4_cur_poc - i4_poc0; |
1295 | 2.61k | i2_tb = CLIP_S8(i8_tb); |
1296 | 2.61k | i8_td = (WORD64)i4_poc1 - i4_poc0; |
1297 | 2.61k | i2_td = CLIP_S8(i8_td); |
1298 | 2.61k | i2_tx = (16384 + ABS(SIGN_POW2_DIV(i2_td, 1))) |
1299 | 2.61k | / i2_td; |
1300 | 2.61k | i2_dist_scale_factor = CLIP_S11( |
1301 | 2.61k | (((i2_tb * i2_tx) + 32) >> 6)); |
1302 | | |
1303 | 2.61k | if(/*((u4_poc1 - u4_poc0) == 0) ||*/ |
1304 | 2.61k | (!(ps_pic_buff1->u1_is_short && ps_pic_buff0->u1_is_short)) |
1305 | 2.34k | || ((i2_dist_scale_factor >> 2) < -64) |
1306 | 2.11k | || ((i2_dist_scale_factor >> 2) > 128)) |
1307 | 655 | { |
1308 | | /* same for forward and backward, wt=32 and Offset = 0 */ |
1309 | 655 | ui_temp0 = 0x00000020; |
1310 | 655 | ui_temp1 = 0x00000020; |
1311 | 655 | } |
1312 | 1.95k | else |
1313 | 1.95k | { |
1314 | 1.95k | ui_temp0 = 64 - (i2_dist_scale_factor >> 2); |
1315 | 1.95k | ui_temp1 = (i2_dist_scale_factor >> 2); |
1316 | 1.95k | } |
1317 | 2.61k | } |
1318 | 6.75k | else |
1319 | 6.75k | { |
1320 | 6.75k | ui_temp0 = 0x00000020; |
1321 | 6.75k | ui_temp1 = 0x00000020; |
1322 | 6.75k | } |
1323 | | /* Store in the weight matrix */ |
1324 | 9.36k | *pu4_wt_mat++ = ui_temp0; |
1325 | 9.36k | *pu4_wt_mat++ = ui_temp1; |
1326 | 9.36k | *pu4_wt_mat++ = ui_temp0; |
1327 | 9.36k | *pu4_wt_mat++ = ui_temp1; |
1328 | 9.36k | *pu4_wt_mat++ = ui_temp0; |
1329 | 9.36k | *pu4_wt_mat++ = ui_temp1; |
1330 | | |
1331 | 9.36k | } |
1332 | 3.32k | } |
1333 | 696 | i4_cur_poc = ps_dec->ps_cur_pic->i4_bottom_field_order_cnt; |
1334 | 696 | } |
1335 | 348 | } |
1336 | 32.2k | } |
1337 | | |
1338 | | /*! |
1339 | | ************************************************************************** |
1340 | | * \if Function name : ih264d_decode_bslice \endif |
1341 | | * |
1342 | | * \brief |
1343 | | * Decodes a B Slice |
1344 | | * |
1345 | | * |
1346 | | * \return |
1347 | | * 0 on Success and Error code otherwise |
1348 | | ************************************************************************** |
1349 | | */ |
1350 | | WORD32 ih264d_parse_bslice(dec_struct_t * ps_dec, UWORD16 u2_first_mb_in_slice) |
1351 | 5.47k | { |
1352 | 5.47k | dec_pic_params_t * ps_pps = ps_dec->ps_cur_pps; |
1353 | 5.47k | dec_slice_params_t * ps_slice = ps_dec->ps_cur_slice; |
1354 | 5.47k | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
1355 | 5.47k | UWORD8 u1_ref_idx_re_flag_lx; |
1356 | 5.47k | UWORD32 *pu4_bitstrm_buf = ps_bitstrm->pu4_buffer; |
1357 | 5.47k | UWORD32 *pu4_bitstrm_ofst = &ps_bitstrm->u4_ofst; |
1358 | | |
1359 | 5.47k | UWORD64 u8_ref_idx_l0, u8_ref_idx_l1; |
1360 | 5.47k | UWORD32 u4_temp, ui_temp1; |
1361 | 5.47k | WORD32 i_temp; |
1362 | 5.47k | WORD32 ret; |
1363 | | |
1364 | | /*--------------------------------------------------------------------*/ |
1365 | | /* Read remaining contents of the slice header */ |
1366 | | /*--------------------------------------------------------------------*/ |
1367 | 5.47k | { |
1368 | 5.47k | WORD8 *pi1_buf; |
1369 | 5.47k | WORD16 *pi2_mv = ps_dec->s_default_mv_pred.i2_mv; |
1370 | 5.47k | WORD32 *pi4_mv = (WORD32*)pi2_mv; |
1371 | 5.47k | WORD16 *pi16_refFrame; |
1372 | 5.47k | pi1_buf = ps_dec->s_default_mv_pred.i1_ref_frame; |
1373 | 5.47k | pi16_refFrame = (WORD16*)pi1_buf; |
1374 | 5.47k | *pi4_mv = 0; |
1375 | 5.47k | *(pi4_mv + 1) = 0; |
1376 | 5.47k | *pi16_refFrame = OUT_OF_RANGE_REF; |
1377 | 5.47k | ps_dec->s_default_mv_pred.u1_col_ref_pic_idx = (UWORD8)-1; |
1378 | 5.47k | ps_dec->s_default_mv_pred.u1_pic_type = (UWORD8)-1; |
1379 | 5.47k | } |
1380 | | |
1381 | 5.47k | ps_slice->u1_num_ref_idx_active_override_flag = ih264d_get_bit_h264( |
1382 | 5.47k | ps_bitstrm); |
1383 | 5.47k | COPYTHECONTEXT("SH: num_ref_idx_override_flag", |
1384 | 5.47k | ps_slice->u1_num_ref_idx_active_override_flag); |
1385 | | |
1386 | 5.47k | u8_ref_idx_l0 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[0]; |
1387 | 5.47k | u8_ref_idx_l1 = ps_dec->ps_cur_pps->u1_num_ref_idx_lx_active[1]; |
1388 | 5.47k | if(ps_slice->u1_num_ref_idx_active_override_flag) |
1389 | 2.98k | { |
1390 | 2.98k | u8_ref_idx_l0 = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
1391 | 2.98k | COPYTHECONTEXT("SH: num_ref_idx_l0_active_minus1", |
1392 | 2.98k | u8_ref_idx_l0 - 1); |
1393 | | |
1394 | 2.98k | u8_ref_idx_l1 = (UWORD64)1 + ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
1395 | 2.98k | COPYTHECONTEXT("SH: num_ref_idx_l1_active_minus1", |
1396 | 2.98k | u8_ref_idx_l1 - 1); |
1397 | 2.98k | } |
1398 | | |
1399 | 5.47k | { |
1400 | 5.47k | UWORD8 u1_max_ref_idx = H264_MAX_REF_PICS; |
1401 | 5.47k | if(ps_slice->u1_field_pic_flag) |
1402 | 2.59k | { |
1403 | 2.59k | u1_max_ref_idx = H264_MAX_REF_PICS << 1; |
1404 | 2.59k | } |
1405 | 5.47k | if((u8_ref_idx_l0 > u1_max_ref_idx) || (u8_ref_idx_l1 > u1_max_ref_idx)) |
1406 | 59 | { |
1407 | 59 | return ERROR_NUM_REF; |
1408 | 59 | } |
1409 | 5.41k | ps_slice->u1_num_ref_idx_lx_active[0] = u8_ref_idx_l0; |
1410 | 5.41k | ps_slice->u1_num_ref_idx_lx_active[1] = u8_ref_idx_l1; |
1411 | 5.41k | } |
1412 | | |
1413 | | |
1414 | 0 | ih264d_init_ref_idx_lx_b(ps_dec); |
1415 | | /* Store the value for future slices in the same picture */ |
1416 | 5.41k | ps_dec->u1_num_ref_idx_lx_active_prev = |
1417 | 5.41k | ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]; |
1418 | | |
1419 | 5.41k | u1_ref_idx_re_flag_lx = ih264d_get_bit_h264(ps_bitstrm); |
1420 | 5.41k | COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l0",u1_ref_idx_re_flag_lx); |
1421 | | |
1422 | | /* Modified temporarily */ |
1423 | 5.41k | if(u1_ref_idx_re_flag_lx) |
1424 | 730 | { |
1425 | 730 | WORD8 ret; |
1426 | 730 | ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_mod_dpb[0]; |
1427 | 730 | ret = ih264d_ref_idx_reordering(ps_dec, 0); |
1428 | 730 | if(ret == -1) |
1429 | 0 | return ERROR_REFIDX_ORDER_T; |
1430 | 730 | } |
1431 | 4.68k | else |
1432 | 4.68k | ps_dec->ps_ref_pic_buf_lx[0] = ps_dec->ps_dpb_mgr->ps_init_dpb[0]; |
1433 | | |
1434 | 5.41k | u1_ref_idx_re_flag_lx = ih264d_get_bit_h264(ps_bitstrm); |
1435 | 5.41k | COPYTHECONTEXT("SH: ref_pic_list_reordering_flag_l1",u1_ref_idx_re_flag_lx); |
1436 | | |
1437 | | /* Modified temporarily */ |
1438 | 5.41k | if(u1_ref_idx_re_flag_lx) |
1439 | 1.00k | { |
1440 | 1.00k | WORD8 ret; |
1441 | 1.00k | ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_mod_dpb[1]; |
1442 | 1.00k | ret = ih264d_ref_idx_reordering(ps_dec, 1); |
1443 | 1.00k | if(ret == -1) |
1444 | 0 | return ERROR_REFIDX_ORDER_T; |
1445 | 1.00k | } |
1446 | 4.41k | else |
1447 | 4.41k | ps_dec->ps_ref_pic_buf_lx[1] = ps_dec->ps_dpb_mgr->ps_init_dpb[1]; |
1448 | | |
1449 | | /* Create refIdx to POC mapping */ |
1450 | 5.41k | { |
1451 | 5.41k | void **ppv_map_ref_idx_to_poc_lx; |
1452 | 5.41k | WORD8 idx; |
1453 | 5.41k | struct pic_buffer_t *ps_pic; |
1454 | | |
1455 | 5.41k | ppv_map_ref_idx_to_poc_lx = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L0; |
1456 | 5.41k | ppv_map_ref_idx_to_poc_lx[0] = 0; |
1457 | 5.41k | ppv_map_ref_idx_to_poc_lx++; |
1458 | 18.2k | for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]; |
1459 | 12.8k | idx++) |
1460 | 12.8k | { |
1461 | 12.8k | ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx]; |
1462 | 12.8k | ppv_map_ref_idx_to_poc_lx[idx] = (ps_pic->pu1_buf1); |
1463 | 12.8k | } |
1464 | | |
1465 | 5.41k | ppv_map_ref_idx_to_poc_lx = ps_dec->ppv_map_ref_idx_to_poc + FRM_LIST_L1; |
1466 | | |
1467 | 5.41k | ppv_map_ref_idx_to_poc_lx[0] = 0; |
1468 | 5.41k | ppv_map_ref_idx_to_poc_lx++; |
1469 | 15.1k | for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]; |
1470 | 9.74k | idx++) |
1471 | 9.74k | { |
1472 | 9.74k | ps_pic = ps_dec->ps_ref_pic_buf_lx[1][idx]; |
1473 | 9.74k | ppv_map_ref_idx_to_poc_lx[idx] = (ps_pic->pu1_buf1); |
1474 | 9.74k | } |
1475 | | |
1476 | 5.41k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
1477 | 711 | { |
1478 | 711 | void **ppv_map_ref_idx_to_poc_lx_t, **ppv_map_ref_idx_to_poc_lx_b; |
1479 | | |
1480 | 711 | ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc |
1481 | 711 | + TOP_LIST_FLD_L0; |
1482 | 711 | ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc |
1483 | 711 | + BOT_LIST_FLD_L0; |
1484 | | |
1485 | 711 | ppv_map_ref_idx_to_poc_lx_t[0] = 0; |
1486 | 711 | ppv_map_ref_idx_to_poc_lx_t++; |
1487 | 711 | ppv_map_ref_idx_to_poc_lx_b[0] = 0; |
1488 | 711 | ppv_map_ref_idx_to_poc_lx_b++; |
1489 | 2.73k | for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[0]; |
1490 | 2.02k | idx++) |
1491 | 2.02k | { |
1492 | 2.02k | ps_pic = ps_dec->ps_ref_pic_buf_lx[0][idx]; |
1493 | 2.02k | ppv_map_ref_idx_to_poc_lx_t[0] = (ps_pic->pu1_buf1); |
1494 | 2.02k | ppv_map_ref_idx_to_poc_lx_b[1] = (ps_pic->pu1_buf1); |
1495 | | |
1496 | 2.02k | ppv_map_ref_idx_to_poc_lx_b[0] = (ps_pic->pu1_buf1) + 1; |
1497 | 2.02k | ppv_map_ref_idx_to_poc_lx_t[1] = (ps_pic->pu1_buf1) + 1; |
1498 | | |
1499 | 2.02k | ppv_map_ref_idx_to_poc_lx_t += 2; |
1500 | 2.02k | ppv_map_ref_idx_to_poc_lx_b += 2; |
1501 | 2.02k | } |
1502 | | |
1503 | 711 | ppv_map_ref_idx_to_poc_lx_t = ps_dec->ppv_map_ref_idx_to_poc |
1504 | 711 | + TOP_LIST_FLD_L1; |
1505 | 711 | ppv_map_ref_idx_to_poc_lx_b = ps_dec->ppv_map_ref_idx_to_poc |
1506 | 711 | + BOT_LIST_FLD_L1; |
1507 | | |
1508 | 711 | ppv_map_ref_idx_to_poc_lx_t[0] = 0; |
1509 | 711 | ppv_map_ref_idx_to_poc_lx_t++; |
1510 | 711 | ppv_map_ref_idx_to_poc_lx_b[0] = 0; |
1511 | 711 | ppv_map_ref_idx_to_poc_lx_b++; |
1512 | 1.81k | for(idx = 0; idx < ps_dec->ps_cur_slice->u1_num_ref_idx_lx_active[1]; |
1513 | 1.10k | idx++) |
1514 | 1.10k | { |
1515 | 1.10k | UWORD8 u1_tmp_idx = idx << 1; |
1516 | 1.10k | ps_pic = ps_dec->ps_ref_pic_buf_lx[1][idx]; |
1517 | 1.10k | ppv_map_ref_idx_to_poc_lx_t[u1_tmp_idx] = (ps_pic->pu1_buf1); |
1518 | 1.10k | ppv_map_ref_idx_to_poc_lx_b[u1_tmp_idx + 1] = (ps_pic->pu1_buf1); |
1519 | | |
1520 | 1.10k | ppv_map_ref_idx_to_poc_lx_b[u1_tmp_idx] = (ps_pic->pu1_buf1) + 1; |
1521 | 1.10k | ppv_map_ref_idx_to_poc_lx_t[u1_tmp_idx + 1] = (ps_pic->pu1_buf1) + 1; |
1522 | | |
1523 | 1.10k | } |
1524 | 711 | } |
1525 | | |
1526 | 5.41k | if(ps_dec->u4_num_cores >= 3) |
1527 | 2.18k | { |
1528 | 2.18k | WORD32 num_entries; |
1529 | 2.18k | WORD32 size; |
1530 | 2.18k | num_entries = MAX_FRAMES; |
1531 | 2.18k | if((1 >= ps_dec->ps_cur_sps->u1_num_ref_frames) && |
1532 | 264 | (0 == ps_dec->i4_display_delay)) |
1533 | 0 | { |
1534 | 0 | num_entries = 1; |
1535 | 0 | } |
1536 | | |
1537 | 2.18k | num_entries = ((2 * num_entries) + 1); |
1538 | 2.18k | num_entries *= 2; |
1539 | | |
1540 | 2.18k | size = num_entries * sizeof(void *); |
1541 | 2.18k | size += PAD_MAP_IDX_POC * sizeof(void *); |
1542 | | |
1543 | 2.18k | memcpy((void *)ps_dec->ps_parse_cur_slice->ppv_map_ref_idx_to_poc, |
1544 | 2.18k | ps_dec->ppv_map_ref_idx_to_poc, |
1545 | 2.18k | size); |
1546 | 2.18k | } |
1547 | | |
1548 | 5.41k | } |
1549 | | |
1550 | 5.41k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag |
1551 | 711 | && (ps_dec->ps_cur_slice->u1_field_pic_flag == 0)) |
1552 | 711 | { |
1553 | 711 | ih264d_convert_frm_mbaff_list(ps_dec); |
1554 | 711 | } |
1555 | | |
1556 | 5.41k | if(ps_pps->u1_wted_bipred_idc == 1) |
1557 | 281 | { |
1558 | 281 | ret = ih264d_parse_pred_weight_table(ps_slice, ps_bitstrm); |
1559 | 281 | if(ret != OK) |
1560 | 149 | return ret; |
1561 | 132 | ih264d_form_pred_weight_matrix(ps_dec); |
1562 | 132 | ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; |
1563 | 132 | } |
1564 | 5.13k | else if(ps_pps->u1_wted_bipred_idc == 2) |
1565 | 3.87k | { |
1566 | | /* Implicit Weighted prediction */ |
1567 | 3.87k | ps_slice->u2_log2Y_crwd = 0x0505; |
1568 | 3.87k | ps_dec->pu4_wt_ofsts = ps_dec->pu4_wts_ofsts_mat; |
1569 | 3.87k | ih264d_get_implicit_weights(ps_dec); |
1570 | 3.87k | } |
1571 | 1.26k | else |
1572 | 1.26k | ps_dec->ps_cur_slice->u2_log2Y_crwd = 0; |
1573 | | |
1574 | 5.26k | ps_dec->ps_parse_cur_slice->u2_log2Y_crwd = |
1575 | 5.26k | ps_dec->ps_cur_slice->u2_log2Y_crwd; |
1576 | | |
1577 | | /* G050 */ |
1578 | 5.26k | if(ps_slice->u1_nal_ref_idc != 0) |
1579 | 2.14k | { |
1580 | 2.14k | if(!ps_dec->ps_dpb_cmds->u1_dpb_commands_read) |
1581 | 1.81k | { |
1582 | 1.81k | i_temp = ih264d_read_mmco_commands(ps_dec); |
1583 | 1.81k | if (i_temp < 0) |
1584 | 2 | { |
1585 | 2 | return ERROR_DBP_MANAGER_T; |
1586 | 2 | } |
1587 | 1.81k | ps_dec->u4_bitoffset = i_temp; |
1588 | 1.81k | } |
1589 | 335 | else |
1590 | 335 | ps_bitstrm->u4_ofst += ps_dec->u4_bitoffset; |
1591 | 2.14k | } |
1592 | | /* G050 */ |
1593 | | |
1594 | 5.26k | if(ps_pps->u1_entropy_coding_mode == CABAC) |
1595 | 3.67k | { |
1596 | 3.67k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
1597 | 3.67k | if(u4_temp > MAX_CABAC_INIT_IDC) |
1598 | 279 | { |
1599 | 279 | return ERROR_INV_SLICE_HDR_T; |
1600 | 279 | } |
1601 | 3.39k | ps_slice->u1_cabac_init_idc = u4_temp; |
1602 | 3.39k | COPYTHECONTEXT("SH: cabac_init_idc",ps_slice->u1_cabac_init_idc); |
1603 | 3.39k | } |
1604 | | |
1605 | 4.98k | { |
1606 | 4.98k | WORD64 i8_temp; |
1607 | | /* Read slice_qp_delta */ |
1608 | 4.98k | i8_temp = (WORD64)ps_pps->u1_pic_init_qp |
1609 | 4.98k | + ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
1610 | 4.98k | if((i8_temp < MIN_H264_QP) || (i8_temp > MAX_H264_QP)) |
1611 | 239 | { |
1612 | 239 | return ERROR_INV_RANGE_QP_T; |
1613 | 239 | } |
1614 | 4.74k | ps_slice->u1_slice_qp = i8_temp; |
1615 | 4.74k | COPYTHECONTEXT("SH: slice_qp_delta", |
1616 | 4.74k | (WORD8)(ps_slice->u1_slice_qp - ps_pps->u1_pic_init_qp)); |
1617 | 4.74k | } |
1618 | | |
1619 | 4.74k | if(ps_pps->u1_deblocking_filter_parameters_present_flag == 1) |
1620 | 2.74k | { |
1621 | 2.74k | u4_temp = ih264d_uev(pu4_bitstrm_ofst, pu4_bitstrm_buf); |
1622 | 2.74k | if(u4_temp > SLICE_BOUNDARY_DBLK_DISABLED) |
1623 | 61 | { |
1624 | 61 | return ERROR_INV_SLICE_HDR_T; |
1625 | 2.68k | } COPYTHECONTEXT("SH: disable_deblocking_filter_idc", u4_temp); |
1626 | 2.68k | ps_slice->u1_disable_dblk_filter_idc = u4_temp; |
1627 | 2.68k | if(u4_temp != 1) |
1628 | 2.55k | { |
1629 | 2.55k | i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) |
1630 | 2.55k | << 1; |
1631 | 2.55k | if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) |
1632 | 19 | { |
1633 | 19 | return ERROR_INV_SLICE_HDR_T; |
1634 | 19 | } |
1635 | 2.53k | ps_slice->i1_slice_alpha_c0_offset = i_temp; |
1636 | 2.53k | COPYTHECONTEXT("SH: slice_alpha_c0_offset_div2", |
1637 | 2.53k | ps_slice->i1_slice_alpha_c0_offset >> 1); |
1638 | | |
1639 | 2.53k | i_temp = ih264d_sev(pu4_bitstrm_ofst, pu4_bitstrm_buf) |
1640 | 2.53k | << 1; |
1641 | 2.53k | if((MIN_DBLK_FIL_OFF > i_temp) || (i_temp > MAX_DBLK_FIL_OFF)) |
1642 | 17 | { |
1643 | 17 | return ERROR_INV_SLICE_HDR_T; |
1644 | 17 | } |
1645 | 2.52k | ps_slice->i1_slice_beta_offset = i_temp; |
1646 | 2.52k | COPYTHECONTEXT("SH: slice_beta_offset_div2", |
1647 | 2.52k | ps_slice->i1_slice_beta_offset >> 1); |
1648 | | |
1649 | 2.52k | } |
1650 | 123 | else |
1651 | 123 | { |
1652 | 123 | ps_slice->i1_slice_alpha_c0_offset = 0; |
1653 | 123 | ps_slice->i1_slice_beta_offset = 0; |
1654 | 123 | } |
1655 | 2.68k | } |
1656 | 2.00k | else |
1657 | 2.00k | { |
1658 | 2.00k | ps_slice->u1_disable_dblk_filter_idc = 0; |
1659 | 2.00k | ps_slice->i1_slice_alpha_c0_offset = 0; |
1660 | 2.00k | ps_slice->i1_slice_beta_offset = 0; |
1661 | 2.00k | } |
1662 | | |
1663 | 4.65k | ps_dec->u1_slice_header_done = 2; |
1664 | | |
1665 | 4.65k | if(ps_pps->u1_entropy_coding_mode) |
1666 | 3.34k | { |
1667 | 3.34k | SWITCHOFFTRACE; SWITCHONTRACECABAC; |
1668 | 3.34k | ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cabac; |
1669 | 3.34k | ps_dec->pf_parse_inter_mb = ih264d_parse_bmb_cabac; |
1670 | 3.34k | ih264d_init_cabac_contexts(B_SLICE, ps_dec); |
1671 | | |
1672 | 3.34k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
1673 | 312 | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_mbaff; |
1674 | 3.02k | else |
1675 | 3.02k | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cabac_nonmbaff; |
1676 | 3.34k | } |
1677 | 1.31k | else |
1678 | 1.31k | { |
1679 | 1.31k | SWITCHONTRACE; SWITCHOFFTRACECABAC; |
1680 | 1.31k | ps_dec->pf_parse_inter_slice = ih264d_parse_inter_slice_data_cavlc; |
1681 | 1.31k | ps_dec->pf_parse_inter_mb = ih264d_parse_bmb_cavlc; |
1682 | 1.31k | if(ps_dec->ps_cur_slice->u1_mbaff_frame_flag) |
1683 | 204 | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_mbaff; |
1684 | 1.10k | else |
1685 | 1.10k | ps_dec->pf_get_mb_info = ih264d_get_mb_info_cavlc_nonmbaff; |
1686 | 1.31k | } |
1687 | | |
1688 | 4.65k | ret = ih264d_cal_col_pic(ps_dec); |
1689 | 4.65k | if(ret != OK) |
1690 | 6 | return ret; |
1691 | 4.64k | ps_dec->u1_B = 1; |
1692 | 4.64k | ps_dec->pf_mvpred_ref_tfr_nby2mb = ih264d_mv_pred_ref_tfr_nby2_bmb; |
1693 | 4.64k | ret = ps_dec->pf_parse_inter_slice(ps_dec, ps_slice, u2_first_mb_in_slice); |
1694 | 4.64k | if(ret != OK) |
1695 | 1.17k | return ret; |
1696 | 3.46k | return OK; |
1697 | 4.64k | } |