comparison huffyuv.c @ 5063:d5640ea6d4a6 libavcodec

merge huffman tables so that we read 2 symbols at a time. 30% faster huffyuv decoding.
author lorenm
date Wed, 23 May 2007 09:02:07 +0000
parents 5c6cd6601371
children 1aec7fab94c4
comparison
equal deleted inserted replaced
5062:2dd00b1cc94b 5063:d5640ea6d4a6
68 int last_slice_end; 68 int last_slice_end;
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[3]; 73 VLC vlc[6]; //Y,U,V,YY,YU,YV
74 uint16_t pix2_map[3][1<<VLC_BITS];
74 AVFrame picture; 75 AVFrame picture;
75 uint8_t *bitstream_buffer; 76 uint8_t *bitstream_buffer;
76 unsigned int bitstream_buffer_size; 77 unsigned int bitstream_buffer_size;
77 DSPContext dsp; 78 DSPContext dsp;
78 }HYuvContext; 79 }HYuvContext;
316 if(i==size) break; 317 if(i==size) break;
317 } 318 }
318 } 319 }
319 #endif /* CONFIG_ENCODERS */ 320 #endif /* CONFIG_ENCODERS */
320 321
322 static void generate_joint_tables(HYuvContext *s){
323 // TODO modify init_vlc to allow sparse tables, and eliminate pix2_map
324 // TODO rgb
325 if(s->bitstream_bpp < 24){
326 uint16_t bits[1<<VLC_BITS];
327 uint8_t len[1<<VLC_BITS];
328 int p, i, y, u;
329 for(p=0; p<3; p++){
330 for(i=y=0; y<256; y++){
331 int len0 = s->len[0][y];
332 int limit = VLC_BITS - len0;
333 if(limit > 0){
334 for(u=0; u<256; u++){
335 int len1 = s->len[p][u];
336 if(len1 <= limit){
337 len[i] = len0 + len1;
338 bits[i] = (s->bits[0][y] << len1) + s->bits[p][u];
339 s->pix2_map[p][i] = (y<<8) + u;
340 i++;
341 }
342 }
343 }
344 }
345 free_vlc(&s->vlc[3+p]);
346 init_vlc(&s->vlc[3+p], VLC_BITS, i, len, 1, 1, bits, 2, 2, 0);
347 }
348 }
349 }
350
321 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){
322 GetBitContext gb; 352 GetBitContext gb;
323 int i; 353 int i;
324 354
325 init_get_bits(&gb, src, length*8); 355 init_get_bits(&gb, src, length*8);
336 } 366 }
337 #endif 367 #endif
338 free_vlc(&s->vlc[i]); 368 free_vlc(&s->vlc[i]);
339 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0); 369 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0);
340 } 370 }
371
372 generate_joint_tables(s);
341 373
342 return (get_bits_count(&gb)+7)/8; 374 return (get_bits_count(&gb)+7)/8;
343 } 375 }
344 376
345 static int read_old_huffman_tables(HYuvContext *s){ 377 static int read_old_huffman_tables(HYuvContext *s){
364 396
365 for(i=0; i<3; i++){ 397 for(i=0; i<3; i++){
366 free_vlc(&s->vlc[i]); 398 free_vlc(&s->vlc[i]);
367 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0); 399 init_vlc(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, s->bits[i], 4, 4, 0);
368 } 400 }
401
402 generate_joint_tables(s);
369 403
370 return 0; 404 return 0;
371 #else 405 #else
372 av_log(s->avctx, AV_LOG_DEBUG, "v1 huffyuv is not supported \n"); 406 av_log(s->avctx, AV_LOG_DEBUG, "v1 huffyuv is not supported \n");
373 return -1; 407 return -1;
651 685
652 return 0; 686 return 0;
653 } 687 }
654 #endif /* CONFIG_ENCODERS */ 688 #endif /* CONFIG_ENCODERS */
655 689
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. */
692 #define READ_2PIX(dst0, dst1, plane1){\
693 int code = get_vlc2(&s->gb, s->vlc[3+plane1].table, VLC_BITS, 1);\
694 if(code >= 0){\
695 int x = s->pix2_map[plane1][code];\
696 dst0 = x>>8;\
697 dst1 = x;\
698 }else{\
699 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);\
701 }\
702 }
703
656 static void decode_422_bitstream(HYuvContext *s, int count){ 704 static void decode_422_bitstream(HYuvContext *s, int count){
657 int i; 705 int i;
658 706
659 count/=2; 707 count/=2;
660 708
661 for(i=0; i<count; i++){ 709 for(i=0; i<count; i++){
662 s->temp[0][2*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3); 710 READ_2PIX(s->temp[0][2*i ], s->temp[1][i], 1);
663 s->temp[1][ i ]= get_vlc2(&s->gb, s->vlc[1].table, VLC_BITS, 3); 711 READ_2PIX(s->temp[0][2*i+1], s->temp[2][i], 2);
664 s->temp[0][2*i+1]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
665 s->temp[2][ i ]= get_vlc2(&s->gb, s->vlc[2].table, VLC_BITS, 3);
666 } 712 }
667 } 713 }
668 714
669 static void decode_gray_bitstream(HYuvContext *s, int count){ 715 static void decode_gray_bitstream(HYuvContext *s, int count){
670 int i; 716 int i;
671 717
672 count/=2; 718 count/=2;
673 719
674 for(i=0; i<count; i++){ 720 for(i=0; i<count; i++){
675 s->temp[0][2*i ]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3); 721 READ_2PIX(s->temp[0][2*i ], s->temp[0][2*i+1], 0);
676 s->temp[0][2*i+1]= get_vlc2(&s->gb, s->vlc[0].table, VLC_BITS, 3);
677 } 722 }
678 } 723 }
679 724
680 #ifdef CONFIG_ENCODERS 725 #ifdef CONFIG_ENCODERS
681 static int encode_422_bitstream(HYuvContext *s, int count){ 726 static int encode_422_bitstream(HYuvContext *s, int count){