mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 12:32:29 +00:00
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:
parent
9b8f87389a
commit
e50c59631d
3 changed files with 112 additions and 5 deletions
10
ChangeLog
10
ChangeLog
|
@ -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>
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue