Home | History | Annotate | Download | only in decoder
      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 <string.h>
     21 #ifdef __ANDROID__
     22 #include <log/log.h>
     23 #endif
     24 #include "iv_datatypedef.h"
     25 #include "iv.h"
     26 #include "ivd.h"
     27 #include "impeg2_macros.h"
     28 #include "impeg2_buf_mgr.h"
     29 #include "impeg2_disp_mgr.h"
     30 #include "impeg2_defs.h"
     31 #include "impeg2_inter_pred.h"
     32 #include "impeg2_idct.h"
     33 #include "impeg2_format_conv.h"
     34 #include "impeg2_mem_func.h"
     35 #include "impeg2_platform_macros.h"
     36 #include "ithread.h"
     37 #include "impeg2_job_queue.h"
     38 
     39 #include "impeg2d.h"
     40 #include "impeg2d_bitstream.h"
     41 #include "impeg2d_api.h"
     42 #include "impeg2d_structs.h"
     43 #include "impeg2_globals.h"
     44 #include "impeg2d_pic_proc.h"
     45 #include "impeg2d_deinterlace.h"
     46 
     47 
     48 /*****************************************************************************
     49 * MPEG2 Constants for Parse Check
     50 ******************************************************************************/
     51 #define MPEG2_MAX_FRAME_RATE_CODE   8
     52 
     53 /******************************************************************************
     54 *  Function Name   : impeg2d_next_start_code
     55 *
     56 *  Description     : Peek for next_start_code from the stream_t.
     57 *
     58 *  Arguments       :
     59 *  dec             : Decoder Context
     60 *
     61 *  Values Returned : None
     62 ******************************************************************************/
     63 void impeg2d_next_start_code(dec_state_t *ps_dec)
     64 {
     65     stream_t *ps_stream;
     66     ps_stream = &ps_dec->s_bit_stream;
     67     impeg2d_bit_stream_flush_to_byte_boundary(ps_stream);
     68 
     69     while ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX)
     70         && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
     71     {
     72         impeg2d_bit_stream_get(ps_stream,8);
     73     }
     74     return;
     75 }
     76 /******************************************************************************
     77 *  Function Name   : impeg2d_next_code
     78 *
     79 *  Description     : Peek for next_start_code from the stream_t.
     80 *
     81 *  Arguments       :
     82 *  dec             : Decoder Context
     83 *
     84 *  Values Returned : None
     85 ******************************************************************************/
     86 void impeg2d_next_code(dec_state_t *ps_dec, UWORD32 u4_start_code_val)
     87 {
     88     stream_t *ps_stream;
     89     ps_stream = &ps_dec->s_bit_stream;
     90     impeg2d_bit_stream_flush_to_byte_boundary(ps_stream);
     91 
     92     while ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) != u4_start_code_val) &&
     93             (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
     94     {
     95 
     96         if (impeg2d_bit_stream_get(ps_stream,8) != 0)
     97         {
     98             /* Ignore stuffing bit errors. */
     99         }
    100 
    101     }
    102     return;
    103 }
    104 /******************************************************************************
    105 *  Function Name   : impeg2d_peek_next_start_code
    106 *
    107 *  Description     : Peek for next_start_code from the stream_t.
    108 *
    109 *  Arguments       :
    110 *  dec             : Decoder Context
    111 *
    112 *  Values Returned : None
    113 ******************************************************************************/
    114 void impeg2d_peek_next_start_code(dec_state_t *ps_dec)
    115 {
    116     stream_t *ps_stream;
    117     ps_stream = &ps_dec->s_bit_stream;
    118     impeg2d_bit_stream_flush_to_byte_boundary(ps_stream);
    119 
    120     while ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX)
    121         && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
    122     {
    123         impeg2d_bit_stream_get(ps_stream,8);
    124     }
    125     return;
    126 }
    127 /******************************************************************************
    128 *
    129 *  Function Name   : impeg2d_dec_seq_hdr
    130 *
    131 *  Description     : Decodes Sequence header information
    132 *
    133 *  Arguments       :
    134 *  dec             : Decoder Context
    135 *
    136 *  Values Returned : None
    137 ******************************************************************************/
    138 IMPEG2D_ERROR_CODES_T impeg2d_dec_seq_hdr(dec_state_t *ps_dec)
    139 {
    140     stream_t *ps_stream;
    141     ps_stream = &ps_dec->s_bit_stream;
    142     UWORD16 u2_height;
    143     UWORD16 u2_width;
    144 
    145     if (impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) != SEQUENCE_HEADER_CODE)
    146     {
    147         impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
    148         return IMPEG2D_FRM_HDR_START_CODE_NOT_FOUND;
    149 
    150     }
    151     impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
    152 
    153     u2_width    = impeg2d_bit_stream_get(ps_stream,12);
    154     u2_height   = impeg2d_bit_stream_get(ps_stream,12);
    155 
    156     if (0 == u2_width || 0 == u2_height)
    157     {
    158         IMPEG2D_ERROR_CODES_T e_error = IMPEG2D_FRM_HDR_DECODE_ERR;
    159         return e_error;
    160     }
    161 
    162     if ((u2_width != ps_dec->u2_horizontal_size)
    163                     || (u2_height != ps_dec->u2_vertical_size))
    164     {
    165         if (0 == ps_dec->u2_header_done)
    166         {
    167             /* This is the first time we are reading the resolution */
    168             ps_dec->u2_horizontal_size = u2_width;
    169             ps_dec->u2_vertical_size = u2_height;
    170         }
    171         else
    172         {
    173             if (0 == ps_dec->i4_pic_count)
    174             {
    175                 /* Decoder has not decoded a single frame since the last
    176                  * reset/init. This implies that we have two headers in the
    177                  * input stream. So, do not indicate a resolution change, since
    178                  * this can take the decoder into an infinite loop.
    179                  */
    180                 return (IMPEG2D_ERROR_CODES_T) IMPEG2D_FRM_HDR_DECODE_ERR;
    181             }
    182             else if((u2_width > ps_dec->u2_create_max_width)
    183                             || (u2_height > ps_dec->u2_create_max_height))
    184             {
    185                 IMPEG2D_ERROR_CODES_T e_error = IMPEG2D_UNSUPPORTED_DIMENSIONS;
    186 
    187                 ps_dec->u2_reinit_max_height   = u2_height;
    188                 ps_dec->u2_reinit_max_width    = u2_width;
    189 
    190                 return e_error;
    191             }
    192             else if((ps_dec->u2_horizontal_size < MIN_WIDTH)
    193                             || (ps_dec->u2_vertical_size < MIN_HEIGHT))
    194             {
    195                 return IMPEG2D_UNSUPPORTED_DIMENSIONS;
    196             }
    197             else
    198             {
    199                 /* The resolution has changed */
    200                 return (IMPEG2D_ERROR_CODES_T)IVD_RES_CHANGED;
    201             }
    202         }
    203     }
    204 
    205     if((ps_dec->u2_horizontal_size > ps_dec->u2_create_max_width)
    206                     || (ps_dec->u2_vertical_size > ps_dec->u2_create_max_height))
    207     {
    208         IMPEG2D_ERROR_CODES_T e_error = IMPEG2D_UNSUPPORTED_DIMENSIONS;
    209         ps_dec->u2_reinit_max_height   = ps_dec->u2_vertical_size;
    210         ps_dec->u2_reinit_max_width    = ps_dec->u2_horizontal_size;
    211         return e_error;
    212     }
    213 
    214     if((ps_dec->u2_horizontal_size < MIN_WIDTH)
    215                     || (ps_dec->u2_vertical_size < MIN_HEIGHT))
    216     {
    217         return IMPEG2D_UNSUPPORTED_DIMENSIONS;
    218     }
    219 
    220     /*------------------------------------------------------------------------*/
    221     /* Flush the following as they are not being used                         */
    222     /* aspect_ratio_info (4 bits)                                             */
    223     /*------------------------------------------------------------------------*/
    224     ps_dec->u2_aspect_ratio_info = impeg2d_bit_stream_get(ps_stream,4);
    225 
    226     /*------------------------------------------------------------------------*/
    227     /* Frame rate code(4 bits)                                                */
    228     /*------------------------------------------------------------------------*/
    229     ps_dec->u2_frame_rate_code = impeg2d_bit_stream_get(ps_stream,4);
    230     if (ps_dec->u2_frame_rate_code > MPEG2_MAX_FRAME_RATE_CODE)
    231     {
    232         return IMPEG2D_FRM_HDR_DECODE_ERR;
    233     }
    234     /*------------------------------------------------------------------------*/
    235     /* Flush the following as they are not being used                         */
    236     /* bit_rate_value (18 bits)                                               */
    237     /*------------------------------------------------------------------------*/
    238     impeg2d_bit_stream_flush(ps_stream,18);
    239     GET_MARKER_BIT(ps_dec,ps_stream);
    240     /*------------------------------------------------------------------------*/
    241     /* Flush the following as they are not being used                         */
    242     /* vbv_buffer_size_value(10 bits), constrained_parameter_flag (1 bit)     */
    243     /*------------------------------------------------------------------------*/
    244     impeg2d_bit_stream_flush(ps_stream,11);
    245 
    246     /*------------------------------------------------------------------------*/
    247     /* Quantization matrix for the intra blocks                               */
    248     /*------------------------------------------------------------------------*/
    249     if(impeg2d_bit_stream_get_bit(ps_stream) == 1)
    250     {
    251         UWORD16 i;
    252         for(i = 0; i < NUM_PELS_IN_BLOCK; i++)
    253         {
    254             ps_dec->au1_intra_quant_matrix[gau1_impeg2_inv_scan_zig_zag[i]] =  (UWORD8)impeg2d_bit_stream_get(ps_stream,8);
    255         }
    256 
    257     }
    258     else
    259     {
    260         memcpy(ps_dec->au1_intra_quant_matrix,gau1_impeg2_intra_quant_matrix_default,
    261                 NUM_PELS_IN_BLOCK);
    262     }
    263 
    264     /*------------------------------------------------------------------------*/
    265     /* Quantization matrix for the inter blocks                               */
    266     /*------------------------------------------------------------------------*/
    267     if(impeg2d_bit_stream_get_bit(ps_stream) == 1)
    268     {
    269         UWORD16 i;
    270         for(i = 0; i < NUM_PELS_IN_BLOCK; i++)
    271         {
    272             ps_dec->au1_inter_quant_matrix[gau1_impeg2_inv_scan_zig_zag[i]] =   (UWORD8)impeg2d_bit_stream_get(ps_stream,8);
    273         }
    274     }
    275     else
    276     {
    277         memcpy(ps_dec->au1_inter_quant_matrix,gau1_impeg2_inter_quant_matrix_default,
    278             NUM_PELS_IN_BLOCK);
    279     }
    280     impeg2d_next_start_code(ps_dec);
    281 
    282     return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
    283 }
    284 
    285 /******************************************************************************
    286 *
    287 *  Function Name   : impeg2d_dec_seq_ext
    288 *
    289 *  Description     : Gets additional sequence data.
    290 *
    291 *  Arguments       :
    292 *  dec             : Decoder Context
    293 *
    294 *  Values Returned : None
    295 ******************************************************************************/
    296 IMPEG2D_ERROR_CODES_T impeg2d_dec_seq_ext(dec_state_t *ps_dec)
    297 {
    298     stream_t *ps_stream;
    299     UWORD16 horizontal_value;
    300     UWORD16 vertical_value;
    301 
    302     ps_stream = &ps_dec->s_bit_stream;
    303 
    304     if (impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) != EXTENSION_START_CODE)
    305     {
    306         impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
    307         return IMPEG2D_FRM_HDR_START_CODE_NOT_FOUND;
    308 
    309     }
    310     /* Flush the extension start code */
    311     impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
    312 
    313     /* Flush extension start code identifier */
    314     impeg2d_bit_stream_flush(ps_stream,4);
    315 
    316     /*----------------------------------------------------------------------*/
    317     /* Profile and Level information                                        */
    318     /*----------------------------------------------------------------------*/
    319     {
    320         UWORD32   u4_esc_bit, u4_profile, u4_level;
    321 
    322         /* Read the profile and level information */
    323         /* check_profile_and_level: Table 8-1     */
    324         /* [7:7] 1 Escape bit                     */
    325         /* [6:4] 3 Profile identification         */
    326         /* [3:0] 4 Level identification           */
    327 
    328         u4_esc_bit   = impeg2d_bit_stream_get_bit(ps_stream);
    329         u4_profile   = impeg2d_bit_stream_get(ps_stream,3);
    330         u4_level     = impeg2d_bit_stream_get(ps_stream,4);
    331         UNUSED(u4_profile);
    332         UNUSED(u4_level);
    333         /*
    334         if( escBit == 1                   ||
    335             profile < MPEG2_MAIN_PROFILE  ||
    336             level < MPEG2_MAIN_LEVEL)
    337             */
    338         if (1 == u4_esc_bit)
    339         {
    340             return IMPEG2D_PROF_LEVEL_NOT_SUPPORTED;
    341         }
    342     }
    343 
    344     ps_dec->u2_progressive_sequence = impeg2d_bit_stream_get_bit(ps_stream);
    345 
    346     /* Read the chrominance format */
    347     if(impeg2d_bit_stream_get(ps_stream,2) != 0x1)
    348         return IMPEG2D_CHROMA_FMT_NOT_SUP;
    349 
    350     /* Error resilience: store the 2 most significant bit in horizontal and vertical   */
    351     /* variables.Use it only if adding them to the vertical and horizontal sizes       */
    352     /* respectively, doesn't exceed the MAX_WD and MAX_HT supported by the application.*/
    353 
    354 
    355     /* Read the 2 most significant bits from horizontal_size */
    356     horizontal_value               = (impeg2d_bit_stream_get(ps_stream,2) << 12);
    357 
    358     /* Read the 2 most significant bits from vertical_size */
    359     vertical_value                 = (impeg2d_bit_stream_get(ps_stream,2) << 12);
    360 
    361     /* Error resilience: The height and width should not be more than the*/
    362     /*max height and width the application can support*/
    363     if(ps_dec->u2_create_max_height < (ps_dec->u2_vertical_size + vertical_value))
    364     {
    365         return (IMPEG2D_ERROR_CODES_T) IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
    366     }
    367 
    368     if(ps_dec->u2_create_max_width < (ps_dec->u2_horizontal_size + horizontal_value))
    369     {
    370         return (IMPEG2D_ERROR_CODES_T) IVD_STREAM_WIDTH_HEIGHT_NOT_SUPPORTED;
    371     }
    372     ps_dec->u2_vertical_size       += vertical_value;
    373     ps_dec->u2_horizontal_size     += horizontal_value;
    374 
    375     /*-----------------------------------------------------------------------*/
    376     /* Flush the following as they are not used now                          */
    377     /* bit_rate_extension          12                                        */
    378     /* marker_bit                   1                                        */
    379     /* vbv_buffer_size_extension    8                                        */
    380     /* low_delay                    1                                        */
    381     /*-----------------------------------------------------------------------*/
    382     impeg2d_bit_stream_flush(ps_stream,12);
    383     GET_MARKER_BIT(ps_dec,ps_stream);
    384     impeg2d_bit_stream_flush(ps_stream,9);
    385     /*-----------------------------------------------------------------------*/
    386     /* frame_rate_extension_n       2                                        */
    387     /* frame_rate_extension_d       5                                        */
    388     /*-----------------------------------------------------------------------*/
    389     ps_dec->u2_frame_rate_extension_n = impeg2d_bit_stream_get(ps_stream,2);
    390     ps_dec->u2_frame_rate_extension_d = impeg2d_bit_stream_get(ps_stream,5);
    391 
    392     return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
    393 }
    394 
    395 /*******************************************************************************
    396 *
    397 *  Function Name   : impeg2d_dec_seq_disp_ext
    398 *
    399 *  Description     : This function is eqvt to sequence_display_extension() of
    400 *                    standard. It flushes data present as it is not being used
    401 *
    402 *  Arguments       :
    403 *  dec             : Decoder Context
    404 *
    405 *  Values Returned : None
    406 ******************************************************************************/
    407 void impeg2d_dec_seq_disp_ext(dec_state_t *ps_dec)
    408 {
    409     stream_t *ps_stream;
    410     ps_stream = &ps_dec->s_bit_stream;
    411 
    412     /*
    413     sequence_display_extension()
    414     {
    415         extension_start_code_identifier 4
    416         video_format                    3
    417         colour_description              1
    418         if (colour_description)
    419         {
    420             colour_primaries            8
    421             transfer_characteristics    8
    422             matrix_coefficients         8
    423         }
    424         display_horizontal_size         14
    425         marker_bit                      1
    426         display_vertical_size           14
    427         next_start_code()
    428     }
    429     */
    430 
    431     impeg2d_bit_stream_get(ps_stream, 4);
    432     ps_dec->u1_video_format = impeg2d_bit_stream_get(ps_stream, 3);
    433     ps_dec->u1_colour_description = impeg2d_bit_stream_get(ps_stream, 1);
    434     ps_dec->u1_colour_primaries = 2;
    435     ps_dec->u1_transfer_characteristics = 2;
    436     ps_dec->u1_matrix_coefficients = 2;
    437     if(ps_dec->u1_colour_description)
    438     {
    439         ps_dec->u1_colour_primaries = impeg2d_bit_stream_get(ps_stream, 8);
    440         ps_dec->u1_transfer_characteristics = impeg2d_bit_stream_get(ps_stream, 8);
    441         ps_dec->u1_matrix_coefficients = impeg2d_bit_stream_get(ps_stream, 8);
    442     }
    443 
    444     /* display_horizontal_size and display_vertical_size */
    445     ps_dec->u2_display_horizontal_size = impeg2d_bit_stream_get(ps_stream,14);;
    446     GET_MARKER_BIT(ps_dec,ps_stream);
    447     ps_dec->u2_display_vertical_size   = impeg2d_bit_stream_get(ps_stream,14);
    448 
    449     ps_dec->u1_seq_disp_extn_present = 1;
    450     impeg2d_next_start_code(ps_dec);
    451 }
    452 
    453 
    454 /*******************************************************************************
    455 *
    456 *  Function Name   : impeg2d_dec_seq_scale_ext
    457 *
    458 *  Description     : This function is eqvt to sequence_scalable_extension() of
    459 *                    standard.
    460 *
    461 *  Arguments       : Decoder context
    462 *
    463 *  Values Returned : None
    464 *******************************************************************************/
    465 IMPEG2D_ERROR_CODES_T impeg2d_dec_seq_scale_ext(dec_state_t *ps_dec)
    466 {
    467     UNUSED(ps_dec);
    468     return IMPEG2D_SCALABILITIY_NOT_SUPPORTED;
    469 }
    470 
    471 /*******************************************************************************
    472 *
    473 *  Function Name   : impeg2d_dec_quant_matrix_ext
    474 *
    475 *  Description     : Gets Intra and NonIntra quantizer matrix from the stream.
    476 *
    477 *  Arguments       : Decoder context
    478 *
    479 *  Values Returned : None
    480 *******************************************************************************/
    481 void impeg2d_dec_quant_matrix_ext(dec_state_t *ps_dec)
    482 {
    483     stream_t *ps_stream;
    484 
    485     ps_stream = &ps_dec->s_bit_stream;
    486     /* Flush extension_start_code_identifier */
    487     impeg2d_bit_stream_flush(ps_stream,4);
    488 
    489     /*------------------------------------------------------------------------*/
    490     /* Quantization matrix for the intra blocks                               */
    491     /*------------------------------------------------------------------------*/
    492     if(impeg2d_bit_stream_get(ps_stream,1) == 1)
    493     {
    494         UWORD16 i;
    495         for(i = 0; i < NUM_PELS_IN_BLOCK; i++)
    496         {
    497             ps_dec->au1_intra_quant_matrix[gau1_impeg2_inv_scan_zig_zag[i]] =  (UWORD8)impeg2d_bit_stream_get(ps_stream,8);
    498         }
    499 
    500     }
    501 
    502 
    503     /*------------------------------------------------------------------------*/
    504     /* Quantization matrix for the inter blocks                               */
    505     /*------------------------------------------------------------------------*/
    506     if(impeg2d_bit_stream_get(ps_stream,1) == 1)
    507     {
    508         UWORD16 i;
    509         for(i = 0; i < NUM_PELS_IN_BLOCK; i++)
    510         {
    511             ps_dec->au1_inter_quant_matrix[gau1_impeg2_inv_scan_zig_zag[i]] =   (UWORD8)impeg2d_bit_stream_get(ps_stream,8);
    512         }
    513     }
    514 
    515     /* Note : chroma intra quantizer matrix and chroma non
    516     intra quantizer matrix are not needed for 4:2:0 format */
    517     impeg2d_next_start_code(ps_dec);
    518 }
    519 /*******************************************************************************
    520 *
    521 *  Function Name   : impeg2d_dec_pic_disp_ext
    522 *
    523 *  Description     : This function is eqvt to picture_display_extension() of
    524 *                    standard.The parameters are not used by decoder
    525 *
    526 *  Arguments       : Pointer to dec_state_t
    527 *
    528 *  Values Returned : Decoder context
    529 *
    530 *  Values Returned : None
    531 *******************************************************************************/
    532 void impeg2d_dec_pic_disp_ext(dec_state_t *ps_dec)
    533 {
    534     WORD16 i2_number_of_frame_centre_offsets ;
    535     stream_t *ps_stream;
    536 
    537     ps_stream = &ps_dec->s_bit_stream;
    538     impeg2d_bit_stream_flush(ps_stream,4);
    539 
    540     if (ps_dec->u2_progressive_sequence)
    541     {
    542         i2_number_of_frame_centre_offsets = (ps_dec->u2_repeat_first_field) ?
    543             2 + ps_dec->u2_top_field_first : 1;
    544     }
    545     else
    546     {
    547         i2_number_of_frame_centre_offsets =
    548             (ps_dec->u2_picture_structure != FRAME_PICTURE) ?
    549             1 : 2 + ps_dec->u2_repeat_first_field;
    550     }
    551     while(i2_number_of_frame_centre_offsets--)
    552     {
    553         /* frame_centre_horizontal_offset */
    554         impeg2d_bit_stream_get(ps_stream,16);
    555         GET_MARKER_BIT(ps_dec,ps_stream);
    556         /* frame_centre_vertical_offset */
    557         impeg2d_bit_stream_get(ps_stream,16);
    558         GET_MARKER_BIT(ps_dec,ps_stream);
    559     }
    560     impeg2d_next_start_code(ps_dec);
    561 }
    562 
    563 /*******************************************************************************
    564 *
    565 *  Function Name   : impeg2d_dec_itu_t_ext
    566 *
    567 *  Description     : This function is eqvt to ITU-T_extension() of
    568 *                    standard.The parameters are not used by decoder
    569 *
    570 *  Arguments       : Decoder context
    571 *
    572 *  Values Returned : None
    573 *******************************************************************************/
    574 void impeg2d_dec_itu_t_ext(dec_state_t *ps_dec)
    575 {
    576   impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,EXT_ID_LEN);
    577   impeg2d_next_start_code(ps_dec);
    578 }
    579 
    580 /*******************************************************************************
    581 *  Function Name   : impeg2d_dec_copyright_ext
    582 *
    583 *  Description     : This function is eqvt to copyright_extension() of
    584 *                    standard. The parameters are not used by decoder
    585 *
    586 *  Arguments       : Decoder context
    587 *
    588 *  Values Returned : None
    589 *******************************************************************************/
    590 
    591 
    592 void impeg2d_dec_copyright_ext(dec_state_t *ps_dec)
    593 {
    594     UWORD32 u4_bits_to_flush;
    595 
    596     u4_bits_to_flush = COPYRIGHT_EXTENSION_LEN;
    597 
    598     while(u4_bits_to_flush >= 32 )
    599     {
    600         impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,32);
    601         u4_bits_to_flush = u4_bits_to_flush - 32;
    602     }
    603 
    604     if(u4_bits_to_flush > 0)
    605     {
    606         impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,u4_bits_to_flush);
    607     }
    608 
    609 
    610   impeg2d_next_start_code(ps_dec);
    611 }
    612 /*******************************************************************************
    613 *  Function Name   : impeg2d_dec_cam_param_ext
    614 *
    615 *  Description     : This function is eqvt to camera_parameters_extension() of
    616 *                    standard. The parameters are not used by decoder
    617 *
    618 *  Arguments       : Decoder context
    619 *
    620 *  Values Returned : None
    621 *******************************************************************************/
    622 
    623 
    624 void impeg2d_dec_cam_param_ext(dec_state_t *ps_dec)
    625 {
    626 
    627     UWORD32 u4_bits_to_flush;
    628 
    629     u4_bits_to_flush = CAMERA_PARAMETER_EXTENSION_LEN;
    630 
    631     while(u4_bits_to_flush >= 32 )
    632     {
    633         impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,32);
    634         u4_bits_to_flush = u4_bits_to_flush - 32;
    635     }
    636 
    637     if(u4_bits_to_flush > 0)
    638     {
    639         impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,u4_bits_to_flush);
    640     }
    641 
    642   impeg2d_next_start_code(ps_dec);
    643 }
    644 
    645 /*******************************************************************************
    646 *
    647 *  Function Name   : impeg2d_dec_grp_of_pic_hdr
    648 *
    649 *  Description     : Gets information at the GOP level.
    650 *
    651 *  Arguments       : Decoder context
    652 *
    653 *  Values Returned : None
    654 *******************************************************************************/
    655 
    656 
    657 void impeg2d_dec_grp_of_pic_hdr(dec_state_t *ps_dec)
    658 {
    659 
    660     UWORD32 u4_bits_to_flush;
    661 
    662     u4_bits_to_flush = GROUP_OF_PICTURE_LEN;
    663 
    664     while(u4_bits_to_flush >= 32 )
    665     {
    666         impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,32);
    667         u4_bits_to_flush = u4_bits_to_flush - 32;
    668     }
    669 
    670     if(u4_bits_to_flush > 0)
    671     {
    672         impeg2d_bit_stream_flush(&ps_dec->s_bit_stream,u4_bits_to_flush);
    673     }
    674 
    675 }
    676 
    677 
    678 /*******************************************************************************
    679 *
    680 *  Function Name   : impeg2d_dec_pic_hdr
    681 *
    682 *  Description     : Gets the picture header information.
    683 *
    684 *  Arguments       : Decoder context
    685 *
    686 *  Values Returned : None
    687 *******************************************************************************/
    688 IMPEG2D_ERROR_CODES_T impeg2d_dec_pic_hdr(dec_state_t *ps_dec)
    689 {
    690     stream_t *ps_stream;
    691     ps_stream = &ps_dec->s_bit_stream;
    692 
    693     impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
    694     /* Flush temporal reference */
    695     impeg2d_bit_stream_get(ps_stream,10);
    696 
    697     /* Picture type */
    698     ps_dec->e_pic_type = (e_pic_type_t)impeg2d_bit_stream_get(ps_stream,3);
    699     if((ps_dec->e_pic_type < I_PIC) || (ps_dec->e_pic_type > D_PIC))
    700     {
    701         impeg2d_next_code(ps_dec, PICTURE_START_CODE);
    702         return IMPEG2D_INVALID_PIC_TYPE;
    703     }
    704 
    705     /* Flush vbv_delay */
    706     impeg2d_bit_stream_get(ps_stream,16);
    707 
    708     if(ps_dec->e_pic_type == P_PIC || ps_dec->e_pic_type == B_PIC)
    709     {
    710         ps_dec->u2_full_pel_forw_vector = impeg2d_bit_stream_get_bit(ps_stream);
    711         ps_dec->u2_forw_f_code          = impeg2d_bit_stream_get(ps_stream,3);
    712     }
    713     if(ps_dec->e_pic_type == B_PIC)
    714     {
    715         ps_dec->u2_full_pel_back_vector = impeg2d_bit_stream_get_bit(ps_stream);
    716         ps_dec->u2_back_f_code          = impeg2d_bit_stream_get(ps_stream,3);
    717     }
    718 
    719     if(ps_dec->u2_is_mpeg2 == 0)
    720     {
    721         if (ps_dec->u2_forw_f_code < 1 || ps_dec->u2_forw_f_code > 7 ||
    722                         ps_dec->u2_back_f_code < 1 || ps_dec->u2_back_f_code > 7)
    723         {
    724             return IMPEG2D_UNKNOWN_ERROR;
    725         }
    726         ps_dec->au2_f_code[0][0] = ps_dec->au2_f_code[0][1] = ps_dec->u2_forw_f_code;
    727         ps_dec->au2_f_code[1][0] = ps_dec->au2_f_code[1][1] = ps_dec->u2_back_f_code;
    728     }
    729 
    730     /*-----------------------------------------------------------------------*/
    731     /*  Flush the extra bit value                                            */
    732     /*                                                                       */
    733     /*  while(impeg2d_bit_stream_nxt() == '1')                                  */
    734     /*  {                                                                    */
    735     /*      extra_bit_picture         1                                      */
    736     /*      extra_information_picture 8                                      */
    737     /*  }                                                                    */
    738     /*  extra_bit_picture             1                                      */
    739     /*-----------------------------------------------------------------------*/
    740     while (impeg2d_bit_stream_nxt(ps_stream,1) == 1 &&
    741            ps_stream->u4_offset < ps_stream->u4_max_offset)
    742     {
    743         impeg2d_bit_stream_get(ps_stream,9);
    744     }
    745     impeg2d_bit_stream_get_bit(ps_stream);
    746     impeg2d_next_start_code(ps_dec);
    747 
    748     return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
    749 }
    750 
    751 
    752 /*******************************************************************************
    753 *
    754 *  Function Name   : impeg2d_dec_pic_coding_ext
    755 *
    756 *  Description     : Reads more picture level parameters
    757 *
    758 *  Arguments       :
    759 *  dec             : Decoder context
    760 *
    761 *  Values Returned : Error
    762 *******************************************************************************/
    763 IMPEG2D_ERROR_CODES_T impeg2d_dec_pic_coding_ext(dec_state_t *ps_dec)
    764 {
    765 
    766     UWORD32 u4_val;
    767     stream_t *ps_stream;
    768     IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T) IV_SUCCESS;
    769 
    770     ps_stream = &ps_dec->s_bit_stream;
    771     impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
    772     /* extension code identifier */
    773     impeg2d_bit_stream_get(ps_stream,4);
    774 
    775     u4_val = impeg2d_bit_stream_get(ps_stream,4);
    776     if(u4_val == 0)
    777         return IMPEG2D_UNKNOWN_ERROR;
    778     ps_dec->au2_f_code[0][0]             = u4_val;
    779 
    780     u4_val = impeg2d_bit_stream_get(ps_stream,4);
    781     if(u4_val == 0)
    782         return IMPEG2D_UNKNOWN_ERROR;
    783     ps_dec->au2_f_code[0][1]             = u4_val;
    784 
    785     u4_val = impeg2d_bit_stream_get(ps_stream,4);
    786     if(u4_val == 0)
    787         return IMPEG2D_UNKNOWN_ERROR;
    788     ps_dec->au2_f_code[1][0]             = u4_val;
    789 
    790     u4_val = impeg2d_bit_stream_get(ps_stream,4);
    791     if(u4_val == 0)
    792         return IMPEG2D_UNKNOWN_ERROR;
    793     ps_dec->au2_f_code[1][1]             = u4_val;
    794 
    795     ps_dec->u2_intra_dc_precision        = impeg2d_bit_stream_get(ps_stream,2);
    796     ps_dec->u2_picture_structure            = impeg2d_bit_stream_get(ps_stream,2);
    797     if (ps_dec->u2_picture_structure < TOP_FIELD ||
    798                     ps_dec->u2_picture_structure > FRAME_PICTURE)
    799     {
    800         return IMPEG2D_FRM_HDR_DECODE_ERR;
    801     }
    802     ps_dec->u2_top_field_first              = impeg2d_bit_stream_get_bit(ps_stream);
    803     ps_dec->u2_frame_pred_frame_dct         = impeg2d_bit_stream_get_bit(ps_stream);
    804     ps_dec->u2_concealment_motion_vectors   = impeg2d_bit_stream_get_bit(ps_stream);
    805     ps_dec->u2_q_scale_type                 = impeg2d_bit_stream_get_bit(ps_stream);
    806     ps_dec->u2_intra_vlc_format             = impeg2d_bit_stream_get_bit(ps_stream);
    807     ps_dec->u2_alternate_scan               = impeg2d_bit_stream_get_bit(ps_stream);
    808     ps_dec->u2_repeat_first_field           = impeg2d_bit_stream_get_bit(ps_stream);
    809     /* Flush chroma_420_type */
    810     impeg2d_bit_stream_get_bit(ps_stream);
    811 
    812     ps_dec->u2_progressive_frame            = impeg2d_bit_stream_get_bit(ps_stream);
    813     if (impeg2d_bit_stream_get_bit(ps_stream))
    814     {
    815         /* Flush v_axis, field_sequence, burst_amplitude, sub_carrier_phase */
    816         impeg2d_bit_stream_flush(ps_stream,20);
    817     }
    818     impeg2d_next_start_code(ps_dec);
    819 
    820 
    821     if(VERTICAL_SCAN == ps_dec->u2_alternate_scan)
    822     {
    823         ps_dec->pu1_inv_scan_matrix = (UWORD8 *)gau1_impeg2_inv_scan_vertical;
    824     }
    825     else
    826     {
    827         ps_dec->pu1_inv_scan_matrix = (UWORD8 *)gau1_impeg2_inv_scan_zig_zag;
    828     }
    829     return e_error;
    830 }
    831 
    832 /*******************************************************************************
    833 *
    834 *  Function Name   : impeg2d_dec_slice
    835 *
    836 *  Description     : Reads Slice level parameters and calls functions that
    837 *                    decode individual MBs of slice
    838 *
    839 *  Arguments       :
    840 *  dec             : Decoder context
    841 *
    842 *  Values Returned : None
    843 *******************************************************************************/
    844 IMPEG2D_ERROR_CODES_T impeg2d_dec_slice(dec_state_t *ps_dec)
    845 {
    846     stream_t *ps_stream;
    847     UWORD32 u4_slice_vertical_position;
    848     UWORD32 u4_slice_vertical_position_extension;
    849     IMPEG2D_ERROR_CODES_T e_error;
    850 
    851     ps_stream = &ps_dec->s_bit_stream;
    852 
    853     /*------------------------------------------------------------------------*/
    854     /* All the profiles supported require restricted slice structure. Hence   */
    855     /* there is no need to store slice_vertical_position. Note that max       */
    856     /* height supported does not exceed 2800 and scalablity is not supported  */
    857     /*------------------------------------------------------------------------*/
    858 
    859     /* Remove the slice start code */
    860     impeg2d_bit_stream_flush(ps_stream,START_CODE_PREFIX_LEN);
    861     u4_slice_vertical_position = impeg2d_bit_stream_get(ps_stream, 8);
    862     if(u4_slice_vertical_position > 2800)
    863     {
    864         u4_slice_vertical_position_extension = impeg2d_bit_stream_get(ps_stream, 3);
    865         u4_slice_vertical_position += (u4_slice_vertical_position_extension << 7);
    866     }
    867 
    868     if((u4_slice_vertical_position > ps_dec->u2_num_vert_mb) ||
    869        (u4_slice_vertical_position == 0))
    870     {
    871         return IMPEG2D_INVALID_VERT_SIZE;
    872     }
    873 
    874     // change the mb_y to point to slice_vertical_position
    875     u4_slice_vertical_position--;
    876     if (ps_dec->u2_mb_y != u4_slice_vertical_position)
    877     {
    878         ps_dec->u2_mb_y    = u4_slice_vertical_position;
    879         ps_dec->u2_mb_x    = 0;
    880 
    881         /* Update the number of MBs left, since we have probably missed a slice
    882          * (that's why we see a mismatch between u2_mb_y and current position).
    883          */
    884         ps_dec->u2_num_mbs_left = (ps_dec->u2_num_vert_mb - ps_dec->u2_mb_y)
    885                         * ps_dec->u2_num_horiz_mb;
    886     }
    887     ps_dec->u2_first_mb = 1;
    888 
    889     /*------------------------------------------------------------------------*/
    890     /* Quant scale code decoding                                              */
    891     /*------------------------------------------------------------------------*/
    892     {
    893         UWORD16 u2_quant_scale_code;
    894         u2_quant_scale_code = impeg2d_bit_stream_get(ps_stream,5);
    895         ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ?
    896             gau1_impeg2_non_linear_quant_scale[u2_quant_scale_code] : (u2_quant_scale_code << 1);
    897     }
    898 
    899     if (impeg2d_bit_stream_nxt(ps_stream,1) == 1)
    900     {
    901         impeg2d_bit_stream_flush(ps_stream,9);
    902         /* Flush extra bit information */
    903         while (impeg2d_bit_stream_nxt(ps_stream,1) == 1 &&
    904                ps_stream->u4_offset < ps_stream->u4_max_offset)
    905         {
    906             impeg2d_bit_stream_flush(ps_stream,9);
    907         }
    908     }
    909     impeg2d_bit_stream_get_bit(ps_stream);
    910 
    911     /* Reset the DC predictors to reset values given in Table 7.2 at the start*/
    912     /* of slice data */
    913     ps_dec->u2_def_dc_pred[Y_LUMA]   = 128 << ps_dec->u2_intra_dc_precision;
    914     ps_dec->u2_def_dc_pred[U_CHROMA]   = 128 << ps_dec->u2_intra_dc_precision;
    915     ps_dec->u2_def_dc_pred[V_CHROMA]   = 128 << ps_dec->u2_intra_dc_precision;
    916     /*------------------------------------------------------------------------*/
    917     /* dec->DecMBsinSlice() implements the following psuedo code from standard*/
    918     /* do                                                                     */
    919     /* {                                                                      */
    920     /*      macroblock()                                                      */
    921     /* } while (impeg2d_bit_stream_nxt() != '000 0000 0000 0000 0000 0000')      */
    922     /*------------------------------------------------------------------------*/
    923 
    924     e_error = ps_dec->pf_decode_slice(ps_dec);
    925     if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
    926     {
    927         return e_error;
    928     }
    929 
    930     /* Check for the MBy index instead of number of MBs left, because the
    931      * number of MBs left in case of multi-thread decode is the number of MBs
    932      * in that row only
    933      */
    934     if(ps_dec->u2_mb_y < ps_dec->u2_num_vert_mb)
    935         impeg2d_next_start_code(ps_dec);
    936 
    937     return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
    938 }
    939 
    940 void impeg2d_dec_pic_data_thread(dec_state_t *ps_dec)
    941 {
    942     WORD32 i4_continue_decode;
    943 
    944     WORD32 i4_cur_row, temp;
    945     UWORD32 u4_bits_read;
    946     WORD32 i4_dequeue_job;
    947     IMPEG2D_ERROR_CODES_T e_error;
    948 
    949     i4_cur_row = ps_dec->u2_mb_y + 1;
    950 
    951     i4_continue_decode = 1;
    952 
    953     i4_dequeue_job = 1;
    954     do
    955     {
    956         if(i4_cur_row > ps_dec->u2_num_vert_mb)
    957         {
    958             i4_continue_decode = 0;
    959             break;
    960         }
    961 
    962         {
    963             if((ps_dec->i4_num_cores> 1) && (i4_dequeue_job))
    964             {
    965                 job_t s_job;
    966                 IV_API_CALL_STATUS_T e_ret;
    967                 UWORD8 *pu1_buf;
    968 
    969                 e_ret = impeg2_jobq_dequeue(ps_dec->pv_jobq, &s_job, sizeof(s_job), 1, 1);
    970                 if(e_ret != IV_SUCCESS)
    971                     break;
    972 
    973                 if(CMD_PROCESS == s_job.i4_cmd)
    974                 {
    975                     pu1_buf = ps_dec->pu1_inp_bits_buf + s_job.i4_bistream_ofst;
    976                     impeg2d_bit_stream_init(&(ps_dec->s_bit_stream), pu1_buf,
    977                             (ps_dec->u4_num_inp_bytes - s_job.i4_bistream_ofst));
    978                     i4_cur_row      = s_job.i2_start_mb_y;
    979                     ps_dec->i4_start_mb_y = s_job.i2_start_mb_y;
    980                     ps_dec->i4_end_mb_y = s_job.i2_end_mb_y;
    981                     ps_dec->u2_mb_x = 0;
    982                     ps_dec->u2_mb_y = ps_dec->i4_start_mb_y;
    983                     ps_dec->u2_num_mbs_left = (ps_dec->i4_end_mb_y - ps_dec->i4_start_mb_y) * ps_dec->u2_num_horiz_mb;
    984 
    985                 }
    986                 else
    987                 {
    988                     WORD32 start_row;
    989                     WORD32 num_rows;
    990                     start_row = s_job.i2_start_mb_y << 4;
    991                     num_rows = MIN((s_job.i2_end_mb_y << 4), ps_dec->u2_vertical_size);
    992                     num_rows -= start_row;
    993 
    994                     if(ps_dec->u4_deinterlace && (0 == ps_dec->u2_progressive_frame))
    995                     {
    996                         impeg2d_deinterlace(ps_dec,
    997                                             ps_dec->ps_disp_pic,
    998                                             ps_dec->ps_disp_frm_buf,
    999                                             start_row,
   1000                                             num_rows);
   1001 
   1002                     }
   1003                     else
   1004                     {
   1005                         impeg2d_format_convert(ps_dec, ps_dec->ps_disp_pic,
   1006                                                ps_dec->ps_disp_frm_buf,
   1007                                                start_row, num_rows);
   1008                     }
   1009                     break;
   1010 
   1011                 }
   1012 
   1013             }
   1014             e_error = impeg2d_dec_slice(ps_dec);
   1015 
   1016             if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1017             {
   1018                 impeg2d_next_start_code(ps_dec);
   1019                 if(ps_dec->s_bit_stream.u4_offset >= ps_dec->s_bit_stream.u4_max_offset)
   1020                 {
   1021                     ps_dec->u4_error_code = IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
   1022                     return;
   1023                 }
   1024             }
   1025         }
   1026 
   1027         /* Detecting next slice start code */
   1028         while(1)
   1029         {
   1030             // skip (dec->u4_num_cores-1) rows
   1031             u4_bits_read = impeg2d_bit_stream_nxt(&ps_dec->s_bit_stream,START_CODE_LEN);
   1032             temp = u4_bits_read & 0xFF;
   1033             i4_continue_decode = (((u4_bits_read >> 8) == 0x01) && (temp) && (temp <= 0xAF));
   1034 
   1035             if (1 == ps_dec->i4_num_cores && 0 == ps_dec->u2_num_mbs_left)
   1036             {
   1037                 i4_continue_decode = 0;
   1038 #ifdef __ANDROID__
   1039                 android_errorWriteLog(0x534e4554, "26070014");
   1040 #endif
   1041             }
   1042 
   1043             if(i4_continue_decode)
   1044             {
   1045                 if (0 != ps_dec->u2_num_mbs_left)
   1046                 {
   1047                     /* If the slice is from the same row, then continue decoding without dequeue */
   1048                     if((temp - 1) == i4_cur_row)
   1049                     {
   1050                         i4_dequeue_job = 0;
   1051                     }
   1052                     else
   1053                     {
   1054                         if(temp < ps_dec->i4_end_mb_y)
   1055                         {
   1056                             i4_cur_row = ps_dec->u2_mb_y;
   1057                         }
   1058                         else
   1059                         {
   1060                             i4_dequeue_job = 1;
   1061                         }
   1062                     }
   1063                 }
   1064                 else
   1065                 {
   1066                     i4_dequeue_job = 1;
   1067                 }
   1068                 break;
   1069             }
   1070             else
   1071                 break;
   1072         }
   1073 
   1074     }while(i4_continue_decode);
   1075     if(ps_dec->i4_num_cores > 1)
   1076     {
   1077         while(1)
   1078         {
   1079             job_t s_job;
   1080             IV_API_CALL_STATUS_T e_ret;
   1081 
   1082             e_ret = impeg2_jobq_dequeue(ps_dec->pv_jobq, &s_job, sizeof(s_job), 1, 1);
   1083             if(e_ret != IV_SUCCESS)
   1084                 break;
   1085             if(CMD_FMTCONV == s_job.i4_cmd)
   1086             {
   1087                 WORD32 start_row;
   1088                 WORD32 num_rows;
   1089                 start_row = s_job.i2_start_mb_y << 4;
   1090                 num_rows = MIN((s_job.i2_end_mb_y << 4), ps_dec->u2_vertical_size);
   1091                 num_rows -= start_row;
   1092                 if(ps_dec->u4_deinterlace && (0 == ps_dec->u2_progressive_frame))
   1093                 {
   1094                     impeg2d_deinterlace(ps_dec,
   1095                                         ps_dec->ps_disp_pic,
   1096                                         ps_dec->ps_disp_frm_buf,
   1097                                         start_row,
   1098                                         num_rows);
   1099 
   1100                 }
   1101                 else
   1102                 {
   1103                     impeg2d_format_convert(ps_dec,
   1104                                            ps_dec->ps_disp_pic,
   1105                                            ps_dec->ps_disp_frm_buf,
   1106                                            start_row,
   1107                                            num_rows);
   1108                 }
   1109             }
   1110         }
   1111     }
   1112     else
   1113     {
   1114         if((NULL != ps_dec->ps_disp_pic) && ((0 == ps_dec->u4_share_disp_buf) || (IV_YUV_420P != ps_dec->i4_chromaFormat)))
   1115         {
   1116             if(ps_dec->u4_deinterlace && (0 == ps_dec->u2_progressive_frame))
   1117             {
   1118                 impeg2d_deinterlace(ps_dec,
   1119                                     ps_dec->ps_disp_pic,
   1120                                     ps_dec->ps_disp_frm_buf,
   1121                                     0,
   1122                                     ps_dec->u2_vertical_size);
   1123 
   1124             }
   1125             else
   1126             {
   1127                 impeg2d_format_convert(ps_dec, ps_dec->ps_disp_pic,
   1128                                         ps_dec->ps_disp_frm_buf,
   1129                                         0, ps_dec->u2_vertical_size);
   1130             }
   1131         }
   1132     }
   1133 }
   1134 
   1135 static WORD32 impeg2d_init_thread_dec_ctxt(dec_state_t *ps_dec,
   1136                                            dec_state_t *ps_dec_thd,
   1137                                            WORD32 i4_min_mb_y)
   1138 {
   1139     UNUSED(i4_min_mb_y);
   1140     ps_dec_thd->i4_start_mb_y = 0;
   1141     ps_dec_thd->i4_end_mb_y = ps_dec->u2_num_vert_mb;
   1142     ps_dec_thd->u2_mb_x = 0;
   1143     ps_dec_thd->u2_mb_y = 0;
   1144     ps_dec_thd->u2_is_mpeg2 = ps_dec->u2_is_mpeg2;
   1145     ps_dec_thd->i4_pic_count = ps_dec->i4_pic_count;
   1146     ps_dec_thd->u2_frame_width = ps_dec->u2_frame_width;
   1147     ps_dec_thd->u2_frame_height = ps_dec->u2_frame_height;
   1148     ps_dec_thd->u2_picture_width = ps_dec->u2_picture_width;
   1149     ps_dec_thd->u2_horizontal_size = ps_dec->u2_horizontal_size;
   1150     ps_dec_thd->u2_vertical_size = ps_dec->u2_vertical_size;
   1151     ps_dec_thd->u2_create_max_width = ps_dec->u2_create_max_width;
   1152     ps_dec_thd->u2_create_max_height = ps_dec->u2_create_max_height;
   1153     ps_dec_thd->u2_header_done = ps_dec->u2_header_done;
   1154     ps_dec_thd->u2_decode_header = ps_dec->u2_decode_header;
   1155 
   1156     ps_dec_thd->u2_num_horiz_mb = ps_dec->u2_num_horiz_mb;
   1157     ps_dec_thd->u2_num_vert_mb = ps_dec->u2_num_vert_mb;
   1158     ps_dec_thd->u2_num_flds_decoded = ps_dec->u2_num_flds_decoded;
   1159 
   1160     ps_dec_thd->u4_frm_buf_stride = ps_dec->u4_frm_buf_stride;
   1161 
   1162     ps_dec_thd->u2_field_dct = ps_dec->u2_field_dct;
   1163     ps_dec_thd->u2_read_dct_type = ps_dec->u2_read_dct_type;
   1164 
   1165     ps_dec_thd->u2_read_motion_type = ps_dec->u2_read_motion_type;
   1166     ps_dec_thd->u2_motion_type = ps_dec->u2_motion_type;
   1167 
   1168     ps_dec_thd->pu2_mb_type = ps_dec->pu2_mb_type;
   1169     ps_dec_thd->u2_fld_pic = ps_dec->u2_fld_pic;
   1170     ps_dec_thd->u2_frm_pic = ps_dec->u2_frm_pic;
   1171 
   1172     ps_dec_thd->u2_fld_parity = ps_dec->u2_fld_parity;
   1173 
   1174     ps_dec_thd->au2_fcode_data[0] = ps_dec->au2_fcode_data[0];
   1175     ps_dec_thd->au2_fcode_data[1] = ps_dec->au2_fcode_data[1];
   1176 
   1177     ps_dec_thd->u1_quant_scale = ps_dec->u1_quant_scale;
   1178 
   1179     ps_dec_thd->u2_num_mbs_left = ps_dec->u2_num_mbs_left;
   1180     ps_dec_thd->u2_first_mb = ps_dec->u2_first_mb;
   1181     ps_dec_thd->u2_num_skipped_mbs = ps_dec->u2_num_skipped_mbs;
   1182 
   1183     memcpy(&ps_dec_thd->s_cur_frm_buf, &ps_dec->s_cur_frm_buf, sizeof(yuv_buf_t));
   1184     memcpy(&ps_dec_thd->as_recent_fld[0][0], &ps_dec->as_recent_fld[0][0], sizeof(yuv_buf_t));
   1185     memcpy(&ps_dec_thd->as_recent_fld[0][1], &ps_dec->as_recent_fld[0][1], sizeof(yuv_buf_t));
   1186     memcpy(&ps_dec_thd->as_recent_fld[1][0], &ps_dec->as_recent_fld[1][0], sizeof(yuv_buf_t));
   1187     memcpy(&ps_dec_thd->as_recent_fld[1][1], &ps_dec->as_recent_fld[1][1], sizeof(yuv_buf_t));
   1188     memcpy(&ps_dec_thd->as_ref_buf, &ps_dec->as_ref_buf, sizeof(yuv_buf_t) * 2 * 2);
   1189 
   1190 
   1191     ps_dec_thd->pf_decode_slice = ps_dec->pf_decode_slice;
   1192 
   1193     ps_dec_thd->pf_vld_inv_quant = ps_dec->pf_vld_inv_quant;
   1194 
   1195     memcpy(ps_dec_thd->pf_idct_recon, ps_dec->pf_idct_recon, sizeof(ps_dec->pf_idct_recon));
   1196 
   1197     memcpy(ps_dec_thd->pf_mc, ps_dec->pf_mc, sizeof(ps_dec->pf_mc));
   1198     ps_dec_thd->pf_interpolate = ps_dec->pf_interpolate;
   1199     ps_dec_thd->pf_copy_mb = ps_dec->pf_copy_mb;
   1200     ps_dec_thd->pf_fullx_halfy_8x8              =  ps_dec->pf_fullx_halfy_8x8;
   1201     ps_dec_thd->pf_halfx_fully_8x8              =  ps_dec->pf_halfx_fully_8x8;
   1202     ps_dec_thd->pf_halfx_halfy_8x8              =  ps_dec->pf_halfx_halfy_8x8;
   1203     ps_dec_thd->pf_fullx_fully_8x8              =  ps_dec->pf_fullx_fully_8x8;
   1204 
   1205     ps_dec_thd->pf_memset_8bit_8x8_block        =  ps_dec->pf_memset_8bit_8x8_block;
   1206     ps_dec_thd->pf_memset_16bit_8x8_linear_block        =  ps_dec->pf_memset_16bit_8x8_linear_block;
   1207     ps_dec_thd->pf_copy_yuv420p_buf             =   ps_dec->pf_copy_yuv420p_buf;
   1208     ps_dec_thd->pf_fmt_conv_yuv420p_to_yuv422ile    =   ps_dec->pf_fmt_conv_yuv420p_to_yuv422ile;
   1209     ps_dec_thd->pf_fmt_conv_yuv420p_to_yuv420sp_uv  =   ps_dec->pf_fmt_conv_yuv420p_to_yuv420sp_uv;
   1210     ps_dec_thd->pf_fmt_conv_yuv420p_to_yuv420sp_vu  =   ps_dec->pf_fmt_conv_yuv420p_to_yuv420sp_vu;
   1211 
   1212 
   1213     memcpy(ps_dec_thd->au1_intra_quant_matrix, ps_dec->au1_intra_quant_matrix, NUM_PELS_IN_BLOCK * sizeof(UWORD8));
   1214     memcpy(ps_dec_thd->au1_inter_quant_matrix, ps_dec->au1_inter_quant_matrix, NUM_PELS_IN_BLOCK * sizeof(UWORD8));
   1215     ps_dec_thd->pu1_inv_scan_matrix = ps_dec->pu1_inv_scan_matrix;
   1216 
   1217 
   1218     ps_dec_thd->u2_progressive_sequence = ps_dec->u2_progressive_sequence;
   1219     ps_dec_thd->e_pic_type =  ps_dec->e_pic_type;
   1220     ps_dec_thd->u2_full_pel_forw_vector = ps_dec->u2_full_pel_forw_vector;
   1221     ps_dec_thd->u2_forw_f_code =   ps_dec->u2_forw_f_code;
   1222     ps_dec_thd->u2_full_pel_back_vector = ps_dec->u2_full_pel_back_vector;
   1223     ps_dec_thd->u2_back_f_code = ps_dec->u2_back_f_code;
   1224 
   1225     memcpy(ps_dec_thd->ai2_mv, ps_dec->ai2_mv, (2*2*2)*sizeof(WORD16));
   1226     memcpy(ps_dec_thd->au2_f_code, ps_dec->au2_f_code, (2*2)*sizeof(UWORD16));
   1227     ps_dec_thd->u2_intra_dc_precision = ps_dec->u2_intra_dc_precision;
   1228     ps_dec_thd->u2_picture_structure = ps_dec->u2_picture_structure;
   1229     ps_dec_thd->u2_top_field_first = ps_dec->u2_top_field_first;
   1230     ps_dec_thd->u2_frame_pred_frame_dct = ps_dec->u2_frame_pred_frame_dct;
   1231     ps_dec_thd->u2_concealment_motion_vectors = ps_dec->u2_concealment_motion_vectors;
   1232     ps_dec_thd->u2_q_scale_type =  ps_dec->u2_q_scale_type;
   1233     ps_dec_thd->u2_intra_vlc_format = ps_dec->u2_intra_vlc_format;
   1234     ps_dec_thd->u2_alternate_scan = ps_dec->u2_alternate_scan;
   1235     ps_dec_thd->u2_repeat_first_field = ps_dec->u2_repeat_first_field;
   1236     ps_dec_thd->u2_progressive_frame = ps_dec->u2_progressive_frame;
   1237     ps_dec_thd->pu1_inp_bits_buf = ps_dec->pu1_inp_bits_buf;
   1238     ps_dec_thd->u4_num_inp_bytes = ps_dec->u4_num_inp_bytes;
   1239     ps_dec_thd->pv_jobq = ps_dec->pv_jobq;
   1240     ps_dec_thd->pv_jobq_buf = ps_dec->pv_jobq_buf;
   1241     ps_dec_thd->i4_jobq_buf_size = ps_dec->i4_jobq_buf_size;
   1242 
   1243 
   1244     ps_dec_thd->u2_frame_rate_code = ps_dec->u2_frame_rate_code;
   1245     ps_dec_thd->u2_frame_rate_extension_n = ps_dec->u2_frame_rate_extension_n;
   1246     ps_dec_thd->u2_frame_rate_extension_d = ps_dec->u2_frame_rate_extension_d;
   1247     ps_dec_thd->u2_framePeriod =   ps_dec->u2_framePeriod;
   1248     ps_dec_thd->u2_display_horizontal_size = ps_dec->u2_display_horizontal_size;
   1249     ps_dec_thd->u2_display_vertical_size = ps_dec->u2_display_vertical_size;
   1250     ps_dec_thd->u2_aspect_ratio_info = ps_dec->u2_aspect_ratio_info;
   1251 
   1252     ps_dec_thd->ps_func_bi_direct = ps_dec->ps_func_bi_direct;
   1253     ps_dec_thd->ps_func_forw_or_back = ps_dec->ps_func_forw_or_back;
   1254     ps_dec_thd->pv_deinterlacer_ctxt = ps_dec->pv_deinterlacer_ctxt;
   1255     ps_dec_thd->ps_deint_pic = ps_dec->ps_deint_pic;
   1256 
   1257     return 0;
   1258 }
   1259 
   1260 
   1261 WORD32 impeg2d_get_slice_pos(dec_state_multi_core_t *ps_dec_state_multi_core)
   1262 {
   1263     WORD32 u4_bits;
   1264     WORD32 i4_row;
   1265 
   1266 
   1267     dec_state_t *ps_dec = ps_dec_state_multi_core->ps_dec_state[0];
   1268     WORD32 i4_prev_row;
   1269     stream_t s_bitstrm;
   1270     WORD32 i4_start_row;
   1271     WORD32 i4_slice_bistream_ofst;
   1272     WORD32 i;
   1273     s_bitstrm = ps_dec->s_bit_stream;
   1274     i4_prev_row = -1;
   1275 
   1276     ps_dec_state_multi_core->ps_dec_state[0]->i4_start_mb_y = 0;
   1277     ps_dec_state_multi_core->ps_dec_state[1]->i4_start_mb_y = -1;
   1278     ps_dec_state_multi_core->ps_dec_state[2]->i4_start_mb_y = -1;
   1279     ps_dec_state_multi_core->ps_dec_state[3]->i4_start_mb_y = -1;
   1280 
   1281     ps_dec_state_multi_core->ps_dec_state[0]->i4_end_mb_y = ps_dec->u2_num_vert_mb;
   1282     ps_dec_state_multi_core->ps_dec_state[1]->i4_end_mb_y = -1;
   1283     ps_dec_state_multi_core->ps_dec_state[2]->i4_end_mb_y = -1;
   1284     ps_dec_state_multi_core->ps_dec_state[3]->i4_end_mb_y = -1;
   1285 
   1286     if(ps_dec->i4_num_cores == 1)
   1287         return 0;
   1288     /* Reset the jobq to start of the jobq buffer */
   1289     impeg2_jobq_reset((jobq_t *)ps_dec->pv_jobq);
   1290 
   1291     i4_start_row = -1;
   1292     i4_slice_bistream_ofst = 0;
   1293     while(1)
   1294     {
   1295         WORD32 i4_is_slice;
   1296 
   1297         if(s_bitstrm.u4_offset + START_CODE_LEN >= s_bitstrm.u4_max_offset)
   1298         {
   1299             break;
   1300         }
   1301         u4_bits = impeg2d_bit_stream_nxt(&s_bitstrm,START_CODE_LEN);
   1302 
   1303         i4_row = u4_bits & 0xFF;
   1304 
   1305         /* Detect end of frame */
   1306         i4_is_slice = (((u4_bits >> 8) == 0x01) && (i4_row) && (i4_row <= ps_dec->u2_num_vert_mb));
   1307         if(!i4_is_slice)
   1308             break;
   1309 
   1310         i4_row -= 1;
   1311 
   1312 
   1313         if(i4_prev_row < i4_row)
   1314         {
   1315             /* Create a job for previous slice row */
   1316             if(i4_start_row != -1)
   1317             {
   1318                 job_t s_job;
   1319                 IV_API_CALL_STATUS_T ret;
   1320                 s_job.i2_start_mb_y = i4_start_row;
   1321                 s_job.i2_end_mb_y = i4_row;
   1322                 s_job.i4_cmd = CMD_PROCESS;
   1323                 s_job.i4_bistream_ofst = i4_slice_bistream_ofst;
   1324                 ret = impeg2_jobq_queue(ps_dec->pv_jobq, &s_job, sizeof(s_job), 1, 0);
   1325                 if(ret != IV_SUCCESS)
   1326                     return ret;
   1327 
   1328             }
   1329             /* Store current slice's bitstream offset */
   1330             i4_slice_bistream_ofst = s_bitstrm.u4_offset >> 3;
   1331             i4_slice_bistream_ofst -= (size_t)s_bitstrm.pv_bs_buf & 3;
   1332             i4_prev_row = i4_row;
   1333 
   1334             /* Store current slice's row position */
   1335             i4_start_row = i4_row;
   1336 
   1337         }
   1338 #ifdef __ANDROID__
   1339         else if (i4_prev_row > i4_row)
   1340         {
   1341             android_errorWriteLog(0x534e4554, "26070014");
   1342         }
   1343 #endif
   1344 
   1345         impeg2d_bit_stream_flush(&s_bitstrm, START_CODE_LEN);
   1346 
   1347         // flush bytes till next start code
   1348         /* Flush the bytes till a  start code is encountered  */
   1349         while(impeg2d_bit_stream_nxt(&s_bitstrm, 24) != START_CODE_PREFIX)
   1350         {
   1351             impeg2d_bit_stream_get(&s_bitstrm, 8);
   1352 
   1353             if(s_bitstrm.u4_offset >= s_bitstrm.u4_max_offset)
   1354             {
   1355                 break;
   1356             }
   1357         }
   1358     }
   1359 
   1360     /* Create job for the last slice row */
   1361     {
   1362         job_t s_job;
   1363         IV_API_CALL_STATUS_T e_ret;
   1364         s_job.i2_start_mb_y = i4_start_row;
   1365         s_job.i2_end_mb_y = ps_dec->u2_num_vert_mb;
   1366         s_job.i4_cmd = CMD_PROCESS;
   1367         s_job.i4_bistream_ofst = i4_slice_bistream_ofst;
   1368         e_ret = impeg2_jobq_queue(ps_dec->pv_jobq, &s_job, sizeof(s_job), 1, 0);
   1369         if(e_ret != IV_SUCCESS)
   1370             return e_ret;
   1371 
   1372     }
   1373     if((NULL != ps_dec->ps_disp_pic) && ((0 == ps_dec->u4_share_disp_buf) || (IV_YUV_420P != ps_dec->i4_chromaFormat)))
   1374     {
   1375         for(i = 0; i < ps_dec->u2_vertical_size; i+=64)
   1376         {
   1377             job_t s_job;
   1378             IV_API_CALL_STATUS_T ret;
   1379             s_job.i2_start_mb_y = i;
   1380             s_job.i2_start_mb_y >>= 4;
   1381             s_job.i2_end_mb_y = (i + 64);
   1382             s_job.i2_end_mb_y >>= 4;
   1383             s_job.i4_cmd = CMD_FMTCONV;
   1384             s_job.i4_bistream_ofst = 0;
   1385             ret = impeg2_jobq_queue(ps_dec->pv_jobq, &s_job, sizeof(s_job), 1, 0);
   1386             if(ret != IV_SUCCESS)
   1387                 return ret;
   1388 
   1389         }
   1390     }
   1391 
   1392     impeg2_jobq_terminate(ps_dec->pv_jobq);
   1393     ps_dec->i4_bytes_consumed = s_bitstrm.u4_offset >> 3;
   1394     ps_dec->i4_bytes_consumed -= ((size_t)s_bitstrm.pv_bs_buf & 3);
   1395 
   1396     return 0;
   1397 }
   1398 
   1399 /*******************************************************************************
   1400 *
   1401 *  Function Name   : impeg2d_dec_pic_data
   1402 *
   1403 *  Description     : It intializes several parameters and decodes a Picture
   1404 *                    till any slice is left.
   1405 *
   1406 *  Arguments       :
   1407 *  dec             : Decoder context
   1408 *
   1409 *  Values Returned : None
   1410 *******************************************************************************/
   1411 
   1412 void impeg2d_dec_pic_data(dec_state_t *ps_dec)
   1413 {
   1414 
   1415     WORD32 i;
   1416     dec_state_multi_core_t *ps_dec_state_multi_core;
   1417 
   1418     dec_state_t *ps_dec_thd;
   1419     WORD32 i4_status;
   1420     WORD32 i4_min_mb_y;
   1421 
   1422 
   1423     /* Resetting the MB address and MB coordinates at the start of the Frame */
   1424     ps_dec->u2_mb_x = ps_dec->u2_mb_y = 0;
   1425 
   1426     ps_dec_state_multi_core = ps_dec->ps_dec_state_multi_core;
   1427     impeg2d_get_slice_pos(ps_dec_state_multi_core);
   1428 
   1429     i4_min_mb_y = 1;
   1430     for(i=0; i < ps_dec->i4_num_cores - 1; i++)
   1431     {
   1432         // initialize decoder context for thread
   1433         // launch dec->u4_num_cores-1 threads
   1434 
   1435         ps_dec_thd = ps_dec_state_multi_core->ps_dec_state[i+1];
   1436 
   1437         ps_dec_thd->ps_disp_pic = ps_dec->ps_disp_pic;
   1438         ps_dec_thd->ps_disp_frm_buf = ps_dec->ps_disp_frm_buf;
   1439 
   1440         i4_status = impeg2d_init_thread_dec_ctxt(ps_dec, ps_dec_thd, i4_min_mb_y);
   1441         //impeg2d_dec_pic_data_thread(ps_dec_thd);
   1442 
   1443         if(i4_status == 0)
   1444         {
   1445             ithread_create(ps_dec_thd->pv_codec_thread_handle, NULL, (void *)impeg2d_dec_pic_data_thread, ps_dec_thd);
   1446             ps_dec_state_multi_core->au4_thread_launched[i + 1] = 1;
   1447             i4_min_mb_y = ps_dec_thd->u2_mb_y + 1;
   1448         }
   1449         else
   1450         {
   1451             ps_dec_state_multi_core->au4_thread_launched[i + 1] = 0;
   1452             break;
   1453         }
   1454     }
   1455 
   1456     impeg2d_dec_pic_data_thread(ps_dec);
   1457 
   1458     // wait for threads to complete
   1459     for(i=0; i < (ps_dec->i4_num_cores - 1); i++)
   1460     {
   1461         if(ps_dec_state_multi_core->au4_thread_launched[i + 1] == 1)
   1462         {
   1463             ps_dec_thd = ps_dec_state_multi_core->ps_dec_state[i+1];
   1464             ithread_join(ps_dec_thd->pv_codec_thread_handle, NULL);
   1465         }
   1466     }
   1467 
   1468 }
   1469 /*******************************************************************************
   1470 *
   1471 *  Function Name   : impeg2d_flush_ext_and_user_data
   1472 *
   1473 *  Description     : Flushes the extension and user data present in the
   1474 *                    stream_t
   1475 *
   1476 *  Arguments       :
   1477 *  dec             : Decoder context
   1478 *
   1479 *  Values Returned : None
   1480 *******************************************************************************/
   1481 void impeg2d_flush_ext_and_user_data(dec_state_t *ps_dec)
   1482 {
   1483     UWORD32 u4_start_code;
   1484     stream_t *ps_stream;
   1485 
   1486     ps_stream    = &ps_dec->s_bit_stream;
   1487     u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
   1488 
   1489     while((u4_start_code == EXTENSION_START_CODE || u4_start_code == USER_DATA_START_CODE) &&
   1490             (ps_stream->u4_offset < ps_stream->u4_max_offset))
   1491     {
   1492         impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
   1493         while(impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX &&
   1494                 (ps_stream->u4_offset < ps_stream->u4_max_offset))
   1495         {
   1496             impeg2d_bit_stream_flush(ps_stream,8);
   1497         }
   1498         u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
   1499     }
   1500 }
   1501 /*******************************************************************************
   1502 *
   1503 *  Function Name   : impeg2d_dec_user_data
   1504 *
   1505 *  Description     : Flushes the user data present in the stream_t
   1506 *
   1507 *  Arguments       :
   1508 *  dec             : Decoder context
   1509 *
   1510 *  Values Returned : None
   1511 *******************************************************************************/
   1512 void impeg2d_dec_user_data(dec_state_t *ps_dec)
   1513 {
   1514     UWORD32 u4_start_code;
   1515     stream_t *ps_stream;
   1516 
   1517     ps_stream    = &ps_dec->s_bit_stream;
   1518     u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
   1519 
   1520     while(u4_start_code == USER_DATA_START_CODE)
   1521     {
   1522         impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
   1523         while((impeg2d_bit_stream_nxt(ps_stream,START_CODE_PREFIX_LEN) != START_CODE_PREFIX) &&
   1524                 (ps_stream->u4_offset < ps_stream->u4_max_offset))
   1525         {
   1526             impeg2d_bit_stream_flush(ps_stream,8);
   1527         }
   1528         u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
   1529     }
   1530 }
   1531 /*******************************************************************************
   1532 *  Function Name   : impeg2d_dec_seq_ext_data
   1533 *
   1534 *  Description     : Decodes the extension data following Sequence
   1535 *                    Extension. It flushes any user data if present
   1536 *
   1537 *  Arguments       :
   1538 *  dec             : Decoder context
   1539 *
   1540 *  Values Returned : None
   1541 *******************************************************************************/
   1542 IMPEG2D_ERROR_CODES_T impeg2d_dec_seq_ext_data(dec_state_t *ps_dec)
   1543 {
   1544     stream_t   *ps_stream;
   1545     UWORD32     u4_start_code;
   1546     IMPEG2D_ERROR_CODES_T e_error;
   1547 
   1548     e_error = (IMPEG2D_ERROR_CODES_T) IVD_ERROR_NONE;
   1549 
   1550     ps_stream      = &ps_dec->s_bit_stream;
   1551     u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
   1552     while( (u4_start_code == EXTENSION_START_CODE ||
   1553             u4_start_code == USER_DATA_START_CODE) &&
   1554             (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE == e_error &&
   1555             (ps_stream->u4_offset < ps_stream->u4_max_offset))
   1556     {
   1557         if(u4_start_code == USER_DATA_START_CODE)
   1558         {
   1559             impeg2d_dec_user_data(ps_dec);
   1560         }
   1561         else
   1562         {
   1563             impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
   1564             u4_start_code   = impeg2d_bit_stream_nxt(ps_stream,EXT_ID_LEN);
   1565             switch(u4_start_code)
   1566             {
   1567             case SEQ_DISPLAY_EXT_ID:
   1568                 impeg2d_dec_seq_disp_ext(ps_dec);
   1569                 break;
   1570             case SEQ_SCALABLE_EXT_ID:
   1571                 e_error = IMPEG2D_SCALABILITIY_NOT_SUPPORTED;
   1572                 break;
   1573             default:
   1574                 /* In case its a reserved extension code */
   1575                 impeg2d_bit_stream_flush(ps_stream,EXT_ID_LEN);
   1576                 impeg2d_peek_next_start_code(ps_dec);
   1577                 break;
   1578             }
   1579         }
   1580         u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
   1581     }
   1582     return e_error;
   1583 }
   1584 /*******************************************************************************
   1585 *  Function Name   : impeg2d_dec_pic_ext_data
   1586 *
   1587 *  Description     : Decodes the extension data following Picture Coding
   1588 *                    Extension. It flushes any user data if present
   1589 *
   1590 *  Arguments       :
   1591 *  dec             : Decoder context
   1592 *
   1593 *  Values Returned : None
   1594 *******************************************************************************/
   1595 IMPEG2D_ERROR_CODES_T impeg2d_dec_pic_ext_data(dec_state_t *ps_dec)
   1596 {
   1597     stream_t   *ps_stream;
   1598     UWORD32     u4_start_code;
   1599     IMPEG2D_ERROR_CODES_T e_error;
   1600 
   1601     e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
   1602 
   1603     ps_stream      = &ps_dec->s_bit_stream;
   1604     u4_start_code   = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
   1605     while ( (u4_start_code == EXTENSION_START_CODE ||
   1606             u4_start_code == USER_DATA_START_CODE) &&
   1607             (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE == e_error &&
   1608             (ps_stream->u4_offset < ps_stream->u4_max_offset))
   1609     {
   1610         if(u4_start_code == USER_DATA_START_CODE)
   1611         {
   1612             impeg2d_dec_user_data(ps_dec);
   1613         }
   1614         else
   1615         {
   1616             impeg2d_bit_stream_flush(ps_stream,START_CODE_LEN);
   1617             u4_start_code   = impeg2d_bit_stream_nxt(ps_stream,EXT_ID_LEN);
   1618             switch(u4_start_code)
   1619             {
   1620             case QUANT_MATRIX_EXT_ID:
   1621                 impeg2d_dec_quant_matrix_ext(ps_dec);
   1622                 break;
   1623             case COPYRIGHT_EXT_ID:
   1624                 impeg2d_dec_copyright_ext(ps_dec);
   1625                 break;
   1626             case PIC_DISPLAY_EXT_ID:
   1627                 impeg2d_dec_pic_disp_ext(ps_dec);
   1628                 break;
   1629             case CAMERA_PARAM_EXT_ID:
   1630                 impeg2d_dec_cam_param_ext(ps_dec);
   1631                 break;
   1632             case ITU_T_EXT_ID:
   1633                 impeg2d_dec_itu_t_ext(ps_dec);
   1634                 break;
   1635             case PIC_SPATIAL_SCALABLE_EXT_ID:
   1636             case PIC_TEMPORAL_SCALABLE_EXT_ID:
   1637                 e_error = IMPEG2D_SCALABLITY_NOT_SUP;
   1638                 break;
   1639             default:
   1640                 /* In case its a reserved extension code */
   1641                 impeg2d_bit_stream_flush(ps_stream,EXT_ID_LEN);
   1642                 impeg2d_next_start_code(ps_dec);
   1643                 break;
   1644             }
   1645         }
   1646         u4_start_code = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
   1647     }
   1648     return e_error;
   1649 }
   1650 
   1651 /*******************************************************************************
   1652 *
   1653 *  Function Name   : impeg2d_process_video_header
   1654 *
   1655 *  Description     : Processes video sequence header information
   1656 *
   1657 *  Arguments       :
   1658 *  dec             : Decoder context
   1659 *
   1660 *  Values Returned : None
   1661 *******************************************************************************/
   1662 IMPEG2D_ERROR_CODES_T impeg2d_process_video_header(dec_state_t *ps_dec)
   1663 {
   1664     stream_t *ps_stream;
   1665     ps_stream = &ps_dec->s_bit_stream;
   1666     IMPEG2D_ERROR_CODES_T e_error;
   1667 
   1668     impeg2d_next_code(ps_dec, SEQUENCE_HEADER_CODE);
   1669     if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
   1670     {
   1671         e_error = impeg2d_dec_seq_hdr(ps_dec);
   1672         if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1673         {
   1674             return e_error;
   1675         }
   1676     }
   1677     else
   1678     {
   1679       return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
   1680     }
   1681     if (impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) == EXTENSION_START_CODE)
   1682     {
   1683         /* MPEG2 Decoder */
   1684         if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
   1685         {
   1686             e_error = impeg2d_dec_seq_ext(ps_dec);
   1687             if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1688             {
   1689                 return e_error;
   1690             }
   1691         }
   1692         else
   1693         {
   1694           return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
   1695         }
   1696         if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
   1697         {
   1698             e_error = impeg2d_dec_seq_ext_data(ps_dec);
   1699             if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1700             {
   1701                 return e_error;
   1702             }
   1703         }
   1704         return impeg2d_init_video_state(ps_dec,MPEG_2_VIDEO);
   1705     }
   1706     else
   1707     {
   1708          /* MPEG1 Decoder */
   1709         if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
   1710         {
   1711             impeg2d_flush_ext_and_user_data(ps_dec);
   1712         }
   1713         return impeg2d_init_video_state(ps_dec,MPEG_1_VIDEO);
   1714     }
   1715 }
   1716 /*******************************************************************************
   1717 *
   1718 *  Function Name   : impeg2d_process_video_bit_stream
   1719 *
   1720 *  Description     : Processes video sequence header information
   1721 *
   1722 *  Arguments       :
   1723 *  dec             : Decoder context
   1724 *
   1725 *  Values Returned : None
   1726 *******************************************************************************/
   1727 IMPEG2D_ERROR_CODES_T impeg2d_process_video_bit_stream(dec_state_t *ps_dec)
   1728 {
   1729     stream_t *ps_stream;
   1730     UWORD32 u4_next_bits, u4_start_code_found;
   1731     IMPEG2D_ERROR_CODES_T e_error;
   1732 
   1733     ps_stream = &ps_dec->s_bit_stream;
   1734     impeg2d_next_start_code(ps_dec);
   1735     /* If the stream is MPEG-2 compliant stream */
   1736     u4_start_code_found = 0;
   1737 
   1738     if(ps_dec->u2_is_mpeg2)
   1739     {
   1740         /* MPEG2 decoding starts */
   1741         while((u4_start_code_found == 0) && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
   1742         {
   1743             u4_next_bits = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
   1744 
   1745             if(u4_next_bits == SEQUENCE_HEADER_CODE)
   1746             {
   1747                 if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
   1748                 {
   1749                     e_error = impeg2d_dec_seq_hdr(ps_dec);
   1750                     if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1751                     {
   1752                         return e_error;
   1753                     }
   1754 
   1755                     u4_start_code_found = 0;
   1756 
   1757                 }
   1758                 else
   1759                 {
   1760                     return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
   1761                 }
   1762 
   1763 
   1764                 if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
   1765                 {
   1766                     IMPEG2D_ERROR_CODES_T e_error;
   1767                     e_error = impeg2d_dec_seq_ext(ps_dec);
   1768                     if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1769                     {
   1770                         return e_error;
   1771                     }
   1772                     u4_start_code_found = 0;
   1773 
   1774                 }
   1775                 else
   1776                 {
   1777                     return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
   1778                 }
   1779             }
   1780             else if((u4_next_bits == USER_DATA_START_CODE) || (u4_next_bits == EXTENSION_START_CODE))
   1781             {
   1782                 if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
   1783                 {
   1784                     impeg2d_dec_seq_ext_data(ps_dec);
   1785                     u4_start_code_found = 0;
   1786 
   1787                 }
   1788 
   1789             }
   1790             else if((ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
   1791                     && (u4_next_bits == GOP_START_CODE))
   1792             {
   1793                 impeg2d_dec_grp_of_pic_hdr(ps_dec);
   1794                 impeg2d_dec_user_data(ps_dec);
   1795                 u4_start_code_found = 0;
   1796 
   1797             }
   1798             else if((ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
   1799                     && (u4_next_bits == PICTURE_START_CODE))
   1800             {
   1801                 ps_dec->i4_pic_count++;
   1802 
   1803                 e_error = impeg2d_dec_pic_hdr(ps_dec);
   1804                 if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1805                 {
   1806                     return e_error;
   1807                 }
   1808                 e_error = impeg2d_dec_pic_coding_ext(ps_dec);
   1809                 if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1810                 {
   1811                     return e_error;
   1812                 }
   1813                 e_error = impeg2d_dec_pic_ext_data(ps_dec);
   1814                 if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1815                 {
   1816                     return e_error;
   1817                 }
   1818                 e_error = impeg2d_pre_pic_dec_proc(ps_dec);
   1819                 if ((IMPEG2D_ERROR_CODES_T) IVD_ERROR_NONE != e_error)
   1820                 {
   1821                     return e_error;
   1822                 }
   1823                 impeg2d_dec_pic_data(ps_dec);
   1824                 impeg2d_post_pic_dec_proc(ps_dec);
   1825                 u4_start_code_found = 1;
   1826             }
   1827             else
   1828 
   1829             {
   1830                 FLUSH_BITS(ps_dec->s_bit_stream.u4_offset, ps_dec->s_bit_stream.u4_buf, ps_dec->s_bit_stream.u4_buf_nxt, 8, ps_dec->s_bit_stream.pu4_buf_aligned);
   1831 
   1832             }
   1833             if(u4_start_code_found == 0)
   1834             {
   1835                 impeg2d_next_start_code(ps_dec);
   1836                 /* In case a dec_pic_data call has not been made, the number of
   1837                  * bytes consumed in the previous header decode has to be
   1838                  * consumed. Not consuming it will result in zero bytes consumed
   1839                  * loops in case there are multiple headers and the second
   1840                  * or a future header has a resolution change/other error where
   1841                  * the bytes of the last header are not consumed.
   1842                  */
   1843                 ps_dec->i4_bytes_consumed = (ps_dec->s_bit_stream.u4_offset + 7) >> 3;
   1844                 ps_dec->i4_bytes_consumed -= ((size_t)ps_dec->s_bit_stream.pv_bs_buf & 3);
   1845             }
   1846         }
   1847         if((u4_start_code_found == 0) && (ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset))
   1848         {
   1849             return IMPEG2D_FRM_HDR_START_CODE_NOT_FOUND;
   1850         }
   1851 
   1852     }
   1853         /* If the stream is MPEG-1 compliant stream */
   1854     else
   1855     {
   1856         while((u4_start_code_found == 0) && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
   1857         {
   1858             u4_next_bits = impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN);
   1859 
   1860             if(impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) == SEQUENCE_HEADER_CODE)
   1861             {
   1862                 if(ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset)
   1863                 {
   1864                     e_error = impeg2d_dec_seq_hdr(ps_dec);
   1865                     if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1866                     {
   1867                         return e_error;
   1868                     }
   1869 
   1870                     u4_start_code_found = 0;
   1871                 }
   1872                 else
   1873                 {
   1874                     return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
   1875                 }
   1876             }
   1877             else if((ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset) && (u4_next_bits == EXTENSION_START_CODE || u4_next_bits == USER_DATA_START_CODE))
   1878             {
   1879                 impeg2d_flush_ext_and_user_data(ps_dec);
   1880                 u4_start_code_found = 0;
   1881             }
   1882 
   1883 
   1884             else if ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) == GOP_START_CODE)
   1885                     && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
   1886             {
   1887                 impeg2d_dec_grp_of_pic_hdr(ps_dec);
   1888                 impeg2d_flush_ext_and_user_data(ps_dec);
   1889                 u4_start_code_found = 0;
   1890             }
   1891             else if ((impeg2d_bit_stream_nxt(ps_stream,START_CODE_LEN) == PICTURE_START_CODE)
   1892                     && (ps_dec->s_bit_stream.u4_offset < ps_dec->s_bit_stream.u4_max_offset))
   1893             {
   1894                 ps_dec->i4_pic_count++;
   1895 
   1896                 e_error = impeg2d_dec_pic_hdr(ps_dec);
   1897                 if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1898                 {
   1899                     return e_error;
   1900                 }
   1901                 impeg2d_flush_ext_and_user_data(ps_dec);
   1902                 e_error = impeg2d_pre_pic_dec_proc(ps_dec);
   1903                 if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
   1904                 {
   1905                     return e_error;
   1906                 }
   1907                 impeg2d_dec_pic_data(ps_dec);
   1908                 impeg2d_post_pic_dec_proc(ps_dec);
   1909                 u4_start_code_found = 1;
   1910             }
   1911             else
   1912             {
   1913                 FLUSH_BITS(ps_dec->s_bit_stream.u4_offset, ps_dec->s_bit_stream.u4_buf, ps_dec->s_bit_stream.u4_buf_nxt, 8, ps_dec->s_bit_stream.pu4_buf_aligned);
   1914             }
   1915             impeg2d_next_start_code(ps_dec);
   1916             if (0 == u4_start_code_found)
   1917             {
   1918                 /* In case a dec_pic_data call has not been made, the number of
   1919                  * bytes consumed in the previous header decode has to be
   1920                  * consumed. Not consuming it will result in zero bytes consumed
   1921                  * loops in case there are multiple headers and the second
   1922                  * or a future header has a resolution change/other error where
   1923                  * the bytes of the last header are not consumed.
   1924                  */
   1925                 ps_dec->i4_bytes_consumed = (ps_dec->s_bit_stream.u4_offset + 7) >> 3;
   1926                 ps_dec->i4_bytes_consumed -= ((size_t)ps_dec->s_bit_stream.pv_bs_buf & 3);
   1927             }
   1928         }
   1929         if((u4_start_code_found == 0) && (ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset))
   1930         {
   1931            return IMPEG2D_FRM_HDR_START_CODE_NOT_FOUND;
   1932         }
   1933     }
   1934 
   1935     return (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
   1936 }
   1937