From 47c4b5c0003fa50cfefc3f2e8a089a9b0feebe3f Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 4 Dec 2013 20:58:19 +0100 Subject: [PATCH] vd_lavc: factor out libavcodec thread setup --- mpvcore/av_common.c | 19 +++++++++++++++++++ mpvcore/av_common.h | 1 + video/decode/vd_lavc.c | 16 +--------------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/mpvcore/av_common.c b/mpvcore/av_common.c index 59f6d636c7..823c825517 100644 --- a/mpvcore/av_common.c +++ b/mpvcore/av_common.c @@ -21,10 +21,13 @@ #include #include "mpvcore/mp_common.h" +#include "mpvcore/mp_msg.h" #include "demux/packet.h" #include "av_common.h" #include "codecs.h" +#include "osdep/numcores.h" + // Copy the codec-related fields from st into avctx. This does not set the // codec itself, only codec related header data provided by libavformat. @@ -114,6 +117,22 @@ void mp_set_av_packet(AVPacket *dst, struct demux_packet *mpkt, AVRational *tb) dst->dts = mp_pts_to_av(mpkt ? mpkt->dts : MP_NOPTS_VALUE, tb); } +void mp_set_avcodec_threads(AVCodecContext *avctx, int threads) +{ + if (threads == 0) { + threads = default_thread_count(); + if (threads < 1) { + mp_msg(MSGT_GLOBAL, MSGL_WARN, "Could not determine " + "thread count to use, defaulting to 1.\n"); + threads = 1; + } + // Apparently some libavcodec versions have or had trouble with more + // than 16 threads, and/or print a warning when using > 16. + threads = MPMIN(threads, 16); + } + avctx->thread_count = threads; +} + void mp_add_lavc_decoders(struct mp_decoder_list *list, enum AVMediaType type) { AVCodec *cur = NULL; diff --git a/mpvcore/av_common.h b/mpvcore/av_common.h index e457628979..7bf2d64d9e 100644 --- a/mpvcore/av_common.h +++ b/mpvcore/av_common.h @@ -31,6 +31,7 @@ void mp_copy_lav_codec_headers(AVCodecContext *avctx, AVCodecContext *st); void mp_set_av_packet(AVPacket *dst, struct demux_packet *mpkt, AVRational *tb); int64_t mp_pts_to_av(double mp_pts, AVRational *tb); double mp_pts_from_av(int64_t av_pts, AVRational *tb); +void mp_set_avcodec_threads(AVCodecContext *avctx, int threads); void mp_add_lavc_decoders(struct mp_decoder_list *list, enum AVMediaType type); int mp_codec_to_av_codec_id(const char *codec); const char *mp_codec_from_av_codec_id(int codec_id); diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index b48dc7fce7..10e46b78b1 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -49,7 +49,6 @@ #include "video/decode/dec_video.h" #include "demux/stheader.h" #include "demux/packet.h" -#include "osdep/numcores.h" #include "video/csputils.h" #include "lavc.h" @@ -393,9 +392,6 @@ static void init_avctx(struct dec_video *vd, const char *decoder, avctx->codec_type = AVMEDIA_TYPE_VIDEO; avctx->codec_id = lavc_codec->id; - avctx->thread_count = lavc_param->threads; - - #if HAVE_AVUTIL_REFCOUNTING avctx->refcounted_frames = 1; ctx->pic = av_frame_alloc(); @@ -420,17 +416,7 @@ static void init_avctx(struct dec_video *vd, const char *decoder, avctx->release_buffer = mp_codec_release_buffer; } #endif - } - - if (avctx->thread_count == 0) { - int threads = default_thread_count(); - if (threads < 1) { - mp_msg(MSGT_DECVIDEO, MSGL_WARN, "[VD_FFMPEG] Could not determine " - "thread count to use, defaulting to 1.\n"); - threads = 1; - } - threads = FFMIN(threads, 16); - avctx->thread_count = threads; + mp_set_avcodec_threads(avctx, lavc_param->threads); } avctx->flags |= lavc_param->bitexact;