Coverage Report

Created: 2026-04-12 06:14

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libmpeg2/decoder/impeg2d_pic_proc.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_globals.h"
42
#include "impeg2d_vld_tables.h"
43
#include "impeg2d_vld.h"
44
#include "impeg2d_pic_proc.h"
45
#include "impeg2d_debug.h"
46
47
void impeg2d_init_function_ptr(void *pv_codec);
48
void impeg2d_format_convert(dec_state_t *ps_dec,
49
                            pic_buf_t *ps_src_pic,
50
                            iv_yuv_buf_t    *ps_disp_frm_buf,
51
                            UWORD32 u4_start_row, UWORD32 u4_num_rows)
52
227k
{
53
227k
    UWORD8  *pu1_src_y,*pu1_src_u,*pu1_src_v;
54
227k
    UWORD8  *pu1_dst_y,*pu1_dst_u,*pu1_dst_v;
55
56
57
58
227k
    if((NULL == ps_src_pic) || (NULL == ps_src_pic->pu1_y) || (0 == u4_num_rows))
59
0
            return;
60
61
227k
    pu1_src_y   = ps_src_pic->pu1_y + (u4_start_row * ps_dec->u2_frame_width);
62
227k
    pu1_src_u   = ps_src_pic->pu1_u + ((u4_start_row >> 1) * (ps_dec->u2_frame_width >> 1));
63
227k
    pu1_src_v   = ps_src_pic->pu1_v + ((u4_start_row >> 1) *(ps_dec->u2_frame_width >> 1));
64
65
227k
    pu1_dst_y  =  (UWORD8 *)ps_disp_frm_buf->pv_y_buf + (u4_start_row *  ps_dec->u4_frm_buf_stride);
66
227k
    pu1_dst_u =   (UWORD8 *)ps_disp_frm_buf->pv_u_buf +((u4_start_row >> 1)*(ps_dec->u4_frm_buf_stride >> 1));
67
227k
    pu1_dst_v =   (UWORD8 *)ps_disp_frm_buf->pv_v_buf +((u4_start_row >> 1)*(ps_dec->u4_frm_buf_stride >> 1));
68
69
227k
    if (IV_YUV_420P == ps_dec->i4_chromaFormat)
70
115k
    {
71
115k
        ps_dec->pf_copy_yuv420p_buf(pu1_src_y, pu1_src_u, pu1_src_v, pu1_dst_y,
72
115k
                                    pu1_dst_u, pu1_dst_v,
73
115k
                                    ps_dec->u2_horizontal_size,
74
115k
                                    u4_num_rows,
75
115k
                                    ps_dec->u2_frame_width,
76
115k
                                    (ps_dec->u2_frame_width >> 1),
77
115k
                                    (ps_dec->u2_frame_width >> 1),
78
115k
                                    ps_dec->u4_frm_buf_stride,
79
115k
                                    (ps_dec->u4_frm_buf_stride >> 1),
80
115k
                                    (ps_dec->u4_frm_buf_stride >> 1));
81
115k
    }
82
111k
    else if (IV_YUV_422ILE == ps_dec->i4_chromaFormat)
83
0
    {
84
0
        void    *pv_yuv422i;
85
0
        UWORD32 u2_height,u2_width,u2_stride_y,u2_stride_u,u2_stride_v;
86
0
        UWORD32 u2_stride_yuv422i;
87
88
89
0
        pv_yuv422i          = (UWORD8 *)ps_disp_frm_buf->pv_y_buf + ((ps_dec->u2_vertical_size)*(ps_dec->u4_frm_buf_stride));
90
0
        u2_height           = u4_num_rows;
91
0
        u2_width            = ps_dec->u2_horizontal_size;
92
0
        u2_stride_y         = ps_dec->u2_frame_width;
93
0
        u2_stride_u         = u2_stride_y >> 1;
94
0
        u2_stride_v         = u2_stride_u;
95
0
        u2_stride_yuv422i   = (0 == ps_dec->u4_frm_buf_stride) ? ps_dec->u2_horizontal_size : ps_dec->u4_frm_buf_stride;
96
97
0
        ps_dec->pf_fmt_conv_yuv420p_to_yuv422ile(pu1_src_y,
98
0
            pu1_src_u,
99
0
            pu1_src_v,
100
0
            pv_yuv422i,
101
0
            u2_width,
102
0
            u2_height,
103
0
            u2_stride_y,
104
0
            u2_stride_u,
105
0
            u2_stride_v,
106
0
            u2_stride_yuv422i);
107
108
0
    }
109
111k
    else if((ps_dec->i4_chromaFormat == IV_YUV_420SP_UV) ||
110
49.2k
            (ps_dec->i4_chromaFormat == IV_YUV_420SP_VU))
111
111k
    {
112
113
111k
        UWORD32 dest_inc_Y=0,dest_inc_UV=0;
114
111k
        WORD32 convert_uv_only;
115
116
111k
        pu1_dst_u =   (UWORD8 *)ps_disp_frm_buf->pv_u_buf +((u4_start_row >> 1)*(ps_dec->u4_frm_buf_stride));
117
111k
        dest_inc_Y =    ps_dec->u4_frm_buf_stride;
118
111k
        dest_inc_UV =   ((ps_dec->u4_frm_buf_stride + 1) >> 1) << 1;
119
111k
        convert_uv_only = 0;
120
121
111k
        if(1 == ps_dec->u4_share_disp_buf)
122
0
            convert_uv_only = 1;
123
124
111k
        if(ps_src_pic->pu1_y == ps_disp_frm_buf->pv_y_buf)
125
40.2k
            convert_uv_only = 1;
126
127
111k
        if(ps_dec->i4_chromaFormat == IV_YUV_420SP_UV)
128
62.4k
        {
129
62.4k
            ps_dec->pf_fmt_conv_yuv420p_to_yuv420sp_uv(pu1_src_y,
130
62.4k
                pu1_src_u,
131
62.4k
                pu1_src_v,
132
62.4k
                pu1_dst_y,
133
62.4k
                pu1_dst_u,
134
62.4k
                u4_num_rows,
135
62.4k
                ps_dec->u2_horizontal_size,
136
62.4k
                ps_dec->u2_frame_width,
137
62.4k
                ps_dec->u2_frame_width >> 1,
138
62.4k
                ps_dec->u2_frame_width >> 1,
139
62.4k
                dest_inc_Y,
140
62.4k
                dest_inc_UV,
141
62.4k
                convert_uv_only);
142
62.4k
        }
143
49.2k
        else
144
49.2k
        {
145
49.2k
            ps_dec->pf_fmt_conv_yuv420p_to_yuv420sp_vu(pu1_src_y,
146
49.2k
                    pu1_src_u,
147
49.2k
                    pu1_src_v,
148
49.2k
                    pu1_dst_y,
149
49.2k
                    pu1_dst_u,
150
49.2k
                    u4_num_rows,
151
49.2k
                    ps_dec->u2_horizontal_size,
152
49.2k
                    ps_dec->u2_frame_width,
153
49.2k
                    ps_dec->u2_frame_width >> 1,
154
49.2k
                    ps_dec->u2_frame_width >> 1,
155
49.2k
                    dest_inc_Y,
156
49.2k
                    dest_inc_UV,
157
49.2k
                    convert_uv_only);
158
49.2k
        }
159
160
161
162
111k
    }
163
164
227k
}
165
166
167
/*******************************************************************************
168
*
169
*  Function Name   : impeg2d_get_frm_buf
170
*
171
*  Description     : Gets YUV component buffers for the frame
172
*
173
*  Arguments       :
174
*  frm_buf         : YUV buffer
175
*  frm             : Reference frame
176
*  width           : Width of the frame
177
*  Height          : Height of the frame
178
*
179
*  Values Returned : None
180
*******************************************************************************/
181
void impeg2d_get_frm_buf(yuv_buf_t *ps_frm_buf,UWORD8 *pu1_frm,UWORD32 u4_width,UWORD32 u4_height)
182
0
{
183
0
   UWORD32 u4_luma_size = u4_width * u4_height;
184
0
   UWORD32 u4_chroma_size = (u4_width * u4_height)>>2;
185
186
0
   ps_frm_buf->pu1_y = pu1_frm;
187
0
   ps_frm_buf->pu1_u = pu1_frm + u4_luma_size;
188
0
   ps_frm_buf->pu1_v = pu1_frm + u4_luma_size + u4_chroma_size;
189
190
0
}
191
/*******************************************************************************
192
*
193
*  Function Name   : impeg2d_get_bottom_field_buf
194
*
195
*  Description     : Gets YUV component buffers for bottom field of the frame
196
*
197
*  Arguments       :
198
*  frm_buf         : YUV buffer
199
*  frm             : Reference frame
200
*  width           : Width of the frame
201
*  Height          : Height of the frame
202
*
203
*  Values Returned : None
204
*******************************************************************************/
205
void impeg2d_get_bottom_field_buf(yuv_buf_t *ps_src_buf,yuv_buf_t *ps_dst_buf,
206
                      UWORD32 u4_width)
207
19.3k
{
208
19.3k
   ps_dst_buf->pu1_y = ps_src_buf->pu1_y + u4_width;
209
19.3k
   ps_dst_buf->pu1_u = ps_src_buf->pu1_u + (u4_width>>1);
210
19.3k
   ps_dst_buf->pu1_v = ps_src_buf->pu1_v + (u4_width>>1);
211
212
19.3k
}
213
/*******************************************************************************
214
*  Function Name   : impeg2d_get_mb_addr_incr
215
*
216
*  Description     : Decodes the Macroblock address increment
217
*
218
*  Arguments       :
219
*  stream          : Bitstream
220
*
221
*  Values Returned : Macroblock address increment
222
*******************************************************************************/
223
UWORD16 impeg2d_get_mb_addr_incr(stream_t *ps_stream)
224
920k
{
225
920k
    UWORD16 u2_mb_addr_incr = 0;
226
990k
    while (impeg2d_bit_stream_nxt(ps_stream,MB_ESCAPE_CODE_LEN) == MB_ESCAPE_CODE &&
227
71.1k
            ps_stream->u4_offset < ps_stream->u4_max_offset)
228
70.4k
    {
229
70.4k
        impeg2d_bit_stream_flush(ps_stream,MB_ESCAPE_CODE_LEN);
230
70.4k
        u2_mb_addr_incr += 33;
231
70.4k
    }
232
920k
    u2_mb_addr_incr += impeg2d_dec_vld_symbol(ps_stream,gai2_impeg2d_mb_addr_incr,MB_ADDR_INCR_LEN) +
233
920k
        MB_ADDR_INCR_OFFSET;
234
920k
    return(u2_mb_addr_incr);
235
920k
}
236
237
/*******************************************************************************
238
*
239
*  Function Name   : impeg2d_init_video_state
240
*
241
*  Description     : Initializes the Video decoder state
242
*
243
*  Arguments       :
244
*  dec             : Decoder context
245
*  videoType       : MPEG_2_Video / MPEG_1_Video
246
*
247
*  Values Returned : None
248
*******************************************************************************/
249
IMPEG2D_ERROR_CODES_T impeg2d_init_video_state(dec_state_t *ps_dec, e_video_type_t e_video_type)
250
7.84k
{
251
    /*-----------------------------------------------------------------------*/
252
    /* Bit Stream  that conforms to MPEG-1 <ISO/IEC 11172-2> standard        */
253
    /*-----------------------------------------------------------------------*/
254
7.84k
    if(e_video_type == MPEG_1_VIDEO)
255
4.79k
    {
256
4.79k
        ps_dec->u2_is_mpeg2 = 0;
257
258
        /*-------------------------------------------------------------------*/
259
        /* force MPEG-1 parameters for proper decoder behavior               */
260
        /* see ISO/IEC 13818-2 section D.9.14                                */
261
        /*-------------------------------------------------------------------*/
262
4.79k
        ps_dec->u2_progressive_sequence         = 1;
263
4.79k
        ps_dec->u2_intra_dc_precision           = 0;
264
4.79k
        ps_dec->u2_picture_structure            = FRAME_PICTURE;
265
4.79k
        ps_dec->u2_frame_pred_frame_dct         = 1;
266
4.79k
        ps_dec->u2_concealment_motion_vectors   = 0;
267
4.79k
        ps_dec->u2_q_scale_type                 = 0;
268
4.79k
        ps_dec->u2_intra_vlc_format             = 0;
269
4.79k
        ps_dec->u2_alternate_scan               = 0;
270
4.79k
        ps_dec->u2_repeat_first_field           = 0;
271
4.79k
        ps_dec->u2_progressive_frame            = 1;
272
4.79k
        ps_dec->u2_frame_rate_extension_n       = 0;
273
4.79k
        ps_dec->u2_frame_rate_extension_d       = 0;
274
4.79k
        ps_dec->u2_forw_f_code                  = 7;
275
4.79k
        ps_dec->u2_back_f_code                  = 7;
276
277
4.79k
        ps_dec->pf_vld_inv_quant                  = impeg2d_vld_inv_quant_mpeg1;
278
        /*-------------------------------------------------------------------*/
279
        /* Setting of parameters other than those mentioned in MPEG2 standard*/
280
        /* but used in decoding process.                                     */
281
        /*-------------------------------------------------------------------*/
282
4.79k
    }
283
    /*-----------------------------------------------------------------------*/
284
    /* Bit Stream  that conforms to MPEG-2                                   */
285
    /*-----------------------------------------------------------------------*/
286
3.05k
    else
287
3.05k
    {
288
3.05k
        ps_dec->u2_is_mpeg2                  = 1;
289
3.05k
        ps_dec->u2_full_pel_forw_vector   = 0;
290
3.05k
        ps_dec->u2_forw_f_code            = 7;
291
3.05k
        ps_dec->u2_full_pel_back_vector   = 0;
292
3.05k
        ps_dec->u2_back_f_code            = 7;
293
3.05k
        ps_dec->pf_vld_inv_quant       = impeg2d_vld_inv_quant_mpeg2;
294
295
296
3.05k
    }
297
298
299
7.84k
    impeg2d_init_function_ptr(ps_dec);
300
301
    /* Set the frame Width and frame Height */
302
7.84k
    ps_dec->u2_frame_height        = ALIGN16(ps_dec->u2_vertical_size);
303
7.84k
    ps_dec->u2_frame_width         = ALIGN16(ps_dec->u2_horizontal_size);
304
7.84k
    ps_dec->u2_num_horiz_mb         = (ps_dec->u2_horizontal_size + 15) >> 4;
305
   // dec->u4_frm_buf_stride    = dec->frameWidth;
306
7.84k
    if (ps_dec->u2_frame_height > ps_dec->u2_create_max_height || ps_dec->u2_frame_width > ps_dec->u2_create_max_width)
307
0
    {
308
0
        return IMPEG2D_PIC_SIZE_NOT_SUPPORTED;
309
0
    }
310
311
7.84k
    ps_dec->u2_num_flds_decoded = 0;
312
313
    /* Calculate the frame period */
314
7.84k
    {
315
7.84k
        UWORD32 numer;
316
7.84k
        UWORD32 denom;
317
7.84k
        numer = (UWORD32)gau2_impeg2_frm_rate_code[ps_dec->u2_frame_rate_code][1] *
318
7.84k
                                (UWORD32)(ps_dec->u2_frame_rate_extension_d + 1);
319
320
7.84k
        denom = (UWORD32)gau2_impeg2_frm_rate_code[ps_dec->u2_frame_rate_code][0] *
321
7.84k
                                (UWORD32)(ps_dec->u2_frame_rate_extension_n + 1);
322
7.84k
        ps_dec->u2_framePeriod =  (numer * 1000 * 100) / denom;
323
7.84k
    }
324
325
326
7.84k
   if(VERTICAL_SCAN == ps_dec->u2_alternate_scan)
327
425
   {
328
425
    ps_dec->pu1_inv_scan_matrix = (UWORD8 *)gau1_impeg2_inv_scan_vertical;
329
425
   }
330
7.42k
   else
331
7.42k
   {
332
7.42k
    ps_dec->pu1_inv_scan_matrix = (UWORD8 *)gau1_impeg2_inv_scan_zig_zag;
333
7.42k
   }
334
7.84k
   return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
335
7.84k
}
336
/*******************************************************************************
337
*
338
*  Function Name   : impeg2d_pre_pic_dec_proc
339
*
340
*  Description     : Does the processing neccessary before picture decoding
341
*
342
*  Arguments       :
343
*  dec             : Decoder context
344
*
345
*  Values Returned : None
346
*******************************************************************************/
347
IMPEG2D_ERROR_CODES_T impeg2d_pre_pic_dec_proc(dec_state_t *ps_dec)
348
28.1k
{
349
28.1k
    WORD32 u4_get_disp;
350
28.1k
    pic_buf_t *ps_disp_pic;
351
28.1k
    IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
352
353
28.1k
    u4_get_disp = 0;
354
28.1k
    ps_disp_pic = NULL;
355
356
    /* Field Picture */
357
28.1k
    if(ps_dec->u2_picture_structure != FRAME_PICTURE)
358
6.04k
    {
359
6.04k
        ps_dec->u2_num_vert_mb       = (ps_dec->u2_vertical_size + 31) >> 5;
360
361
6.04k
        if(ps_dec->u2_num_flds_decoded == 0)
362
3.70k
        {
363
3.70k
            pic_buf_t *ps_pic_buf;
364
3.70k
            u4_get_disp = 1;
365
366
3.70k
            ps_pic_buf = impeg2_buf_mgr_get_next_free(ps_dec->pv_pic_buf_mg, &ps_dec->i4_cur_buf_id);
367
368
3.70k
            if (NULL == ps_pic_buf)
369
300
            {
370
300
                return IMPEG2D_NO_FREE_BUF_ERR;
371
300
            }
372
373
3.40k
            impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_DISP);
374
3.40k
            impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_REF);
375
3.40k
            if(ps_dec->u4_deinterlace)
376
3.40k
                impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, MPEG2_BUF_MGR_DEINT);
377
378
3.40k
            ps_pic_buf->e_pic_type = ps_dec->e_pic_type;
379
3.40k
            ps_dec->ps_cur_pic = ps_pic_buf;
380
3.40k
            ps_dec->s_cur_frm_buf.pu1_y = ps_pic_buf->pu1_y;
381
3.40k
            ps_dec->s_cur_frm_buf.pu1_u = ps_pic_buf->pu1_u;
382
3.40k
            ps_dec->s_cur_frm_buf.pu1_v = ps_pic_buf->pu1_v;
383
3.40k
        }
384
2.33k
        else
385
2.33k
        {
386
            /* Timestamp associated with second field is associated with the current picture */
387
2.33k
            ps_dec->ps_cur_pic->u4_ts = ps_dec->u4_inp_ts;
388
2.33k
        }
389
390
5.74k
        if(ps_dec->u2_picture_structure == TOP_FIELD)
391
4.37k
        {
392
4.37k
            ps_dec->u2_fld_parity = TOP;
393
4.37k
        }
394
1.36k
        else
395
1.36k
        {
396
1.36k
            ps_dec->u2_fld_parity = BOTTOM;
397
1.36k
        }
398
5.74k
        ps_dec->u2_field_dct           = 0;
399
5.74k
        ps_dec->u2_read_dct_type        = 0;
400
5.74k
        ps_dec->u2_read_motion_type     = 1;
401
5.74k
        ps_dec->u2_fld_pic             = 1;
402
5.74k
        ps_dec->u2_frm_pic             = 0;
403
5.74k
        ps_dec->ps_func_forw_or_back     = gas_impeg2d_func_fld_fw_or_bk;
404
5.74k
        ps_dec->ps_func_bi_direct       = gas_impeg2d_func_fld_bi_direct;
405
5.74k
   }
406
    /* Frame Picture */
407
22.1k
    else
408
22.1k
    {
409
22.1k
        pic_buf_t *ps_pic_buf;
410
411
412
22.1k
        ps_dec->u2_num_vert_mb       = (ps_dec->u2_vertical_size + 15) >> 4;
413
22.1k
        u4_get_disp = 1;
414
22.1k
        ps_pic_buf = impeg2_buf_mgr_get_next_free(ps_dec->pv_pic_buf_mg, &ps_dec->i4_cur_buf_id);
415
416
22.1k
        if (NULL == ps_pic_buf)
417
470
        {
418
470
            return IMPEG2D_NO_FREE_BUF_ERR;
419
470
        }
420
21.6k
        impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_DISP);
421
21.6k
        impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_REF);
422
21.6k
        if(ps_dec->u4_deinterlace)
423
21.6k
            impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, MPEG2_BUF_MGR_DEINT);
424
425
21.6k
        ps_pic_buf->u4_ts = ps_dec->u4_inp_ts;
426
21.6k
        ps_pic_buf->e_pic_type = ps_dec->e_pic_type;
427
21.6k
        ps_dec->ps_cur_pic = ps_pic_buf;
428
21.6k
        ps_dec->s_cur_frm_buf.pu1_y = ps_pic_buf->pu1_y;
429
21.6k
        ps_dec->s_cur_frm_buf.pu1_u = ps_pic_buf->pu1_u;
430
21.6k
        ps_dec->s_cur_frm_buf.pu1_v = ps_pic_buf->pu1_v;
431
432
433
21.6k
        if(ps_dec->u2_frame_pred_frame_dct == 0)
434
4.37k
        {
435
4.37k
            ps_dec->u2_read_dct_type    = 1;
436
4.37k
            ps_dec->u2_read_motion_type = 1;
437
4.37k
        }
438
17.2k
        else
439
17.2k
        {
440
17.2k
            ps_dec->u2_read_dct_type    = 0;
441
17.2k
            ps_dec->u2_read_motion_type = 0;
442
17.2k
            ps_dec->u2_motion_type     = 2;
443
17.2k
            ps_dec->u2_field_dct       = 0;
444
17.2k
        }
445
446
21.6k
        ps_dec->u2_fld_parity          = TOP;
447
21.6k
        ps_dec->u2_fld_pic             = 0;
448
21.6k
        ps_dec->u2_frm_pic             = 1;
449
21.6k
        ps_dec->ps_func_forw_or_back     = gas_impeg2d_func_frm_fw_or_bk;
450
21.6k
        ps_dec->ps_func_bi_direct       = gas_impeg2d_func_frm_bi_direct;
451
21.6k
   }
452
27.4k
    ps_dec->u2_def_dc_pred[Y_LUMA]   = 128 << ps_dec->u2_intra_dc_precision;
453
27.4k
    ps_dec->u2_def_dc_pred[U_CHROMA]   = 128 << ps_dec->u2_intra_dc_precision;
454
27.4k
    ps_dec->u2_def_dc_pred[V_CHROMA]   = 128 << ps_dec->u2_intra_dc_precision;
455
27.4k
    ps_dec->u2_num_mbs_left  = ps_dec->u2_num_horiz_mb * ps_dec->u2_num_vert_mb;
456
27.4k
    if(u4_get_disp)
457
25.0k
    {
458
25.0k
        if(ps_dec->u4_num_frames_decoded > 1)
459
20.2k
        {
460
20.2k
            ps_disp_pic = impeg2_disp_mgr_get(&ps_dec->s_disp_mgr, &ps_dec->i4_disp_buf_id);
461
20.2k
        }
462
25.0k
        ps_dec->ps_disp_pic = ps_disp_pic;
463
25.0k
        if(ps_disp_pic)
464
16.7k
        {
465
16.7k
            if(1 == ps_dec->u4_share_disp_buf)
466
0
            {
467
0
                ps_dec->ps_disp_frm_buf->pv_y_buf  = ps_disp_pic->pu1_y;
468
0
                if(IV_YUV_420P == ps_dec->i4_chromaFormat)
469
0
                {
470
0
                    ps_dec->ps_disp_frm_buf->pv_u_buf  = ps_disp_pic->pu1_u;
471
0
                    ps_dec->ps_disp_frm_buf->pv_v_buf  = ps_disp_pic->pu1_v;
472
0
                }
473
0
                else
474
0
                {
475
0
                    UWORD8 *pu1_buf;
476
477
0
                    pu1_buf = ps_dec->as_disp_buffers[ps_disp_pic->i4_buf_id].pu1_bufs[1];
478
0
                    ps_dec->ps_disp_frm_buf->pv_u_buf  = pu1_buf;
479
480
0
                    pu1_buf = ps_dec->as_disp_buffers[ps_disp_pic->i4_buf_id].pu1_bufs[2];
481
0
                    ps_dec->ps_disp_frm_buf->pv_v_buf  = pu1_buf;
482
0
                }
483
0
            }
484
16.7k
        }
485
25.0k
    }
486
487
488
27.4k
    switch(ps_dec->e_pic_type)
489
27.4k
    {
490
7.67k
    case I_PIC:
491
7.67k
        {
492
7.67k
            ps_dec->pf_decode_slice = impeg2d_dec_i_slice;
493
7.67k
            break;
494
0
        }
495
8.44k
    case D_PIC:
496
8.44k
        {
497
8.44k
            ps_dec->pf_decode_slice = impeg2d_dec_d_slice;
498
8.44k
            break;
499
0
        }
500
5.48k
    case P_PIC:
501
5.48k
        {
502
5.48k
            ps_dec->pf_decode_slice = impeg2d_dec_p_b_slice;
503
5.48k
            ps_dec->pu2_mb_type       = gau2_impeg2d_p_mb_type;
504
5.48k
            break;
505
0
        }
506
5.80k
    case B_PIC:
507
5.80k
        {
508
5.80k
            ps_dec->pf_decode_slice = impeg2d_dec_p_b_slice;
509
5.80k
            ps_dec->pu2_mb_type       = gau2_impeg2d_b_mb_type;
510
5.80k
            break;
511
0
        }
512
0
    default:
513
0
        return IMPEG2D_INVALID_PIC_TYPE;
514
27.4k
    }
515
516
    /*************************************************************************/
517
    /* Set the reference pictures                                            */
518
    /*************************************************************************/
519
520
    /* Error resilience: If forward and backward pictures are going to be NULL*/
521
    /* then assign both to the current                                        */
522
    /* if one of them NULL then we will assign the non null to the NULL one   */
523
524
27.4k
    if(ps_dec->e_pic_type == P_PIC)
525
5.48k
    {
526
5.48k
        if (NULL == ps_dec->as_recent_fld[1][0].pu1_y)
527
831
        {
528
831
            ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf;
529
831
        }
530
5.48k
        if (NULL == ps_dec->as_recent_fld[1][1].pu1_y)
531
833
        {
532
833
            impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1],
533
833
                ps_dec->u2_frame_width);
534
833
        }
535
536
5.48k
        ps_dec->as_ref_buf[FORW][TOP]    = ps_dec->as_recent_fld[1][0];
537
5.48k
        ps_dec->as_ref_buf[FORW][BOTTOM] = ps_dec->as_recent_fld[1][1];
538
539
540
5.48k
    }
541
21.9k
    else if(ps_dec->e_pic_type == B_PIC)
542
5.80k
    {
543
5.80k
        if((NULL == ps_dec->as_recent_fld[1][0].pu1_y) && (NULL == ps_dec->as_recent_fld[0][0].pu1_y))
544
764
        {
545
            // assign the current picture to both
546
764
            ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf;
547
764
            impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1],
548
764
                ps_dec->u2_frame_width);
549
764
            ps_dec->as_recent_fld[0][0] = ps_dec->s_cur_frm_buf;
550
764
            ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
551
764
        }
552
        //Assign the non-null picture to the null picture
553
5.03k
        else if ((NULL != ps_dec->as_recent_fld[1][0].pu1_y) && (NULL == ps_dec->as_recent_fld[0][0].pu1_y))
554
127
        {
555
127
            ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0];
556
127
            ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
557
127
        }
558
4.91k
        else if ((NULL == ps_dec->as_recent_fld[1][0].pu1_y) && (NULL != ps_dec->as_recent_fld[0][0].pu1_y))
559
0
        {
560
0
            ps_dec->as_recent_fld[1][0] = ps_dec->as_recent_fld[0][0];
561
0
            ps_dec->as_recent_fld[1][1] = ps_dec->as_recent_fld[0][1];
562
0
        }
563
564
        /* Error resilience: If forward and backward pictures are going to be NULL*/
565
        /* then assign both to the current                                        */
566
        /* if one of them NULL then we will assign the non null to the NULL one   */
567
568
5.80k
        if((NULL == ps_dec->as_recent_fld[0][1].pu1_y) && (NULL == ps_dec->as_recent_fld[1][1].pu1_y))
569
29
        {
570
            // assign the current picture to both
571
29
            ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf;
572
29
            impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1],
573
29
                                         ps_dec->u2_frame_width);
574
29
            ps_dec->as_recent_fld[0][0] = ps_dec->s_cur_frm_buf;
575
29
            ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
576
29
        }
577
        //Assign the non-null picture to the null picture
578
579
5.77k
        else if((NULL == ps_dec->as_recent_fld[0][1].pu1_y) && (NULL != ps_dec->as_recent_fld[1][1].pu1_y))
580
15
        {
581
15
            ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0];
582
15
            ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
583
15
        }
584
585
5.75k
        else if((NULL == ps_dec->as_recent_fld[1][1].pu1_y) && (NULL != ps_dec->as_recent_fld[0][1].pu1_y))
586
0
        {
587
0
            ps_dec->as_recent_fld[1][0] = ps_dec->as_recent_fld[0][0];
588
0
            ps_dec->as_recent_fld[1][1] = ps_dec->as_recent_fld[0][1];
589
0
        }
590
5.80k
        ps_dec->as_ref_buf[FORW][TOP]    = ps_dec->as_recent_fld[0][0];
591
5.80k
        ps_dec->as_ref_buf[FORW][BOTTOM] = ps_dec->as_recent_fld[0][1];
592
5.80k
        ps_dec->as_ref_buf[BACK][TOP]    = ps_dec->as_recent_fld[1][0];
593
5.80k
        ps_dec->as_ref_buf[BACK][BOTTOM] = ps_dec->as_recent_fld[1][1];
594
595
596
5.80k
    }
597
598
27.4k
    return e_error;
599
27.4k
}
600
601
/*******************************************************************************
602
*
603
*  Function Name   : impeg2d_post_pic_dec_proc
604
*
605
*  Description     : Performs processing that is needed at the end of picture
606
*                    decode
607
*
608
*  Arguments       :
609
*  dec             : Decoder context
610
*
611
*  Values Returned : None
612
*******************************************************************************/
613
void impeg2d_post_pic_dec_proc(dec_state_t *ps_dec)
614
27.4k
{
615
616
27.4k
   WORD32 u4_update_pic_buf = 0;
617
    /*************************************************************************/
618
    /* Processing at the end of picture                                      */
619
    /*************************************************************************/
620
27.4k
    if(ps_dec->u2_picture_structure != FRAME_PICTURE)
621
5.74k
    {
622
5.74k
        ps_dec->u2_num_vert_mb       = (ps_dec->u2_vertical_size + 31) >> 5;
623
624
5.74k
        if(ps_dec->u2_num_flds_decoded == 1)
625
2.33k
        {
626
2.33k
            ps_dec->u2_num_flds_decoded = 0;
627
2.33k
            u4_update_pic_buf = 1;
628
2.33k
        }
629
3.40k
        else
630
3.40k
        {
631
3.40k
            ps_dec->u2_num_flds_decoded = 1;
632
3.40k
        }
633
5.74k
    }
634
21.6k
    else
635
21.6k
    {
636
21.6k
        u4_update_pic_buf = 1;
637
21.6k
    }
638
639
27.4k
    if(u4_update_pic_buf)
640
24.0k
    {
641
24.0k
        ps_dec->i4_frame_decoded = 1;
642
24.0k
        if(ps_dec->e_pic_type != B_PIC)
643
18.8k
        {
644
            /* In any sequence first two pictures have to be reference pictures */
645
            /* Adding of first picture in the sequence */
646
18.8k
            if(ps_dec->aps_ref_pics[0] == NULL)
647
4.82k
            {
648
4.82k
                ps_dec->aps_ref_pics[0] = ps_dec->ps_cur_pic;
649
4.82k
            }
650
651
            /* Adding of second picture in the sequence */
652
14.0k
            else if(ps_dec->aps_ref_pics[1] == NULL)
653
1.59k
            {
654
1.59k
                ps_dec->aps_ref_pics[1] = ps_dec->ps_cur_pic;
655
1.59k
                impeg2_disp_mgr_add(&ps_dec->s_disp_mgr, ps_dec->aps_ref_pics[0], ps_dec->aps_ref_pics[0]->i4_buf_id);
656
1.59k
            }
657
12.4k
            else
658
12.4k
            {
659
660
12.4k
                impeg2_disp_mgr_add(&ps_dec->s_disp_mgr, ps_dec->aps_ref_pics[1], ps_dec->aps_ref_pics[1]->i4_buf_id);
661
12.4k
                impeg2_buf_mgr_release(ps_dec->pv_pic_buf_mg, ps_dec->aps_ref_pics[0]->i4_buf_id, BUF_MGR_REF);
662
12.4k
                ps_dec->aps_ref_pics[0] = ps_dec->aps_ref_pics[1];
663
12.4k
                ps_dec->aps_ref_pics[1] = ps_dec->ps_cur_pic;
664
665
12.4k
            }
666
18.8k
        }
667
5.17k
        else
668
5.17k
        {
669
5.17k
            impeg2_disp_mgr_add(&ps_dec->s_disp_mgr, ps_dec->ps_cur_pic, ps_dec->ps_cur_pic->i4_buf_id);
670
671
5.17k
            impeg2_buf_mgr_release(ps_dec->pv_pic_buf_mg, ps_dec->ps_cur_pic->i4_buf_id, BUF_MGR_REF);
672
5.17k
        }
673
674
24.0k
    }
675
    /*************************************************************************/
676
    /* Update the list of recent reference pictures                          */
677
    /*************************************************************************/
678
27.4k
    if(ps_dec->e_pic_type != B_PIC)
679
21.6k
    {
680
21.6k
        switch(ps_dec->u2_picture_structure)
681
21.6k
        {
682
16.7k
        case FRAME_PICTURE:
683
16.7k
            {
684
16.7k
                ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0];
685
16.7k
                ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
686
687
16.7k
                ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf;
688
16.7k
                impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1],
689
16.7k
                ps_dec->u2_frame_width);
690
16.7k
                break;
691
0
            }
692
3.86k
        case TOP_FIELD:
693
3.86k
            {
694
3.86k
                ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0];
695
3.86k
                ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf;
696
3.86k
                break;
697
0
            }
698
939
        case BOTTOM_FIELD:
699
939
            {
700
939
                ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
701
939
                impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1],
702
939
                ps_dec->u2_frame_width);
703
939
                break;
704
0
            }
705
21.6k
        }
706
21.6k
    }
707
27.4k
}