ext/lame/gstlame.*: On receiving EOS, we try to push a last buffer with the remaining samples. Don't do that if we go...
Original commit message from CVS: * ext/lame/gstlame.c: (gst_lame_sink_event), (gst_lame_chain), (gst_lame_change_state): * ext/lame/gstlame.h: On receiving EOS, we try to push a last buffer with the remaining samples. Don't do that if we got an unclean flow return on the last gst_pad_push(), downstream might not handle this very gracefully (see #403168). * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain): Pass flow returns upstream (helps #403168).
This commit is contained in:
parent
9f8cdabb6c
commit
0d4e832887
13
ChangeLog
13
ChangeLog
@ -1,3 +1,16 @@
|
|||||||
|
2007-02-09 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
|
* ext/lame/gstlame.c: (gst_lame_sink_event), (gst_lame_chain),
|
||||||
|
(gst_lame_change_state):
|
||||||
|
* ext/lame/gstlame.h:
|
||||||
|
On receiving EOS, we try to push a last buffer with the remaining
|
||||||
|
samples. Don't do that if we got an unclean flow return on the last
|
||||||
|
gst_pad_push(), downstream might not handle this very gracefully
|
||||||
|
(see #403168).
|
||||||
|
|
||||||
|
* gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_chain):
|
||||||
|
Pass flow returns upstream (helps #403168).
|
||||||
|
|
||||||
2007-02-09 Stefan Kost <ensonic@users.sf.net>
|
2007-02-09 Stefan Kost <ensonic@users.sf.net>
|
||||||
|
|
||||||
* gst/synaesthesia/gstsynaesthesia.c:
|
* gst/synaesthesia/gstsynaesthesia.c:
|
||||||
|
@ -920,7 +920,7 @@ gst_lame_sink_event (GstPad * pad, GstEvent * event)
|
|||||||
buf = gst_buffer_new_and_alloc (7200);
|
buf = gst_buffer_new_and_alloc (7200);
|
||||||
size = lame_encode_flush (lame->lgf, GST_BUFFER_DATA (buf), 7200);
|
size = lame_encode_flush (lame->lgf, GST_BUFFER_DATA (buf), 7200);
|
||||||
|
|
||||||
if (size > 0) {
|
if (size > 0 && lame->last_flow == GST_FLOW_OK) {
|
||||||
gint64 duration;
|
gint64 duration;
|
||||||
|
|
||||||
duration = gst_util_uint64_scale_int (size, GST_SECOND,
|
duration = gst_util_uint64_scale_int (size, GST_SECOND,
|
||||||
@ -941,7 +941,8 @@ gst_lame_sink_event (GstPad * pad, GstEvent * event)
|
|||||||
gst_buffer_set_caps (buf, GST_PAD_CAPS (lame->srcpad));
|
gst_buffer_set_caps (buf, GST_PAD_CAPS (lame->srcpad));
|
||||||
gst_pad_push (lame->srcpad, buf);
|
gst_pad_push (lame->srcpad, buf);
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (lame, "no final packet (size=%d)", size);
|
GST_DEBUG_OBJECT (lame, "no final packet (size=%d, last_flow=%s)",
|
||||||
|
size, gst_flow_get_name (lame->last_flow));
|
||||||
gst_buffer_unref (buf);
|
gst_buffer_unref (buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1064,6 +1065,7 @@ gst_lame_chain (GstPad * pad, GstBuffer * buf)
|
|||||||
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (lame->srcpad));
|
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (lame->srcpad));
|
||||||
|
|
||||||
result = gst_pad_push (lame->srcpad, outbuf);
|
result = gst_pad_push (lame->srcpad, outbuf);
|
||||||
|
lame->last_flow = result;
|
||||||
if (result != GST_FLOW_OK) {
|
if (result != GST_FLOW_OK) {
|
||||||
GST_DEBUG_OBJECT (lame, "flow return: %s", gst_flow_get_name (result));
|
GST_DEBUG_OBJECT (lame, "flow return: %s", gst_flow_get_name (result));
|
||||||
}
|
}
|
||||||
@ -1201,6 +1203,7 @@ gst_lame_change_state (GstElement * element, GstStateChange transition)
|
|||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
||||||
|
lame->last_flow = GST_FLOW_OK;
|
||||||
lame->last_ts = GST_CLOCK_TIME_NONE;
|
lame->last_ts = GST_CLOCK_TIME_NONE;
|
||||||
lame->eos_ts = GST_CLOCK_TIME_NONE;
|
lame->eos_ts = GST_CLOCK_TIME_NONE;
|
||||||
break;
|
break;
|
||||||
|
@ -93,6 +93,9 @@ struct _GstLame {
|
|||||||
gboolean emphasis;
|
gboolean emphasis;
|
||||||
gint preset;
|
gint preset;
|
||||||
|
|
||||||
|
/* track this so we don't send a last buffer in eos handler after error */
|
||||||
|
GstFlowReturn last_flow;
|
||||||
|
|
||||||
lame_global_flags *lgf;
|
lame_global_flags *lgf;
|
||||||
|
|
||||||
/* time tracker */
|
/* time tracker */
|
||||||
|
@ -319,6 +319,7 @@ gst_mp3parse_sink_event (GstPad * pad, GstEvent * event)
|
|||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_mp3parse_chain (GstPad * pad, GstBuffer * buf)
|
gst_mp3parse_chain (GstPad * pad, GstBuffer * buf)
|
||||||
{
|
{
|
||||||
|
GstFlowReturn flow = GST_FLOW_OK;
|
||||||
GstMPEGAudioParse *mp3parse;
|
GstMPEGAudioParse *mp3parse;
|
||||||
const guchar *data;
|
const guchar *data;
|
||||||
guint32 header;
|
guint32 header;
|
||||||
@ -327,10 +328,9 @@ gst_mp3parse_chain (GstPad * pad, GstBuffer * buf)
|
|||||||
GstClockTime timestamp;
|
GstClockTime timestamp;
|
||||||
guint available;
|
guint available;
|
||||||
|
|
||||||
mp3parse = GST_MP3PARSE (gst_pad_get_parent (pad));
|
mp3parse = GST_MP3PARSE (GST_PAD_PARENT (pad));
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (mp3parse, "received buffer of %d bytes",
|
GST_LOG_OBJECT (mp3parse, "buffer of %d bytes", GST_BUFFER_SIZE (buf));
|
||||||
GST_BUFFER_SIZE (buf));
|
|
||||||
|
|
||||||
timestamp = GST_BUFFER_TIMESTAMP (buf);
|
timestamp = GST_BUFFER_TIMESTAMP (buf);
|
||||||
|
|
||||||
@ -472,7 +472,7 @@ gst_mp3parse_chain (GstPad * pad, GstBuffer * buf)
|
|||||||
|
|
||||||
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mp3parse->srcpad));
|
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mp3parse->srcpad));
|
||||||
|
|
||||||
gst_pad_push (mp3parse->srcpad, outbuf);
|
flow = gst_pad_push (mp3parse->srcpad, outbuf);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG_OBJECT (mp3parse, "skipping buffer of %d bytes",
|
GST_DEBUG_OBJECT (mp3parse, "skipping buffer of %d bytes",
|
||||||
@ -486,11 +486,12 @@ gst_mp3parse_chain (GstPad * pad, GstBuffer * buf)
|
|||||||
gst_adapter_flush (mp3parse->adapter, 1);
|
gst_adapter_flush (mp3parse->adapter, 1);
|
||||||
GST_DEBUG_OBJECT (mp3parse, "wrong header, skipping byte");
|
GST_DEBUG_OBJECT (mp3parse, "wrong header, skipping byte");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (GST_FLOW_IS_FATAL (flow))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_object_unref (mp3parse);
|
return flow;
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
Loading…
x
Reference in New Issue
Block a user