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 }