changeset 4308:74b476185cd1 libavcodec

Add support for VP60 and VP61.
author aurel
date Sun, 17 Dec 2006 22:00:12 +0000
parents 649e51394b6f
children 1f95aa362562
files avcodec.h vp56.h vp6.c vp6data.h
diffstat 4 files changed, 34 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/avcodec.h	Sun Dec 17 15:41:30 2006 +0000
+++ b/avcodec.h	Sun Dec 17 22:00:12 2006 +0000
@@ -37,8 +37,8 @@
 #define AV_STRINGIFY(s)         AV_TOSTRING(s)
 #define AV_TOSTRING(s) #s
 
-#define LIBAVCODEC_VERSION_INT  ((51<<16)+(26<<8)+0)
-#define LIBAVCODEC_VERSION      51.26.0
+#define LIBAVCODEC_VERSION_INT  ((51<<16)+(27<<8)+0)
+#define LIBAVCODEC_VERSION      51.27.0
 #define LIBAVCODEC_BUILD        LIBAVCODEC_VERSION_INT
 
 #define LIBAVCODEC_IDENT        "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
--- a/vp56.h	Sun Dec 17 15:41:30 2006 +0000
+++ b/vp56.h	Sun Dec 17 22:00:12 2006 +0000
@@ -76,6 +76,7 @@
     uint8_t *edge_emu_buffer_alloc;
     uint8_t *edge_emu_buffer;
     vp56_range_coder_t c;
+    int sub_version;
 
     /* frame info */
     int plane_width[3];
--- a/vp6.c	Sun Dec 17 15:41:30 2006 +0000
+++ b/vp6.c	Sun Dec 17 22:00:12 2006 +0000
@@ -42,7 +42,9 @@
                             int *golden_frame)
 {
     vp56_range_coder_t *c = &s->c;
-    int parse_filter_info;
+    int parse_filter_info = 0;
+    int vrt_shift = 0;
+    int sub_version;
     int rows, cols;
     int res = 1;
 
@@ -53,7 +55,10 @@
     vp56_init_dequant(s, (buf[0] >> 1) & 0x3F);
 
     if (s->frames[VP56_FRAME_CURRENT].key_frame) {
-        if ((buf[1] & 0xFE) != 0x46)  /* would be 0x36 for VP61 */
+        sub_version = buf[1] >> 3;
+        if (sub_version > 8)
+            return 0;
+        if ((buf[1] & 0x06) != 0x06)
             return 0;
         if (buf[1] & 1) {
             av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n");
@@ -79,27 +84,37 @@
         vp56_rac_gets(c, 2);
 
         parse_filter_info = 1;
+        if (sub_version < 8)
+            vrt_shift = 5;
+        s->sub_version = sub_version;
     } else {
+        if (!s->sub_version)
+            return 0;
+
         vp56_init_range_decoder(c, buf+1, buf_size-1);
 
         *golden_frame = vp56_rac_get(c);
         s->deblock_filtering = vp56_rac_get(c);
         if (s->deblock_filtering)
             vp56_rac_get(c);
-        parse_filter_info = vp56_rac_get(c);
+        if (s->sub_version > 7)
+            parse_filter_info = vp56_rac_get(c);
     }
 
     if (parse_filter_info) {
         if (vp56_rac_get(c)) {
             s->filter_mode = 2;
-            s->sample_variance_threshold = vp56_rac_gets(c, 5);
+            s->sample_variance_threshold = vp56_rac_gets(c, 5) << vrt_shift;
             s->max_vector_length = 2 << vp56_rac_gets(c, 3);
         } else if (vp56_rac_get(c)) {
             s->filter_mode = 1;
         } else {
             s->filter_mode = 0;
         }
-        s->filter_selection = vp56_rac_gets(c, 4);
+        if (s->sub_version > 7)
+            s->filter_selection = vp56_rac_gets(c, 4);
+        else
+            s->filter_selection = 16;
     }
 
     vp56_rac_get(c);
@@ -439,8 +454,8 @@
                 (FFABS(mv.x) > s->max_vector_length ||
                  FFABS(mv.y) > s->max_vector_length)) {
                 filter4 = 0;
-            } else if (!s->sample_variance_threshold
-                       || (vp6_block_variance(src+offset1, stride)
+            } else if (s->sample_variance_threshold
+                       && (vp6_block_variance(src+offset1, stride)
                            < s->sample_variance_threshold)) {
                 filter4 = 0;
             }
--- a/vp6data.h	Sun Dec 17 15:41:30 2006 +0000
+++ b/vp6data.h	Sun Dec 17 22:00:12 2006 +0000
@@ -144,7 +144,7 @@
     5, 5, 5, 5, 5, 5, 5, 5,
 };
 
-static const int16_t vp6_block_copy_filter[16][8][4] = {
+static const int16_t vp6_block_copy_filter[17][8][4] = {
   { {   0, 128,   0,   0  },  /* 0 */
     {  -3, 122,   9,   0  },
     {  -4, 109,  24,  -1  },
@@ -273,6 +273,14 @@
     { -11,  59,  99, -19  },
     {  -6,  38, 114, -18  },
     {  -2,  18, 124, -12  } },
+  { {   0, 128,   0,   0  },  /* 16 */
+    {  -4, 118,  16,  -2  },
+    {  -7, 106,  34,  -5  },
+    {  -8,  90,  53,  -7  },
+    {  -8,  72,  72,  -8  },
+    {  -7,  53,  90,  -8  },
+    {  -5,  34, 106,  -7  },
+    {  -2,  16, 118,  -4  } },
 };
 
 static const vp56_tree_t vp6_pcr_tree[] = {