mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 08:41:07 +00:00
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:
parent
178f0a4522
commit
377c8405aa
1 changed files with 11 additions and 4 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue