comparison cavsdec.c @ 8796:c6dd98bff427 libavcodec

introduce a macroblock index to avoid a few x*width+y calculations
author stefang
date Tue, 10 Feb 2009 22:38:02 +0000
parents e18df4791658
children 2b92a8c404c9
comparison
equal deleted inserted replaced
8795:e18df4791658 8796:c6dd98bff427
51 * motion vector prediction 51 * motion vector prediction
52 * 52 *
53 ****************************************************************************/ 53 ****************************************************************************/
54 54
55 static inline void store_mvs(AVSContext *h) { 55 static inline void store_mvs(AVSContext *h) {
56 h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + 0] = h->mv[MV_FWD_X0]; 56 h->col_mv[h->mbidx*4 + 0] = h->mv[MV_FWD_X0];
57 h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + 1] = h->mv[MV_FWD_X1]; 57 h->col_mv[h->mbidx*4 + 1] = h->mv[MV_FWD_X1];
58 h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + 2] = h->mv[MV_FWD_X2]; 58 h->col_mv[h->mbidx*4 + 2] = h->mv[MV_FWD_X2];
59 h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + 3] = h->mv[MV_FWD_X3]; 59 h->col_mv[h->mbidx*4 + 3] = h->mv[MV_FWD_X3];
60 } 60 }
61 61
62 static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw, 62 static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw,
63 cavs_vector *col_mv) { 63 cavs_vector *col_mv) {
64 cavs_vector *pmv_bw = pmv_fw + MV_BWD_OFFS; 64 cavs_vector *pmv_bw = pmv_fw + MV_BWD_OFFS;
292 set_intra_mode_default(h); 292 set_intra_mode_default(h);
293 store_mvs(h); 293 store_mvs(h);
294 if(mb_type != P_SKIP) 294 if(mb_type != P_SKIP)
295 decode_residual_inter(h); 295 decode_residual_inter(h);
296 ff_cavs_filter(h,mb_type); 296 ff_cavs_filter(h,mb_type);
297 *h->col_type = mb_type; 297 h->col_type_base[h->mbidx] = mb_type;
298 } 298 }
299 299
300 static void decode_mb_b(AVSContext *h, enum cavs_mb mb_type) { 300 static void decode_mb_b(AVSContext *h, enum cavs_mb mb_type) {
301 int block; 301 int block;
302 enum cavs_sub_mb sub_type[4]; 302 enum cavs_sub_mb sub_type[4];
310 h->mv[MV_BWD_X0] = ff_cavs_dir_mv; 310 h->mv[MV_BWD_X0] = ff_cavs_dir_mv;
311 set_mvs(&h->mv[MV_BWD_X0], BLK_16X16); 311 set_mvs(&h->mv[MV_BWD_X0], BLK_16X16);
312 switch(mb_type) { 312 switch(mb_type) {
313 case B_SKIP: 313 case B_SKIP:
314 case B_DIRECT: 314 case B_DIRECT:
315 if(!(*h->col_type)) { 315 if(!h->col_type_base[h->mbidx]) {
316 /* intra MB at co-location, do in-plane prediction */ 316 /* intra MB at co-location, do in-plane prediction */
317 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_BSKIP, BLK_16X16, 1); 317 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_BSKIP, BLK_16X16, 1);
318 ff_cavs_mv(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_BSKIP, BLK_16X16, 0); 318 ff_cavs_mv(h, MV_BWD_X0, MV_BWD_C2, MV_PRED_BSKIP, BLK_16X16, 0);
319 } else 319 } else
320 /* direct prediction from co-located P MB, block-wise */ 320 /* direct prediction from co-located P MB, block-wise */
321 for(block=0;block<4;block++) 321 for(block=0;block<4;block++)
322 mv_pred_direct(h,&h->mv[mv_scan[block]], 322 mv_pred_direct(h,&h->mv[mv_scan[block]],
323 &h->col_mv[(h->mby*h->mb_width+h->mbx)*4 + block]); 323 &h->col_mv[h->mbidx*4 + block]);
324 break; 324 break;
325 case B_FWD_16X16: 325 case B_FWD_16X16:
326 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16, 1); 326 ff_cavs_mv(h, MV_FWD_X0, MV_FWD_C2, MV_PRED_MEDIAN, BLK_16X16, 1);
327 break; 327 break;
328 case B_SYM_16X16: 328 case B_SYM_16X16:
336 for(block=0;block<4;block++) 336 for(block=0;block<4;block++)
337 sub_type[block] = get_bits(&h->s.gb,2); 337 sub_type[block] = get_bits(&h->s.gb,2);
338 for(block=0;block<4;block++) { 338 for(block=0;block<4;block++) {
339 switch(sub_type[block]) { 339 switch(sub_type[block]) {
340 case B_SUB_DIRECT: 340 case B_SUB_DIRECT:
341 if(!(*h->col_type)) { 341 if(!h->col_type_base[h->mbidx]) {
342 /* intra MB at co-location, do in-plane prediction */ 342 /* intra MB at co-location, do in-plane prediction */
343 ff_cavs_mv(h, mv_scan[block], mv_scan[block]-3, 343 ff_cavs_mv(h, mv_scan[block], mv_scan[block]-3,
344 MV_PRED_BSKIP, BLK_8X8, 1); 344 MV_PRED_BSKIP, BLK_8X8, 1);
345 ff_cavs_mv(h, mv_scan[block]+MV_BWD_OFFS, 345 ff_cavs_mv(h, mv_scan[block]+MV_BWD_OFFS,
346 mv_scan[block]-3+MV_BWD_OFFS, 346 mv_scan[block]-3+MV_BWD_OFFS,
347 MV_PRED_BSKIP, BLK_8X8, 0); 347 MV_PRED_BSKIP, BLK_8X8, 0);
348 } else 348 } else
349 mv_pred_direct(h,&h->mv[mv_scan[block]], 349 mv_pred_direct(h,&h->mv[mv_scan[block]],
350 &h->col_mv[(h->mby*h->mb_width + h->mbx)*4 + block]); 350 &h->col_mv[h->mbidx*4 + block]);
351 break; 351 break;
352 case B_SUB_FWD: 352 case B_SUB_FWD:
353 ff_cavs_mv(h, mv_scan[block], mv_scan[block]-3, 353 ff_cavs_mv(h, mv_scan[block], mv_scan[block]-3,
354 MV_PRED_MEDIAN, BLK_8X8, 1); 354 MV_PRED_MEDIAN, BLK_8X8, 1);
355 break; 355 break;
413 413
414 static inline int decode_slice_header(AVSContext *h, GetBitContext *gb) { 414 static inline int decode_slice_header(AVSContext *h, GetBitContext *gb) {
415 if(h->stc > 0xAF) 415 if(h->stc > 0xAF)
416 av_log(h->s.avctx, AV_LOG_ERROR, "unexpected start code 0x%02x\n", h->stc); 416 av_log(h->s.avctx, AV_LOG_ERROR, "unexpected start code 0x%02x\n", h->stc);
417 h->mby = h->stc; 417 h->mby = h->stc;
418 h->mbidx = h->mby*h->mb_width;
418 419
419 /* mark top macroblocks as unavailable */ 420 /* mark top macroblocks as unavailable */
420 h->flags &= ~(B_AVAIL|C_AVAIL); 421 h->flags &= ~(B_AVAIL|C_AVAIL);
421 if((h->mby == 0) && (!h->qp_fixed)){ 422 if((h->mby == 0) && (!h->qp_fixed)){
422 h->qp_fixed = get_bits1(gb); 423 h->qp_fixed = get_bits1(gb);