{
GstPad *pad;
+ GstQTDemux *demux;
+
QtDemuxStreamStsdEntry *stsd_entries;
guint stsd_entries_length;
guint cur_stsd_entry_index;
static gboolean qtdemux_parse_samples (GstQTDemux * qtdemux,
QtDemuxStream * stream, guint32 n);
static GstFlowReturn qtdemux_expose_streams (GstQTDemux * qtdemux);
-static void gst_qtdemux_stream_free (GstQTDemux * qtdemux,
- QtDemuxStream * stream);
-static void gst_qtdemux_stream_clear (GstQTDemux * qtdemux,
- QtDemuxStream * stream);
+static void gst_qtdemux_stream_free (QtDemuxStream * stream);
+static void gst_qtdemux_stream_clear (QtDemuxStream * stream);
static void gst_qtdemux_remove_stream (GstQTDemux * qtdemux, int index);
static GstFlowReturn qtdemux_prepare_streams (GstQTDemux * qtdemux);
static void qtdemux_do_allocation (GstQTDemux * qtdemux,
}
static QtDemuxStream *
-_create_stream (void)
+_create_stream (GstQTDemux * demux)
{
QtDemuxStream *stream;
stream = g_new0 (QtDemuxStream, 1);
+ stream->demux = demux;
/* new streams always need a discont */
stream->discont = TRUE;
/* we enable clipping for raw audio/video streams */
/* TODO update when stream changes during playback */
if (demux->n_streams == 0) {
- stream = _create_stream ();
+ stream = _create_stream (demux);
demux->streams[demux->n_streams] = stream;
demux->n_streams = 1;
/* mss has no stsd/stsd entry, use id 0 as default */
if (hard) {
for (n = 0; n < qtdemux->n_streams; n++) {
- gst_qtdemux_stream_free (qtdemux, qtdemux->streams[n]);
+ gst_qtdemux_stream_free (qtdemux->streams[n]);
qtdemux->streams[n] = NULL;
}
qtdemux->n_streams = 0;
} else if (qtdemux->mss_mode) {
gst_flow_combiner_reset (qtdemux->flowcombiner);
for (n = 0; n < qtdemux->n_streams; n++)
- gst_qtdemux_stream_clear (qtdemux, qtdemux->streams[n]);
+ gst_qtdemux_stream_clear (qtdemux->streams[n]);
} else {
gst_flow_combiner_reset (qtdemux->flowcombiner);
for (n = 0; n < qtdemux->n_streams; n++) {
}
static void
-gst_qtdemux_stream_flush_segments_data (GstQTDemux * qtdemux,
- QtDemuxStream * stream)
+gst_qtdemux_stream_flush_segments_data (QtDemuxStream * stream)
{
g_free (stream->segments);
stream->segments = NULL;
}
static void
-gst_qtdemux_stream_flush_samples_data (GstQTDemux * qtdemux,
- QtDemuxStream * stream)
+gst_qtdemux_stream_flush_samples_data (QtDemuxStream * stream)
{
g_free (stream->samples);
stream->samples = NULL;
}
static void
-gst_qtdemux_stream_clear (GstQTDemux * qtdemux, QtDemuxStream * stream)
+gst_qtdemux_stream_clear (QtDemuxStream * stream)
{
gint i;
if (stream->allocator)
g_queue_foreach (&stream->protection_scheme_event_queue,
(GFunc) gst_event_unref, NULL);
g_queue_clear (&stream->protection_scheme_event_queue);
- gst_qtdemux_stream_flush_segments_data (qtdemux, stream);
- gst_qtdemux_stream_flush_samples_data (qtdemux, stream);
+ gst_qtdemux_stream_flush_segments_data (stream);
+ gst_qtdemux_stream_flush_samples_data (stream);
}
static void
-gst_qtdemux_stream_reset (GstQTDemux * qtdemux, QtDemuxStream * stream)
+gst_qtdemux_stream_reset (QtDemuxStream * stream)
{
gint i;
- gst_qtdemux_stream_clear (qtdemux, stream);
+ gst_qtdemux_stream_clear (stream);
for (i = 0; i < stream->stsd_entries_length; i++) {
QtDemuxStreamStsdEntry *entry = &stream->stsd_entries[i];
if (entry->caps) {
static void
-gst_qtdemux_stream_free (GstQTDemux * qtdemux, QtDemuxStream * stream)
+gst_qtdemux_stream_free (QtDemuxStream * stream)
{
- gst_qtdemux_stream_reset (qtdemux, stream);
+ gst_qtdemux_stream_reset (stream);
gst_tag_list_unref (stream->stream_tags);
if (stream->pad) {
- gst_element_remove_pad (GST_ELEMENT_CAST (qtdemux), stream->pad);
- gst_flow_combiner_remove_pad (qtdemux->flowcombiner, stream->pad);
+ GstQTDemux *demux = stream->demux;
+ gst_element_remove_pad (GST_ELEMENT_CAST (demux), stream->pad);
+ gst_flow_combiner_remove_pad (demux->flowcombiner, stream->pad);
}
g_free (stream);
}
{
g_assert (i >= 0 && i < qtdemux->n_streams && qtdemux->streams[i] != NULL);
- gst_qtdemux_stream_free (qtdemux, qtdemux->streams[i]);
+ gst_qtdemux_stream_free (qtdemux->streams[i]);
qtdemux->streams[i] = qtdemux->streams[qtdemux->n_streams - 1];
qtdemux->streams[qtdemux->n_streams - 1] = NULL;
qtdemux->n_streams--;
goto lost_offset;
if (qtdemux->upstream_format_is_time)
- gst_qtdemux_stream_flush_samples_data (qtdemux, stream);
+ gst_qtdemux_stream_flush_samples_data (stream);
/* initialise moof sample data */
stream->n_samples_moof = 0;
if (!is_gap_input && demux->fragmented && demux->segment.rate < 0) {
gst_qtdemux_process_adapter (demux, TRUE);
for (i = 0; i < demux->n_streams; i++)
- gst_qtdemux_stream_flush_samples_data (demux, demux->streams[i]);
+ gst_qtdemux_stream_flush_samples_data (demux->streams[i]);
}
}
if (!qtdemux->got_moov) {
if (qtdemux_find_stream (qtdemux, track_id))
goto existing_stream;
- stream = _create_stream ();
+ stream = _create_stream (qtdemux);
stream->track_id = track_id;
new_stream = TRUE;
} else {
}
/* reset reused stream */
- gst_qtdemux_stream_reset (qtdemux, stream);
+ gst_qtdemux_stream_reset (stream);
}
/* need defaults for fragments */
qtdemux_parse_trex (qtdemux, stream, &dummy, &dummy, &dummy);
stream->duration, stream->timescale, qtdemux->duration,
qtdemux->timescale);
if (new_stream)
- gst_qtdemux_stream_free (qtdemux, stream);
+ gst_qtdemux_stream_free (stream);
return TRUE;
}
}
/* .. but skip stream with empty stsd produced by some Vivotek cameras */
if (stream->subtype == FOURCC_vivo) {
if (new_stream)
- gst_qtdemux_stream_free (qtdemux, stream);
+ gst_qtdemux_stream_free (stream);
return TRUE;
} else {
goto corrupt_file;
{
GST_INFO_OBJECT (qtdemux, "skip disabled track");
if (new_stream)
- gst_qtdemux_stream_free (qtdemux, stream);
+ gst_qtdemux_stream_free (stream);
return TRUE;
}
corrupt_file:
GST_ELEMENT_ERROR (qtdemux, STREAM, DEMUX,
(_("This file is corrupt and cannot be played.")), (NULL));
if (new_stream)
- gst_qtdemux_stream_free (qtdemux, stream);
+ gst_qtdemux_stream_free (stream);
return FALSE;
}
error_encrypted:
{
GST_ELEMENT_ERROR (qtdemux, STREAM, DECRYPT, (NULL), (NULL));
if (new_stream)
- gst_qtdemux_stream_free (qtdemux, stream);
+ gst_qtdemux_stream_free (stream);
return FALSE;
}
samples_failed:
/* free stbl sub-atoms */
gst_qtdemux_stbl_free (stream);
if (new_stream)
- gst_qtdemux_stream_free (qtdemux, stream);
+ gst_qtdemux_stream_free (stream);
return FALSE;
}
existing_stream:
GST_INFO_OBJECT (qtdemux, "stream with track id %i already exists",
track_id);
if (new_stream)
- gst_qtdemux_stream_free (qtdemux, stream);
+ gst_qtdemux_stream_free (stream);
return TRUE;
}
unknown_stream:
GST_INFO_OBJECT (qtdemux, "unknown subtype %" GST_FOURCC_FORMAT,
GST_FOURCC_ARGS (stream->subtype));
if (new_stream)
- gst_qtdemux_stream_free (qtdemux, stream);
+ gst_qtdemux_stream_free (stream);
return TRUE;
}
too_many_streams: