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
pull/126/head
Aurelien Jacobs 17 years ago
parent e32e2d56d4
commit feaf1a7393
  1. 10
      libavcodec/vp3.c

@ -963,7 +963,7 @@ static int unpack_modes(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 motion_x[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 */
motion_x[4] = motion_y[4] = 0;
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) {
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)];
@ -1056,6 +1060,10 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb)
}
last_motion_x = motion_x[k];
last_motion_y = motion_y[k];
} else {
motion_x[k] = 0;
motion_y[k] = 0;
}
motion_x[4] += motion_x[k];
motion_y[4] += motion_y[k];
}

Loading…
Cancel
Save