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
12911291 int scaledvalue, refdist;
12921292 int scalesame1, scalesame2;
12931293 int scalezone1_x, zone1offset_x;
1294+ int table_index = dir ^ v->second_field;
12941295
12951296 if (v->s.pict_type != AV_PICTURE_TYPE_B)
12961297 refdist = v->refdist;
@@ -1298,10 +1299,10 @@ static av_always_inline int scaleforsame_x(VC1Context *v, int n /* MV */, int di · 1 unmodified line
12981299 refdist = dir ? v->brfd : v->frfd;
12991300 if (refdist > 3)
13001301 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];
13051306
13061307 if (FFABS(n) > 255)
13071308 scaledvalue = n;
@@ -1323,6 +1324,7 @@ static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */, · 15 unmodified lines
13231324 int scaledvalue, refdist;
13241325 int scalesame1, scalesame2;
13251326 int scalezone1_y, zone1offset_y;
1327+ int table_index = dir ^ v->second_field;
13261328
13271329 if (v->s.pict_type != AV_PICTURE_TYPE_B)
13281330 refdist = v->refdist;
@@ -1330,10 +1332,10 @@ static av_always_inline int scaleforsame_y(VC1Context *v, int i, int n /* MV */, · 1 unmodified line
13301332 refdist = dir ? v->brfd : v->frfd;
13311333 if (refdist > 3)
13321334 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];
13371339
13381340 if (FFABS(n) > 63)
13391341 scaledvalue = n;
@@ -1444,7 +1446,7 @@ static av_always_inline int scaleforopp(VC1Context *v, int n /* MV */, · 104 unmodified lines
14441446 refdist = FFMIN(v->refdist, 3);
14451447 else
14461448 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];
14481450
14491451 return n * scaleopp >> 8;
14501452 }

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