mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 10:11:08 +00:00
dvdemux: Push tag event to both pads
Tags are pushed to "videosrcpad"/"audiosrcpad" in gst_dvdemux_add_pad() method, however they will be NULL in this method, hence tags are not pushed. Instead, send tag event to "pad" created gst_dvdemux_add_pad(). Signal no-more-pads when both pads are created https://bugzilla.gnome.org/show_bug.cgi?id=743657
This commit is contained in:
parent
c35292505b
commit
de3e54690b
2 changed files with 43 additions and 32 deletions
|
@ -272,6 +272,7 @@ gst_dvdemux_reset (GstDVDemux * dvdemux)
|
|||
dvdemux->upstream_time_segment = FALSE;
|
||||
dvdemux->have_group_id = FALSE;
|
||||
dvdemux->group_id = G_MAXUINT;
|
||||
dvdemux->tag_event = NULL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
@ -294,16 +295,35 @@ have_group_id (GstDVDemux * demux)
|
|||
return demux->have_group_id;
|
||||
}
|
||||
|
||||
static GstEvent *
|
||||
gst_dvdemux_create_global_tag_event (GstDVDemux * dvdemux)
|
||||
{
|
||||
gchar rec_datetime[40];
|
||||
GstDateTime *rec_dt;
|
||||
GstTagList *tags;
|
||||
|
||||
tags = gst_tag_list_new (GST_TAG_CONTAINER_FORMAT, "DV", NULL);
|
||||
gst_tag_list_set_scope (tags, GST_TAG_SCOPE_GLOBAL);
|
||||
|
||||
if (dv_get_recording_datetime (dvdemux->decoder, rec_datetime)) {
|
||||
rec_dt = gst_date_time_new_from_iso8601_string (rec_datetime);
|
||||
if (rec_dt) {
|
||||
gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_DATE_TIME,
|
||||
rec_dt, NULL);
|
||||
gst_date_time_unref (rec_dt);
|
||||
}
|
||||
}
|
||||
|
||||
return gst_event_new_tag (tags);
|
||||
}
|
||||
|
||||
static GstPad *
|
||||
gst_dvdemux_add_pad (GstDVDemux * dvdemux, GstStaticPadTemplate * template,
|
||||
GstCaps * caps)
|
||||
{
|
||||
gboolean no_more_pads;
|
||||
GstPad *pad;
|
||||
GstEvent *event;
|
||||
gchar *stream_id;
|
||||
gchar rec_datetime[40];
|
||||
GstDateTime *rec_dt;
|
||||
|
||||
pad = gst_pad_new_from_static_template (template, template->name_template);
|
||||
|
||||
|
@ -330,35 +350,12 @@ gst_dvdemux_add_pad (GstDVDemux * dvdemux, GstStaticPadTemplate * template,
|
|||
|
||||
gst_element_add_pad (GST_ELEMENT (dvdemux), pad);
|
||||
|
||||
no_more_pads =
|
||||
(dvdemux->videosrcpad != NULL && template == &audio_src_temp) ||
|
||||
(dvdemux->audiosrcpad != NULL && template == &video_src_temp);
|
||||
if (!dvdemux->tag_event) {
|
||||
dvdemux->tag_event = gst_dvdemux_create_global_tag_event (dvdemux);
|
||||
}
|
||||
|
||||
if (no_more_pads)
|
||||
gst_element_no_more_pads (GST_ELEMENT (dvdemux));
|
||||
|
||||
if (no_more_pads) {
|
||||
GstTagList *tags;
|
||||
|
||||
tags = gst_tag_list_new (GST_TAG_CONTAINER_FORMAT, "DV", NULL);
|
||||
gst_tag_list_set_scope (tags, GST_TAG_SCOPE_GLOBAL);
|
||||
|
||||
if (dv_get_recording_datetime (dvdemux->decoder, rec_datetime)) {
|
||||
rec_dt = gst_date_time_new_from_iso8601_string (rec_datetime);
|
||||
if (rec_dt) {
|
||||
gst_tag_list_add (tags, GST_TAG_MERGE_REPLACE, GST_TAG_DATE_TIME,
|
||||
rec_dt, NULL);
|
||||
gst_date_time_unref (rec_dt);
|
||||
}
|
||||
}
|
||||
|
||||
if (dvdemux->videosrcpad)
|
||||
gst_pad_push_event (dvdemux->videosrcpad,
|
||||
gst_event_new_tag (gst_tag_list_ref (tags)));
|
||||
if (dvdemux->audiosrcpad)
|
||||
gst_pad_push_event (dvdemux->audiosrcpad,
|
||||
gst_event_new_tag (gst_tag_list_ref (tags)));
|
||||
gst_tag_list_unref (tags);
|
||||
if (pad && dvdemux->tag_event) {
|
||||
gst_pad_push_event (pad, gst_event_ref (dvdemux->tag_event));
|
||||
}
|
||||
|
||||
return pad;
|
||||
|
@ -1279,6 +1276,10 @@ gst_dvdemux_demux_audio (GstDVDemux * dvdemux, GstBuffer * buffer,
|
|||
if (G_UNLIKELY (dvdemux->audiosrcpad == NULL)) {
|
||||
dvdemux->audiosrcpad =
|
||||
gst_dvdemux_add_pad (dvdemux, &audio_src_temp, caps);
|
||||
|
||||
if (dvdemux->videosrcpad && dvdemux->audiosrcpad)
|
||||
gst_element_no_more_pads (GST_ELEMENT (dvdemux));
|
||||
|
||||
} else {
|
||||
gst_pad_set_caps (dvdemux->audiosrcpad, caps);
|
||||
}
|
||||
|
@ -1309,7 +1310,6 @@ gst_dvdemux_demux_audio (GstDVDemux * dvdemux, GstBuffer * buffer,
|
|||
|
||||
if (dvdemux->new_media || dvdemux->discont)
|
||||
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
|
||||
|
||||
ret = gst_pad_push (dvdemux->audiosrcpad, outbuf);
|
||||
} else {
|
||||
/* no samples */
|
||||
|
@ -1372,6 +1372,10 @@ gst_dvdemux_demux_video (GstDVDemux * dvdemux, GstBuffer * buffer,
|
|||
if (G_UNLIKELY (dvdemux->videosrcpad == NULL)) {
|
||||
dvdemux->videosrcpad =
|
||||
gst_dvdemux_add_pad (dvdemux, &video_src_temp, caps);
|
||||
|
||||
if (dvdemux->videosrcpad && dvdemux->audiosrcpad)
|
||||
gst_element_no_more_pads (GST_ELEMENT (dvdemux));
|
||||
|
||||
} else {
|
||||
gst_pad_set_caps (dvdemux->videosrcpad, caps);
|
||||
}
|
||||
|
@ -2018,6 +2022,12 @@ gst_dvdemux_change_state (GstElement * element, GstStateChange transition)
|
|||
dvdemux->decoder = NULL;
|
||||
|
||||
gst_dvdemux_remove_pads (dvdemux);
|
||||
|
||||
if (dvdemux->tag_event) {
|
||||
gst_event_unref (dvdemux->tag_event);
|
||||
dvdemux->tag_event = NULL;
|
||||
}
|
||||
|
||||
break;
|
||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||
{
|
||||
|
|
|
@ -86,6 +86,7 @@ struct _GstDVDemux {
|
|||
gint found_header; /* ATOMIC */
|
||||
GstEvent *seek_event;
|
||||
GstEvent *pending_segment;
|
||||
GstEvent *tag_event;
|
||||
|
||||
gint16 *audio_buffers[4];
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue