[FFmpeg-cvslog] r14545 - trunk/libavcodec/h264.c

michael subversion
Tue Aug 5 02:08:32 CEST 2008


Author: michael
Date: Tue Aug  5 02:08:32 2008
New Revision: 14545

Log:
Use frame_num and reference instead of poc for matching frames for direct
mode MBs, this seems to work better with field/frame mixes. POC of both
can be the same and can be different that makes its use tricky.


Modified:
   trunk/libavcodec/h264.c

Modified: trunk/libavcodec/h264.c
==============================================================================
--- trunk/libavcodec/h264.c	(original)
+++ trunk/libavcodec/h264.c	Tue Aug  5 02:08:32 2008
@@ -920,7 +920,7 @@ static inline void direct_ref_list_init(
     for(list=0; list<2; list++){
         cur->ref_count[sidx][list] = h->ref_count[list];
         for(j=0; j<h->ref_count[list]; j++)
-            cur->ref_poc[sidx][list][j] = h->ref_list[list][j].poc;
+            cur->ref_poc[sidx][list][j] = 4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3);
     }
     if(s->picture_structure == PICT_FRAME){
         memcpy(cur->ref_count[0], cur->ref_count[1], sizeof(cur->ref_count[0]));
@@ -930,10 +930,12 @@ static inline void direct_ref_list_init(
         return;
     for(list=0; list<2; list++){
         for(i=0; i<ref1->ref_count[ref1sidx][list]; i++){
-            const int poc = ref1->ref_poc[ref1sidx][list][i];
+            int poc = ref1->ref_poc[ref1sidx][list][i];
+            if(((poc&3) == 3) != (s->picture_structure == PICT_FRAME))
+                poc= (poc&~3) + s->picture_structure;
             h->map_col_to_list0[list][i] = 0; /* bogus; fills in for missing frames */
             for(j=0; j<h->ref_count[list]; j++)
-                if(h->ref_list[list][j].poc == poc){
+                if(4*h->ref_list[list][j].frame_num + (h->ref_list[list][j].reference&3) == poc){
                     h->map_col_to_list0[list][i] = j;
                     break;
                 }




More information about the ffmpeg-cvslog mailing list