dvdemux->upstream_time_segment = FALSE;
dvdemux->have_group_id = FALSE;
dvdemux->group_id = G_MAXUINT;
+ dvdemux->tag_event = NULL;
}
static gboolean
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);
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 (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->tag_event) {
+ dvdemux->tag_event = gst_dvdemux_create_global_tag_event (dvdemux);
+ }
- 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;
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);
}
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 */
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);
}
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:
{