/src/libavc/decoder/ih264d_parse_mb_header.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_mb_header.c |
23 | | * |
24 | | * \brief |
25 | | * This file contains context identifier encoding routines. |
26 | | * |
27 | | * \date |
28 | | * 04/02/2003 |
29 | | * |
30 | | * \author NS |
31 | | *************************************************************************** |
32 | | */ |
33 | | #include <string.h> |
34 | | #include "ih264d_structs.h" |
35 | | #include "ih264d_bitstrm.h" |
36 | | #include "ih264d_cabac.h" |
37 | | #include "ih264_typedefs.h" |
38 | | #include "ih264_macros.h" |
39 | | #include "ih264_platform_macros.h" |
40 | | #include "ih264d_defs.h" |
41 | | #include "ih264d_error_handler.h" |
42 | | #include "ih264d_tables.h" |
43 | | #include "ih264d_debug.h" |
44 | | #include "ih264d_defs.h" |
45 | | #include "ih264d_defs.h" |
46 | | #include "ih264d_mb_utils.h" |
47 | | #include "ih264d_parse_mb_header.h" |
48 | | #include "ih264d_defs.h" |
49 | | |
50 | | /*! < CtxtInc index 0 - CtxMbTypeI, CtxMbTypeSISuffix |
51 | | index 1 - CtxMbTypePSuffix, CtxMbTypeBSuffix |
52 | | */ |
53 | | |
54 | | |
55 | | |
56 | | /*! |
57 | | ************************************************************************** |
58 | | * \if Function name : ih264d_parse_mb_type_intra_cabac \endif |
59 | | * |
60 | | * \brief |
61 | | * This function decodes MB type using CABAC entropy coding mode. |
62 | | * |
63 | | * \return |
64 | | * MBType. |
65 | | * |
66 | | ************************************************************************** |
67 | | */ |
68 | | UWORD8 ih264d_parse_mb_type_intra_cabac(UWORD8 u1_inter, |
69 | | struct _DecStruct * ps_dec) |
70 | 1.18M | { |
71 | 1.18M | decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
72 | 1.18M | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
73 | 1.18M | ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
74 | 1.18M | ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
75 | 1.18M | bin_ctxt_model_t *ps_mb_bin_ctxt = ps_dec->p_mb_type_t; |
76 | 1.18M | WORD8 u1_mb_type, u1_bin; |
77 | 1.18M | UWORD32 u4_cxt_inc; |
78 | | |
79 | 1.18M | u4_cxt_inc = 0; |
80 | 1.18M | if(!u1_inter) |
81 | 1.13M | { |
82 | 1.13M | if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info) |
83 | 1.07M | u4_cxt_inc += ((ps_left_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0); |
84 | 1.13M | if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info) |
85 | 969k | u4_cxt_inc += ((ps_top_ctxt->u1_mb_type != CAB_I4x4) ? 1 : 0); |
86 | 1.13M | } |
87 | 55.2k | else |
88 | 55.2k | { |
89 | 55.2k | ps_mb_bin_ctxt = ps_mb_bin_ctxt + 3 + (ps_dec->u1_B << 1); |
90 | 55.2k | } |
91 | | |
92 | | /* b0 */ |
93 | 1.18M | u1_mb_type = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm, |
94 | 1.18M | ps_cab_env); |
95 | 1.18M | if(u1_mb_type) |
96 | 805k | { |
97 | | /* I16x16 or I_PCM mode */ |
98 | | /* b1 */ |
99 | 805k | u1_bin = ih264d_decode_terminate(ps_cab_env, ps_bitstrm); |
100 | 805k | if(u1_bin == 0) |
101 | 803k | { |
102 | | /* I16x16 mode */ |
103 | | /* Read b2 and b3 */ |
104 | 803k | u4_cxt_inc = (u1_inter) ? 0x021 : 0x043; |
105 | | |
106 | 803k | u1_bin = ih264d_decode_bins(2, u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm, |
107 | 803k | ps_cab_env); |
108 | | |
109 | 803k | if(u1_bin & 0x01) |
110 | 26.4k | u1_mb_type += 4; |
111 | | |
112 | 803k | if(u1_bin & 0x02) |
113 | 15.8k | u1_mb_type += 12; |
114 | | |
115 | 803k | if(u1_bin & 0x01) |
116 | 26.4k | { |
117 | | /* since b3=1, Read three bins */ |
118 | 26.4k | u4_cxt_inc = (u1_inter) ? 0x0332 : 0x0765; |
119 | 26.4k | u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc, ps_mb_bin_ctxt, |
120 | 26.4k | ps_bitstrm, ps_cab_env); |
121 | | |
122 | 26.4k | } |
123 | 777k | else |
124 | 777k | { |
125 | | /* Read two bins */ |
126 | 777k | u4_cxt_inc = (u1_inter) ? 0x033 : 0x076; |
127 | 777k | u1_bin = (UWORD8)ih264d_decode_bins(2, u4_cxt_inc, ps_mb_bin_ctxt, |
128 | 777k | ps_bitstrm, ps_cab_env); |
129 | 777k | } |
130 | 803k | u1_mb_type += u1_bin; |
131 | 803k | } |
132 | 2.03k | else |
133 | 2.03k | { |
134 | | /* I_PCM mode */ |
135 | | /* b1=1 */ |
136 | 2.03k | u1_mb_type = 25; |
137 | 2.03k | } |
138 | 805k | } |
139 | 1.18M | return (u1_mb_type); |
140 | 1.18M | } |
141 | | |
142 | | /*! |
143 | | ************************************************************************** |
144 | | * \if Function name : ih264d_parse_mb_type_cabac \endif |
145 | | * |
146 | | * \brief |
147 | | * This function decodes MB type using CABAC entropy coding mode. |
148 | | * |
149 | | * \return |
150 | | * MBType. |
151 | | * |
152 | | ************************************************************************** |
153 | | */ |
154 | | UWORD32 ih264d_parse_mb_type_cabac(struct _DecStruct * ps_dec) |
155 | 480k | { |
156 | 480k | const UWORD8 uc_slice_type = ps_dec->ps_cur_slice->u1_slice_type; |
157 | 480k | decoding_envirnoment_t *ps_cab_env = &ps_dec->s_cab_dec_env; |
158 | 480k | dec_bit_stream_t *ps_bitstrm = ps_dec->ps_bitstrm; |
159 | 480k | ctxt_inc_mb_info_t *ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
160 | 480k | ctxt_inc_mb_info_t *ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
161 | 480k | WORD8 c_ctxt_inc; |
162 | 480k | bin_ctxt_model_t *ps_mb_bin_ctxt = ps_dec->p_mb_type_t; |
163 | 480k | WORD8 u1_mb_type = 0, u1_bin; |
164 | 480k | UWORD32 u4_cxt_inc; |
165 | | |
166 | 480k | INC_SYM_COUNT(ps_cab_env); |
167 | | |
168 | 480k | c_ctxt_inc = 0; |
169 | | |
170 | 480k | if(uc_slice_type == SI_SLICE) |
171 | 0 | { |
172 | | /* b0 */ |
173 | 0 | if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info) |
174 | 0 | c_ctxt_inc += ((ps_left_ctxt->u1_mb_type != CAB_SI4x4) ? 1 : 0); |
175 | 0 | if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info) |
176 | 0 | c_ctxt_inc += ((ps_top_ctxt->u1_mb_type != CAB_SI4x4) ? 1 : 0); |
177 | |
|
178 | 0 | u4_cxt_inc = c_ctxt_inc; |
179 | 0 | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm, |
180 | 0 | ps_cab_env); |
181 | 0 | if(u1_bin == 0) |
182 | 0 | { |
183 | | /* SI MB */ |
184 | 0 | u1_mb_type = 0; |
185 | 0 | } |
186 | 0 | else |
187 | 0 | { |
188 | 0 | u1_mb_type = 1 + ih264d_parse_mb_type_intra_cabac(0, ps_dec); |
189 | 0 | } |
190 | 0 | } |
191 | 480k | else if(uc_slice_type == P_SLICE) |
192 | 279k | { |
193 | | /* P Slice */ |
194 | | /* b0 */ |
195 | 279k | u4_cxt_inc = 0; |
196 | 279k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm, |
197 | 279k | ps_cab_env); |
198 | 279k | if(!u1_bin) |
199 | 227k | { |
200 | | /* Inter MB types */ |
201 | | /* b1 */ |
202 | 227k | u4_cxt_inc = 0x01; |
203 | 227k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
204 | 227k | ps_bitstrm, ps_cab_env); |
205 | | /* b2 */ |
206 | 227k | u4_cxt_inc = u1_bin + 2; |
207 | 227k | u1_mb_type = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
208 | 227k | ps_bitstrm, ps_cab_env); |
209 | 227k | u1_mb_type = (u1_bin << 1) + u1_mb_type; |
210 | 227k | if(u1_mb_type) |
211 | 153k | u1_mb_type = 4 - u1_mb_type; |
212 | 227k | } |
213 | 51.9k | else |
214 | 51.9k | { |
215 | | /* Intra Prefix 1 found */ |
216 | | /* Intra MB type */ |
217 | 51.9k | u1_mb_type = 5 + ih264d_parse_mb_type_intra_cabac(1, ps_dec); |
218 | 51.9k | } |
219 | 279k | } |
220 | 200k | else if(uc_slice_type == B_SLICE) |
221 | 200k | { |
222 | 200k | WORD8 a, b; |
223 | | /* B Slice */ |
224 | | /* b0 */ |
225 | | /* a = b = 0, if B slice and MB is a SKIP or B_DIRECT16x16 */ |
226 | 200k | a = 0; |
227 | 200k | b = 0; |
228 | 200k | u1_mb_type = 0; |
229 | 200k | if(ps_left_ctxt != ps_dec->ps_def_ctxt_mb_info) |
230 | 179k | a = ((ps_left_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16); |
231 | 200k | if(ps_top_ctxt != ps_dec->ps_def_ctxt_mb_info) |
232 | 143k | b = ((ps_top_ctxt->u1_mb_type & CAB_BD16x16_MASK) != CAB_BD16x16); |
233 | | |
234 | 200k | u4_cxt_inc = a + b; |
235 | | |
236 | 200k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, ps_bitstrm, |
237 | 200k | ps_cab_env); |
238 | | |
239 | 200k | if(u1_bin) |
240 | 193k | { |
241 | | |
242 | | /* b1 */ |
243 | 193k | u4_cxt_inc = 0x03; |
244 | 193k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
245 | 193k | ps_bitstrm, ps_cab_env); |
246 | | |
247 | 193k | if(!u1_bin) |
248 | 57.5k | { |
249 | | /* b2 */ |
250 | 57.5k | u4_cxt_inc = 0x05; |
251 | 57.5k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
252 | 57.5k | ps_bitstrm, ps_cab_env); |
253 | | |
254 | 57.5k | u1_mb_type = u1_bin + 1; |
255 | 57.5k | } |
256 | 135k | else |
257 | 135k | { |
258 | 135k | u1_mb_type = 3; |
259 | | /* b2 */ |
260 | 135k | u4_cxt_inc = 0x04; |
261 | 135k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
262 | 135k | ps_bitstrm, ps_cab_env); |
263 | | |
264 | 135k | if(u1_bin) |
265 | 106k | { |
266 | 106k | u1_mb_type += 8; |
267 | | /* b3 */ |
268 | 106k | u4_cxt_inc = 0x05; |
269 | 106k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, ps_mb_bin_ctxt, |
270 | 106k | ps_bitstrm, ps_cab_env); |
271 | | |
272 | 106k | if(!u1_bin) |
273 | 40.5k | { |
274 | 40.5k | u1_mb_type++; |
275 | | /* b4, b5, b6 */ |
276 | 40.5k | u4_cxt_inc = 0x0555; |
277 | 40.5k | u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc, |
278 | 40.5k | ps_mb_bin_ctxt, |
279 | 40.5k | ps_bitstrm, |
280 | 40.5k | ps_cab_env); |
281 | | |
282 | | |
283 | | |
284 | 40.5k | u1_mb_type += u1_bin; |
285 | 40.5k | } |
286 | 65.8k | else |
287 | 65.8k | { |
288 | | /* b4 */ |
289 | 65.8k | u4_cxt_inc = 0x05; |
290 | 65.8k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, |
291 | 65.8k | ps_mb_bin_ctxt, |
292 | 65.8k | ps_bitstrm, |
293 | 65.8k | ps_cab_env); |
294 | | |
295 | 65.8k | if(u1_bin) |
296 | 56.9k | { |
297 | | /* b5 */ |
298 | 56.9k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, |
299 | 56.9k | ps_mb_bin_ctxt, |
300 | 56.9k | ps_bitstrm, |
301 | 56.9k | ps_cab_env); |
302 | | |
303 | 56.9k | u1_mb_type += (u1_bin ? 11 : 0); |
304 | 56.9k | } |
305 | 8.89k | else |
306 | 8.89k | { |
307 | 8.89k | u1_mb_type = 20; |
308 | | /* b5 */ |
309 | 8.89k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, |
310 | 8.89k | ps_mb_bin_ctxt, |
311 | 8.89k | ps_bitstrm, |
312 | 8.89k | ps_cab_env); |
313 | | |
314 | 8.89k | if(!u1_bin) |
315 | 5.56k | { |
316 | | /* b6 */ |
317 | 5.56k | u1_bin = (UWORD8)ih264d_decode_bin(u4_cxt_inc, |
318 | 5.56k | ps_mb_bin_ctxt, |
319 | 5.56k | ps_bitstrm, |
320 | 5.56k | ps_cab_env); |
321 | | |
322 | 5.56k | u1_mb_type += u1_bin; |
323 | 5.56k | } |
324 | 3.33k | else |
325 | 3.33k | { |
326 | | /* Intra Prefix 111101 found */ |
327 | | /* Intra MB type */ |
328 | 3.33k | u1_mb_type = |
329 | 3.33k | 23 |
330 | 3.33k | + ih264d_parse_mb_type_intra_cabac( |
331 | 3.33k | 1, |
332 | 3.33k | ps_dec); |
333 | 3.33k | } |
334 | 8.89k | } |
335 | 65.8k | } |
336 | 106k | } |
337 | 29.0k | else |
338 | 29.0k | { |
339 | | /* b3, b4, b5 */ |
340 | 29.0k | u4_cxt_inc = 0x0555; |
341 | 29.0k | u1_bin = (UWORD8)ih264d_decode_bins(3, u4_cxt_inc, |
342 | 29.0k | ps_mb_bin_ctxt, ps_bitstrm, |
343 | 29.0k | ps_cab_env); |
344 | | |
345 | | |
346 | | |
347 | | |
348 | 29.0k | u1_mb_type += u1_bin; |
349 | 29.0k | } |
350 | 135k | } |
351 | 193k | } |
352 | 200k | } |
353 | 480k | return ((UWORD32)u1_mb_type); |
354 | 480k | } |
355 | | |
356 | | /*! |
357 | | ************************************************************************** |
358 | | * \if Function name : DecSubMBType \endif |
359 | | * |
360 | | * \brief |
361 | | * This function decodes MB type using CABAC entropy coding mode. |
362 | | * |
363 | | * \return |
364 | | * MBType. |
365 | | * |
366 | | ************************************************************************** |
367 | | */ |
368 | | UWORD32 ih264d_parse_submb_type_cabac(const UWORD8 u1_slc_type_b, |
369 | | decoding_envirnoment_t * ps_cab_env, |
370 | | dec_bit_stream_t * ps_bitstrm, |
371 | | bin_ctxt_model_t * ps_sub_mb_cxt) |
372 | 366k | { |
373 | 366k | WORD8 u1_sub_mb_type, u1_bin; |
374 | | |
375 | 366k | INC_SYM_COUNT(ps_cab_env); |
376 | | |
377 | 366k | u1_sub_mb_type = 0; |
378 | 366k | u1_bin = (UWORD8)ih264d_decode_bin(0, ps_sub_mb_cxt, ps_bitstrm, |
379 | 366k | ps_cab_env); |
380 | | |
381 | 366k | if(u1_slc_type_b ^ u1_bin) |
382 | 82.1k | return 0; |
383 | | |
384 | 283k | if(!u1_slc_type_b) |
385 | 97.9k | { |
386 | | /* P Slice */ |
387 | 97.9k | u1_sub_mb_type = 1; |
388 | 97.9k | u1_bin = (UWORD8)ih264d_decode_bin(1, ps_sub_mb_cxt, ps_bitstrm, |
389 | 97.9k | ps_cab_env); |
390 | 97.9k | if(u1_bin == 1) |
391 | 69.5k | { |
392 | 69.5k | u1_bin = (UWORD8)ih264d_decode_bin(2, ps_sub_mb_cxt, ps_bitstrm, |
393 | 69.5k | ps_cab_env); |
394 | 69.5k | u1_sub_mb_type = (2 + (!u1_bin)); |
395 | 69.5k | } |
396 | | |
397 | 97.9k | return u1_sub_mb_type; |
398 | 97.9k | } |
399 | 185k | else |
400 | 185k | { |
401 | | /* B Slice */ |
402 | | |
403 | | /* b1 */ |
404 | 185k | u1_bin = (UWORD8)ih264d_decode_bin(1, ps_sub_mb_cxt, ps_bitstrm, |
405 | 185k | ps_cab_env); |
406 | 185k | if(u1_bin) |
407 | 150k | { |
408 | | /* b2 */ |
409 | 150k | u1_bin = (UWORD8)ih264d_decode_bin(2, ps_sub_mb_cxt, ps_bitstrm, |
410 | 150k | ps_cab_env); |
411 | 150k | if(u1_bin) |
412 | 15.6k | { |
413 | | /* b3 */ |
414 | 15.6k | u1_sub_mb_type = 7; |
415 | 15.6k | u1_bin = (UWORD8)ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm, |
416 | 15.6k | ps_cab_env); |
417 | 15.6k | u1_sub_mb_type += u1_bin << 2; |
418 | 15.6k | u1_bin = !u1_bin; |
419 | | /* b4 */ |
420 | 15.6k | if(u1_bin == 0) |
421 | 12.3k | { |
422 | 12.3k | u1_bin = ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm, |
423 | 12.3k | ps_cab_env); |
424 | 12.3k | } |
425 | 3.32k | else |
426 | 3.32k | { |
427 | 3.32k | u1_bin = (UWORD8)ih264d_decode_bins(2, 0x33, ps_sub_mb_cxt, |
428 | 3.32k | ps_bitstrm, ps_cab_env); |
429 | 3.32k | } |
430 | | |
431 | 15.6k | return (u1_sub_mb_type + u1_bin); |
432 | 15.6k | } |
433 | 134k | else |
434 | 134k | { |
435 | | /* b3 */ |
436 | 134k | u1_bin = (UWORD8)ih264d_decode_bins(2, 0x33, ps_sub_mb_cxt, |
437 | 134k | ps_bitstrm, ps_cab_env); |
438 | 134k | return (3 + u1_bin); |
439 | 134k | } |
440 | 150k | } |
441 | 35.8k | else |
442 | 35.8k | { |
443 | | /* b2 */ |
444 | 35.8k | u1_bin = (UWORD8)ih264d_decode_bin(3, ps_sub_mb_cxt, ps_bitstrm, |
445 | 35.8k | ps_cab_env); |
446 | 35.8k | return (1 + u1_bin); |
447 | 35.8k | } |
448 | 185k | } |
449 | 283k | } |
450 | | |
451 | | /*! |
452 | | ************************************************************************** |
453 | | * \if Function name : ih264d_parse_ref_idx_cabac \endif |
454 | | * |
455 | | * \brief |
456 | | * This function decodes Reference Index using CABAC entropy coding mode. |
457 | | * |
458 | | * \return |
459 | | * None |
460 | | * |
461 | | ************************************************************************** |
462 | | */ |
463 | | WORD32 ih264d_parse_ref_idx_cabac(const UWORD8 u1_num_part, |
464 | | const UWORD8 u1_b2, |
465 | | const UWORD8 u1_max_ref_minus1, |
466 | | const UWORD8 u1_mb_mode, |
467 | | WORD8 * pi1_ref_idx, |
468 | | WORD8 * const pi1_lft_cxt, |
469 | | WORD8 * const pi1_top_cxt, |
470 | | decoding_envirnoment_t * const ps_cab_env, |
471 | | dec_bit_stream_t * const ps_bitstrm, |
472 | | bin_ctxt_model_t * const ps_ref_cxt) |
473 | 525k | { |
474 | 525k | UWORD8 u1_a, u1_b; |
475 | 525k | UWORD32 u4_cxt_inc; |
476 | 525k | UWORD8 u1_blk_no, u1_i, u1_idx_lft, u1_idx_top; |
477 | 525k | WORD8 i1_ref_idx; |
478 | | |
479 | 1.65M | for(u1_blk_no = 0, u1_i = 0; u1_i < u1_num_part; u1_i++, pi1_ref_idx++) |
480 | 1.12M | { |
481 | 1.12M | u1_idx_lft = ((u1_blk_no & 0x02) >> 1) + u1_b2; |
482 | 1.12M | u1_idx_top = (u1_blk_no & 0x01) + u1_b2; |
483 | 1.12M | i1_ref_idx = *pi1_ref_idx; |
484 | | |
485 | 1.12M | if(i1_ref_idx > 0) |
486 | 584k | { |
487 | 584k | u1_a = pi1_lft_cxt[u1_idx_lft] > 0; |
488 | 584k | u1_b = pi1_top_cxt[u1_idx_top] > 0; |
489 | | |
490 | 584k | u4_cxt_inc = u1_a + (u1_b << 1); |
491 | 584k | u4_cxt_inc = (u4_cxt_inc | 0x55540); |
492 | | |
493 | 584k | i1_ref_idx = (WORD8)ih264d_decode_bins_unary(32, u4_cxt_inc, |
494 | 584k | ps_ref_cxt, ps_bitstrm, |
495 | 584k | ps_cab_env); |
496 | | |
497 | 584k | if((i1_ref_idx > u1_max_ref_minus1) || (i1_ref_idx < 0)) |
498 | 954 | { |
499 | 954 | return ERROR_REF_IDX; |
500 | 954 | } |
501 | | |
502 | 583k | *pi1_ref_idx = i1_ref_idx; |
503 | | |
504 | 583k | INC_SYM_COUNT(ps_cab_env); |
505 | | |
506 | 583k | } |
507 | | |
508 | | /* Storing Reference Idx Information */ |
509 | 1.12M | pi1_lft_cxt[u1_idx_lft] = i1_ref_idx; |
510 | 1.12M | pi1_top_cxt[u1_idx_top] = i1_ref_idx; |
511 | 1.12M | u1_blk_no = u1_blk_no + 1 + (u1_mb_mode & 0x01); |
512 | 1.12M | } |
513 | | /* if(!u1_sub_mb) */ |
514 | 524k | if(u1_num_part != 4) |
515 | 408k | { |
516 | 408k | pi1_lft_cxt[(!(u1_mb_mode & 0x1)) + u1_b2] = pi1_lft_cxt[u1_b2]; |
517 | 408k | pi1_top_cxt[(!(u1_mb_mode & 0x2)) + u1_b2] = pi1_top_cxt[u1_b2]; |
518 | 408k | } |
519 | 524k | return OK; |
520 | 525k | } |
521 | | |
522 | | /*! |
523 | | ************************************************************************** |
524 | | * \if Function name : ih264d_parse_mb_qp_delta_cabac \endif |
525 | | * |
526 | | * \brief |
527 | | * This function decodes MB Qp delta using CABAC entropy coding mode. |
528 | | * |
529 | | * \return |
530 | | * None |
531 | | * |
532 | | ************************************************************************** |
533 | | */ |
534 | | WORD32 ih264d_parse_mb_qp_delta_cabac(struct _DecStruct * ps_dec, |
535 | | WORD8 *pi1_mb_qp_delta) |
536 | 1.19M | { |
537 | 1.19M | decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
538 | 1.19M | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
539 | | |
540 | 1.19M | UWORD8 u1_code_num; |
541 | 1.19M | bin_ctxt_model_t *ps_mb_qp_delta_ctxt = ps_dec->p_mb_qp_delta_t; |
542 | 1.19M | UWORD32 u4_cxt_inc; |
543 | | |
544 | 1.19M | INC_SYM_COUNT(ps_cab_env); |
545 | | |
546 | 1.19M | u4_cxt_inc = (!(!(ps_dec->i1_prev_mb_qp_delta))); |
547 | | |
548 | 1.19M | u1_code_num = 0; |
549 | 1.19M | u4_cxt_inc = (u4_cxt_inc | 0x33320); |
550 | | /* max number of bins = 53, |
551 | | since Range for MbQpDelta= -26 to +25 inclusive, UNARY code */ |
552 | 1.19M | u1_code_num = ih264d_decode_bins_unary(32, u4_cxt_inc, ps_mb_qp_delta_ctxt, |
553 | 1.19M | ps_bitstrm, ps_cab_env); |
554 | 1.19M | if(u1_code_num == 32) |
555 | 1.66k | { |
556 | | /* Read remaining 21 bins */ |
557 | 1.66k | UWORD8 uc_codeNumX; |
558 | 1.66k | u4_cxt_inc = 0x33333; |
559 | 1.66k | uc_codeNumX = ih264d_decode_bins_unary(21, u4_cxt_inc, ps_mb_qp_delta_ctxt, |
560 | 1.66k | ps_bitstrm, ps_cab_env); |
561 | 1.66k | u1_code_num = u1_code_num + uc_codeNumX; |
562 | 1.66k | } |
563 | | |
564 | 1.19M | *pi1_mb_qp_delta = (u1_code_num + 1) >> 1; |
565 | | /* Table 9.3: If code_num is even Syntax Element has -ve value */ |
566 | 1.19M | if(!(u1_code_num & 0x01)) |
567 | 959k | *pi1_mb_qp_delta = -(*pi1_mb_qp_delta); |
568 | | |
569 | | /* Range of MbQpDelta= -26 to +25 inclusive */ |
570 | 1.19M | if((*pi1_mb_qp_delta < -26) || (*pi1_mb_qp_delta > 25)) |
571 | 1.01k | return ERROR_INV_RANGE_QP_T; |
572 | 1.19M | ps_dec->i1_prev_mb_qp_delta = *pi1_mb_qp_delta; |
573 | 1.19M | return OK; |
574 | 1.19M | } |
575 | | /*! |
576 | | ************************************************************************** |
577 | | * \if Function name : ih264d_parse_chroma_pred_mode_cabac \endif |
578 | | * |
579 | | * \brief |
580 | | * This function decodes Chroma Pred mode using CABAC entropy coding mode. |
581 | | * |
582 | | * \return |
583 | | * None |
584 | | * |
585 | | ************************************************************************** |
586 | | */ |
587 | | WORD8 ih264d_parse_chroma_pred_mode_cabac(struct _DecStruct * ps_dec) |
588 | 1.18M | { |
589 | 1.18M | decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
590 | 1.18M | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
591 | 1.18M | ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
592 | 1.18M | ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
593 | 1.18M | WORD8 i1_chroma_pred_mode, a, b; |
594 | 1.18M | UWORD32 u4_cxt_inc; |
595 | | |
596 | 1.18M | INC_SYM_COUNT(ps_cab_env); |
597 | | |
598 | | /* Binarization is TU and Cmax=3 */ |
599 | 1.18M | i1_chroma_pred_mode = 0; |
600 | 1.18M | a = 0; |
601 | 1.18M | b = 0; |
602 | | |
603 | 1.18M | a = ((ps_left_ctxt->u1_intra_chroma_pred_mode != 0) ? 1 : 0); |
604 | | |
605 | 1.18M | b = ((ps_top_ctxt->u1_intra_chroma_pred_mode != 0) ? 1 : 0); |
606 | 1.18M | u4_cxt_inc = a + b; |
607 | | |
608 | 1.18M | u4_cxt_inc = (u4_cxt_inc | 0x330); |
609 | | |
610 | 1.18M | i1_chroma_pred_mode = ih264d_decode_bins_tunary( |
611 | 1.18M | 3, u4_cxt_inc, ps_dec->p_intra_chroma_pred_mode_t, |
612 | 1.18M | ps_bitstrm, ps_cab_env); |
613 | | |
614 | 1.18M | return (i1_chroma_pred_mode); |
615 | 1.18M | } |
616 | | |
617 | | /*****************************************************************************/ |
618 | | /* */ |
619 | | /* Function Name : ih264d_parse_transform8x8flag_cabac */ |
620 | | /* */ |
621 | | /* Description : */ |
622 | | /* Inputs : */ |
623 | | /* */ |
624 | | /* */ |
625 | | /* Returns : */ |
626 | | /* */ |
627 | | /* Revision History: */ |
628 | | /* */ |
629 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
630 | | /* Rajasekhar Creation */ |
631 | | /* */ |
632 | | /*****************************************************************************/ |
633 | | UWORD8 ih264d_parse_transform8x8flag_cabac(struct _DecStruct * ps_dec, |
634 | | dec_mb_info_t * ps_cur_mb_info) |
635 | 153k | { |
636 | 153k | decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
637 | 153k | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
638 | 153k | ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
639 | 153k | ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
640 | 153k | UWORD8 u1_transform_8x8flag; |
641 | 153k | UWORD8 u1_mb_ngbr_avail = ps_cur_mb_info->u1_mb_ngbr_availablity; |
642 | | |
643 | 153k | WORD8 a, b; |
644 | 153k | UWORD32 u4_cxt_inc; |
645 | | |
646 | | /* for calculating the context increment for transform8x8 u4_flag */ |
647 | | /* it reads transform8x8 u4_flag of the neighbors through */ |
648 | | |
649 | | /* Binarization is FLC */ |
650 | 153k | a = 0; |
651 | 153k | b = 0; |
652 | | |
653 | 153k | if(u1_mb_ngbr_avail & LEFT_MB_AVAILABLE_MASK) |
654 | 122k | { |
655 | 122k | a = ps_left_ctxt->u1_transform8x8_ctxt; |
656 | 122k | } |
657 | 153k | if(u1_mb_ngbr_avail & TOP_MB_AVAILABLE_MASK) |
658 | 115k | { |
659 | 115k | b = ps_top_ctxt->u1_transform8x8_ctxt; |
660 | | |
661 | 115k | } |
662 | | |
663 | 153k | u4_cxt_inc = a + b; |
664 | | |
665 | 153k | u1_transform_8x8flag = ih264d_decode_bin( |
666 | 153k | u4_cxt_inc, ps_dec->s_high_profile.ps_transform8x8_flag, |
667 | 153k | ps_bitstrm, ps_cab_env); |
668 | | |
669 | 153k | return (u1_transform_8x8flag); |
670 | 153k | } |
671 | | |
672 | | /*! |
673 | | ************************************************************************** |
674 | | * \if Function name : ih264d_read_intra_pred_modes_cabac \endif |
675 | | * |
676 | | * \brief |
677 | | * Reads the intra pred mode related values of I4x4 MB from bitstream. |
678 | | * |
679 | | * This function will read the prev intra pred mode flags and |
680 | | * stores it in pu1_prev_intra4x4_pred_mode_flag. If the u4_flag |
681 | | * indicates that most probable mode is not intra pred mode, then |
682 | | * the rem_intra4x4_pred_mode is read and stored in |
683 | | * pu1_rem_intra4x4_pred_mode array. |
684 | | * |
685 | | * |
686 | | * \return |
687 | | * 0 on success and Error code otherwise |
688 | | * |
689 | | ************************************************************************** |
690 | | */ |
691 | | WORD32 ih264d_read_intra_pred_modes_cabac(dec_struct_t * ps_dec, |
692 | | UWORD8 * pu1_prev_intra4x4_pred_mode_flag, |
693 | | UWORD8 * pu1_rem_intra4x4_pred_mode, |
694 | | UWORD8 u1_tran_form8x8) |
695 | 383k | { |
696 | 383k | WORD32 i4x4_luma_blk_idx = 0; |
697 | 383k | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
698 | 383k | decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
699 | 383k | bin_ctxt_model_t *ps_ctxt_ipred_luma_mpm, *ps_ctx_ipred_luma_rm; |
700 | 383k | WORD32 i4_rem_intra4x4_pred_mode; |
701 | 383k | UWORD32 u4_prev_intra4x4_pred_mode_flag; |
702 | 383k | UWORD32 u4_code_int_range, u4_code_int_val_ofst; |
703 | 383k | const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table; |
704 | | |
705 | 383k | ps_ctxt_ipred_luma_mpm = ps_dec->p_prev_intra4x4_pred_mode_flag_t; |
706 | 383k | ps_ctx_ipred_luma_rm = ps_dec->p_rem_intra4x4_pred_mode_t; |
707 | 383k | SWITCHOFFTRACE; |
708 | | |
709 | 383k | i4x4_luma_blk_idx = (0 == u1_tran_form8x8) ? 16 : 4; |
710 | | |
711 | 383k | u4_code_int_range = ps_cab_env->u4_code_int_range; |
712 | 383k | u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; |
713 | | |
714 | 383k | do |
715 | 5.25M | { |
716 | | |
717 | 5.25M | DECODE_ONE_BIN_MACRO(ps_ctxt_ipred_luma_mpm, u4_code_int_range, |
718 | 5.25M | u4_code_int_val_ofst, pu4_table, ps_bitstrm, |
719 | 5.25M | u4_prev_intra4x4_pred_mode_flag) |
720 | 5.25M | *pu1_prev_intra4x4_pred_mode_flag = u4_prev_intra4x4_pred_mode_flag; |
721 | | |
722 | 5.25M | i4_rem_intra4x4_pred_mode = -1; |
723 | 5.25M | if(!u4_prev_intra4x4_pred_mode_flag) |
724 | 291k | { |
725 | | |
726 | | /*inlining DecodeDecisionBins_FLC*/ |
727 | | |
728 | 291k | { |
729 | | |
730 | 291k | UWORD8 u1_max_bins = 3; |
731 | 291k | UWORD32 u4_value; |
732 | 291k | UWORD32 u4_symbol, i; |
733 | | |
734 | 291k | i = 0; |
735 | 291k | u4_value = 0; |
736 | | |
737 | 291k | do |
738 | 873k | { |
739 | | |
740 | 873k | DECODE_ONE_BIN_MACRO(ps_ctx_ipred_luma_rm, u4_code_int_range, |
741 | 873k | u4_code_int_val_ofst, pu4_table, |
742 | 873k | ps_bitstrm, u4_symbol) |
743 | | |
744 | 873k | INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env); |
745 | | |
746 | 873k | u4_value = u4_value | (u4_symbol << i); |
747 | | |
748 | 873k | i++; |
749 | 873k | } |
750 | 873k | while(i < u1_max_bins); |
751 | | |
752 | 291k | i4_rem_intra4x4_pred_mode = (u4_value); |
753 | | |
754 | 291k | } |
755 | | |
756 | 291k | } |
757 | | |
758 | 5.25M | (*pu1_rem_intra4x4_pred_mode) = i4_rem_intra4x4_pred_mode; |
759 | | |
760 | 5.25M | COPYTHECONTEXT("intra4x4_pred_mode", i4_rem_intra4x4_pred_mode); |
761 | | |
762 | 5.25M | pu1_prev_intra4x4_pred_mode_flag++; |
763 | 5.25M | pu1_rem_intra4x4_pred_mode++; |
764 | | |
765 | 5.25M | i4x4_luma_blk_idx--; |
766 | 5.25M | } |
767 | 5.25M | while(i4x4_luma_blk_idx); |
768 | | |
769 | 383k | ps_cab_env->u4_code_int_range = u4_code_int_range; |
770 | 383k | ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; |
771 | | |
772 | 383k | return (0); |
773 | | |
774 | 383k | } |
775 | | |
776 | | /*! |
777 | | ************************************************************************** |
778 | | * \if Function name : ih264d_parse_ctx_cbp_cabac \endif |
779 | | * |
780 | | * \brief |
781 | | * This function decodes CtxCbpLuma and CtxCbpChroma (CBP of a Macroblock). |
782 | | * using CABAC entropy coding mode. |
783 | | * |
784 | | * \return |
785 | | * CBP of a MB. |
786 | | * |
787 | | ************************************************************************** |
788 | | */ |
789 | | UWORD32 ih264d_parse_ctx_cbp_cabac(struct _DecStruct * ps_dec) |
790 | 842k | { |
791 | | |
792 | 842k | UWORD32 u4_cxt_inc; |
793 | 842k | decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
794 | 842k | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
795 | 842k | ctxt_inc_mb_info_t * ps_left_ctxt = ps_dec->p_left_ctxt_mb_info; |
796 | 842k | ctxt_inc_mb_info_t * ps_top_ctxt = ps_dec->p_top_ctxt_mb_info; |
797 | 842k | bin_ctxt_model_t *ps_ctxt_cbp_luma = ps_dec->p_cbp_luma_t, *ps_bin_ctxt; |
798 | 842k | WORD8 c_Cbp; //,i,j; |
799 | 842k | UWORD32 u4_code_int_range, u4_code_int_val_ofst; |
800 | 842k | UWORD32 u4_offset, *pu4_buffer; |
801 | 842k | const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table; |
802 | | |
803 | 842k | INC_SYM_COUNT(ps_cab_env); |
804 | | |
805 | | |
806 | | |
807 | | /* CBP Luma, FL, Cmax = 15, L = 4 */ |
808 | 842k | u4_cxt_inc = (!((ps_top_ctxt->u1_cbp >> 2) & 0x01)) << 1; |
809 | 842k | u4_cxt_inc += !((ps_left_ctxt->u1_cbp >> 1) & 0x01); |
810 | | |
811 | 842k | u4_offset = ps_bitstrm->u4_ofst; |
812 | 842k | pu4_buffer = ps_bitstrm->pu4_buffer; |
813 | | |
814 | 842k | u4_code_int_range = ps_cab_env->u4_code_int_range; |
815 | 842k | u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; |
816 | | /*renormalize to ensure there 23 bits more in the u4_code_int_val_ofst*/ |
817 | 842k | { |
818 | 842k | UWORD32 u4_clz, read_bits; |
819 | | |
820 | 842k | u4_clz = CLZ(u4_code_int_range); |
821 | 842k | FLUSHBITS(u4_offset, u4_clz) |
822 | 842k | NEXTBITS(read_bits, u4_offset, pu4_buffer, 23) |
823 | 842k | u4_code_int_range = u4_code_int_range << u4_clz; |
824 | 842k | u4_code_int_val_ofst = (u4_code_int_val_ofst << u4_clz) | read_bits; |
825 | 842k | } |
826 | | |
827 | 842k | ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc; |
828 | | |
829 | | /*inlining DecodeDecision_onebin without renorm*/ |
830 | 842k | { |
831 | | |
832 | 842k | UWORD32 u4_qnt_int_range, u4_int_range_lps; |
833 | 842k | UWORD32 u4_symbol, u1_mps_state; |
834 | 842k | UWORD32 table_lookup; |
835 | 842k | UWORD32 u4_clz; |
836 | | |
837 | 842k | u1_mps_state = (ps_bin_ctxt->u1_mps_state); |
838 | | |
839 | 842k | u4_clz = CLZ(u4_code_int_range); |
840 | 842k | u4_qnt_int_range = u4_code_int_range << u4_clz; |
841 | 842k | u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; |
842 | | |
843 | 842k | table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range]; |
844 | 842k | u4_int_range_lps = table_lookup & 0xff; |
845 | | |
846 | 842k | u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); |
847 | 842k | u4_code_int_range = u4_code_int_range - u4_int_range_lps; |
848 | | |
849 | 842k | u4_symbol = ((u1_mps_state >> 6) & 0x1); |
850 | | |
851 | | /*if mps*/ |
852 | 842k | u1_mps_state = (table_lookup >> 8) & 0x7F; |
853 | | |
854 | 842k | CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol, |
855 | 842k | u4_int_range_lps, u1_mps_state, table_lookup) |
856 | | |
857 | 842k | INC_BIN_COUNT(ps_cab_env); |
858 | | |
859 | 842k | ps_bin_ctxt->u1_mps_state = u1_mps_state; |
860 | | |
861 | 842k | c_Cbp = u4_symbol; |
862 | | |
863 | 842k | } |
864 | | |
865 | 842k | u4_cxt_inc = (!((ps_top_ctxt->u1_cbp >> 3) & 0x01)) << 1; |
866 | 842k | u4_cxt_inc += !(c_Cbp & 0x01); |
867 | 842k | ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc; |
868 | | /*inlining DecodeDecision_onebin without renorm*/ |
869 | | |
870 | 842k | { |
871 | | |
872 | 842k | UWORD32 u4_qnt_int_range, u4_int_range_lps; |
873 | 842k | UWORD32 u4_symbol, u1_mps_state; |
874 | 842k | UWORD32 table_lookup; |
875 | 842k | UWORD32 u4_clz; |
876 | | |
877 | 842k | u1_mps_state = (ps_bin_ctxt->u1_mps_state); |
878 | | |
879 | 842k | u4_clz = CLZ(u4_code_int_range); |
880 | 842k | u4_qnt_int_range = u4_code_int_range << u4_clz; |
881 | 842k | u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; |
882 | | |
883 | 842k | table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range]; |
884 | 842k | u4_int_range_lps = table_lookup & 0xff; |
885 | | |
886 | 842k | u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); |
887 | 842k | u4_code_int_range = u4_code_int_range - u4_int_range_lps; |
888 | | |
889 | 842k | u4_symbol = ((u1_mps_state >> 6) & 0x1); |
890 | | |
891 | | /*if mps*/ |
892 | 842k | u1_mps_state = (table_lookup >> 8) & 0x7F; |
893 | | |
894 | 842k | CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol, |
895 | 842k | u4_int_range_lps, u1_mps_state, table_lookup) |
896 | | |
897 | 842k | INC_BIN_COUNT(ps_cab_env); |
898 | | |
899 | 842k | ps_bin_ctxt->u1_mps_state = u1_mps_state; |
900 | | |
901 | 842k | c_Cbp |= u4_symbol << 1; |
902 | | |
903 | 842k | } |
904 | | |
905 | 842k | u4_cxt_inc = (!(c_Cbp & 0x01)) << 1; |
906 | 842k | u4_cxt_inc += !((ps_left_ctxt->u1_cbp >> 3) & 0x01); |
907 | 842k | ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc; |
908 | | /*inlining DecodeDecision_onebin without renorm*/ |
909 | | |
910 | 842k | { |
911 | | |
912 | 842k | UWORD32 u4_qnt_int_range, u4_int_range_lps; |
913 | 842k | UWORD32 u4_symbol, u1_mps_state; |
914 | 842k | UWORD32 table_lookup; |
915 | 842k | UWORD32 u4_clz; |
916 | | |
917 | 842k | u1_mps_state = (ps_bin_ctxt->u1_mps_state); |
918 | | |
919 | 842k | u4_clz = CLZ(u4_code_int_range); |
920 | 842k | u4_qnt_int_range = u4_code_int_range << u4_clz; |
921 | 842k | u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; |
922 | | |
923 | 842k | table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range]; |
924 | 842k | u4_int_range_lps = table_lookup & 0xff; |
925 | | |
926 | 842k | u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); |
927 | 842k | u4_code_int_range = u4_code_int_range - u4_int_range_lps; |
928 | | |
929 | 842k | u4_symbol = ((u1_mps_state >> 6) & 0x1); |
930 | | |
931 | | /*if mps*/ |
932 | 842k | u1_mps_state = (table_lookup >> 8) & 0x7F; |
933 | | |
934 | 842k | CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol, |
935 | 842k | u4_int_range_lps, u1_mps_state, table_lookup) |
936 | | |
937 | 842k | INC_BIN_COUNT(ps_cab_env); |
938 | | |
939 | 842k | ps_bin_ctxt->u1_mps_state = u1_mps_state; |
940 | | |
941 | 842k | c_Cbp |= u4_symbol << 2; |
942 | | |
943 | 842k | } |
944 | | |
945 | 842k | u4_cxt_inc = (!((c_Cbp >> 1) & 0x01)) << 1; |
946 | 842k | u4_cxt_inc += !((c_Cbp >> 2) & 0x01); |
947 | 842k | ps_bin_ctxt = ps_ctxt_cbp_luma + u4_cxt_inc; |
948 | | /*inlining DecodeDecision_onebin without renorm*/ |
949 | | |
950 | 842k | { |
951 | | |
952 | 842k | UWORD32 u4_qnt_int_range, u4_int_range_lps; |
953 | 842k | UWORD32 u4_symbol, u1_mps_state; |
954 | 842k | UWORD32 table_lookup; |
955 | 842k | UWORD32 u4_clz; |
956 | | |
957 | 842k | u1_mps_state = (ps_bin_ctxt->u1_mps_state); |
958 | | |
959 | 842k | u4_clz = CLZ(u4_code_int_range); |
960 | 842k | u4_qnt_int_range = u4_code_int_range << u4_clz; |
961 | 842k | u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; |
962 | | |
963 | 842k | table_lookup = pu4_table[(u1_mps_state << 2) + u4_qnt_int_range]; |
964 | 842k | u4_int_range_lps = table_lookup & 0xff; |
965 | | |
966 | 842k | u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); |
967 | 842k | u4_code_int_range = u4_code_int_range - u4_int_range_lps; |
968 | | |
969 | 842k | u4_symbol = ((u1_mps_state >> 6) & 0x1); |
970 | | |
971 | | /*if mps*/ |
972 | 842k | u1_mps_state = (table_lookup >> 8) & 0x7F; |
973 | | |
974 | 842k | CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, u4_symbol, |
975 | 842k | u4_int_range_lps, u1_mps_state, table_lookup) |
976 | | |
977 | 842k | INC_BIN_COUNT(ps_cab_env); |
978 | | |
979 | 842k | ps_bin_ctxt->u1_mps_state = u1_mps_state; |
980 | | |
981 | 842k | c_Cbp |= u4_symbol << 3; |
982 | | |
983 | 842k | } |
984 | | |
985 | 842k | if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8) |
986 | 0 | { |
987 | |
|
988 | 0 | RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, u4_offset, |
989 | 0 | pu4_buffer) |
990 | |
|
991 | 0 | } |
992 | | |
993 | 842k | { |
994 | 842k | UWORD32 u4_cxt_inc; |
995 | 842k | WORD8 a, b, c, d; |
996 | 842k | bin_ctxt_model_t *p_CtxtCbpChroma = ps_dec->p_cbp_chroma_t; |
997 | | |
998 | | /* CBP Chroma, TU, Cmax = 2 */ |
999 | 842k | a = 0; |
1000 | 842k | b = 0; |
1001 | 842k | c = 0; |
1002 | 842k | d = 0; |
1003 | | |
1004 | 842k | { |
1005 | 842k | a = (ps_top_ctxt->u1_cbp > 15) ? 2 : 0; |
1006 | 842k | c = (ps_top_ctxt->u1_cbp > 31) ? 2 : 0; |
1007 | 842k | } |
1008 | | |
1009 | 842k | { |
1010 | 842k | b = (ps_left_ctxt->u1_cbp > 15) ? 1 : 0; |
1011 | 842k | d = (ps_left_ctxt->u1_cbp > 31) ? 1 : 0; |
1012 | 842k | } |
1013 | 842k | u4_cxt_inc = a + b; |
1014 | 842k | u4_cxt_inc = (u4_cxt_inc | ((4 + c + d) << 4)); |
1015 | | |
1016 | | /*inlining ih264d_decode_bins_tunary */ |
1017 | | |
1018 | 842k | { |
1019 | | |
1020 | 842k | UWORD8 u1_max_bins = 2; |
1021 | 842k | UWORD32 u4_ctx_inc = u4_cxt_inc; |
1022 | | |
1023 | 842k | UWORD32 u4_value; |
1024 | 842k | UWORD32 u4_symbol; |
1025 | 842k | UWORD8 u4_ctx_Inc; |
1026 | 842k | bin_ctxt_model_t *ps_bin_ctxt; |
1027 | 842k | u4_value = 0; |
1028 | | |
1029 | 842k | do |
1030 | 941k | { |
1031 | 941k | u4_ctx_Inc = u4_ctx_inc & 0xF; |
1032 | 941k | u4_ctx_inc = u4_ctx_inc >> 4; |
1033 | | |
1034 | 941k | ps_bin_ctxt = p_CtxtCbpChroma + u4_ctx_Inc; |
1035 | | /*inlining DecodeDecision_onebin*/ |
1036 | 941k | { |
1037 | | |
1038 | 941k | UWORD32 u4_qnt_int_range, u4_int_range_lps; |
1039 | | |
1040 | 941k | UWORD32 u1_mps_state; |
1041 | 941k | UWORD32 table_lookup; |
1042 | 941k | UWORD32 u4_clz; |
1043 | | |
1044 | 941k | u1_mps_state = (ps_bin_ctxt->u1_mps_state); |
1045 | | |
1046 | 941k | u4_clz = CLZ(u4_code_int_range); |
1047 | 941k | u4_qnt_int_range = u4_code_int_range << u4_clz; |
1048 | 941k | u4_qnt_int_range = (u4_qnt_int_range >> 29) & 0x3; |
1049 | | |
1050 | 941k | table_lookup = pu4_table[(u1_mps_state << 2) |
1051 | 941k | + u4_qnt_int_range]; |
1052 | 941k | u4_int_range_lps = table_lookup & 0xff; |
1053 | | |
1054 | 941k | u4_int_range_lps = u4_int_range_lps << (23 - u4_clz); |
1055 | 941k | u4_code_int_range = u4_code_int_range - u4_int_range_lps; |
1056 | | |
1057 | 941k | u4_symbol = ((u1_mps_state >> 6) & 0x1); |
1058 | | |
1059 | | /*if mps*/ |
1060 | 941k | u1_mps_state = (table_lookup >> 8) & 0x7F; |
1061 | | |
1062 | 941k | CHECK_IF_LPS(u4_code_int_range, u4_code_int_val_ofst, |
1063 | 941k | u4_symbol, u4_int_range_lps, u1_mps_state, |
1064 | 941k | table_lookup) |
1065 | | |
1066 | 941k | if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_8) |
1067 | 572 | { |
1068 | 572 | RENORM_RANGE_OFFSET(u4_code_int_range, |
1069 | 572 | u4_code_int_val_ofst, u4_offset, |
1070 | 572 | pu4_buffer) |
1071 | 572 | } |
1072 | 941k | ps_bin_ctxt->u1_mps_state = u1_mps_state; |
1073 | 941k | } |
1074 | | |
1075 | 941k | INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS( |
1076 | 941k | ps_cab_env); |
1077 | | |
1078 | 941k | u4_value++; |
1079 | 941k | } |
1080 | 941k | while((u4_value < u1_max_bins) & (u4_symbol)); |
1081 | | |
1082 | 842k | u4_value = u4_value - 1 + u4_symbol; |
1083 | | |
1084 | 842k | a = (u4_value); |
1085 | | |
1086 | 842k | } |
1087 | | |
1088 | 842k | c_Cbp = (c_Cbp | (a << 4)); |
1089 | 842k | } |
1090 | | |
1091 | 842k | ps_bitstrm->u4_ofst = u4_offset; |
1092 | | |
1093 | 842k | ps_cab_env->u4_code_int_range = u4_code_int_range; |
1094 | 842k | ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; |
1095 | | |
1096 | 842k | return (c_Cbp); |
1097 | 842k | } |
1098 | | |
1099 | | /*! |
1100 | | ************************************************************************** |
1101 | | * \if Function name : ih264d_get_mvd_cabac \endif |
1102 | | * |
1103 | | * \brief |
1104 | | * This function decodes Horz and Vert mvd_l0 and mvd_l1 using CABAC entropy |
1105 | | * coding mode as defined in 9.3.2.3. |
1106 | | * |
1107 | | * \return |
1108 | | * None |
1109 | | * |
1110 | | ************************************************************************** |
1111 | | */ |
1112 | | void ih264d_get_mvd_cabac(UWORD8 u1_sub_mb, |
1113 | | UWORD8 u1_b2, |
1114 | | UWORD8 u1_part_wd, |
1115 | | UWORD8 u1_part_ht, |
1116 | | UWORD8 u1_dec_mvd, |
1117 | | dec_struct_t *ps_dec, |
1118 | | mv_pred_t *ps_mv) |
1119 | 1.59M | { |
1120 | 1.59M | UWORD8 u1_abs_mvd_x = 0, u1_abs_mvd_y = 0; |
1121 | 1.59M | UWORD8 u1_sub_mb_x, u1_sub_mb_y; |
1122 | 1.59M | UWORD8 *pu1_top_mv_ctxt, *pu1_lft_mv_ctxt; |
1123 | 1.59M | WORD16 *pi2_mv; |
1124 | | |
1125 | 1.59M | u1_sub_mb_x = (UWORD8)(u1_sub_mb & 0x03); |
1126 | 1.59M | u1_sub_mb_y = (UWORD8)(u1_sub_mb >> 2); |
1127 | 1.59M | pu1_top_mv_ctxt = &ps_dec->ps_curr_ctxt_mb_info->u1_mv[u1_sub_mb_x][u1_b2]; |
1128 | 1.59M | pu1_lft_mv_ctxt = &ps_dec->pu1_left_mv_ctxt_inc[u1_sub_mb_y][u1_b2]; |
1129 | 1.59M | pi2_mv = &ps_mv->i2_mv[u1_b2]; |
1130 | | |
1131 | 1.59M | if(u1_dec_mvd) |
1132 | 1.25M | { |
1133 | 1.25M | WORD16 i2_mv_x, i2_mv_y; |
1134 | 1.25M | WORD32 i2_temp; |
1135 | 1.25M | { |
1136 | 1.25M | decoding_envirnoment_t * ps_cab_env = &ps_dec->s_cab_dec_env; |
1137 | 1.25M | dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm; |
1138 | 1.25M | UWORD16 u2_abs_mvd_x_a, u2_abs_mvd_x_b, u2_abs_mvd_y_a, |
1139 | 1.25M | u2_abs_mvd_y_b; |
1140 | | |
1141 | 1.25M | u2_abs_mvd_x_b = (UWORD16)pu1_top_mv_ctxt[0]; |
1142 | 1.25M | u2_abs_mvd_y_b = (UWORD16)pu1_top_mv_ctxt[1]; |
1143 | 1.25M | u2_abs_mvd_x_a = (UWORD16)pu1_lft_mv_ctxt[0]; |
1144 | 1.25M | u2_abs_mvd_y_a = (UWORD16)pu1_lft_mv_ctxt[1]; |
1145 | | |
1146 | 1.25M | i2_temp = u2_abs_mvd_x_a + u2_abs_mvd_x_b; |
1147 | | |
1148 | 1.25M | i2_mv_x = ih264d_parse_mvd_cabac(ps_bitstrm, ps_cab_env, |
1149 | 1.25M | ps_dec->p_mvd_x_t, i2_temp); |
1150 | | |
1151 | 1.25M | i2_temp = u2_abs_mvd_y_a + u2_abs_mvd_y_b; |
1152 | | |
1153 | 1.25M | i2_mv_y = ih264d_parse_mvd_cabac(ps_bitstrm, ps_cab_env, |
1154 | 1.25M | ps_dec->p_mvd_y_t, i2_temp); |
1155 | 1.25M | } |
1156 | | |
1157 | | /***********************************************************************/ |
1158 | | /* Store the abs_mvd_values in cabac contexts */ |
1159 | | /* The follownig code can be easily optimzed if mvX, mvY clip values */ |
1160 | | /* are packed in 16 bits follwed by memcpy */ |
1161 | | /***********************************************************************/ |
1162 | 1.25M | u1_abs_mvd_x = CLIP3(0, 127, ABS(i2_mv_x)); |
1163 | 1.25M | u1_abs_mvd_y = CLIP3(0, 127, ABS(i2_mv_y)); |
1164 | | |
1165 | 1.25M | COPYTHECONTEXT("MVD", i2_mv_x);COPYTHECONTEXT("MVD", i2_mv_y); |
1166 | | |
1167 | | /* Storing Mv residuals */ |
1168 | 1.25M | pi2_mv[0] = i2_mv_x; |
1169 | 1.25M | pi2_mv[1] = i2_mv_y; |
1170 | 1.25M | } |
1171 | | |
1172 | | /***************************************************************/ |
1173 | | /* Store abs_mvd_values cabac contexts */ |
1174 | | /***************************************************************/ |
1175 | 1.59M | { |
1176 | 1.59M | UWORD8 u1_i; |
1177 | 5.62M | for(u1_i = 0; u1_i < u1_part_wd; u1_i++, pu1_top_mv_ctxt += 4) |
1178 | 4.02M | { |
1179 | 4.02M | pu1_top_mv_ctxt[0] = u1_abs_mvd_x; |
1180 | 4.02M | pu1_top_mv_ctxt[1] = u1_abs_mvd_y; |
1181 | 4.02M | } |
1182 | | |
1183 | 5.13M | for(u1_i = 0; u1_i < u1_part_ht; u1_i++, pu1_lft_mv_ctxt += 4) |
1184 | 3.53M | { |
1185 | 3.53M | pu1_lft_mv_ctxt[0] = u1_abs_mvd_x; |
1186 | 3.53M | pu1_lft_mv_ctxt[1] = u1_abs_mvd_y; |
1187 | 3.53M | } |
1188 | 1.59M | } |
1189 | 1.59M | } |
1190 | | |
1191 | | /*****************************************************************************/ |
1192 | | /* */ |
1193 | | /* Function Name : ih264d_parse_mvd_cabac */ |
1194 | | /* */ |
1195 | | /* Description : This cabac function decodes the mvd in a given direction */ |
1196 | | /* direction ( x or y ) as defined in 9.3.2.3. */ |
1197 | | /* */ |
1198 | | /* Inputs : 1. pointer to Bitstream */ |
1199 | | /* 2. pointer to cabac decoding environmnet */ |
1200 | | /* 3. pointer to Mvd context */ |
1201 | | /* 4. abs(Top mvd) = u2_abs_mvd_b */ |
1202 | | /* 5. abs(left mvd)= u2_abs_mvd_a */ |
1203 | | /* */ |
1204 | | /* Processing : see section 9.3.2.3 of the standard */ |
1205 | | /* */ |
1206 | | /* Outputs : i2_mvd */ |
1207 | | /* Returns : i2_mvd */ |
1208 | | /* */ |
1209 | | /* Issues : none */ |
1210 | | /* */ |
1211 | | /* Revision History: */ |
1212 | | /* */ |
1213 | | /* DD MM YYYY Author(s) Changes (Describe the changes made) */ |
1214 | | /* 16 06 2005 Jay Draft */ |
1215 | | /* */ |
1216 | | /*****************************************************************************/ |
1217 | | WORD16 ih264d_parse_mvd_cabac(dec_bit_stream_t * ps_bitstrm, |
1218 | | decoding_envirnoment_t * ps_cab_env, |
1219 | | bin_ctxt_model_t * p_ctxt_mvd, |
1220 | | UWORD32 i4_temp) |
1221 | | |
1222 | 2.50M | { |
1223 | 2.50M | WORD8 k; |
1224 | 2.50M | WORD16 i2_suf; |
1225 | 2.50M | WORD16 i2_mvd; |
1226 | 2.50M | UWORD16 u2_abs_mvd; |
1227 | 2.50M | UWORD32 u4_ctx_inc; |
1228 | 2.50M | UWORD32 u4_prefix; |
1229 | 2.50M | const UWORD32 *pu4_table = (const UWORD32 *)ps_cab_env->cabac_table; |
1230 | 2.50M | UWORD32 u4_code_int_range, u4_code_int_val_ofst; |
1231 | | |
1232 | | /* if mvd < 9 */ |
1233 | | /* mvd = Prefix */ |
1234 | | /* else */ |
1235 | | /* mvd = Prefix + Suffix */ |
1236 | | /* decode sign bit */ |
1237 | | /* Prefix TU decoding Cmax =Ucoff and Suffix 3rd order Exp-Golomb */ |
1238 | | |
1239 | 2.50M | u2_abs_mvd = (UWORD16)i4_temp; |
1240 | 2.50M | u4_ctx_inc = 1; |
1241 | | |
1242 | 2.50M | if(u2_abs_mvd < 3) |
1243 | 1.73M | u4_ctx_inc = 0; |
1244 | 767k | else if(u2_abs_mvd > 32) |
1245 | 47.7k | u4_ctx_inc = 2; |
1246 | | |
1247 | 2.50M | u4_ctx_inc = (u4_ctx_inc | 0x65430); |
1248 | | |
1249 | | /*inlining modified version of ih264d_decode_bins_unary*/ |
1250 | | |
1251 | 2.50M | { |
1252 | 2.50M | UWORD8 u1_max_bins = 9; |
1253 | 2.50M | UWORD32 u4_value; |
1254 | 2.50M | UWORD32 u4_symbol; |
1255 | 2.50M | bin_ctxt_model_t *ps_bin_ctxt; |
1256 | 2.50M | UWORD32 u4_ctx_Inc; |
1257 | | |
1258 | 2.50M | u4_value = 0; |
1259 | 2.50M | u4_code_int_range = ps_cab_env->u4_code_int_range; |
1260 | 2.50M | u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; |
1261 | | |
1262 | 2.50M | do |
1263 | 5.89M | { |
1264 | 5.89M | u4_ctx_Inc = u4_ctx_inc & 0xf; |
1265 | 5.89M | u4_ctx_inc = u4_ctx_inc >> 4; |
1266 | | |
1267 | 5.89M | ps_bin_ctxt = p_ctxt_mvd + u4_ctx_Inc; |
1268 | | |
1269 | 5.89M | DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, |
1270 | 5.89M | u4_code_int_val_ofst, pu4_table, ps_bitstrm, |
1271 | 5.89M | u4_symbol) |
1272 | | |
1273 | 5.89M | INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env); |
1274 | | |
1275 | 5.89M | u4_value++; |
1276 | | |
1277 | 5.89M | } |
1278 | 5.89M | while(u4_symbol && u4_value < 5); |
1279 | | |
1280 | 2.50M | ps_bin_ctxt = p_ctxt_mvd + 6; |
1281 | | |
1282 | 2.50M | if(u4_symbol && (u4_value < u1_max_bins)) |
1283 | 430k | { |
1284 | | |
1285 | 430k | do |
1286 | 1.58M | { |
1287 | | |
1288 | 1.58M | DECODE_ONE_BIN_MACRO(ps_bin_ctxt, u4_code_int_range, |
1289 | 1.58M | u4_code_int_val_ofst, pu4_table, |
1290 | 1.58M | ps_bitstrm, u4_symbol) |
1291 | | |
1292 | 1.58M | INC_BIN_COUNT(ps_cab_env);INC_DECISION_BINS(ps_cab_env); |
1293 | 1.58M | u4_value++; |
1294 | 1.58M | } |
1295 | 1.58M | while(u4_symbol && (u4_value < u1_max_bins)); |
1296 | | |
1297 | 430k | } |
1298 | | |
1299 | 2.50M | ps_cab_env->u4_code_int_range = u4_code_int_range; |
1300 | 2.50M | ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; |
1301 | 2.50M | u4_value = u4_value - 1 + u4_symbol; |
1302 | 2.50M | u4_prefix = (u4_value); |
1303 | 2.50M | } |
1304 | | |
1305 | 2.50M | i2_mvd = u4_prefix; |
1306 | | |
1307 | 2.50M | if(i2_mvd == 9) |
1308 | 358k | { |
1309 | | /* Read Suffix */ |
1310 | 358k | k = ih264d_decode_bypass_bins_unary(ps_cab_env, ps_bitstrm); |
1311 | 358k | i2_suf = (k > 15) ? INT16_MAX : ((1 << k) - 1); |
1312 | 358k | k = k + 3; |
1313 | 358k | i2_suf = (i2_suf << 3); |
1314 | 358k | i2_mvd += i2_suf; |
1315 | 358k | i2_suf = ih264d_decode_bypass_bins(ps_cab_env, k, ps_bitstrm); |
1316 | 358k | i2_mvd += i2_suf; |
1317 | 358k | } |
1318 | | /* Read Sign bit */ |
1319 | 2.50M | if(!i2_mvd) |
1320 | 1.25M | return (i2_mvd); |
1321 | | |
1322 | 1.24M | else |
1323 | 1.24M | { |
1324 | 1.24M | UWORD32 u4_code_int_val_ofst, u4_code_int_range; |
1325 | | |
1326 | 1.24M | u4_code_int_val_ofst = ps_cab_env->u4_code_int_val_ofst; |
1327 | 1.24M | u4_code_int_range = ps_cab_env->u4_code_int_range; |
1328 | | |
1329 | 1.24M | if(u4_code_int_range < ONE_RIGHT_SHIFTED_BY_9) |
1330 | 23.8k | { |
1331 | 23.8k | UWORD32 *pu4_buffer, u4_offset; |
1332 | | |
1333 | 23.8k | pu4_buffer = ps_bitstrm->pu4_buffer; |
1334 | 23.8k | u4_offset = ps_bitstrm->u4_ofst; |
1335 | | |
1336 | 23.8k | RENORM_RANGE_OFFSET(u4_code_int_range, u4_code_int_val_ofst, |
1337 | 23.8k | u4_offset, pu4_buffer) |
1338 | 23.8k | ps_bitstrm->u4_ofst = u4_offset; |
1339 | 23.8k | } |
1340 | | |
1341 | 1.24M | u4_code_int_range = u4_code_int_range >> 1; |
1342 | | |
1343 | 1.24M | if(u4_code_int_val_ofst >= u4_code_int_range) |
1344 | 331k | { |
1345 | | /* S=1 */ |
1346 | 331k | u4_code_int_val_ofst -= u4_code_int_range; |
1347 | 331k | i2_mvd = (-i2_mvd); |
1348 | 331k | } |
1349 | | |
1350 | 1.24M | ps_cab_env->u4_code_int_val_ofst = u4_code_int_val_ofst; |
1351 | 1.24M | ps_cab_env->u4_code_int_range = u4_code_int_range; |
1352 | | |
1353 | 1.24M | return (i2_mvd); |
1354 | | |
1355 | 1.24M | } |
1356 | 2.50M | } |