subtitleoverlay: Remove some more unneeded segment tracking

This commit is contained in:
Sebastian Dröge 2013-07-23 13:38:33 +02:00
parent 436ea03362
commit e4b1a58675
2 changed files with 0 additions and 190 deletions

View file

@ -605,86 +605,6 @@ _remove_element (GstSubtitleOverlay * self, GstElement ** element)
} }
} }
static gboolean
_pad_query_convert_to_time (GstPad * pad, GstFormat src_format, gint64 src_val,
gint64 * dest_val)
{
GstFormat dest_format;
if (src_val == GST_CLOCK_TIME_NONE) {
*dest_val = GST_CLOCK_TIME_NONE;
return TRUE;
}
dest_format = GST_FORMAT_TIME;
return gst_pad_query_convert (pad, src_format, src_val, dest_format,
dest_val);
}
static void
_generate_update_segment_event (GstPad * pad, GstSegment * segment,
GstEvent ** event1)
{
GstEvent *event;
GstStructure *structure;
GstSegment newsegment;
gboolean use_newseg = FALSE;
gint64 start, stop, base, time, position, duration;
/* always push newsegment with format TIME */
if (segment->format != GST_FORMAT_TIME) {
gboolean res;
GstPad *peer;
peer = gst_pad_get_peer (pad);
if (peer) {
res = _pad_query_convert_to_time (peer, segment->format,
segment->start, &start);
res = res && _pad_query_convert_to_time (peer, segment->format,
segment->stop, &stop);
res = res && _pad_query_convert_to_time (peer, segment->format,
segment->time, &time);
res = res && _pad_query_convert_to_time (peer, segment->format,
segment->base, &base);
res = res && _pad_query_convert_to_time (peer, segment->format,
segment->position, &position);
res = res && _pad_query_convert_to_time (peer, segment->format,
segment->duration, &duration);
if (!res) {
start = 0;
stop = GST_CLOCK_TIME_NONE;
time = 0;
position = 0;
duration = GST_CLOCK_TIME_NONE;
base = 0;
} else {
use_newseg = TRUE;
gst_segment_init (&newsegment, GST_FORMAT_TIME);
newsegment.rate = segment->rate;
newsegment.applied_rate = segment->applied_rate;
newsegment.start = start;
newsegment.stop = stop;
newsegment.time = time;
newsegment.base = base;
newsegment.position = position;
newsegment.duration = duration;
}
gst_object_unref (peer);
}
}
if (use_newseg) {
event = gst_event_new_segment (&newsegment);
} else {
event = gst_event_new_segment (segment);
}
structure = gst_event_writable_structure (event);
gst_structure_id_set (structure, _subtitle_overlay_event_marker_id,
G_TYPE_BOOLEAN, TRUE, NULL);
*event1 = event;
}
static gboolean static gboolean
_setup_passthrough (GstSubtitleOverlay * self) _setup_passthrough (GstSubtitleOverlay * self)
{ {
@ -743,17 +663,6 @@ _setup_passthrough (GstSubtitleOverlay * self)
return FALSE; return FALSE;
} }
/* Send segment to the identity. This is dropped because identity
* is not linked downstream yet */
if (self->video_segment.format != GST_FORMAT_UNDEFINED) {
GstEvent *event1;
_generate_update_segment_event (sink, &self->video_segment, &event1);
GST_DEBUG_OBJECT (self,
"Pushing video segment event: %" GST_PTR_FORMAT, event1);
gst_pad_send_event (sink, event1);
}
/* Link sink ghostpads to identity */ /* Link sink ghostpads to identity */
if (G_UNLIKELY (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST if (G_UNLIKELY (!gst_ghost_pad_set_target (GST_GHOST_PAD_CAST
(self->video_sinkpad), sink))) { (self->video_sinkpad), sink))) {
@ -1404,8 +1313,6 @@ gst_subtitle_overlay_change_state (GstElement * element,
break; break;
case GST_STATE_CHANGE_READY_TO_PAUSED: case GST_STATE_CHANGE_READY_TO_PAUSED:
GST_DEBUG_OBJECT (self, "State change READY->PAUSED"); GST_DEBUG_OBJECT (self, "State change READY->PAUSED");
gst_segment_init (&self->video_segment, GST_FORMAT_UNDEFINED);
gst_segment_init (&self->subtitle_segment, GST_FORMAT_UNDEFINED);
self->fps_n = self->fps_d = 0; self->fps_n = self->fps_d = 0;
@ -1797,14 +1704,6 @@ gst_subtitle_overlay_video_sink_event (GstPad * pad, GstObject * parent,
gboolean ret; gboolean ret;
switch (GST_EVENT_TYPE (event)) { switch (GST_EVENT_TYPE (event)) {
case GST_EVENT_FLUSH_STOP:
{
GST_DEBUG_OBJECT (pad,
"Resetting video segment because of flush-stop event");
gst_segment_init (&self->video_segment, GST_FORMAT_UNDEFINED);
self->fps_n = self->fps_d = 0;
break;
}
case GST_EVENT_CAPS: case GST_EVENT_CAPS:
{ {
GstCaps *caps; GstCaps *caps;
@ -1821,27 +1720,10 @@ gst_subtitle_overlay_video_sink_event (GstPad * pad, GstObject * parent,
ret = gst_pad_event_default (pad, parent, gst_event_ref (event)); ret = gst_pad_event_default (pad, parent, gst_event_ref (event));
if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
GST_DEBUG_OBJECT (pad, "segment event: %" GST_PTR_FORMAT, event);
gst_event_copy_segment (event, &self->video_segment);
if (self->video_segment.format != GST_FORMAT_TIME)
goto invalid_format;
}
done: done:
gst_event_unref (event); gst_event_unref (event);
return ret; return ret;
/* ERRORS */
invalid_format:
{
GST_ERROR_OBJECT (pad, "Segment event in non-time format: %s",
gst_format_get_name (self->video_segment.format));
ret = FALSE;
goto done;
}
} }
static GstFlowReturn static GstFlowReturn
@ -2035,10 +1917,6 @@ gst_subtitle_overlay_subtitle_sink_event (GstPad * pad, GstObject * parent,
break; break;
} }
case GST_EVENT_FLUSH_STOP: case GST_EVENT_FLUSH_STOP:
GST_DEBUG_OBJECT (pad,
"Resetting subtitle segment because of flush-stop");
gst_segment_init (&self->subtitle_segment, GST_FORMAT_UNDEFINED);
/* fall through */
case GST_EVENT_FLUSH_START: case GST_EVENT_FLUSH_START:
case GST_EVENT_SEGMENT: case GST_EVENT_SEGMENT:
case GST_EVENT_EOS: case GST_EVENT_EOS:
@ -2060,72 +1938,6 @@ gst_subtitle_overlay_subtitle_sink_event (GstPad * pad, GstObject * parent,
ret = gst_pad_event_default (pad, parent, gst_event_ref (event)); ret = gst_pad_event_default (pad, parent, gst_event_ref (event));
if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
const GstSegment *eventsegment;
GST_DEBUG_OBJECT (pad, "segment event: %" GST_PTR_FORMAT, event);
gst_event_parse_segment (event, &eventsegment);
if (eventsegment->format == GST_FORMAT_TIME) {
gst_event_copy_segment (event, &self->subtitle_segment);
} else {
GstPad *peer;
gboolean res = FALSE;
gint64 tstart = 0;
gint64 tstop = GST_CLOCK_TIME_NONE;
gint64 tposition = 0;
gint64 tduration = 0;
gint64 ttime = 0;
gint64 tbase = 0;
GstFormat format = eventsegment->format;
GST_DEBUG_OBJECT (pad, "Subtitle newsegment event (%s) not in TIME "
"format, converting", gst_format_get_name (format));
peer = gst_pad_get_peer (pad);
if (peer) {
res =
_pad_query_convert_to_time (peer, format, eventsegment->start,
&tstart);
res = res
&& _pad_query_convert_to_time (peer, format, eventsegment->stop,
&tstop);
res = res
&& _pad_query_convert_to_time (peer, format, eventsegment->position,
&tposition);
res = res
&& _pad_query_convert_to_time (peer, format, eventsegment->base,
&tbase);
res = res
&& _pad_query_convert_to_time (peer, format, eventsegment->time,
&ttime);
res = res
&& _pad_query_convert_to_time (peer, format, eventsegment->duration,
&tduration);
gst_object_unref (peer);
}
if (!res) {
tstart = 0;
tstop = GST_CLOCK_TIME_NONE;
tposition = 0;
tduration = GST_CLOCK_TIME_NONE;
ttime = 0;
tbase = 0;
}
gst_segment_init (&self->subtitle_segment, GST_FORMAT_TIME);
self->subtitle_segment.start = tstart;
self->subtitle_segment.stop = tstop;
self->subtitle_segment.base = tbase;
self->subtitle_segment.time = ttime;
self->subtitle_segment.position = tposition;
self->subtitle_segment.duration = tduration;
}
GST_DEBUG_OBJECT (pad, "New subtitle segment: %" GST_SEGMENT_FORMAT,
&self->subtitle_segment);
}
gst_event_unref (event); gst_event_unref (event);
out: out:

View file

@ -74,14 +74,12 @@ struct _GstSubtitleOverlay
GstPad *video_block_pad; GstPad *video_block_pad;
gulong video_block_id; gulong video_block_id;
gboolean video_sink_blocked; gboolean video_sink_blocked;
GstSegment video_segment;
gint fps_n, fps_d; gint fps_n, fps_d;
GstPad *subtitle_sinkpad; GstPad *subtitle_sinkpad;
GstPad *subtitle_block_pad; GstPad *subtitle_block_pad;
gulong subtitle_block_id; gulong subtitle_block_id;
gboolean subtitle_sink_blocked; gboolean subtitle_sink_blocked;
GstSegment subtitle_segment;
gboolean subtitle_flush; gboolean subtitle_flush;
gboolean subtitle_error; gboolean subtitle_error;