Mercurial > libavcodec.hg
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); |