Coverage Report

Created: 2025-10-10 06:56

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
225k
{
53
225k
    UWORD8  *pu1_src_y,*pu1_src_u,*pu1_src_v;
54
225k
    UWORD8  *pu1_dst_y,*pu1_dst_u,*pu1_dst_v;
55
56
57
58
225k
    if((NULL == ps_src_pic) || (NULL == ps_src_pic->pu1_y) || (0 == u4_num_rows))
59
0
            return;
60
61
225k
    pu1_src_y   = ps_src_pic->pu1_y + (u4_start_row * ps_dec->u2_frame_width);
62
225k
    pu1_src_u   = ps_src_pic->pu1_u + ((u4_start_row >> 1) * (ps_dec->u2_frame_width >> 1));
63
225k
    pu1_src_v   = ps_src_pic->pu1_v + ((u4_start_row >> 1) *(ps_dec->u2_frame_width >> 1));
64
65
225k
    pu1_dst_y  =  (UWORD8 *)ps_disp_frm_buf->pv_y_buf + (u4_start_row *  ps_dec->u4_frm_buf_stride);
66
225k
    pu1_dst_u =   (UWORD8 *)ps_disp_frm_buf->pv_u_buf +((u4_start_row >> 1)*(ps_dec->u4_frm_buf_stride >> 1));
67
225k
    pu1_dst_v =   (UWORD8 *)ps_disp_frm_buf->pv_v_buf +((u4_start_row >> 1)*(ps_dec->u4_frm_buf_stride >> 1));
68
69
225k
    if (IV_YUV_420P == ps_dec->i4_chromaFormat)
70
100k
    {
71
100k
        ps_dec->pf_copy_yuv420p_buf(pu1_src_y, pu1_src_u, pu1_src_v, pu1_dst_y,
72
100k
                                    pu1_dst_u, pu1_dst_v,
73
100k
                                    ps_dec->u2_horizontal_size,
74
100k
                                    u4_num_rows,
75
100k
                                    ps_dec->u2_frame_width,
76
100k
                                    (ps_dec->u2_frame_width >> 1),
77
100k
                                    (ps_dec->u2_frame_width >> 1),
78
100k
                                    ps_dec->u4_frm_buf_stride,
79
100k
                                    (ps_dec->u4_frm_buf_stride >> 1),
80
100k
                                    (ps_dec->u4_frm_buf_stride >> 1));
81
100k
    }
82
124k
    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
124k
    else if((ps_dec->i4_chromaFormat == IV_YUV_420SP_UV) ||
110
42.9k
            (ps_dec->i4_chromaFormat == IV_YUV_420SP_VU))
111
124k
    {
112
113
124k
        UWORD32 dest_inc_Y=0,dest_inc_UV=0;
114
124k
        WORD32 convert_uv_only;
115
116
124k
        pu1_dst_u =   (UWORD8 *)ps_disp_frm_buf->pv_u_buf +((u4_start_row >> 1)*(ps_dec->u4_frm_buf_stride));
117
124k
        dest_inc_Y =    ps_dec->u4_frm_buf_stride;
118
124k
        dest_inc_UV =   ((ps_dec->u4_frm_buf_stride + 1) >> 1) << 1;
119
124k
        convert_uv_only = 0;
120
121
124k
        if(1 == ps_dec->u4_share_disp_buf)
122
0
            convert_uv_only = 1;
123
124
124k
        if(ps_src_pic->pu1_y == ps_disp_frm_buf->pv_y_buf)
125
56.9k
            convert_uv_only = 1;
126
127
124k
        if(ps_dec->i4_chromaFormat == IV_YUV_420SP_UV)
128
81.9k
        {
129
81.9k
            ps_dec->pf_fmt_conv_yuv420p_to_yuv420sp_uv(pu1_src_y,
130
81.9k
                pu1_src_u,
131
81.9k
                pu1_src_v,
132
81.9k
                pu1_dst_y,
133
81.9k
                pu1_dst_u,
134
81.9k
                u4_num_rows,
135
81.9k
                ps_dec->u2_horizontal_size,
136
81.9k
                ps_dec->u2_frame_width,
137
81.9k
                ps_dec->u2_frame_width >> 1,
138
81.9k
                ps_dec->u2_frame_width >> 1,
139
81.9k
                dest_inc_Y,
140
81.9k
                dest_inc_UV,
141
81.9k
                convert_uv_only);
142
81.9k
        }
143
42.9k
        else
144
42.9k
        {
145
42.9k
            ps_dec->pf_fmt_conv_yuv420p_to_yuv420sp_vu(pu1_src_y,
146
42.9k
                    pu1_src_u,
147
42.9k
                    pu1_src_v,
148
42.9k
                    pu1_dst_y,
149
42.9k
                    pu1_dst_u,
150
42.9k
                    u4_num_rows,
151
42.9k
                    ps_dec->u2_horizontal_size,
152
42.9k
                    ps_dec->u2_frame_width,
153
42.9k
                    ps_dec->u2_frame_width >> 1,
154
42.9k
                    ps_dec->u2_frame_width >> 1,
155
42.9k
                    dest_inc_Y,
156
42.9k
                    dest_inc_UV,
157
42.9k
                    convert_uv_only);
158
42.9k
        }
159
160
161
162
124k
    }
163
164
225k
}
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
21.3k
{
208
21.3k
   ps_dst_buf->pu1_y = ps_src_buf->pu1_y + u4_width;
209
21.3k
   ps_dst_buf->pu1_u = ps_src_buf->pu1_u + (u4_width>>1);
210
21.3k
   ps_dst_buf->pu1_v = ps_src_buf->pu1_v + (u4_width>>1);
211
212
21.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
736k
{
225
736k
    UWORD16 u2_mb_addr_incr = 0;
226
785k
    while (impeg2d_bit_stream_nxt(ps_stream,MB_ESCAPE_CODE_LEN) == MB_ESCAPE_CODE &&
227
49.3k
            ps_stream->u4_offset < ps_stream->u4_max_offset)
228
48.8k
    {
229
48.8k
        impeg2d_bit_stream_flush(ps_stream,MB_ESCAPE_CODE_LEN);
230
48.8k
        u2_mb_addr_incr += 33;
231
48.8k
    }
232
736k
    u2_mb_addr_incr += impeg2d_dec_vld_symbol(ps_stream,gai2_impeg2d_mb_addr_incr,MB_ADDR_INCR_LEN) +
233
736k
        MB_ADDR_INCR_OFFSET;
234
736k
    return(u2_mb_addr_incr);
235
736k
}
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
9.34k
{
251
    /*-----------------------------------------------------------------------*/
252
    /* Bit Stream  that conforms to MPEG-1 <ISO/IEC 11172-2> standard        */
253
    /*-----------------------------------------------------------------------*/
254
9.34k
    if(e_video_type == MPEG_1_VIDEO)
255
5.96k
    {
256
5.96k
        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
5.96k
        ps_dec->u2_progressive_sequence         = 1;
263
5.96k
        ps_dec->u2_intra_dc_precision           = 0;
264
5.96k
        ps_dec->u2_picture_structure            = FRAME_PICTURE;
265
5.96k
        ps_dec->u2_frame_pred_frame_dct         = 1;
266
5.96k
        ps_dec->u2_concealment_motion_vectors   = 0;
267
5.96k
        ps_dec->u2_q_scale_type                 = 0;
268
5.96k
        ps_dec->u2_intra_vlc_format             = 0;
269
5.96k
        ps_dec->u2_alternate_scan               = 0;
270
5.96k
        ps_dec->u2_repeat_first_field           = 0;
271
5.96k
        ps_dec->u2_progressive_frame            = 1;
272
5.96k
        ps_dec->u2_frame_rate_extension_n       = 0;
273
5.96k
        ps_dec->u2_frame_rate_extension_d       = 0;
274
5.96k
        ps_dec->u2_forw_f_code                  = 7;
275
5.96k
        ps_dec->u2_back_f_code                  = 7;
276
277
5.96k
        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
5.96k
    }
283
    /*-----------------------------------------------------------------------*/
284
    /* Bit Stream  that conforms to MPEG-2                                   */
285
    /*-----------------------------------------------------------------------*/
286
3.37k
    else
287
3.37k
    {
288
3.37k
        ps_dec->u2_is_mpeg2                  = 1;
289
3.37k
        ps_dec->u2_full_pel_forw_vector   = 0;
290
3.37k
        ps_dec->u2_forw_f_code            = 7;
291
3.37k
        ps_dec->u2_full_pel_back_vector   = 0;
292
3.37k
        ps_dec->u2_back_f_code            = 7;
293
3.37k
        ps_dec->pf_vld_inv_quant       = impeg2d_vld_inv_quant_mpeg2;
294
295
296
3.37k
    }
297
298
299
9.34k
    impeg2d_init_function_ptr(ps_dec);
300
301
    /* Set the frame Width and frame Height */
302
9.34k
    ps_dec->u2_frame_height        = ALIGN16(ps_dec->u2_vertical_size);
303
9.34k
    ps_dec->u2_frame_width         = ALIGN16(ps_dec->u2_horizontal_size);
304
9.34k
    ps_dec->u2_num_horiz_mb         = (ps_dec->u2_horizontal_size + 15) >> 4;
305
   // dec->u4_frm_buf_stride    = dec->frameWidth;
306
9.34k
    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
9.34k
    ps_dec->u2_num_flds_decoded = 0;
312
313
    /* Calculate the frame period */
314
9.34k
    {
315
9.34k
        UWORD32 numer;
316
9.34k
        UWORD32 denom;
317
9.34k
        numer = (UWORD32)gau2_impeg2_frm_rate_code[ps_dec->u2_frame_rate_code][1] *
318
9.34k
                                (UWORD32)(ps_dec->u2_frame_rate_extension_d + 1);
319
320
9.34k
        denom = (UWORD32)gau2_impeg2_frm_rate_code[ps_dec->u2_frame_rate_code][0] *
321
9.34k
                                (UWORD32)(ps_dec->u2_frame_rate_extension_n + 1);
322
9.34k
        ps_dec->u2_framePeriod =  (numer * 1000 * 100) / denom;
323
9.34k
    }
324
325
326
9.34k
   if(VERTICAL_SCAN == ps_dec->u2_alternate_scan)
327
271
   {
328
271
    ps_dec->pu1_inv_scan_matrix = (UWORD8 *)gau1_impeg2_inv_scan_vertical;
329
271
   }
330
9.07k
   else
331
9.07k
   {
332
9.07k
    ps_dec->pu1_inv_scan_matrix = (UWORD8 *)gau1_impeg2_inv_scan_zig_zag;
333
9.07k
   }
334
9.34k
   return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
335
9.34k
}
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.7k
{
349
28.7k
    WORD32 u4_get_disp;
350
28.7k
    pic_buf_t *ps_disp_pic;
351
28.7k
    IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
352
353
28.7k
    u4_get_disp = 0;
354
28.7k
    ps_disp_pic = NULL;
355
356
    /* Field Picture */
357
28.7k
    if(ps_dec->u2_picture_structure != FRAME_PICTURE)
358
4.72k
    {
359
4.72k
        ps_dec->u2_num_vert_mb       = (ps_dec->u2_vertical_size + 31) >> 5;
360
361
4.72k
        if(ps_dec->u2_num_flds_decoded == 0)
362
3.13k
        {
363
3.13k
            pic_buf_t *ps_pic_buf;
364
3.13k
            u4_get_disp = 1;
365
366
3.13k
            ps_pic_buf = impeg2_buf_mgr_get_next_free(ps_dec->pv_pic_buf_mg, &ps_dec->i4_cur_buf_id);
367
368
3.13k
            if (NULL == ps_pic_buf)
369
411
            {
370
411
                return IMPEG2D_NO_FREE_BUF_ERR;
371
411
            }
372
373
2.72k
            impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_DISP);
374
2.72k
            impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_REF);
375
2.72k
            if(ps_dec->u4_deinterlace)
376
2.72k
                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
2.72k
            ps_pic_buf->e_pic_type = ps_dec->e_pic_type;
379
2.72k
            ps_dec->ps_cur_pic = ps_pic_buf;
380
2.72k
            ps_dec->s_cur_frm_buf.pu1_y = ps_pic_buf->pu1_y;
381
2.72k
            ps_dec->s_cur_frm_buf.pu1_u = ps_pic_buf->pu1_u;
382
2.72k
            ps_dec->s_cur_frm_buf.pu1_v = ps_pic_buf->pu1_v;
383
2.72k
        }
384
1.58k
        else
385
1.58k
        {
386
            /* Timestamp associated with second field is associated with the current picture */
387
1.58k
            ps_dec->ps_cur_pic->u4_ts = ps_dec->u4_inp_ts;
388
1.58k
        }
389
390
4.30k
        if(ps_dec->u2_picture_structure == TOP_FIELD)
391
2.88k
        {
392
2.88k
            ps_dec->u2_fld_parity = TOP;
393
2.88k
        }
394
1.42k
        else
395
1.42k
        {
396
1.42k
            ps_dec->u2_fld_parity = BOTTOM;
397
1.42k
        }
398
4.30k
        ps_dec->u2_field_dct           = 0;
399
4.30k
        ps_dec->u2_read_dct_type        = 0;
400
4.30k
        ps_dec->u2_read_motion_type     = 1;
401
4.30k
        ps_dec->u2_fld_pic             = 1;
402
4.30k
        ps_dec->u2_frm_pic             = 0;
403
4.30k
        ps_dec->ps_func_forw_or_back     = gas_impeg2d_func_fld_fw_or_bk;
404
4.30k
        ps_dec->ps_func_bi_direct       = gas_impeg2d_func_fld_bi_direct;
405
4.30k
   }
406
    /* Frame Picture */
407
23.9k
    else
408
23.9k
    {
409
23.9k
        pic_buf_t *ps_pic_buf;
410
411
412
23.9k
        ps_dec->u2_num_vert_mb       = (ps_dec->u2_vertical_size + 15) >> 4;
413
23.9k
        u4_get_disp = 1;
414
23.9k
        ps_pic_buf = impeg2_buf_mgr_get_next_free(ps_dec->pv_pic_buf_mg, &ps_dec->i4_cur_buf_id);
415
416
23.9k
        if (NULL == ps_pic_buf)
417
476
        {
418
476
            return IMPEG2D_NO_FREE_BUF_ERR;
419
476
        }
420
23.5k
        impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_DISP);
421
23.5k
        impeg2_buf_mgr_set_status((buf_mgr_t *)ps_dec->pv_pic_buf_mg, ps_dec->i4_cur_buf_id, BUF_MGR_REF);
422
23.5k
        if(ps_dec->u4_deinterlace)
423
23.5k
            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
23.5k
        ps_pic_buf->u4_ts = ps_dec->u4_inp_ts;
426
23.5k
        ps_pic_buf->e_pic_type = ps_dec->e_pic_type;
427
23.5k
        ps_dec->ps_cur_pic = ps_pic_buf;
428
23.5k
        ps_dec->s_cur_frm_buf.pu1_y = ps_pic_buf->pu1_y;
429
23.5k
        ps_dec->s_cur_frm_buf.pu1_u = ps_pic_buf->pu1_u;
430
23.5k
        ps_dec->s_cur_frm_buf.pu1_v = ps_pic_buf->pu1_v;
431
432
433
23.5k
        if(ps_dec->u2_frame_pred_frame_dct == 0)
434
5.19k
        {
435
5.19k
            ps_dec->u2_read_dct_type    = 1;
436
5.19k
            ps_dec->u2_read_motion_type = 1;
437
5.19k
        }
438
18.3k
        else
439
18.3k
        {
440
18.3k
            ps_dec->u2_read_dct_type    = 0;
441
18.3k
            ps_dec->u2_read_motion_type = 0;
442
18.3k
            ps_dec->u2_motion_type     = 2;
443
18.3k
            ps_dec->u2_field_dct       = 0;
444
18.3k
        }
445
446
23.5k
        ps_dec->u2_fld_parity          = TOP;
447
23.5k
        ps_dec->u2_fld_pic             = 0;
448
23.5k
        ps_dec->u2_frm_pic             = 1;
449
23.5k
        ps_dec->ps_func_forw_or_back     = gas_impeg2d_func_frm_fw_or_bk;
450
23.5k
        ps_dec->ps_func_bi_direct       = gas_impeg2d_func_frm_bi_direct;
451
23.5k
   }
452
27.8k
    ps_dec->u2_def_dc_pred[Y_LUMA]   = 128 << ps_dec->u2_intra_dc_precision;
453
27.8k
    ps_dec->u2_def_dc_pred[U_CHROMA]   = 128 << ps_dec->u2_intra_dc_precision;
454
27.8k
    ps_dec->u2_def_dc_pred[V_CHROMA]   = 128 << ps_dec->u2_intra_dc_precision;
455
27.8k
    ps_dec->u2_num_mbs_left  = ps_dec->u2_num_horiz_mb * ps_dec->u2_num_vert_mb;
456
27.8k
    if(u4_get_disp)
457
26.2k
    {
458
26.2k
        if(ps_dec->u4_num_frames_decoded > 1)
459
19.9k
        {
460
19.9k
            ps_disp_pic = impeg2_disp_mgr_get(&ps_dec->s_disp_mgr, &ps_dec->i4_disp_buf_id);
461
19.9k
        }
462
26.2k
        ps_dec->ps_disp_pic = ps_disp_pic;
463
26.2k
        if(ps_disp_pic)
464
16.8k
        {
465
16.8k
            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.8k
        }
485
26.2k
    }
486
487
488
27.8k
    switch(ps_dec->e_pic_type)
489
27.8k
    {
490
6.06k
    case I_PIC:
491
6.06k
        {
492
6.06k
            ps_dec->pf_decode_slice = impeg2d_dec_i_slice;
493
6.06k
            break;
494
0
        }
495
10.4k
    case D_PIC:
496
10.4k
        {
497
10.4k
            ps_dec->pf_decode_slice = impeg2d_dec_d_slice;
498
10.4k
            break;
499
0
        }
500
5.00k
    case P_PIC:
501
5.00k
        {
502
5.00k
            ps_dec->pf_decode_slice = impeg2d_dec_p_b_slice;
503
5.00k
            ps_dec->pu2_mb_type       = gau2_impeg2d_p_mb_type;
504
5.00k
            break;
505
0
        }
506
6.25k
    case B_PIC:
507
6.25k
        {
508
6.25k
            ps_dec->pf_decode_slice = impeg2d_dec_p_b_slice;
509
6.25k
            ps_dec->pu2_mb_type       = gau2_impeg2d_b_mb_type;
510
6.25k
            break;
511
0
        }
512
0
    default:
513
0
        return IMPEG2D_INVALID_PIC_TYPE;
514
27.8k
    }
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.8k
    if(ps_dec->e_pic_type == P_PIC)
525
5.00k
    {
526
5.00k
        if (NULL == ps_dec->as_recent_fld[1][0].pu1_y)
527
1.20k
        {
528
1.20k
            ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf;
529
1.20k
        }
530
5.00k
        if (NULL == ps_dec->as_recent_fld[1][1].pu1_y)
531
1.20k
        {
532
1.20k
            impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1],
533
1.20k
                ps_dec->u2_frame_width);
534
1.20k
        }
535
536
5.00k
        ps_dec->as_ref_buf[FORW][TOP]    = ps_dec->as_recent_fld[1][0];
537
5.00k
        ps_dec->as_ref_buf[FORW][BOTTOM] = ps_dec->as_recent_fld[1][1];
538
539
540
5.00k
    }
541
22.8k
    else if(ps_dec->e_pic_type == B_PIC)
542
6.25k
    {
543
6.25k
        if((NULL == ps_dec->as_recent_fld[1][0].pu1_y) && (NULL == ps_dec->as_recent_fld[0][0].pu1_y))
544
905
        {
545
            // assign the current picture to both
546
905
            ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf;
547
905
            impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1],
548
905
                ps_dec->u2_frame_width);
549
905
            ps_dec->as_recent_fld[0][0] = ps_dec->s_cur_frm_buf;
550
905
            ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
551
905
        }
552
        //Assign the non-null picture to the null picture
553
5.35k
        else if ((NULL != ps_dec->as_recent_fld[1][0].pu1_y) && (NULL == ps_dec->as_recent_fld[0][0].pu1_y))
554
261
        {
555
261
            ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0];
556
261
            ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
557
261
        }
558
5.08k
        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
6.25k
        if((NULL == ps_dec->as_recent_fld[0][1].pu1_y) && (NULL == ps_dec->as_recent_fld[1][1].pu1_y))
569
9
        {
570
            // assign the current picture to both
571
9
            ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf;
572
9
            impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1],
573
9
                                         ps_dec->u2_frame_width);
574
9
            ps_dec->as_recent_fld[0][0] = ps_dec->s_cur_frm_buf;
575
9
            ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
576
9
        }
577
        //Assign the non-null picture to the null picture
578
579
6.24k
        else if((NULL == ps_dec->as_recent_fld[0][1].pu1_y) && (NULL != ps_dec->as_recent_fld[1][1].pu1_y))
580
5
        {
581
5
            ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0];
582
5
            ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
583
5
        }
584
585
6.24k
        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
6.25k
        ps_dec->as_ref_buf[FORW][TOP]    = ps_dec->as_recent_fld[0][0];
591
6.25k
        ps_dec->as_ref_buf[FORW][BOTTOM] = ps_dec->as_recent_fld[0][1];
592
6.25k
        ps_dec->as_ref_buf[BACK][TOP]    = ps_dec->as_recent_fld[1][0];
593
6.25k
        ps_dec->as_ref_buf[BACK][BOTTOM] = ps_dec->as_recent_fld[1][1];
594
595
596
6.25k
    }
597
598
27.8k
    return e_error;
599
27.8k
}
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.8k
{
615
616
27.8k
   WORD32 u4_update_pic_buf = 0;
617
    /*************************************************************************/
618
    /* Processing at the end of picture                                      */
619
    /*************************************************************************/
620
27.8k
    if(ps_dec->u2_picture_structure != FRAME_PICTURE)
621
4.30k
    {
622
4.30k
        ps_dec->u2_num_vert_mb       = (ps_dec->u2_vertical_size + 31) >> 5;
623
624
4.30k
        if(ps_dec->u2_num_flds_decoded == 1)
625
1.58k
        {
626
1.58k
            ps_dec->u2_num_flds_decoded = 0;
627
1.58k
            u4_update_pic_buf = 1;
628
1.58k
        }
629
2.72k
        else
630
2.72k
        {
631
2.72k
            ps_dec->u2_num_flds_decoded = 1;
632
2.72k
        }
633
4.30k
    }
634
23.5k
    else
635
23.5k
    {
636
23.5k
        u4_update_pic_buf = 1;
637
23.5k
    }
638
639
27.8k
    if(u4_update_pic_buf)
640
25.0k
    {
641
25.0k
        ps_dec->i4_frame_decoded = 1;
642
25.0k
        if(ps_dec->e_pic_type != B_PIC)
643
19.7k
        {
644
            /* In any sequence first two pictures have to be reference pictures */
645
            /* Adding of first picture in the sequence */
646
19.7k
            if(ps_dec->aps_ref_pics[0] == NULL)
647
5.69k
            {
648
5.69k
                ps_dec->aps_ref_pics[0] = ps_dec->ps_cur_pic;
649
5.69k
            }
650
651
            /* Adding of second picture in the sequence */
652
14.0k
            else if(ps_dec->aps_ref_pics[1] == NULL)
653
1.67k
            {
654
1.67k
                ps_dec->aps_ref_pics[1] = ps_dec->ps_cur_pic;
655
1.67k
                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.67k
            }
657
12.3k
            else
658
12.3k
            {
659
660
12.3k
                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.3k
                impeg2_buf_mgr_release(ps_dec->pv_pic_buf_mg, ps_dec->aps_ref_pics[0]->i4_buf_id, BUF_MGR_REF);
662
12.3k
                ps_dec->aps_ref_pics[0] = ps_dec->aps_ref_pics[1];
663
12.3k
                ps_dec->aps_ref_pics[1] = ps_dec->ps_cur_pic;
664
665
12.3k
            }
666
19.7k
        }
667
5.36k
        else
668
5.36k
        {
669
5.36k
            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.36k
            impeg2_buf_mgr_release(ps_dec->pv_pic_buf_mg, ps_dec->ps_cur_pic->i4_buf_id, BUF_MGR_REF);
672
5.36k
        }
673
674
25.0k
    }
675
    /*************************************************************************/
676
    /* Update the list of recent reference pictures                          */
677
    /*************************************************************************/
678
27.8k
    if(ps_dec->e_pic_type != B_PIC)
679
21.5k
    {
680
21.5k
        switch(ps_dec->u2_picture_structure)
681
21.5k
        {
682
18.4k
        case FRAME_PICTURE:
683
18.4k
            {
684
18.4k
                ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0];
685
18.4k
                ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
686
687
18.4k
                ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf;
688
18.4k
                impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1],
689
18.4k
                ps_dec->u2_frame_width);
690
18.4k
                break;
691
0
            }
692
2.31k
        case TOP_FIELD:
693
2.31k
            {
694
2.31k
                ps_dec->as_recent_fld[0][0] = ps_dec->as_recent_fld[1][0];
695
2.31k
                ps_dec->as_recent_fld[1][0] = ps_dec->s_cur_frm_buf;
696
2.31k
                break;
697
0
            }
698
772
        case BOTTOM_FIELD:
699
772
            {
700
772
                ps_dec->as_recent_fld[0][1] = ps_dec->as_recent_fld[1][1];
701
772
                impeg2d_get_bottom_field_buf(&ps_dec->s_cur_frm_buf, &ps_dec->as_recent_fld[1][1],
702
772
                ps_dec->u2_frame_width);
703
772
                break;
704
0
            }
705
21.5k
        }
706
21.5k
    }
707
27.8k
}