comparison huffyuv.c @ 5072:1aec7fab94c4 libavcodec

use sparse huffman tables. 1.5% faster huffyuv decoding.
author lorenm
date Thu, 24 May 2007 17:40:02 +0000
parents d5640ea6d4a6
children d12405ae17b0
comparison
equal deleted inserted replaced
5071:0d503c12092b 5072:1aec7fab94c4
69 uint8_t *temp[3]; 69 uint8_t *temp[3];
70 uint64_t stats[3][256]; 70 uint64_t stats[3][256];
71 uint8_t len[3][256]; 71 uint8_t len[3][256];
72 uint32_t bits[3][256]; 72 uint32_t bits[3][256];
73 VLC vlc[6]; //Y,U,V,YY,YU,YV 73 VLC vlc[6]; //Y,U,V,YY,YU,YV
74 uint16_t pix2_map[3][1<<VLC_BITS];
75 AVFrame picture; 74 AVFrame picture;
76 uint8_t *bitstream_buffer; 75 uint8_t *bitstream_buffer;
77 unsigned int bitstream_buffer_size; 76 unsigned int bitstream_buffer_size;
78 DSPContext dsp; 77 DSPContext dsp;
79 }HYuvContext; 78 }HYuvContext;
318 } 317 }
319 } 318 }
320 #endif /* CONFIG_ENCODERS */ 319 #endif /* CONFIG_ENCODERS */
321 320
322 static void generate_joint_tables(HYuvContext *s){ 321 static void generate_joint_tables(HYuvContext *s){
323 // TODO modify init_vlc to allow sparse tables, and eliminate pix2_map
324 // TODO rgb 322 // TODO rgb
325 if(s->bitstream_bpp < 24){ 323 if(s->bitstream_bpp < 24){
324 uint16_t symbols[1<<VLC_BITS];
326 uint16_t bits[1<<VLC_BITS]; 325 uint16_t bits[1<<VLC_BITS];
327 uint8_t len[1<<VLC_BITS]; 326 uint8_t len[1<<VLC_BITS];
328 int p, i, y, u; 327 int p, i, y, u;
329 for(p=0; p<3; p++){ 328 for(p=0; p<3; p++){
330 for(i=y=0; y<256; y++){ 329 for(i=y=0; y<256; y++){
334 for(u=0; u<256; u++){ 333 for(u=0; u<256; u++){
335 int len1 = s->len[p][u]; 334 int len1 = s->len[p][u];
336 if(len1 <= limit){ 335 if(len1 <= limit){
337 len[i] = len0 + len1; 336 len[i] = len0 + len1;
338 bits[i] = (s->bits[0][y] << len1) + s->bits[p][u]; 337 bits[i] = (s->bits[0][y] << len1) + s->bits[p][u];
339 s->pix2_map[p][i] = (y<<8) + u; 338 symbols[i] = (y<<8) + u;
340 i++; 339 if(symbols[i] != 0xffff) // reserved to mean "invalid"
340 i++;
341 } 341 }
342 } 342 }
343 } 343 }
344 } 344 }
345 free_vlc(&s->vlc[3+p]); 345 free_vlc(&s->vlc[3+p]);
346 init_vlc(&s->vlc[3+p], VLC_BITS, i, len, 1, 1, bits, 2, 2, 0); 346 init_vlc_sparse(&s->vlc[3+p], VLC_BITS, i, len, 1, 1, bits, 2, 2, symbols, 2, 2, 0);
347 } 347 }
348 } 348 }
349 } 349 }
350 350
351 static int read_huffman_tables(HYuvContext *s, uint8_t *src, int length){ 351 static int read_huffman_tables(HYuvContext *s, uint8_t *src, int length){
688 #endif /* CONFIG_ENCODERS */ 688 #endif /* CONFIG_ENCODERS */
689 689
690 /* TODO instead of restarting the read when the code isn't in the first level 690 /* TODO instead of restarting the read when the code isn't in the first level
691 * of the joint table, jump into the 2nd level of the individual table. */ 691 * of the joint table, jump into the 2nd level of the individual table. */
692 #define READ_2PIX(dst0, dst1, plane1){\ 692 #define READ_2PIX(dst0, dst1, plane1){\
693 int code = get_vlc2(&s->gb, s->vlc[3+plane1].table, VLC_BITS, 1);\ 693 uint16_t code = get_vlc2(&s->gb, s->vlc[3+plane1].table, VLC_BITS, 1);\
694 if(code >= 0){\ 694 if(code != 0xffff){\
695 int x = s->pix2_map[plane1][code];\ 695 dst0 = code>>8;\
696 dst0 = x>>8;\ 696 dst1 = code;\
697 dst1 = x;\
698 }else{\ 697 }else{\
699 dst0 = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);\ 698 dst0 = get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);\
700 dst1 = get_vlc2(&s->gb, s->vlc[plane1].table, VLC_BITS, 3);\ 699 dst1 = get_vlc2(&s->gb, s->vlc[plane1].table, VLC_BITS, 3);\
701 }\ 700 }\
702 } 701 }