X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fituh263enc.c;h=79c8c9999eafe0deaed56c2897aa34e48ae71498;hb=2606c48391377681541111263de41c79adeffa49;hp=ee09f2974c207c09bda062c9d15f3c5fa2e4456b;hpb=06476249cd2332e30b66576633b2827adf3478dd;p=ffmpeg diff --git a/libavcodec/ituh263enc.c b/libavcodec/ituh263enc.c index ee09f2974c2..79c8c9999ea 100644 --- a/libavcodec/ituh263enc.c +++ b/libavcodec/ituh263enc.c @@ -30,6 +30,7 @@ #include #include "libavutil/attributes.h" +#include "libavutil/thread.h" #include "avcodec.h" #include "mpegvideo.h" #include "mpegvideodata.h" @@ -124,7 +125,7 @@ void ff_h263_encode_picture_header(MpegEncContext * s, int picture_number) coded_frame_rate= 1800000; coded_frame_rate_base= (1000+best_clock_code)*best_divisor; - avpriv_align_put_bits(&s->pb); + align_put_bits(&s->pb); /* Update the pointer to last GOB */ s->ptr_lastgob = put_bits_ptr(&s->pb); @@ -671,7 +672,7 @@ void ff_h263_encode_motion(PutBitContext *pb, int val, int f_code) } } -static av_cold void init_mv_penalty_and_fcode(MpegEncContext *s) +static av_cold void init_mv_penalty_and_fcode(void) { int f_code; int mv; @@ -713,8 +714,7 @@ static av_cold void init_mv_penalty_and_fcode(MpegEncContext *s) } } -static av_cold void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, - uint8_t *len_tab) +static av_cold void init_uni_h263_rl_tab(const RLTable *rl, uint8_t *len_tab) { int slevel, run, last; @@ -738,10 +738,9 @@ static av_cold void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, len= rl->table_vlc[code][1]; bits=bits*2+sign; len++; - if(code!=rl->n && len < len_tab[index]){ - if(bits_tab) bits_tab[index]= bits; + if (code != rl->n && len < len_tab[index]) len_tab [index]= len; - } + /* ESC */ bits= rl->table_vlc[rl->n][0]; len = rl->table_vlc[rl->n][1]; @@ -749,30 +748,30 @@ static av_cold void init_uni_h263_rl_tab(RLTable *rl, uint32_t *bits_tab, bits=bits*64+run; len+=6; bits=bits*256+(level&0xff); len+=8; - if(len < len_tab[index]){ - if(bits_tab) bits_tab[index]= bits; + if (len < len_tab[index]) len_tab [index]= len; - } } } } } -av_cold void ff_h263_encode_init(MpegEncContext *s) +static av_cold void h263_encode_init_static(void) { - static int done = 0; + static uint8_t rl_intra_table[2][2 * MAX_RUN + MAX_LEVEL + 3]; + + ff_rl_init(&ff_rl_intra_aic, rl_intra_table); + ff_h263_init_rl_inter(); - if (!done) { - done = 1; + init_uni_h263_rl_tab(&ff_rl_intra_aic, uni_h263_intra_aic_rl_len); + init_uni_h263_rl_tab(&ff_h263_rl_inter, uni_h263_inter_rl_len); - ff_rl_init(&ff_h263_rl_inter, ff_h263_static_rl_table_store[0]); - ff_rl_init(&ff_rl_intra_aic, ff_h263_static_rl_table_store[1]); + init_mv_penalty_and_fcode(); +} - init_uni_h263_rl_tab(&ff_rl_intra_aic, NULL, uni_h263_intra_aic_rl_len); - init_uni_h263_rl_tab(&ff_h263_rl_inter , NULL, uni_h263_inter_rl_len); +av_cold void ff_h263_encode_init(MpegEncContext *s) +{ + static AVOnce init_static_once = AV_ONCE_INIT; - init_mv_penalty_and_fcode(s); - } s->me.mv_penalty= mv_penalty; // FIXME exact table for MSMPEG4 & H.263+ s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len; @@ -820,6 +819,8 @@ av_cold void ff_h263_encode_init(MpegEncContext *s) s->y_dc_scale_table= s->c_dc_scale_table= ff_mpeg1_dc_scale_table; } + + ff_thread_once(&init_static_once, h263_encode_init_static); } void ff_h263_encode_mba(MpegEncContext *s)