alphadecodebin: use a multiqueue instead of a couple of queues

Fix gapless playback as queues are no longer stopped after the first
eos.

Co-authored-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Fix #4165

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8775>
This commit is contained in:
Guillaume Desmottes 2025-04-02 09:58:26 +02:00 committed by GStreamer Marge Bot
parent be63900324
commit d2086675a4
3 changed files with 35 additions and 50 deletions

View File

@ -97,8 +97,7 @@ gst_alpha_decode_bin_constructed (GObject * obj)
GstPad *src_gpad, *sink_gpad;
GstPad *src_pad = NULL, *sink_pad = NULL;
GstElement *alphademux = NULL;
GstElement *queue = NULL;
GstElement *alpha_queue = NULL;
GstElement *mq = NULL;
GstElement *decoder = NULL;
GstElement *alpha_decoder = NULL;
GstElement *alphacombine = NULL;
@ -119,10 +118,9 @@ gst_alpha_decode_bin_constructed (GObject * obj)
goto cleanup;
}
queue = gst_element_factory_make ("queue", "main-queue");
alpha_queue = gst_element_factory_make ("queue", "alpha-queue");
if (!queue || !alpha_queue) {
priv->missing_element = "queue";
mq = gst_element_factory_make ("multiqueue", NULL);
if (!mq) {
priv->missing_element = "multiqueue";
goto cleanup;
}
@ -149,29 +147,27 @@ gst_alpha_decode_bin_constructed (GObject * obj)
goto cleanup;
}
gst_bin_add_many (GST_BIN (self), alphademux, queue, alpha_queue, decoder,
alpha_decoder, alphacombine, NULL);
gst_bin_add_many (GST_BIN (self), alphademux, mq,
decoder, alpha_decoder, alphacombine, NULL);
/* link elements */
sink_pad = gst_element_get_static_pad (alphademux, "sink");
gst_ghost_pad_set_target (GST_GHOST_PAD (sink_gpad), sink_pad);
gst_clear_object (&sink_pad);
gst_element_link_pads (alphademux, "src", queue, "sink");
gst_element_link_pads (queue, "src", decoder, "sink");
gst_element_link_pads (alphademux, "src", mq, "sink_0");
gst_element_link_pads (mq, "src_0", decoder, "sink");
gst_element_link_pads (decoder, "src", alphacombine, "sink");
gst_element_link_pads (alphademux, "alpha", alpha_queue, "sink");
gst_element_link_pads (alpha_queue, "src", alpha_decoder, "sink");
gst_element_link_pads (alphademux, "alpha", mq, "sink_1");
gst_element_link_pads (mq, "src_1", alpha_decoder, "sink");
gst_element_link_pads (alpha_decoder, "src", alphacombine, "alpha");
src_pad = gst_element_get_static_pad (alphacombine, "src");
gst_ghost_pad_set_target (GST_GHOST_PAD (src_gpad), src_pad);
gst_object_unref (src_pad);
g_object_set (queue, "max-size-bytes", 0, "max-size-time",
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
g_object_set (alpha_queue, "max-size-bytes", 0, "max-size-time",
g_object_set (mq, "max-size-bytes", 0, "max-size-time",
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
/* signal success, we will handle this in NULL->READY transition */
@ -180,8 +176,7 @@ gst_alpha_decode_bin_constructed (GObject * obj)
cleanup:
gst_clear_object (&alphademux);
gst_clear_object (&queue);
gst_clear_object (&alpha_queue);
gst_clear_object (&mq);
gst_clear_object (&decoder);
gst_clear_object (&alpha_decoder);
gst_clear_object (&alphacombine);

View File

@ -119,8 +119,7 @@ gst_v4l2_codec_alpha_decode_bin_constructed (GObject * obj)
GstPad *src_gpad, *sink_gpad;
GstPad *src_pad = NULL, *sink_pad = NULL;
GstElement *alphademux = NULL;
GstElement *queue = NULL;
GstElement *alpha_queue = NULL;
GstElement *mq = NULL;
GstElement *decoder = NULL;
GstElement *alpha_decoder = NULL;
GstElement *alphacombine = NULL;
@ -141,10 +140,9 @@ gst_v4l2_codec_alpha_decode_bin_constructed (GObject * obj)
goto cleanup;
}
queue = gst_element_factory_make ("queue", NULL);
alpha_queue = gst_element_factory_make ("queue", NULL);
if (!queue || !alpha_queue) {
priv->missing_element = "queue";
mq = gst_element_factory_make ("multiqueue", NULL);
if (!mq) {
priv->missing_element = "multiqueue";
goto cleanup;
}
@ -171,7 +169,7 @@ gst_v4l2_codec_alpha_decode_bin_constructed (GObject * obj)
goto cleanup;
}
gst_bin_add_many (GST_BIN (self), alphademux, queue, alpha_queue, decoder,
gst_bin_add_many (GST_BIN (self), alphademux, mq, decoder,
alpha_decoder, alphacombine, NULL);
/* link elements */
@ -179,21 +177,19 @@ gst_v4l2_codec_alpha_decode_bin_constructed (GObject * obj)
gst_ghost_pad_set_target (GST_GHOST_PAD (sink_gpad), sink_pad);
gst_clear_object (&sink_pad);
gst_element_link_pads (alphademux, "src", queue, "sink");
gst_element_link_pads (queue, "src", decoder, "sink");
gst_element_link_pads (alphademux, "src", mq, "sink_0");
gst_element_link_pads (mq, "src_0", decoder, "sink");
gst_element_link_pads (decoder, "src", alphacombine, "sink");
gst_element_link_pads (alphademux, "alpha", alpha_queue, "sink");
gst_element_link_pads (alpha_queue, "src", alpha_decoder, "sink");
gst_element_link_pads (alphademux, "alpha", mq, "sink_1");
gst_element_link_pads (mq, "src_1", alpha_decoder, "sink");
gst_element_link_pads (alpha_decoder, "src", alphacombine, "alpha");
src_pad = gst_element_get_static_pad (alphacombine, "src");
gst_ghost_pad_set_target (GST_GHOST_PAD (src_gpad), src_pad);
gst_object_unref (src_pad);
g_object_set (queue, "max-size-bytes", 0, "max-size-time",
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
g_object_set (alpha_queue, "max-size-bytes", 0, "max-size-time",
g_object_set (mq, "max-size-bytes", 0, "max-size-time",
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
/* signal success, we will handle this in NULL->READY transition */
@ -202,8 +198,7 @@ gst_v4l2_codec_alpha_decode_bin_constructed (GObject * obj)
cleanup:
gst_clear_object (&alphademux);
gst_clear_object (&queue);
gst_clear_object (&alpha_queue);
gst_clear_object (&mq);
gst_clear_object (&decoder);
gst_clear_object (&alpha_decoder);
gst_clear_object (&alphacombine);

View File

@ -102,8 +102,7 @@ gst_va_codec_alpha_decode_bin_constructed (GObject * obj)
GstPad *src_gpad, *sink_gpad;
GstPad *src_pad = NULL, *sink_pad = NULL;
GstElement *alphademux = NULL;
GstElement *queue = NULL;
GstElement *alpha_queue = NULL;
GstElement *mq = NULL;
GstElement *decoder = NULL;
GstElement *alpha_decoder = NULL;
GstElement *alphacombine = NULL;
@ -124,10 +123,9 @@ gst_va_codec_alpha_decode_bin_constructed (GObject * obj)
goto cleanup;
}
queue = gst_element_factory_make ("queue", NULL);
alpha_queue = gst_element_factory_make ("queue", NULL);
if (!queue || !alpha_queue) {
priv->missing_element = "queue";
mq = gst_element_factory_make ("multiqueue", NULL);
if (!mq) {
priv->missing_element = "multiqueue";
goto cleanup;
}
@ -154,29 +152,27 @@ gst_va_codec_alpha_decode_bin_constructed (GObject * obj)
goto cleanup;
}
gst_bin_add_many (GST_BIN (self), alphademux, queue, alpha_queue, decoder,
alpha_decoder, alphacombine, NULL);
gst_bin_add_many (GST_BIN (self), alphademux, mq,
decoder, alpha_decoder, alphacombine, NULL);
/* link elements */
sink_pad = gst_element_get_static_pad (alphademux, "sink");
gst_ghost_pad_set_target (GST_GHOST_PAD (sink_gpad), sink_pad);
gst_clear_object (&sink_pad);
gst_element_link_pads (alphademux, "src", queue, "sink");
gst_element_link_pads (queue, "src", decoder, "sink");
gst_element_link_pads (alphademux, "src", mq, "sink_0");
gst_element_link_pads (mq, "src_0", decoder, "sink");
gst_element_link_pads (decoder, "src", alphacombine, "sink");
gst_element_link_pads (alphademux, "alpha", alpha_queue, "sink");
gst_element_link_pads (alpha_queue, "src", alpha_decoder, "sink");
gst_element_link_pads (alphademux, "alpha", mq, "sink_1");
gst_element_link_pads (mq, "src_1", alpha_decoder, "sink");
gst_element_link_pads (alpha_decoder, "src", alphacombine, "alpha");
src_pad = gst_element_get_static_pad (alphacombine, "src");
gst_ghost_pad_set_target (GST_GHOST_PAD (src_gpad), src_pad);
gst_object_unref (src_pad);
g_object_set (queue, "max-size-bytes", 0, "max-size-time",
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
g_object_set (alpha_queue, "max-size-bytes", 0, "max-size-time",
g_object_set (mq, "max-size-bytes", 0, "max-size-time",
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
/* signal success, we will handle this in NULL->READY transition */
@ -185,8 +181,7 @@ gst_va_codec_alpha_decode_bin_constructed (GObject * obj)
cleanup:
gst_clear_object (&alphademux);
gst_clear_object (&queue);
gst_clear_object (&alpha_queue);
gst_clear_object (&mq);
gst_clear_object (&decoder);
gst_clear_object (&alpha_decoder);
gst_clear_object (&alphacombine);