[FFmpeg-devel] [PATCH 1/6] audio frame multi-threaded decoding

Michael Niedermayer michaelni at gmx.at
Tue Jun 4 11:20:29 CEST 2013


On Mon, Jun 03, 2013 at 04:47:52PM +0000, Paul B Mahol wrote:
> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> ---
>  libavcodec/options_table.h |  6 +++---
>  libavcodec/pthread.c       |  8 +++++++-
>  libavcodec/utils.c         | 10 +++++++---
>  3 files changed, 17 insertions(+), 7 deletions(-)
> 
> diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
> index 4fd6cff..65d4ab4 100644
> --- a/libavcodec/options_table.h
> +++ b/libavcodec/options_table.h
> @@ -227,7 +227,7 @@ static const AVOption options[]={
>  {"vis_qp", "visualize quantization parameter (QP), lower QP are tinted greener", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_QP }, INT_MIN, INT_MAX, V|D, "debug"},
>  {"vis_mb_type", "visualize block types", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_MB_TYPE }, INT_MIN, INT_MAX, V|D, "debug"},
>  {"buffers", "picture buffer allocations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_BUFFERS }, INT_MIN, INT_MAX, V|D, "debug"},
> -{"thread_ops", "threading operations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_THREADS }, INT_MIN, INT_MAX, V|D, "debug"},
> +{"thread_ops", "threading operations", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_THREADS }, INT_MIN, INT_MAX, V|A|D, "debug"},
>  {"vismv", "visualize motion vectors (MVs)", OFFSET(debug_mv), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, 0, INT_MAX, V|D, "debug_mv"},
>  {"pf", "forward predicted MVs of P-frames", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_MV_P_FOR }, INT_MIN, INT_MAX, V|D, "debug_mv"},
>  {"bf", "forward predicted MVs of B-frames", 0, AV_OPT_TYPE_CONST, {.i64 = FF_DEBUG_VIS_MV_B_FOR }, INT_MIN, INT_MAX, V|D, "debug_mv"},
> @@ -285,7 +285,7 @@ static const AVOption options[]={
>  {"rc_init_occupancy", "number of bits which should be loaded into the rc buffer before decoding starts", OFFSET(rc_initial_buffer_occupancy), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
>  {"flags2", NULL, OFFSET(flags2), AV_OPT_TYPE_FLAGS, {.i64 = DEFAULT}, 0, UINT_MAX, V|A|E|D, "flags2"},
>  {"error", NULL, OFFSET(error_rate), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
> -{"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.i64 = 1 }, 0, INT_MAX, V|E|D, "threads"},
> +{"threads", NULL, OFFSET(thread_count), AV_OPT_TYPE_INT, {.i64 = 1 }, 0, INT_MAX, V|A|E|D, "threads"},
>  {"auto", "autodetect a suitable number of threads to use", 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, INT_MIN, INT_MAX, V|E|D, "threads"},
>  {"me_threshold", "motion estimation threshold", OFFSET(me_threshold), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
>  {"mb_threshold", "macroblock threshold", OFFSET(mb_threshold), AV_OPT_TYPE_INT, {.i64 = DEFAULT }, INT_MIN, INT_MAX, V|E},
> @@ -357,7 +357,7 @@ static const AVOption options[]={
>  {"chroma_sample_location", NULL, OFFSET(chroma_sample_location), AV_OPT_TYPE_INT, {.i64 = AVCHROMA_LOC_UNSPECIFIED }, 0, AVCHROMA_LOC_NB-1, V|E|D},
>  {"log_level_offset", "set the log level offset", OFFSET(log_level_offset), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX },
>  {"slices", "number of slices, used in parallelized encoding", OFFSET(slices), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, V|E},
> -{"thread_type", "select multithreading type", OFFSET(thread_type), AV_OPT_TYPE_FLAGS, {.i64 = FF_THREAD_SLICE|FF_THREAD_FRAME }, 0, INT_MAX, V|E|D, "thread_type"},
> +{"thread_type", "select multithreading type", OFFSET(thread_type), AV_OPT_TYPE_FLAGS, {.i64 = FF_THREAD_SLICE|FF_THREAD_FRAME }, 0, INT_MAX, V|A|E|D, "thread_type"},
>  {"slice", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_THREAD_SLICE }, INT_MIN, INT_MAX, V|E|D, "thread_type"},
>  {"frame", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_THREAD_FRAME }, INT_MIN, INT_MAX, V|E|D, "thread_type"},
>  {"audio_service_type", "audio service type", OFFSET(audio_service_type), AV_OPT_TYPE_INT, {.i64 = AV_AUDIO_SERVICE_TYPE_MAIN }, 0, AV_AUDIO_SERVICE_TYPE_NB-1, A|E, "audio_service_type"},
> diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
> index 7968a61..7404f87 100644
> --- a/libavcodec/pthread.c
> +++ b/libavcodec/pthread.c
> @@ -403,6 +403,11 @@ static int update_context_from_thread(AVCodecContext *dst, AVCodecContext *src,
>  
>          dst->hwaccel = src->hwaccel;
>          dst->hwaccel_context = src->hwaccel_context;
> +
> +        dst->channels       = src->channels;
> +        dst->sample_rate    = src->sample_rate;
> +        dst->sample_fmt     = src->sample_fmt;
> +        dst->channel_layout = src->channel_layout;
>      }
>  
>      if (for_user) {
> @@ -477,7 +482,8 @@ static void release_delayed_buffers(PerThreadContext *p)
>          pthread_mutex_lock(&fctx->buffer_mutex);
>  
>          // fix extended data in case the caller screwed it up
> -        av_assert0(p->avctx->codec_type == AVMEDIA_TYPE_VIDEO);
> +        av_assert0(p->avctx->codec_type == AVMEDIA_TYPE_VIDEO ||
> +                   p->avctx->codec_type == AVMEDIA_TYPE_AUDIO);
>          f = &p->released_buffers[--p->num_released_buffers];
>          f->extended_data = f->data;
>          av_frame_unref(f);
> diff --git a/libavcodec/utils.c b/libavcodec/utils.c
> index e0aea28..f35b0e2 100644
> --- a/libavcodec/utils.c
> +++ b/libavcodec/utils.c
> @@ -2075,7 +2075,7 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
>      if (!avctx->refcounted_frames)
>          av_frame_unref(&avci->to_free);
>  
> -    if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size) {
> +    if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type && FF_THREAD_FRAME)) {
>          uint8_t *side;
>          int side_size;
>          // copy to ensure we do not change avpkt
> @@ -2084,11 +2084,15 @@ int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
>          apply_param_change(avctx, &tmp);
>  
>          avctx->pkt = &tmp;
> -        ret = avctx->codec->decode(avctx, frame, got_frame_ptr, &tmp);

> +        if (HAVE_THREADS && avctx->active_thread_type && FF_THREAD_FRAME)

the && looks wrong

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

What does censorship reveal? It reveals fear. -- Julian Assange
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130604/a78ccd45/attachment.asc>


More information about the ffmpeg-devel mailing list