diff options
author | Jeff Downs <heydowns@borg.com> | 2007-10-06 09:59:14 +0400 |
---|---|---|
committer | Andreas Ă–man <andreas@lonelycoder.com> | 2007-10-06 09:59:14 +0400 |
commit | f3e53d9fcd4016d1d8d220464c4262e5f4cb79a5 (patch) | |
tree | ab0e54d71298009094e082420417011de9acb4b8 | |
parent | 949da388de0a349d194197cefce2492d89550576 (diff) |
Modifies macroblock addressing and current macroblock y-position for field decoding.
Adds convenience definition for pictures that are field or mbaff based. Part of PAFF implementation.
patch by Jeff Downs, heydowns a borg d com
original thread:
Subject: [FFmpeg-devel] [PATCH] Implement PAFF in H.264
Date: 18/09/07 20:30
Originally committed as revision 10672 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | libavcodec/h264.c | 16 | ||||
-rw-r--r-- | libavcodec/h264.h | 1 |
2 files changed, 11 insertions, 6 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 395b7151d8..a65c9901ea 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -177,7 +177,7 @@ static void fill_caches(H264Context *h, int mb_type, int for_deblock){ //wow what a mess, why didn't they simplify the interlacing&intra stuff, i can't imagine that these complex rules are worth it - top_xy = mb_xy - s->mb_stride; + top_xy = mb_xy - (s->mb_stride << FIELD_PICTURE); topleft_xy = top_xy - 1; topright_xy= top_xy + 1; left_xy[1] = left_xy[0] = mb_xy-1; @@ -3921,13 +3921,15 @@ static int decode_slice_header(H264Context *h, H264Context *h0){ s->current_picture_ptr->frame_num= h->frame_num; //FIXME frame_num cleanup assert(s->mb_num == s->mb_width * s->mb_height); - if(first_mb_in_slice << h->mb_aff_frame >= s->mb_num || + if(first_mb_in_slice << FIELD_OR_MBAFF_PICTURE >= s->mb_num || first_mb_in_slice >= s->mb_num){ av_log(h->s.avctx, AV_LOG_ERROR, "first_mb_in_slice overflow\n"); return -1; } s->resync_mb_x = s->mb_x = first_mb_in_slice % s->mb_width; - s->resync_mb_y = s->mb_y = (first_mb_in_slice / s->mb_width) << h->mb_aff_frame; + s->resync_mb_y = s->mb_y = (first_mb_in_slice / s->mb_width) << FIELD_OR_MBAFF_PICTURE; + if (s->picture_structure == PICT_BOTTOM_FIELD) + s->resync_mb_y = s->mb_y = s->mb_y + 1; assert(s->mb_y < s->mb_height); if(s->picture_structure==PICT_FRAME){ @@ -4987,7 +4989,7 @@ static int decode_cabac_mb_skip( H264Context *h, int mb_x, int mb_y ) { }else{ int mb_xy = mb_x + mb_y*s->mb_stride; mba_xy = mb_xy - 1; - mbb_xy = mb_xy - s->mb_stride; + mbb_xy = mb_xy - (s->mb_stride << FIELD_PICTURE); } if( h->slice_table[mba_xy] == h->slice_num && !IS_SKIP( s->current_picture.mb_type[mba_xy] )) @@ -5431,6 +5433,8 @@ static inline void compute_mb_neighbors(H264Context *h) if (left_mb_frame_flag != curr_mb_frame_flag) { h->left_mb_xy[0] = pair_xy - 1; } + } else if (FIELD_PICTURE) { + h->top_mb_xy -= s->mb_stride; } return; } @@ -6666,7 +6670,7 @@ static int decode_slice(struct AVCodecContext *avctx, H264Context *h){ s->mb_x = 0; ff_draw_horiz_band(s, 16*s->mb_y, 16); ++s->mb_y; - if(FRAME_MBAFF) { + if(FIELD_OR_MBAFF_PICTURE) { ++s->mb_y; } } @@ -6703,7 +6707,7 @@ static int decode_slice(struct AVCodecContext *avctx, H264Context *h){ s->mb_x=0; ff_draw_horiz_band(s, 16*s->mb_y, 16); ++s->mb_y; - if(FRAME_MBAFF) { + if(FIELD_OR_MBAFF_PICTURE) { ++s->mb_y; } if(s->mb_y >= s->mb_height){ diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 1c9d4e4c1e..43c356760f 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -68,6 +68,7 @@ #undef IS_INTERLACED #define IS_INTERLACED(mb_type) 0 #endif +#define FIELD_OR_MBAFF_PICTURE (FRAME_MBAFF || FIELD_PICTURE) /** * Sequence parameter set |