From bbb3edb827de21a7c91e38b4ee741f1bbd9062a6 Mon Sep 17 00:00:00 2001 From: Jeff Downs Date: Thu, 4 Oct 2007 06:33:26 +0000 Subject: [PATCH] Partial PAFF implementation at macroblock level. PAFF support disabled until implementation complete. 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 10658 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h264.c | 8 ++++---- libavcodec/h264.h | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index e6a9d55..fbfb6a1 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -1703,7 +1703,7 @@ static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, const int full_mx= mx>>2; const int full_my= my>>2; const int pic_width = 16*s->mb_width; - const int pic_height = 16*s->mb_height >> MB_MBAFF; + const int pic_height = 16*s->mb_height >> (MB_MBAFF || FIELD_PICTURE); if(!pic->data[0]) //FIXME this is unacceptable, some senseable error concealment must be done for missing reference frames return; @@ -1727,7 +1727,7 @@ static inline void mc_dir_part(H264Context *h, Picture *pic, int n, int square, if(ENABLE_GRAY && s->flags&CODEC_FLAG_GRAY) return; - if(MB_MBAFF){ + if(MB_MBAFF || FIELD_PICTURE){ // chroma offset when predicting from a field of opposite parity my += 2 * ((s->mb_y & 1) - (h->ref_cache[list][scan8[n]] & 1)); emu |= (my>>3) < 0 || (my>>3) + 8 >= (pic_height>>1); @@ -1762,7 +1762,7 @@ static inline void mc_part_std(H264Context *h, int n, int square, int chroma_hei dest_cb += x_offset + y_offset*h->mb_uvlinesize; dest_cr += x_offset + y_offset*h->mb_uvlinesize; x_offset += 8*s->mb_x; - y_offset += 8*(s->mb_y >> MB_MBAFF); + y_offset += 8*(s->mb_y >> (MB_MBAFF || FIELD_PICTURE)); if(list0){ Picture *ref= &h->ref_list[0][ h->ref_cache[0][ scan8[n] ] ]; @@ -1795,7 +1795,7 @@ static inline void mc_part_weighted(H264Context *h, int n, int square, int chrom dest_cb += x_offset + y_offset*h->mb_uvlinesize; dest_cr += x_offset + y_offset*h->mb_uvlinesize; x_offset += 8*s->mb_x; - y_offset += 8*(s->mb_y >> MB_MBAFF); + y_offset += 8*(s->mb_y >> (MB_MBAFF || FIELD_PICTURE)); if(list0 && list1){ /* don't optimize for luma-only case, since B-frames usually diff --git a/libavcodec/h264.h b/libavcodec/h264.h index 0081e73..d9a668c 100644 --- a/libavcodec/h264.h +++ b/libavcodec/h264.h @@ -59,10 +59,12 @@ #define MB_MBAFF h->mb_mbaff #define MB_FIELD h->mb_field_decoding_flag #define FRAME_MBAFF h->mb_aff_frame +#define FIELD_PICTURE 0 #else #define MB_MBAFF 0 #define MB_FIELD 0 #define FRAME_MBAFF 0 +#define FIELD_PICTURE 0 #undef IS_INTERLACED #define IS_INTERLACED(mb_type) 0 #endif -- 2.7.4