Coverage Report

Created: 2026-04-12 06:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libmpeg2/decoder/impeg2d_pnb_pic.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
#include <stdio.h>
21
#include <string.h>
22
23
#include "iv_datatypedef.h"
24
#include "iv.h"
25
26
#include "impeg2_buf_mgr.h"
27
#include "impeg2_disp_mgr.h"
28
#include "impeg2_defs.h"
29
#include "impeg2_platform_macros.h"
30
#include "impeg2_inter_pred.h"
31
#include "impeg2_idct.h"
32
#include "impeg2_globals.h"
33
#include "impeg2_mem_func.h"
34
#include "impeg2_format_conv.h"
35
#include "impeg2_macros.h"
36
37
#include "ivd.h"
38
#include "impeg2d.h"
39
#include "impeg2d_bitstream.h"
40
#include "impeg2d_structs.h"
41
#include "impeg2d_vld_tables.h"
42
#include "impeg2d_vld.h"
43
#include "impeg2d_pic_proc.h"
44
#include "impeg2d_debug.h"
45
#include "impeg2d_mc.h"
46
47
#define BLK_SIZE 8
48
#define LUMA_BLK_SIZE (2 * (BLK_SIZE))
49
#define CHROMA_BLK_SIZE (BLK_SIZE)
50
51
52
/*******************************************************************************
53
*
54
*  Function Name   : impeg2d_dec_p_mb_params
55
*
56
*  Description     : Decodes the parameters for P
57
*
58
*  Arguments       :
59
*  dec             : Decoder context
60
*
61
*  Values Returned : None
62
*******************************************************************************/
63
WORD32  impeg2d_dec_p_mb_params(dec_state_t *ps_dec)
64
3.58M
{
65
3.58M
    stream_t *ps_stream = &ps_dec->s_bit_stream;
66
3.58M
    UWORD16 u2_mb_addr_incr;
67
3.58M
    UWORD16 u2_total_len;
68
3.58M
    UWORD16 u2_len;
69
3.58M
    UWORD16 u2_mb_type;
70
3.58M
    UWORD32 u4_next_word;
71
3.58M
    const dec_mb_params_t *ps_dec_mb_params;
72
3.58M
    if(impeg2d_bit_stream_nxt(ps_stream,1) == 1)
73
2.85M
    {
74
2.85M
        impeg2d_bit_stream_flush(ps_stream,1);
75
76
2.85M
    }
77
733k
    else
78
733k
    {
79
733k
        u2_mb_addr_incr = impeg2d_get_mb_addr_incr(ps_stream);
80
81
733k
        if(!u2_mb_addr_incr)
82
287
        {
83
287
            return IV_FAIL;
84
287
        }
85
86
733k
        if(0 == ps_dec->u2_first_mb)
87
724k
        {
88
            /****************************************************************/
89
            /* If the 2nd member of a field picture pair is a P picture and */
90
            /* the first one was an I picture, there cannot be any skipped  */
91
            /* MBs in the second field picture                              */
92
            /****************************************************************/
93
            /*
94
            if((dec->picture_structure != FRAME_PICTURE) &&
95
                (dec->f->FieldFuncCall != 0) &&
96
                (dec->las->u1_last_coded_vop_type == I))
97
            {
98
                core0_err_handler((void *)(VOLParams),
99
                    ITTMPEG2_ERR_INVALID_MB_SKIP);
100
            }
101
            */
102
            /****************************************************************/
103
            /* In MPEG-2, the last MB of the row cannot be skipped and the  */
104
            /* MBAddrIncr cannot be such that it will take the current MB   */
105
            /* beyond the current row                                       */
106
            /* In MPEG-1, the slice could start and end anywhere and is not */
107
            /* restricted to a row like in MPEG-2. Hence this check should  */
108
            /* not be done for MPEG-1 streams.                              */
109
            /****************************************************************/
110
724k
            if(ps_dec->u2_is_mpeg2 && ((ps_dec->u2_mb_x + u2_mb_addr_incr) > ps_dec->u2_num_horiz_mb) )
111
1.87k
            {
112
1.87k
                u2_mb_addr_incr    = ps_dec->u2_num_horiz_mb - ps_dec->u2_mb_x;
113
1.87k
            }
114
115
724k
            if ((u2_mb_addr_incr - 1) > ps_dec->u2_num_mbs_left)
116
269
            {
117
                /* If the number of skip MBs are more than the number of MBs
118
                 * left, indicate error.
119
                 */
120
269
                return IV_FAIL;
121
269
            }
122
123
724k
            impeg2d_dec_skip_mbs(ps_dec, (UWORD16)(u2_mb_addr_incr - 1));
124
724k
        }
125
9.30k
        else
126
9.30k
        {
127
128
            /****************************************************************/
129
            /* Section 6.3.17                                               */
130
            /* The first MB of a slice cannot be skipped                    */
131
            /* But the mb_addr_incr can be > 1, because at the beginning of */
132
            /* a slice, it indicates the offset from the last MB in the     */
133
            /* previous row. Hence for the first slice in a row, the        */
134
            /* mb_addr_incr needs to be 1.                                  */
135
            /****************************************************************/
136
            /* MB_x is set to zero whenever MB_y changes.                   */
137
9.30k
            ps_dec->u2_mb_x = u2_mb_addr_incr - 1;
138
            /* For error resilience */
139
9.30k
            ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1));
140
9.30k
            ps_dec->u2_num_mbs_left = ((ps_dec->u2_num_vert_mb - ps_dec->u2_mb_y)
141
9.30k
                            * ps_dec->u2_num_horiz_mb) - ps_dec->u2_mb_x;
142
143
            /****************************************************************/
144
            /* mb_addr_incr is forced to 1 because in this decoder it is used */
145
            /* more as an indicator of the number of MBs skipped than the   */
146
            /* as defined by the standard (Section 6.3.17)                  */
147
            /****************************************************************/
148
9.30k
            u2_mb_addr_incr = 1;
149
9.30k
            ps_dec->u2_first_mb = 0;
150
151
9.30k
        }
152
153
733k
    }
154
3.58M
    u4_next_word = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,16);
155
    /*-----------------------------------------------------------------------*/
156
    /* MB type                                                               */
157
    /*-----------------------------------------------------------------------*/
158
3.58M
    {
159
3.58M
        u2_mb_type   = ps_dec->pu2_mb_type[BITS((UWORD16)u4_next_word,15,10)];
160
3.58M
        u2_len      = BITS(u2_mb_type,15,8);
161
3.58M
        u2_total_len = u2_len;
162
3.58M
        u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << u2_len);
163
3.58M
    }
164
    /*-----------------------------------------------------------------------*/
165
    /* motion type                                                           */
166
    /*-----------------------------------------------------------------------*/
167
3.58M
    {
168
3.58M
        if((u2_mb_type & MB_FORW_OR_BACK) &&  ps_dec->u2_read_motion_type)
169
24.0k
        {
170
24.0k
            WORD32 i4_motion_type;
171
24.0k
            ps_dec->u2_motion_type = BITS((UWORD16)u4_next_word,15,14);
172
24.0k
            u2_total_len        += MB_MOTION_TYPE_LEN;
173
24.0k
            u4_next_word        = (UWORD16)LSW((UWORD16)u4_next_word << MB_MOTION_TYPE_LEN);
174
24.0k
            i4_motion_type     = ps_dec->u2_motion_type;
175
176
24.0k
            if((i4_motion_type == 0) ||
177
23.4k
                (i4_motion_type == 4) ||
178
23.4k
                (i4_motion_type >  7))
179
548
            {
180
                //TODO : VANG Check for validity
181
548
                i4_motion_type = 1;
182
548
            }
183
184
24.0k
        }
185
3.58M
    }
186
    /*-----------------------------------------------------------------------*/
187
    /* dct type                                                              */
188
    /*-----------------------------------------------------------------------*/
189
3.58M
    {
190
3.58M
        if((u2_mb_type & MB_CODED) && ps_dec->u2_read_dct_type)
191
4.05k
        {
192
4.05k
            ps_dec->u2_field_dct = BIT((UWORD16)u4_next_word,15);
193
4.05k
            u2_total_len += MB_DCT_TYPE_LEN;
194
4.05k
            u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_DCT_TYPE_LEN);
195
4.05k
        }
196
3.58M
    }
197
    /*-----------------------------------------------------------------------*/
198
    /* Quant scale code                                                      */
199
    /*-----------------------------------------------------------------------*/
200
3.58M
    if(u2_mb_type & MB_QUANT)
201
30.1k
    {
202
30.1k
        UWORD16 u2_quant_scale_code;
203
30.1k
        u2_quant_scale_code = BITS((UWORD16)u4_next_word,15,11);
204
205
30.1k
        ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ?
206
29.4k
            gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1);
207
30.1k
        u2_total_len += MB_QUANT_SCALE_CODE_LEN;
208
30.1k
    }
209
3.58M
    impeg2d_bit_stream_flush(ps_stream,u2_total_len);
210
    /*-----------------------------------------------------------------------*/
211
    /* Set the function pointers                                             */
212
    /*-----------------------------------------------------------------------*/
213
3.58M
    ps_dec->u2_coded_mb    = (UWORD16)(u2_mb_type & MB_CODED);
214
215
3.58M
    if(u2_mb_type & MB_FORW_OR_BACK)
216
3.10M
    {
217
218
3.10M
        UWORD16 refPic      = !(u2_mb_type & MB_MV_FORW);
219
3.10M
        UWORD16 index       = (ps_dec->u2_motion_type);
220
3.10M
        ps_dec->u2_prev_intra_mb    = 0;
221
3.10M
        ps_dec->e_mb_pred         = (e_pred_direction_t)refPic;
222
3.10M
        ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[index];
223
3.10M
        ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type;
224
3.10M
        if(NULL == ps_dec_mb_params->pf_func_mb_params)
225
0
            return -1;
226
3.10M
        ps_dec_mb_params->pf_func_mb_params(ps_dec);
227
228
3.10M
    }
229
486k
    else if(u2_mb_type & MB_TYPE_INTRA)
230
3.32k
    {
231
3.32k
        ps_dec->u2_prev_intra_mb    = 1;
232
3.32k
        impeg2d_dec_intra_mb(ps_dec);
233
234
3.32k
    }
235
483k
    else
236
483k
    {
237
483k
        ps_dec->u2_prev_intra_mb    = 0;
238
483k
        ps_dec->e_mb_pred = FORW;
239
483k
        ps_dec->u2_motion_type = 0;
240
483k
        impeg2d_dec_0mv_coded_mb(ps_dec);
241
483k
    }
242
243
    /*-----------------------------------------------------------------------*/
244
    /* decode cbp                                                            */
245
    /*-----------------------------------------------------------------------*/
246
3.58M
    if((u2_mb_type & MB_TYPE_INTRA))
247
3.32k
    {
248
3.32k
        ps_dec->u2_cbp  = 0x3f;
249
3.32k
        ps_dec->u2_prev_intra_mb    = 1;
250
3.32k
    }
251
3.58M
    else
252
3.58M
    {
253
3.58M
        ps_dec->u2_prev_intra_mb  = 0;
254
3.58M
        ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision;
255
3.58M
        ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
256
3.58M
        ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
257
3.58M
        if((ps_dec->u2_coded_mb))
258
3.15M
        {
259
3.15M
            UWORD16 cbpValue;
260
3.15M
            cbpValue  = gau2_impeg2d_cbp_code[impeg2d_bit_stream_nxt(ps_stream,MB_CBP_LEN)];
261
3.15M
            ps_dec->u2_cbp  = cbpValue & 0xFF;
262
3.15M
            impeg2d_bit_stream_flush(ps_stream,(cbpValue >> 8) & 0x0FF);
263
3.15M
        }
264
429k
        else
265
429k
        {
266
429k
            ps_dec->u2_cbp  = 0;
267
429k
        }
268
3.58M
    }
269
3.58M
    return 0;
270
3.58M
}
271
272
273
/*******************************************************************************
274
*
275
*  Function Name   : impeg2d_dec_pnb_mb_params
276
*
277
*  Description     : Decodes the parameters for P and B pictures
278
*
279
*  Arguments       :
280
*  dec             : Decoder context
281
*
282
*  Values Returned : None
283
*******************************************************************************/
284
WORD32 impeg2d_dec_pnb_mb_params(dec_state_t *ps_dec)
285
330k
{
286
330k
    stream_t *ps_stream = &ps_dec->s_bit_stream;
287
330k
    UWORD16 u2_mb_addr_incr;
288
330k
    UWORD16 u2_total_len;
289
330k
    UWORD16 u2_len;
290
330k
    UWORD16 u2_mb_type;
291
330k
    UWORD32 u4_next_word;
292
330k
    const dec_mb_params_t *ps_dec_mb_params;
293
330k
    if(impeg2d_bit_stream_nxt(ps_stream,1) == 1)
294
146k
    {
295
146k
        impeg2d_bit_stream_flush(ps_stream,1);
296
297
146k
    }
298
184k
    else
299
184k
    {
300
184k
        u2_mb_addr_incr = impeg2d_get_mb_addr_incr(ps_stream);
301
302
184k
        if(0 == u2_mb_addr_incr)
303
356
        {
304
356
            return IV_FAIL;
305
356
        }
306
307
183k
        if(ps_dec->u2_first_mb)
308
6.13k
        {
309
            /****************************************************************/
310
            /* Section 6.3.17                                               */
311
            /* The first MB of a slice cannot be skipped                    */
312
            /* But the mb_addr_incr can be > 1, because at the beginning of */
313
            /* a slice, it indicates the offset from the last MB in the     */
314
            /* previous row. Hence for the first slice in a row, the        */
315
            /* mb_addr_incr needs to be 1.                                  */
316
            /****************************************************************/
317
            /* MB_x is set to zero whenever MB_y changes.                   */
318
6.13k
            ps_dec->u2_mb_x = u2_mb_addr_incr - 1;
319
            /* For error resilience */
320
6.13k
            ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1));
321
6.13k
            ps_dec->u2_num_mbs_left = ((ps_dec->u2_num_vert_mb - ps_dec->u2_mb_y)
322
6.13k
                            * ps_dec->u2_num_horiz_mb) - ps_dec->u2_mb_x;
323
324
            /****************************************************************/
325
            /* mb_addr_incr is forced to 1 because in this decoder it is used */
326
            /* more as an indicator of the number of MBs skipped than the   */
327
            /* as defined by the standard (Section 6.3.17)                  */
328
            /****************************************************************/
329
6.13k
            u2_mb_addr_incr = 1;
330
6.13k
            ps_dec->u2_first_mb = 0;
331
6.13k
        }
332
177k
        else
333
177k
        {
334
            /****************************************************************/
335
            /* In MPEG-2, the last MB of the row cannot be skipped and the  */
336
            /* mb_addr_incr cannot be such that it will take the current MB   */
337
            /* beyond the current row                                       */
338
            /* In MPEG-1, the slice could start and end anywhere and is not */
339
            /* restricted to a row like in MPEG-2. Hence this check should  */
340
            /* not be done for MPEG-1 streams.                              */
341
            /****************************************************************/
342
177k
            if(ps_dec->u2_is_mpeg2 &&
343
123k
                ((ps_dec->u2_mb_x + u2_mb_addr_incr) > ps_dec->u2_num_horiz_mb))
344
12.9k
            {
345
12.9k
                u2_mb_addr_incr    = ps_dec->u2_num_horiz_mb - ps_dec->u2_mb_x;
346
12.9k
            }
347
348
177k
            if ((u2_mb_addr_incr - 1) > ps_dec->u2_num_mbs_left)
349
236
            {
350
                /* If the number of skip MBs are more than the number of MBs
351
                 * left, indicate error.
352
                 */
353
236
                return IV_FAIL;
354
236
            }
355
356
177k
            impeg2d_dec_skip_mbs(ps_dec, (UWORD16)(u2_mb_addr_incr - 1));
357
177k
        }
358
359
183k
    }
360
330k
    u4_next_word = (UWORD16)impeg2d_bit_stream_nxt(ps_stream,16);
361
    /*-----------------------------------------------------------------------*/
362
    /* MB type                                                               */
363
    /*-----------------------------------------------------------------------*/
364
330k
    {
365
330k
        u2_mb_type   = ps_dec->pu2_mb_type[BITS((UWORD16)u4_next_word,15,10)];
366
330k
        u2_len      = BITS(u2_mb_type,15,8);
367
330k
        u2_total_len = u2_len;
368
330k
        u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << u2_len);
369
330k
    }
370
    /*-----------------------------------------------------------------------*/
371
    /* motion type                                                           */
372
    /*-----------------------------------------------------------------------*/
373
330k
    {
374
330k
        WORD32 i4_motion_type = ps_dec->u2_motion_type;
375
376
330k
        if((u2_mb_type & MB_FORW_OR_BACK) &&  ps_dec->u2_read_motion_type)
377
231k
        {
378
231k
            ps_dec->u2_motion_type = BITS((UWORD16)u4_next_word,15,14);
379
231k
            u2_total_len += MB_MOTION_TYPE_LEN;
380
231k
            u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_MOTION_TYPE_LEN);
381
231k
            i4_motion_type     = ps_dec->u2_motion_type;
382
383
231k
        }
384
385
386
330k
        if ((u2_mb_type & MB_FORW_OR_BACK) &&
387
311k
            ((i4_motion_type == 0) ||
388
273k
            (i4_motion_type == 3) ||
389
255k
            (i4_motion_type == 4) ||
390
255k
            (i4_motion_type >= 7)))
391
55.9k
        {
392
            //TODO: VANG Check for validity
393
55.9k
            i4_motion_type = 1;
394
55.9k
        }
395
396
330k
    }
397
    /*-----------------------------------------------------------------------*/
398
    /* dct type                                                              */
399
    /*-----------------------------------------------------------------------*/
400
330k
    {
401
330k
        if((u2_mb_type & MB_CODED) && ps_dec->u2_read_dct_type)
402
73.6k
        {
403
73.6k
            ps_dec->u2_field_dct = BIT((UWORD16)u4_next_word,15);
404
73.6k
            u2_total_len += MB_DCT_TYPE_LEN;
405
73.6k
            u4_next_word = (UWORD16)LSW((UWORD16)u4_next_word << MB_DCT_TYPE_LEN);
406
73.6k
        }
407
330k
    }
408
    /*-----------------------------------------------------------------------*/
409
    /* Quant scale code                                                      */
410
    /*-----------------------------------------------------------------------*/
411
330k
    if(u2_mb_type & MB_QUANT)
412
47.9k
    {
413
47.9k
        UWORD16 u2_quant_scale_code;
414
47.9k
        u2_quant_scale_code = BITS((UWORD16)u4_next_word,15,11);
415
416
47.9k
        ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ?
417
27.2k
            gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1);
418
47.9k
        u2_total_len += MB_QUANT_SCALE_CODE_LEN;
419
47.9k
    }
420
330k
    impeg2d_bit_stream_flush(ps_stream,u2_total_len);
421
    /*-----------------------------------------------------------------------*/
422
    /* Set the function pointers                                             */
423
    /*-----------------------------------------------------------------------*/
424
330k
    ps_dec->u2_coded_mb    = (UWORD16)(u2_mb_type & MB_CODED);
425
426
330k
    if(u2_mb_type & MB_BIDRECT)
427
116k
    {
428
116k
        UWORD16 u2_index       = (ps_dec->u2_motion_type);
429
430
116k
        ps_dec->u2_prev_intra_mb    = 0;
431
116k
        ps_dec->e_mb_pred         = BIDIRECT;
432
116k
        ps_dec_mb_params = &ps_dec->ps_func_bi_direct[u2_index];
433
116k
        ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type;
434
116k
        if(NULL == ps_dec_mb_params->pf_func_mb_params)
435
2.57k
            return -1;
436
114k
        ps_dec_mb_params->pf_func_mb_params(ps_dec);
437
114k
    }
438
213k
    else if(u2_mb_type & MB_FORW_OR_BACK)
439
194k
    {
440
441
194k
        UWORD16 u2_refPic      = !(u2_mb_type & MB_MV_FORW);
442
194k
        UWORD16 u2_index       = (ps_dec->u2_motion_type);
443
194k
        ps_dec->u2_prev_intra_mb    = 0;
444
194k
        ps_dec->e_mb_pred         = (e_pred_direction_t)u2_refPic;
445
194k
        ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[u2_index];
446
194k
        ps_dec->s_mb_type = ps_dec_mb_params->s_mb_type;
447
194k
        if(NULL == ps_dec_mb_params->pf_func_mb_params)
448
0
            return -1;
449
194k
        ps_dec_mb_params->pf_func_mb_params(ps_dec);
450
451
194k
    }
452
18.5k
    else if(u2_mb_type & MB_TYPE_INTRA)
453
6.39k
    {
454
6.39k
        ps_dec->u2_prev_intra_mb    = 1;
455
6.39k
        impeg2d_dec_intra_mb(ps_dec);
456
457
6.39k
    }
458
12.1k
    else
459
12.1k
    {
460
12.1k
        ps_dec->u2_prev_intra_mb =0;
461
12.1k
        ps_dec->e_mb_pred = FORW;
462
12.1k
        ps_dec->u2_motion_type = 0;
463
12.1k
        impeg2d_dec_0mv_coded_mb(ps_dec);
464
12.1k
    }
465
466
    /*-----------------------------------------------------------------------*/
467
    /* decode cbp                                                            */
468
    /*-----------------------------------------------------------------------*/
469
327k
    if((u2_mb_type & MB_TYPE_INTRA))
470
6.39k
    {
471
6.39k
        ps_dec->u2_cbp  = 0x3f;
472
6.39k
        ps_dec->u2_prev_intra_mb    = 1;
473
6.39k
    }
474
321k
    else
475
321k
    {
476
321k
        ps_dec->u2_prev_intra_mb  = 0;
477
321k
        ps_dec->u2_def_dc_pred[Y_LUMA] = 128 << ps_dec->u2_intra_dc_precision;
478
321k
        ps_dec->u2_def_dc_pred[U_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
479
321k
        ps_dec->u2_def_dc_pred[V_CHROMA] = 128 << ps_dec->u2_intra_dc_precision;
480
321k
        if((ps_dec->u2_coded_mb))
481
105k
        {
482
105k
            UWORD16 cbpValue;
483
105k
            cbpValue  = gau2_impeg2d_cbp_code[impeg2d_bit_stream_nxt(ps_stream,MB_CBP_LEN)];
484
105k
            ps_dec->u2_cbp  = cbpValue & 0xFF;
485
105k
            impeg2d_bit_stream_flush(ps_stream,(cbpValue >> 8) & 0x0FF);
486
105k
        }
487
216k
        else
488
216k
        {
489
216k
            ps_dec->u2_cbp  = 0;
490
216k
        }
491
321k
    }
492
327k
    return 0;
493
330k
}
494
495
/*******************************************************************************
496
*  Function Name   : impeg2d_dec_p_b_slice
497
*
498
*  Description     : Decodes P and B slices
499
*
500
*  Arguments       :
501
*  dec             : Decoder state
502
*
503
*  Values Returned : None
504
*******************************************************************************/
505
IMPEG2D_ERROR_CODES_T impeg2d_dec_p_b_slice(dec_state_t *ps_dec)
506
31.2k
{
507
31.2k
    WORD16 *pi2_vld_out;
508
31.2k
    UWORD32 i;
509
31.2k
    yuv_buf_t *ps_cur_frm_buf      = &ps_dec->s_cur_frm_buf;
510
511
31.2k
    UWORD32 u4_frm_offset          = 0;
512
31.2k
    const dec_mb_params_t *ps_dec_mb_params;
513
31.2k
    IMPEG2D_ERROR_CODES_T e_error   = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
514
515
31.2k
    pi2_vld_out = ps_dec->ai2_vld_buf;
516
31.2k
    memset(ps_dec->ai2_pred_mv,0,sizeof(ps_dec->ai2_pred_mv));
517
518
31.2k
    ps_dec->u2_prev_intra_mb    = 0;
519
31.2k
    ps_dec->u2_first_mb       = 1;
520
521
31.2k
    ps_dec->u2_picture_width = ps_dec->u2_frame_width;
522
523
31.2k
    if(ps_dec->u2_picture_structure != FRAME_PICTURE)
524
1.75k
    {
525
1.75k
        ps_dec->u2_picture_width <<= 1;
526
1.75k
        if(ps_dec->u2_picture_structure == BOTTOM_FIELD)
527
788
        {
528
788
            u4_frm_offset = ps_dec->u2_frame_width;
529
788
        }
530
1.75k
    }
531
532
31.2k
    do
533
3.92M
    {
534
3.92M
        UWORD32 u4_x_offset, u4_y_offset;
535
3.92M
        WORD32 ret;
536
537
538
3.92M
        UWORD32 u4_x_dst_offset = 0;
539
3.92M
        UWORD32 u4_y_dst_offset = 0;
540
3.92M
        UWORD8  *pu1_out_p;
541
3.92M
        UWORD8  *pu1_pred;
542
3.92M
        WORD32 u4_pred_strd;
543
544
3.92M
        IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y);
545
546
3.92M
        if(ps_dec->e_pic_type == B_PIC)
547
330k
            ret = impeg2d_dec_pnb_mb_params(ps_dec);
548
3.58M
        else
549
3.58M
            ret = impeg2d_dec_p_mb_params(ps_dec);
550
551
3.92M
        if(ret)
552
3.71k
            return IMPEG2D_MB_TEX_DECODE_ERR;
553
554
3.91M
        if(0 >= ps_dec->u2_num_mbs_left)
555
576
        {
556
576
            break;
557
576
        }
558
559
3.91M
        IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y);
560
561
3.91M
        u4_x_dst_offset = u4_frm_offset + (ps_dec->u2_mb_x << 4);
562
3.91M
        u4_y_dst_offset = (ps_dec->u2_mb_y << 4) * ps_dec->u2_picture_width;
563
3.91M
        pu1_out_p = ps_cur_frm_buf->pu1_y + u4_x_dst_offset + u4_y_dst_offset;
564
3.91M
        if(ps_dec->u2_prev_intra_mb == 0)
565
3.91M
        {
566
3.91M
            UWORD32 offset_x, offset_y, stride;
567
3.91M
            UWORD16 index = (ps_dec->u2_motion_type);
568
            /*only for non intra mb's*/
569
3.91M
            if(ps_dec->e_mb_pred == BIDIRECT)
570
114k
            {
571
114k
                ps_dec_mb_params = &ps_dec->ps_func_bi_direct[index];
572
114k
            }
573
3.79M
            else
574
3.79M
            {
575
3.79M
                ps_dec_mb_params = &ps_dec->ps_func_forw_or_back[index];
576
3.79M
            }
577
578
3.91M
            stride = ps_dec->u2_picture_width;
579
580
3.91M
            offset_x = u4_frm_offset + (ps_dec->u2_mb_x << 4);
581
582
3.91M
            offset_y = (ps_dec->u2_mb_y << 4);
583
584
3.91M
            ps_dec->s_dest_buf.pu1_y = ps_cur_frm_buf->pu1_y + offset_y * stride + offset_x;
585
586
3.91M
            stride = stride >> 1;
587
588
3.91M
            ps_dec->s_dest_buf.pu1_u = ps_cur_frm_buf->pu1_u + (offset_y >> 1) * stride
589
3.91M
                            + (offset_x >> 1);
590
591
3.91M
            ps_dec->s_dest_buf.pu1_v = ps_cur_frm_buf->pu1_v + (offset_y >> 1) * stride
592
3.91M
                            + (offset_x >> 1);
593
594
3.91M
            PROFILE_DISABLE_MC_IF0
595
3.91M
            ps_dec_mb_params->pf_mc(ps_dec);
596
597
3.91M
        }
598
19.4M
        for(i = 0; i < NUM_LUMA_BLKS; ++i)
599
15.5M
        {
600
15.5M
            if((ps_dec->u2_cbp & (1 << (BLOCKS_IN_MB - 1 - i))) != 0)
601
7.60M
            {
602
7.60M
                e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix,
603
7.60M
                              ps_dec->u2_prev_intra_mb, Y_LUMA, 0);
604
7.60M
                if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
605
6.79k
                {
606
6.79k
                    return e_error;
607
6.79k
                }
608
609
7.60M
                u4_x_offset = gai2_impeg2_blk_x_off[i];
610
611
7.60M
                if(ps_dec->u2_field_dct == 0)
612
7.58M
                    u4_y_offset = gai2_impeg2_blk_y_off_frm[i] ;
613
14.3k
                else
614
14.3k
                    u4_y_offset = gai2_impeg2_blk_y_off_fld[i] ;
615
616
617
618
619
620
7.60M
                IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
621
622
7.60M
                PROFILE_DISABLE_IDCT_IF0
623
7.60M
                {
624
7.60M
                    WORD32 idx;
625
7.60M
                    if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
626
374k
                        idx = 0;
627
7.22M
                    else
628
7.22M
                        idx = 1;
629
630
7.60M
                    if(0 == ps_dec->u2_prev_intra_mb)
631
7.59M
                    {
632
7.59M
                        pu1_pred = pu1_out_p + u4_y_offset * ps_dec->u2_picture_width + u4_x_offset;
633
7.59M
                        u4_pred_strd = ps_dec->u2_picture_width << ps_dec->u2_field_dct;
634
7.59M
                    }
635
5.29k
                    else
636
5.29k
                    {
637
5.29k
                        pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf;
638
5.29k
                        u4_pred_strd = 8;
639
5.29k
                    }
640
641
7.60M
                    ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
642
7.60M
                                                            ps_dec->ai2_idct_stg1,
643
7.60M
                                                            pu1_pred,
644
7.60M
                                                            pu1_out_p + u4_y_offset * ps_dec->u2_picture_width + u4_x_offset,
645
7.60M
                                                            8,
646
7.60M
                                                            u4_pred_strd,
647
7.60M
                                                            ps_dec->u2_picture_width << ps_dec->u2_field_dct,
648
7.60M
                                                            ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
649
7.60M
                }
650
7.60M
            }
651
652
15.5M
        }
653
654
        /* For U and V blocks, divide the x and y offsets by 2. */
655
3.90M
        u4_x_dst_offset >>= 1;
656
3.90M
        u4_y_dst_offset >>= 2;
657
658
659
        /* In case of chrominance blocks the DCT will be frame DCT */
660
        /* i = 0, U component and i = 1 is V componet */
661
3.90M
        if((ps_dec->u2_cbp & 0x02) != 0)
662
56.6k
        {
663
56.6k
            pu1_out_p = ps_cur_frm_buf->pu1_u + u4_x_dst_offset + u4_y_dst_offset;
664
56.6k
            e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix,
665
56.6k
                          ps_dec->u2_prev_intra_mb, U_CHROMA, 0);
666
56.6k
            if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
667
670
            {
668
670
                return e_error;
669
670
            }
670
671
672
56.0k
            IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
673
674
56.0k
            PROFILE_DISABLE_IDCT_IF0
675
56.0k
            {
676
56.0k
                WORD32 idx;
677
56.0k
                if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
678
33.6k
                    idx = 0;
679
22.3k
                else
680
22.3k
                    idx = 1;
681
682
56.0k
                if(0 == ps_dec->u2_prev_intra_mb)
683
48.7k
                {
684
48.7k
                    pu1_pred = pu1_out_p;
685
48.7k
                    u4_pred_strd = ps_dec->u2_picture_width >> 1;
686
48.7k
                }
687
7.32k
                else
688
7.32k
                {
689
7.32k
                    pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf;
690
7.32k
                    u4_pred_strd = 8;
691
7.32k
                }
692
693
56.0k
                ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
694
56.0k
                                                        ps_dec->ai2_idct_stg1,
695
56.0k
                                                        pu1_pred,
696
56.0k
                                                        pu1_out_p,
697
56.0k
                                                        8,
698
56.0k
                                                        u4_pred_strd,
699
56.0k
                                                        ps_dec->u2_picture_width >> 1,
700
56.0k
                                                        ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
701
702
56.0k
            }
703
704
56.0k
        }
705
706
707
3.90M
        if((ps_dec->u2_cbp & 0x01) != 0)
708
322k
        {
709
322k
            pu1_out_p = ps_cur_frm_buf->pu1_v + u4_x_dst_offset + u4_y_dst_offset;
710
322k
            e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out, ps_dec->pu1_inv_scan_matrix,
711
322k
                          ps_dec->u2_prev_intra_mb, V_CHROMA, 0);
712
322k
            if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
713
700
            {
714
700
                return e_error;
715
700
            }
716
717
718
321k
            IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
719
720
321k
            PROFILE_DISABLE_IDCT_IF0
721
321k
            {
722
321k
                WORD32 idx;
723
321k
                if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
724
13.2k
                    idx = 0;
725
308k
                else
726
308k
                    idx = 1;
727
321k
                if(0 == ps_dec->u2_prev_intra_mb)
728
315k
                {
729
315k
                    pu1_pred = pu1_out_p;
730
315k
                    u4_pred_strd = ps_dec->u2_picture_width >> 1;
731
315k
                }
732
6.90k
                else
733
6.90k
                {
734
6.90k
                    pu1_pred = (UWORD8 *)gau1_impeg2_zerobuf;
735
6.90k
                    u4_pred_strd = 8;
736
6.90k
                }
737
738
321k
                ps_dec->pf_idct_recon[idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
739
321k
                                                        ps_dec->ai2_idct_stg1,
740
321k
                                                        pu1_pred,
741
321k
                                                        pu1_out_p,
742
321k
                                                        8,
743
321k
                                                        u4_pred_strd,
744
321k
                                                        ps_dec->u2_picture_width >> 1,
745
321k
                                                        ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
746
747
321k
            }
748
321k
        }
749
750
3.90M
        ps_dec->u2_num_mbs_left--;
751
3.90M
        ps_dec->u2_first_mb = 0;
752
3.90M
        ps_dec->u2_mb_x++;
753
754
3.90M
        if(ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset)
755
870
        {
756
870
            return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
757
870
        }
758
3.90M
        else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
759
52.5k
        {
760
52.5k
            ps_dec->u2_mb_x = 0;
761
52.5k
            ps_dec->u2_mb_y++;
762
763
52.5k
        }
764
3.90M
    }
765
3.90M
    while(ps_dec->u2_num_mbs_left != 0 && impeg2d_bit_stream_nxt(&ps_dec->s_bit_stream,23) != 0x0);
766
18.4k
    return e_error;
767
31.2k
}