diff --git a/gst/mpegdemux/mpegtspacketizer.c b/gst/mpegdemux/mpegtspacketizer.c
index a86ef0e..7134ae5 100644
--- a/gst/mpegdemux/mpegtspacketizer.c
+++ b/gst/mpegdemux/mpegtspacketizer.c
@@ -276,49 +276,60 @@ mpegts_packetizer_parse_section_header (MpegTSPacketizer * packetizer,
   data = GST_BUFFER_DATA (section->buffer);
 
   section->table_id = *data++;
-  /* if table_id is 0 (pat) then ignore the subtable extension */
-  if ((data[0] & 0x80) == 0 || section->table_id == 0)
-    section->subtable_extension = 0;
-  else
-    section->subtable_extension = GST_READ_UINT16_BE (data + 2);
 
-  subtable = mpegts_packetizer_stream_subtable_new (section->table_id,
-      section->subtable_extension);
+  /* tables which do not have section_syntax_indicator (e.g. TDT and TOT) set must
+     be treated differently since their structure contains less information */
+  if ((data[0] & 0x80) != 0) {
+    /* if table_id is 0 (pat) then ignore the subtable extension */
+    if ((data[0] & 0x80) == 0 || section->table_id == 0)
+      section->subtable_extension = 0;
+    else
+      section->subtable_extension = GST_READ_UINT16_BE (data + 2);
 
-  subtable_list = g_slist_find_custom (stream->subtables, subtable,
-      mpegts_packetizer_stream_subtable_compare);
-  if (subtable_list) {
-    g_free (subtable);
-    subtable = (MpegTSPacketizerStreamSubtable *) (subtable_list->data);
-  } else {
-    stream->subtables = g_slist_prepend (stream->subtables, subtable);
-  }
+    subtable = mpegts_packetizer_stream_subtable_new (section->table_id,
+        section->subtable_extension);
 
-  section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF;
-  data += 2;
+    subtable_list = g_slist_find_custom (stream->subtables, subtable,
+        mpegts_packetizer_stream_subtable_compare);
+    if (subtable_list) {
+      g_free (subtable);
+      subtable = (MpegTSPacketizerStreamSubtable *) (subtable_list->data);
+    } else {
+      stream->subtables = g_slist_prepend (stream->subtables, subtable);
+    }
 
-  /* skip to the version byte */
-  data += 2;
+    section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF;
+    data += 2;
 
-  tmp = *data++;
-  section->version_number = (tmp >> 1) & 0x1F;
-  section->current_next_indicator = tmp & 0x01;
+    /* skip to the version byte */
+    data += 2;
 
-  if (!section->current_next_indicator)
-    goto not_applicable;
+    tmp = *data++;
+    section->version_number = (tmp >> 1) & 0x1F;
+    section->current_next_indicator = tmp & 0x01;
 
-  /* CRC is at the end of the section */
-  crc_data =
-      GST_BUFFER_DATA (section->buffer) + GST_BUFFER_SIZE (section->buffer) - 4;
-  section->crc = GST_READ_UINT32_BE (crc_data);
+    if (!section->current_next_indicator)
+      goto not_applicable;
 
-  if (section->version_number == subtable->version_number &&
-      section->crc == subtable->crc)
-    goto not_applicable;
+    /* CRC is at the end of the section */
+    crc_data =
+        GST_BUFFER_DATA (section->buffer) + GST_BUFFER_SIZE (section->buffer) - 4;
+    section->crc = GST_READ_UINT32_BE (crc_data);
 
-  subtable->version_number = section->version_number;
-  subtable->crc = section->crc;
-  stream->section_table_id = section->table_id;
+    if (section->version_number == subtable->version_number &&
+        section->crc == subtable->crc)
+      goto not_applicable;
+
+    subtable->version_number = section->version_number;
+    subtable->crc = section->crc;
+    stream->section_table_id = section->table_id;
+  } else {
+    section->section_length = GST_READ_UINT16_BE (data) & 0x0FFF;
+    section->subtable_extension = 0;
+    section->version_number = 0;
+    section->current_next_indicator = 0;
+    stream->section_table_id = section->table_id;
+  }
 
   return TRUE;
 
