+2007-03-09 Tim-Philipp Müller <tim at centricular dot net>
+
+ * ext/pango/gsttextoverlay.c: (gst_text_overlay_text_event),
+ (gst_text_overlay_video_event):
+ Some more logging. Only accept newsegment events in TIME format and
+ send a WARNING message if they are not in TIME format.
+
+ * gst/subparse/gstsubparse.c: (gst_sub_parse_dispose),
+ (gst_sub_parse_init), (gst_sub_parse_src_event), (handle_buffer),
+ (gst_sub_parse_chain), (gst_sub_parse_sink_event):
+ * gst/subparse/gstsubparse.h:
+ No need to allocate GstSegment structure dynamically, just put it
+ into the instance structure; ignore newsegment events in BYTE
+ format and in particular don't let it overwrite our saved TIME
+ segment from the last seek.
+
2007-03-09 Michael Smith <msmith@fluendo.com>
* gst/typefind/gsttypefindfunctions.c: (ac3_type_find):
GST_DEBUG_OBJECT (overlay, "TEXT SEGMENT now: %" GST_SEGMENT_FORMAT,
&overlay->text_segment);
GST_OBJECT_UNLOCK (overlay);
+ } else {
+ GST_ELEMENT_WARNING (overlay, STREAM, MUX, (NULL),
+ ("received non-TIME newsegment event on text input"));
}
+
gst_event_unref (event);
ret = TRUE;
gst_event_parse_new_segment (event, &update, &rate, &format, &start,
&stop, &time);
- /* now copy over the values */
- gst_segment_set_newsegment (overlay->segment, update, rate, format,
- start, stop, time);
+ if (format == GST_FORMAT_TIME) {
+ GST_DEBUG_OBJECT (overlay, "VIDEO SEGMENT now: %" GST_SEGMENT_FORMAT,
+ overlay->segment);
+
+ gst_segment_set_newsegment (overlay->segment, update, rate, format,
+ start, stop, time);
+ } else {
+ GST_ELEMENT_WARNING (overlay, STREAM, MUX, (NULL),
+ ("received non-TIME newsegment event on video input"));
+ }
ret = gst_pad_event_default (pad, event);
break;
break;
default:
ret = gst_pad_event_default (pad, event);
+ break;
}
gst_object_unref (overlay);
GST_DEBUG_OBJECT (subparse, "cleaning up subtitle parser");
- if (subparse->segment) {
- gst_segment_free (subparse->segment);
- subparse->segment = NULL;
- }
if (subparse->encoding) {
g_free (subparse->encoding);
subparse->encoding = NULL;
subparse->textbuf = g_string_new (NULL);
subparse->parser_type = GST_SUB_PARSE_FORMAT_UNKNOWN;
subparse->flushing = FALSE;
- subparse->segment = gst_segment_new ();
- if (subparse->segment) {
- gst_segment_init (subparse->segment, GST_FORMAT_TIME);
- subparse->need_segment = TRUE;
- } else {
- GST_WARNING_OBJECT (subparse, "segment creation failed");
- g_assert_not_reached ();
- }
+ gst_segment_init (&subparse->segment, GST_FORMAT_TIME);
+ subparse->need_segment = TRUE;
subparse->encoding = g_strdup (DEFAULT_ENCODING);
}
if (ret) {
/* Apply the seek to our segment */
- gst_segment_set_seek (self->segment, rate, format, self->segment_flags,
+ gst_segment_set_seek (&self->segment, rate, format, self->segment_flags,
start_type, start, stop_type, stop, &update);
- GST_DEBUG_OBJECT (self, "segment configured from %" GST_TIME_FORMAT
- " to %" GST_TIME_FORMAT ", position %" GST_TIME_FORMAT,
- GST_TIME_ARGS (self->segment->start),
- GST_TIME_ARGS (self->segment->stop),
- GST_TIME_ARGS (self->segment->last_stop));
+ GST_DEBUG_OBJECT (self, "segment after seek: %" GST_SEGMENT_FORMAT,
+ &self->segment);
self->next_offset = 0;
while ((line = get_next_line (self)) && !self->flushing) {
/* Set segment on our parser state machine */
- self->state.segment = self->segment;
+ self->state.segment = &self->segment;
/* Now parse the line, out of segment lines will just return NULL */
GST_LOG_OBJECT (self, "Parsing line '%s'", line);
subtitle = self->parse_line (&self->state, line);
GST_BUFFER_TIMESTAMP (buf) = self->state.start_time;
GST_BUFFER_DURATION (buf) = self->state.duration;
- gst_segment_set_last_stop (self->segment, GST_FORMAT_TIME,
+ gst_segment_set_last_stop (&self->segment, GST_FORMAT_TIME,
self->state.start_time);
GST_DEBUG_OBJECT (self, "Sending text '%s', %" GST_TIME_FORMAT " + %"
/* Push newsegment if needed */
if (self->need_segment) {
+ GST_LOG_OBJECT (self, "pushing newsegment event with %" GST_SEGMENT_FORMAT,
+ &self->segment);
+
gst_pad_push_event (self->srcpad, gst_event_new_new_segment (FALSE,
- self->segment->rate, self->segment->format,
- self->segment->last_stop, self->segment->stop,
- self->segment->time));
+ self->segment.rate, self->segment.format,
+ self->segment.last_stop, self->segment.stop, self->segment.time));
self->need_segment = FALSE;
}
gint64 start, stop, time;
gboolean update;
- GST_DEBUG_OBJECT (self, "received new segment");
-
gst_event_parse_new_segment (event, &update, &rate, &format, &start,
&stop, &time);
- /* now copy over the values */
- gst_segment_set_newsegment (self->segment, update, rate, format,
- start, stop, time);
+ GST_DEBUG_OBJECT (self, "newsegment (%s)", gst_format_get_name (format));
+
+ if (format == GST_FORMAT_TIME) {
+ gst_segment_set_newsegment (&self->segment, update, rate, format,
+ start, stop, time);
+ } else {
+ /* if not time format, we'll either start with a 0 timestamp anyway or
+ * it's following a seek in which case we'll have saved the requested
+ * seek segment and don't want to overwrite it (remember that on a seek
+ * we always just seek back to the start in BYTES format and just throw
+ * away all text that's before the requested position; if the subtitles
+ * come from an upstream demuxer, it won't be able to handle our BYTES
+ * seek request and instead send us a newsegment from the seek request
+ * it received via its video pads instead, so all is fine then too) */
+ }
ret = TRUE;
gst_event_unref (event);