# HG changeset patch # User michael # Date 1265576949 0 # Node ID 788db3371366a6be241cbb433536c653d7cf968e # Parent 64c36264b13fd2f095bbcc64ccc5f440fda75120 Precalculate a few variables for direct mv prediction for interlaced MBs. diff -r 64c36264b13f -r 788db3371366 h264_direct.c --- 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