summaryrefslogtreecommitdiffstats
path: root/mpvcore
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 /mpvcore
parent0afd121ae67a60d033fc8f74ec28bbb8b84f031d (diff)
downloadmpv-47c4b5c0003fa50cfefc3f2e8a089a9b0feebe3f.tar.bz2
mpv-47c4b5c0003fa50cfefc3f2e8a089a9b0feebe3f.tar.xz
vd_lavc: factor out libavcodec thread setup
Diffstat (limited to 'mpvcore')
-rw-r--r--mpvcore/av_common.c19
-rw-r--r--mpvcore/av_common.h1
2 files changed, 20 insertions, 0 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);