From f004ca1c1b5d272d8344ef12ab006cfe52cbf023 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 13 Feb 2002 15:26:28 +0000 Subject: [PATCH] optimized encode_dc() (+2% speed on P3 for mpeg1 intra only encodings) Originally committed as revision 298 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/mpeg12.c | 41 ++++++++++++++++++++++++++++++----------- libavcodec/mpeg12data.h | 4 ++++ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c index 76c1b61343..906643de16 100644 --- a/libavcodec/mpeg12.c +++ b/libavcodec/mpeg12.c @@ -33,6 +33,8 @@ #define EXT_START_CODE 0x000001b5 #define USER_START_CODE 0x000001b2 +#define ABS(a) ((a)<0 ? -(a) : (a)) + static void mpeg1_encode_block(MpegEncContext *s, DCTELEM *block, int component); @@ -196,6 +198,26 @@ void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) mpeg1_max_level[0][i]= rl_mpeg1.max_level[0][i]; mpeg1_index_run[0][i]= rl_mpeg1.index_run[0][i]; } + + /* build unified dc encoding tables */ + for(i=-255; i<256; i++) + { + int adiff, index; + int bits, code; + int diff=i; + + adiff = ABS(diff); + if(diff<0) diff--; + index = vlc_dc_table[adiff]; + + bits= vlc_dc_lum_bits[index] + index; + code= (vlc_dc_lum_code[index]<pb, vlc_dc_lum_bits[index], vlc_dc_lum_code[index]); + put_bits( + &s->pb, + mpeg1_lum_dc_uni[diff+255]&0xFF, + mpeg1_lum_dc_uni[diff+255]>>8); } else { - put_bits(&s->pb, vlc_dc_chroma_bits[index], vlc_dc_chroma_code[index]); - } - if (diff > 0) { - put_bits(&s->pb, index, (diff & ((1 << index) - 1))); - } else if (diff < 0) { - put_bits(&s->pb, index, ((diff - 1) & ((1 << index) - 1))); + put_bits( + &s->pb, + mpeg1_chr_dc_uni[diff+255]&0xFF, + mpeg1_chr_dc_uni[diff+255]>>8); } } diff --git a/libavcodec/mpeg12data.h b/libavcodec/mpeg12data.h index 4261986d24..65a8a2b9ae 100644 --- a/libavcodec/mpeg12data.h +++ b/libavcodec/mpeg12data.h @@ -61,6 +61,10 @@ const unsigned char vlc_dc_chroma_bits[12] = { 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, }; +/* simple include everything table for dc, first byte is bits number next 3 are code*/ +static UINT32 mpeg1_lum_dc_uni[512]; +static UINT32 mpeg1_chr_dc_uni[512]; + static const UINT16 mpeg1_vlc[113][2] = { { 0x3, 2 }, { 0x4, 4 }, { 0x5, 5 }, { 0x6, 7 }, { 0x26, 8 }, { 0x21, 8 }, { 0xa, 10 }, { 0x1d, 12 }, -- GitLab