1 /****************************************************************************** 2 * 3 * Copyright (C) 2015 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19 */ 20 #include <stdio.h> 21 22 #include "iv_datatypedef.h" 23 #include "iv.h" 24 25 #include "impeg2_buf_mgr.h" 26 #include "impeg2_disp_mgr.h" 27 #include "impeg2_defs.h" 28 #include "impeg2_platform_macros.h" 29 #include "impeg2_inter_pred.h" 30 #include "impeg2_idct.h" 31 #include "impeg2_globals.h" 32 #include "impeg2_mem_func.h" 33 #include "impeg2_format_conv.h" 34 #include "impeg2_macros.h" 35 36 #include "ivd.h" 37 #include "impeg2d.h" 38 #include "impeg2d_bitstream.h" 39 #include "impeg2d_structs.h" 40 #include "impeg2d_globals.h" 41 #include "impeg2d_vld_tables.h" 42 #include "impeg2d_pic_proc.h" 43 #include "impeg2d_debug.h" 44 #include "impeg2d_mv_dec.h" 45 #include "impeg2d_mc.h" 46 47 /******************************************************************************* 48 * Function name : impeg2d_dec_1mv 49 * 50 * Description : Decodes a motion vector and updates the predictors 51 * 52 * Arguments : 53 * stream : Bitstream 54 * predMv : Prediction for the motion vectors 55 * mv : Motion vectors 56 * fCode : fcode to the used for the decoding 57 * shift : Shift value to be used. This will be equal to 58 * (mv_format == "field") && (picture_structure == "Frame picture") 59 * i : 0 - MV_X and 1 - MV_Y 60 * 61 * Value Returned: None 62 *******************************************************************************/ 63 INLINE void impeg2d_dec_1mv(stream_t *ps_stream, WORD16 ai2_pred_mv[], WORD16 ai2_mv[],UWORD16 au2_fCode[], 64 UWORD16 u2_mv_y_shift, WORD16 ai2_dmv[]) 65 { 66 WORD16 i2_f; 67 WORD16 i2_r_size; 68 WORD16 i2_high,i2_low,i2_range; 69 UWORD32 u4_mv_code; 70 WORD16 i2_delta; 71 UWORD16 u2_first_bit; 72 WORD32 i; 73 WORD32 ai2_shifts[2]; 74 UWORD32 u4_buf; 75 UWORD32 u4_buf_nxt; 76 UWORD32 u4_offset; 77 UWORD32 *pu4_buf_aligned; 78 79 ai2_shifts[0] = 0; 80 ai2_shifts[1] = u2_mv_y_shift; 81 82 83 GET_TEMP_STREAM_DATA(u4_buf,u4_buf_nxt,u4_offset,pu4_buf_aligned,ps_stream) 84 for(i = 0; i < 2; i++) 85 { 86 WORD32 i4_shift = ai2_shifts[i]; 87 /* Decode the motion_code */ 88 IBITS_NXT(u4_buf, u4_buf_nxt, u4_offset, u4_mv_code, MV_CODE_LEN) 89 u2_first_bit = (u4_mv_code >> (MV_CODE_LEN - 1)) & 0x01; 90 if(u2_first_bit == 1) /* mvCode == 0 */ 91 { 92 i2_delta = 0; 93 FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,1,pu4_buf_aligned) 94 95 ai2_mv[i] = (ai2_pred_mv[i] >> i4_shift); 96 97 ai2_pred_mv[i] = (ai2_mv[i] << i4_shift); 98 99 } 100 else 101 { 102 UWORD16 u2_index; 103 UWORD16 u2_value; 104 UWORD16 u2_mv_len; 105 UWORD16 u2_abs_mvcode_minus1; 106 UWORD16 u2_sign_bit; 107 108 i2_r_size = au2_fCode[i] - 1; 109 i2_f = 1 << i2_r_size; 110 i2_high = (16 * i2_f) - 1; 111 i2_low = ((-16) * i2_f); 112 i2_range = (32 * i2_f); 113 114 u2_index = (u4_mv_code >> 1) & 0x1FF; 115 u2_value = gau2_impeg2d_mv_code[u2_index]; 116 u2_mv_len = (u2_value & 0x0F); 117 u2_abs_mvcode_minus1 = (u2_value >> 8) & 0x0FF; 118 u4_mv_code >>= (MV_CODE_LEN - u2_mv_len - 1); 119 u2_sign_bit = u4_mv_code & 0x1; 120 121 FLUSH_BITS(u4_offset,u4_buf,u4_buf_nxt,(u2_mv_len + 1),pu4_buf_aligned) 122 i2_delta = u2_abs_mvcode_minus1 * i2_f + 1; 123 if(i2_r_size) 124 { 125 UWORD32 val; 126 IBITS_GET(u4_buf, u4_buf_nxt, u4_offset, val, pu4_buf_aligned, i2_r_size) 127 i2_delta += val; 128 } 129 130 if(u2_sign_bit) 131 i2_delta = -i2_delta; 132 133 ai2_mv[i] = (ai2_pred_mv[i] >> i4_shift) + i2_delta; 134 135 if(ai2_mv[i] < i2_low) 136 { 137 ai2_mv[i] += i2_range; 138 } 139 140 if(ai2_mv[i] > i2_high) 141 { 142 ai2_mv[i] -= i2_range; 143 } 144 ai2_pred_mv[i] = (ai2_mv[i] << i4_shift); 145 146 } 147 if(ai2_dmv) 148 { 149 UWORD32 u4_val; 150 ai2_dmv[i] = 0; 151 IBITS_GET(u4_buf, u4_buf_nxt, u4_offset, u4_val, pu4_buf_aligned, 1) 152 if(u4_val) 153 { 154 IBITS_GET(u4_buf, u4_buf_nxt, u4_offset, u4_val, pu4_buf_aligned, 1) 155 ai2_dmv[i] = gai2_impeg2d_dec_mv[u4_val]; 156 } 157 } 158 } 159 PUT_TEMP_STREAM_DATA(u4_buf, u4_buf_nxt, u4_offset, pu4_buf_aligned, ps_stream) 160 161 } 162 /******************************************************************************* 163 * Function name : impeg2d_dec_mv 164 * 165 * Description : Decodes a motion vector and updates the predictors 166 * 167 * Arguments : 168 * stream : Bitstream 169 * predMv : Prediction for the motion vectors 170 * mv : Motion vectors 171 * fCode : fcode to the used for the decoding 172 * shift : Shift value to be used. This will be equal to 173 * (mv_format == "field") && (picture_structure == "Frame picture") 174 * 175 * Value Returned: None 176 *******************************************************************************/ 177 e_field_t impeg2d_dec_mv(stream_t *ps_stream, WORD16 ai2_pred_mv[], WORD16 ai2_mv[],UWORD16 au2_f_code[], 178 UWORD16 u2_shift, UWORD16 u2_fld_sel) 179 { 180 e_field_t e_fld; 181 if(u2_fld_sel) 182 { 183 e_fld = (e_field_t)impeg2d_bit_stream_get_bit(ps_stream); 184 } 185 else 186 { 187 e_fld = TOP; 188 } 189 190 impeg2d_dec_1mv(ps_stream,ai2_pred_mv,ai2_mv,au2_f_code,u2_shift,NULL); 191 192 return(e_fld); 193 } 194 195 /***************************************************************************** 196 * Function Name : impeg2d_dec_1mv_mb 197 * 198 * Description : Decodes mc params for 1 MV MB 199 * 200 * Arguments : 201 * dec : Decoder state 202 * 203 * Values Returned : None 204 *****************************************************************************/ 205 void impeg2d_dec_1mv_mb(dec_state_t *ps_dec) 206 { 207 stream_t *ps_stream; 208 WORD16 *pi2_mv; 209 e_field_t e_fld; 210 mb_mc_params_t *ps_mc; 211 e_pred_direction_t e_ref_pic; 212 213 214 ps_stream = &ps_dec->s_bit_stream; 215 e_ref_pic = ps_dec->e_mb_pred; 216 /************************************************************************/ 217 /* Decode the motion vector */ 218 /************************************************************************/ 219 pi2_mv = (WORD16 *)&ps_dec->ai2_mv[FORW][FIRST]; 220 e_fld = impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[e_ref_pic][FIRST],pi2_mv, 221 ps_dec->au2_f_code[e_ref_pic],0, ps_dec->u2_fld_pic); 222 223 ps_dec->ai2_pred_mv[e_ref_pic][SECOND][MV_X] = ps_dec->ai2_pred_mv[e_ref_pic][FIRST][MV_X]; 224 ps_dec->ai2_pred_mv[e_ref_pic][SECOND][MV_Y] = ps_dec->ai2_pred_mv[e_ref_pic][FIRST][MV_Y]; 225 /************************************************************************/ 226 /* Set the motion vector params */ 227 /************************************************************************/ 228 ps_mc = &ps_dec->as_mb_mc_params[e_ref_pic][FIRST]; 229 ps_mc->s_ref = ps_dec->as_ref_buf[e_ref_pic][e_fld]; 230 impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, 0, 231 pi2_mv, ps_dec->u2_mb_x, ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width); 232 233 } 234 235 /***************************************************************************** 236 * Function Name : impeg2d_dec_2mv_fw_or_bk_mb 237 * 238 * Description : Decodes first part of params for 2 MV Interpolated MB 239 * 240 * Arguments : 241 * dec : Decoder state 242 * 243 * Values Returned : None 244 *****************************************************************************/ 245 void impeg2d_dec_2mv_fw_or_bk_mb(dec_state_t *ps_dec) 246 { 247 stream_t *ps_stream; 248 WORD16 *pi2_mv; 249 e_field_t e_fld; 250 mb_mc_params_t *ps_mc; 251 e_pred_direction_t e_ref_pic; 252 UWORD16 i; 253 254 ps_stream = &ps_dec->s_bit_stream; 255 e_ref_pic = ps_dec->e_mb_pred; 256 for(i = 0; i < 2; i++) 257 { 258 /********************************************************************/ 259 /* Decode the first motion vector */ 260 /********************************************************************/ 261 pi2_mv = (WORD16 *)&ps_dec->ai2_mv[FORW][i]; 262 e_fld = impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[e_ref_pic][i],pi2_mv, 263 ps_dec->au2_f_code[e_ref_pic],ps_dec->u2_frm_pic, 1); 264 265 /********************************************************************/ 266 /* Set the motion vector params */ 267 /********************************************************************/ 268 ps_mc = &ps_dec->as_mb_mc_params[FORW][i]; 269 ps_mc->s_ref = ps_dec->as_ref_buf[e_ref_pic][e_fld]; 270 impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, i, 271 pi2_mv, ps_dec->u2_mb_x, ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width); 272 } 273 } 274 275 /***************************************************************************** 276 * Function Name : impeg2d_dec_frm_dual_prime 277 * 278 * Description : Decodes first part of params for 2 MV Interpolated MB 279 * 280 * Arguments : 281 * dec : Decoder state 282 * 283 * Values Returned : None 284 *****************************************************************************/ 285 void impeg2d_dec_frm_dual_prime(dec_state_t *ps_dec) 286 { 287 stream_t *ps_stream; 288 WORD16 *pi2_mv; 289 mb_mc_params_t *ps_mc; 290 291 WORD16 ai2_dmv[2]; 292 WORD16 *pi2_mv1, *pi2_mv2, *pi2_mv3, *pi2_mv4; 293 UWORD16 i,j; 294 295 pi2_mv1 = (WORD16 *)&(ps_dec->ai2_mv[FORW][FIRST]); 296 pi2_mv2 = (WORD16 *)&(ps_dec->ai2_mv[FORW][SECOND]); 297 pi2_mv3 = (WORD16 *)&(ps_dec->ai2_mv[BACK][FIRST]); 298 pi2_mv4 = (WORD16 *)&(ps_dec->ai2_mv[BACK][SECOND]); 299 300 301 302 ps_stream = &ps_dec->s_bit_stream; 303 304 /************************************************************************/ 305 /* Decode the motion vector MV_X, MV_Y and dmv[0], dmv[1] */ 306 /************************************************************************/ 307 impeg2d_dec_1mv(ps_stream,ps_dec->ai2_pred_mv[FORW][FIRST],pi2_mv1,ps_dec->au2_f_code[FORW],ps_dec->u2_frm_pic,ai2_dmv); 308 309 { 310 WORD16 ai2_m[2][2]; 311 312 if(ps_dec->u2_top_field_first) 313 { 314 ai2_m[1][0] = 1; 315 ai2_m[0][1] = 3; 316 } 317 else 318 { 319 ai2_m[1][0] = 3; 320 ai2_m[0][1] = 1; 321 } 322 323 pi2_mv2[MV_X] = pi2_mv1[MV_X]; 324 pi2_mv2[MV_Y] = pi2_mv1[MV_Y]; 325 326 pi2_mv3[MV_X] = ai2_dmv[0] + DIV_2_RND(pi2_mv1[MV_X] * ai2_m[1][0]); 327 pi2_mv4[MV_X] = ai2_dmv[0] + DIV_2_RND(pi2_mv1[MV_X] * ai2_m[0][1]); 328 329 pi2_mv3[MV_Y] = ai2_dmv[1] + DIV_2_RND(pi2_mv1[MV_Y] * ai2_m[1][0]) - 1; 330 pi2_mv4[MV_Y] = ai2_dmv[1] + DIV_2_RND(pi2_mv1[MV_Y] * ai2_m[0][1]) + 1; 331 } 332 333 ps_dec->ai2_pred_mv[FORW][SECOND][MV_X] = ps_dec->ai2_pred_mv[FORW][FIRST][MV_X]; 334 ps_dec->ai2_pred_mv[FORW][SECOND][MV_Y] = ps_dec->ai2_pred_mv[FORW][FIRST][MV_Y]; 335 336 /************************************************************************/ 337 /* Set the motion vector params */ 338 /************************************************************************/ 339 for(j = 0; j < 2; j++) 340 { 341 for(i = 0; i < 2; i++) 342 { 343 pi2_mv = (WORD16 *)&ps_dec->ai2_mv[j][i]; 344 ps_mc = &ps_dec->as_mb_mc_params[j][i]; 345 ps_mc->s_ref = ps_dec->as_ref_buf[FORW][(i ^ j) & 1]; 346 impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, i, 347 pi2_mv, ps_dec->u2_mb_x, ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width); 348 } 349 } 350 351 } 352 /***************************************************************************** 353 * Function Name : impeg2d_dec_fld_dual_prime 354 * 355 * Description : Decodes first part of params for 2 MV Interpolated MB 356 * 357 * Arguments : 358 * dec : Decoder state 359 * 360 * Values Returned : None 361 *****************************************************************************/ 362 void impeg2d_dec_fld_dual_prime(dec_state_t *ps_dec) 363 { 364 stream_t *ps_stream; 365 WORD16 *pi2_mv; 366 mb_mc_params_t *ps_mc; 367 368 WORD16 *pi2_mv1, *pi2_mv2; 369 WORD16 ai2_dmv[2]; 370 371 372 pi2_mv1 = (WORD16 *)&(ps_dec->ai2_mv[FORW][FIRST]); 373 pi2_mv2 = (WORD16 *)&(ps_dec->ai2_mv[FORW][SECOND]); 374 ps_stream = &ps_dec->s_bit_stream; 375 376 /************************************************************************/ 377 /* Decode the motion vector MV_X, MV_Y and dmv[0], dmv[1] */ 378 /************************************************************************/ 379 impeg2d_dec_1mv(ps_stream,ps_dec->ai2_pred_mv[FORW][FIRST],pi2_mv1,ps_dec->au2_f_code[FORW],0,ai2_dmv); 380 381 382 pi2_mv2[MV_X] = ai2_dmv[0] + DIV_2_RND(pi2_mv1[MV_X]); 383 pi2_mv2[MV_Y] = ai2_dmv[1] + DIV_2_RND(pi2_mv1[MV_Y]); 384 385 if(ps_dec->u2_picture_structure == TOP_FIELD) 386 pi2_mv2[MV_Y] -= 1; 387 else 388 pi2_mv2[MV_Y] += 1; 389 390 ps_dec->ai2_pred_mv[FORW][SECOND][MV_X] = ps_dec->ai2_pred_mv[FORW][FIRST][MV_X]; 391 ps_dec->ai2_pred_mv[FORW][SECOND][MV_Y] = ps_dec->ai2_pred_mv[FORW][FIRST][MV_Y]; 392 393 /************************************************************************/ 394 /* Set the motion vector params */ 395 /************************************************************************/ 396 pi2_mv = (WORD16 *)&ps_dec->ai2_mv[FORW][0]; 397 ps_mc = &ps_dec->as_mb_mc_params[FORW][0]; 398 ps_mc->s_ref = ps_dec->as_ref_buf[FORW][ps_dec->u2_fld_parity]; 399 impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, 0, 400 pi2_mv, ps_dec->u2_mb_x, ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width); 401 402 pi2_mv = (WORD16 *)&ps_dec->ai2_mv[FORW][1]; 403 ps_mc = &ps_dec->as_mb_mc_params[FORW][1]; 404 ps_mc->s_ref = ps_dec->as_ref_buf[FORW][!ps_dec->u2_fld_parity]; 405 impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, 0, 406 pi2_mv, ps_dec->u2_mb_x, ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width); 407 408 409 } 410 /***************************************************************************** 411 * Function Name : impeg2d_dec_4mv_mb 412 * 413 * Description : Decodes first part of params for 2 MV Interpolated MB 414 * 415 * Arguments : 416 * dec : Decoder state 417 * 418 * Values Returned : None 419 *****************************************************************************/ 420 void impeg2d_dec_4mv_mb(dec_state_t *ps_dec) 421 { 422 stream_t *ps_stream; 423 WORD16 *pi2_mv; 424 e_field_t e_fld; 425 mb_mc_params_t *ps_mc; 426 427 UWORD16 i,j; 428 429 ps_stream = &ps_dec->s_bit_stream; 430 431 /***********************************************/ 432 /* loop for FW & BK */ 433 /***********************************************/ 434 for(j = 0; j < 2; j++) 435 { 436 /***********************************************/ 437 /* loop for decoding 2 mvs of same reference frame*/ 438 /***********************************************/ 439 for(i = 0; i < 2; i++) 440 { 441 /****************************************************************/ 442 /* Decode the first motion vector */ 443 /****************************************************************/ 444 pi2_mv = (WORD16 *)&ps_dec->ai2_mv[j][i]; 445 e_fld = impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[j][i],pi2_mv, 446 ps_dec->au2_f_code[j],ps_dec->u2_frm_pic, 1); 447 448 /****************************************************************/ 449 /* Set the motion vector params */ 450 /****************************************************************/ 451 ps_mc = &ps_dec->as_mb_mc_params[j][i]; 452 ps_mc->s_ref = ps_dec->as_ref_buf[j][e_fld]; 453 impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type, i, 454 pi2_mv, ps_dec->u2_mb_x, ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width); 455 } 456 } 457 458 } 459 /******************************************************************************* 460 * Function Name : impeg2d_dec_2mv_interp_mb 461 * 462 * Description : Decodes first part of params for 2 MV Interpolated MB 463 * 464 * Arguments : 465 * dec : Decoder state 466 * 467 * Values Returned : None 468 *******************************************************************************/ 469 void impeg2d_dec_2mv_interp_mb(dec_state_t *ps_dec) 470 { 471 stream_t *ps_stream; 472 WORD16 *pi2_mv; 473 e_field_t e_fld; 474 mb_mc_params_t *ps_mc; 475 UWORD16 i; 476 477 ps_stream = &ps_dec->s_bit_stream; 478 479 for(i = 0; i < 2; i++) 480 { 481 /********************************************************************/ 482 /* Decode the first motion vector */ 483 /********************************************************************/ 484 pi2_mv = (WORD16 *)&ps_dec->ai2_mv[i][FIRST]; 485 e_fld = impeg2d_dec_mv(ps_stream,ps_dec->ai2_pred_mv[i][FIRST],pi2_mv, 486 ps_dec->au2_f_code[i],0, ps_dec->u2_fld_pic); 487 488 ps_dec->ai2_pred_mv[i][SECOND][MV_X] = ps_dec->ai2_pred_mv[i][FIRST][MV_X]; 489 ps_dec->ai2_pred_mv[i][SECOND][MV_Y] = ps_dec->ai2_pred_mv[i][FIRST][MV_Y]; 490 /********************************************************************/ 491 /* Set the motion vector params */ 492 /********************************************************************/ 493 ps_mc = &ps_dec->as_mb_mc_params[i][FIRST]; 494 ps_mc->s_ref = ps_dec->as_ref_buf[i][e_fld]; 495 impeg2d_set_mc_params(&ps_mc->s_luma, &ps_mc->s_chroma, ps_dec->s_mb_type,i, 496 pi2_mv, ps_dec->u2_mb_x, ps_dec->u2_mb_y, ps_dec->u2_frame_width, ps_dec->u2_frame_height,ps_dec->u2_picture_width); 497 } 498 499 } 500