X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmsmpeg4.c;h=16b6f1895090893d7da447a8156c9324a1c6359c;hb=ef6a9e5e311f09fa8032974fa4d0c1e166a959bb;hp=920f50f32cdfb6a70db95846b017cd5144cbf6e1;hpb=0dda0f3bdb7e8a2d5bef7457375f72f38a100ccb;p=ffmpeg diff --git a/libavcodec/msmpeg4.c b/libavcodec/msmpeg4.c index 920f50f32cd..16b6f189509 100644 --- a/libavcodec/msmpeg4.c +++ b/libavcodec/msmpeg4.c @@ -27,6 +27,8 @@ * MSMPEG4 backend for encoder and decoder */ +#include "libavutil/thread.h" + #include "avcodec.h" #include "idctdsp.h" #include "mpegvideo.h" @@ -51,63 +53,70 @@ * except that it is inverted. */ static av_cold void init_h263_dc_for_msmpeg4(void) { - int level, uni_code, uni_len; - - if(ff_v2_dc_chroma_table[255 + 256][1]) - return; - - for(level=-256; level<256; level++){ - int size, v, l; - /* find number of bits */ - size = 0; - v = abs(level); - while (v) { - v >>= 1; - size++; - } + for (int level = -256; level < 256; level++) { + int uni_code, uni_len; + int size, v, l; + /* find number of bits */ + size = 0; + v = abs(level); + while (v) { + v >>= 1; + size++; + } - if (level < 0) - l= (-level) ^ ((1 << size) - 1); - else - l= level; - - /* luminance H.263 */ - uni_code= ff_mpeg4_DCtab_lum[size][0]; - uni_len = ff_mpeg4_DCtab_lum[size][1]; - uni_code ^= (1< 0) { - uni_code<<=size; uni_code|=l; - uni_len+=size; - if (size > 8){ - uni_code<<=1; uni_code|=1; - uni_len++; - } + if (level < 0) + l = (-level) ^ ((1 << size) - 1); + else + l = level; + + /* luminance H.263 */ + uni_code = ff_mpeg4_DCtab_lum[size][0]; + uni_len = ff_mpeg4_DCtab_lum[size][1]; + uni_code ^= (1 << uni_len) - 1; //M$ does not like compatibility + + if (size > 0) { + uni_code <<= size; uni_code |= l; + uni_len += size; + if (size > 8) { + uni_code <<= 1; uni_code |= 1; + uni_len++; } - ff_v2_dc_lum_table[level + 256][0] = uni_code; - ff_v2_dc_lum_table[level + 256][1] = uni_len; - - /* chrominance H.263 */ - uni_code= ff_mpeg4_DCtab_chrom[size][0]; - uni_len = ff_mpeg4_DCtab_chrom[size][1]; - uni_code ^= (1< 0) { - uni_code<<=size; uni_code|=l; - uni_len+=size; - if (size > 8){ - uni_code<<=1; uni_code|=1; - uni_len++; - } + } + ff_v2_dc_lum_table[level + 256][0] = uni_code; + ff_v2_dc_lum_table[level + 256][1] = uni_len; + + /* chrominance H.263 */ + uni_code = ff_mpeg4_DCtab_chrom[size][0]; + uni_len = ff_mpeg4_DCtab_chrom[size][1]; + uni_code ^= (1 << uni_len) - 1; //M$ does not like compatibility + + if (size > 0) { + uni_code <<= size; uni_code |= l; + uni_len +=size; + if (size > 8) { + uni_code <<= 1; uni_code |= 1; + uni_len++; } - ff_v2_dc_chroma_table[level + 256][0] = uni_code; - ff_v2_dc_chroma_table[level + 256][1] = uni_len; - } + ff_v2_dc_chroma_table[level + 256][0] = uni_code; + ff_v2_dc_chroma_table[level + 256][1] = uni_len; + } +} + +static av_cold void msmpeg4_common_init_static(void) +{ + static uint8_t rl_table_store[NB_RL_TABLES][2][2 * MAX_RUN + MAX_LEVEL + 3]; + + for (int i = 0; i < NB_RL_TABLES; i++) + ff_rl_init(&ff_rl_table[i], rl_table_store[i]); + + init_h263_dc_for_msmpeg4(); } av_cold void ff_msmpeg4_common_init(MpegEncContext *s) { + static AVOnce init_static_once = AV_ONCE_INIT; + switch(s->msmpeg4_version){ case 1: case 2: @@ -146,7 +155,7 @@ av_cold void ff_msmpeg4_common_init(MpegEncContext *s) } //Note the default tables are set in common_init in mpegvideo.c - init_h263_dc_for_msmpeg4(); + ff_thread_once(&init_static_once, msmpeg4_common_init_static); } /* predict coded block */