changeset 11093:788db3371366 libavcodec

Precalculate a few variables for direct mv prediction for interlaced MBs.
author michael
date Sun, 07 Feb 2010 21:09:09 +0000
parents 64c36264b13f
children 323491bb995c
files h264_direct.c
diffstat 1 files changed, 11 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/h264_direct.c	Sun Feb 07 17:40:22 2010 +0000
+++ b/h264_direct.c	Sun Feb 07 21:09:09 2010 +0000
@@ -120,15 +120,19 @@
 
     cur->mbaff= FRAME_MBAFF;
 
-    if(cur->pict_type != FF_B_TYPE || h->direct_spatial_mv_pred)
-        return;
-
+    h->col_fieldoff= 0;
     if(s->picture_structure == PICT_FRAME){
         int cur_poc = s->current_picture_ptr->poc;
         int *col_poc = h->ref_list[1]->field_poc;
-        ref1sidx=sidx= (FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc));
+        h->col_parity= (FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc));
+        ref1sidx=sidx= h->col_parity;
+    }else if(!(s->picture_structure & h->ref_list[1][0].reference) && !h->ref_list[1][0].mbaff){ // FL -> FL & differ parity
+        h->col_fieldoff= s->mb_stride*(2*(h->ref_list[1][0].reference) - 3);
     }
 
+    if(cur->pict_type != FF_B_TYPE || h->direct_spatial_mv_pred)
+        return;
+
     for(list=0; list<2; list++){
         fill_colmap(h, h->map_col_to_list0, list, sidx, ref1sidx, 0);
         if(FRAME_MBAFF)
@@ -155,14 +159,10 @@
 
     if(IS_INTERLACED(h->ref_list[1][0].mb_type[mb_xy])){ // AFL/AFR/FR/FL -> AFL/FL
         if(!IS_INTERLACED(*mb_type)){                    //     AFR/FR    -> AFL/FL
-            int cur_poc = s->current_picture_ptr->poc;
-            int *col_poc = h->ref_list[1]->field_poc;
-            int col_parity = FFABS(col_poc[0] - cur_poc) >= FFABS(col_poc[1] - cur_poc);
-            mb_xy= s->mb_x + ((s->mb_y&~1) + col_parity)*s->mb_stride;
+            mb_xy= s->mb_x + ((s->mb_y&~1) + h->col_parity)*s->mb_stride;
             b8_stride = 0;
-        }else if(!(s->picture_structure & h->ref_list[1][0].reference) && !h->ref_list[1][0].mbaff){// FL -> FL & differ parity
-            int fieldoff= 2*(h->ref_list[1][0].reference)-3;
-            mb_xy += s->mb_stride*fieldoff;
+        }else{
+            mb_xy += h->col_fieldoff; // non zero for FL -> FL & differ parity
         }
         goto single_col;
     }else{                                               // AFL/AFR/FR/FL -> AFR/FR