Reag the language codes for tracks from the mpegts descriptors and add it into
the pads taglist. --- gst/mpegtsdemux/tsdemux.c | 62 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 3ae47f9..395cba5 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -35,6 +35,7 @@ #include <string.h> #include <glib.h> +#include <gst/tag/tag.h> #include "mpegtsbase.h" #include "tsdemux.h" @@ -153,6 +154,8 @@ struct _TSDemuxStream /* Whether this stream needs to send a newsegment */ gboolean need_newsegment; + + GstTagList *taglist; }; #define VIDEO_CAPS \ @@ -643,6 +646,43 @@ done: return ret; } +static void +gst_ts_demux_create_tags (TSDemuxStream * stream) +{ + guint8 *desc = NULL; + int i; + + desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, + DESC_ISO_639_LANGUAGE); + if (desc) { + if (!stream->taglist) + stream->taglist = gst_tag_list_new (); + + for (i = 0; i < DESC_ISO_639_LANGUAGE_codes_n (desc); i++) { + const gchar *lc; + gchar lang_code[4]; + gchar *language_n; + + language_n = (gchar *) + DESC_ISO_639_LANGUAGE_language_code_nth (desc, i); + + GST_LOG ("Add language code for stream: %s", language_n); + + lang_code[0] = language_n[0]; + lang_code[1] = language_n[1]; + lang_code[2] = language_n[2]; + lang_code[3] = 0; + + /* descriptor contains ISO 639-2 code, we want the ISO 639-1 code */ + lc = gst_tag_get_language_code (lang_code); + gst_tag_list_add (stream->taglist, GST_TAG_MERGE_REPLACE, + GST_TAG_LANGUAGE_CODE, (lc) ? lc : lang_code, NULL); + } + + g_free (desc); + } +} + static GstPad * create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, MpegTSBaseProgram * program) @@ -654,6 +694,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, guint8 *desc = NULL; GstPad *pad = NULL; + gst_ts_demux_create_tags (stream); GST_LOG ("Attempting to create pad for stream 0x%04x with stream_type %d", bstream->pid, bstream->stream_type); @@ -1397,6 +1438,23 @@ gst_ts_demux_queue_data (GstTSDemux * demux, TSDemuxStream * stream, } static void +gst_ts_demux_push_tags (GstTSDemux * demux, TSDemuxStream * stream) +{ + if (stream->taglist) { + gchar *str; + str = gst_structure_to_string ((GstStructure *) stream->taglist); + + GST_DEBUG_OBJECT (demux, "Sending tags %s for pad %s:%s", + str, GST_DEBUG_PAD_NAME (stream->pad)); + gst_element_found_tags_for_pad (GST_ELEMENT (demux), stream->pad, + stream->taglist); + + stream->taglist = NULL; + g_free (str); + } +} + +static void calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream) { MpegTSBase *base = (MpegTSBase *) demux; @@ -1454,6 +1512,8 @@ calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream) demux->segment_event = gst_event_new_new_segment_full (FALSE, 1.0, 1.0, GST_FORMAT_TIME, firstts, GST_CLOCK_TIME_NONE, firstts); + if (!demux->segment_event) + return; GST_EVENT_SRC (demux->segment_event) = gst_object_ref (demux); } @@ -1470,6 +1530,8 @@ push_new_segment: gst_pad_push_event (stream->pad, demux->segment_event); } + gst_ts_demux_push_tags (demux, stream); + stream->need_newsegment = FALSE; } -- 1.7.10 _______________________________________________ gstreamer-devel mailing list [hidden email] http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |