diff options
-rw-r--r-- | source/blender/blenkernel/intern/writeffmpeg.c | 17 | ||||
-rw-r--r-- | source/blender/imbuf/intern/anim_movie.c | 15 | ||||
-rw-r--r-- | source/blender/imbuf/intern/indexer.c | 34 |
3 files changed, 55 insertions, 11 deletions
diff --git a/source/blender/blenkernel/intern/writeffmpeg.c b/source/blender/blenkernel/intern/writeffmpeg.c index 0991d804882..7fc9e8cc0ef 100644 --- a/source/blender/blenkernel/intern/writeffmpeg.c +++ b/source/blender/blenkernel/intern/writeffmpeg.c @@ -567,9 +567,6 @@ static AVStream *alloc_video_stream(FFMpegContext *context, /* Set up the codec context */ c = st->codec; - c->thread_count = BLI_system_thread_count(); - c->thread_type = FF_THREAD_SLICE; - c->codec_id = codec_id; c->codec_type = AVMEDIA_TYPE_VIDEO; @@ -727,6 +724,20 @@ static AVStream *alloc_video_stream(FFMpegContext *context, set_ffmpeg_properties(rd, c, "video", &opts); + if (codec->capabilities & AV_CODEC_CAP_AUTO_THREADS) { + c->thread_count = 0; + } + else { + c->thread_count = BLI_system_thread_count(); + } + + if (codec->capabilities & AV_CODEC_CAP_FRAME_THREADS) { + c->thread_type = FF_THREAD_FRAME; + } + else if (codec->capabilities & AV_CODEC_CAP_SLICE_THREADS) { + c->thread_type = FF_THREAD_SLICE; + } + if (avcodec_open2(c, codec, &opts) < 0) { BLI_strncpy(error, IMB_ffmpeg_last_error(), error_size); av_dict_free(&opts); diff --git a/source/blender/imbuf/intern/anim_movie.c b/source/blender/imbuf/intern/anim_movie.c index 3a19bc36f6c..785f27c53e4 100644 --- a/source/blender/imbuf/intern/anim_movie.c +++ b/source/blender/imbuf/intern/anim_movie.c @@ -574,8 +574,19 @@ static int startffmpeg(struct anim *anim) pCodecCtx->workaround_bugs = 1; - pCodecCtx->thread_count = BLI_system_thread_count(); - pCodecCtx->thread_type = FF_THREAD_SLICE; + if (pCodec->capabilities & AV_CODEC_CAP_AUTO_THREADS) { + pCodecCtx->thread_count = 0; + } + else { + pCodecCtx->thread_count = BLI_system_thread_count(); + } + + if (pCodec->capabilities & AV_CODEC_CAP_FRAME_THREADS) { + pCodecCtx->thread_type = FF_THREAD_FRAME; + } + else if (pCodec->capabilities & AV_CODEC_CAP_SLICE_THREADS) { + pCodecCtx->thread_type = FF_THREAD_SLICE; + } if (avcodec_open2(pCodecCtx, pCodec, NULL) < 0) { avformat_close_input(&pFormatCtx); diff --git a/source/blender/imbuf/intern/indexer.c b/source/blender/imbuf/intern/indexer.c index d331cfd533a..6496f2d05a4 100644 --- a/source/blender/imbuf/intern/indexer.c +++ b/source/blender/imbuf/intern/indexer.c @@ -541,8 +541,20 @@ static struct proxy_output_ctx *alloc_proxy_output_ffmpeg( av_dict_set_int(&codec_opts, "crf", crf, 0); /* Prefer smaller file-size. */ av_dict_set(&codec_opts, "preset", "slow", 0); - /* Thread count. */ - av_dict_set_int(&codec_opts, "threads", BLI_system_thread_count(), 0); + + if (rv->codec->capabilities & AV_CODEC_CAP_AUTO_THREADS) { + rv->c->thread_count = 0; + } + else { + rv->c->thread_count = BLI_system_thread_count(); + } + + if (rv->codec->capabilities & AV_CODEC_CAP_FRAME_THREADS) { + rv->c->thread_type = FF_THREAD_FRAME; + } + else if (rv->codec->capabilities & AV_CODEC_CAP_SLICE_THREADS) { + rv->c->thread_type = FF_THREAD_SLICE; + } if (rv->of->flags & AVFMT_GLOBALHEADER) { rv->c->flags |= CODEC_FLAG_GLOBAL_HEADER; @@ -794,11 +806,21 @@ static IndexBuildContext *index_ffmpeg_create_context(struct anim *anim, context->iCodecCtx->workaround_bugs = 1; - AVDictionary *codec_opts = NULL; - /* Thread count. */ - av_dict_set_int(&codec_opts, "threads", BLI_system_thread_count(), 0); + if (context->iCodec->capabilities & AV_CODEC_CAP_AUTO_THREADS) { + context->iCodecCtx->thread_count = 0; + } + else { + context->iCodecCtx->thread_count = BLI_system_thread_count(); + } + + if (context->iCodec->capabilities & AV_CODEC_CAP_FRAME_THREADS) { + context->iCodecCtx->thread_type = FF_THREAD_FRAME; + } + else if (context->iCodec->capabilities & AV_CODEC_CAP_SLICE_THREADS) { + context->iCodecCtx->thread_type = FF_THREAD_SLICE; + } - if (avcodec_open2(context->iCodecCtx, context->iCodec, &codec_opts) < 0) { + if (avcodec_open2(context->iCodecCtx, context->iCodec, NULL) < 0) { avformat_close_input(&context->iFormatCtx); MEM_freeN(context); return NULL; |