Coverage Report

Created: 2025-12-14 06:42

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libavc/decoder/ih264d_process_intra_mb.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_process_intra_mb.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 "ih264d_bitstrm.h"
38
#include "ih264d_defs.h"
39
#include "ih264d_debug.h"
40
#include "ih264d_tables.h"
41
#include "ih264d_structs.h"
42
#include "ih264d_defs.h"
43
#include "ih264d_parse_cavlc.h"
44
#include "ih264d_mb_utils.h"
45
#include "ih264d_parse_slice.h"
46
#include "ih264d_process_intra_mb.h"
47
#include "ih264d_error_handler.h"
48
#include "ih264d_quant_scaling.h"
49
#include "ih264d_tables.h"
50
51
/*!
52
 **************************************************************************
53
 * \if Function name : ih264d_itrans_recon_luma_dc \endif
54
 *
55
 * \brief
56
 *    This function does InvTransform, scaling and reconstruction of Luma DC.
57
 *
58
 * \return
59
 *    0 on Success and Error code otherwise
60
 **************************************************************************
61
 */
62
void ih264d_itrans_recon_luma_dc(dec_struct_t *ps_dec,
63
                                 WORD16* pi2_src,
64
                                 WORD16* pi2_coeff_block,
65
                                 const UWORD16 *pu2_weigh_mat)
66
0
{
67
0
    WORD32 i;
68
0
    WORD16 pi2_out[16];
69
0
    WORD32 pi4_tmp[16];
70
0
    WORD16 *pi2_out_ptr = &pi2_out[0];
71
0
    PROFILE_DISABLE_IQ_IT_RECON_RETURN()
72
0
    ps_dec->pf_ihadamard_scaling_4x4(pi2_src, pi2_out,
73
0
                                     ps_dec->pu2_quant_scale_y, pu2_weigh_mat,
74
0
                                     ps_dec->u1_qp_y_div6, pi4_tmp);
75
0
    for(i = 0; i < 4; i++)
76
0
    {
77
0
        pi2_coeff_block[0] = pi2_out_ptr[0];
78
0
        pi2_coeff_block[4 * 16] = pi2_out_ptr[4];
79
0
        pi2_coeff_block[8 * 16] = pi2_out_ptr[8];
80
0
        pi2_coeff_block[12 * 16] = pi2_out_ptr[12];
81
82
0
        pi2_out_ptr++; /* Point to next column */
83
0
        pi2_coeff_block += 16;
84
0
    }
85
0
}
86
/*!
87
 **************************************************************************
88
 * \if Function name : ih264d_read_intra_pred_modes \endif
89
 *
90
 * \brief
91
 *    Reads the intra pred mode related values of I4x4 MB from bitstream.
92
 *
93
 *    This function will read the prev intra pred mode flags and
94
 *    stores it in pu1_prev_intra4x4_pred_mode_flag. If the u4_flag
95
 *    indicates that most probable mode is not intra pred mode, then
96
 *    the rem_intra4x4_pred_mode is read and stored in
97
 *    pu1_rem_intra4x4_pred_mode array.
98
 *
99
 *
100
 * \return
101
 *    0 on success and Error code otherwise
102
 *
103
 **************************************************************************
104
 */
105
WORD32 ih264d_read_intra_pred_modes(dec_struct_t * ps_dec,
106
                                    UWORD8 * pu1_prev_intra4x4_pred_mode_flag,
107
                                    UWORD8 * pu1_rem_intra4x4_pred_mode,
108
                                    UWORD32 u4_trans_form8x8)
109
55.0k
{
110
55.0k
    WORD32 i4x4_luma_blk_idx = 0, i8x8_luma_blk_idx = 0;
111
112
55.0k
    dec_bit_stream_t * ps_bitstrm = ps_dec->ps_bitstrm;
113
114
55.0k
    if(!u4_trans_form8x8)
115
18.5k
    {
116
315k
        for(i4x4_luma_blk_idx = 0; i4x4_luma_blk_idx < 16; ++i4x4_luma_blk_idx)
117
296k
        {
118
296k
            UWORD32 u4_temp;
119
296k
            SWITCHOFFTRACE;
120
121
296k
            GETBIT(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
122
296k
            *pu1_prev_intra4x4_pred_mode_flag = (UWORD8)u4_temp;
123
296k
            if(!(*pu1_prev_intra4x4_pred_mode_flag))
124
99.6k
            {
125
99.6k
                GETBITS(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer, 3);
126
127
99.6k
                *(pu1_rem_intra4x4_pred_mode) = (UWORD8)u4_temp;
128
99.6k
            }
129
130
296k
            pu1_prev_intra4x4_pred_mode_flag++;
131
296k
            pu1_rem_intra4x4_pred_mode++;
132
296k
        }
133
18.5k
    }
134
36.5k
    else
135
36.5k
    {
136
        /**********************************************************************/
137
        /* prev_intra4x4_pred_modes to be interpreted as                      */
138
        /* prev_intra8x8_pred_modes in case of transform 8x8                  */
139
        /**********************************************************************/
140
182k
        for(i8x8_luma_blk_idx = 0; i8x8_luma_blk_idx < 4; i8x8_luma_blk_idx++)
141
146k
        {
142
146k
            UWORD32 u4_temp;
143
146k
            GETBIT(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer);
144
146k
            *pu1_prev_intra4x4_pred_mode_flag = (UWORD8)u4_temp;
145
146k
            if(!(*pu1_prev_intra4x4_pred_mode_flag))
146
25.6k
            {
147
25.6k
                GETBITS(u4_temp, ps_bitstrm->u4_ofst, ps_bitstrm->pu4_buffer, 3);
148
149
25.6k
                (*pu1_rem_intra4x4_pred_mode) = (UWORD8)u4_temp;
150
25.6k
            }
151
146k
            pu1_prev_intra4x4_pred_mode_flag++;
152
146k
            pu1_rem_intra4x4_pred_mode++;
153
146k
        }
154
36.5k
    }
155
55.0k
    return (0);
156
55.0k
}
157
WORD32 ih264d_unpack_coeff4x4_4x4blk(dec_struct_t * ps_dec,
158
                                   WORD16 *pi2_out_coeff_data,
159
                                   UWORD8 *pu1_inv_scan)
160
798k
{
161
798k
    tu_sblk4x4_coeff_data_t *ps_tu_4x4 = (tu_sblk4x4_coeff_data_t *)ps_dec->pv_proc_tu_coeff_data;
162
798k
    UWORD16 u2_sig_coeff_map = ps_tu_4x4->u2_sig_coeff_map;
163
798k
    WORD32 idx = 0;
164
798k
    WORD16 *pi2_coeff_data = &ps_tu_4x4->ai2_level[0];
165
798k
    WORD32 dc_only_flag = 0;
166
798k
    WORD32 num_coeff = 0;
167
168
798k
    PROFILE_DISABLE_UNPACK_LUMA()
169
2.70M
    while(u2_sig_coeff_map)
170
1.90M
    {
171
1.90M
        idx = CLZ(u2_sig_coeff_map);
172
173
1.90M
        idx = 31 - idx;
174
1.90M
        RESET_BIT(u2_sig_coeff_map,idx);
175
176
1.90M
        idx = pu1_inv_scan[idx];
177
1.90M
        pi2_out_coeff_data[idx] = *pi2_coeff_data++;
178
1.90M
        num_coeff++;
179
1.90M
    }
180
181
798k
    if((num_coeff == 1) && (idx == 0))
182
99.6k
    {
183
99.6k
        dc_only_flag = 1;
184
99.6k
    }
185
186
798k
    {
187
798k
        WORD32 offset;
188
798k
        offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_4x4;
189
798k
        offset = ALIGN4(offset);
190
798k
        ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + offset);
191
798k
    }
192
193
798k
    return dc_only_flag;
194
798k
}
195
196
UWORD32 ih264d_unpack_coeff4x4_8x8blk(dec_struct_t * ps_dec,
197
                                   dec_mb_info_t * ps_cur_mb_info,
198
                                   UWORD16 ui2_luma_csbp,
199
                                   WORD16 *pi2_out_coeff_data)
200
494k
{
201
494k
    UWORD8 *pu1_inv_scan;
202
494k
    UWORD8 u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
203
494k
    UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
204
494k
    UWORD32 u4_luma_dc_only_csbp = 0;
205
494k
    WORD32 dc_only_flag = 0;
206
207
494k
    PROFILE_DISABLE_UNPACK_LUMA()
208
494k
    if(u1_field_coding_flag || u1_mb_field_decoding_flag)
209
20.9k
    {
210
20.9k
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
211
20.9k
    }
212
473k
    else
213
473k
    {
214
473k
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
215
473k
    }
216
217
    // sub 0
218
494k
    if(ui2_luma_csbp & 0x1)
219
148k
    {
220
148k
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
221
148k
        dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
222
148k
                                      pi2_out_coeff_data,
223
148k
                                      pu1_inv_scan);
224
225
148k
        INSERT_BIT(u4_luma_dc_only_csbp, 0, dc_only_flag);
226
148k
    }
227
228
494k
    pi2_out_coeff_data += 16;
229
    // sub 1
230
494k
    if(ui2_luma_csbp & 0x2)
231
151k
    {
232
151k
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
233
151k
        dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
234
151k
                                      pi2_out_coeff_data,
235
151k
                                      pu1_inv_scan);
236
151k
        INSERT_BIT(u4_luma_dc_only_csbp, 1, dc_only_flag);
237
151k
    }
238
239
494k
    pi2_out_coeff_data += 16 + 32;
240
    // sub 2
241
494k
    if(ui2_luma_csbp & 0x10)
242
149k
    {
243
149k
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
244
149k
        dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
245
149k
                                      pi2_out_coeff_data,
246
149k
                                      pu1_inv_scan);
247
149k
        INSERT_BIT(u4_luma_dc_only_csbp, 4, dc_only_flag);
248
149k
    }
249
250
494k
    pi2_out_coeff_data += 16;
251
    // sub 3
252
494k
    if(ui2_luma_csbp & 0x20)
253
148k
    {
254
148k
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
255
148k
        dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
256
148k
                                      pi2_out_coeff_data,
257
148k
                                      pu1_inv_scan);
258
148k
        INSERT_BIT(u4_luma_dc_only_csbp, 5, dc_only_flag);
259
148k
    }
260
494k
    return u4_luma_dc_only_csbp;
261
494k
}
262
WORD32 ih264d_unpack_coeff8x8_8x8blk_cavlc(dec_struct_t * ps_dec,
263
                                            dec_mb_info_t * ps_cur_mb_info,
264
                                            UWORD16 ui2_luma_csbp,
265
                                            WORD16 *pi2_out_coeff_data)
266
92.8k
{
267
92.8k
    UWORD8 *pu1_inv_scan;
268
92.8k
    UWORD8 u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
269
92.8k
    UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
270
92.8k
    WORD32 dc_only_flag = 0;
271
272
92.8k
    PROFILE_DISABLE_UNPACK_LUMA()
273
92.8k
    if(ui2_luma_csbp & 0x33)
274
50.8k
    {
275
50.8k
        memset(pi2_out_coeff_data,0,64*sizeof(WORD16));
276
50.8k
    }
277
278
92.8k
    if(!u1_mb_field_decoding_flag)
279
85.7k
    {
280
85.7k
        pu1_inv_scan =
281
85.7k
                        (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[0];
282
85.7k
    }
283
7.14k
    else
284
7.14k
    {
285
7.14k
        pu1_inv_scan =
286
7.14k
                        (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[0];
287
7.14k
    }
288
    // sub 0
289
92.8k
    if(ui2_luma_csbp & 0x1)
290
23.0k
    {
291
23.0k
        dc_only_flag = ih264d_unpack_coeff4x4_4x4blk(ps_dec,
292
23.0k
                                      pi2_out_coeff_data,
293
23.0k
                                      pu1_inv_scan);
294
23.0k
    }
295
296
92.8k
    if(!u1_mb_field_decoding_flag)
297
85.7k
    {
298
85.7k
        pu1_inv_scan =
299
85.7k
                        (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[1];
300
85.7k
    }
301
7.14k
    else
302
7.14k
    {
303
7.14k
        pu1_inv_scan =
304
7.14k
                        (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[1];
305
7.14k
    }
306
    // sub 1
307
92.8k
    if(ui2_luma_csbp & 0x2)
308
19.6k
    {
309
19.6k
        dc_only_flag = 0;
310
19.6k
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
311
19.6k
                                      pi2_out_coeff_data,
312
19.6k
                                      pu1_inv_scan);
313
19.6k
    }
314
315
92.8k
    if(!u1_mb_field_decoding_flag)
316
85.7k
    {
317
85.7k
        pu1_inv_scan =
318
85.7k
                        (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[2];
319
85.7k
    }
320
7.14k
    else
321
7.14k
    {
322
7.14k
        pu1_inv_scan =
323
7.14k
                        (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[2];
324
7.14k
    }
325
    // sub 2
326
92.8k
    if(ui2_luma_csbp & 0x10)
327
24.3k
    {
328
24.3k
        dc_only_flag = 0;
329
24.3k
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
330
24.3k
                                      pi2_out_coeff_data,
331
24.3k
                                      pu1_inv_scan);
332
24.3k
    }
333
334
92.8k
    if(!u1_mb_field_decoding_flag)
335
85.7k
    {
336
85.7k
        pu1_inv_scan =
337
85.7k
                        (UWORD8*)gau1_ih264d_inv_scan_prog8x8_cavlc[3];
338
85.7k
    }
339
7.14k
    else
340
7.14k
    {
341
7.14k
        pu1_inv_scan =
342
7.14k
                        (UWORD8*)gau1_ih264d_inv_scan_int8x8_cavlc[3];
343
7.14k
    }
344
    // sub 3
345
92.8k
    if(ui2_luma_csbp & 0x20)
346
24.0k
    {
347
24.0k
        dc_only_flag = 0;
348
24.0k
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
349
24.0k
                                      pi2_out_coeff_data,
350
24.0k
                                      pu1_inv_scan);
351
24.0k
    }
352
92.8k
    return dc_only_flag;
353
92.8k
}
354
void ih264d_unpack_coeff4x4_8x8blk_chroma(dec_struct_t * ps_dec,
355
                                          dec_mb_info_t * ps_cur_mb_info,
356
                                          UWORD16 ui2_chroma_csbp,
357
                                          WORD16 *pi2_out_coeff_data)
358
142k
{
359
142k
    UWORD8 *pu1_inv_scan;
360
142k
    UWORD8 u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
361
142k
    UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
362
363
142k
    PROFILE_DISABLE_UNPACK_CHROMA()
364
142k
    if(u1_field_coding_flag || u1_mb_field_decoding_flag)
365
6.95k
    {
366
6.95k
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_fld;
367
6.95k
    }
368
135k
    else
369
135k
    {
370
135k
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan;
371
135k
    }
372
373
142k
    if(ui2_chroma_csbp & 0x1)
374
26.0k
    {
375
26.0k
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
376
26.0k
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
377
26.0k
                                      pi2_out_coeff_data,
378
26.0k
                                      pu1_inv_scan);
379
26.0k
    }
380
142k
    pi2_out_coeff_data += 16;
381
142k
    if(ui2_chroma_csbp & 0x2)
382
25.7k
    {
383
25.7k
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
384
25.7k
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
385
25.7k
                                      pi2_out_coeff_data,
386
25.7k
                                      pu1_inv_scan);
387
25.7k
    }
388
389
142k
    pi2_out_coeff_data += 16;
390
142k
    if(ui2_chroma_csbp & 0x4)
391
29.1k
    {
392
29.1k
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
393
29.1k
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
394
29.1k
                                      pi2_out_coeff_data,
395
29.1k
                                      pu1_inv_scan);
396
29.1k
    }
397
398
142k
    pi2_out_coeff_data += 16;
399
142k
    if(ui2_chroma_csbp & 0x8)
400
28.9k
    {
401
28.9k
        memset(pi2_out_coeff_data,0,16*sizeof(WORD16));
402
28.9k
        ih264d_unpack_coeff4x4_4x4blk(ps_dec,
403
28.9k
                                      pi2_out_coeff_data,
404
28.9k
                                      pu1_inv_scan);
405
28.9k
    }
406
142k
}
407
UWORD32 ih264d_unpack_luma_coeff4x4_mb(dec_struct_t * ps_dec,
408
                                    dec_mb_info_t * ps_cur_mb_info,
409
                                    UWORD8 intra_flag)
410
2.25M
{
411
2.25M
    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
412
2.25M
    UWORD16 ui2_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
413
2.25M
    UWORD8 *pu1_inv_scan = ps_dec->pu1_inv_scan;
414
2.25M
    WORD16 *pi2_coeff_data = ps_dec->pi2_coeff_data;
415
416
2.25M
    PROFILE_DISABLE_UNPACK_LUMA()
417
2.25M
    if(!ps_cur_mb_info->u1_tran_form8x8)
418
2.20M
    {
419
2.20M
        UWORD32 u4_luma_dc_only_csbp = 0;
420
2.20M
        UWORD32 u4_temp = 0;
421
2.20M
        WORD16* pi2_dc_val = NULL;
422
        /*
423
         * Reserve the pointer to dc vals. The dc vals will be copied
424
         * after unpacking of ac vals since memset to 0 inside.
425
         */
426
2.20M
        if(intra_flag && (u1_mb_type != I_4x4_MB))
427
1.04M
        {
428
1.04M
            if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag,0))
429
101k
            {
430
101k
                pi2_dc_val = (WORD16 *)ps_dec->pv_proc_tu_coeff_data;
431
432
101k
                ps_dec->pv_proc_tu_coeff_data = (void *)(pi2_dc_val + 16);
433
101k
            }
434
1.04M
        }
435
436
2.20M
        if(ui2_luma_csbp)
437
123k
        {
438
123k
            pi2_coeff_data = ps_dec->pi2_coeff_data;
439
123k
            u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
440
123k
                                          ps_cur_mb_info,
441
123k
                                          ui2_luma_csbp,
442
123k
                                          pi2_coeff_data);
443
123k
            u4_luma_dc_only_csbp = u4_temp;
444
445
123k
            pi2_coeff_data += 32;
446
447
123k
            ui2_luma_csbp = ui2_luma_csbp >> 2;
448
123k
            u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
449
123k
                                          ps_cur_mb_info,
450
123k
                                          ui2_luma_csbp,
451
123k
                                          pi2_coeff_data);
452
453
123k
            u4_luma_dc_only_csbp |= (u4_temp << 2);
454
455
123k
            pi2_coeff_data += 32 + 64;
456
457
123k
            ui2_luma_csbp = ui2_luma_csbp >> 6;
458
123k
            u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
459
123k
                                          ps_cur_mb_info,
460
123k
                                          ui2_luma_csbp,
461
123k
                                          pi2_coeff_data);
462
463
123k
            u4_luma_dc_only_csbp |= (u4_temp << 8);
464
465
123k
            pi2_coeff_data += 32;
466
467
123k
            ui2_luma_csbp = ui2_luma_csbp >> 2;
468
123k
            u4_temp = ih264d_unpack_coeff4x4_8x8blk(ps_dec,
469
123k
                                          ps_cur_mb_info,
470
123k
                                          ui2_luma_csbp,
471
123k
                                          pi2_coeff_data);
472
123k
            u4_luma_dc_only_csbp |= (u4_temp << 10);
473
123k
        }
474
475
2.20M
        if(pi2_dc_val != NULL)
476
101k
        {
477
101k
            WORD32 i;
478
101k
            pi2_coeff_data = ps_dec->pi2_coeff_data;
479
506k
            for(i = 0; i < 4; i++)
480
404k
            {
481
404k
                pi2_coeff_data[0] = pi2_dc_val[0];
482
404k
                pi2_coeff_data[4 * 16] = pi2_dc_val[4];
483
404k
                pi2_coeff_data[8 * 16] = pi2_dc_val[8];
484
404k
                pi2_coeff_data[12 * 16] = pi2_dc_val[12];
485
486
404k
                pi2_dc_val++; /* Point to next column */
487
404k
                pi2_coeff_data += 16;
488
404k
            }
489
101k
            u4_luma_dc_only_csbp = ps_cur_mb_info->u2_luma_csbp ^ 0xFFFF;
490
101k
        }
491
2.20M
        return u4_luma_dc_only_csbp;
492
2.20M
    }
493
44.4k
    else
494
44.4k
    {
495
44.4k
        UWORD32 u4_luma_dc_only_cbp = 0;
496
44.4k
        WORD32 dc_only_flag;
497
44.4k
        if(ui2_luma_csbp)
498
23.2k
        {
499
23.2k
            pi2_coeff_data = ps_dec->pi2_coeff_data;
500
23.2k
            dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
501
23.2k
                                          ps_cur_mb_info,
502
23.2k
                                          ui2_luma_csbp,
503
23.2k
                                          pi2_coeff_data);
504
23.2k
            INSERT_BIT(u4_luma_dc_only_cbp, 0, dc_only_flag);
505
506
23.2k
            pi2_coeff_data += 64;
507
508
23.2k
            ui2_luma_csbp = ui2_luma_csbp >> 2;
509
23.2k
            dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
510
23.2k
                                          ps_cur_mb_info,
511
23.2k
                                          ui2_luma_csbp,
512
23.2k
                                          pi2_coeff_data);
513
514
23.2k
            INSERT_BIT(u4_luma_dc_only_cbp, 1, dc_only_flag);
515
516
23.2k
            pi2_coeff_data += 64;
517
518
23.2k
            ui2_luma_csbp = ui2_luma_csbp >> 6;
519
23.2k
            dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
520
23.2k
                                          ps_cur_mb_info,
521
23.2k
                                          ui2_luma_csbp,
522
23.2k
                                          pi2_coeff_data);
523
524
23.2k
            INSERT_BIT(u4_luma_dc_only_cbp, 2, dc_only_flag);
525
526
23.2k
            pi2_coeff_data += 64;
527
23.2k
            ui2_luma_csbp = ui2_luma_csbp >> 2;
528
23.2k
            dc_only_flag = ih264d_unpack_coeff8x8_8x8blk_cavlc(ps_dec,
529
23.2k
                                          ps_cur_mb_info,
530
23.2k
                                          ui2_luma_csbp,
531
23.2k
                                          pi2_coeff_data);
532
23.2k
            INSERT_BIT(u4_luma_dc_only_cbp, 3, dc_only_flag);
533
23.2k
        }
534
44.4k
        return u4_luma_dc_only_cbp;
535
44.4k
    }
536
537
2.25M
}
538
539
void ih264d_unpack_chroma_coeff4x4_mb(dec_struct_t * ps_dec,
540
                                      dec_mb_info_t * ps_cur_mb_info)
541
2.34M
{
542
2.34M
    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
543
2.34M
    UWORD16 ui2_chroma_csbp = ps_cur_mb_info->u2_chroma_csbp;
544
2.34M
    UWORD8 *pu1_inv_scan = ps_dec->pu1_inv_scan;
545
2.34M
    WORD16 *pi2_coeff_data = ps_dec->pi2_coeff_data;
546
2.34M
    WORD32 i;
547
2.34M
    WORD16 *pi2_dc_val_u = NULL;
548
2.34M
    WORD16 *pi2_dc_val_v = NULL;
549
550
2.34M
    PROFILE_DISABLE_UNPACK_CHROMA()
551
2.34M
    if((ps_cur_mb_info->u1_cbp >> 4) == CBPC_ALLZERO)
552
2.15M
        return;
553
554
    /*
555
     * Reserve the pointers to dc vals. The dc vals will be copied
556
     * after unpacking of ac vals since memset to 0 inside.
557
     */
558
196k
    if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag,1))
559
129k
    {
560
129k
        pi2_dc_val_u = (WORD16 *)ps_dec->pv_proc_tu_coeff_data;
561
562
129k
        ps_dec->pv_proc_tu_coeff_data = (void *)(pi2_dc_val_u + 4);
563
129k
    }
564
196k
    if(CHECKBIT(ps_cur_mb_info->u1_yuv_dc_block_flag,2))
565
132k
    {
566
132k
        pi2_dc_val_v = (WORD16 *)ps_dec->pv_proc_tu_coeff_data;
567
568
132k
        ps_dec->pv_proc_tu_coeff_data = (void *)(pi2_dc_val_v + 4);
569
132k
    }
570
571
196k
    if((ps_cur_mb_info->u1_cbp >> 4) == CBPC_NONZERO)
572
71.4k
    {
573
71.4k
        pi2_coeff_data = ps_dec->pi2_coeff_data;
574
71.4k
        ih264d_unpack_coeff4x4_8x8blk_chroma(ps_dec,
575
71.4k
                                             ps_cur_mb_info,
576
71.4k
                                             ui2_chroma_csbp,
577
71.4k
                                             pi2_coeff_data);
578
579
71.4k
        pi2_coeff_data += 64;
580
71.4k
        ui2_chroma_csbp = ui2_chroma_csbp >> 4;
581
71.4k
        ih264d_unpack_coeff4x4_8x8blk_chroma(ps_dec,
582
71.4k
                                             ps_cur_mb_info,
583
71.4k
                                             ui2_chroma_csbp,
584
71.4k
                                             pi2_coeff_data);
585
586
71.4k
    }
587
588
196k
    pi2_coeff_data = ps_dec->pi2_coeff_data;
589
196k
    if(pi2_dc_val_u != NULL)
590
129k
    {
591
129k
        pi2_coeff_data[0] = *pi2_dc_val_u++;
592
129k
        pi2_coeff_data[1 * 16] = *pi2_dc_val_u++;
593
129k
        pi2_coeff_data[2 * 16] = *pi2_dc_val_u++;
594
129k
        pi2_coeff_data[3 * 16] = *pi2_dc_val_u++;
595
129k
    }
596
67.5k
    else
597
67.5k
    {
598
67.5k
        pi2_coeff_data[0] = 0;
599
67.5k
        pi2_coeff_data[1 * 16] = 0;
600
67.5k
        pi2_coeff_data[2 * 16] = 0;
601
67.5k
        pi2_coeff_data[3 * 16] = 0;
602
67.5k
    }
603
196k
    pi2_coeff_data += 64;
604
196k
    if(pi2_dc_val_v != NULL)
605
132k
    {
606
132k
        pi2_coeff_data[0] = *pi2_dc_val_v++;
607
132k
        pi2_coeff_data[1 * 16] = *pi2_dc_val_v++;
608
132k
        pi2_coeff_data[2 * 16] = *pi2_dc_val_v++;
609
132k
        pi2_coeff_data[3 * 16] = *pi2_dc_val_v++;
610
132k
    }
611
64.1k
    else
612
64.1k
    {
613
64.1k
        pi2_coeff_data[0] = 0;
614
64.1k
        pi2_coeff_data[1 * 16] = 0;
615
64.1k
        pi2_coeff_data[2 * 16] = 0;
616
64.1k
        pi2_coeff_data[3 * 16] = 0;
617
64.1k
    }
618
196k
}
619
UWORD32 ih264d_unpack_luma_coeff8x8_mb(dec_struct_t * ps_dec,
620
                                    dec_mb_info_t * ps_cur_mb_info)
621
92.5k
{
622
92.5k
    WORD32 blk_8x8_cnt;
623
92.5k
    WORD16 *pi2_out_coeff_data = ps_dec->pi2_coeff_data;
624
92.5k
    UWORD8 u1_field_coding_flag = ps_cur_mb_info->ps_curmb->u1_mb_fld;
625
92.5k
    UWORD8 *pu1_inv_scan;
626
92.5k
    UWORD32 u4_luma_dc_only_cbp = 0;
627
628
92.5k
    PROFILE_DISABLE_UNPACK_LUMA()
629
92.5k
    if(!u1_field_coding_flag)
630
82.8k
    {
631
        /*******************************************************************/
632
        /* initializing inverse scan  matrices                             */
633
        /*******************************************************************/
634
82.8k
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_prog8x8_cabac;
635
82.8k
    }
636
9.71k
    else
637
9.71k
    {
638
        /*******************************************************************/
639
        /* initializing inverse scan  matrices                             */
640
        /*******************************************************************/
641
9.71k
        pu1_inv_scan = (UWORD8 *)gau1_ih264d_inv_scan_int8x8_cabac;
642
9.71k
    }
643
644
462k
    for(blk_8x8_cnt = 0; blk_8x8_cnt < 4; blk_8x8_cnt++)
645
370k
    {
646
370k
        if(CHECKBIT(ps_cur_mb_info->u1_cbp, blk_8x8_cnt))
647
157k
        {
648
157k
            tu_blk8x8_coeff_data_t *ps_tu_8x8 = (tu_blk8x8_coeff_data_t *)ps_dec->pv_proc_tu_coeff_data;
649
157k
            UWORD32 u4_sig_coeff_map;
650
157k
            WORD32 idx = 0;
651
157k
            WORD16 *pi2_coeff_data = &ps_tu_8x8->ai2_level[0];
652
157k
            WORD32 num_coeff = 0;
653
654
            /* memset 64 coefficient to zero */
655
157k
            memset(pi2_out_coeff_data,0,64*sizeof(WORD16));
656
657
157k
            u4_sig_coeff_map = ps_tu_8x8->au4_sig_coeff_map[1];
658
659
231k
            while(u4_sig_coeff_map)
660
73.6k
            {
661
73.6k
                idx = CLZ(u4_sig_coeff_map);
662
663
73.6k
                idx = 31 - idx;
664
73.6k
                RESET_BIT(u4_sig_coeff_map,idx);
665
666
73.6k
                idx = pu1_inv_scan[idx + 32];
667
73.6k
                pi2_out_coeff_data[idx] = *pi2_coeff_data++;
668
73.6k
                num_coeff++;
669
73.6k
            }
670
671
157k
            u4_sig_coeff_map = ps_tu_8x8->au4_sig_coeff_map[0];
672
756k
            while(u4_sig_coeff_map)
673
598k
            {
674
598k
                idx = CLZ(u4_sig_coeff_map);
675
676
598k
                idx = 31 - idx;
677
598k
                RESET_BIT(u4_sig_coeff_map,idx);
678
679
598k
                idx = pu1_inv_scan[idx];
680
598k
                pi2_out_coeff_data[idx] = *pi2_coeff_data++;
681
598k
                num_coeff++;
682
598k
            }
683
684
157k
            if((num_coeff == 1) && (idx == 0))
685
25.3k
            {
686
25.3k
                SET_BIT(u4_luma_dc_only_cbp,blk_8x8_cnt);
687
25.3k
            }
688
689
690
157k
            {
691
157k
                WORD32 offset;
692
157k
                offset = (UWORD8 *)pi2_coeff_data - (UWORD8 *)ps_tu_8x8;
693
157k
                offset = ALIGN4(offset);
694
157k
                ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + offset);
695
157k
            }
696
157k
        }
697
370k
        pi2_out_coeff_data += 64;
698
370k
    }
699
700
92.5k
    return u4_luma_dc_only_cbp;
701
92.5k
}
702
/*!
703
 **************************************************************************
704
 * \if Function name : ih264d_process_intra_mb \endif
705
 *
706
 * \brief
707
 *    This function decodes an I MB. Intraprediction is carried out followed
708
 *    by InvTramsform. Both IntraPrediction and Reconstrucion are carried out
709
 *    row buffer itself.
710
 *
711
 *
712
 * \return
713
 *    0 on Success and Error code otherwise
714
 **************************************************************************
715
 */
716
WORD32 ih264d_process_intra_mb(dec_struct_t * ps_dec,
717
                               dec_mb_info_t * ps_cur_mb_info,
718
                               UWORD32 u4_mb_num)
719
1.52M
{
720
1.52M
    UWORD8 u1_mb_type = ps_cur_mb_info->u1_mb_type;
721
1.52M
    UWORD8 uc_temp = ps_cur_mb_info->u1_mb_ngbr_availablity;
722
1.52M
    UWORD8 u1_top_available = BOOLEAN(uc_temp & TOP_MB_AVAILABLE_MASK);
723
1.52M
    UWORD8 u1_left_available = BOOLEAN(uc_temp & LEFT_MB_AVAILABLE_MASK);
724
1.52M
    UWORD8 u1_use_top_right_mb = BOOLEAN(uc_temp & TOP_RIGHT_MB_AVAILABLE_MASK);
725
1.52M
    UWORD8 u1_use_top_left_mb = BOOLEAN(uc_temp & TOP_LEFT_MB_AVAILABLE_MASK);
726
1.52M
    UWORD8 uc_useTopMB = u1_top_available;
727
1.52M
    UWORD16 u2_use_left_mb = u1_left_available;
728
1.52M
    UWORD16 u2_use_left_mb_pack;
729
1.52M
    UWORD8 *pu1_luma_pred_buffer;
730
    /* CHANGED CODE */
731
1.52M
    UWORD8 *pu1_luma_rec_buffer;
732
1.52M
    UWORD8 *puc_top;
733
734
1.52M
    mb_neigbour_params_t *ps_left_mb;
735
1.52M
    mb_neigbour_params_t *ps_top_mb;
736
1.52M
    mb_neigbour_params_t *ps_top_right_mb;
737
1.52M
    mb_neigbour_params_t *ps_curmb;
738
739
1.52M
    UWORD16 u2_mbx = ps_cur_mb_info->u2_mbx;
740
1.52M
    UWORD32 ui_pred_width, ui_rec_width;
741
1.52M
    WORD16 *pi2_y_coeff;
742
1.52M
    UWORD8 u1_mbaff, u1_topmb, u1_mb_field_decoding_flag;
743
1.52M
    UWORD32 u4_num_pmbair;
744
1.52M
    UWORD16 ui2_luma_csbp = ps_cur_mb_info->u2_luma_csbp;
745
1.52M
    UWORD8 *pu1_yleft, *pu1_ytop_left;
746
    /* Chroma variables*/
747
1.52M
    UWORD8 *pu1_top_u;
748
1.52M
    UWORD8 *pu1_uleft;
749
1.52M
    UWORD8 *pu1_u_top_left;
750
    /* CHANGED CODE */
751
1.52M
    UWORD8 *pu1_mb_cb_rei1_buffer, *pu1_mb_cr_rei1_buffer;
752
1.52M
    UWORD32 u4_recwidth_cr;
753
    /* CHANGED CODE */
754
1.52M
    tfr_ctxt_t *ps_frame_buf = ps_dec->ps_frame_buf_ip_recon;
755
1.52M
    UWORD32 u4_luma_dc_only_csbp = 0;
756
1.52M
    UWORD32 u4_luma_dc_only_cbp = 0;
757
758
1.52M
    UWORD8 *pu1_prev_intra4x4_pred_mode_data = (UWORD8 *)ps_dec->pv_proc_tu_coeff_data;                 //Pointer to keep track of intra4x4_pred_mode data in pv_proc_tu_coeff_data buffer
759
1.52M
    u1_mbaff = ps_dec->ps_cur_slice->u1_mbaff_frame_flag;
760
1.52M
    u1_topmb = ps_cur_mb_info->u1_topmb;
761
1.52M
    u4_num_pmbair = (u4_mb_num >> u1_mbaff);
762
763
764
    /*--------------------------------------------------------------------*/
765
    /* Find the current MB's mb params                                    */
766
    /*--------------------------------------------------------------------*/
767
1.52M
    u1_mb_field_decoding_flag = ps_cur_mb_info->u1_mb_field_decodingflag;
768
769
1.52M
    ps_curmb = ps_cur_mb_info->ps_curmb;
770
1.52M
    ps_top_mb = ps_cur_mb_info->ps_top_mb;
771
1.52M
    ps_left_mb = ps_cur_mb_info->ps_left_mb;
772
1.52M
    ps_top_right_mb = ps_cur_mb_info->ps_top_right_mb;
773
774
    /*--------------------------------------------------------------------*/
775
    /* Check whether neighbouring MB is Inter MB and                      */
776
    /* constrained intra pred is 1.                                       */
777
    /*--------------------------------------------------------------------*/
778
1.52M
    u2_use_left_mb_pack = (u2_use_left_mb << 8) + u2_use_left_mb;
779
780
1.52M
    if(ps_dec->ps_cur_pps->u1_constrained_intra_pred_flag)
781
271k
    {
782
271k
        UWORD8 u1_left = (UWORD8)u2_use_left_mb;
783
784
271k
        uc_useTopMB = uc_useTopMB
785
150k
                        && ((ps_top_mb->u1_mb_type != P_MB)
786
126k
                                        && (ps_top_mb->u1_mb_type != B_MB));
787
271k
        u2_use_left_mb = u2_use_left_mb
788
199k
                        && ((ps_left_mb->u1_mb_type != P_MB)
789
178k
                                        && (ps_left_mb->u1_mb_type != B_MB));
790
791
271k
        u2_use_left_mb_pack = (u2_use_left_mb << 8) + u2_use_left_mb;
792
271k
        if(u1_mbaff)
793
32.5k
        {
794
32.5k
            if(u1_mb_field_decoding_flag ^ ps_left_mb->u1_mb_fld)
795
13.8k
            {
796
13.8k
                u1_left = u1_left
797
12.6k
                                && (((ps_left_mb + 1)->u1_mb_type != P_MB)
798
7.33k
                                                && ((ps_left_mb + 1)->u1_mb_type
799
7.33k
                                                                != B_MB));
800
13.8k
                u2_use_left_mb = u2_use_left_mb && u1_left;
801
13.8k
                if(u1_mb_field_decoding_flag)
802
8.11k
                    u2_use_left_mb_pack = (u1_left << 8)
803
8.11k
                                    + (u2_use_left_mb_pack & 0xff);
804
5.75k
                else
805
5.75k
                    u2_use_left_mb_pack = (u2_use_left_mb << 8)
806
5.75k
                                    + (u2_use_left_mb);
807
13.8k
            }
808
32.5k
        }
809
271k
        u1_use_top_right_mb =
810
271k
                        u1_use_top_right_mb
811
101k
                                        && ((ps_top_right_mb->u1_mb_type != P_MB)
812
86.5k
                                                        && (ps_top_right_mb->u1_mb_type
813
86.5k
                                                                        != B_MB));
814
815
271k
        u1_use_top_left_mb =
816
271k
                        u1_use_top_left_mb
817
107k
                                        && ((ps_cur_mb_info->u1_topleft_mbtype != P_MB)
818
90.5k
                                                        && (ps_cur_mb_info->u1_topleft_mbtype
819
90.5k
                                                                        != B_MB));
820
271k
    }
821
822
    /*********************Common pointer calculations *************************/
823
    /* CHANGED CODE */
824
1.52M
    pu1_luma_pred_buffer = ps_dec->pu1_y;
825
1.52M
    pu1_luma_rec_buffer = ps_frame_buf->pu1_dest_y + (u4_num_pmbair << 4);
826
1.52M
    pu1_mb_cb_rei1_buffer = ps_frame_buf->pu1_dest_u
827
1.52M
                    + (u4_num_pmbair << 3) * YUV420SP_FACTOR;
828
1.52M
    pu1_mb_cr_rei1_buffer = ps_frame_buf->pu1_dest_v + (u4_num_pmbair << 3);
829
1.52M
    ui_pred_width = MB_SIZE;
830
1.52M
    ui_rec_width = ps_dec->u2_frm_wd_y << u1_mb_field_decoding_flag;
831
1.52M
    u4_recwidth_cr = ps_dec->u2_frm_wd_uv << u1_mb_field_decoding_flag;
832
    /************* Current and top luma pointer *****************/
833
834
1.52M
    if(u1_mbaff)
835
41.6k
    {
836
41.6k
        if(u1_topmb == 0)
837
20.5k
        {
838
20.5k
            pu1_luma_rec_buffer += (
839
20.5k
                            u1_mb_field_decoding_flag ?
840
9.15k
                                            (ui_rec_width >> 1) :
841
20.5k
                                            (ui_rec_width << 4));
842
20.5k
            pu1_mb_cb_rei1_buffer += (
843
20.5k
                            u1_mb_field_decoding_flag ?
844
9.15k
                                            (u4_recwidth_cr >> 1) :
845
20.5k
                                            (u4_recwidth_cr << 3));
846
20.5k
            pu1_mb_cr_rei1_buffer += (
847
20.5k
                            u1_mb_field_decoding_flag ?
848
9.15k
                                            (u4_recwidth_cr >> 1) :
849
20.5k
                                            (u4_recwidth_cr << 3));
850
20.5k
        }
851
41.6k
    }
852
853
    /* CHANGED CODE */
854
1.52M
    if(ps_dec->u4_use_intrapred_line_copy == 1)
855
1.48M
    {
856
1.48M
        puc_top = ps_dec->pu1_prev_y_intra_pred_line + (ps_cur_mb_info->u2_mbx << 4);
857
1.48M
        pu1_top_u = ps_dec->pu1_prev_u_intra_pred_line
858
1.48M
                        + (ps_cur_mb_info->u2_mbx << 3) * YUV420SP_FACTOR;
859
1.48M
    }
860
41.7k
    else
861
41.7k
    {
862
41.7k
        puc_top = pu1_luma_rec_buffer - ui_rec_width;
863
41.7k
        pu1_top_u = pu1_mb_cb_rei1_buffer - u4_recwidth_cr;
864
41.7k
    }
865
    /* CHANGED CODE */
866
867
    /************* Left pointer *****************/
868
1.52M
    pu1_yleft = pu1_luma_rec_buffer - 1;
869
1.52M
    pu1_uleft = pu1_mb_cb_rei1_buffer - 1 * YUV420SP_FACTOR;
870
871
    /**************Top Left pointer calculation**********/
872
1.52M
    pu1_ytop_left = puc_top - 1;
873
1.52M
    pu1_u_top_left = pu1_top_u - 1 * YUV420SP_FACTOR;
874
875
    /* CHANGED CODE */
876
1.52M
    PROFILE_DISABLE_INTRA_PRED()
877
1.52M
    {
878
1.52M
        pu1_prev_intra4x4_pred_mode_data = (UWORD8 *)ps_dec->pv_proc_tu_coeff_data;
879
1.52M
        if(u1_mb_type == I_4x4_MB && ps_cur_mb_info->u1_tran_form8x8 == 0)
880
384k
        {
881
384k
            ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + 32);
882
883
384k
        }
884
1.14M
        else if (u1_mb_type == I_4x4_MB && ps_cur_mb_info->u1_tran_form8x8 == 1)
885
95.3k
        {
886
95.3k
            ps_dec->pv_proc_tu_coeff_data = (void *)((UWORD8 *)ps_dec->pv_proc_tu_coeff_data + 8);
887
95.3k
        }
888
1.52M
    }
889
1.52M
    if(!ps_cur_mb_info->u1_tran_form8x8)
890
1.43M
    {
891
1.43M
        u4_luma_dc_only_csbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec,
892
1.43M
                                       ps_cur_mb_info,
893
1.43M
                                       1);
894
1.43M
    }
895
95.4k
    else
896
95.4k
    {
897
95.4k
        if(!ps_dec->ps_cur_pps->u1_entropy_coding_mode)
898
33.5k
        {
899
33.5k
            u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff4x4_mb(ps_dec,
900
33.5k
                                           ps_cur_mb_info,
901
33.5k
                                           1);
902
33.5k
        }
903
61.8k
        else
904
61.8k
        {
905
61.8k
            u4_luma_dc_only_cbp = ih264d_unpack_luma_coeff8x8_mb(ps_dec,
906
61.8k
                                           ps_cur_mb_info);
907
61.8k
        }
908
95.4k
    }
909
910
1.52M
    pi2_y_coeff = ps_dec->pi2_coeff_data;
911
912
1.52M
    if(u1_mb_type != I_4x4_MB)
913
1.04M
    {
914
1.04M
        UWORD8 u1_intrapred_mode = MB_TYPE_TO_INTRA_16x16_MODE(u1_mb_type);
915
        /*--------------------------------------------------------------------*/
916
        /* 16x16 IntraPrediction                                              */
917
        /*--------------------------------------------------------------------*/
918
1.04M
        {
919
1.04M
            UWORD8 u1_packed_modes = (u1_top_available << 1)
920
1.04M
                            + u1_left_available;
921
1.04M
            UWORD8 u1_err_code =
922
1.04M
                            (u1_intrapred_mode & 1) ?
923
372k
                                            u1_intrapred_mode :
924
1.04M
                                            (u1_intrapred_mode ^ 2);
925
926
1.04M
            if((u1_err_code & u1_packed_modes) ^ u1_err_code)
927
60.2k
            {
928
60.2k
                u1_intrapred_mode = 0;
929
60.2k
                ps_dec->i4_error_code = ERROR_INTRAPRED;
930
60.2k
            }
931
1.04M
        }
932
1.04M
        {
933
            /* Align the size to multiple of 8, so that SIMD functions
934
               can read 64 bits at a time. Only 33 bytes are actaully used */
935
1.04M
            UWORD8 au1_ngbr_pels[40];
936
            /* Get neighbour pixels */
937
            /* left pels */
938
1.04M
            if(u2_use_left_mb)
939
956k
            {
940
956k
                WORD32 i;
941
16.2M
                for(i = 0; i < 16; i++)
942
15.3M
                    au1_ngbr_pels[16 - 1 - i] = pu1_yleft[i * ui_rec_width];
943
956k
            }
944
90.7k
            else
945
90.7k
            {
946
90.7k
                memset(au1_ngbr_pels, 0, 16);
947
90.7k
            }
948
949
            /* top left pels */
950
1.04M
            au1_ngbr_pels[16] = *pu1_ytop_left;
951
952
            /* top pels */
953
1.04M
            if(uc_useTopMB)
954
938k
            {
955
938k
                memcpy(au1_ngbr_pels + 16 + 1, puc_top, 16);
956
938k
            }
957
108k
            else
958
108k
            {
959
108k
                memset(au1_ngbr_pels + 16 + 1, 0, 16);
960
108k
            }
961
1.04M
            PROFILE_DISABLE_INTRA_PRED()
962
1.04M
            ps_dec->apf_intra_pred_luma_16x16[u1_intrapred_mode](
963
1.04M
                            au1_ngbr_pels, pu1_luma_rec_buffer, 1, ui_rec_width,
964
1.04M
                            ((uc_useTopMB << 2) | u2_use_left_mb));
965
1.04M
        }
966
1.04M
        {
967
1.04M
            UWORD32 i;
968
1.04M
            WORD16 ai2_tmp[16];
969
17.7M
            for(i = 0; i < 16; i++)
970
16.7M
            {
971
16.7M
                WORD16 *pi2_level = pi2_y_coeff + (i << 4);
972
16.7M
                UWORD8 *pu1_pred_sblk = pu1_luma_rec_buffer
973
16.7M
                                + ((i & 0x3) * BLK_SIZE)
974
16.7M
                                + (i >> 2) * (ui_rec_width << 2);
975
16.7M
                PROFILE_DISABLE_IQ_IT_RECON()
976
16.7M
                {
977
16.7M
                    if(CHECKBIT(ps_cur_mb_info->u2_luma_csbp, i))
978
60.7k
                    {
979
60.7k
                        ps_dec->pf_iquant_itrans_recon_luma_4x4(
980
60.7k
                                        pi2_level,
981
60.7k
                                        pu1_pred_sblk,
982
60.7k
                                        pu1_pred_sblk,
983
60.7k
                                        ui_rec_width,
984
60.7k
                                        ui_rec_width,
985
60.7k
                                        gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
986
60.7k
                                        (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
987
60.7k
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 1,
988
60.7k
                                        pi2_level);
989
60.7k
                    }
990
16.6M
                    else if((CHECKBIT(u4_luma_dc_only_csbp, i)) && pi2_level[0] != 0)
991
1.48M
                    {
992
1.48M
                        ps_dec->pf_iquant_itrans_recon_luma_4x4_dc(
993
1.48M
                                        pi2_level,
994
1.48M
                                        pu1_pred_sblk,
995
1.48M
                                        pu1_pred_sblk,
996
1.48M
                                        ui_rec_width,
997
1.48M
                                        ui_rec_width,
998
1.48M
                                        gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
999
1.48M
                                        (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
1000
1.48M
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 1,
1001
1.48M
                                        pi2_level);
1002
1.48M
                    }
1003
16.7M
                }
1004
16.7M
            }
1005
1.04M
        }
1006
1.04M
    }
1007
479k
    else if(!ps_cur_mb_info->u1_tran_form8x8)
1008
384k
    {
1009
384k
        UWORD8 u1_is_left_sub_block, u1_is_top_sub_block = uc_useTopMB;
1010
384k
        UWORD8 u1_sub_blk_x, u1_sub_blk_y, u1_sub_mb_num;
1011
384k
        WORD8 i1_top_pred_mode;
1012
384k
        WORD8 i1_left_pred_mode;
1013
384k
        UWORD8 *pu1_top, *pu1_left, *pu1_top_left, *pu1_top_right;
1014
384k
        WORD8 *pi1_cur_pred_mode, *pi1_left_pred_mode, *pc_topPredMode;
1015
384k
        UWORD16 ui2_left_pred_buf_width = 0xffff;
1016
384k
        WORD8 i1_intra_pred;
1017
384k
        UWORD8 *pu1_prev_intra4x4_pred_mode_flag = pu1_prev_intra4x4_pred_mode_data;
1018
384k
        UWORD8 *pu1_rem_intra4x4_pred_mode = pu1_prev_intra4x4_pred_mode_data + 16;
1019
384k
        WORD16 *pi2_y_coeff1;
1020
384k
        UWORD8 u1_cur_sub_block;
1021
384k
        UWORD16 ui2_top_rt_mask;
1022
1023
        /*--------------------------------------------------------------------*/
1024
        /* 4x4 IntraPrediction                                                */
1025
        /*--------------------------------------------------------------------*/
1026
        /* Calculation of Top Right subblock mask                             */
1027
        /*                                                                    */
1028
        /* (a) Set it to default mask                                         */
1029
        /*     [It has 0 for sublocks which will never have top-right sub block] */
1030
        /*                                                                    */
1031
        /* (b) If top MB is not available                                     */
1032
        /*      Clear the bits of the first row sub blocks                    */
1033
        /*                                                                    */
1034
        /* (c) Set/Clear bit for top-right sublock of MB                      */
1035
        /*      [5 sub-block in decoding order] based on TOP RIGHT MB availablity */
1036
        /*--------------------------------------------------------------------*/
1037
1038
384k
        pu1_top = puc_top;
1039
1040
384k
        ui2_top_rt_mask = (u1_use_top_right_mb << 3) | (0x5750);
1041
384k
        if(uc_useTopMB)
1042
273k
            ui2_top_rt_mask |= 0x7;
1043
1044
        /*Top Related initialisations*/
1045
1046
1047
384k
        pi1_cur_pred_mode = ps_cur_mb_info->ps_curmb->pi1_intrapredmodes;
1048
384k
        pc_topPredMode = ps_cur_mb_info->ps_top_mb->pi1_intrapredmodes;
1049
        /*--------------------------------------
1050
         if(u1_mbaff)
1051
         {
1052
1053
         pi1_cur_pred_mode += (u2_mbx << 2);
1054
         pc_topPredMode = pi1_cur_pred_mode + ps_cur_mb_info->i1_offset;
1055
         pi1_cur_pred_mode += (u1_topmb) ? 0: 4;
1056
         }*/
1057
1058
384k
        if(u1_top_available)
1059
283k
        {
1060
283k
            if(ps_top_mb->u1_mb_type == I_4x4_MB)
1061
266k
                *(WORD32*)pi1_cur_pred_mode = *(WORD32*)pc_topPredMode;
1062
17.7k
            else
1063
17.7k
                *(WORD32*)pi1_cur_pred_mode =
1064
17.7k
                                (uc_useTopMB) ? DC_DC_DC_DC : NOT_VALID;
1065
283k
        }
1066
100k
        else
1067
100k
            *(WORD32*)pi1_cur_pred_mode = NOT_VALID;
1068
        /* CHANGED CODE */
1069
1070
        /* CHANGED CODE */
1071
1072
        /*Left Related initialisations*/
1073
384k
        pi1_left_pred_mode = ps_dec->pi1_left_pred_mode;
1074
384k
        if(!u1_mbaff)
1075
365k
        {
1076
1077
365k
            if(u1_left_available)
1078
336k
            {
1079
1080
336k
                if(ps_left_mb->u1_mb_type != I_4x4_MB)
1081
8.37k
                    *(WORD32*)pi1_left_pred_mode =
1082
8.37k
                                    (u2_use_left_mb_pack) ?
1083
6.31k
                                    DC_DC_DC_DC :
1084
8.37k
                                                            NOT_VALID;
1085
1086
336k
            }
1087
29.1k
            else
1088
29.1k
            {
1089
1090
29.1k
                *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1091
29.1k
            }
1092
1093
365k
        }
1094
18.9k
        else
1095
18.9k
        {
1096
18.9k
            UWORD8 u1_curMbfld = ps_cur_mb_info->u1_mb_field_decodingflag;
1097
18.9k
            UWORD8 u1_leftMbfld = ps_left_mb->u1_mb_fld;
1098
1099
18.9k
            if(u1_curMbfld ^ u1_leftMbfld)
1100
8.72k
            {
1101
1102
8.72k
                if(u1_topmb
1103
8.72k
                                | ((u1_topmb == 0)
1104
4.44k
                                                && ((ps_curmb - 1)->u1_mb_type
1105
4.44k
                                                                != I_4x4_MB)))
1106
5.62k
                {
1107
5.62k
                    if(u1_left_available)
1108
5.26k
                    {
1109
5.26k
                        if(ps_left_mb->u1_mb_type != I_4x4_MB)
1110
2.42k
                        {
1111
2.42k
                            if(CHECKBIT(u2_use_left_mb_pack,0) == 0)
1112
2.27k
                                *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1113
143
                            else
1114
143
                                *(WORD32*)pi1_left_pred_mode = DC_DC_DC_DC;
1115
2.42k
                        }
1116
5.26k
                    }
1117
357
                    else
1118
357
                        *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1119
1120
5.62k
                    if(u1_curMbfld)
1121
2.99k
                    {
1122
2.99k
                        if(u1_left_available)
1123
2.66k
                        {
1124
2.66k
                            if((ps_left_mb + 1)->u1_mb_type != I_4x4_MB)
1125
1.18k
                            {
1126
1.18k
                                if(u2_use_left_mb_pack >> 8)
1127
49
                                    *(WORD32*)(pi1_left_pred_mode + 4) =
1128
49
                                                    DC_DC_DC_DC;
1129
1.14k
                                else
1130
1.14k
                                    *(WORD32*)(pi1_left_pred_mode + 4) =
1131
1.14k
                                                    NOT_VALID;
1132
1.18k
                            }
1133
2.66k
                        }
1134
330
                        else
1135
330
                            *(WORD32*)(pi1_left_pred_mode + 4) = NOT_VALID;
1136
2.99k
                        pi1_left_pred_mode[1] = pi1_left_pred_mode[2];
1137
2.99k
                        pi1_left_pred_mode[2] = pi1_left_pred_mode[4];
1138
2.99k
                        pi1_left_pred_mode[3] = pi1_left_pred_mode[6];
1139
2.99k
                        *(WORD32*)(pi1_left_pred_mode + 4) =
1140
2.99k
                                        *(WORD32*)pi1_left_pred_mode;
1141
2.99k
                    }
1142
2.62k
                    else
1143
2.62k
                    {
1144
1145
2.62k
                        pi1_left_pred_mode[7] = pi1_left_pred_mode[3];
1146
2.62k
                        pi1_left_pred_mode[6] = pi1_left_pred_mode[3];
1147
2.62k
                        pi1_left_pred_mode[5] = pi1_left_pred_mode[2];
1148
2.62k
                        pi1_left_pred_mode[4] = pi1_left_pred_mode[2];
1149
2.62k
                        pi1_left_pred_mode[3] = pi1_left_pred_mode[1];
1150
2.62k
                        pi1_left_pred_mode[2] = pi1_left_pred_mode[1];
1151
2.62k
                        pi1_left_pred_mode[1] = pi1_left_pred_mode[0];
1152
2.62k
                    }
1153
5.62k
                }
1154
8.72k
                pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
1155
8.72k
            }
1156
10.2k
            else
1157
10.2k
            {
1158
1159
10.2k
                pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
1160
10.2k
                if(u1_left_available)
1161
9.34k
                {
1162
1163
9.34k
                    if(ps_left_mb->u1_mb_type != I_4x4_MB)
1164
4.33k
                        *(WORD32*)pi1_left_pred_mode =
1165
4.33k
                                        (u2_use_left_mb_pack) ?
1166
383
                                        DC_DC_DC_DC :
1167
4.33k
                                                                NOT_VALID;
1168
9.34k
                }
1169
881
                else
1170
881
                    *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1171
10.2k
            }
1172
18.9k
        }
1173
        /* One time pointer initialisations*/
1174
384k
        pi2_y_coeff1 = pi2_y_coeff;
1175
384k
        pu1_top_left = pu1_ytop_left;
1176
1177
        /* Scan the sub-blocks in Raster Scan Order */
1178
6.53M
        for(u1_sub_mb_num = 0; u1_sub_mb_num < 16; u1_sub_mb_num++)
1179
6.14M
        {
1180
            /* Align the size to multiple of 8, so that SIMD functions
1181
               can read 64 bits at a time. Only 13 bytes are actaully used */
1182
6.14M
            UWORD8 au1_ngbr_pels[16];
1183
1184
6.14M
            u1_sub_blk_x = u1_sub_mb_num & 0x3;
1185
6.14M
            u1_sub_blk_y = u1_sub_mb_num >> 2;
1186
6.14M
            i1_top_pred_mode = pi1_cur_pred_mode[u1_sub_blk_x];
1187
6.14M
            i1_left_pred_mode = pi1_left_pred_mode[u1_sub_blk_y];
1188
6.14M
            u1_use_top_right_mb = (!!CHECKBIT(ui2_top_rt_mask, u1_sub_mb_num));
1189
1190
            /*********** left subblock availability**********/
1191
6.14M
            if(u1_sub_blk_x)
1192
4.60M
                u1_is_left_sub_block = 1;
1193
1.53M
            else
1194
1.53M
                u1_is_left_sub_block =
1195
1.53M
                                (u1_sub_blk_y < 2) ?
1196
768k
                                                (CHECKBIT(u2_use_left_mb_pack,
1197
768k
                                                          0)) :
1198
1.53M
                                                (u2_use_left_mb_pack >> 8);
1199
1200
            /* CHANGED CODE */
1201
6.14M
            if(u1_sub_blk_y)
1202
4.60M
                u1_is_top_sub_block = 1;
1203
1204
            /* CHANGED CODE */
1205
            /***************** Top *********************/
1206
6.14M
            if(ps_dec->u4_use_intrapred_line_copy == 1)
1207
5.84M
            {
1208
1209
5.84M
                if(u1_sub_blk_y)
1210
4.38M
                    pu1_top = pu1_luma_rec_buffer - ui_rec_width;
1211
1.46M
                else
1212
1.46M
                    pu1_top = puc_top + (u1_sub_blk_x << 2);
1213
5.84M
            }
1214
304k
            else
1215
304k
            {
1216
304k
                pu1_top = pu1_luma_rec_buffer - ui_rec_width;
1217
304k
            }
1218
            /***************** Top Right *********************/
1219
6.14M
            pu1_top_right = pu1_top + 4;
1220
            /***************** Top Left *********************/
1221
6.14M
            pu1_top_left = pu1_top - 1;
1222
            /***************** Left *********************/
1223
6.14M
            pu1_left = pu1_luma_rec_buffer - 1;
1224
            /* CHANGED CODE */
1225
1226
            /*---------------------------------------------------------------*/
1227
            /* Calculation of Intra prediction mode                          */
1228
            /*---------------------------------------------------------------*/
1229
6.14M
            i1_intra_pred = ((i1_left_pred_mode < 0) | (i1_top_pred_mode < 0)) ?
1230
5.55M
                            DC : MIN(i1_left_pred_mode, i1_top_pred_mode);
1231
6.14M
            {
1232
6.14M
                UWORD8 u1_packed_modes = (u1_is_top_sub_block << 1)
1233
6.14M
                                + u1_is_left_sub_block;
1234
6.14M
                UWORD8 *pu1_intra_err_codes =
1235
6.14M
                                (UWORD8 *)gau1_ih264d_intra_pred_err_code;
1236
6.14M
                UWORD8 uc_b2b0 = ((u1_sub_mb_num & 4) >> 1) | (u1_sub_mb_num & 1);
1237
6.14M
                UWORD8 uc_b3b1 = ((u1_sub_mb_num & 8) >> 2)
1238
6.14M
                                | ((u1_sub_mb_num & 2) >> 1);
1239
1240
6.14M
                u1_cur_sub_block = (uc_b3b1 << 2) + uc_b2b0;
1241
6.14M
                PROFILE_DISABLE_INTRA_PRED()
1242
6.14M
                if(!pu1_prev_intra4x4_pred_mode_flag[u1_cur_sub_block])
1243
238k
                {
1244
238k
                    i1_intra_pred =
1245
238k
                                    pu1_rem_intra4x4_pred_mode[u1_cur_sub_block]
1246
238k
                                                    + (pu1_rem_intra4x4_pred_mode[u1_cur_sub_block]
1247
238k
                                                                    >= i1_intra_pred);
1248
238k
                }
1249
6.14M
                i1_intra_pred = CLIP3(0, 8, i1_intra_pred);
1250
6.14M
                {
1251
6.14M
                    UWORD8 u1_err_code = pu1_intra_err_codes[i1_intra_pred];
1252
1253
6.14M
                    if((u1_err_code & u1_packed_modes) ^ u1_err_code)
1254
23.2k
                     {
1255
23.2k
                        i1_intra_pred = 0;
1256
23.2k
                        ps_dec->i4_error_code = ERROR_INTRAPRED;
1257
23.2k
                     }
1258
1259
6.14M
                }
1260
6.14M
            }
1261
6.14M
            {
1262
                /* Get neighbour pixels */
1263
                /* left pels */
1264
6.14M
                if(u1_is_left_sub_block)
1265
5.98M
                {
1266
5.98M
                    WORD32 i;
1267
29.9M
                    for(i = 0; i < 4; i++)
1268
23.9M
                        au1_ngbr_pels[4 - 1 - i] = pu1_left[i * ui_rec_width];
1269
5.98M
                }
1270
164k
                else
1271
164k
                {
1272
164k
                    memset(au1_ngbr_pels, 0, 4);
1273
164k
                }
1274
1275
                /* top left pels */
1276
6.14M
                au1_ngbr_pels[4] = *pu1_top_left;
1277
1278
                /* top pels */
1279
6.14M
                if(u1_is_top_sub_block)
1280
5.70M
                {
1281
5.70M
                    memcpy(au1_ngbr_pels + 4 + 1, pu1_top, 4);
1282
5.70M
                }
1283
441k
                else
1284
441k
                {
1285
441k
                    memset(au1_ngbr_pels + 4 + 1, 0, 4);
1286
441k
                }
1287
1288
                /* top right pels */
1289
6.14M
                if(u1_use_top_right_mb)
1290
3.76M
                {
1291
3.76M
                    memcpy(au1_ngbr_pels + 4 * 2 + 1, pu1_top_right, 4);
1292
3.76M
                }
1293
2.38M
                else if(u1_is_top_sub_block)
1294
1.94M
                {
1295
1.94M
                    memset(au1_ngbr_pels + 4 * 2 + 1, au1_ngbr_pels[4 * 2], 4);
1296
1.94M
                }
1297
6.14M
            }
1298
6.14M
            PROFILE_DISABLE_INTRA_PRED()
1299
6.14M
            ps_dec->apf_intra_pred_luma_4x4[i1_intra_pred](
1300
6.14M
                            au1_ngbr_pels, pu1_luma_rec_buffer, 1,
1301
6.14M
                            ui_rec_width,
1302
6.14M
                            ((u1_is_top_sub_block << 2) | u1_is_left_sub_block));
1303
1304
            /* CHANGED CODE */
1305
6.14M
            if(CHECKBIT(ui2_luma_csbp, u1_sub_mb_num))
1306
147k
            {
1307
147k
                WORD16 ai2_tmp[16];
1308
147k
                PROFILE_DISABLE_IQ_IT_RECON()
1309
147k
                {
1310
147k
                    if(CHECKBIT(u4_luma_dc_only_csbp, u1_sub_mb_num))
1311
39.3k
                    {
1312
39.3k
                        ps_dec->pf_iquant_itrans_recon_luma_4x4_dc(
1313
39.3k
                                        pi2_y_coeff1,
1314
39.3k
                                        pu1_luma_rec_buffer,
1315
39.3k
                                        pu1_luma_rec_buffer,
1316
39.3k
                                        ui_rec_width,
1317
39.3k
                                        ui_rec_width,
1318
39.3k
                                        gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
1319
39.3k
                                        (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
1320
39.3k
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
1321
39.3k
                                        NULL);
1322
39.3k
                    }
1323
108k
                    else
1324
108k
                    {
1325
108k
                        ps_dec->pf_iquant_itrans_recon_luma_4x4(
1326
108k
                                        pi2_y_coeff1,
1327
108k
                                        pu1_luma_rec_buffer,
1328
108k
                                        pu1_luma_rec_buffer,
1329
108k
                                        ui_rec_width,
1330
108k
                                        ui_rec_width,
1331
108k
                                        gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qp_rem6],
1332
108k
                                        (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[0],
1333
108k
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
1334
108k
                                        NULL);
1335
108k
                    }
1336
147k
                }
1337
1338
147k
            }
1339
1340
            /*---------------------------------------------------------------*/
1341
            /* Update sub block number                                       */
1342
            /*---------------------------------------------------------------*/
1343
6.14M
            pi2_y_coeff1 += 16;
1344
6.14M
            pu1_luma_rec_buffer +=
1345
6.14M
                            (u1_sub_blk_x == 3) ? (ui_rec_width << 2) - 12 : 4;
1346
6.14M
            pu1_luma_pred_buffer +=
1347
6.14M
                            (u1_sub_blk_x == 3) ? (ui_pred_width << 2) - 12 : 4;
1348
            /* CHANGED CODE */
1349
6.14M
            pi1_cur_pred_mode[u1_sub_blk_x] = i1_intra_pred;
1350
6.14M
            pi1_left_pred_mode[u1_sub_blk_y] = i1_intra_pred;
1351
6.14M
        }
1352
384k
    }
1353
95.3k
    else if((u1_mb_type == I_4x4_MB) && (ps_cur_mb_info->u1_tran_form8x8 == 1))
1354
95.3k
    {
1355
95.3k
        UWORD8 u1_is_left_sub_block, u1_is_top_sub_block = uc_useTopMB;
1356
95.3k
        UWORD8 u1_sub_blk_x, u1_sub_blk_y;
1357
95.3k
        UWORD32 u4_sub_mb_num;
1358
95.3k
        WORD8 i1_top_pred_mode;
1359
95.3k
        WORD8 i1_left_pred_mode;
1360
95.3k
        UWORD8 *pu1_top, *pu1_left, *pu1_top_left;
1361
95.3k
        WORD8 *pi1_cur_pred_mode, *pi1_left_pred_mode, *pc_topPredMode;
1362
95.3k
        UWORD16 ui2_left_pred_buf_width = 0xffff;
1363
95.3k
        WORD8 i1_intra_pred;
1364
95.3k
        UWORD8 *pu1_prev_intra4x4_pred_mode_flag = pu1_prev_intra4x4_pred_mode_data;
1365
95.3k
        UWORD8 *pu1_rem_intra4x4_pred_mode = pu1_prev_intra4x4_pred_mode_data + 4;
1366
95.3k
        WORD16 *pi2_y_coeff1;
1367
95.3k
        UWORD16 ui2_top_rt_mask;
1368
95.3k
        UWORD32 u4_4x4_left_offset = 0;
1369
1370
        /*--------------------------------------------------------------------*/
1371
        /* 8x8 IntraPrediction                                                */
1372
        /*--------------------------------------------------------------------*/
1373
        /* Calculation of Top Right subblock mask                             */
1374
        /*                                                                    */
1375
        /* (a) Set it to default mask                                         */
1376
        /*  [It has 0 for sublocks which will never have top-right sub block] */
1377
        /*                                                                    */
1378
        /* (b) If top MB is not available                                     */
1379
        /*      Clear the bits of the first row sub blocks                    */
1380
        /*                                                                    */
1381
        /* (c) Set/Clear bit for top-right sublock of MB                      */
1382
        /*  [5 sub-block in decoding order] based on TOP RIGHT MB availablity */
1383
        /*                                                                    */
1384
        /* ui2_top_rt_mask: marks availibility of top right(neighbour)         */
1385
        /* in the 8x8 Block ordering                                          */
1386
        /*                                                                    */
1387
        /*      tr0   tr1                                                     */
1388
        /*   0    1   tr3                                                     */
1389
        /*   2    3                                                           */
1390
        /*                                                                    */
1391
        /*  Top rights for 0 is in top MB                                     */
1392
        /*  top right of 1 will be in top right MB                            */
1393
        /*  top right of 3 in right MB and hence not available                */
1394
        /*  This corresponds to ui2_top_rt_mask  having default value 0x4      */
1395
        /*--------------------------------------------------------------------*/
1396
1397
95.3k
        ui2_top_rt_mask = (u1_use_top_right_mb << 1) | (0x4);
1398
1399
95.3k
        if(uc_useTopMB)
1400
64.9k
        {
1401
64.9k
            ui2_top_rt_mask |= 0x1;
1402
64.9k
        }
1403
1404
        /* Top Related initialisations */
1405
95.3k
        pi1_cur_pred_mode = ps_cur_mb_info->ps_curmb->pi1_intrapredmodes;
1406
95.3k
        pc_topPredMode = ps_cur_mb_info->ps_top_mb->pi1_intrapredmodes;
1407
        /*
1408
         if(u1_mbaff)
1409
         {
1410
         pi1_cur_pred_mode += (u2_mbx << 2);
1411
         pc_topPredMode = pi1_cur_pred_mode + ps_cur_mb_info->i1_offset;
1412
         pi1_cur_pred_mode += (u1_topmb) ? 0: 4;
1413
         }
1414
         */
1415
95.3k
        if(u1_top_available)
1416
71.7k
        {
1417
71.7k
            if(ps_top_mb->u1_mb_type == I_4x4_MB)
1418
56.5k
            {
1419
56.5k
                *(WORD32*)pi1_cur_pred_mode = *(WORD32*)pc_topPredMode;
1420
56.5k
            }
1421
15.1k
            else
1422
15.1k
            {
1423
15.1k
                *(WORD32*)pi1_cur_pred_mode =
1424
15.1k
                                (uc_useTopMB) ? DC_DC_DC_DC : NOT_VALID;
1425
15.1k
            }
1426
71.7k
        }
1427
23.6k
        else
1428
23.6k
        {
1429
23.6k
            *(WORD32*)pi1_cur_pred_mode = NOT_VALID;
1430
23.6k
        }
1431
1432
95.3k
        pu1_top = puc_top - 8;
1433
1434
        /*Left Related initialisations*/
1435
95.3k
        pi1_left_pred_mode = ps_dec->pi1_left_pred_mode;
1436
1437
95.3k
        if(!u1_mbaff)
1438
77.0k
        {
1439
77.0k
            if(u1_left_available)
1440
56.4k
            {
1441
56.4k
                if(ps_left_mb->u1_mb_type != I_4x4_MB)
1442
7.19k
                {
1443
7.19k
                    *(WORD32*)pi1_left_pred_mode =
1444
7.19k
                                    (u2_use_left_mb_pack) ?
1445
5.11k
                                    DC_DC_DC_DC :
1446
7.19k
                                                            NOT_VALID;
1447
7.19k
                }
1448
56.4k
            }
1449
20.5k
            else
1450
20.5k
            {
1451
20.5k
                *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1452
20.5k
            }
1453
77.0k
        }
1454
18.3k
        else
1455
18.3k
        {
1456
18.3k
            UWORD8 u1_curMbfld = ps_cur_mb_info->u1_mb_field_decodingflag;
1457
1458
18.3k
            UWORD8 u1_leftMbfld = ps_left_mb->u1_mb_fld;
1459
1460
18.3k
            if((!u1_curMbfld) && (u1_leftMbfld))
1461
2.64k
            {
1462
2.64k
                u4_4x4_left_offset = 1;
1463
2.64k
            }
1464
1465
18.3k
            if(u1_curMbfld ^ u1_leftMbfld)
1466
6.45k
            {
1467
1468
6.45k
                if(u1_topmb
1469
6.45k
                                | ((u1_topmb == 0)
1470
3.14k
                                                && ((ps_curmb - 1)->u1_mb_type
1471
3.14k
                                                                != I_4x4_MB)))
1472
1473
3.98k
                {
1474
3.98k
                    if(u1_left_available)
1475
3.61k
                    {
1476
3.61k
                        if(ps_left_mb->u1_mb_type != I_4x4_MB)
1477
1.38k
                        {
1478
1.38k
                            if(CHECKBIT(u2_use_left_mb_pack,0) == 0)
1479
1.08k
                            {
1480
1.08k
                                *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1481
1.08k
                            }
1482
300
                            else
1483
300
                            {
1484
300
                                *(WORD32*)pi1_left_pred_mode = DC_DC_DC_DC;
1485
300
                            }
1486
1.38k
                        }
1487
3.61k
                    }
1488
375
                    else
1489
375
                    {
1490
375
                        *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1491
375
                    }
1492
1493
3.98k
                    if(u1_curMbfld)
1494
2.20k
                    {
1495
2.20k
                        if(u1_left_available)
1496
1.83k
                        {
1497
1.83k
                            if((ps_left_mb + 1)->u1_mb_type != I_4x4_MB)
1498
866
                            {
1499
866
                                if(u2_use_left_mb_pack >> 8)
1500
207
                                {
1501
207
                                    *(WORD32*)(pi1_left_pred_mode + 4) =
1502
207
                                                    DC_DC_DC_DC;
1503
207
                                }
1504
659
                                else
1505
659
                                {
1506
659
                                    *(WORD32*)(pi1_left_pred_mode + 4) =
1507
659
                                                    NOT_VALID;
1508
659
                                }
1509
866
                            }
1510
1.83k
                        }
1511
363
                        else
1512
363
                        {
1513
363
                            *(WORD32*)(pi1_left_pred_mode + 4) = NOT_VALID;
1514
363
                        }
1515
1516
2.20k
                        pi1_left_pred_mode[1] = pi1_left_pred_mode[2];
1517
2.20k
                        pi1_left_pred_mode[2] = pi1_left_pred_mode[4];
1518
2.20k
                        pi1_left_pred_mode[3] = pi1_left_pred_mode[6];
1519
2.20k
                        *(WORD32*)(pi1_left_pred_mode + 4) =
1520
2.20k
                                        *(WORD32*)pi1_left_pred_mode;
1521
2.20k
                    }
1522
1.78k
                    else
1523
1.78k
                    {
1524
1.78k
                        pi1_left_pred_mode[7] = pi1_left_pred_mode[3];
1525
1.78k
                        pi1_left_pred_mode[6] = pi1_left_pred_mode[3];
1526
1.78k
                        pi1_left_pred_mode[5] = pi1_left_pred_mode[2];
1527
1.78k
                        pi1_left_pred_mode[4] = pi1_left_pred_mode[2];
1528
1.78k
                        pi1_left_pred_mode[3] = pi1_left_pred_mode[1];
1529
1.78k
                        pi1_left_pred_mode[2] = pi1_left_pred_mode[1];
1530
1.78k
                        pi1_left_pred_mode[1] = pi1_left_pred_mode[0];
1531
1.78k
                    }
1532
3.98k
                }
1533
6.45k
                pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
1534
6.45k
            }
1535
11.9k
            else
1536
11.9k
            {
1537
11.9k
                pi1_left_pred_mode += (u1_topmb) ? 0 : 4;
1538
1539
11.9k
                if(u1_left_available)
1540
11.2k
                {
1541
11.2k
                    if(ps_left_mb->u1_mb_type != I_4x4_MB)
1542
3.56k
                    {
1543
3.56k
                        *(WORD32*)pi1_left_pred_mode =
1544
3.56k
                                        (u2_use_left_mb_pack) ?
1545
1.28k
                                        DC_DC_DC_DC :
1546
3.56k
                                                                NOT_VALID;
1547
3.56k
                    }
1548
11.2k
                }
1549
725
                else
1550
725
                {
1551
725
                    *(WORD32*)pi1_left_pred_mode = NOT_VALID;
1552
725
                }
1553
11.9k
            }
1554
18.3k
        }
1555
1556
        /* One time pointer initialisations*/
1557
95.3k
        pi2_y_coeff1 = pi2_y_coeff;
1558
1559
95.3k
        if(u1_use_top_left_mb)
1560
50.3k
        {
1561
50.3k
            pu1_top_left = pu1_ytop_left;
1562
50.3k
        }
1563
45.0k
        else
1564
45.0k
        {
1565
45.0k
            pu1_top_left = NULL;
1566
45.0k
        }
1567
1568
        /* Scan the sub-blocks in Raster Scan Order */
1569
476k
        for(u4_sub_mb_num = 0; u4_sub_mb_num < 4; u4_sub_mb_num++)
1570
381k
        {
1571
381k
            u1_sub_blk_x = (u4_sub_mb_num & 0x1);
1572
381k
            u1_sub_blk_y = (u4_sub_mb_num >> 1);
1573
381k
            i1_top_pred_mode = pi1_cur_pred_mode[u1_sub_blk_x << 1];
1574
381k
            i1_left_pred_mode = pi1_left_pred_mode[u1_sub_blk_y << 1];
1575
1576
381k
            if(2 == u4_sub_mb_num)
1577
95.3k
            {
1578
95.3k
                i1_left_pred_mode = pi1_left_pred_mode[(u1_sub_blk_y << 1)
1579
95.3k
                                + u4_4x4_left_offset];
1580
95.3k
            }
1581
1582
381k
            u1_use_top_right_mb = (!!CHECKBIT(ui2_top_rt_mask, u4_sub_mb_num));
1583
1584
            /*********** left subblock availability**********/
1585
381k
            if(u1_sub_blk_x)
1586
190k
            {
1587
190k
                u1_is_left_sub_block = 1;
1588
190k
            }
1589
190k
            else
1590
190k
            {
1591
190k
                u1_is_left_sub_block =
1592
190k
                                (u1_sub_blk_y < 1) ?
1593
95.3k
                                                (CHECKBIT(u2_use_left_mb_pack,
1594
95.3k
                                                          0)) :
1595
190k
                                                (u2_use_left_mb_pack >> 8);
1596
190k
            }
1597
1598
            /***************** Top *********************/
1599
381k
            if(u1_sub_blk_y)
1600
190k
            {
1601
190k
                u1_is_top_sub_block = 1;
1602
                // sushant
1603
190k
                pu1_top = /*pu1_luma_pred_buffer*/pu1_luma_rec_buffer - ui_rec_width;
1604
190k
            }
1605
190k
            else
1606
190k
            {
1607
190k
                pu1_top += 8;
1608
190k
            }
1609
1610
            /***************** Left *********************/
1611
381k
            if((u1_sub_blk_x) | (u4_num_pmbair != 0))
1612
337k
            {
1613
                // sushant
1614
337k
                pu1_left = /*pu1_luma_pred_buffer*/pu1_luma_rec_buffer - 1;
1615
337k
                ui2_left_pred_buf_width = ui_rec_width;
1616
337k
            }
1617
43.9k
            else
1618
43.9k
            {
1619
43.9k
                pu1_left = pu1_yleft;
1620
43.9k
                pu1_yleft += (ui_rec_width << 3);
1621
43.9k
                ui2_left_pred_buf_width = ui_rec_width;
1622
43.9k
            }
1623
1624
            /***************** Top Left *********************/
1625
381k
            if(u4_sub_mb_num)
1626
286k
            {
1627
286k
                pu1_top_left = (u1_sub_blk_x) ?
1628
190k
                                pu1_top - 1 : pu1_left - ui_rec_width;
1629
1630
286k
                if((u1_sub_blk_x && (!u1_is_top_sub_block))
1631
255k
                                || ((!u1_sub_blk_x) && (!u1_is_left_sub_block)))
1632
58.7k
                {
1633
58.7k
                    pu1_top_left = NULL;
1634
58.7k
                }
1635
286k
            }
1636
1637
            /*---------------------------------------------------------------*/
1638
            /* Calculation of Intra prediction mode                          */
1639
            /*---------------------------------------------------------------*/
1640
381k
            i1_intra_pred = ((i1_left_pred_mode < 0) | (i1_top_pred_mode < 0)) ?
1641
274k
                            DC : MIN(i1_left_pred_mode, i1_top_pred_mode);
1642
381k
            {
1643
381k
                UWORD8 u1_packed_modes = (u1_is_top_sub_block << 1)
1644
381k
                                + u1_is_left_sub_block;
1645
381k
                UWORD8 *pu1_intra_err_codes =
1646
381k
                                (UWORD8 *)gau1_ih264d_intra_pred_err_code;
1647
1648
                /********************************************************************/
1649
                /* Same intra4x4_pred_mode array is filled with intra4x4_pred_mode  */
1650
                /* for a MB with 8x8 intrapredicition                               */
1651
                /********************************************************************/
1652
381k
                PROFILE_DISABLE_INTRA_PRED()
1653
381k
                if(!pu1_prev_intra4x4_pred_mode_flag[u4_sub_mb_num])
1654
82.9k
                {
1655
82.9k
                    i1_intra_pred = pu1_rem_intra4x4_pred_mode[u4_sub_mb_num]
1656
82.9k
                                    + (pu1_rem_intra4x4_pred_mode[u4_sub_mb_num]
1657
82.9k
                                                    >= i1_intra_pred);
1658
82.9k
                }
1659
381k
                i1_intra_pred = CLIP3(0, 8, i1_intra_pred);
1660
381k
                {
1661
381k
                    UWORD8 u1_err_code = pu1_intra_err_codes[i1_intra_pred];
1662
1663
381k
                    if((u1_err_code & u1_packed_modes) ^ u1_err_code)
1664
11.6k
                    {
1665
11.6k
                        i1_intra_pred = 0;
1666
11.6k
                        ps_dec->i4_error_code = ERROR_INTRAPRED;
1667
11.6k
                    }
1668
381k
                }
1669
381k
            }
1670
1671
381k
            {
1672
                /* Align the size to multiple of 8, so that SIMD functions
1673
                can read 64 bits at a time. Only 25 bytes are actaully used */
1674
381k
                UWORD8 au1_ngbr_pels[32] = {0};
1675
381k
                WORD32 ngbr_avail;
1676
381k
                ngbr_avail = u1_is_left_sub_block << 0;
1677
381k
                ngbr_avail |= u1_is_top_sub_block << 2;
1678
1679
381k
                if(pu1_top_left)
1680
277k
                    ngbr_avail |= 1 << 1;
1681
1682
381k
                ngbr_avail |= u1_use_top_right_mb << 3;
1683
381k
                PROFILE_DISABLE_INTRA_PRED()
1684
381k
                {
1685
381k
                    ps_dec->pf_intra_pred_ref_filtering(pu1_left, pu1_top_left,
1686
381k
                                                        pu1_top, au1_ngbr_pels,
1687
381k
                                                        ui2_left_pred_buf_width,
1688
381k
                                                        ngbr_avail);
1689
1690
381k
                    ps_dec->apf_intra_pred_luma_8x8[i1_intra_pred](
1691
381k
                                    au1_ngbr_pels, pu1_luma_rec_buffer, 1,
1692
381k
                                    ui_rec_width,
1693
381k
                                    ((u1_is_top_sub_block << 2) | u1_is_left_sub_block));
1694
381k
                }
1695
381k
            }
1696
1697
            /* Inverse Transform and Reconstruction */
1698
381k
            if(CHECKBIT(ps_cur_mb_info->u1_cbp, u4_sub_mb_num))
1699
211k
            {
1700
211k
                WORD16 *pi2_scale_matrix_ptr;
1701
211k
                WORD16 ai2_tmp[64];
1702
1703
211k
                pi2_scale_matrix_ptr =
1704
211k
                                ps_dec->s_high_profile.i2_scalinglist8x8[0];
1705
211k
                PROFILE_DISABLE_IQ_IT_RECON()
1706
211k
                {
1707
211k
                    if(CHECKBIT(u4_luma_dc_only_cbp, u4_sub_mb_num))
1708
21.4k
                    {
1709
21.4k
                        ps_dec->pf_iquant_itrans_recon_luma_8x8_dc(
1710
21.4k
                                        pi2_y_coeff1,
1711
21.4k
                                        pu1_luma_rec_buffer,
1712
21.4k
                                        pu1_luma_rec_buffer,
1713
21.4k
                                        ui_rec_width,
1714
21.4k
                                        ui_rec_width,
1715
21.4k
                                        gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
1716
21.4k
                                        (UWORD16 *)pi2_scale_matrix_ptr,
1717
21.4k
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
1718
21.4k
                                        NULL);
1719
21.4k
                    }
1720
190k
                    else
1721
190k
                    {
1722
190k
                        ps_dec->pf_iquant_itrans_recon_luma_8x8(
1723
190k
                                        pi2_y_coeff1,
1724
190k
                                        pu1_luma_rec_buffer,
1725
190k
                                        pu1_luma_rec_buffer,
1726
190k
                                        ui_rec_width,
1727
190k
                                        ui_rec_width,
1728
190k
                                        gau1_ih264d_dequant8x8_cavlc[ps_cur_mb_info->u1_qp_rem6],
1729
190k
                                        (UWORD16 *)pi2_scale_matrix_ptr,
1730
190k
                                        ps_cur_mb_info->u1_qp_div6, ai2_tmp, 0,
1731
190k
                                        NULL);
1732
190k
                    }
1733
211k
                }
1734
1735
211k
            }
1736
1737
            /*---------------------------------------------------------------*/
1738
            /* Update sub block number                                       */
1739
            /*---------------------------------------------------------------*/
1740
381k
            pi2_y_coeff1 += 64;
1741
1742
381k
            pu1_luma_rec_buffer +=
1743
381k
                            (u1_sub_blk_x == 1) ?
1744
190k
                                            (ui_rec_width << 3) - (8 * 1) : 8;
1745
1746
            /*---------------------------------------------------------------*/
1747
            /* Pred mode filled in terms of 4x4 block so replicated in 2     */
1748
            /* locations.                                                    */
1749
            /*---------------------------------------------------------------*/
1750
381k
            pi1_cur_pred_mode[u1_sub_blk_x << 1] = i1_intra_pred;
1751
381k
            pi1_cur_pred_mode[(u1_sub_blk_x << 1) + 1] = i1_intra_pred;
1752
381k
            pi1_left_pred_mode[u1_sub_blk_y << 1] = i1_intra_pred;
1753
381k
            pi1_left_pred_mode[(u1_sub_blk_y << 1) + 1] = i1_intra_pred;
1754
381k
        }
1755
95.3k
    }
1756
    /* Decode Chroma Block */
1757
1.52M
    ih264d_unpack_chroma_coeff4x4_mb(ps_dec,
1758
1.52M
                                     ps_cur_mb_info);
1759
    /*--------------------------------------------------------------------*/
1760
    /* Chroma Blocks decoding                                             */
1761
    /*--------------------------------------------------------------------*/
1762
1.52M
    {
1763
1.52M
        UWORD8 u1_intra_chrom_pred_mode;
1764
1.52M
        UWORD8 u1_chroma_cbp = (UWORD8)(ps_cur_mb_info->u1_cbp >> 4);
1765
1766
        /*--------------------------------------------------------------------*/
1767
        /* Perform Chroma intra prediction                                    */
1768
        /*--------------------------------------------------------------------*/
1769
1770
1.52M
        u1_intra_chrom_pred_mode = CHROMA_TO_LUMA_INTRA_MODE(
1771
1.52M
                        ps_cur_mb_info->u1_chroma_pred_mode);
1772
1773
1.52M
        {
1774
1.52M
            UWORD8 u1_packed_modes = (u1_top_available << 1)
1775
1.52M
                            + u1_left_available;
1776
1.52M
            UWORD8 u1_err_code =
1777
1.52M
                            (u1_intra_chrom_pred_mode & 1) ?
1778
563k
                                            u1_intra_chrom_pred_mode :
1779
1.52M
                                            (u1_intra_chrom_pred_mode ^ 2);
1780
1.52M
            if((u1_err_code & u1_packed_modes) ^ u1_err_code)
1781
45.0k
            {
1782
45.0k
                u1_intra_chrom_pred_mode = 0;
1783
45.0k
                ps_dec->i4_error_code = ERROR_INTRAPRED;
1784
45.0k
            }
1785
1.52M
        }
1786
1787
        /* CHANGED CODE */
1788
1.52M
        if(u1_chroma_cbp != CBPC_ALLZERO)
1789
118k
        {
1790
118k
            UWORD16 u2_chroma_csbp =
1791
118k
                            (u1_chroma_cbp == CBPC_ACZERO) ?
1792
71.2k
                                            0 : ps_cur_mb_info->u2_chroma_csbp;
1793
118k
            UWORD32 u4_scale_u;
1794
118k
            UWORD32 u4_scale_v;
1795
1796
118k
            {
1797
118k
                UWORD16 au2_ngbr_pels[33];
1798
118k
                UWORD8 *pu1_ngbr_pels = (UWORD8 *)au2_ngbr_pels;
1799
118k
                UWORD16 *pu2_left_uv;
1800
118k
                UWORD16 *pu2_topleft_uv;
1801
118k
                WORD32 use_left1 = (u2_use_left_mb_pack & 0x0ff);
1802
118k
                WORD32 use_left2 = (u2_use_left_mb_pack & 0xff00) >> 8;
1803
1804
118k
                pu2_left_uv = (UWORD16 *)pu1_uleft;
1805
118k
                pu2_topleft_uv = (UWORD16 *)pu1_u_top_left;
1806
                /* Get neighbour pixels */
1807
                /* left pels */
1808
118k
                if(u2_use_left_mb_pack)
1809
76.3k
                {
1810
76.3k
                    WORD32 i;
1811
76.3k
                    if(use_left1)
1812
75.9k
                    {
1813
379k
                        for(i = 0; i < 4; i++)
1814
303k
                            au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
1815
303k
                                            * u4_recwidth_cr / YUV420SP_FACTOR];
1816
75.9k
                    }
1817
393
                    else
1818
393
                    {
1819
393
                        memset(au2_ngbr_pels + 4, 0, 4 * sizeof(UWORD16));
1820
393
                    }
1821
1822
76.3k
                    if(use_left2)
1823
75.8k
                    {
1824
379k
                        for(i = 4; i < 8; i++)
1825
303k
                            au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
1826
303k
                                            * u4_recwidth_cr / YUV420SP_FACTOR];
1827
75.8k
                    }
1828
459
                    else
1829
459
                    {
1830
459
                        memset(au2_ngbr_pels, 0, 4 * sizeof(UWORD16));
1831
459
                    }
1832
76.3k
                }
1833
41.7k
                else
1834
41.7k
                {
1835
41.7k
                    memset(au2_ngbr_pels, 0, 8 * sizeof(UWORD16));
1836
41.7k
                }
1837
1838
                /* top left pels */
1839
118k
                au2_ngbr_pels[8] = *pu2_topleft_uv;
1840
1841
                /* top pels */
1842
118k
                if(uc_useTopMB)
1843
81.1k
                {
1844
81.1k
                    memcpy(au2_ngbr_pels + 8 + 1, pu1_top_u,
1845
81.1k
                           8 * sizeof(UWORD16));
1846
81.1k
                }
1847
36.9k
                else
1848
36.9k
                {
1849
36.9k
                    memset(au2_ngbr_pels + 8 + 1, 0, 8 * sizeof(UWORD16));
1850
36.9k
                }
1851
1852
118k
                PROFILE_DISABLE_INTRA_PRED()
1853
118k
                ps_dec->apf_intra_pred_chroma[u1_intra_chrom_pred_mode](
1854
118k
                                pu1_ngbr_pels,
1855
118k
                                pu1_mb_cb_rei1_buffer,
1856
118k
                                1,
1857
118k
                                u4_recwidth_cr,
1858
118k
                                ((uc_useTopMB << 2) | (use_left2 << 4)
1859
118k
                                                | use_left1));
1860
118k
            }
1861
118k
            u4_scale_u = ps_cur_mb_info->u1_qpc_div6;
1862
118k
            u4_scale_v = ps_cur_mb_info->u1_qpcr_div6;
1863
118k
            pi2_y_coeff = ps_dec->pi2_coeff_data;
1864
1865
118k
            {
1866
118k
                UWORD32 i;
1867
118k
                WORD16 ai2_tmp[16];
1868
590k
                for(i = 0; i < 4; i++)
1869
472k
                {
1870
472k
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
1871
472k
                    UWORD8 *pu1_pred_sblk = pu1_mb_cb_rei1_buffer
1872
472k
                                    + ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR)
1873
472k
                                    + (i >> 1) * (u4_recwidth_cr << 2);
1874
472k
                    PROFILE_DISABLE_IQ_IT_RECON()
1875
472k
                    {
1876
472k
                        if(CHECKBIT(u2_chroma_csbp, i))
1877
32.8k
                        {
1878
32.8k
                            ps_dec->pf_iquant_itrans_recon_chroma_4x4(
1879
32.8k
                                            pi2_level,
1880
32.8k
                                            pu1_pred_sblk,
1881
32.8k
                                            pu1_pred_sblk,
1882
32.8k
                                            u4_recwidth_cr,
1883
32.8k
                                            u4_recwidth_cr,
1884
32.8k
                                            gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
1885
32.8k
                                            (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[1],
1886
32.8k
                                            u4_scale_u, ai2_tmp, pi2_level);
1887
32.8k
                        }
1888
439k
                        else if(pi2_level[0] != 0)
1889
306k
                        {
1890
306k
                            ps_dec->pf_iquant_itrans_recon_chroma_4x4_dc(
1891
306k
                                            pi2_level,
1892
306k
                                            pu1_pred_sblk,
1893
306k
                                            pu1_pred_sblk,
1894
306k
                                            u4_recwidth_cr,
1895
306k
                                            u4_recwidth_cr,
1896
306k
                                            gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpc_rem6],
1897
306k
                                            (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[1],
1898
306k
                                            u4_scale_u, ai2_tmp, pi2_level);
1899
306k
                        }
1900
472k
                    }
1901
1902
472k
                }
1903
118k
            }
1904
1905
118k
            pi2_y_coeff += MB_CHROM_SIZE;
1906
118k
            u2_chroma_csbp = u2_chroma_csbp >> 4;
1907
118k
            {
1908
118k
                UWORD32 i;
1909
118k
                WORD16 ai2_tmp[16];
1910
590k
                for(i = 0; i < 4; i++)
1911
472k
                {
1912
472k
                    WORD16 *pi2_level = pi2_y_coeff + (i << 4);
1913
472k
                    UWORD8 *pu1_pred_sblk = pu1_mb_cb_rei1_buffer + 1
1914
472k
                                    + ((i & 0x1) * BLK_SIZE * YUV420SP_FACTOR)
1915
472k
                                    + (i >> 1) * (u4_recwidth_cr << 2);
1916
472k
                    PROFILE_DISABLE_IQ_IT_RECON()
1917
472k
                    {
1918
472k
                        if(CHECKBIT(u2_chroma_csbp, i))
1919
33.5k
                        {
1920
33.5k
                            ps_dec->pf_iquant_itrans_recon_chroma_4x4(
1921
33.5k
                                            pi2_level,
1922
33.5k
                                            pu1_pred_sblk,
1923
33.5k
                                            pu1_pred_sblk,
1924
33.5k
                                            u4_recwidth_cr,
1925
33.5k
                                            u4_recwidth_cr,
1926
33.5k
                                            gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
1927
33.5k
                                            (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[2],
1928
33.5k
                                            u4_scale_v, ai2_tmp, pi2_level);
1929
33.5k
                        }
1930
438k
                        else if(pi2_level[0] != 0)
1931
287k
                        {
1932
287k
                            ps_dec->pf_iquant_itrans_recon_chroma_4x4_dc(
1933
287k
                                            pi2_level,
1934
287k
                                            pu1_pred_sblk,
1935
287k
                                            pu1_pred_sblk,
1936
287k
                                            u4_recwidth_cr,
1937
287k
                                            u4_recwidth_cr,
1938
287k
                                            gau2_ih264_iquant_scale_4x4[ps_cur_mb_info->u1_qpcr_rem6],
1939
287k
                                            (UWORD16 *)ps_dec->s_high_profile.i2_scalinglist4x4[2],
1940
287k
                                            u4_scale_v, ai2_tmp, pi2_level);
1941
287k
                        }
1942
472k
                    }
1943
472k
                }
1944
118k
            }
1945
1946
118k
        }
1947
1.40M
        else
1948
1.40M
        {
1949
            /* If no inverse transform is needed, pass recon buffer pointer */
1950
            /* to Intraprediction module instead of pred buffer pointer     */
1951
1.40M
            {
1952
1.40M
                UWORD16 au2_ngbr_pels[33];
1953
1.40M
                UWORD8 *pu1_ngbr_pels = (UWORD8 *)au2_ngbr_pels;
1954
1.40M
                UWORD16 *pu2_left_uv;
1955
1.40M
                UWORD16 *pu2_topleft_uv;
1956
1.40M
                WORD32 use_left1 = (u2_use_left_mb_pack & 0x0ff);
1957
1.40M
                WORD32 use_left2 = (u2_use_left_mb_pack & 0xff00) >> 8;
1958
1959
1.40M
                pu2_topleft_uv = (UWORD16 *)pu1_u_top_left;
1960
1.40M
                pu2_left_uv = (UWORD16 *)pu1_uleft;
1961
1962
                /* Get neighbour pixels */
1963
                /* left pels */
1964
1.40M
                if(u2_use_left_mb_pack)
1965
1.29M
                {
1966
1.29M
                    WORD32 i;
1967
1.29M
                    if(use_left1)
1968
1.29M
                    {
1969
6.45M
                        for(i = 0; i < 4; i++)
1970
5.16M
                            au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
1971
5.16M
                                            * u4_recwidth_cr / YUV420SP_FACTOR];
1972
1.29M
                    }
1973
830
                    else
1974
830
                    {
1975
830
                        memset(au2_ngbr_pels + 4, 0, 4 * sizeof(UWORD16));
1976
830
                    }
1977
1978
1.29M
                    if(use_left2)
1979
1.29M
                    {
1980
6.45M
                        for(i = 4; i < 8; i++)
1981
5.16M
                            au2_ngbr_pels[8 - 1 - i] = pu2_left_uv[i
1982
5.16M
                                            * u4_recwidth_cr / YUV420SP_FACTOR];
1983
1.29M
                    }
1984
1.23k
                    else
1985
1.23k
                    {
1986
1.23k
                        memset(au2_ngbr_pels, 0, 4 * sizeof(UWORD16));
1987
1.23k
                    }
1988
1989
1.29M
                }
1990
116k
                else
1991
116k
                {
1992
116k
                    memset(au2_ngbr_pels, 0, 8 * sizeof(UWORD16));
1993
116k
                }
1994
1995
                /* top left pels */
1996
1.40M
                au2_ngbr_pels[8] = *pu2_topleft_uv;
1997
1998
                /* top pels */
1999
1.40M
                if(uc_useTopMB)
2000
1.19M
                {
2001
1.19M
                    memcpy(au2_ngbr_pels + 8 + 1, pu1_top_u,
2002
1.19M
                           8 * sizeof(UWORD16));
2003
1.19M
                }
2004
212k
                else
2005
212k
                {
2006
212k
                    memset(au2_ngbr_pels + 8 + 1, 0, 8 * sizeof(UWORD16));
2007
212k
                }
2008
2009
1.40M
                PROFILE_DISABLE_INTRA_PRED()
2010
1.40M
                ps_dec->apf_intra_pred_chroma[u1_intra_chrom_pred_mode](
2011
1.40M
                                pu1_ngbr_pels,
2012
1.40M
                                pu1_mb_cb_rei1_buffer,
2013
1.40M
                                1,
2014
1.40M
                                u4_recwidth_cr,
2015
1.40M
                                ((uc_useTopMB << 2) | (use_left2 << 4)
2016
1.40M
                                                | use_left1));
2017
1.40M
            }
2018
2019
1.40M
        }
2020
2021
1.52M
    }
2022
1.52M
    return OK;
2023
1.52M
}