gst-scte-section: implement partial parsing
authorMathieu Duponchelle <mathieu@centricular.com>
Tue, 13 Apr 2021 18:44:54 +0000 (20:44 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Sat, 25 Sep 2021 01:29:37 +0000 (01:29 +0000)
In cases where either the SIT is encrypted, or an unknown
command is encountered, we still want to send an event downstream.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/913>

subprojects/gst-plugins-bad/gst-libs/gst/mpegts/gst-scte-section.c
subprojects/gst-plugins-bad/gst-libs/gst/mpegts/gst-scte-section.h

index 585f288..08f88c5 100644 (file)
@@ -184,6 +184,8 @@ _parse_sit (GstMpegtsSection * section)
 
   sit = g_slice_new0 (GstMpegtsSCTESIT);
 
+  sit->fully_parsed = FALSE;
+
   data = section->data;
   end = data + section->section_length;
 
@@ -220,16 +222,22 @@ _parse_sit (GstMpegtsSection * section)
   if (sit->splice_command_length == 0xfff)
     sit->splice_command_length = 0;
   GST_LOG ("command length %d", sit->splice_command_length);
-  sit->splice_command_type = *data;
-  data += 1;
+
+  if (sit->encrypted_packet) {
+    GST_LOG ("Encrypted SIT, parsed partially");
+    goto done;
+  }
 
   if (sit->splice_command_length
-      && (data + sit->splice_command_length > end - 4)) {
+      && (data + sit->splice_command_length > end - 5)) {
     GST_WARNING ("PID %d invalid SCTE SIT splice command length %d",
         section->pid, sit->splice_command_length);
     goto error;
   }
 
+  sit->splice_command_type = *data;
+  data += 1;
+
   sit->splices = g_ptr_array_new_with_free_func ((GDestroyNotify)
       _gst_mpegts_scte_splice_event_free);
   switch (sit->splice_command_type) {
@@ -264,9 +272,9 @@ _parse_sit (GstMpegtsSection * section)
     }
       break;
     default:
-      GST_ERROR ("Unknown SCTE splice command type (0x%02x) !",
+      GST_WARNING ("Unknown SCTE splice command type (0x%02x) !",
           sit->splice_command_type);
-      goto error;
+      goto done;
   }
 
   /* descriptors */
@@ -280,7 +288,6 @@ _parse_sit (GstMpegtsSection * section)
   }
   data += tmp;
 
-
   GST_DEBUG ("%p - %p", data, end);
   if (data != end - 4) {
     GST_WARNING ("PID %d invalid SIT parsed %d length %d",
@@ -288,13 +295,18 @@ _parse_sit (GstMpegtsSection * section)
     goto error;
   }
 
+  sit->fully_parsed = TRUE;
+
+done:
   return sit;
 
 error:
-  if (sit)
+  if (sit) {
     _gst_mpegts_scte_sit_free (sit);
+    sit = NULL;
+  }
 
-  return NULL;
+  goto done;
 }
 
 /**
@@ -337,6 +349,7 @@ gst_mpegts_scte_sit_new (void)
 
   /* Set all default values (which aren't already 0/NULL) */
   sit->tier = 0xfff;
+  sit->fully_parsed = TRUE;
 
   sit->splices = g_ptr_array_new_with_free_func ((GDestroyNotify)
       _gst_mpegts_scte_splice_event_free);
@@ -492,6 +505,11 @@ _packetize_sit (GstMpegtsSection * section)
   if (sit == NULL)
     return FALSE;
 
+  if (sit->fully_parsed == FALSE) {
+    GST_WARNING ("Attempted to packetize an incompletely parsed SIT");
+    return FALSE;
+  }
+
   /* Skip cases we don't handle for now */
   if (sit->encrypted_packet) {
     GST_WARNING ("SCTE encrypted packet is not supported");
index aff52bc..e77a19d 100644 (file)
@@ -159,7 +159,6 @@ typedef struct _GstMpegtsSCTESIT GstMpegtsSCTESIT;
 
 struct _GstMpegtsSCTESIT
 {
-  /* Encryption not supported for now */
   gboolean encrypted_packet;
   guint8   encryption_algorithm;
 
@@ -168,6 +167,11 @@ struct _GstMpegtsSCTESIT
   guint16  tier;
 
   guint16  splice_command_length;
+
+  /* When encrypted, or when encountering an unknown command type,
+   * we may still want to pass the sit through */
+  gboolean fully_parsed;
+
   GstMpegtsSCTESpliceCommandType splice_command_type;
 
   /* For time_signal commands */