}
GST_DEBUG_OBJECT (avi, "stream name: %s", stream->name);
break;
+ case GST_RIFF_IDIT:
+ gst_avi_demux_parse_idit (avi, sub);
+ break;
default:
if (tag == GST_MAKE_FOURCC ('i', 'n', 'd', 'x') ||
tag == GST_MAKE_FOURCC ('i', 'x', '0' + avi->num_streams / 10,
static guint
gst_avi_demux_index_last (GstAviDemux * avi, GstAviStream * stream)
{
- return stream->idx_n - 1;
+ return stream->idx_n;
}
/* find a previous entry in the index with the given flags */
}
static void
-gst_avi_demux_add_date_tag (GstAviDemux * avi, gint y, gint m, gint d)
+gst_avi_demux_add_date_tag (GstAviDemux * avi, gint y, gint m, gint d,
+ gint h, gint min, gint s)
{
GDate *date;
+ GstDateTime *dt;
+
date = g_date_new_dmy (d, m, y);
if (!g_date_valid (date)) {
/* bogus date */
return;
}
+ dt = gst_date_time_new_local_time (y, m, d, h, min, s);
+
if (avi->globaltags == NULL)
avi->globaltags = gst_tag_list_new ();
gst_tag_list_add (avi->globaltags, GST_TAG_MERGE_REPLACE, GST_TAG_DATE, date,
NULL);
g_date_free (date);
+ if (dt) {
+ gst_tag_list_add (avi->globaltags, GST_TAG_MERGE_REPLACE, GST_TAG_DATE_TIME,
+ dt, NULL);
+ gst_date_time_unref (dt);
+ }
}
static void
GST_WARNING_OBJECT (avi, "Failed to parse IDIT tag");
return;
}
- gst_avi_demux_add_date_tag (avi, y, m, d);
+ gst_avi_demux_add_date_tag (avi, y, m, d, 0, 0, 0);
}
static gint
return;
}
month = get_month_num (monthstr, strlen (monthstr));
- gst_avi_demux_add_date_tag (avi, year, month, day);
+ gst_avi_demux_add_date_tag (avi, year, month, day, hour, min, sec);
}
static void
new_entry = old_entry + 1;
/* see if we reached the end */
- if (new_entry > stream->stop_entry) {
+ if (new_entry >= stream->stop_entry) {
if (avi->segment.rate < 0.0) {
if (stream->step_entry == stream->start_entry) {
/* we stepped all the way to the start, eos */
return;
/* ERRORS */
-pause:
- GST_LOG_OBJECT (avi, "pausing task, reason %s", gst_flow_get_name (res));
- avi->segment_running = FALSE;
- gst_pad_pause_task (avi->sinkpad);
+pause:{
+
+ gboolean push_eos = FALSE;
+ GST_LOG_OBJECT (avi, "pausing task, reason %s", gst_flow_get_name (res));
+ avi->segment_running = FALSE;
+ gst_pad_pause_task (avi->sinkpad);
- if (GST_FLOW_IS_FATAL (res) || (res == GST_FLOW_NOT_LINKED)) {
- gboolean push_eos = TRUE;
if (res == GST_FLOW_UNEXPECTED) {
/* handle end-of-stream/segment */
(GST_ELEMENT_CAST (avi),
gst_message_new_segment_done (GST_OBJECT_CAST (avi),
GST_FORMAT_TIME, stop));
- push_eos = FALSE;
+ } else {
+ push_eos = TRUE;
}
- } else {
- /* for fatal errors we post an error message */
+ } else if (res == GST_FLOW_NOT_LINKED || res < GST_FLOW_UNEXPECTED) {
+ /* for fatal errors we post an error message, wrong-state is
+ * not fatal because it happens due to flushes and only means
+ * that we should stop now. */
GST_ELEMENT_ERROR (avi, STREAM, FAILED,
(_("Internal data stream error.")),
("streaming stopped, reason %s", gst_flow_get_name (res)));
+ push_eos = TRUE;
}
if (push_eos) {
GST_INFO_OBJECT (avi, "sending eos");