From 9110a0e32d5eb421558145459e2a1fcc9720c170 Mon Sep 17 00:00:00 2001 From: Aurelien Jacobs Date: Sun, 17 Dec 2006 22:00:12 +0000 Subject: [PATCH] Add support for VP60 and VP61. Originally committed as revision 7329 to svn://svn.ffmpeg.org/ffmpeg/trunk --- doc/ffmpeg-doc.texi | 2 +- libavcodec/avcodec.h | 4 ++-- libavcodec/vp56.h | 1 + libavcodec/vp6.c | 29 ++++++++++++++++++++++------- libavcodec/vp6data.h | 10 +++++++++- libavformat/nsvdec.c | 6 +++--- libavformat/riff.c | 2 ++ 7 files changed, 40 insertions(+), 14 deletions(-) diff --git a/doc/ffmpeg-doc.texi b/doc/ffmpeg-doc.texi index 470cfe3c10..21dbcac4a0 100644 --- a/doc/ffmpeg-doc.texi +++ b/doc/ffmpeg-doc.texi @@ -968,7 +968,7 @@ following image formats are supported: @item Sorenson Video 3 @tab @tab X @tab fourcc: SVQ3 @item On2 VP3 @tab @tab X @tab still experimental @item On2 VP5 @tab @tab X @tab fourcc: VP50 -@item On2 VP6 @tab @tab X @tab fourcc: VP62 +@item On2 VP6 @tab @tab X @tab fourcc: VP60,VP61,VP62 @item Theora @tab @tab X @tab still experimental @item Intel Indeo 3 @tab @tab X @item FLV @tab X @tab X @tab Sorenson H.263 used in Flash diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 33bf2d3860..89c45ea322 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -37,8 +37,8 @@ extern "C" { #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) diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h index d6808b1e54..f8b3a8e4b6 100644 --- a/libavcodec/vp56.h +++ b/libavcodec/vp56.h @@ -76,6 +76,7 @@ struct vp56_context { 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]; diff --git a/libavcodec/vp6.c b/libavcodec/vp6.c index bc0ce817b1..381fcc8eed 100644 --- a/libavcodec/vp6.c +++ b/libavcodec/vp6.c @@ -42,7 +42,9 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size, 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 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size, 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 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size, 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 @@ static void vp6_filter(vp56_context_t *s, uint8_t *dst, uint8_t *src, (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; } diff --git a/libavcodec/vp6data.h b/libavcodec/vp6data.h index ba4c7abf74..0545a9d667 100644 --- a/libavcodec/vp6data.h +++ b/libavcodec/vp6data.h @@ -144,7 +144,7 @@ static const uint8_t vp6_coeff_groups[] = { 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 @@ static const int16_t vp6_block_copy_filter[16][8][4] = { { -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[] = { diff --git a/libavformat/nsvdec.c b/libavformat/nsvdec.c index 9a5fe97f89..e3c439a774 100644 --- a/libavformat/nsvdec.c +++ b/libavformat/nsvdec.c @@ -189,13 +189,13 @@ static const CodecTag nsv_codec_video_tags[] = { { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, { CODEC_ID_VP5, MKTAG('V', 'P', '5', ' ') }, { CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') }, + { CODEC_ID_VP6, MKTAG('V', 'P', '6', ' ') }, + { CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') }, + { CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') }, { CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') }, /* { CODEC_ID_VP4, MKTAG('V', 'P', '4', ' ') }, { CODEC_ID_VP4, MKTAG('V', 'P', '4', '0') }, - { CODEC_ID_VP6, MKTAG('V', 'P', '6', ' ') }, - { CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') }, - { CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') }, */ { CODEC_ID_XVID, MKTAG('X', 'V', 'I', 'D') }, /* cf sample xvid decoder from nsv_codec_sdk.zip */ { CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', '3') }, diff --git a/libavformat/riff.c b/libavformat/riff.c index d315c66afb..81605cceb3 100644 --- a/libavformat/riff.c +++ b/libavformat/riff.c @@ -118,6 +118,8 @@ const CodecTag codec_bmp_tags[] = { { CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') }, { CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') }, { CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') }, + { CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') }, + { CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') }, { CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') }, { CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') }, { CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },