From feaf1a739377f8b9ce65e9d3032f3d828d0c15ed Mon Sep 17 00:00:00 2001 From: Aurelien Jacobs Date: Wed, 3 Sep 2008 00:17:11 +0000 Subject: [PATCH] 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 --- libavcodec/vp3.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index 6740f0c3e5..4e077c49a3 100644 --- a/libavcodec/vp3.c +++ b/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]; }