Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/GStreamer/gst-plugins-good.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThiago Santos <thiagoss@osg.samsung.com>2015-07-08 05:53:02 +0300
committerThiago Santos <thiagoss@osg.samsung.com>2015-07-08 17:53:44 +0300
commitee7ddf6c678afb24f5f7419311c9ea461322c9b3 (patch)
treee06224b66a14f08115494956b8ab6850d0a2e02b
parent6ee4b31c0e67af952d8848f67460ba8aae10d2d9 (diff)
qtdemux: flush samples before adding more from moof
Avoids accumulating all samples from a fragmented stream that could lead to a 'index-too-big' error once it goes over 50MB of data. It could reach that before 2h of playback so it doesn't take that long. As upstream elements are providing data in time format they should be the ones that have more information about the full media index and should be able to seek if possible.
-rw-r--r--gst/isomp4/qtdemux.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c
index 8b01973c3..76bac2aac 100644
--- a/gst/isomp4/qtdemux.c
+++ b/gst/isomp4/qtdemux.c
@@ -2166,13 +2166,21 @@ gst_qtdemux_stbl_free (QtDemuxStream * stream)
}
static void
+gst_qtdemux_stream_flush_segments_data (GstQTDemux * qtdemux,
+ QtDemuxStream * stream)
+{
+ g_free (stream->segments);
+ stream->segments = NULL;
+ stream->segment_index = -1;
+ stream->accumulated_base = 0;
+}
+
+static void
gst_qtdemux_stream_flush_samples_data (GstQTDemux * qtdemux,
QtDemuxStream * stream)
{
g_free (stream->samples);
stream->samples = NULL;
- g_free (stream->segments);
- stream->segments = NULL;
gst_qtdemux_stbl_free (stream);
/* fragments */
@@ -2184,8 +2192,6 @@ gst_qtdemux_stream_flush_samples_data (GstQTDemux * qtdemux,
stream->stbl_index = -1;
stream->n_samples = 0;
stream->time_position = 0;
- stream->segment_index = -1;
- stream->accumulated_base = 0;
}
static void
@@ -2210,6 +2216,7 @@ gst_qtdemux_stream_clear (GstQTDemux * qtdemux, QtDemuxStream * stream)
stream->sent_eos = FALSE;
stream->sparse = FALSE;
+ gst_qtdemux_stream_flush_segments_data (qtdemux, stream);
gst_qtdemux_stream_flush_samples_data (qtdemux, stream);
}
@@ -2694,7 +2701,7 @@ qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun,
timestamp = GSTTIME_TO_QTSTREAMTIME (stream, qtdemux->fragment_start);
qtdemux->fragment_start = -1;
} else {
- if (G_UNLIKELY (stream->n_samples == 0)) {
+ if (stream->n_samples == 0) {
if (decode_ts > 0) {
timestamp = decode_ts;
} else if (stream->pending_seek != NULL) {
@@ -3016,6 +3023,10 @@ qtdemux_parse_moof (GstQTDemux * qtdemux, const guint8 * buffer, guint length,
}
if (G_UNLIKELY (base_offset < -1))
goto lost_offset;
+
+ if (qtdemux->upstream_format_is_time)
+ gst_qtdemux_stream_flush_samples_data (qtdemux, stream);
+
/* Track Run node */
trun_node =
qtdemux_tree_get_child_by_type_full (traf_node, FOURCC_trun,
@@ -7821,6 +7832,7 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
}
/* flush samples data from this track from previous moov */
+ gst_qtdemux_stream_flush_segments_data (qtdemux, stream);
gst_qtdemux_stream_flush_samples_data (qtdemux, stream);
}