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 
     21 #include "iv_datatypedef.h"
     22 #include "iv.h"
     23 
     24 #include "impeg2_buf_mgr.h"
     25 #include "impeg2_disp_mgr.h"
     26 #include "impeg2_defs.h"
     27 #include "impeg2_platform_macros.h"
     28 #include "impeg2_inter_pred.h"
     29 #include "impeg2_idct.h"
     30 #include "impeg2_globals.h"
     31 #include "impeg2_mem_func.h"
     32 #include "impeg2_format_conv.h"
     33 #include "impeg2_macros.h"
     34 
     35 #include "ivd.h"
     36 #include "impeg2d.h"
     37 #include "impeg2d_bitstream.h"
     38 #include "impeg2d_structs.h"
     39 #include "impeg2d_vld_tables.h"
     40 #include "impeg2d_vld.h"
     41 #include "impeg2d_pic_proc.h"
     42 #include "impeg2d_debug.h"
     43 #include "impeg2d_globals.h"
     44 #include "impeg2d_mv_dec.h"
     45 
     46 /*******************************************************************************
     47 *  Function Name   : impeg2d_dec_i_mb_params
     48 *
     49 *  Description     : Decoding I MB parameters.
     50 *
     51 *  Arguments       :
     52 *  dec             : Decoder state
     53 *  stream          : Bitstream
     54 *
     55 *  Values Returned : None
     56 *******************************************************************************/
     57 void impeg2d_dec_i_mb_params(dec_state_t *ps_dec)
     58 {
     59 
     60     UWORD16 u2_next_bits;
     61     UWORD16 u2_bits_to_flush;
     62     stream_t *ps_stream = &ps_dec->s_bit_stream;
     63 
     64     /*-----------------------------------------------------------------------*/
     65     /* Flush the MBAddrIncr Bit                                              */
     66     /*                                                                       */
     67     /* Since we are not supporting scalable modes there won't be skipped     */
     68     /* macroblocks in I-Picture and the MBAddrIncr will always be 1,         */
     69     /* The MBAddrIncr can never be greater than 1 for the simple and main    */
     70     /* profile MPEG2.                                                        */
     71     /*-----------------------------------------------------------------------*/
     72     if(impeg2d_bit_stream_nxt(ps_stream,1) == 1) //Making sure the increment is one.
     73     {
     74         impeg2d_bit_stream_flush(ps_stream,1);
     75     }
     76     else if(ps_dec->u2_first_mb && ps_dec->u2_mb_x)
     77     {
     78         WORD32 i4_mb_add_inc = impeg2d_get_mb_addr_incr(ps_stream);
     79 
     80             //VOLParams->FirstInSlice = 0;
     81             /****************************************************************/
     82             /* Section 6.3.17                                               */
     83             /* The first MB of a slice cannot be skipped                    */
     84             /* But the mb_addr_incr can be > 1, because at the beginning of */
     85             /* a slice, it indicates the offset from the last MB in the     */
     86             /* previous row. Hence for the first slice in a row, the        */
     87             /* mb_addr_incr needs to be 1.                                  */
     88             /****************************************************************/
     89             /* MB_x is set to zero whenever MB_y changes.                   */
     90 
     91             ps_dec->u2_mb_x = i4_mb_add_inc - 1;
     92             ps_dec->u2_mb_x = MIN(ps_dec->u2_mb_x, (ps_dec->u2_num_horiz_mb - 1));
     93     }
     94 
     95     /*-----------------------------------------------------------------------*/
     96     /* Decode the macroblock_type, dct_type and quantiser_scale_code         */
     97     /*                                                                       */
     98     /* macroblock_type      2 bits [can be either 1 or 01]                   */
     99     /* dct_type             1 bit                                            */
    100     /* quantiser_scale_code 5 bits                                           */
    101     /*-----------------------------------------------------------------------*/
    102     u2_next_bits = impeg2d_bit_stream_nxt(ps_stream,8);
    103     if(BIT(u2_next_bits,7) == 1)
    104     {
    105         /* read the dct_type if needed */
    106         u2_bits_to_flush = 1;
    107         if(ps_dec->u2_read_dct_type)
    108         {
    109             u2_bits_to_flush++;
    110             ps_dec->u2_field_dct = BIT(u2_next_bits,6);
    111         }
    112     }
    113     else
    114     {
    115         u2_bits_to_flush = 7;
    116         /*------------------------------------------------------------------*/
    117         /* read the dct_type if needed                                      */
    118         /*------------------------------------------------------------------*/
    119         if(ps_dec->u2_read_dct_type)
    120         {
    121             u2_bits_to_flush++;
    122             ps_dec->u2_field_dct = BIT(u2_next_bits,5);
    123         }
    124         else
    125         {
    126             u2_next_bits >>= 1;
    127         }
    128         /*------------------------------------------------------------------*/
    129         /* Quant scale code decoding                                        */
    130         /*------------------------------------------------------------------*/
    131         {
    132             UWORD16 quant_scale_code;
    133             quant_scale_code = u2_next_bits & 0x1F;
    134 
    135             ps_dec->u1_quant_scale = (ps_dec->u2_q_scale_type) ?
    136                 gau1_impeg2_non_linear_quant_scale[quant_scale_code] :
    137                 (quant_scale_code << 1);
    138         }
    139     }
    140     impeg2d_bit_stream_flush(ps_stream,u2_bits_to_flush);
    141     /*************************************************************************/
    142     /* Decoding of motion vectors if concealment motion vectors are present  */
    143     /*************************************************************************/
    144     if(ps_dec->u2_concealment_motion_vectors)
    145     {
    146         if(ps_dec->u2_picture_structure != FRAME_PICTURE)
    147             impeg2d_bit_stream_flush(ps_stream,1);
    148         impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[FORW][FIRST],ps_dec->ai2_mv[FORW][FIRST],
    149             ps_dec->au2_f_code[FORW],0,0);
    150 
    151         /* Flush the marker bit */
    152         if(0 == (impeg2d_bit_stream_get(ps_stream,1)))
    153         {
    154             /* Ignore marker bit error */
    155         }
    156 
    157     }
    158     ps_dec->u2_first_mb = 0;
    159     return;
    160 }
    161 /*******************************************************************************
    162 *  Function Name   : impeg2d_dec_i_slice
    163 *
    164 *  Description     : Decodes I slice
    165 *
    166 *  Arguments       :
    167 *  dec             : Decoder state
    168 *
    169 *  Values Returned : None
    170 *******************************************************************************/
    171 IMPEG2D_ERROR_CODES_T impeg2d_dec_i_slice(dec_state_t *ps_dec)
    172 {
    173     WORD16 *pi2_vld_out;
    174     UWORD32 i;
    175     yuv_buf_t *ps_cur_frm_buf = &ps_dec->s_cur_frm_buf;
    176 
    177     UWORD32 u4_frame_width = ps_dec->u2_frame_width;
    178     UWORD32 u4_frm_offset = 0;
    179     UWORD8  *pu1_out_p;
    180     IMPEG2D_ERROR_CODES_T e_error = (IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE;
    181 
    182 
    183     pi2_vld_out = ps_dec->ai2_vld_buf;
    184 
    185 
    186     if(ps_dec->u2_picture_structure != FRAME_PICTURE)
    187     {
    188         u4_frame_width <<= 1;
    189         if(ps_dec->u2_picture_structure == BOTTOM_FIELD)
    190         {
    191             u4_frm_offset = ps_dec->u2_frame_width;
    192         }
    193     }
    194 
    195     do
    196     {
    197         UWORD32 u4_x_offset,u4_y_offset;
    198         UWORD32 u4_blk_pos;
    199         UWORD32 u4_x_dst_offset = 0;
    200         UWORD32 u4_y_dst_offset = 0;
    201 
    202 
    203         IMPEG2D_TRACE_MB_START(ps_dec->u2_mb_x, ps_dec->u2_mb_y);
    204 
    205         impeg2d_dec_i_mb_params(ps_dec);
    206 
    207         u4_x_dst_offset = u4_frm_offset + (ps_dec->u2_mb_x << 4);
    208         u4_y_dst_offset = (ps_dec->u2_mb_y << 4) * u4_frame_width;
    209         pu1_out_p = ps_cur_frm_buf->pu1_y + u4_x_dst_offset + u4_y_dst_offset;
    210 
    211         for(i = 0; i < NUM_LUMA_BLKS; ++i)
    212         {
    213 
    214             e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out,
    215                                             ps_dec->pu1_inv_scan_matrix, 1, Y_LUMA, 0);
    216             if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
    217             {
    218                 return e_error;
    219             }
    220 
    221             u4_x_offset = gai2_impeg2_blk_x_off[i];
    222 
    223             if(ps_dec->u2_field_dct == 0)
    224                 u4_y_offset = gai2_impeg2_blk_y_off_frm[i] ;
    225             else
    226                 u4_y_offset = gai2_impeg2_blk_y_off_fld[i] ;
    227 
    228             u4_blk_pos = u4_y_offset * u4_frame_width + u4_x_offset;
    229             IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
    230 
    231             PROFILE_DISABLE_IDCT_IF0
    232             {
    233                 WORD32 i4_idx;
    234                 i4_idx = 1;
    235                 if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
    236                     i4_idx = 0;
    237 
    238                 ps_dec->pf_idct_recon[i4_idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
    239                                                         ps_dec->ai2_idct_stg1,
    240                                                         (UWORD8 *)gau1_impeg2_zerobuf,
    241                                                         pu1_out_p + u4_blk_pos,
    242                                                         8,
    243                                                         8,
    244                                                         u4_frame_width << ps_dec->u2_field_dct,
    245                                                         ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
    246 
    247             }
    248 
    249         }
    250 
    251         /* For U and V blocks, divide the x and y offsets by 2. */
    252         u4_x_dst_offset >>= 1;
    253         u4_y_dst_offset >>= 2;
    254 
    255         /* In case of chrominance blocks the DCT will be frame DCT */
    256         /* i = 0, U component and */
    257 
    258         e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out,
    259                                         ps_dec->pu1_inv_scan_matrix, 1, U_CHROMA, 0);
    260         if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
    261         {
    262             return e_error;
    263         }
    264 
    265         pu1_out_p = ps_cur_frm_buf->pu1_u + u4_x_dst_offset + u4_y_dst_offset;
    266         IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
    267         PROFILE_DISABLE_IDCT_IF0
    268         {
    269             WORD32 i4_idx;
    270             i4_idx = 1;
    271             if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
    272                 i4_idx = 0;
    273 
    274             ps_dec->pf_idct_recon[i4_idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
    275                                                     ps_dec->ai2_idct_stg1,
    276                                                     (UWORD8 *)gau1_impeg2_zerobuf,
    277                                                     pu1_out_p,
    278                                                     8,
    279                                                     8,
    280                                                     u4_frame_width >> 1,
    281                                                     ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
    282 
    283         }
    284         /* Write the idct_out block to the current frame dec->curFrame*/
    285         /* In case of field DCT type, write to alternate lines */
    286         e_error = ps_dec->pf_vld_inv_quant(ps_dec, pi2_vld_out,
    287                                         ps_dec->pu1_inv_scan_matrix, 1, V_CHROMA, 0);
    288         if ((IMPEG2D_ERROR_CODES_T)IVD_ERROR_NONE != e_error)
    289         {
    290             return e_error;
    291         }
    292 
    293         pu1_out_p = ps_cur_frm_buf->pu1_v + u4_x_dst_offset + u4_y_dst_offset;
    294         IMPEG2D_IDCT_INP_STATISTICS(pi2_vld_out, ps_dec->u4_non_zero_cols, ps_dec->u4_non_zero_rows);
    295         PROFILE_DISABLE_IDCT_IF0
    296         {
    297             WORD32 i4_idx;
    298             i4_idx = 1;
    299             if(1 == (ps_dec->u4_non_zero_cols | ps_dec->u4_non_zero_rows))
    300                 i4_idx = 0;
    301             ps_dec->pf_idct_recon[i4_idx * 2 + ps_dec->i4_last_value_one](pi2_vld_out,
    302                                                     ps_dec->ai2_idct_stg1,
    303                                                     (UWORD8 *)gau1_impeg2_zerobuf,
    304                                                     pu1_out_p,
    305                                                     8,
    306                                                     8,
    307                                                     u4_frame_width >> 1,
    308                                                     ~ps_dec->u4_non_zero_cols, ~ps_dec->u4_non_zero_rows);
    309         }
    310         ps_dec->u2_num_mbs_left--;
    311 
    312 
    313         ps_dec->u2_mb_x++;
    314 
    315         if(ps_dec->s_bit_stream.u4_offset > ps_dec->s_bit_stream.u4_max_offset)
    316         {
    317             return IMPEG2D_BITSTREAM_BUFF_EXCEEDED_ERR;
    318         }
    319         else if (ps_dec->u2_mb_x == ps_dec->u2_num_horiz_mb)
    320         {
    321             ps_dec->u2_mb_x = 0;
    322             ps_dec->u2_mb_y++;
    323         }
    324 
    325     }
    326     while(ps_dec->u2_num_mbs_left != 0 && impeg2d_bit_stream_nxt(&ps_dec->s_bit_stream,23) != 0x0);
    327     return e_error;
    328 }
    329