+static GstMpegtsSCTESpliceComponent *
+_gst_mpegts_scte_splice_component_copy (GstMpegtsSCTESpliceComponent *
+ component)
+{
+ return g_slice_dup (GstMpegtsSCTESpliceComponent, component);
+}
+
+static void
+_gst_mpegts_scte_splice_component_free (GstMpegtsSCTESpliceComponent *
+ component)
+{
+ g_slice_free (GstMpegtsSCTESpliceComponent, component);
+}
+
+G_DEFINE_BOXED_TYPE (GstMpegtsSCTESpliceComponent,
+ gst_mpegts_scte_splice_component,
+ (GBoxedCopyFunc) _gst_mpegts_scte_splice_component_copy,
+ (GFreeFunc) _gst_mpegts_scte_splice_component_free);
+
+static GstMpegtsSCTESpliceComponent *
+_parse_splice_component (GstMpegtsSCTESpliceEvent * event, guint8 ** orig_data,
+ guint8 * end)
+{
+ GstMpegtsSCTESpliceComponent *component =
+ g_slice_new0 (GstMpegtsSCTESpliceComponent);
+ guint8 *data = *orig_data;
+
+ if (data + 1 + 6 > end)
+ goto error;
+
+ component->tag = *data;
+ data += 1;
+
+ if (event->insert_event && event->splice_immediate_flag == 0) {
+ component->splice_time_specified = *data >> 7;
+ if (component->splice_time_specified) {
+ component->splice_time = ((guint64) (*data & 0x01)) << 32;
+ data += 1;
+ component->splice_time += GST_READ_UINT32_BE (data);
+ data += 4;
+ GST_LOG ("component %u splice_time %" G_GUINT64_FORMAT " (%"
+ GST_TIME_FORMAT ")", component->tag, component->splice_time,
+ GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (component->splice_time)));
+ } else {
+ data += 1;
+ }
+ } else if (!event->insert_event) {
+ component->utc_splice_time = GST_READ_UINT32_BE (data);
+ GST_LOG ("component %u utc_splice_time %u", component->tag,
+ component->utc_splice_time);
+ data += 4;
+ }
+
+ *orig_data = data;
+
+ return component;
+
+error:
+ {
+ if (event)
+ _gst_mpegts_scte_splice_event_free (event);
+ return NULL;
+ }
+}
+