diff options
author | Edward Hervey <edward.hervey@collabora.co.uk> | 2012-06-05 09:54:53 +0200 |
---|---|---|
committer | Edward Hervey <edward.hervey@collabora.co.uk> | 2012-06-05 10:54:27 +0200 |
commit | e2576f0e866bb4d5ba0538f8b1210668f28ae38d (patch) | |
tree | 6a6afc3c62774a8d0495c4db9482cfa20f444d87 /gst/mpegtsdemux/mpegtspacketizer.c | |
parent | d9121c38eaddc7a6bc6e633ac2d47f596ce21008 (diff) | |
download | gstreamer-plugins-bad-e2576f0e866bb4d5ba0538f8b1210668f28ae38d.tar.gz |
mpegtsdemux: Also parse TOT (Time Offset Section)
It's the same as TDT, except with descriptors at the end
Diffstat (limited to 'gst/mpegtsdemux/mpegtspacketizer.c')
-rw-r--r-- | gst/mpegtsdemux/mpegtspacketizer.c | 64 |
1 files changed, 49 insertions, 15 deletions
diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 5536dbc40..afe102f69 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -2175,26 +2175,23 @@ error: return NULL; } -GstStructure * -mpegts_packetizer_parse_tdt (MpegTSPacketizer2 * packetizer, - MpegTSPacketizerSection * section) +static GstStructure * +parse_tdt_tot_common (MpegTSPacketizer2 * packetizer, + MpegTSPacketizerSection * section, const gchar * name) { - GstStructure *tdt = NULL; + GstStructure *res; guint16 mjd; guint year, month, day, hour, minute, second; guint8 *data, *utc_ptr; - GST_DEBUG ("TDT"); - - /* length always 8 */ + /* length at least 8 */ if (section->section_length < 8) { - GST_WARNING ("PID %d invalid TDT size %d", + GST_WARNING ("PID %d invalid TDT/TOT size %d", section->pid, section->section_length); - goto error; + return NULL; } data = section->data; - data += 3; mjd = GST_READ_UINT16_BE (data); @@ -2219,20 +2216,57 @@ mpegts_packetizer_parse_tdt (MpegTSPacketizer2 * packetizer, minute = ((utc_ptr[1] & 0xF0) >> 4) * 10 + (utc_ptr[1] & 0x0F); second = ((utc_ptr[2] & 0xF0) >> 4) * 10 + (utc_ptr[2] & 0x0F); } - tdt = gst_structure_new ("tdt", + res = gst_structure_new (name, "year", G_TYPE_UINT, year, "month", G_TYPE_UINT, month, "day", G_TYPE_UINT, day, "hour", G_TYPE_UINT, hour, "minute", G_TYPE_UINT, minute, "second", G_TYPE_UINT, second, NULL); + return res; +} + +GstStructure * +mpegts_packetizer_parse_tdt (MpegTSPacketizer2 * packetizer, + MpegTSPacketizerSection * section) +{ + GstStructure *tdt = NULL; + GST_DEBUG ("TDT"); + + tdt = parse_tdt_tot_common (packetizer, section, "tdt"); + return tdt; +} -error: - if (tdt) - gst_structure_free (tdt); +GstStructure * +mpegts_packetizer_parse_tot (MpegTSPacketizer2 * packetizer, + MpegTSPacketizerSection * section) +{ + guint8 *data; + GstStructure *tot = NULL; + GValueArray *descriptors; + guint16 desc_len; - return NULL; + GST_DEBUG ("TOT"); + + tot = parse_tdt_tot_common (packetizer, section, "tot"); + data = section->data + 8; + + desc_len = ((*data++) & 0xf) << 8; + desc_len |= *data++; + descriptors = g_value_array_new (0); + + if (!mpegts_packetizer_parse_descriptors (packetizer, &data, data + desc_len, + descriptors)) { + g_value_array_free (descriptors); + gst_structure_free (tot); + return NULL; + } + gst_structure_id_set (tot, QUARK_DESCRIPTORS, G_TYPE_VALUE_ARRAY, descriptors, + NULL); + g_value_array_free (descriptors); + + return tot; } void |