Coverage Report

Created: 2023-06-07 07:17

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