mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-05 15:08:48 +00:00
decodebin3: Do not modify structure of EOS event
https://bugzilla.gnome.org/show_bug.cgi?id=795981
This commit is contained in:
parent
4567fcc64c
commit
3678866474
2 changed files with 41 additions and 12 deletions
|
@ -35,6 +35,20 @@
|
||||||
#include "gstplayback.h"
|
#include "gstplayback.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define CUSTOM_EOS_QUARK _custom_eos_quark_get ()
|
||||||
|
#define CUSTOM_EOS_QUARK_DATA "custom-eos"
|
||||||
|
static GQuark
|
||||||
|
_custom_eos_quark_get (void)
|
||||||
|
{
|
||||||
|
static gsize g_quark;
|
||||||
|
|
||||||
|
if (g_once_init_enter (&g_quark)) {
|
||||||
|
gsize quark = (gsize) g_quark_from_static_string ("decodebin3-custom-eos");
|
||||||
|
g_once_init_leave (&g_quark, quark);
|
||||||
|
}
|
||||||
|
return g_quark;
|
||||||
|
}
|
||||||
|
|
||||||
/* Streams that come from demuxers (input/upstream) */
|
/* Streams that come from demuxers (input/upstream) */
|
||||||
/* FIXME : All this is hardcoded. Switch to tree of chains */
|
/* FIXME : All this is hardcoded. Switch to tree of chains */
|
||||||
struct _DecodebinInputStream
|
struct _DecodebinInputStream
|
||||||
|
@ -263,16 +277,14 @@ parse_chain_output_probe (GstPad * pad, GstPadProbeInfo * info,
|
||||||
GstPad *peer = gst_pad_get_peer (input->srcpad);
|
GstPad *peer = gst_pad_get_peer (input->srcpad);
|
||||||
if (peer) {
|
if (peer) {
|
||||||
/* Send custom-eos event to multiqueue slot */
|
/* Send custom-eos event to multiqueue slot */
|
||||||
GstStructure *s;
|
|
||||||
GstEvent *event;
|
GstEvent *event;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (pad,
|
GST_DEBUG_OBJECT (pad,
|
||||||
"Got EOS end of input stream, post custom-eos");
|
"Got EOS end of input stream, post custom-eos");
|
||||||
event = gst_event_new_eos ();
|
event = gst_event_new_eos ();
|
||||||
gst_event_set_seqnum (event, gst_event_get_seqnum (ev));
|
gst_event_set_seqnum (event, gst_event_get_seqnum (ev));
|
||||||
s = gst_event_writable_structure (event);
|
gst_mini_object_set_qdata (GST_MINI_OBJECT_CAST (event),
|
||||||
gst_structure_set (s, "decodebin3-custom-eos", G_TYPE_BOOLEAN, TRUE,
|
CUSTOM_EOS_QUARK, (gchar *) CUSTOM_EOS_QUARK_DATA, NULL);
|
||||||
NULL);
|
|
||||||
gst_pad_send_event (peer, event);
|
gst_pad_send_event (peer, event);
|
||||||
gst_object_unref (peer);
|
gst_object_unref (peer);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -181,6 +181,21 @@ GST_DEBUG_CATEGORY_STATIC (decodebin3_debug);
|
||||||
|
|
||||||
#define EXTRA_DEBUG 1
|
#define EXTRA_DEBUG 1
|
||||||
|
|
||||||
|
#define CUSTOM_FINAL_EOS_QUARK _custom_final_eos_quark_get ()
|
||||||
|
#define CUSTOM_FINAL_EOS_QUARK_DATA "custom-final-eos"
|
||||||
|
static GQuark
|
||||||
|
_custom_final_eos_quark_get (void)
|
||||||
|
{
|
||||||
|
static gsize g_quark;
|
||||||
|
|
||||||
|
if (g_once_init_enter (&g_quark)) {
|
||||||
|
gsize quark =
|
||||||
|
(gsize) g_quark_from_static_string ("decodebin3-custom-final-eos");
|
||||||
|
g_once_init_leave (&g_quark, quark);
|
||||||
|
}
|
||||||
|
return g_quark;
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct _GstDecodebin3 GstDecodebin3;
|
typedef struct _GstDecodebin3 GstDecodebin3;
|
||||||
typedef struct _GstDecodebin3Class GstDecodebin3Class;
|
typedef struct _GstDecodebin3Class GstDecodebin3Class;
|
||||||
|
|
||||||
|
@ -1663,7 +1678,6 @@ check_all_slot_for_eos (GstDecodebin3 * dbin)
|
||||||
|
|
||||||
/* Send EOS to all slots */
|
/* Send EOS to all slots */
|
||||||
if (peer) {
|
if (peer) {
|
||||||
GstStructure *s;
|
|
||||||
GstEvent *stream_start, *eos;
|
GstEvent *stream_start, *eos;
|
||||||
|
|
||||||
stream_start =
|
stream_start =
|
||||||
|
@ -1681,9 +1695,9 @@ check_all_slot_for_eos (GstDecodebin3 * dbin)
|
||||||
}
|
}
|
||||||
|
|
||||||
eos = gst_event_new_eos ();
|
eos = gst_event_new_eos ();
|
||||||
s = gst_event_writable_structure (eos);
|
gst_mini_object_set_qdata (GST_MINI_OBJECT_CAST (eos),
|
||||||
gst_structure_set (s, "decodebin3-custom-final-eos", G_TYPE_BOOLEAN,
|
CUSTOM_FINAL_EOS_QUARK, (gchar *) CUSTOM_FINAL_EOS_QUARK_DATA,
|
||||||
TRUE, NULL);
|
NULL);
|
||||||
gst_pad_send_event (peer, eos);
|
gst_pad_send_event (peer, eos);
|
||||||
gst_object_unref (peer);
|
gst_object_unref (peer);
|
||||||
} else
|
} else
|
||||||
|
@ -1782,12 +1796,15 @@ multiqueue_src_probe (GstPad * pad, GstPadProbeInfo * info,
|
||||||
break;
|
break;
|
||||||
case GST_EVENT_EOS:
|
case GST_EVENT_EOS:
|
||||||
{
|
{
|
||||||
const GstStructure *s = gst_event_get_structure (ev);
|
|
||||||
gboolean was_drained = slot->is_drained;
|
gboolean was_drained = slot->is_drained;
|
||||||
slot->is_drained = TRUE;
|
slot->is_drained = TRUE;
|
||||||
|
|
||||||
/* Custom EOS handling first */
|
/* Custom EOS handling first */
|
||||||
if (s && gst_structure_has_field (s, "decodebin3-custom-eos")) {
|
if (gst_mini_object_get_qdata (GST_MINI_OBJECT_CAST (ev),
|
||||||
|
CUSTOM_EOS_QUARK)) {
|
||||||
|
/* remove custom-eos */
|
||||||
|
gst_mini_object_set_qdata (GST_MINI_OBJECT_CAST (ev),
|
||||||
|
CUSTOM_EOS_QUARK, NULL, NULL);
|
||||||
GST_LOG_OBJECT (pad, "Received custom EOS");
|
GST_LOG_OBJECT (pad, "Received custom EOS");
|
||||||
ret = GST_PAD_PROBE_HANDLED;
|
ret = GST_PAD_PROBE_HANDLED;
|
||||||
SELECTION_LOCK (dbin);
|
SELECTION_LOCK (dbin);
|
||||||
|
@ -1840,8 +1857,8 @@ multiqueue_src_probe (GstPad * pad, GstPadProbeInfo * info,
|
||||||
|
|
||||||
free_multiqueue_slot_async (dbin, slot);
|
free_multiqueue_slot_async (dbin, slot);
|
||||||
ret = GST_PAD_PROBE_REMOVE;
|
ret = GST_PAD_PROBE_REMOVE;
|
||||||
} else if (s
|
} else if (gst_mini_object_get_qdata (GST_MINI_OBJECT_CAST (ev),
|
||||||
&& gst_structure_has_field (s, "decodebin3-custom-final-eos")) {
|
CUSTOM_FINAL_EOS_QUARK)) {
|
||||||
GST_DEBUG_OBJECT (pad, "Got final eos, propagating downstream");
|
GST_DEBUG_OBJECT (pad, "Got final eos, propagating downstream");
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (pad, "Got regular eos (all_inputs_are_eos)");
|
GST_DEBUG_OBJECT (pad, "Got regular eos (all_inputs_are_eos)");
|
||||||
|
|
Loading…
Reference in a new issue