Mercurial > libavcodec.hg
changeset 5781:0b3aa6f4c313 libavcodec
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
author | andoma |
---|---|
date | Sat, 06 Oct 2007 05:59:14 +0000 |
parents | bd3d1e4f937a |
children | 58647a83d416 |
files | h264.c h264.h |
diffstat | 2 files changed, 11 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/h264.c Fri Oct 05 13:54:11 2007 +0000 +++ b/h264.c Sat Oct 06 05:59:14 2007 +0000 @@ -177,7 +177,7 @@ //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 @@ 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 @@ }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 @@ 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 @@ 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 @@ 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){