mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-26 02:00:33 +00:00
gst/flv/gstflvdemux.c: Don't post an error message on the bus if sending EOS downstream didn't work. Fixes bug #550454.
Original commit message from CVS: * gst/flv/gstflvdemux.c: (gst_flv_demux_loop), (gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push), (gst_flv_demux_handle_seek_pull): Don't post an error message on the bus if sending EOS downstream didn't work. Fixes bug #550454. Fix seek event handling to look at the flags of the seek event instead of assuming some random flags, don't send segment-start messages when operating in push mode and push seek events upstream if we couldn't handle them.
This commit is contained in:
parent
46c603da93
commit
b8dff38998
2 changed files with 30 additions and 27 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
2008-10-27 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||||
|
|
||||||
|
* gst/flv/gstflvdemux.c: (gst_flv_demux_loop),
|
||||||
|
(gst_flv_demux_find_offset), (gst_flv_demux_handle_seek_push),
|
||||||
|
(gst_flv_demux_handle_seek_pull):
|
||||||
|
Don't post an error message on the bus if sending EOS downstream
|
||||||
|
didn't work. Fixes bug #550454.
|
||||||
|
|
||||||
|
Fix seek event handling to look at the flags of the seek event
|
||||||
|
instead of assuming some random flags, don't send segment-start
|
||||||
|
messages when operating in push mode and push seek events upstream
|
||||||
|
if we couldn't handle them.
|
||||||
|
|
||||||
2008-10-27 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
2008-10-27 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||||
|
|
||||||
* gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag):
|
* gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag):
|
||||||
|
|
|
@ -583,13 +583,8 @@ pause:
|
||||||
/* normal playback, send EOS to all linked pads */
|
/* normal playback, send EOS to all linked pads */
|
||||||
gst_element_no_more_pads (GST_ELEMENT (demux));
|
gst_element_no_more_pads (GST_ELEMENT (demux));
|
||||||
GST_LOG_OBJECT (demux, "Sending EOS, at end of stream");
|
GST_LOG_OBJECT (demux, "Sending EOS, at end of stream");
|
||||||
if (!gst_flv_demux_push_src_event (demux, gst_event_new_eos ())) {
|
if (!gst_flv_demux_push_src_event (demux, gst_event_new_eos ()))
|
||||||
GST_WARNING_OBJECT (demux, "failed pushing EOS on streams");
|
GST_WARNING_OBJECT (demux, "failed pushing EOS on streams");
|
||||||
GST_ELEMENT_ERROR (demux, STREAM, FAILED,
|
|
||||||
("Internal data stream error."),
|
|
||||||
("Can't push EOS downstream (empty/invalid file "
|
|
||||||
"with no streams/tags ?)"));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GST_ELEMENT_ERROR (demux, STREAM, FAILED,
|
GST_ELEMENT_ERROR (demux, STREAM, FAILED,
|
||||||
|
@ -617,8 +612,10 @@ gst_flv_demux_find_offset (GstFLVDemux * demux, GstSegment * segment)
|
||||||
if (demux->index) {
|
if (demux->index) {
|
||||||
/* Let's check if we have an index entry for that seek time */
|
/* Let's check if we have an index entry for that seek time */
|
||||||
entry = gst_index_get_assoc_entry (demux->index, demux->index_id,
|
entry = gst_index_get_assoc_entry (demux->index, demux->index_id,
|
||||||
GST_INDEX_LOOKUP_BEFORE, GST_ASSOCIATION_FLAG_KEY_UNIT, GST_FORMAT_TIME,
|
GST_INDEX_LOOKUP_BEFORE,
|
||||||
time);
|
(segment->flags & GST_SEEK_FLAG_KEY_UNIT) ?
|
||||||
|
GST_ASSOCIATION_FLAG_KEY_UNIT : GST_ASSOCIATION_FLAG_NONE,
|
||||||
|
GST_FORMAT_TIME, time);
|
||||||
|
|
||||||
if (entry) {
|
if (entry) {
|
||||||
gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &bytes);
|
gst_index_entry_assoc_map (entry, GST_FORMAT_BYTES, &bytes);
|
||||||
|
@ -662,8 +659,8 @@ gst_flv_demux_handle_seek_push (GstFLVDemux * demux, GstEvent * event)
|
||||||
if (format != GST_FORMAT_TIME)
|
if (format != GST_FORMAT_TIME)
|
||||||
goto wrong_format;
|
goto wrong_format;
|
||||||
|
|
||||||
flush = flags & GST_SEEK_FLAG_FLUSH;
|
flush = !!(flags & GST_SEEK_FLAG_FLUSH);
|
||||||
keyframe = flags & GST_SEEK_FLAG_KEY_UNIT;
|
keyframe = !!(flags & GST_SEEK_FLAG_KEY_UNIT);
|
||||||
|
|
||||||
/* Work on a copy until we are sure the seek succeeded. */
|
/* Work on a copy until we are sure the seek succeeded. */
|
||||||
memcpy (&seeksegment, demux->segment, sizeof (GstSegment));
|
memcpy (&seeksegment, demux->segment, sizeof (GstSegment));
|
||||||
|
@ -686,7 +683,7 @@ gst_flv_demux_handle_seek_push (GstFLVDemux * demux, GstEvent * event)
|
||||||
G_GUINT64_FORMAT, offset);
|
G_GUINT64_FORMAT, offset);
|
||||||
ret = gst_pad_push_event (demux->sinkpad,
|
ret = gst_pad_push_event (demux->sinkpad,
|
||||||
gst_event_new_seek (seeksegment.rate, GST_FORMAT_BYTES,
|
gst_event_new_seek (seeksegment.rate, GST_FORMAT_BYTES,
|
||||||
GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET,
|
seeksegment.flags | GST_SEEK_FLAG_ACCURATE, GST_SEEK_TYPE_SET,
|
||||||
offset, GST_SEEK_TYPE_NONE, 0));
|
offset, GST_SEEK_TYPE_NONE, 0));
|
||||||
if (G_UNLIKELY (!ret)) {
|
if (G_UNLIKELY (!ret)) {
|
||||||
GST_WARNING_OBJECT (demux, "upstream seek failed");
|
GST_WARNING_OBJECT (demux, "upstream seek failed");
|
||||||
|
@ -699,13 +696,6 @@ gst_flv_demux_handle_seek_push (GstFLVDemux * demux, GstEvent * event)
|
||||||
/* Ok seek succeeded, take the newly configured segment */
|
/* Ok seek succeeded, take the newly configured segment */
|
||||||
memcpy (demux->segment, &seeksegment, sizeof (GstSegment));
|
memcpy (demux->segment, &seeksegment, sizeof (GstSegment));
|
||||||
|
|
||||||
/* Notify about the start of a new segment */
|
|
||||||
if (demux->segment->flags & GST_SEEK_FLAG_SEGMENT) {
|
|
||||||
gst_element_post_message (GST_ELEMENT (demux),
|
|
||||||
gst_message_new_segment_start (GST_OBJECT (demux),
|
|
||||||
demux->segment->format, demux->segment->last_stop));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Tell all the stream a new segment is needed */
|
/* Tell all the stream a new segment is needed */
|
||||||
{
|
{
|
||||||
demux->audio_need_segment = TRUE;
|
demux->audio_need_segment = TRUE;
|
||||||
|
@ -717,6 +707,9 @@ gst_flv_demux_handle_seek_push (GstFLVDemux * demux, GstEvent * event)
|
||||||
demux->new_seg_event = NULL;
|
demux->new_seg_event = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
gst_event_unref (event);
|
||||||
|
} else {
|
||||||
|
ret = gst_pad_push_event (demux->sinkpad, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -725,7 +718,7 @@ gst_flv_demux_handle_seek_push (GstFLVDemux * demux, GstEvent * event)
|
||||||
wrong_format:
|
wrong_format:
|
||||||
{
|
{
|
||||||
GST_WARNING_OBJECT (demux, "we only support seeking in TIME format");
|
GST_WARNING_OBJECT (demux, "we only support seeking in TIME format");
|
||||||
return FALSE;
|
return gst_pad_push_event (demux->sinkpad, event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -743,11 +736,13 @@ gst_flv_demux_handle_seek_pull (GstFLVDemux * demux, GstEvent * event)
|
||||||
gst_event_parse_seek (event, &rate, &format, &flags,
|
gst_event_parse_seek (event, &rate, &format, &flags,
|
||||||
&start_type, &start, &stop_type, &stop);
|
&start_type, &start, &stop_type, &stop);
|
||||||
|
|
||||||
|
gst_event_unref (event);
|
||||||
|
|
||||||
if (format != GST_FORMAT_TIME)
|
if (format != GST_FORMAT_TIME)
|
||||||
goto wrong_format;
|
goto wrong_format;
|
||||||
|
|
||||||
flush = flags & GST_SEEK_FLAG_FLUSH;
|
flush = !!(flags & GST_SEEK_FLAG_FLUSH);
|
||||||
keyframe = flags & GST_SEEK_FLAG_KEY_UNIT;
|
keyframe = !!(flags & GST_SEEK_FLAG_KEY_UNIT);
|
||||||
|
|
||||||
if (flush) {
|
if (flush) {
|
||||||
/* Flush start up and downstream to make sure data flow and loops are
|
/* Flush start up and downstream to make sure data flow and loops are
|
||||||
|
@ -943,13 +938,8 @@ gst_flv_demux_sink_event (GstPad * pad, GstEvent * event)
|
||||||
gst_index_commit (demux->index, demux->index_id);
|
gst_index_commit (demux->index, demux->index_id);
|
||||||
}
|
}
|
||||||
gst_element_no_more_pads (GST_ELEMENT (demux));
|
gst_element_no_more_pads (GST_ELEMENT (demux));
|
||||||
if (!gst_flv_demux_push_src_event (demux, event)) {
|
if (!gst_flv_demux_push_src_event (demux, event))
|
||||||
GST_WARNING_OBJECT (demux, "failed pushing EOS on streams");
|
GST_WARNING_OBJECT (demux, "failed pushing EOS on streams");
|
||||||
GST_ELEMENT_ERROR (demux, STREAM, FAILED,
|
|
||||||
("Internal data stream error."),
|
|
||||||
("Can't push EOS downstream (empty/invalid file "
|
|
||||||
"with no streams/tags ?)"));
|
|
||||||
}
|
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
break;
|
break;
|
||||||
case GST_EVENT_NEWSEGMENT:
|
case GST_EVENT_NEWSEGMENT:
|
||||||
|
|
Loading…
Reference in a new issue