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:
parent
be63900324
commit
d2086675a4
@ -97,8 +97,7 @@ gst_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
GstPad *src_gpad, *sink_gpad;
|
GstPad *src_gpad, *sink_gpad;
|
||||||
GstPad *src_pad = NULL, *sink_pad = NULL;
|
GstPad *src_pad = NULL, *sink_pad = NULL;
|
||||||
GstElement *alphademux = NULL;
|
GstElement *alphademux = NULL;
|
||||||
GstElement *queue = NULL;
|
GstElement *mq = NULL;
|
||||||
GstElement *alpha_queue = NULL;
|
|
||||||
GstElement *decoder = NULL;
|
GstElement *decoder = NULL;
|
||||||
GstElement *alpha_decoder = NULL;
|
GstElement *alpha_decoder = NULL;
|
||||||
GstElement *alphacombine = NULL;
|
GstElement *alphacombine = NULL;
|
||||||
@ -119,10 +118,9 @@ gst_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
queue = gst_element_factory_make ("queue", "main-queue");
|
mq = gst_element_factory_make ("multiqueue", NULL);
|
||||||
alpha_queue = gst_element_factory_make ("queue", "alpha-queue");
|
if (!mq) {
|
||||||
if (!queue || !alpha_queue) {
|
priv->missing_element = "multiqueue";
|
||||||
priv->missing_element = "queue";
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,29 +147,27 @@ gst_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_bin_add_many (GST_BIN (self), alphademux, queue, alpha_queue, decoder,
|
gst_bin_add_many (GST_BIN (self), alphademux, mq,
|
||||||
alpha_decoder, alphacombine, NULL);
|
decoder, alpha_decoder, alphacombine, NULL);
|
||||||
|
|
||||||
/* link elements */
|
/* link elements */
|
||||||
sink_pad = gst_element_get_static_pad (alphademux, "sink");
|
sink_pad = gst_element_get_static_pad (alphademux, "sink");
|
||||||
gst_ghost_pad_set_target (GST_GHOST_PAD (sink_gpad), sink_pad);
|
gst_ghost_pad_set_target (GST_GHOST_PAD (sink_gpad), sink_pad);
|
||||||
gst_clear_object (&sink_pad);
|
gst_clear_object (&sink_pad);
|
||||||
|
|
||||||
gst_element_link_pads (alphademux, "src", queue, "sink");
|
gst_element_link_pads (alphademux, "src", mq, "sink_0");
|
||||||
gst_element_link_pads (queue, "src", decoder, "sink");
|
gst_element_link_pads (mq, "src_0", decoder, "sink");
|
||||||
gst_element_link_pads (decoder, "src", alphacombine, "sink");
|
gst_element_link_pads (decoder, "src", alphacombine, "sink");
|
||||||
|
|
||||||
gst_element_link_pads (alphademux, "alpha", alpha_queue, "sink");
|
gst_element_link_pads (alphademux, "alpha", mq, "sink_1");
|
||||||
gst_element_link_pads (alpha_queue, "src", alpha_decoder, "sink");
|
gst_element_link_pads (mq, "src_1", alpha_decoder, "sink");
|
||||||
gst_element_link_pads (alpha_decoder, "src", alphacombine, "alpha");
|
gst_element_link_pads (alpha_decoder, "src", alphacombine, "alpha");
|
||||||
|
|
||||||
src_pad = gst_element_get_static_pad (alphacombine, "src");
|
src_pad = gst_element_get_static_pad (alphacombine, "src");
|
||||||
gst_ghost_pad_set_target (GST_GHOST_PAD (src_gpad), src_pad);
|
gst_ghost_pad_set_target (GST_GHOST_PAD (src_gpad), src_pad);
|
||||||
gst_object_unref (src_pad);
|
gst_object_unref (src_pad);
|
||||||
|
|
||||||
g_object_set (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);
|
|
||||||
g_object_set (alpha_queue, "max-size-bytes", 0, "max-size-time",
|
|
||||||
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
|
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
|
||||||
|
|
||||||
/* signal success, we will handle this in NULL->READY transition */
|
/* signal success, we will handle this in NULL->READY transition */
|
||||||
@ -180,8 +176,7 @@ gst_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
gst_clear_object (&alphademux);
|
gst_clear_object (&alphademux);
|
||||||
gst_clear_object (&queue);
|
gst_clear_object (&mq);
|
||||||
gst_clear_object (&alpha_queue);
|
|
||||||
gst_clear_object (&decoder);
|
gst_clear_object (&decoder);
|
||||||
gst_clear_object (&alpha_decoder);
|
gst_clear_object (&alpha_decoder);
|
||||||
gst_clear_object (&alphacombine);
|
gst_clear_object (&alphacombine);
|
||||||
|
@ -119,8 +119,7 @@ gst_v4l2_codec_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
GstPad *src_gpad, *sink_gpad;
|
GstPad *src_gpad, *sink_gpad;
|
||||||
GstPad *src_pad = NULL, *sink_pad = NULL;
|
GstPad *src_pad = NULL, *sink_pad = NULL;
|
||||||
GstElement *alphademux = NULL;
|
GstElement *alphademux = NULL;
|
||||||
GstElement *queue = NULL;
|
GstElement *mq = NULL;
|
||||||
GstElement *alpha_queue = NULL;
|
|
||||||
GstElement *decoder = NULL;
|
GstElement *decoder = NULL;
|
||||||
GstElement *alpha_decoder = NULL;
|
GstElement *alpha_decoder = NULL;
|
||||||
GstElement *alphacombine = NULL;
|
GstElement *alphacombine = NULL;
|
||||||
@ -141,10 +140,9 @@ gst_v4l2_codec_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
queue = gst_element_factory_make ("queue", NULL);
|
mq = gst_element_factory_make ("multiqueue", NULL);
|
||||||
alpha_queue = gst_element_factory_make ("queue", NULL);
|
if (!mq) {
|
||||||
if (!queue || !alpha_queue) {
|
priv->missing_element = "multiqueue";
|
||||||
priv->missing_element = "queue";
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,7 +169,7 @@ gst_v4l2_codec_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
goto cleanup;
|
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);
|
alpha_decoder, alphacombine, NULL);
|
||||||
|
|
||||||
/* link elements */
|
/* 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_ghost_pad_set_target (GST_GHOST_PAD (sink_gpad), sink_pad);
|
||||||
gst_clear_object (&sink_pad);
|
gst_clear_object (&sink_pad);
|
||||||
|
|
||||||
gst_element_link_pads (alphademux, "src", queue, "sink");
|
gst_element_link_pads (alphademux, "src", mq, "sink_0");
|
||||||
gst_element_link_pads (queue, "src", decoder, "sink");
|
gst_element_link_pads (mq, "src_0", decoder, "sink");
|
||||||
gst_element_link_pads (decoder, "src", alphacombine, "sink");
|
gst_element_link_pads (decoder, "src", alphacombine, "sink");
|
||||||
|
|
||||||
gst_element_link_pads (alphademux, "alpha", alpha_queue, "sink");
|
gst_element_link_pads (alphademux, "alpha", mq, "sink_1");
|
||||||
gst_element_link_pads (alpha_queue, "src", alpha_decoder, "sink");
|
gst_element_link_pads (mq, "src_1", alpha_decoder, "sink");
|
||||||
gst_element_link_pads (alpha_decoder, "src", alphacombine, "alpha");
|
gst_element_link_pads (alpha_decoder, "src", alphacombine, "alpha");
|
||||||
|
|
||||||
src_pad = gst_element_get_static_pad (alphacombine, "src");
|
src_pad = gst_element_get_static_pad (alphacombine, "src");
|
||||||
gst_ghost_pad_set_target (GST_GHOST_PAD (src_gpad), src_pad);
|
gst_ghost_pad_set_target (GST_GHOST_PAD (src_gpad), src_pad);
|
||||||
gst_object_unref (src_pad);
|
gst_object_unref (src_pad);
|
||||||
|
|
||||||
g_object_set (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);
|
|
||||||
g_object_set (alpha_queue, "max-size-bytes", 0, "max-size-time",
|
|
||||||
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
|
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
|
||||||
|
|
||||||
/* signal success, we will handle this in NULL->READY transition */
|
/* signal success, we will handle this in NULL->READY transition */
|
||||||
@ -202,8 +198,7 @@ gst_v4l2_codec_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
gst_clear_object (&alphademux);
|
gst_clear_object (&alphademux);
|
||||||
gst_clear_object (&queue);
|
gst_clear_object (&mq);
|
||||||
gst_clear_object (&alpha_queue);
|
|
||||||
gst_clear_object (&decoder);
|
gst_clear_object (&decoder);
|
||||||
gst_clear_object (&alpha_decoder);
|
gst_clear_object (&alpha_decoder);
|
||||||
gst_clear_object (&alphacombine);
|
gst_clear_object (&alphacombine);
|
||||||
|
@ -102,8 +102,7 @@ gst_va_codec_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
GstPad *src_gpad, *sink_gpad;
|
GstPad *src_gpad, *sink_gpad;
|
||||||
GstPad *src_pad = NULL, *sink_pad = NULL;
|
GstPad *src_pad = NULL, *sink_pad = NULL;
|
||||||
GstElement *alphademux = NULL;
|
GstElement *alphademux = NULL;
|
||||||
GstElement *queue = NULL;
|
GstElement *mq = NULL;
|
||||||
GstElement *alpha_queue = NULL;
|
|
||||||
GstElement *decoder = NULL;
|
GstElement *decoder = NULL;
|
||||||
GstElement *alpha_decoder = NULL;
|
GstElement *alpha_decoder = NULL;
|
||||||
GstElement *alphacombine = NULL;
|
GstElement *alphacombine = NULL;
|
||||||
@ -124,10 +123,9 @@ gst_va_codec_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
queue = gst_element_factory_make ("queue", NULL);
|
mq = gst_element_factory_make ("multiqueue", NULL);
|
||||||
alpha_queue = gst_element_factory_make ("queue", NULL);
|
if (!mq) {
|
||||||
if (!queue || !alpha_queue) {
|
priv->missing_element = "multiqueue";
|
||||||
priv->missing_element = "queue";
|
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,29 +152,27 @@ gst_va_codec_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_bin_add_many (GST_BIN (self), alphademux, queue, alpha_queue, decoder,
|
gst_bin_add_many (GST_BIN (self), alphademux, mq,
|
||||||
alpha_decoder, alphacombine, NULL);
|
decoder, alpha_decoder, alphacombine, NULL);
|
||||||
|
|
||||||
/* link elements */
|
/* link elements */
|
||||||
sink_pad = gst_element_get_static_pad (alphademux, "sink");
|
sink_pad = gst_element_get_static_pad (alphademux, "sink");
|
||||||
gst_ghost_pad_set_target (GST_GHOST_PAD (sink_gpad), sink_pad);
|
gst_ghost_pad_set_target (GST_GHOST_PAD (sink_gpad), sink_pad);
|
||||||
gst_clear_object (&sink_pad);
|
gst_clear_object (&sink_pad);
|
||||||
|
|
||||||
gst_element_link_pads (alphademux, "src", queue, "sink");
|
gst_element_link_pads (alphademux, "src", mq, "sink_0");
|
||||||
gst_element_link_pads (queue, "src", decoder, "sink");
|
gst_element_link_pads (mq, "src_0", decoder, "sink");
|
||||||
gst_element_link_pads (decoder, "src", alphacombine, "sink");
|
gst_element_link_pads (decoder, "src", alphacombine, "sink");
|
||||||
|
|
||||||
gst_element_link_pads (alphademux, "alpha", alpha_queue, "sink");
|
gst_element_link_pads (alphademux, "alpha", mq, "sink_1");
|
||||||
gst_element_link_pads (alpha_queue, "src", alpha_decoder, "sink");
|
gst_element_link_pads (mq, "src_1", alpha_decoder, "sink");
|
||||||
gst_element_link_pads (alpha_decoder, "src", alphacombine, "alpha");
|
gst_element_link_pads (alpha_decoder, "src", alphacombine, "alpha");
|
||||||
|
|
||||||
src_pad = gst_element_get_static_pad (alphacombine, "src");
|
src_pad = gst_element_get_static_pad (alphacombine, "src");
|
||||||
gst_ghost_pad_set_target (GST_GHOST_PAD (src_gpad), src_pad);
|
gst_ghost_pad_set_target (GST_GHOST_PAD (src_gpad), src_pad);
|
||||||
gst_object_unref (src_pad);
|
gst_object_unref (src_pad);
|
||||||
|
|
||||||
g_object_set (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);
|
|
||||||
g_object_set (alpha_queue, "max-size-bytes", 0, "max-size-time",
|
|
||||||
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
|
G_GUINT64_CONSTANT (0), "max-size-buffers", 1, NULL);
|
||||||
|
|
||||||
/* signal success, we will handle this in NULL->READY transition */
|
/* signal success, we will handle this in NULL->READY transition */
|
||||||
@ -185,8 +181,7 @@ gst_va_codec_alpha_decode_bin_constructed (GObject * obj)
|
|||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
gst_clear_object (&alphademux);
|
gst_clear_object (&alphademux);
|
||||||
gst_clear_object (&queue);
|
gst_clear_object (&mq);
|
||||||
gst_clear_object (&alpha_queue);
|
|
||||||
gst_clear_object (&decoder);
|
gst_clear_object (&decoder);
|
||||||
gst_clear_object (&alpha_decoder);
|
gst_clear_object (&alpha_decoder);
|
||||||
gst_clear_object (&alphacombine);
|
gst_clear_object (&alphacombine);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user