changeset 7778:e31b0b920475 libavcodec

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
author aurel
date Wed, 03 Sep 2008 00:17:11 +0000
parents 8002605f6aaf
children 5b54bcbae698
files vp3.c
diffstat 1 files changed, 9 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/vp3.c	Wed Sep 03 00:10:30 2008 +0000
+++ b/vp3.c	Wed Sep 03 00:17:11 2008 +0000
@@ -963,7 +963,7 @@
  */
 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 @@
                      * 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 @@
                         }
                         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];
                     }