|  |  | @@ -720,28 +720,89 @@ static void decode_gray_bitstream(HYuvContext *s, int count) | 
		
	
		
			
			|  |  |  | CLOSE_READER(re, &s->gb); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #define GET_VLC_DUAL(dst0, dst1, name, gb, dtable, table1, table2,  \ | 
		
	
		
			
			|  |  |  | bits, max_depth, rsvd )                        \ | 
		
	
		
			
			|  |  |  | do {                                                            \ | 
		
	
		
			
			|  |  |  | unsigned int index = SHOW_UBITS(name, gb, bits);            \ | 
		
	
		
			
			|  |  |  | int          code  = dtable[index][0];                      \ | 
		
	
		
			
			|  |  |  | int          n     = dtable[index][1];                      \ | 
		
	
		
			
			|  |  |  | \ | 
		
	
		
			
			|  |  |  | if (code != rsvd && n>0) {                                  \ | 
		
	
		
			
			|  |  |  | dst0 = code>>8;                                         \ | 
		
	
		
			
			|  |  |  | dst1 = code;                                            \ | 
		
	
		
			
			|  |  |  | LAST_SKIP_BITS(name, gb, n);                            \ | 
		
	
		
			
			|  |  |  | } else {                                                    \ | 
		
	
		
			
			|  |  |  | int nb_bits;                                            \ | 
		
	
		
			
			|  |  |  | DUAL_INTERN(dst0, table1, gb, name, bits, max_depth);   \ | 
		
	
		
			
			|  |  |  | \ | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, gb);                                   \ | 
		
	
		
			
			|  |  |  | index = SHOW_UBITS(name, gb, bits);                     \ | 
		
	
		
			
			|  |  |  | DUAL_INTERN(dst1, table2, gb, name, bits, max_depth);   \ | 
		
	
		
			
			|  |  |  | }                                                           \ | 
		
	
		
			
			|  |  |  | } while (0) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #define READ_2PIX(dst0, dst1, plane1)\ | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, &s->gb); \ | 
		
	
		
			
			|  |  |  | GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane1].table, \ | 
		
	
		
			
			|  |  |  | s->vlc[0].table, s->vlc[plane1].table, \ | 
		
	
		
			
			|  |  |  | VLC_BITS, 3, 0xffff) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static av_always_inline void decode_bgr_1(HYuvContext *s, int count, | 
		
	
		
			
			|  |  |  | int decorrelate, int alpha) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int i; | 
		
	
		
			
			|  |  |  | OPEN_READER(re, &s->gb); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (i = 0; i < count; i++) { | 
		
	
		
			
			|  |  |  | int code = get_vlc2(&s->gb, s->vlc[4].table, VLC_BITS, 1); | 
		
	
		
			
			|  |  |  | unsigned int index; | 
		
	
		
			
			|  |  |  | int code, n; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, &s->gb); | 
		
	
		
			
			|  |  |  | index = SHOW_UBITS(re, &s->gb, VLC_BITS); | 
		
	
		
			
			|  |  |  | code  = s->vlc[4].table[index][0]; | 
		
	
		
			
			|  |  |  | n     = s->vlc[4].table[index][1]; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (code != -1) { | 
		
	
		
			
			|  |  |  | *(uint32_t*)&s->temp[0][4 * i] = s->pix_bgr_map[code]; | 
		
	
		
			
			|  |  |  | } else if(decorrelate) { | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + G] = get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + B] = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3) + | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + G]; | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + R] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3) + | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + G]; | 
		
	
		
			
			|  |  |  | LAST_SKIP_BITS(re, &s->gb, n); | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + B] = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + G] = get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + R] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | int nb_bits; | 
		
	
		
			
			|  |  |  | if(decorrelate) { | 
		
	
		
			
			|  |  |  | DUAL_INTERN(s->temp[0][4 * i + G], s->vlc[1].table, | 
		
	
		
			
			|  |  |  | &s->gb, re, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, &s->gb); | 
		
	
		
			
			|  |  |  | index = SHOW_UBITS(re, &s->gb, VLC_BITS); | 
		
	
		
			
			|  |  |  | DUAL_INTERN(code, s->vlc[0].table, &s->gb, re, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + B] = code + s->temp[0][4 * i + G]; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, &s->gb); | 
		
	
		
			
			|  |  |  | index = SHOW_UBITS(re, &s->gb, VLC_BITS); | 
		
	
		
			
			|  |  |  | DUAL_INTERN(code, s->vlc[2].table, &s->gb, re, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + R] = code + s->temp[0][4 * i + G]; | 
		
	
		
			
			|  |  |  | } else { | 
		
	
		
			
			|  |  |  | DUAL_INTERN(s->temp[0][4 * i + B], s->vlc[0].table, | 
		
	
		
			
			|  |  |  | &s->gb, re, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, &s->gb); | 
		
	
		
			
			|  |  |  | index = SHOW_UBITS(re, &s->gb, VLC_BITS); | 
		
	
		
			
			|  |  |  | DUAL_INTERN(s->temp[0][4 * i + G], s->vlc[1].table, | 
		
	
		
			
			|  |  |  | &s->gb, re, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, &s->gb); | 
		
	
		
			
			|  |  |  | index = SHOW_UBITS(re, &s->gb, VLC_BITS); | 
		
	
		
			
			|  |  |  | DUAL_INTERN(s->temp[0][4 * i + R], s->vlc[2].table, | 
		
	
		
			
			|  |  |  | &s->gb, re, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if (alpha) { | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, &s->gb); | 
		
	
		
			
			|  |  |  | index = SHOW_UBITS(re, &s->gb, VLC_BITS); | 
		
	
		
			
			|  |  |  | DUAL_INTERN(s->temp[0][4 * i + A], s->vlc[2].table, | 
		
	
		
			
			|  |  |  | &s->gb, re, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if (alpha) | 
		
	
		
			
			|  |  |  | s->temp[0][4 * i + A] = get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | CLOSE_READER(re, &s->gb); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static void decode_bgr_bitstream(HYuvContext *s, int count) | 
		
	
	
		
			
				|  |  | 
 |