Coverage Report

Created: 2026-10-17 07:28

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