History

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.

Mashiat Sarker Shakkhar committed 15 years ago

Commit 73447eb1 parent 0d8506b1 file · +11 −9Browse files

Unified · Split

libavcodec/vc1dec.c+11−9
@@ -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 else1447 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}

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t