qtdemux: fix buffer leak on eos in push mode

Based on patch by Guillaume Desmottes.

scenario: validate.http.playback.seek_with_stop.raw_h264_1_mp4

https://bugzilla.gnome.org/show_bug.cgi?id=748617
This commit is contained in:
Tim-Philipp Müller 2015-04-30 12:13:59 +01:00
parent 178f0a4522
commit 377c8405aa

View file

@ -5345,7 +5345,6 @@ gst_qtdemux_process_adapter (GstQTDemux * demux, gboolean force)
break; break;
} }
case QTDEMUX_STATE_MOVIE:{ case QTDEMUX_STATE_MOVIE:{
GstBuffer *outbuf;
QtDemuxStream *stream = NULL; QtDemuxStream *stream = NULL;
QtDemuxSample *sample; QtDemuxSample *sample;
int i = -1; int i = -1;
@ -5440,12 +5439,9 @@ gst_qtdemux_process_adapter (GstQTDemux * demux, gboolean force)
sample = &stream->samples[stream->sample_index]; sample = &stream->samples[stream->sample_index];
if (G_LIKELY (!(STREAM_IS_EOS (stream)))) { if (G_LIKELY (!(STREAM_IS_EOS (stream)))) {
outbuf = gst_adapter_take_buffer (demux->adapter, demux->neededbytes);
GST_DEBUG_OBJECT (demux, "stream : %" GST_FOURCC_FORMAT, GST_DEBUG_OBJECT (demux, "stream : %" GST_FOURCC_FORMAT,
GST_FOURCC_ARGS (stream->fourcc)); GST_FOURCC_ARGS (stream->fourcc));
g_return_val_if_fail (outbuf != NULL, GST_FLOW_ERROR);
dts = QTSAMPLE_DTS (stream, sample); dts = QTSAMPLE_DTS (stream, sample);
pts = QTSAMPLE_PTS (stream, sample); pts = QTSAMPLE_PTS (stream, sample);
duration = QTSAMPLE_DUR_DTS (stream, sample, dts); duration = QTSAMPLE_DUR_DTS (stream, sample, dts);
@ -5457,6 +5453,9 @@ gst_qtdemux_process_adapter (GstQTDemux * demux, gboolean force)
GST_DEBUG_OBJECT (demux, "we reached the end of our segment."); GST_DEBUG_OBJECT (demux, "we reached the end of our segment.");
stream->time_position = GST_CLOCK_TIME_NONE; /* this means EOS */ stream->time_position = GST_CLOCK_TIME_NONE; /* this means EOS */
/* skip this data, stream is EOS */
gst_adapter_flush (demux->adapter, demux->neededbytes);
/* check if all streams are eos */ /* check if all streams are eos */
ret = GST_FLOW_EOS; ret = GST_FLOW_EOS;
for (i = 0; i < demux->n_streams; i++) { for (i = 0; i < demux->n_streams; i++) {
@ -5471,6 +5470,14 @@ gst_qtdemux_process_adapter (GstQTDemux * demux, gboolean force)
goto eos; goto eos;
} }
} else { } else {
GstBuffer *outbuf;
outbuf =
gst_adapter_take_buffer (demux->adapter, demux->neededbytes);
/* FIXME: should either be an assert or a plain check */
g_return_val_if_fail (outbuf != NULL, GST_FLOW_ERROR);
ret = gst_qtdemux_decorate_and_push_buffer (demux, stream, outbuf, ret = gst_qtdemux_decorate_and_push_buffer (demux, stream, outbuf,
dts, pts, duration, keyframe, dts, demux->offset); dts, pts, duration, keyframe, dts, demux->offset);
} }