gst/mpegstream/: Reset on ready. Fixes 160276.

Original commit message from CVS:
Reviewed by:  Ronald S. Bultje  <rbultje@ronald.bitfreak.net>
* 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.
This commit is contained in:
Ronald S. Bultje 2004-12-16 12:54:04 +00:00
parent 9b8f87389a
commit e50c59631d
3 changed files with 112 additions and 5 deletions

View file

@ -1,3 +1,13 @@
2004-12-16 Edward Hervey <bilboed@bilboed.com>
Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>
* 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 <sc5@hermes.usherb.ca>
Reviewed by: Ronald S. Bultje <rbultje@ronald.bitfreak.net>

View file

@ -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)

View file

@ -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;