From 89bc4643606486a6b9038a71063cdc2c6d24e821 Mon Sep 17 00:00:00 2001 From: Daniel Almeida Date: Thu, 8 Apr 2021 10:11:52 -0300 Subject: v4l2codecs: gstv4l2codecsvp8dec: implement a render delay The v4l2 backend support delayed output for performance reasons. It is then possible to use render delays to queue multiple requests simultaneously, thus increasing performance. Part-of: --- sys/v4l2codecs/gstv4l2codecvp8dec.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/sys/v4l2codecs/gstv4l2codecvp8dec.c b/sys/v4l2codecs/gstv4l2codecvp8dec.c index 4abcbfcae..dcda996d0 100644 --- a/sys/v4l2codecs/gstv4l2codecvp8dec.c +++ b/sys/v4l2codecs/gstv4l2codecvp8dec.c @@ -82,6 +82,24 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstV4l2CodecVp8Dec, "V4L2 stateless VP8 decoder")); #define parent_class gst_v4l2_codec_vp8_dec_parent_class +static guint +gst_v4l2_codec_vp8_dec_get_preferred_output_delay (GstVp8Decoder * decoder, + gboolean is_live) +{ + + GstV4l2CodecVp8Dec *self = GST_V4L2_CODEC_VP8_DEC (decoder); + guint delay; + + if (is_live) + delay = 0; + else + /* Just one for now, perhaps we can make this configurable in the future. */ + delay = 1; + + gst_v4l2_decoder_set_render_delay (self->decoder, delay); + return delay; +} + static gboolean gst_v4l2_codec_vp8_dec_open (GstVideoDecoder * decoder) { @@ -240,6 +258,7 @@ gst_v4l2_codec_vp8_dec_decide_allocation (GstVideoDecoder * decoder, { GstV4l2CodecVp8Dec *self = GST_V4L2_CODEC_VP8_DEC (decoder); guint min = 0; + guint num_bitstream; self->has_videometa = gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL); @@ -252,8 +271,11 @@ gst_v4l2_codec_vp8_dec_decide_allocation (GstVideoDecoder * decoder, min = MAX (2, min); + num_bitstream = 1 + + MAX (1, gst_v4l2_decoder_get_render_delay (self->decoder)); + self->sink_allocator = gst_v4l2_codec_allocator_new (self->decoder, - GST_PAD_SINK, 2); + GST_PAD_SINK, num_bitstream); self->src_allocator = gst_v4l2_codec_allocator_new (self->decoder, GST_PAD_SRC, self->min_pool_size + min + 4); self->src_pool = gst_v4l2_codec_pool_new (self->src_allocator, &self->vinfo); @@ -850,6 +872,8 @@ gst_v4l2_codec_vp8_dec_subclass_init (GstV4l2CodecVp8DecClass * klass, GST_DEBUG_FUNCPTR (gst_v4l2_codec_vp8_dec_end_picture); vp8decoder_class->output_picture = GST_DEBUG_FUNCPTR (gst_v4l2_codec_vp8_dec_output_picture); + vp8decoder_class->get_preferred_output_delay = + GST_DEBUG_FUNCPTR (gst_v4l2_codec_vp8_dec_get_preferred_output_delay); klass->device = device; gst_v4l2_decoder_install_properties (gobject_class, PROP_LAST, device); -- cgit v1.2.1