Mercurial > libavcodec.hg
diff vp6.c @ 4308:74b476185cd1 libavcodec
Add support for VP60 and VP61.
author | aurel |
---|---|
date | Sun, 17 Dec 2006 22:00:12 +0000 |
parents | 331961478469 |
children | d3dcf62d52c5 |
line wrap: on
line diff
--- 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; }