[FFmpeg-devel] [PATCH] Implement PAFF in H.264

Jeff Downs heydowns
Fri Oct 5 22:26:17 CEST 2007


On Thu, 4 Oct 2007, Michael Niedermayer wrote:

> > Content-Description: Patch 1: mbaddress
> [...]
> > @@ -3928,6 +3928,11 @@
> >      }
> >      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;
> > +    if (FIELD_PICTURE) {
> > +        s->resync_mb_y = s->mb_y = s->mb_y * 2;
> > +        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);
> 
> i think this breaks the check above this hunk

It does - I missed that.  Added proper check, and simplified this part 
using the new FIELD_OR_MBAFF macro.

> 
> [...]
> > @@ -6666,7 +6673,7 @@
> >                  s->mb_x = 0;
> >                  ff_draw_horiz_band(s, 16*s->mb_y, 16);
> >                  ++s->mb_y;
> > -                if(FRAME_MBAFF) {
> > +                if(FRAME_MBAFF || FIELD_PICTURE) {
> 
> this really should be FRAME_MBAFF_OR_FIELD or something like that

Made a FIELD_OR_MBAFF_PICTURE, using picture to coincide with spec "coded 
picture" definition.  


Revised paff-mbaddress.patch attached. Suggested commit message is:

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.
-------------- next part --------------
Index: libavcodec/h264.c
===================================================================
--- libavcodec/h264.c	(revision 10671)
+++ libavcodec/h264.c	(working copy)
@@ -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){
Index: libavcodec/h264.h
===================================================================
--- libavcodec/h264.h	(revision 10671)
+++ libavcodec/h264.h	(working copy)
@@ -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



More information about the ffmpeg-devel mailing list