summaryrefslogtreecommitdiff
path: root/libavcodec/h264_direct.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2010-02-07 21:09:09 +0000
committerMichael Niedermayer <michaelni@gmx.at>2010-02-07 21:09:09 +0000
commit0a8dca8765e19a2a034ff9914c63b514336729a9 (patch)
tree95b8e0e0e3558727f3f488278735f60827404fa0 /libavcodec/h264_direct.c
parente6406939a833561b60cdc25682dcaca7c457ddbf (diff)
Precalculate a few variables for direct mv prediction for interlaced MBs.
Originally committed as revision 21677 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/h264_direct.c')
-rw-r--r--libavcodec/h264_direct.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/libavcodec/h264_direct.c b/libavcodec/h264_direct.c
index e2b33cee8c..86880b22d4 100644
--- a/libavcodec/h264_direct.c
+++ b/libavcodec/h264_direct.c
@@ -120,15 +120,19 @@ void ff_h264_direct_ref_list_init(H264Context * const h){
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 @@ void ff_h264_pred_direct_motion(H264Context * const h, int *mb_type){
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