Mercurial > libavcodec.hg
comparison 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 |
comparison
equal
deleted
inserted
replaced
4307:649e51394b6f | 4308:74b476185cd1 |
---|---|
40 | 40 |
41 static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size, | 41 static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size, |
42 int *golden_frame) | 42 int *golden_frame) |
43 { | 43 { |
44 vp56_range_coder_t *c = &s->c; | 44 vp56_range_coder_t *c = &s->c; |
45 int parse_filter_info; | 45 int parse_filter_info = 0; |
46 int vrt_shift = 0; | |
47 int sub_version; | |
46 int rows, cols; | 48 int rows, cols; |
47 int res = 1; | 49 int res = 1; |
48 | 50 |
49 if (buf[0] & 1) | 51 if (buf[0] & 1) |
50 return 0; | 52 return 0; |
51 | 53 |
52 s->frames[VP56_FRAME_CURRENT].key_frame = !(buf[0] & 0x80); | 54 s->frames[VP56_FRAME_CURRENT].key_frame = !(buf[0] & 0x80); |
53 vp56_init_dequant(s, (buf[0] >> 1) & 0x3F); | 55 vp56_init_dequant(s, (buf[0] >> 1) & 0x3F); |
54 | 56 |
55 if (s->frames[VP56_FRAME_CURRENT].key_frame) { | 57 if (s->frames[VP56_FRAME_CURRENT].key_frame) { |
56 if ((buf[1] & 0xFE) != 0x46) /* would be 0x36 for VP61 */ | 58 sub_version = buf[1] >> 3; |
59 if (sub_version > 8) | |
60 return 0; | |
61 if ((buf[1] & 0x06) != 0x06) | |
57 return 0; | 62 return 0; |
58 if (buf[1] & 1) { | 63 if (buf[1] & 1) { |
59 av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n"); | 64 av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n"); |
60 return 0; | 65 return 0; |
61 } | 66 } |
77 | 82 |
78 vp56_init_range_decoder(c, buf+6, buf_size-6); | 83 vp56_init_range_decoder(c, buf+6, buf_size-6); |
79 vp56_rac_gets(c, 2); | 84 vp56_rac_gets(c, 2); |
80 | 85 |
81 parse_filter_info = 1; | 86 parse_filter_info = 1; |
87 if (sub_version < 8) | |
88 vrt_shift = 5; | |
89 s->sub_version = sub_version; | |
82 } else { | 90 } else { |
91 if (!s->sub_version) | |
92 return 0; | |
93 | |
83 vp56_init_range_decoder(c, buf+1, buf_size-1); | 94 vp56_init_range_decoder(c, buf+1, buf_size-1); |
84 | 95 |
85 *golden_frame = vp56_rac_get(c); | 96 *golden_frame = vp56_rac_get(c); |
86 s->deblock_filtering = vp56_rac_get(c); | 97 s->deblock_filtering = vp56_rac_get(c); |
87 if (s->deblock_filtering) | 98 if (s->deblock_filtering) |
88 vp56_rac_get(c); | 99 vp56_rac_get(c); |
89 parse_filter_info = vp56_rac_get(c); | 100 if (s->sub_version > 7) |
101 parse_filter_info = vp56_rac_get(c); | |
90 } | 102 } |
91 | 103 |
92 if (parse_filter_info) { | 104 if (parse_filter_info) { |
93 if (vp56_rac_get(c)) { | 105 if (vp56_rac_get(c)) { |
94 s->filter_mode = 2; | 106 s->filter_mode = 2; |
95 s->sample_variance_threshold = vp56_rac_gets(c, 5); | 107 s->sample_variance_threshold = vp56_rac_gets(c, 5) << vrt_shift; |
96 s->max_vector_length = 2 << vp56_rac_gets(c, 3); | 108 s->max_vector_length = 2 << vp56_rac_gets(c, 3); |
97 } else if (vp56_rac_get(c)) { | 109 } else if (vp56_rac_get(c)) { |
98 s->filter_mode = 1; | 110 s->filter_mode = 1; |
99 } else { | 111 } else { |
100 s->filter_mode = 0; | 112 s->filter_mode = 0; |
101 } | 113 } |
102 s->filter_selection = vp56_rac_gets(c, 4); | 114 if (s->sub_version > 7) |
115 s->filter_selection = vp56_rac_gets(c, 4); | |
116 else | |
117 s->filter_selection = 16; | |
103 } | 118 } |
104 | 119 |
105 vp56_rac_get(c); | 120 vp56_rac_get(c); |
106 return res; | 121 return res; |
107 } | 122 } |
437 if (filter4 == 2) { | 452 if (filter4 == 2) { |
438 if (s->max_vector_length && | 453 if (s->max_vector_length && |
439 (FFABS(mv.x) > s->max_vector_length || | 454 (FFABS(mv.x) > s->max_vector_length || |
440 FFABS(mv.y) > s->max_vector_length)) { | 455 FFABS(mv.y) > s->max_vector_length)) { |
441 filter4 = 0; | 456 filter4 = 0; |
442 } else if (!s->sample_variance_threshold | 457 } else if (s->sample_variance_threshold |
443 || (vp6_block_variance(src+offset1, stride) | 458 && (vp6_block_variance(src+offset1, stride) |
444 < s->sample_variance_threshold)) { | 459 < s->sample_variance_threshold)) { |
445 filter4 = 0; | 460 filter4 = 0; |
446 } | 461 } |
447 } | 462 } |
448 } | 463 } |