mpegtsdemux: Also parse TOT (Time Offset Section)
authorEdward Hervey <edward.hervey@collabora.co.uk>
Tue, 5 Jun 2012 07:54:53 +0000 (09:54 +0200)
committerEdward Hervey <edward.hervey@collabora.co.uk>
Tue, 5 Jun 2012 08:54:27 +0000 (10:54 +0200)
It's the same as TDT, except with descriptors at the end

gst/mpegtsdemux/mpegtsbase.c
gst/mpegtsdemux/mpegtspacketizer.c
gst/mpegtsdemux/mpegtspacketizer.h

index b6a1530e7e7dda4276d67966dc7aab2e3c44b275..48bba568beae8c65a5107eb3ea7f3267975608e6 100644 (file)
@@ -1200,6 +1200,14 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section)
       else
         res = FALSE;
       break;
+    case TABLE_ID_TIME_OFFSET:
+      /* TOT (Time Offset table) */
+      structure = mpegts_packetizer_parse_tot (base->packetizer, section);
+      if (G_LIKELY (structure))
+        mpegts_base_apply_tdt (base, section->pid, structure);
+      else
+        res = FALSE;
+      break;
     default:
       GST_WARNING ("Unhandled or unknown section type (table_id 0x%02x)",
           section->table_id);
index 5536dbc40f7b1fe530040c8c4aa87462ddfdea07..afe102f693a382fb15e0c2cf8c3f3ba1039486a1 100644 (file)
@@ -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
index b971b357199934714320ac1a17f7215101e5ff09..5d80d3603452b676da04685127897a457a69ec9d 100644 (file)
@@ -212,6 +212,8 @@ GstStructure *mpegts_packetizer_parse_eit (MpegTSPacketizer2 *packetizer,
   MpegTSPacketizerSection *section);
 GstStructure *mpegts_packetizer_parse_tdt (MpegTSPacketizer2 *packetizer,
   MpegTSPacketizerSection *section);
+GstStructure *mpegts_packetizer_parse_tot (MpegTSPacketizer2 *packetizer,
+  MpegTSPacketizerSection *section);
 
 /* Only valid if calculate_offset is TRUE */
 guint mpegts_packetizer_get_seen_pcr (MpegTSPacketizer2 *packetizer);