summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-12-04 20:58:19 +0100
committerwm4 <wm4@nowhere>2013-12-04 23:12:51 +0100
commit47c4b5c0003fa50cfefc3f2e8a089a9b0feebe3f (patch)
tree64ec0d1eaf105aaf113fb7ac4d09cb67452154bd
parent0afd121ae67a60d033fc8f74ec28bbb8b84f031d (diff)
downloadmpv-47c4b5c0003fa50cfefc3f2e8a089a9b0feebe3f.tar.bz2
mpv-47c4b5c0003fa50cfefc3f2e8a089a9b0feebe3f.tar.xz
vd_lavc: factor out libavcodec thread setup
-rw-r--r--mpvcore/av_common.c19
-rw-r--r--mpvcore/av_common.h1
-rw-r--r--video/decode/vd_lavc.c16
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 <libavcodec/avcodec.h>
#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;