|  |  | @@ -452,8 +452,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) | 
		
	
		
			
			|  |  |  | int bit = 0; | 
		
	
		
			
			|  |  |  | int current_superblock = 0; | 
		
	
		
			
			|  |  |  | int current_run = 0; | 
		
	
		
			
			|  |  |  | int decode_fully_flags = 0; | 
		
	
		
			
			|  |  |  | int decode_partial_blocks = 0; | 
		
	
		
			
			|  |  |  | int num_partial_superblocks = 0; | 
		
	
		
			
			|  |  |  | int first_c_fragment_seen; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | int i, j; | 
		
	
	
		
			
				|  |  | @@ -480,52 +479,46 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) | 
		
	
		
			
			|  |  |  | memset(s->superblock_coding + current_superblock, bit, current_run); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | current_superblock += current_run; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* if any of the superblocks are not partially coded, flag | 
		
	
		
			
			|  |  |  | * a boolean to decode the list of fully-coded superblocks */ | 
		
	
		
			
			|  |  |  | if (bit == 0) { | 
		
	
		
			
			|  |  |  | decode_fully_flags = 1; | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* make a note of the fact that there are partially coded | 
		
	
		
			
			|  |  |  | * superblocks */ | 
		
	
		
			
			|  |  |  | decode_partial_blocks = 1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if (bit) | 
		
	
		
			
			|  |  |  | num_partial_superblocks += current_run; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | bit ^= 1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* unpack the list of fully coded superblocks if any of the blocks were | 
		
	
		
			
			|  |  |  | * not marked as partially coded in the previous step */ | 
		
	
		
			
			|  |  |  | if (decode_fully_flags) { | 
		
	
		
			
			|  |  |  | if (num_partial_superblocks < s->superblock_count) { | 
		
	
		
			
			|  |  |  | int superblocks_decoded = 0; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | current_superblock = 0; | 
		
	
		
			
			|  |  |  | current_run = 0; | 
		
	
		
			
			|  |  |  | bit = get_bits1(gb); | 
		
	
		
			
			|  |  |  | /* toggle the bit because as soon as the first run length is | 
		
	
		
			
			|  |  |  | * fetched the bit will be toggled again */ | 
		
	
		
			
			|  |  |  | bit ^= 1; | 
		
	
		
			
			|  |  |  | while (current_superblock < s->superblock_count) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* skip any superblocks already marked as partially coded */ | 
		
	
		
			
			|  |  |  | if (s->superblock_coding[current_superblock] == SB_NOT_CODED) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (current_run-- == 0) { | 
		
	
		
			
			|  |  |  | bit ^= 1; | 
		
	
		
			
			|  |  |  | while (superblocks_decoded < s->superblock_count - num_partial_superblocks) { | 
		
	
		
			
			|  |  |  | current_run = get_vlc2(gb, | 
		
	
		
			
			|  |  |  | s->superblock_run_length_vlc.table, 6, 2); | 
		
	
		
			
			|  |  |  | if (current_run == 33) | 
		
	
		
			
			|  |  |  | s->superblock_run_length_vlc.table, 6, 2) + 1; | 
		
	
		
			
			|  |  |  | if (current_run == 34) | 
		
	
		
			
			|  |  |  | current_run += get_bits(gb, 12); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (j = 0; j < current_run; current_superblock++) { | 
		
	
		
			
			|  |  |  | if (current_superblock >= s->superblock_count) { | 
		
	
		
			
			|  |  |  | av_log(s->avctx, AV_LOG_ERROR, "Invalid fully coded superblock run length\n"); | 
		
	
		
			
			|  |  |  | return -1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* skip any superblocks already marked as partially coded */ | 
		
	
		
			
			|  |  |  | if (s->superblock_coding[current_superblock] == SB_NOT_CODED) { | 
		
	
		
			
			|  |  |  | s->superblock_coding[current_superblock] = 2*bit; | 
		
	
		
			
			|  |  |  | j++; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | current_superblock++; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | superblocks_decoded += current_run; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | bit ^= 1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /* if there were partial blocks, initialize bitstream for | 
		
	
		
			
			|  |  |  | * unpacking fragment codings */ | 
		
	
		
			
			|  |  |  | if (decode_partial_blocks) { | 
		
	
		
			
			|  |  |  | if (num_partial_superblocks) { | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | current_run = 0; | 
		
	
		
			
			|  |  |  | bit = get_bits1(gb); | 
		
	
	
		
			
				|  |  | 
 |