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