mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-26 11:41:09 +00:00
dashdemux2: fix some mpeg-ts issue with no audio output
For dashdemux2, one stream will create one track. Maybe there are multiple tracks in one stream such as some mpeg-ts streams, need add the function to check and create the other tracks if needed. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4706>
This commit is contained in:
parent
fb2b64ea7f
commit
c1a284a221
1 changed files with 60 additions and 8 deletions
|
@ -356,6 +356,8 @@ static void gst_dash_demux_dispose (GObject * obj);
|
||||||
/* GstAdaptiveDemuxStream */
|
/* GstAdaptiveDemuxStream */
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_dash_demux_stream_update_fragment_info (GstAdaptiveDemux2Stream * stream);
|
gst_dash_demux_stream_update_fragment_info (GstAdaptiveDemux2Stream * stream);
|
||||||
|
static void
|
||||||
|
gst_dash_demux_stream_create_tracks (GstAdaptiveDemux2Stream * stream);
|
||||||
static GstClockTime
|
static GstClockTime
|
||||||
gst_dash_demux_stream_get_presentation_offset (GstAdaptiveDemux2Stream *
|
gst_dash_demux_stream_get_presentation_offset (GstAdaptiveDemux2Stream *
|
||||||
stream);
|
stream);
|
||||||
|
@ -497,6 +499,8 @@ gst_dash_demux_stream_class_init (GstDashDemux2StreamClass * klass)
|
||||||
gst_dash_demux_stream_data_received;
|
gst_dash_demux_stream_data_received;
|
||||||
adaptivedemux2stream_class->need_another_chunk =
|
adaptivedemux2stream_class->need_another_chunk =
|
||||||
gst_dash_demux_stream_need_another_chunk;
|
gst_dash_demux_stream_need_another_chunk;
|
||||||
|
adaptivedemux2stream_class->create_tracks =
|
||||||
|
gst_dash_demux_stream_create_tracks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -834,7 +838,7 @@ gst_dash_demux_setup_all_streams (GstDashDemux2 * demux)
|
||||||
GST_DEBUG_OBJECT (demux, "Creating stream objects");
|
GST_DEBUG_OBJECT (demux, "Creating stream objects");
|
||||||
for (i = 0; i < gst_mpd_client2_get_nb_active_stream (demux->client); i++) {
|
for (i = 0; i < gst_mpd_client2_get_nb_active_stream (demux->client); i++) {
|
||||||
GstDashDemux2Stream *stream;
|
GstDashDemux2Stream *stream;
|
||||||
GstAdaptiveDemuxTrack *track;
|
GstAdaptiveDemuxTrack *track = NULL;
|
||||||
GstStreamType streamtype;
|
GstStreamType streamtype;
|
||||||
GstActiveStream *active_stream;
|
GstActiveStream *active_stream;
|
||||||
GstCaps *caps, *codec_caps;
|
GstCaps *caps, *codec_caps;
|
||||||
|
@ -896,13 +900,19 @@ gst_dash_demux_setup_all_streams (GstDashDemux2 * demux)
|
||||||
tags = gst_tag_list_new (GST_TAG_LANGUAGE_NAME, lang, NULL);
|
tags = gst_tag_list_new (GST_TAG_LANGUAGE_NAME, lang, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the track this stream provides */
|
|
||||||
track = gst_adaptive_demux_track_new (GST_ADAPTIVE_DEMUX_CAST (demux),
|
|
||||||
streamtype, GST_STREAM_FLAG_NONE, stream_id, codec_caps, tags);
|
|
||||||
|
|
||||||
stream = gst_dash_demux_stream_new (demux->client->period_idx, stream_id);
|
stream = gst_dash_demux_stream_new (demux->client->period_idx, stream_id);
|
||||||
GST_ADAPTIVE_DEMUX2_STREAM_CAST (stream)->stream_type = streamtype;
|
GST_ADAPTIVE_DEMUX2_STREAM_CAST (stream)->stream_type = streamtype;
|
||||||
|
|
||||||
|
/* Maybe there are multiple tracks in one stream such as some mpeg-ts
|
||||||
|
* streams, need create track by stream->stream_collection lately */
|
||||||
|
if (!codec_caps) {
|
||||||
|
GST_ADAPTIVE_DEMUX2_STREAM_CAST (stream)->pending_tracks = TRUE;
|
||||||
|
} else {
|
||||||
|
/* Create the track this stream provides */
|
||||||
|
track = gst_adaptive_demux_track_new (GST_ADAPTIVE_DEMUX_CAST (demux),
|
||||||
|
streamtype, GST_STREAM_FLAG_NONE, stream_id, codec_caps, tags);
|
||||||
|
}
|
||||||
|
|
||||||
g_free (stream_id);
|
g_free (stream_id);
|
||||||
if (tags)
|
if (tags)
|
||||||
gst_adaptive_demux2_stream_set_tags (GST_ADAPTIVE_DEMUX2_STREAM_CAST
|
gst_adaptive_demux2_stream_set_tags (GST_ADAPTIVE_DEMUX2_STREAM_CAST
|
||||||
|
@ -910,9 +920,11 @@ gst_dash_demux_setup_all_streams (GstDashDemux2 * demux)
|
||||||
|
|
||||||
gst_adaptive_demux2_add_stream (GST_ADAPTIVE_DEMUX_CAST (demux),
|
gst_adaptive_demux2_add_stream (GST_ADAPTIVE_DEMUX_CAST (demux),
|
||||||
GST_ADAPTIVE_DEMUX2_STREAM_CAST (stream));
|
GST_ADAPTIVE_DEMUX2_STREAM_CAST (stream));
|
||||||
gst_adaptive_demux2_stream_add_track (GST_ADAPTIVE_DEMUX2_STREAM_CAST
|
if (track) {
|
||||||
(stream), track);
|
gst_adaptive_demux2_stream_add_track (GST_ADAPTIVE_DEMUX2_STREAM_CAST
|
||||||
stream->track = track;
|
(stream), track);
|
||||||
|
stream->track = track;
|
||||||
|
}
|
||||||
stream->active_stream = active_stream;
|
stream->active_stream = active_stream;
|
||||||
|
|
||||||
if (active_stream->cur_representation) {
|
if (active_stream->cur_representation) {
|
||||||
|
@ -944,6 +956,46 @@ gst_dash_demux_setup_all_streams (GstDashDemux2 * demux)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_dash_demux_stream_create_tracks (GstAdaptiveDemux2Stream * stream)
|
||||||
|
{
|
||||||
|
guint i;
|
||||||
|
gchar *stream_id;
|
||||||
|
|
||||||
|
/* Use the stream->stream_collection to check and
|
||||||
|
* create the track which has not yet been created */
|
||||||
|
for (i = 0; i < gst_stream_collection_get_size (stream->stream_collection);
|
||||||
|
i++) {
|
||||||
|
GstStream *gst_stream =
|
||||||
|
gst_stream_collection_get_stream (stream->stream_collection, i);
|
||||||
|
GstStreamType stream_type = gst_stream_get_stream_type (gst_stream);
|
||||||
|
GstAdaptiveDemuxTrack *track;
|
||||||
|
GstTagList *tags = gst_stream_get_tags (gst_stream);
|
||||||
|
GstCaps *caps = gst_stream_get_caps (gst_stream);
|
||||||
|
|
||||||
|
if (stream_type == GST_STREAM_TYPE_UNKNOWN)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (stream, "create track type %d of the stream",
|
||||||
|
stream_type);
|
||||||
|
stream->stream_type |= stream_type;
|
||||||
|
stream_id =
|
||||||
|
g_strdup_printf ("%s-%d", gst_stream_type_get_name (stream_type), i);
|
||||||
|
/* Create the track this stream provides */
|
||||||
|
track = gst_adaptive_demux_track_new (stream->demux,
|
||||||
|
stream_type, GST_STREAM_FLAG_NONE, stream_id, caps, tags);
|
||||||
|
g_free (stream_id);
|
||||||
|
|
||||||
|
track->upstream_stream_id =
|
||||||
|
g_strdup (gst_stream_get_stream_id (gst_stream));
|
||||||
|
gst_adaptive_demux2_stream_add_track (stream, track);
|
||||||
|
gst_adaptive_demux_track_unref (track);
|
||||||
|
|
||||||
|
if (tags)
|
||||||
|
gst_tag_list_unref (tags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_dash_demux_send_content_protection_event (gpointer data, gpointer userdata)
|
gst_dash_demux_send_content_protection_event (gpointer data, gpointer userdata)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue