As a side effect of the last commit, avcodec_open() now calls it automatically, so there is no longer any need for clients to call it. Instead they should set AVCodecContext.thread_count. avcodec_thread_free() is deprecated, and will be removed from avcodec.h at the next MAJOR libavcodec bump. Rename the functions to ff_thread_init/free, since they are now internal. Wrappers are provided to maintain API compatibility. Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>tags/n0.8
@@ -13,6 +13,10 @@ libavutil: 2009-03-08 | |||||
API changes, most recent first: | API changes, most recent first: | ||||
2011-02-09 - XXXXXXX - lavc 52.112.0 - avcodec_thread_init() | |||||
Deprecate avcodec_thread_init()/avcodec_thread_free() use; instead | |||||
set thread_count before calling avcodec_open. | |||||
2011-02-09 - 778b08a - lavc 52.111.0 - threading API | 2011-02-09 - 778b08a - lavc 52.111.0 - threading API | ||||
Add CODEC_CAP_FRAME_THREADS with new restrictions on get_buffer()/ | Add CODEC_CAP_FRAME_THREADS with new restrictions on get_buffer()/ | ||||
release_buffer()/draw_horiz_band() callbacks for appropriate codecs. | release_buffer()/draw_horiz_band() callbacks for appropriate codecs. | ||||
@@ -698,11 +698,6 @@ static int read_ffserver_streams(AVFormatContext *s, const char *filename) | |||||
choose_pixel_fmt(st, codec); | choose_pixel_fmt(st, codec); | ||||
} | } | ||||
if(!st->codec->thread_count) | |||||
st->codec->thread_count = 1; | |||||
if(st->codec->thread_count>1) | |||||
avcodec_thread_init(st->codec, st->codec->thread_count); | |||||
if(st->codec->flags & CODEC_FLAG_BITEXACT) | if(st->codec->flags & CODEC_FLAG_BITEXACT) | ||||
nopts = 1; | nopts = 1; | ||||
@@ -3236,7 +3231,7 @@ static void opt_input_file(const char *filename) | |||||
for(i=0;i<ic->nb_streams;i++) { | for(i=0;i<ic->nb_streams;i++) { | ||||
AVStream *st = ic->streams[i]; | AVStream *st = ic->streams[i]; | ||||
AVCodecContext *dec = st->codec; | AVCodecContext *dec = st->codec; | ||||
avcodec_thread_init(dec, thread_count); | |||||
dec->thread_count = thread_count; | |||||
input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1); | input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1); | ||||
switch (dec->codec_type) { | switch (dec->codec_type) { | ||||
case AVMEDIA_TYPE_AUDIO: | case AVMEDIA_TYPE_AUDIO: | ||||
@@ -3394,7 +3389,7 @@ static void new_video_stream(AVFormatContext *oc, int file_idx) | |||||
ost->bitstream_filters = video_bitstream_filters; | ost->bitstream_filters = video_bitstream_filters; | ||||
video_bitstream_filters= NULL; | video_bitstream_filters= NULL; | ||||
avcodec_thread_init(st->codec, thread_count); | |||||
st->codec->thread_count= thread_count; | |||||
video_enc = st->codec; | video_enc = st->codec; | ||||
@@ -3541,7 +3536,7 @@ static void new_audio_stream(AVFormatContext *oc, int file_idx) | |||||
ost->bitstream_filters = audio_bitstream_filters; | ost->bitstream_filters = audio_bitstream_filters; | ||||
audio_bitstream_filters= NULL; | audio_bitstream_filters= NULL; | ||||
avcodec_thread_init(st->codec, thread_count); | |||||
st->codec->thread_count= thread_count; | |||||
audio_enc = st->codec; | audio_enc = st->codec; | ||||
audio_enc->codec_type = AVMEDIA_TYPE_AUDIO; | audio_enc->codec_type = AVMEDIA_TYPE_AUDIO; | ||||
@@ -2260,7 +2260,7 @@ static int stream_component_open(VideoState *is, int stream_index) | |||||
avctx->skip_loop_filter= skip_loop_filter; | avctx->skip_loop_filter= skip_loop_filter; | ||||
avctx->error_recognition= error_recognition; | avctx->error_recognition= error_recognition; | ||||
avctx->error_concealment= error_concealment; | avctx->error_concealment= error_concealment; | ||||
avcodec_thread_init(avctx, thread_count); | |||||
avctx->thread_count= thread_count; | |||||
set_context_opts(avctx, avcodec_opts[avctx->codec_type], 0, codec); | set_context_opts(avctx, avcodec_opts[avctx->codec_type], 0, codec); | ||||
@@ -32,7 +32,7 @@ | |||||
#include "libavutil/cpu.h" | #include "libavutil/cpu.h" | ||||
#define LIBAVCODEC_VERSION_MAJOR 52 | #define LIBAVCODEC_VERSION_MAJOR 52 | ||||
#define LIBAVCODEC_VERSION_MINOR 111 | |||||
#define LIBAVCODEC_VERSION_MINOR 112 | |||||
#define LIBAVCODEC_VERSION_MICRO 0 | #define LIBAVCODEC_VERSION_MICRO 0 | ||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | ||||
@@ -3637,8 +3637,14 @@ int avcodec_check_dimensions(void *av_log_ctx, unsigned int w, unsigned int h); | |||||
enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt); | enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt); | ||||
#if LIBAVCODEC_VERSION_MAJOR < 53 | |||||
/** | |||||
* @deprecated Set s->thread_count before calling avcodec_open() instead of calling this. | |||||
*/ | |||||
attribute_deprecated | |||||
int avcodec_thread_init(AVCodecContext *s, int thread_count); | int avcodec_thread_init(AVCodecContext *s, int thread_count); | ||||
void avcodec_thread_free(AVCodecContext *s); | void avcodec_thread_free(AVCodecContext *s); | ||||
#endif | |||||
int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); | int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size); | ||||
int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); | int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count); | ||||
//FIXME func typedef | //FIXME func typedef | ||||
@@ -256,7 +256,7 @@ static int thread_init(AVCodecContext *avctx) | |||||
if(pthread_create(&c->workers[i], NULL, worker, avctx)) { | if(pthread_create(&c->workers[i], NULL, worker, avctx)) { | ||||
avctx->thread_count = i; | avctx->thread_count = i; | ||||
pthread_mutex_unlock(&c->current_job_lock); | pthread_mutex_unlock(&c->current_job_lock); | ||||
avcodec_thread_free(avctx); | |||||
ff_thread_free(avctx); | |||||
return -1; | return -1; | ||||
} | } | ||||
} | } | ||||
@@ -870,7 +870,7 @@ static void validate_thread_parameters(AVCodecContext *avctx) | |||||
} | } | ||||
} | } | ||||
int avcodec_thread_init(AVCodecContext *avctx, int thread_count) | |||||
int ff_thread_init(AVCodecContext *avctx, int thread_count) | |||||
{ | { | ||||
if (avctx->thread_opaque) { | if (avctx->thread_opaque) { | ||||
av_log(avctx, AV_LOG_ERROR, "avcodec_thread_init is ignored after avcodec_open\n"); | av_log(avctx, AV_LOG_ERROR, "avcodec_thread_init is ignored after avcodec_open\n"); | ||||
@@ -891,7 +891,7 @@ int avcodec_thread_init(AVCodecContext *avctx, int thread_count) | |||||
return 0; | return 0; | ||||
} | } | ||||
void avcodec_thread_free(AVCodecContext *avctx) | |||||
void ff_thread_free(AVCodecContext *avctx) | |||||
{ | { | ||||
if (avctx->active_thread_type&FF_THREAD_FRAME) | if (avctx->active_thread_type&FF_THREAD_FRAME) | ||||
frame_thread_free(avctx, avctx->thread_count); | frame_thread_free(avctx, avctx->thread_count); | ||||
@@ -108,4 +108,7 @@ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f); | |||||
*/ | */ | ||||
void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f); | void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f); | ||||
int ff_thread_init(AVCodecContext *s, int thread_count); | |||||
void ff_thread_free(AVCodecContext *s); | |||||
#endif /* AVCODEC_THREAD_H */ | #endif /* AVCODEC_THREAD_H */ |
@@ -540,7 +540,7 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) | |||||
avctx->frame_number = 0; | avctx->frame_number = 0; | ||||
if (HAVE_THREADS && !avctx->thread_opaque) { | if (HAVE_THREADS && !avctx->thread_opaque) { | ||||
ret = avcodec_thread_init(avctx, avctx->thread_count); | |||||
ret = ff_thread_init(avctx, avctx->thread_count); | |||||
if (ret < 0) { | if (ret < 0) { | ||||
goto free_and_end; | goto free_and_end; | ||||
} | } | ||||
@@ -777,7 +777,7 @@ av_cold int avcodec_close(AVCodecContext *avctx) | |||||
} | } | ||||
if (HAVE_THREADS && avctx->thread_opaque) | if (HAVE_THREADS && avctx->thread_opaque) | ||||
avcodec_thread_free(avctx); | |||||
ff_thread_free(avctx); | |||||
if (avctx->codec && avctx->codec->close) | if (avctx->codec && avctx->codec->close) | ||||
avctx->codec->close(avctx); | avctx->codec->close(avctx); | ||||
avcodec_default_free_buffers(avctx); | avcodec_default_free_buffers(avctx); | ||||
@@ -1138,7 +1138,7 @@ int av_get_bits_per_sample_format(enum AVSampleFormat sample_fmt) { | |||||
#endif | #endif | ||||
#if !HAVE_THREADS | #if !HAVE_THREADS | ||||
int avcodec_thread_init(AVCodecContext *s, int thread_count){ | |||||
int ff_thread_init(AVCodecContext *s, int thread_count){ | |||||
s->thread_count = thread_count; | s->thread_count = thread_count; | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -1277,3 +1277,17 @@ void ff_thread_await_progress(AVFrame *f, int progress, int field) | |||||
} | } | ||||
#endif | #endif | ||||
#if LIBAVCODEC_VERSION_MAJOR < 53 | |||||
int avcodec_thread_init(AVCodecContext *s, int thread_count) | |||||
{ | |||||
return ff_thread_init(s, thread_count); | |||||
} | |||||
void avcodec_thread_free(AVCodecContext *s) | |||||
{ | |||||
return ff_thread_free(s); | |||||
} | |||||
#endif |
@@ -69,10 +69,10 @@ static unsigned WINAPI attribute_align_arg thread_func(void *v){ | |||||
} | } | ||||
/** | /** | ||||
* Free what has been allocated by avcodec_thread_init(). | |||||
* Free what has been allocated by ff_thread_init(). | |||||
* Must be called after decoding has finished, especially do not call while avcodec_thread_execute() is running. | * Must be called after decoding has finished, especially do not call while avcodec_thread_execute() is running. | ||||
*/ | */ | ||||
void avcodec_thread_free(AVCodecContext *s){ | |||||
void ff_thread_free(AVCodecContext *s){ | |||||
ThreadContext *c= s->thread_opaque; | ThreadContext *c= s->thread_opaque; | ||||
int i; | int i; | ||||
@@ -124,7 +124,7 @@ static int avcodec_thread_execute2(AVCodecContext *s, int (*func)(AVCodecContext | |||||
avcodec_thread_execute(s, NULL, arg, ret, count, 0); | avcodec_thread_execute(s, NULL, arg, ret, count, 0); | ||||
} | } | ||||
int avcodec_thread_init(AVCodecContext *s, int thread_count){ | |||||
int ff_thread_init(AVCodecContext *s, int thread_count){ | |||||
int i; | int i; | ||||
ThreadContext *c; | ThreadContext *c; | ||||
uint32_t threadid; | uint32_t threadid; | ||||
@@ -169,6 +169,6 @@ int avcodec_thread_init(AVCodecContext *s, int thread_count){ | |||||
return 0; | return 0; | ||||
fail: | fail: | ||||
avcodec_thread_free(s); | |||||
ff_thread_free(s); | |||||
return -1; | return -1; | ||||
} | } |