mpegts: add service list descriptor
authorStefan Ringel <linuxtv@stefanringel.de>
Thu, 17 Apr 2014 12:54:28 +0000 (14:54 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Mon, 26 May 2014 09:18:19 +0000 (11:18 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=728364

docs/libs/gst-plugins-bad-libs-sections.txt
gst-libs/gst/mpegts/gst-dvb-descriptor.c
gst-libs/gst/mpegts/gst-dvb-descriptor.h

index d271b36..c1f7216 100644 (file)
@@ -320,6 +320,9 @@ gst_mpegts_descriptor_parse_dvb_parental_rating
 gst_mpegts_descriptor_parse_dvb_stream_identifier
 <SUBSECTION ca_identifier>
 gst_mpegts_descriptor_parse_dvb_ca_identifier
+<SUBSECTION service_list>
+GstMpegTsDVBServiceListItem
+gst_mpegts_descriptor_parse_dvb_service_list
 <SUBSECTION Standard>
 GST_TYPE_MPEG_TSDVB_CODE_RATE
 gst_mpegts_dvb_code_rate_get_type
index 279a9a9..caa593d 100644 (file)
@@ -112,6 +112,53 @@ gst_mpegts_descriptor_from_dvb_network_name (const gchar * name)
   return descriptor;
 }
 
+/* GST_MTS_DESC_DVB_SERVICE_LIST (0x41) */
+static void
+_gst_mpegts_dvb_service_list_item_free (GstMpegTsDVBServiceListItem * item)
+{
+  g_slice_free (GstMpegTsDVBServiceListItem, item);
+}
+
+/**
+ * gst_mpegts_descriptor_parse_dvb_service_list:
+ * @descriptor: a %GST_MTS_DESC_DVB_SERVICE_LIST #GstMpegTsDescriptor
+ * @list: (out) (transfer full) (element-type GstMpegTsDVBServiceListItem):
+ * the list of services
+ *
+ * Parses out a list of services from the @descriptor:
+ *
+ * Returns: %TRUE if the parsing happened correctly, else %FALSE.
+ */
+gboolean
+gst_mpegts_descriptor_parse_dvb_service_list (const GstMpegTsDescriptor *
+    descriptor, GPtrArray ** list)
+{
+  guint8 *data, i;
+
+  g_return_val_if_fail (descriptor != NULL && list != NULL, FALSE);
+  /* a entry has 3 bytes, 2 for service id, 1 for service type */
+  __common_desc_checks (descriptor, GST_MTS_DESC_DVB_SERVICE_LIST, 3, FALSE);
+
+  data = (guint8 *) descriptor->data + 2;
+
+  *list = g_ptr_array_new_with_free_func ((GDestroyNotify)
+      _gst_mpegts_dvb_service_list_item_free);
+
+  for (i = 0; i < descriptor->length - 2; i += 3) {
+    GstMpegTsDVBServiceListItem *item =
+        g_slice_new0 (GstMpegTsDVBServiceListItem);
+
+    g_ptr_array_add (*list, item);
+    item->service_id = GST_READ_UINT16_BE (data);
+    data += 2;
+
+    item->type = *data;
+    data += 1;
+  }
+
+  return TRUE;
+}
+
 /* GST_MTS_DESC_DVB_SATELLITE_DELIVERY_SYSTEM (0x43) */
 /**
  * gst_mpegts_descriptor_parse_satellite_delivery_system:
index c1c0268..3e4f496 100644 (file)
@@ -330,6 +330,23 @@ GstMpegTsDescriptor *gst_mpegts_descriptor_from_dvb_service (GstMpegTsDVBService
                                                             const gchar * service_name,
                                                             const gchar * service_provider);
 
+/* GST_MTS_DESC_DVB_SERVICE_LIST (0x41) */
+typedef struct _GstMpegTsDVBServiceListItem GstMpegTsDVBServiceListItem;
+
+/**
+ * GstMpegTsDVBServiceListItem:
+ * @service_id: the id of a service
+ * @type: the type of a service
+ */
+struct _GstMpegTsDVBServiceListItem
+{
+  guint16                 service_id;
+  GstMpegTsDVBServiceType type;
+};
+
+gboolean gst_mpegts_descriptor_parse_dvb_service_list (const GstMpegTsDescriptor * descriptor,
+    GPtrArray ** list);
+
 /* GST_MTS_DESC_DVB_LINKAGE (0x4A) */
 /**
  * GstMpegTsDVBLinkageType: