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