|  |  | @@ -43,13 +43,12 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size, | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | vp56_range_coder_t *c = &s->c; | 
		
	
		
			
			|  |  |  | int parse_filter_info = 0; | 
		
	
		
			
			|  |  |  | int coeff_offset = 0; | 
		
	
		
			
			|  |  |  | int vrt_shift = 0; | 
		
	
		
			
			|  |  |  | int sub_version; | 
		
	
		
			
			|  |  |  | int rows, cols; | 
		
	
		
			
			|  |  |  | int res = 1; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (buf[0] & 1) | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | int separated_coeff = buf[0] & 1; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | s->frames[VP56_FRAME_CURRENT].key_frame = !(buf[0] & 0x80); | 
		
	
		
			
			|  |  |  | vp56_init_dequant(s, (buf[0] >> 1) & 0x3F); | 
		
	
	
		
			
				|  |  | @@ -58,12 +57,16 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size, | 
		
	
		
			
			|  |  |  | sub_version = buf[1] >> 3; | 
		
	
		
			
			|  |  |  | if (sub_version > 8) | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | if ((buf[1] & 0x06) != 0x06) | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | s->filter_header = buf[1] & 0x06; | 
		
	
		
			
			|  |  |  | if (buf[1] & 1) { | 
		
	
		
			
			|  |  |  | av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n"); | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if (separated_coeff || !s->filter_header) { | 
		
	
		
			
			|  |  |  | coeff_offset = BE_16(buf+2) - 2; | 
		
	
		
			
			|  |  |  | buf += 2; | 
		
	
		
			
			|  |  |  | buf_size -= 2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | rows = buf[2];  /* number of stored macroblock rows */ | 
		
	
		
			
			|  |  |  | cols = buf[3];  /* number of stored macroblock cols */ | 
		
	
	
		
			
				|  |  | @@ -83,7 +86,7 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size, | 
		
	
		
			
			|  |  |  | vp56_init_range_decoder(c, buf+6, buf_size-6); | 
		
	
		
			
			|  |  |  | vp56_rac_gets(c, 2); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | parse_filter_info = 1; | 
		
	
		
			
			|  |  |  | parse_filter_info = s->filter_header; | 
		
	
		
			
			|  |  |  | if (sub_version < 8) | 
		
	
		
			
			|  |  |  | vrt_shift = 5; | 
		
	
		
			
			|  |  |  | s->sub_version = sub_version; | 
		
	
	
		
			
				|  |  | @@ -91,14 +94,21 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size, | 
		
	
		
			
			|  |  |  | if (!s->sub_version) | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (separated_coeff || !s->filter_header) { | 
		
	
		
			
			|  |  |  | coeff_offset = BE_16(buf+1) - 2; | 
		
	
		
			
			|  |  |  | buf += 2; | 
		
	
		
			
			|  |  |  | buf_size -= 2; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | vp56_init_range_decoder(c, buf+1, buf_size-1); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | *golden_frame = vp56_rac_get(c); | 
		
	
		
			
			|  |  |  | if (s->filter_header) { | 
		
	
		
			
			|  |  |  | s->deblock_filtering = vp56_rac_get(c); | 
		
	
		
			
			|  |  |  | if (s->deblock_filtering) | 
		
	
		
			
			|  |  |  | vp56_rac_get(c); | 
		
	
		
			
			|  |  |  | if (s->sub_version > 7) | 
		
	
		
			
			|  |  |  | parse_filter_info = vp56_rac_get(c); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (parse_filter_info) { | 
		
	
	
		
			
				|  |  | @@ -118,6 +128,15 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size, | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | vp56_rac_get(c); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (coeff_offset) { | 
		
	
		
			
			|  |  |  | vp56_init_range_decoder(&s->cc, buf+coeff_offset, | 
		
	
		
			
			|  |  |  | buf_size-coeff_offset); | 
		
	
		
			
			|  |  |  | s->ccp = &s->cc; | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | s->ccp = &s->c; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | return res; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -259,7 +278,7 @@ static void vp6_parse_vector_adjustment(vp56_context_t *s, vp56_mv_t *vect) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static void vp6_parse_coeff(vp56_context_t *s) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | vp56_range_coder_t *c = &s->c; | 
		
	
		
			
			|  |  |  | vp56_range_coder_t *c = s->ccp; | 
		
	
		
			
			|  |  |  | uint8_t *permute = s->scantable.permutated; | 
		
	
		
			
			|  |  |  | uint8_t *model, *model2, *model3; | 
		
	
		
			
			|  |  |  | int coeff, sign, coeff_idx; | 
		
	
	
		
			
				|  |  | 
 |