theoradec: skip decoding of uncoded MV in 4MV code

Thusnelda, the new experimental Theora encoder is using this Theora feature
that was previously not exploited.
fixes issue579

Originally committed as revision 15166 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Aurelien Jacobs 2008-09-03 00:17:11 +00:00
parent e32e2d56d4
commit feaf1a7393

View File

@ -963,7 +963,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
*/ */
static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
{ {
int i, j, k; int i, j, k, l;
int coding_mode; int coding_mode;
int motion_x[6]; int motion_x[6];
int motion_y[6]; int motion_y[6];
@ -1047,6 +1047,10 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
* Y fragment, then average for the C fragment vectors */ * Y fragment, then average for the C fragment vectors */
motion_x[4] = motion_y[4] = 0; motion_x[4] = motion_y[4] = 0;
for (k = 0; k < 4; k++) { for (k = 0; k < 4; k++) {
for (l = 0; l < s->coded_fragment_list_index; l++)
if (s->coded_fragment_list[l] == s->macroblock_fragments[6*current_macroblock + k])
break;
if (l < s->coded_fragment_list_index) {
if (coding_mode == 0) { if (coding_mode == 0) {
motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; motion_x[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
motion_y[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)]; motion_y[k] = motion_vector_table[get_vlc2(gb, s->motion_vector_vlc.table, 6, 2)];
@ -1056,6 +1060,10 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
} }
last_motion_x = motion_x[k]; last_motion_x = motion_x[k];
last_motion_y = motion_y[k]; last_motion_y = motion_y[k];
} else {
motion_x[k] = 0;
motion_y[k] = 0;
}
motion_x[4] += motion_x[k]; motion_x[4] += motion_x[k];
motion_y[4] += motion_y[k]; motion_y[4] += motion_y[k];
} }