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