mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-16 19:25:18 +00:00
gst-scte-section: implement partial parsing
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>
This commit is contained in:
parent
d17c7f25e6
commit
61fecce193
2 changed files with 31 additions and 9 deletions
|
@ -184,6 +184,8 @@ _parse_sit (GstMpegtsSection * section)
|
||||||
|
|
||||||
sit = g_slice_new0 (GstMpegtsSCTESIT);
|
sit = g_slice_new0 (GstMpegtsSCTESIT);
|
||||||
|
|
||||||
|
sit->fully_parsed = FALSE;
|
||||||
|
|
||||||
data = section->data;
|
data = section->data;
|
||||||
end = data + section->section_length;
|
end = data + section->section_length;
|
||||||
|
|
||||||
|
@ -220,16 +222,22 @@ _parse_sit (GstMpegtsSection * section)
|
||||||
if (sit->splice_command_length == 0xfff)
|
if (sit->splice_command_length == 0xfff)
|
||||||
sit->splice_command_length = 0;
|
sit->splice_command_length = 0;
|
||||||
GST_LOG ("command length %d", sit->splice_command_length);
|
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
|
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",
|
GST_WARNING ("PID %d invalid SCTE SIT splice command length %d",
|
||||||
section->pid, sit->splice_command_length);
|
section->pid, sit->splice_command_length);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sit->splice_command_type = *data;
|
||||||
|
data += 1;
|
||||||
|
|
||||||
sit->splices = g_ptr_array_new_with_free_func ((GDestroyNotify)
|
sit->splices = g_ptr_array_new_with_free_func ((GDestroyNotify)
|
||||||
_gst_mpegts_scte_splice_event_free);
|
_gst_mpegts_scte_splice_event_free);
|
||||||
switch (sit->splice_command_type) {
|
switch (sit->splice_command_type) {
|
||||||
|
@ -264,9 +272,9 @@ _parse_sit (GstMpegtsSection * section)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
GST_ERROR ("Unknown SCTE splice command type (0x%02x) !",
|
GST_WARNING ("Unknown SCTE splice command type (0x%02x) !",
|
||||||
sit->splice_command_type);
|
sit->splice_command_type);
|
||||||
goto error;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* descriptors */
|
/* descriptors */
|
||||||
|
@ -280,7 +288,6 @@ _parse_sit (GstMpegtsSection * section)
|
||||||
}
|
}
|
||||||
data += tmp;
|
data += tmp;
|
||||||
|
|
||||||
|
|
||||||
GST_DEBUG ("%p - %p", data, end);
|
GST_DEBUG ("%p - %p", data, end);
|
||||||
if (data != end - 4) {
|
if (data != end - 4) {
|
||||||
GST_WARNING ("PID %d invalid SIT parsed %d length %d",
|
GST_WARNING ("PID %d invalid SIT parsed %d length %d",
|
||||||
|
@ -288,13 +295,18 @@ _parse_sit (GstMpegtsSection * section)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sit->fully_parsed = TRUE;
|
||||||
|
|
||||||
|
done:
|
||||||
return sit;
|
return sit;
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (sit)
|
if (sit) {
|
||||||
_gst_mpegts_scte_sit_free (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) */
|
/* Set all default values (which aren't already 0/NULL) */
|
||||||
sit->tier = 0xfff;
|
sit->tier = 0xfff;
|
||||||
|
sit->fully_parsed = TRUE;
|
||||||
|
|
||||||
sit->splices = g_ptr_array_new_with_free_func ((GDestroyNotify)
|
sit->splices = g_ptr_array_new_with_free_func ((GDestroyNotify)
|
||||||
_gst_mpegts_scte_splice_event_free);
|
_gst_mpegts_scte_splice_event_free);
|
||||||
|
@ -492,6 +505,11 @@ _packetize_sit (GstMpegtsSection * section)
|
||||||
if (sit == NULL)
|
if (sit == NULL)
|
||||||
return FALSE;
|
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 */
|
/* Skip cases we don't handle for now */
|
||||||
if (sit->encrypted_packet) {
|
if (sit->encrypted_packet) {
|
||||||
GST_WARNING ("SCTE encrypted packet is not supported");
|
GST_WARNING ("SCTE encrypted packet is not supported");
|
||||||
|
|
|
@ -159,7 +159,6 @@ typedef struct _GstMpegtsSCTESIT GstMpegtsSCTESIT;
|
||||||
|
|
||||||
struct _GstMpegtsSCTESIT
|
struct _GstMpegtsSCTESIT
|
||||||
{
|
{
|
||||||
/* Encryption not supported for now */
|
|
||||||
gboolean encrypted_packet;
|
gboolean encrypted_packet;
|
||||||
guint8 encryption_algorithm;
|
guint8 encryption_algorithm;
|
||||||
|
|
||||||
|
@ -168,6 +167,11 @@ struct _GstMpegtsSCTESIT
|
||||||
guint16 tier;
|
guint16 tier;
|
||||||
|
|
||||||
guint16 splice_command_length;
|
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;
|
GstMpegtsSCTESpliceCommandType splice_command_type;
|
||||||
|
|
||||||
/* For time_signal commands */
|
/* For time_signal commands */
|
||||||
|
|
Loading…
Reference in a new issue