mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-18 22:36:33 +00:00
ext/ffmpeg/gstffmpegdemux.c: Don't try to use or remove non-existing pads.
Original commit message from CVS: * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_averror), (gst_ffmpegdemux_init), (gst_ffmpegdemux_close), (gst_ffmpegdemux_push_event), (gst_ffmpegdemux_send_event), (gst_ffmpegdemux_src_query), (gst_ffmpegdemux_open), (gst_ffmpegdemux_loop), (gst_ffmpegdemux_sink_activate), (gst_ffmpegdemux_sink_activate_push), (gst_ffmpegdemux_sink_activate_pull): Don't try to use or remove non-existing pads. Use _scale some more. Don't try to do maths with invalid timestamps. Fixes #359545. Prepare for push based scheduling.
This commit is contained in:
parent
ab7a8db4a5
commit
180c69d27d
2 changed files with 54 additions and 15 deletions
14
ChangeLog
14
ChangeLog
|
@ -1,3 +1,17 @@
|
|||
2006-10-04 Wim Taymans <wim@fluendo.com>
|
||||
|
||||
* ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_averror),
|
||||
(gst_ffmpegdemux_init), (gst_ffmpegdemux_close),
|
||||
(gst_ffmpegdemux_push_event), (gst_ffmpegdemux_send_event),
|
||||
(gst_ffmpegdemux_src_query), (gst_ffmpegdemux_open),
|
||||
(gst_ffmpegdemux_loop), (gst_ffmpegdemux_sink_activate),
|
||||
(gst_ffmpegdemux_sink_activate_push),
|
||||
(gst_ffmpegdemux_sink_activate_pull):
|
||||
Don't try to use or remove non-existing pads.
|
||||
Use _scale some more.
|
||||
Don't try to do maths with invalid timestamps. Fixes #359545.
|
||||
Prepare for push based scheduling.
|
||||
|
||||
2006-09-30 Edward Hervey <edward@fluendo.com>
|
||||
|
||||
* ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps):
|
||||
|
|
|
@ -69,6 +69,8 @@ struct _GstFFMpegDemux
|
|||
GstClockTime start_time;
|
||||
GstClockTime duration;
|
||||
|
||||
gboolean seekable;
|
||||
|
||||
gboolean flushing;
|
||||
|
||||
/* segment stuff */
|
||||
|
@ -108,6 +110,8 @@ static void gst_ffmpegdemux_loop (GstPad * pad);
|
|||
static gboolean gst_ffmpegdemux_sink_activate (GstPad * sinkpad);
|
||||
static gboolean
|
||||
gst_ffmpegdemux_sink_activate_pull (GstPad * sinkpad, gboolean active);
|
||||
static gboolean
|
||||
gst_ffmpegdemux_sink_activate_push (GstPad * sinkpad, gboolean active);
|
||||
|
||||
#if 0
|
||||
static gboolean
|
||||
|
@ -128,7 +132,6 @@ gst_ffmpegdemux_averror (gint av_errno)
|
|||
const gchar *message = NULL;
|
||||
|
||||
switch (av_errno) {
|
||||
default:
|
||||
case AVERROR_UNKNOWN:
|
||||
message = "Unknown error";
|
||||
break;
|
||||
|
@ -150,6 +153,9 @@ gst_ffmpegdemux_averror (gint av_errno)
|
|||
case AVERROR_NOTSUPP:
|
||||
message = "Operation not supported";
|
||||
break;
|
||||
default:
|
||||
message = "Unhandled error code received";
|
||||
break;
|
||||
}
|
||||
|
||||
return message;
|
||||
|
@ -227,6 +233,8 @@ gst_ffmpegdemux_init (GstFFMpegDemux * demux)
|
|||
gst_pad_set_activate_function (demux->sinkpad, gst_ffmpegdemux_sink_activate);
|
||||
gst_pad_set_activatepull_function (demux->sinkpad,
|
||||
gst_ffmpegdemux_sink_activate_pull);
|
||||
gst_pad_set_activatepush_function (demux->sinkpad,
|
||||
gst_ffmpegdemux_sink_activate_push);
|
||||
gst_element_add_pad (GST_ELEMENT (demux), demux->sinkpad);
|
||||
|
||||
demux->opened = FALSE;
|
||||
|
@ -256,7 +264,7 @@ gst_ffmpegdemux_close (GstFFMpegDemux * demux)
|
|||
GstFFStream *stream;
|
||||
|
||||
stream = demux->streams[n];
|
||||
if (stream) {
|
||||
if (stream && stream->pad) {
|
||||
gst_element_remove_pad (GST_ELEMENT (demux), stream->pad);
|
||||
g_free (stream);
|
||||
}
|
||||
|
@ -294,7 +302,7 @@ gst_ffmpegdemux_push_event (GstFFMpegDemux * demux, GstEvent * event)
|
|||
for (n = 0; n < MAX_STREAMS; n++) {
|
||||
GstFFStream *s = demux->streams[n];
|
||||
|
||||
if (s) {
|
||||
if (s && s->pad) {
|
||||
gst_event_ref (event);
|
||||
res &= gst_pad_push_event (s->pad, event);
|
||||
}
|
||||
|
@ -606,10 +614,12 @@ gst_ffmpegdemux_send_event (GstElement * element, GstEvent *event)
|
|||
case GST_EVENT_SEEK:
|
||||
GST_OBJECT_LOCK (demux);
|
||||
if (!demux->opened) {
|
||||
GstEvent **event_p = &demux->seek_event;
|
||||
GstEvent **event_p;
|
||||
GST_DEBUG_OBJECT (demux, "caching seek event");
|
||||
event_p = &demux->seek_event;
|
||||
gst_event_replace (event_p, event);
|
||||
GST_OBJECT_UNLOCK (demux);
|
||||
|
||||
res = TRUE;
|
||||
}
|
||||
else {
|
||||
|
@ -659,10 +669,9 @@ gst_ffmpegdemux_src_query (GstPad * pad, GstQuery * query)
|
|||
res = TRUE;
|
||||
break;
|
||||
case GST_FORMAT_DEFAULT:
|
||||
/* FIXME, use _scale */
|
||||
gst_query_set_position (query, GST_FORMAT_DEFAULT,
|
||||
timeposition * avstream->r_frame_rate.num /
|
||||
(GST_SECOND * avstream->r_frame_rate.den));
|
||||
gst_util_uint64_scale (timeposition, avstream->r_frame_rate.num,
|
||||
GST_SECOND * avstream->r_frame_rate.den));
|
||||
res = TRUE;
|
||||
break;
|
||||
case GST_FORMAT_BYTES:
|
||||
|
@ -693,10 +702,9 @@ gst_ffmpegdemux_src_query (GstPad * pad, GstQuery * query)
|
|||
res = TRUE;
|
||||
break;
|
||||
case GST_FORMAT_DEFAULT:
|
||||
/* FIXME, use _scale */
|
||||
gst_query_set_duration (query, GST_FORMAT_DEFAULT,
|
||||
timeduration * avstream->r_frame_rate.num /
|
||||
(GST_SECOND * avstream->r_frame_rate.den));
|
||||
gst_util_uint64_scale (timeduration, avstream->r_frame_rate.num,
|
||||
GST_SECOND * avstream->r_frame_rate.den));
|
||||
res = TRUE;
|
||||
break;
|
||||
case GST_FORMAT_BYTES:
|
||||
|
@ -1006,7 +1014,6 @@ gst_ffmpegdemux_open (GstFFMpegDemux * demux)
|
|||
}
|
||||
|
||||
/* transform some usefull info to GstClockTime and remember */
|
||||
/* FIXME, use start_time */
|
||||
demux->start_time = gst_util_uint64_scale_int (demux->context->start_time,
|
||||
GST_SECOND, AV_TIME_BASE);
|
||||
GST_DEBUG_OBJECT (demux, "start time: %" GST_TIME_FORMAT,
|
||||
|
@ -1139,7 +1146,8 @@ gst_ffmpegdemux_loop (GstPad * pad)
|
|||
if (demux->start_time != -1 && demux->start_time > timestamp)
|
||||
goto drop;
|
||||
|
||||
timestamp -= demux->start_time;
|
||||
if (GST_CLOCK_TIME_IS_VALID (timestamp))
|
||||
timestamp -= demux->start_time;
|
||||
|
||||
/* check if we ran outside of the segment */
|
||||
if (demux->segment.stop != -1 && timestamp > demux->segment.stop)
|
||||
|
@ -1275,14 +1283,29 @@ gst_ffmpegdemux_sink_activate (GstPad * sinkpad)
|
|||
if (gst_pad_check_pull_range (sinkpad))
|
||||
res = gst_pad_activate_pull (sinkpad, TRUE);
|
||||
else {
|
||||
GST_ELEMENT_ERROR (demux, STREAM, NOT_IMPLEMENTED,
|
||||
(NULL),
|
||||
("failed to activate sinkpad in pull mode, push mode not implemented yet"));
|
||||
res = gst_pad_activate_push (sinkpad, TRUE);
|
||||
}
|
||||
gst_object_unref (demux);
|
||||
return res;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_ffmpegdemux_sink_activate_push (GstPad * sinkpad, gboolean active)
|
||||
{
|
||||
GstFFMpegDemux *demux;
|
||||
|
||||
demux = (GstFFMpegDemux *) (gst_pad_get_parent (sinkpad));
|
||||
|
||||
GST_ELEMENT_ERROR (demux, STREAM, NOT_IMPLEMENTED,
|
||||
(NULL),
|
||||
("failed to activate sinkpad in pull mode, push mode not implemented yet"));
|
||||
|
||||
demux->seekable = FALSE;
|
||||
gst_object_unref (demux);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gst_ffmpegdemux_sink_activate_pull (GstPad * sinkpad, gboolean active)
|
||||
{
|
||||
|
@ -1293,11 +1316,13 @@ gst_ffmpegdemux_sink_activate_pull (GstPad * sinkpad, gboolean active)
|
|||
|
||||
if (active) {
|
||||
demux->running = TRUE;
|
||||
demux->seekable = TRUE;
|
||||
res = gst_pad_start_task (sinkpad, (GstTaskFunction) gst_ffmpegdemux_loop,
|
||||
sinkpad);
|
||||
} else {
|
||||
demux->running = FALSE;
|
||||
res = gst_pad_stop_task (sinkpad);
|
||||
demux->seekable = FALSE;
|
||||
}
|
||||
|
||||
gst_object_unref (demux);
|
||||
|
|
Loading…
Reference in a new issue