diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-04-23 14:10:54 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2013-04-23 14:20:42 +0200 |
commit | 2d2c9b1aac6f2fa3a1a7c8a9ed46b76cefe228c8 (patch) | |
tree | efb37df56882622c5d6cfd79c57248cb04f54c07 | |
parent | e8369557b0b161d6fd58eb1c9414f21022038653 (diff) |
avviddec: Enable FRAME based threaded decoding if upstream is not live
If upstream is live we don't want FRAME based threaded decoding as
it adds latency.
-rw-r--r-- | ext/libav/gstavviddec.c | 33 |
1 files changed, 25 insertions, 8 deletions
diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c index 0e909a4..f2b5b38 100644 --- a/ext/libav/gstavviddec.c +++ b/ext/libav/gstavviddec.c @@ -426,15 +426,32 @@ 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 & 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; + { + GstQuery *query; + gboolean is_live; + + if (ffmpegdec->max_threads == 0) { + if (!(oclass->in_plugin->capabilities & 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; + + query = gst_query_new_latency (); + is_live = FALSE; + /* Check if upstream is live. If it isn't we can enable frame based + * threading, which is adding latency */ + if (gst_pad_peer_query (GST_VIDEO_DECODER_SINK_PAD (ffmpegdec), query)) { + gst_query_parse_latency (query, &is_live, NULL, NULL); + } + gst_query_unref (query); - ffmpegdec->context->thread_type = FF_THREAD_SLICE; + if (is_live) + ffmpegdec->context->thread_type = FF_THREAD_SLICE; + else + ffmpegdec->context->thread_type = FF_THREAD_SLICE | FF_THREAD_FRAME; + } /* open codec - we don't select an output pix_fmt yet, * simply because we don't know! We only get it |