mirror of https://git.ffmpeg.org/ffmpeg.git
avcodec/h261enc: Make encoder init-threadsafe
This is easy now that the H.261 encoder is the only user that initializes the non-VLC parts of ff_h261_rl_tcoeff. Reviewed-by: Anton Khirnov <anton@khirnov.net> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
parent
41826f84bb
commit
18e89b964c
|
@ -30,8 +30,6 @@
|
|||
|
||||
#define IS_FIL(a) ((a) & MB_TYPE_H261_FIL)
|
||||
|
||||
uint8_t ff_h261_rl_table_store[2][2 * MAX_RUN + MAX_LEVEL + 3];
|
||||
|
||||
static void h261_loop_filter(uint8_t *src, int stride)
|
||||
{
|
||||
int x, y, xy, yz;
|
||||
|
@ -79,14 +77,3 @@ void ff_h261_loop_filter(MpegEncContext *s)
|
|||
h261_loop_filter(dest_cb, uvlinesize);
|
||||
h261_loop_filter(dest_cr, uvlinesize);
|
||||
}
|
||||
|
||||
av_cold void ff_h261_common_init(void)
|
||||
{
|
||||
static int done = 0;
|
||||
|
||||
if (done)
|
||||
return;
|
||||
|
||||
ff_rl_init(&ff_h261_rl_tcoeff, ff_h261_rl_table_store);
|
||||
done = 1;
|
||||
}
|
||||
|
|
|
@ -48,8 +48,6 @@ typedef struct H261Context {
|
|||
|
||||
#define MB_TYPE_H261_FIL 0x800000
|
||||
|
||||
extern uint8_t ff_h261_rl_table_store[2][2 * MAX_RUN + MAX_LEVEL + 3];
|
||||
|
||||
extern const uint8_t ff_h261_mba_code[35];
|
||||
extern const uint8_t ff_h261_mba_bits[35];
|
||||
extern const uint8_t ff_h261_mtype_code[10];
|
||||
|
@ -60,7 +58,6 @@ extern const uint8_t ff_h261_cbp_tab[63][2];
|
|||
extern RLTable ff_h261_rl_tcoeff;
|
||||
|
||||
void ff_h261_loop_filter(MpegEncContext *s);
|
||||
void ff_h261_common_init(void);
|
||||
|
||||
int ff_h261_get_picture_format(int width, int height);
|
||||
void ff_h261_reorder_mb_index(MpegEncContext *s);
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
|
||||
#include "libavutil/attributes.h"
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/thread.h"
|
||||
#include "avcodec.h"
|
||||
#include "mpegutils.h"
|
||||
#include "mpegvideo.h"
|
||||
|
@ -361,9 +362,17 @@ static av_cold void init_uni_h261_rl_tab(const RLTable *rl, uint8_t *len_tab)
|
|||
}
|
||||
}
|
||||
|
||||
static av_cold void h261_encode_init_static(void)
|
||||
{
|
||||
static uint8_t h261_rl_table_store[2][2 * MAX_RUN + MAX_LEVEL + 3];
|
||||
|
||||
ff_rl_init(&ff_h261_rl_tcoeff, h261_rl_table_store);
|
||||
init_uni_h261_rl_tab(&ff_h261_rl_tcoeff, uni_h261_rl_len);
|
||||
}
|
||||
|
||||
av_cold void ff_h261_encode_init(MpegEncContext *s)
|
||||
{
|
||||
ff_h261_common_init();
|
||||
static AVOnce init_static_once = AV_ONCE_INIT;
|
||||
|
||||
s->min_qcoeff = -127;
|
||||
s->max_qcoeff = 127;
|
||||
|
@ -371,10 +380,9 @@ av_cold void ff_h261_encode_init(MpegEncContext *s)
|
|||
s->c_dc_scale_table = ff_mpeg1_dc_scale_table;
|
||||
s->ac_esc_length = 6+6+8;
|
||||
|
||||
init_uni_h261_rl_tab(&ff_h261_rl_tcoeff, uni_h261_rl_len);
|
||||
|
||||
s->intra_ac_vlc_length = s->inter_ac_vlc_length = uni_h261_rl_len;
|
||||
s->intra_ac_vlc_last_length = s->inter_ac_vlc_last_length = uni_h261_rl_len + 128*64;
|
||||
ff_thread_once(&init_static_once, h261_encode_init_static);
|
||||
}
|
||||
|
||||
static const AVClass h261_class = {
|
||||
|
@ -393,7 +401,7 @@ AVCodec ff_h261_encoder = {
|
|||
.init = ff_mpv_encode_init,
|
||||
.encode2 = ff_mpv_encode_picture,
|
||||
.close = ff_mpv_encode_end,
|
||||
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
|
||||
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
|
||||
.pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_YUV420P,
|
||||
AV_PIX_FMT_NONE },
|
||||
.priv_class = &h261_class,
|
||||
|
|
Loading…
Reference in New Issue