mpegts: Add constructor for dvb service descriptor
authorJesper Larsen <knorr.jesper@gmail.com>
Sat, 22 Feb 2014 15:46:31 +0000 (16:46 +0100)
committerEdward Hervey <bilboed@bilboed.com>
Tue, 25 Feb 2014 13:34:29 +0000 (14:34 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=724981

gst-libs/gst/mpegts/gst-dvb-descriptor.c
gst-libs/gst/mpegts/gst-dvb-descriptor.h

index 89f7ec4..b66409c 100644 (file)
@@ -285,6 +285,76 @@ gst_mpegts_descriptor_parse_dvb_service (const GstMpegTsDescriptor *
   return TRUE;
 }
 
+/**
+ * gst_mpegts_descriptor_from_dvb_service:
+ * @service_type: Service type defined as a #GstMpegTsDVBServiceType
+ * @service_name: (allow-none): Name of the service
+ * @service_provider: (allow-none): Name of the service provider
+ *
+ * Fills a #GstMpegTsDescriptor to be a %GST_MTS_DESC_DVB_SERVICE.
+ * The data field of the #GstMpegTsDescriptor will be allocated,
+ * and transferred to the caller.
+ *
+ * Returns: (transfer full): the #GstMpgTsDescriptor or %NULL on fail
+ */
+GstMpegTsDescriptor *
+gst_mpegts_descriptor_from_dvb_service (GstMpegTsDVBServiceType service_type,
+    const gchar * service_name, const gchar * service_provider)
+{
+  GstMpegTsDescriptor *descriptor;
+  guint8 *conv_provider_name = NULL, *conv_service_name = NULL;
+  gsize provider_size = 0, service_size = 0;
+  guint8 *data;
+
+  if (service_provider) {
+    conv_provider_name = dvb_text_from_utf8 (service_provider, &provider_size);
+
+    if (!conv_provider_name) {
+      GST_WARNING ("Could not find proper encoding for string `%s`",
+          service_provider);
+      return NULL;
+    }
+  }
+
+  if (provider_size >= 256) {
+    g_free (conv_provider_name);
+    g_return_val_if_reached (NULL);
+  }
+
+  if (service_name) {
+    conv_service_name = dvb_text_from_utf8 (service_name, &service_size);
+
+    if (!conv_service_name) {
+      GST_WARNING ("Could not find proper encoding for string `%s`",
+          service_name);
+      return NULL;
+    }
+  }
+
+  if (service_size >= 256) {
+    g_free (conv_provider_name);
+    g_free (conv_service_name);
+    g_return_val_if_reached (NULL);
+  }
+
+  descriptor =
+      _new_descriptor (GST_MTS_DESC_DVB_SERVICE,
+      3 + provider_size + service_size);
+
+  data = descriptor->data + 2;
+  *data++ = service_type;
+  *data++ = provider_size;
+  memcpy (data, conv_provider_name, provider_size);
+  data += provider_size;
+  *data++ = service_size;
+  memcpy (data, conv_service_name, service_size);
+
+  g_free (conv_provider_name);
+  g_free (conv_service_name);
+
+  return descriptor;
+}
+
 /* GST_MTS_DESC_DVB_SHORT_EVENT (0x4D) */
 /**
  * gst_mpegts_descriptor_parse_dvb_short_event:
index 7762fce..931959b 100644 (file)
@@ -290,6 +290,10 @@ gboolean gst_mpegts_descriptor_parse_dvb_service (const GstMpegTsDescriptor *des
                                                  gchar **service_name,
                                                  gchar **provider_name);
 
+GstMpegTsDescriptor *gst_mpegts_descriptor_from_dvb_service (GstMpegTsDVBServiceType service_type,
+                                                            const gchar * service_name,
+                                                            const gchar * service_provider);
+
 /* GST_MTS_DESC_DVB_SHORT_EVENT (0x4D) */
 gboolean gst_mpegts_descriptor_parse_dvb_short_event (const GstMpegTsDescriptor *descriptor,
                                                       gchar **language_code,