Mercurial > libavcodec.hg
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 } |