summaryrefslogtreecommitdiffstats
path: root/gst/flv/gstflvdemux.c
diff options
context:
space:
mode:
authorJulien Moutte <julien@moutte.net>2007-07-25 13:29:04 +0000
committerJulien Moutte <julien@moutte.net>2007-07-25 13:29:04 +0000
commit0a10191772eecb23d31c1ac7442a2efc22eff074 (patch)
treef9b4b3b017236426639e71183351f7d17245c339 /gst/flv/gstflvdemux.c
parent3ff914844181a756f4c27ddd6241edb24f860704 (diff)
downloadgst-plugins-bad-0a10191772eecb23d31c1ac7442a2efc22eff074.tar.gz
gst-plugins-bad-0a10191772eecb23d31c1ac7442a2efc22eff074.tar.bz2
gst-plugins-bad-0a10191772eecb23d31c1ac7442a2efc22eff074.zip
gst/flv/: Handle not linked pads, try to make it reusable, more safety checks.
Original commit message from CVS: 2007-07-25 Julien MOUTTE <julien@moutte.net> (gst_flv_demux_chain), (gst_flv_demux_pull_tag), (gst_flv_demux_change_state), (gst_flv_demux_dispose), (gst_flv_demux_init): * gst/flv/gstflvdemux.h: * gst/flv/gstflvparse.c: (FLV_GET_STRING), (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), (gst_flv_parse_tag_video), (gst_flv_parse_header): * gst/flv/gstflvparse.h: Handle not linked pads, try to make it reusable, more safety checks.
Diffstat (limited to 'gst/flv/gstflvdemux.c')
-rw-r--r--gst/flv/gstflvdemux.c74
1 files changed, 66 insertions, 8 deletions
diff --git a/gst/flv/gstflvdemux.c b/gst/flv/gstflvdemux.c
index f91763db..dac3ab0a 100644
--- a/gst/flv/gstflvdemux.c
+++ b/gst/flv/gstflvdemux.c
@@ -74,6 +74,46 @@ static void
gst_flv_demux_cleanup (GstFLVDemux * demux)
{
GST_DEBUG_OBJECT (demux, "cleaning up FLV demuxer");
+
+ demux->state = FLV_STATE_HEADER;
+
+ demux->need_header = TRUE;
+ demux->audio_need_segment = TRUE;
+ demux->video_need_segment = TRUE;
+ demux->audio_need_discont = TRUE;
+ demux->video_need_discont = TRUE;
+
+ /* By default we consider them as linked */
+ demux->audio_linked = TRUE;
+ demux->video_linked = TRUE;
+
+ demux->has_audio = FALSE;
+ demux->has_video = FALSE;
+ demux->push_tags = FALSE;
+
+ demux->video_offset = 0;
+ demux->audio_offset = 0;
+ demux->offset = demux->tag_size = demux->tag_data_size = 0;
+ demux->duration = GST_CLOCK_TIME_NONE;
+
+ if (demux->new_seg_event) {
+ gst_event_unref (demux->new_seg_event);
+ demux->new_seg_event = NULL;
+ }
+
+ gst_adapter_clear (demux->adapter);
+
+ if (demux->audio_pad) {
+ gst_element_remove_pad (GST_ELEMENT (demux), demux->audio_pad);
+ gst_object_unref (demux->audio_pad);
+ demux->audio_pad = NULL;
+ }
+
+ if (demux->video_pad) {
+ gst_element_remove_pad (GST_ELEMENT (demux), demux->video_pad);
+ gst_object_unref (demux->video_pad);
+ demux->video_pad = NULL;
+ }
}
static GstFlowReturn
@@ -177,6 +217,13 @@ parse:
}
beach:
+ if (G_UNLIKELY (ret == GST_FLOW_NOT_LINKED)) {
+ /* If either audio or video is linked we return GST_FLOW_OK */
+ if (demux->audio_linked || demux->video_linked) {
+ ret = GST_FLOW_OK;
+ }
+ }
+
gst_object_unref (demux);
return ret;
@@ -256,6 +303,13 @@ gst_flv_demux_pull_tag (GstPad * pad, GstFLVDemux * demux)
/* Ready for the next tag */
demux->state = FLV_STATE_TAG_TYPE;
+ if (G_UNLIKELY (ret == GST_FLOW_NOT_LINKED)) {
+ /* If either audio or video is linked we return GST_FLOW_OK */
+ if (demux->audio_linked || demux->video_linked) {
+ ret = GST_FLOW_OK;
+ }
+ }
+
beach:
return ret;
}
@@ -547,10 +601,7 @@ gst_flv_demux_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_READY_TO_PAUSED:
- demux->state = FLV_STATE_HEADER;
- demux->need_header = TRUE;
- demux->audio_need_discont = TRUE;
- demux->video_need_discont = TRUE;
+ gst_flv_demux_cleanup (demux);
break;
default:
break;
@@ -599,6 +650,16 @@ gst_flv_demux_dispose (GObject * object)
demux->new_seg_event = NULL;
}
+ if (demux->audio_pad) {
+ gst_object_unref (demux->audio_pad);
+ demux->audio_pad = NULL;
+ }
+
+ if (demux->video_pad) {
+ gst_object_unref (demux->video_pad);
+ demux->video_pad = NULL;
+ }
+
GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
}
@@ -652,10 +713,7 @@ gst_flv_demux_init (GstFLVDemux * demux, GstFLVDemuxClass * g_class)
demux->taglist = gst_tag_list_new ();
gst_segment_init (demux->segment, GST_FORMAT_TIME);
- demux->offset = 0;
-
- demux->strict = FALSE;
- demux->push_tags = FALSE;
+ gst_flv_demux_cleanup (demux);
}
static gboolean