mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-17 12:27:18 +00:00
Use correct scaling table for bwd-pred MVs in second B-field
When scaling backward predicted MVs in second B-field, the scaling table is opposite of that for P field pictures; i.e. first field P table will be used as second field B table and second field P table will be used as first field B table. This is not documented in the spec, but exists in the ref. decoder. This fixes SA10139. Signed-off-by: Martin Storsjö <martin@martin.st>
This commit is contained in:
parent
0d8506b8c5
commit
73447eb4bd
@ -1291,6 +1291,7 @@ static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int di
|
|||||||
int scaledvalue, refdist;
|
int scaledvalue, refdist;
|
||||||
int scalesame1, scalesame2;
|
int scalesame1, scalesame2;
|
||||||
int scalezone1_x, zone1offset_x;
|
int scalezone1_x, zone1offset_x;
|
||||||
|
int table_index = dir ^ v->second_field;
|
||||||
|
|
||||||
if (v->s.pict_type != AV_PICTURE_TYPE_B)
|
if (v->s.pict_type != AV_PICTURE_TYPE_B)
|
||||||
refdist = v->refdist;
|
refdist = v->refdist;
|
||||||
@ -1298,10 +1299,10 @@ static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int di
|
|||||||
refdist = dir ? v->brfd : v->frfd;
|
refdist = dir ? v->brfd : v->frfd;
|
||||||
if (refdist > 3)
|
if (refdist > 3)
|
||||||
refdist = 3;
|
refdist = 3;
|
||||||
scalesame1 = vc1_field_mvpred_scales[v->second_field][1][refdist];
|
scalesame1 = vc1_field_mvpred_scales[table_index][1][refdist];
|
||||||
scalesame2 = vc1_field_mvpred_scales[v->second_field][2][refdist];
|
scalesame2 = vc1_field_mvpred_scales[table_index][2][refdist];
|
||||||
scalezone1_x = vc1_field_mvpred_scales[v->second_field][3][refdist];
|
scalezone1_x = vc1_field_mvpred_scales[table_index][3][refdist];
|
||||||
zone1offset_x = vc1_field_mvpred_scales[v->second_field][5][refdist];
|
zone1offset_x = vc1_field_mvpred_scales[table_index][5][refdist];
|
||||||
|
|
||||||
if (FFABS(n) > 255)
|
if (FFABS(n) > 255)
|
||||||
scaledvalue = n;
|
scaledvalue = n;
|
||||||
@ -1323,6 +1324,7 @@ static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */,
|
|||||||
int scaledvalue, refdist;
|
int scaledvalue, refdist;
|
||||||
int scalesame1, scalesame2;
|
int scalesame1, scalesame2;
|
||||||
int scalezone1_y, zone1offset_y;
|
int scalezone1_y, zone1offset_y;
|
||||||
|
int table_index = dir ^ v->second_field;
|
||||||
|
|
||||||
if (v->s.pict_type != AV_PICTURE_TYPE_B)
|
if (v->s.pict_type != AV_PICTURE_TYPE_B)
|
||||||
refdist = v->refdist;
|
refdist = v->refdist;
|
||||||
@ -1330,10 +1332,10 @@ static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */,
|
|||||||
refdist = dir ? v->brfd : v->frfd;
|
refdist = dir ? v->brfd : v->frfd;
|
||||||
if (refdist > 3)
|
if (refdist > 3)
|
||||||
refdist = 3;
|
refdist = 3;
|
||||||
scalesame1 = vc1_field_mvpred_scales[v->second_field][1][refdist];
|
scalesame1 = vc1_field_mvpred_scales[table_index][1][refdist];
|
||||||
scalesame2 = vc1_field_mvpred_scales[v->second_field][2][refdist];
|
scalesame2 = vc1_field_mvpred_scales[table_index][2][refdist];
|
||||||
scalezone1_y = vc1_field_mvpred_scales[v->second_field][4][refdist];
|
scalezone1_y = vc1_field_mvpred_scales[table_index][4][refdist];
|
||||||
zone1offset_y = vc1_field_mvpred_scales[v->second_field][6][refdist];
|
zone1offset_y = vc1_field_mvpred_scales[table_index][6][refdist];
|
||||||
|
|
||||||
if (FFABS(n) > 63)
|
if (FFABS(n) > 63)
|
||||||
scaledvalue = n;
|
scaledvalue = n;
|
||||||
@ -1444,7 +1446,7 @@ static av_always_inline int scaleforopp(VC1Context *v, int n /* MV */,
|
|||||||
refdist = FFMIN(v->refdist, 3);
|
refdist = FFMIN(v->refdist, 3);
|
||||||
else
|
else
|
||||||
refdist = dir ? v->brfd : v->frfd;
|
refdist = dir ? v->brfd : v->frfd;
|
||||||
scaleopp = vc1_field_mvpred_scales[v->second_field][0][refdist];
|
scaleopp = vc1_field_mvpred_scales[dir ^ v->second_field][0][refdist];
|
||||||
|
|
||||||
return n * scaleopp >> 8;
|
return n * scaleopp >> 8;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user