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.
Unified · Split
| @@ -1291,6 +1291,7 @@ static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int di · 1290 unmodified lines | ||
| 1291 | 1291 | int scaledvalue, refdist; |
| 1292 | 1292 | int scalesame1, scalesame2; |
| 1293 | 1293 | int scalezone1_x, zone1offset_x; |
| 1294 | + int table_index = dir ^ v->second_field; | |
| 1294 | 1295 | |
| 1295 | 1296 | if (v->s.pict_type != AV_PICTURE_TYPE_B) |
| 1296 | 1297 | refdist = v->refdist; |
| @@ -1298,10 +1299,10 @@ static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int di · 1 unmodified line | ||
| 1298 | 1299 | refdist = dir ? v->brfd : v->frfd; |
| 1299 | 1300 | if (refdist > 3) |
| 1300 | 1301 | refdist = 3; |
| 1301 | − scalesame1 = vc1_field_mvpred_scales[v->second_field][1][refdist]; | |
| 1302 | − scalesame2 = vc1_field_mvpred_scales[v->second_field][2][refdist]; | |
| 1303 | − scalezone1_x = vc1_field_mvpred_scales[v->second_field][3][refdist]; | |
| 1304 | − zone1offset_x = vc1_field_mvpred_scales[v->second_field][5][refdist]; | |
| 1302 | + scalesame1 = vc1_field_mvpred_scales[table_index][1][refdist]; | |
| 1303 | + scalesame2 = vc1_field_mvpred_scales[table_index][2][refdist]; | |
| 1304 | + scalezone1_x = vc1_field_mvpred_scales[table_index][3][refdist]; | |
| 1305 | + zone1offset_x = vc1_field_mvpred_scales[table_index][5][refdist]; | |
| 1305 | 1306 | |
| 1306 | 1307 | if (FFABS(n) > 255) |
| 1307 | 1308 | scaledvalue = n; |
| @@ -1323,6 +1324,7 @@ static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */, · 15 unmodified lines | ||
| 1323 | 1324 | int scaledvalue, refdist; |
| 1324 | 1325 | int scalesame1, scalesame2; |
| 1325 | 1326 | int scalezone1_y, zone1offset_y; |
| 1327 | + int table_index = dir ^ v->second_field; | |
| 1326 | 1328 | |
| 1327 | 1329 | if (v->s.pict_type != AV_PICTURE_TYPE_B) |
| 1328 | 1330 | refdist = v->refdist; |
| @@ -1330,10 +1332,10 @@ static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */, · 1 unmodified line | ||
| 1330 | 1332 | refdist = dir ? v->brfd : v->frfd; |
| 1331 | 1333 | if (refdist > 3) |
| 1332 | 1334 | refdist = 3; |
| 1333 | − scalesame1 = vc1_field_mvpred_scales[v->second_field][1][refdist]; | |
| 1334 | − scalesame2 = vc1_field_mvpred_scales[v->second_field][2][refdist]; | |
| 1335 | − scalezone1_y = vc1_field_mvpred_scales[v->second_field][4][refdist]; | |
| 1336 | − zone1offset_y = vc1_field_mvpred_scales[v->second_field][6][refdist]; | |
| 1335 | + scalesame1 = vc1_field_mvpred_scales[table_index][1][refdist]; | |
| 1336 | + scalesame2 = vc1_field_mvpred_scales[table_index][2][refdist]; | |
| 1337 | + scalezone1_y = vc1_field_mvpred_scales[table_index][4][refdist]; | |
| 1338 | + zone1offset_y = vc1_field_mvpred_scales[table_index][6][refdist]; | |
| 1337 | 1339 | |
| 1338 | 1340 | if (FFABS(n) > 63) |
| 1339 | 1341 | scaledvalue = n; |
| @@ -1444,7 +1446,7 @@ static av_always_inline int scaleforopp(VC1Context *v, int n /* MV */, · 104 unmodified lines | ||
| 1444 | 1446 | refdist = FFMIN(v->refdist, 3); |
| 1445 | 1447 | else |
| 1446 | 1448 | refdist = dir ? v->brfd : v->frfd; |
| 1447 | − scaleopp = vc1_field_mvpred_scales[v->second_field][0][refdist]; | |
| 1449 | + scaleopp = vc1_field_mvpred_scales[dir ^ v->second_field][0][refdist]; | |
| 1448 | 1450 | |
| 1449 | 1451 | return n * scaleopp >> 8; |
| 1450 | 1452 | } |