summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorMathieu Duponchelle <mathieu@centricular.com>2019-07-18 00:20:16 +0200
committerMathieu Duponchelle <mathieu@centricular.com>2019-07-18 00:26:50 +0200
commit1e8e040fbc7cfff63f29c5c872685bbb5578d965 (patch)
tree5b33290acbabc7829162152ad4de3508bb733262 /ext
parente8f21b510a7cad1215bc698d519bd30e9c9e340c (diff)
downloadgst-libav-1e8e040fbc7cfff63f29c5c872685bbb5578d965.tar.gz
avviddec: improve latency calculation
When thread_type is set to FF_THREAD_FRAME, per the documentation a latency of one frame per thread is introduced: <https://ffmpeg.org/ffmpeg-codecs.html>, search for thread_type. Additionally, we need in that case to calculate the automatic number of threads ourselves, so as to accurately calculate the latency.
Diffstat (limited to 'ext')
-rw-r--r--ext/libav/gstavviddec.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c
index 3469279..945c928 100644
--- a/ext/libav/gstavviddec.c
+++ b/ext/libav/gstavviddec.c
@@ -518,14 +518,6 @@ gst_ffmpegviddec_set_format (GstVideoDecoder * decoder,
* supports it) */
ffmpegdec->context->debug_mv = ffmpegdec->debug_mv;
- if (ffmpegdec->max_threads == 0) {
- if (!(oclass->in_plugin->capabilities & AV_CODEC_CAP_AUTO_THREADS))
- ffmpegdec->context->thread_count = gst_ffmpeg_auto_max_threads ();
- else
- ffmpegdec->context->thread_count = 0;
- } else
- ffmpegdec->context->thread_count = ffmpegdec->max_threads;
-
if (ffmpegdec->thread_type) {
GST_DEBUG_OBJECT (ffmpegdec, "Use requested thread type 0x%x",
ffmpegdec->thread_type);
@@ -549,6 +541,17 @@ gst_ffmpegviddec_set_format (GstVideoDecoder * decoder,
ffmpegdec->context->thread_type = FF_THREAD_SLICE | FF_THREAD_FRAME;
}
+ if (ffmpegdec->max_threads == 0) {
+ /* When thread type is FF_THREAD_FRAME, extra latency is introduced equal
+ * to one frame per thread. We thus need to calculate the thread count ourselves */
+ if ((!(oclass->in_plugin->capabilities & AV_CODEC_CAP_AUTO_THREADS)) ||
+ (ffmpegdec->context->thread_type & FF_THREAD_FRAME))
+ ffmpegdec->context->thread_count = gst_ffmpeg_auto_max_threads ();
+ else
+ ffmpegdec->context->thread_count = 0;
+ } else
+ ffmpegdec->context->thread_count = ffmpegdec->max_threads;
+
/* open codec - we don't select an output pix_fmt yet,
* simply because we don't know! We only get it
* during playback... */
@@ -564,6 +567,12 @@ gst_ffmpegviddec_set_format (GstVideoDecoder * decoder,
latency = gst_util_uint64_scale_ceil (
(ffmpegdec->context->has_b_frames) * GST_SECOND, info->fps_d,
info->fps_n);
+
+ if (ffmpegdec->context->thread_type & FF_THREAD_FRAME) {
+ latency +=
+ gst_util_uint64_scale_ceil (ffmpegdec->context->thread_count *
+ GST_SECOND, info->fps_d, info->fps_n);
+ }
}
ret = TRUE;
@@ -1431,6 +1440,11 @@ gst_ffmpegviddec_negotiate (GstFFMpegVidDec * ffmpegdec,
latency =
gst_util_uint64_scale_ceil (ffmpegdec->context->has_b_frames *
GST_SECOND, fps_d, fps_n);
+ if (ffmpegdec->context->thread_type & FF_THREAD_FRAME) {
+ latency +=
+ gst_util_uint64_scale_ceil (ffmpegdec->context->thread_count *
+ GST_SECOND, fps_d, fps_n);
+ }
gst_video_decoder_set_latency (GST_VIDEO_DECODER (ffmpegdec), latency,
latency);
}