From e50c59631d71cae50a23e22a090fc4cea985d558 Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Thu, 16 Dec 2004 12:54:04 +0000 Subject: [PATCH] gst/mpegstream/: Reset on ready. Fixes 160276. Original commit message from CVS: Reviewed by: Ronald S. Bultje * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), (gst_dvd_demux_reset), (gst_dvd_demux_change_state): * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_reset), (gst_mpeg_demux_change_state): Reset on ready. Fixes 160276. --- ChangeLog | 10 ++++++ gst/mpegstream/gstdvddemux.c | 47 +++++++++++++++++++++++++++ gst/mpegstream/gstmpegdemux.c | 60 ++++++++++++++++++++++++++++++++--- 3 files changed, 112 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index a3daa12f66..eb536de82c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2004-12-16 Edward Hervey + + Reviewed by: Ronald S. Bultje + + * gst/mpegstream/gstdvddemux.c: (gst_dvd_demux_class_init), + (gst_dvd_demux_reset), (gst_dvd_demux_change_state): + * gst/mpegstream/gstmpegdemux.c: (gst_mpeg_demux_reset), + (gst_mpeg_demux_change_state): + Reset on ready. Fixes 160276. + 2004-12-16 Sebastien Cote Reviewed by: Ronald S. Bultje diff --git a/gst/mpegstream/gstdvddemux.c b/gst/mpegstream/gstdvddemux.c index f5592bff4f..ba24fca4c2 100644 --- a/gst/mpegstream/gstdvddemux.c +++ b/gst/mpegstream/gstdvddemux.c @@ -159,6 +159,7 @@ static void gst_dvd_demux_set_cur_audio static void gst_dvd_demux_set_cur_subpicture (GstDVDDemux * dvd_demux, gint stream_nr); +static GstElementStateReturn gst_dvd_demux_change_state (GstElement * element); static GstMPEGDemuxClass *parent_class = NULL; @@ -243,6 +244,8 @@ gst_dvd_demux_class_init (GstDVDDemuxClass * klass) mpeg_parse_class = (GstMPEGParseClass *) klass; mpeg_demux_class = (GstMPEGDemuxClass *) klass; + gstelement_class->change_state = gst_dvd_demux_change_state; + mpeg_parse_class->send_discont = gst_dvd_demux_send_discont; mpeg_demux_class->get_audio_stream = gst_dvd_demux_get_audio_stream; @@ -946,6 +949,50 @@ gst_dvd_demux_set_cur_subpicture (GstDVDDemux * dvd_demux, gint stream_nr) } } +static void +gst_dvd_demux_reset (GstDVDDemux * dvd_demux) +{ + int i; + + GST_INFO ("Resetting the dvd demuxer"); + for (i = 0; i < GST_DVD_DEMUX_NUM_SUBPICTURE_STREAMS; i++) { + if (dvd_demux->subpicture_stream[i]) { + gst_element_remove_pad (GST_ELEMENT (dvd_demux), + dvd_demux->subpicture_stream[i]->pad); + g_free (dvd_demux->subpicture_stream[i]); + dvd_demux->subpicture_stream[i] = NULL; + } + dvd_demux->subpicture_time[i] = 0; + } + gst_pad_set_explicit_caps (dvd_demux->cur_video, NULL); + gst_pad_set_explicit_caps (dvd_demux->cur_audio, NULL); + gst_pad_set_explicit_caps (dvd_demux->cur_subpicture, NULL); + + dvd_demux->cur_video_nr = 0; + dvd_demux->cur_audio_nr = 0; + dvd_demux->cur_subpicture_nr = 0; + dvd_demux->mpeg_version = 0; + dvd_demux->last_end_ptm = 0; + + dvd_demux->just_flushed = FALSE; + dvd_demux->discont_time = GST_CLOCK_TIME_NONE; +} + +static GstElementStateReturn +gst_dvd_demux_change_state (GstElement * element) +{ + GstDVDDemux *dvd_demux = GST_DVD_DEMUX (element); + + switch (GST_STATE_TRANSITION (element)) { + case GST_STATE_PAUSED_TO_READY: + gst_dvd_demux_reset (dvd_demux); + break; + default: + break; + } + + return GST_ELEMENT_CLASS (parent_class)->change_state (element); +} gboolean gst_dvd_demux_plugin_init (GstPlugin * plugin) diff --git a/gst/mpegstream/gstmpegdemux.c b/gst/mpegstream/gstmpegdemux.c index 9c17e4ef90..3e4978de6f 100644 --- a/gst/mpegstream/gstmpegdemux.c +++ b/gst/mpegstream/gstmpegdemux.c @@ -1048,17 +1048,67 @@ gst_mpeg_demux_handle_src_event (GstPad * pad, GstEvent * event) return res; } +static void +gst_mpeg_demux_reset (GstMPEGDemux * mpeg_demux) +{ + int i; + + /* Reset the element */ + + GST_INFO ("Resetting the MPEG Demuxer"); + + /* free the streams , remove the pads */ + /* filled in init_stream */ + /* check get_audio/video_stream because it can be derivated */ + for (i = 0; i < GST_MPEG_DEMUX_NUM_VIDEO_STREAMS; i++) + if (mpeg_demux->video_stream[i]) { + gst_element_remove_pad (GST_ELEMENT (mpeg_demux), + mpeg_demux->video_stream[i]->pad); + g_free (mpeg_demux->video_stream[i]); + mpeg_demux->video_stream[i] = NULL; + } + for (i = 0; i < GST_MPEG_DEMUX_NUM_AUDIO_STREAMS; i++) + if (mpeg_demux->audio_stream[i]) { + gst_element_remove_pad (GST_ELEMENT (mpeg_demux), + mpeg_demux->audio_stream[i]->pad); + g_free (mpeg_demux->audio_stream[i]); + mpeg_demux->audio_stream[i] = NULL; + } + for (i = 0; i < GST_MPEG_DEMUX_NUM_PRIVATE_STREAMS; i++) + if (mpeg_demux->private_stream[i]) { + gst_element_remove_pad (GST_ELEMENT (mpeg_demux), + mpeg_demux->private_stream[i]->pad); + g_free (mpeg_demux->private_stream[i]); + mpeg_demux->private_stream[i] = NULL; + } + + mpeg_demux->in_flush = FALSE; + mpeg_demux->header_length = 0; + mpeg_demux->rate_bound = 0; + mpeg_demux->audio_bound = 0; + mpeg_demux->video_bound = 0; + mpeg_demux->fixed = FALSE; + mpeg_demux->constrained = FALSE; + mpeg_demux->audio_lock = FALSE; + mpeg_demux->video_lock = FALSE; + + mpeg_demux->packet_rate_restriction = FALSE; + mpeg_demux->total_size_bound = 0LL; + + mpeg_demux->index = NULL; + + mpeg_demux->adjust = 0; + +} + static GstElementStateReturn gst_mpeg_demux_change_state (GstElement * element) { - /* GstMPEGDemux *mpeg_demux = GST_MPEG_DEMUX (element); */ + GstMPEGDemux *mpeg_demux = GST_MPEG_DEMUX (element); switch (GST_STATE_TRANSITION (element)) { - case GST_STATE_READY_TO_PAUSED: - break; case GST_STATE_PAUSED_TO_READY: - break; - case GST_STATE_READY_TO_NULL: + gst_mpeg_demux_reset (mpeg_demux); break; default: break;