mpegts: change to GType and from gchar[] to gchar*
authorStefan Ringel <linuxtv@stefanringel.de>
Sun, 1 Jun 2014 08:44:23 +0000 (10:44 +0200)
committerEdward Hervey <bilboed@bilboed.com>
Tue, 24 Jun 2014 14:06:01 +0000 (16:06 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=730914

gst-libs/gst/mpegts/gst-dvb-descriptor.c
gst-libs/gst/mpegts/gst-dvb-descriptor.h
gst-libs/gst/mpegts/gstmpegts-private.h
gst-libs/gst/mpegts/gstmpegtsdescriptor.c
gst-libs/gst/mpegts/gstmpegtsdescriptor.h
gst/mpegtsdemux/tsdemux.c
tests/examples/mpegts/ts-parser.c

index dd8ffce..92df085 100644 (file)
@@ -162,7 +162,7 @@ gst_mpegts_descriptor_parse_dvb_service_list (const GstMpegTsDescriptor *
 /**
  * gst_mpegts_descriptor_parse_dvb_stuffing:
  * @descriptor: a %GST_MTS_DESC_DVB_STUFFING #GstMpegTsDescriptor
- * @stuffing_bytes: (out): the stuffing bytes
+ * @stuffing_bytes: (out) (transfer full): the stuffing bytes
  *
  * Parses out the stuffing bytes from the @descriptor.
  *
@@ -283,7 +283,6 @@ gst_mpegts_descriptor_parse_satellite_delivery_system (const GstMpegTsDescriptor
       break;
   }
 
-
   return TRUE;
 }
 
@@ -529,6 +528,61 @@ beach:
 }
 
 /* GST_MTS_DESC_DVB_LINKAGE (0x4A) */
+static GstMpegTsDVBLinkageDescriptor *
+_gst_mpegts_dvb_linkage_descriptor_copy (GstMpegTsDVBLinkageDescriptor * source)
+{
+  GstMpegTsDVBLinkageDescriptor *copy;
+
+  copy = g_slice_dup (GstMpegTsDVBLinkageDescriptor, source);
+
+  switch (source->linkage_type) {
+    case GST_MPEGTS_DVB_LINKAGE_MOBILE_HAND_OVER:
+      copy->linkage_data = g_slice_dup (GstMpegTsDVBLinkageMobileHandOver,
+          source->linkage_data);
+      break;
+    case GST_MPEGTS_DVB_LINKAGE_EVENT:
+      copy->linkage_data = g_slice_dup (GstMpegTsDVBLinkageEvent,
+          source->linkage_data);
+      break;
+    case GST_MPEGTS_DVB_LINKAGE_EXTENDED_EVENT:
+      copy->linkage_data = g_ptr_array_ref (source->linkage_data);
+      break;
+    default:
+      break;
+  }
+
+  copy->private_data_bytes = g_slice_copy (source->private_data_length,
+      source->private_data_bytes);
+
+  return copy;
+}
+
+void
+gst_mpegts_dvb_linkage_descriptor_free (GstMpegTsDVBLinkageDescriptor * source)
+{
+  switch (source->linkage_type) {
+    case GST_MPEGTS_DVB_LINKAGE_MOBILE_HAND_OVER:
+      g_slice_free (GstMpegTsDVBLinkageMobileHandOver, source->linkage_data);
+      break;
+    case GST_MPEGTS_DVB_LINKAGE_EVENT:
+      g_slice_free (GstMpegTsDVBLinkageEvent, source->linkage_data);
+      break;
+    case GST_MPEGTS_DVB_LINKAGE_EXTENDED_EVENT:
+      g_ptr_array_unref (source->linkage_data);
+      break;
+    default:
+      break;
+  }
+
+  g_slice_free1 (source->private_data_length, source->private_data_bytes);
+  g_slice_free (GstMpegTsDVBLinkageDescriptor, source);
+}
+
+G_DEFINE_BOXED_TYPE (GstMpegTsDVBLinkageDescriptor,
+    gst_mpegts_dvb_linkage_descriptor,
+    (GBoxedCopyFunc) _gst_mpegts_dvb_linkage_descriptor_copy,
+    (GFreeFunc) gst_mpegts_dvb_linkage_descriptor_free);
+
 static void
 _gst_mpegts_dvb_linkage_extened_event_free (GstMpegTsDVBLinkageExtendedEvent *
     item)
@@ -539,7 +593,7 @@ _gst_mpegts_dvb_linkage_extened_event_free (GstMpegTsDVBLinkageExtendedEvent *
 /**
  * gst_mpegts_descriptor_parse_dvb_linkage:
  * @descriptor: a %GST_MTS_DESC_DVB_LINKAGE #GstMpegTsDescriptor
- * @res: (out) (transfer none): the #GstMpegTsDVBLinkageDescriptor to fill
+ * @res: (out) (transfer full): the #GstMpegTsDVBLinkageDescriptor to fill
  *
  * Extracts the DVB linkage information from @descriptor.
  *
@@ -547,17 +601,20 @@ _gst_mpegts_dvb_linkage_extened_event_free (GstMpegTsDVBLinkageExtendedEvent *
  */
 gboolean
 gst_mpegts_descriptor_parse_dvb_linkage (const GstMpegTsDescriptor * descriptor,
-    GstMpegTsDVBLinkageDescriptor * res)
+    GstMpegTsDVBLinkageDescriptor ** desc)
 {
   guint i;
   guint8 *data, *end;
+  GstMpegTsDVBLinkageDescriptor *res;
 
-  g_return_val_if_fail (descriptor != NULL && res != NULL, FALSE);
+  g_return_val_if_fail (descriptor != NULL && desc != NULL, FALSE);
   __common_desc_checks (descriptor, GST_MTS_DESC_DVB_LINKAGE, 7, FALSE);
 
   data = (guint8 *) descriptor->data + 2;
   end = data + descriptor->length;
 
+  res = g_slice_new0 (GstMpegTsDVBLinkageDescriptor);
+
   res->transport_stream_id = GST_READ_UINT16_BE (data);
   data += 2;
 
@@ -700,6 +757,8 @@ gst_mpegts_descriptor_parse_dvb_linkage (const GstMpegTsDescriptor * descriptor,
   res->private_data_length = end - data;
   res->private_data_bytes = g_memdup (data, res->private_data_length);
 
+  *desc = res;
+
   return TRUE;
 
 fail:
@@ -732,10 +791,9 @@ gst_mpegts_descriptor_parse_dvb_short_event (const GstMpegTsDescriptor *
 
   data = (guint8 *) descriptor->data + 2;
 
-  if (language_code) {
-    *language_code = g_malloc0 (4);
-    memcpy (*language_code, data, 3);
-  }
+  if (language_code)
+    *language_code = convert_lang_code (data);
+
   data += 3;
   if (event_name)
     *event_name = get_encoding_and_convert ((const gchar *) data + 1, *data);
@@ -750,7 +808,7 @@ gst_mpegts_descriptor_parse_dvb_short_event (const GstMpegTsDescriptor *
  * gst_mpegts_descriptor_parse_dvb_teletext_idx:
  * @descriptor: a %GST_MTS_DESC_DVB_TELETEXT #GstMpegTsDescriptor
  * @idx: The id of the teletext to get
- * @language_code: (out) (allow-none): a 4-byte gchar array to hold language
+ * @language_code: (out) (transfer full) (allow-none): a null-terminated string
  * @teletext_type: (out) (allow-none): #GstMpegTsDVBTeletextType
  * @magazine_number: (out) (allow-none):
  * @page_number: (out) (allow-none):
@@ -761,7 +819,7 @@ gst_mpegts_descriptor_parse_dvb_short_event (const GstMpegTsDescriptor *
  */
 gboolean
 gst_mpegts_descriptor_parse_dvb_teletext_idx (const GstMpegTsDescriptor *
-    descriptor, guint idx, gchar (*language_code)[4],
+    descriptor, guint idx, gchar ** language_code,
     GstMpegTsDVBTeletextType * teletext_type, guint8 * magazine_number,
     guint8 * page_number)
 {
@@ -775,10 +833,8 @@ gst_mpegts_descriptor_parse_dvb_teletext_idx (const GstMpegTsDescriptor *
 
   data = (guint8 *) descriptor->data + 2 + idx * 5;
 
-  if (language_code) {
-    memcpy (language_code, data, 3);
-    (*language_code)[3] = 0;
-  }
+  if (language_code)
+    *language_code = convert_lang_code (data);
 
   if (teletext_type)
     *teletext_type = data[3] >> 3;
@@ -816,7 +872,7 @@ gst_mpegts_descriptor_parse_dvb_teletext_nb (const GstMpegTsDescriptor *
  * gst_mpegts_descriptor_parse_dvb_subtitling_idx:
  * @descriptor: a %GST_MTS_DESC_DVB_SUBTITLING #GstMpegTsDescriptor
  * @idx: Table id of the entry to parse
- * @lang: (out) (transfer none): 4-byte gchar array to hold the language code
+ * @lang: (out) (transfer full): the language code
  * @type: (out) (transfer none) (allow-none): the type of subtitling
  * @composition_page_id: (out) (transfer none) (allow-none): the composition page id
  * @ancillary_page_id: (out) (transfer none) (allow-none): the ancillary page id
@@ -830,7 +886,7 @@ gst_mpegts_descriptor_parse_dvb_teletext_nb (const GstMpegTsDescriptor *
  */
 gboolean
 gst_mpegts_descriptor_parse_dvb_subtitling_idx (const GstMpegTsDescriptor *
-    descriptor, guint idx, gchar (*lang)[4], guint8 * type,
+    descriptor, guint idx, gchar ** lang, guint8 * type,
     guint16 * composition_page_id, guint16 * ancillary_page_id)
 {
   guint8 *data;
@@ -844,8 +900,7 @@ gst_mpegts_descriptor_parse_dvb_subtitling_idx (const GstMpegTsDescriptor *
 
   data = (guint8 *) descriptor->data + 2 + idx * 8;
 
-  memcpy (lang, data, 3);
-  (*lang)[3] = 0;
+  *lang = convert_lang_code (data);
 
   data += 3;
 
@@ -911,17 +966,45 @@ gst_mpegts_descriptor_from_dvb_subtitling (const gchar * lang,
 }
 
 /* GST_MTS_DESC_DVB_EXTENDED_EVENT (0x4E) */
+static GstMpegTsExtendedEventDescriptor *
+_gst_mpegts_extended_event_descriptor_copy (GstMpegTsExtendedEventDescriptor *
+    source)
+{
+  GstMpegTsExtendedEventDescriptor *copy;
+
+  copy = g_slice_dup (GstMpegTsExtendedEventDescriptor, source);
+  copy->items = g_ptr_array_ref (source->items);
+  copy->text = g_slice_copy (sizeof (source->text), source->text);
+
+  return copy;
+}
+
+void
+gst_mpegts_extended_event_descriptor_free (GstMpegTsExtendedEventDescriptor *
+    source)
+{
+  g_free (source->text);
+  g_ptr_array_unref (source->items);
+  g_slice_free (GstMpegTsExtendedEventDescriptor, source);
+}
+
+G_DEFINE_BOXED_TYPE (GstMpegTsExtendedEventDescriptor,
+    gst_mpegts_extended_event_descriptor,
+    (GBoxedCopyFunc) _gst_mpegts_extended_event_descriptor_copy,
+    (GFreeFunc) gst_mpegts_extended_event_descriptor_free);
 
 static void
 _gst_mpegts_extended_event_item_free (GstMpegTsExtendedEventItem * item)
 {
+  g_free (item->item);
+  g_free (item->item_description);
   g_slice_free (GstMpegTsExtendedEventItem, item);
 }
 
 /**
  * gst_mpegts_descriptor_parse_dvb_extended_event:
  * @descriptor: a %GST_MTS_DESC_DVB_EXTENDED_EVENT #GstMpegTsDescriptor
- * @res: (out) (transfer none): the #GstMpegTsExtendedEventDescriptor to fill
+ * @res: (out) (transfer full): the #GstMpegTsExtendedEventDescriptor to fill
  *
  * Extracts the DVB extended event information from @descriptor.
  *
@@ -929,16 +1012,19 @@ _gst_mpegts_extended_event_item_free (GstMpegTsExtendedEventItem * item)
  */
 gboolean
 gst_mpegts_descriptor_parse_dvb_extended_event (const GstMpegTsDescriptor
-    * descriptor, GstMpegTsExtendedEventDescriptor * res)
+    * descriptor, GstMpegTsExtendedEventDescriptor ** desc)
 {
   guint8 *data, *pdata;
   guint8 tmp, len_item;
   GstMpegTsExtendedEventItem *item;
+  GstMpegTsExtendedEventDescriptor *res;
 
-  g_return_val_if_fail (descriptor != NULL && res != NULL, FALSE);
+  g_return_val_if_fail (descriptor != NULL && desc != NULL, FALSE);
   /* Need at least 6 bytes (1 for desc number, 3 for language code, 2 for the loop length) */
   __common_desc_checks (descriptor, GST_MTS_DESC_DVB_EXTENDED_EVENT, 6, FALSE);
 
+  res = g_slice_new0 (GstMpegTsExtendedEventDescriptor);
+
   data = (guint8 *) descriptor->data + 2;
 
   tmp = *data;
@@ -947,14 +1033,14 @@ gst_mpegts_descriptor_parse_dvb_extended_event (const GstMpegTsDescriptor
 
   data += 1;
 
-  memcpy (res->language_code, data, 3);
-  res->language_code[3] = 0;
-
+  res->language_code = convert_lang_code (data);
   data += 3;
 
   len_item = *data;
-  if (len_item > descriptor->length - 5)
+  if (len_item > descriptor->length - 5) {
+    gst_mpegts_extended_event_descriptor_free (res);
     return FALSE;
+  }
 
   data += 1;
 
@@ -975,30 +1061,64 @@ gst_mpegts_descriptor_parse_dvb_extended_event (const GstMpegTsDescriptor
 
     g_ptr_array_add (res->items, item);
   }
-  if (pdata != data)
+  if (pdata != data) {
+    gst_mpegts_extended_event_descriptor_free (res);
     return FALSE;
+  }
   res->text = get_encoding_and_convert ((const gchar *) data + 1, *data);
 
+  *desc = res;
+
   return TRUE;
 }
 
 /* GST_MTS_DESC_DVB_COMPONENT (0x50) */
+static GstMpegTsComponentDescriptor *
+_gst_mpegts_dvb_component_descriptor_copy (GstMpegTsComponentDescriptor *
+    source)
+{
+  GstMpegTsComponentDescriptor *copy;
+
+  copy = g_slice_dup (GstMpegTsComponentDescriptor, source);
+  copy->language_code = g_strdup (source->language_code);
+  copy->text = g_strdup (source->text);
+
+  return copy;
+}
+
+void
+gst_mpegts_dvb_component_descriptor_free (GstMpegTsComponentDescriptor * source)
+{
+  if (source->language_code)
+    g_free (source->language_code);
+
+  if (source->text)
+    g_free (source->text);
+
+  g_slice_free (GstMpegTsComponentDescriptor, source);
+}
+
+G_DEFINE_BOXED_TYPE (GstMpegTsComponentDescriptor,
+    gst_mpegts_component_descriptor,
+    (GBoxedCopyFunc) _gst_mpegts_dvb_component_descriptor_copy,
+    (GFreeFunc) gst_mpegts_dvb_component_descriptor_free);
+
 /**
  * gst_mpegts_descriptor_parse_dvb_component:
  * @descriptor: a %GST_MTS_DESC_DVB_COMPONENT #GstMpegTsDescriptor
- * @res: (out) (transfer none): the #GstMpegTsComponentDescriptor to fill
+ * @res: (out) (transfer full): the #GstMpegTsComponentDescriptor to fill
  *
  * Extracts the DVB component information from @descriptor.
  *
  * Returns: %TRUE if parsing succeeded, else %FALSE.
  */
-
 gboolean
 gst_mpegts_descriptor_parse_dvb_component (const GstMpegTsDescriptor
-    * descriptor, GstMpegTsComponentDescriptor * res)
+    * descriptor, GstMpegTsComponentDescriptor ** res)
 {
   guint8 *data;
   guint8 len;
+  GstMpegTsComponentDescriptor *desc;
 
   g_return_val_if_fail (descriptor != NULL && res != NULL, FALSE);
   /* Need 6 bytes at least (1 for content, 1 for type, 1 for tag, 3 for language code) */
@@ -1006,22 +1126,25 @@ gst_mpegts_descriptor_parse_dvb_component (const GstMpegTsDescriptor
 
   data = (guint8 *) descriptor->data + 2;
 
-  res->stream_content = *data & 0x0f;
+  desc = g_slice_new0 (GstMpegTsComponentDescriptor);
+
+  desc->stream_content = *data & 0x0f;
   data += 1;
 
-  res->component_type = *data;
+  desc->component_type = *data;
   data += 1;
 
-  res->component_tag = *data;
+  desc->component_tag = *data;
   data += 1;
 
-  memcpy (res->language_code, data, 3);
-  res->language_code[3] = 0;
+  desc->language_code = convert_lang_code (data);
   data += 3;
 
   len = descriptor->length - 6;
   if (len)
-    res->text = get_encoding_and_convert ((const gchar *) data, len);
+    desc->text = get_encoding_and_convert ((const gchar *) data, len);
+
+  *res = desc;
 
   return TRUE;
 }
@@ -1057,9 +1180,9 @@ gst_mpegts_descriptor_parse_dvb_stream_identifier (const GstMpegTsDescriptor
 /**
  * gst_mpegts_descriptor_parse_dvb_ca_identifier:
  * @descriptor: a %GST_MTS_DESC_DVB_CA_IDENTIFIER #GstMpegTsDescriptor
- * @list: (out) (transfer none) (element-type guint16): This 16-bit field
- * identifies the CA system. Allocations of the value of this field are found
- * in http://www.dvbservices.com
+ * @list: (out) (transfer full) (element-type guint16): a list of ca identifier.
+ * Edge entry identifies the CA system. Allocations of the value of this field
+ * are found in http://www.dvbservices.com
  *
  * Extracts ca id's from @descriptor.
  *
@@ -1100,7 +1223,7 @@ _gst_mpegts_content_free (GstMpegTsContent * content)
 /**
  * gst_mpegts_descriptor_parse_dvb_content:
  * @descriptor: a %GST_MTS_DESC_DVB_CONTENT #GstMpegTsDescriptor
- * @content: (out) (transfer none) (element-type GstMpegTsContent): #GstMpegTsContent
+ * @content: (out) (transfer full) (element-type GstMpegTsContent): #GstMpegTsContent
  *
  * Extracts the DVB content information from @descriptor.
  *
@@ -1142,13 +1265,14 @@ static void
 _gst_mpegts_dvb_parental_rating_item_free (GstMpegTsDVBParentalRatingItem *
     item)
 {
+  g_free (item->country_code);
   g_slice_free (GstMpegTsDVBParentalRatingItem, item);
 }
 
 /**
  * gst_mpegts_descriptor_parse_dvb_parental_rating:
  * @descriptor: a %GST_MTS_DESC_DVB_PARENTAL_RATING #GstMpegTsDescriptor
- * @rating: (out) (transfer none) (element-type GstMpegTsDVBParentalRatingItem):
+ * @rating: (out) (transfer full) (element-type GstMpegTsDVBParentalRatingItem):
  * #GstMpegTsDVBParentalRatingItem
  *
  * Extracts the DVB parental rating information from @descriptor.
@@ -1175,8 +1299,7 @@ gst_mpegts_descriptor_parse_dvb_parental_rating (const GstMpegTsDescriptor
         g_slice_new0 (GstMpegTsDVBParentalRatingItem);
     g_ptr_array_add (*rating, item);
 
-    memcpy (item->country_code, data, 3);
-    item->country_code[3] = 0;
+    item->country_code = convert_lang_code (data);
     data += 3;
 
     if (g_strcmp0 (item->country_code, "BRA") == 0) {
@@ -1395,6 +1518,8 @@ static void
     _gst_mpegts_dvb_multilingual_network_name_item_free
     (GstMpegTsDvbMultilingualNetworkNameItem * item)
 {
+  g_free (item->network_name);
+  g_free (item->language_code);
   g_slice_free (GstMpegTsDvbMultilingualNetworkNameItem, item);
 }
 
@@ -1402,7 +1527,7 @@ static void
  * gst_mpegts_descriptor_parse_dvb_multilingual_network_name:
  * @descriptor: a %GST_MTS_DESC_DVB_MULTILINGUAL_NETWORK_NAME
  * #GstMpegTsDescriptor
- * @network_name_items: (out) (element-type GstMpegTsDvbMultilingualNetworkNameItem):
+ * @network_name_items: (out) (transfer full) (element-type GstMpegTsDvbMultilingualNetworkNameItem):
  * a #GstMpegTsDvbMultilingualNetworkNameItem
  *
  * Parses out the multilingual network name from the @descriptor.
@@ -1429,7 +1554,7 @@ gst_mpegts_descriptor_parse_dvb_multilingual_network_name (const
   for (i = 0; i < descriptor->length - 3;) {
     item = g_slice_new0 (GstMpegTsDvbMultilingualNetworkNameItem);
     g_ptr_array_add (*network_name_items, item);
-    memcpy (item->language_code, data, 3);
+    item->language_code = convert_lang_code (data);
     data += 3;
     i += 3;
 
@@ -1448,6 +1573,8 @@ static void
     _gst_mpegts_dvb_multilingual_bouquet_name_item_free
     (GstMpegTsDvbMultilingualBouquetNameItem * item)
 {
+  g_free (item->language_code);
+  g_free (item->bouquet_name);
   g_slice_free (GstMpegTsDvbMultilingualBouquetNameItem, item);
 }
 
@@ -1455,7 +1582,7 @@ static void
  * gst_mpegts_descriptor_parse_dvb_multilingual_bouquet_name:
  * @descriptor: a %GST_MTS_DESC_DVB_MULTILINGUAL_BOUQUET_NAME
  * #GstMpegTsDescriptor
- * @bouquet_name_items: (out) (element-type GstMpegTsDvbMultilingualBouquetNameItem):
+ * @bouquet_name_items: (out) (transfer full) (element-type GstMpegTsDvbMultilingualBouquetNameItem):
  * a #GstMpegTsDvbMultilingualBouquetNameItem
  *
  * Parses out the multilingual bouquet name from the @descriptor.
@@ -1482,7 +1609,7 @@ gst_mpegts_descriptor_parse_dvb_multilingual_bouquet_name (const
   for (i = 0; i < descriptor->length - 3;) {
     item = g_slice_new0 (GstMpegTsDvbMultilingualBouquetNameItem);
     g_ptr_array_add (*bouquet_name_items, item);
-    memcpy (item->language_code, data, 3);
+    item->language_code = convert_lang_code (data);
     data += 3;
     i += 3;
 
@@ -1501,6 +1628,9 @@ static void
     _gst_mpegts_dvb_multilingual_service_name_item_free
     (GstMpegTsDvbMultilingualServiceNameItem * item)
 {
+  g_free (item->provider_name);
+  g_free (item->service_name);
+  g_free (item->language_code);
   g_slice_free (GstMpegTsDvbMultilingualServiceNameItem, item);
 }
 
@@ -1508,7 +1638,7 @@ static void
  * gst_mpegts_descriptor_parse_dvb_multilingual_service_name:
  * @descriptor: a %GST_MTS_DESC_DVB_MULTILINGUAL_SERVICE_NAME
  * #GstMpegTsDescriptor
- * @service_name_items: (out) (element-type GstMpegTsDvbMultilingualServiceNameItem):
+ * @service_name_items: (out) (transfer full) (element-type GstMpegTsDvbMultilingualServiceNameItem):
  * a #GstMpegTsDvbMultilingualServiceNameItem
  *
  * Parses out the multilingual service name from the @descriptor.
@@ -1535,7 +1665,7 @@ gst_mpegts_descriptor_parse_dvb_multilingual_service_name (const
   for (i = 0; i < descriptor->length - 3;) {
     item = g_slice_new0 (GstMpegTsDvbMultilingualServiceNameItem);
     g_ptr_array_add (*service_name_items, item);
-    memcpy (item->language_code, data, 3);
+    item->language_code = convert_lang_code (data);
     data += 3;
     i += 3;
 
@@ -1560,6 +1690,8 @@ static void
     _gst_mpegts_dvb_multilingual_component_item_free
     (GstMpegTsDvbMultilingualComponentItem * item)
 {
+  g_free (item->language_code);
+  g_free (item->description);
   g_slice_free (GstMpegTsDvbMultilingualComponentItem, item);
 }
 
@@ -1568,7 +1700,7 @@ static void
  * @descriptor: a %GST_MTS_DESC_DVB_MULTILINGUAL_COMPONENT
  * #GstMpegTsDescriptor
  * @component_tag: the component tag
- * @component_description_items: (out) (element-type GstMpegTsDvbMultilingualComponentItem):
+ * @component_description_items: (out) (transfer full) (element-type GstMpegTsDvbMultilingualComponentItem):
  * a #GstMpegTsDvbMultilingualComponentItem
  *
  * Parses out the multilingual component from the @descriptor.
@@ -1600,7 +1732,7 @@ gst_mpegts_descriptor_parse_dvb_multilingual_component (const
   for (i = 0; i < descriptor->length - 3;) {
     item = g_slice_new0 (GstMpegTsDvbMultilingualComponentItem);
     g_ptr_array_add (*component_description_items, item);
-    memcpy (item->language_code, data, 3);
+    item->language_code = convert_lang_code (data);
     data += 3;
     i += 3;
 
@@ -1620,7 +1752,7 @@ gst_mpegts_descriptor_parse_dvb_multilingual_component (const
  * @descriptor: a %GST_MTS_DESC_DVB_PRIVATE_DATA_SPECIFIER #GstMpegTsDescriptor
  * @private_data_specifier: (out): the private data specifier id
  * registered by http://www.dvbservices.com/
- * @private_data: (out) (allow-none): additional data or NULL
+ * @private_data: (out) (transfer full)(allow-none): additional data or NULL
  * @length: (out) (allow-none): length of %private_data
  *
  * Parses out the private data specifier from the @descriptor.
@@ -1656,7 +1788,7 @@ gst_mpegts_descriptor_parse_dvb_private_data_specifier (const
  * gst_mpegts_descriptor_parse_dvb_frequency_list:
  * @descriptor: a %GST_MTS_DESC_DVB_FREQUENCY_LIST #GstMpegTsDescriptor
  * @offset: (out): %FALSE in Hz, %TRUE in kHz
- * @list: (out) (element-type guint32): a list of all frequencies in Hz/kHz
+ * @list: (out) (transfer full) (element-type guint32): a list of all frequencies in Hz/kHz
  * depending on %offset
  *
  * Parses out a list of frequencies from the @descriptor.
@@ -1716,10 +1848,40 @@ gst_mpegts_descriptor_parse_dvb_frequency_list (const GstMpegTsDescriptor
 }
 
 /* GST_MTS_DESC_DVB_DATA_BROADCAST (0x64) */
+static GstMpegTsDataBroadcastDescriptor *
+_gst_mpegts_dvb_data_broadcast_descriptor_copy (GstMpegTsDataBroadcastDescriptor
+    * source)
+{
+  GstMpegTsDataBroadcastDescriptor *copy;
+
+  copy = g_slice_dup (GstMpegTsDataBroadcastDescriptor, source);
+
+  copy->selector_bytes = g_slice_copy (source->length, source->selector_bytes);
+  copy->language_code = g_strdup (source->language_code);
+  copy->text = g_strdup (source->text);
+
+  return copy;
+}
+
+void
+gst_mpegts_dvb_data_broadcast_descriptor_free (GstMpegTsDataBroadcastDescriptor
+    * source)
+{
+  g_free (source->selector_bytes);
+  g_free (source->language_code);
+  g_free (source->text);
+  g_slice_free (GstMpegTsDataBroadcastDescriptor, source);
+}
+
+G_DEFINE_BOXED_TYPE (GstMpegTsDataBroadcastDescriptor,
+    gst_mpegts_dvb_data_broadcast_descriptor,
+    (GBoxedCopyFunc) _gst_mpegts_dvb_data_broadcast_descriptor_copy,
+    (GFreeFunc) gst_mpegts_dvb_data_broadcast_descriptor_free);
+
 /**
  * gst_mpegts_descriptor_parse_dvb_data_broadcast:
  * @descriptor: a %GST_MTS_DESC_DVB_DATA_BROADCAST #GstMpegTsDescriptor
- * @res: (out) (transfer none): #GstMpegTsDataBroadcastDescriptor
+ * @res: (out) (transfer full): #GstMpegTsDataBroadcastDescriptor
  *
  * Parses out the data broadcast from the @descriptor.
  *
@@ -1727,33 +1889,37 @@ gst_mpegts_descriptor_parse_dvb_frequency_list (const GstMpegTsDescriptor
  */
 gboolean
 gst_mpegts_descriptor_parse_dvb_data_broadcast (const GstMpegTsDescriptor
-    * descriptor, GstMpegTsDataBroadcastDescriptor * res)
+    * descriptor, GstMpegTsDataBroadcastDescriptor ** desc)
 {
   guint8 *data;
-  guint8 len;
+  GstMpegTsDataBroadcastDescriptor *res;
 
-  g_return_val_if_fail (descriptor != NULL && res != NULL, FALSE);
+  g_return_val_if_fail (descriptor != NULL && desc != NULL, FALSE);
   __common_desc_checks (descriptor, GST_MTS_DESC_DVB_DATA_BROADCAST, 8, FALSE);
 
   data = (guint8 *) descriptor->data + 2;
 
+  res = g_slice_new0 (GstMpegTsDataBroadcastDescriptor);
+
   res->data_broadcast_id = GST_READ_UINT16_BE (data);
   data += 2;
 
   res->component_tag = *data;
   data += 1;
 
-  len = *data;
+  res->length = *data;
   data += 1;
 
-  res->selector_bytes = g_memdup (data, len);
-  data += len;
+  res->selector_bytes = g_memdup (data, res->length);
+  data += res->length;
 
-  memcpy (res->language_code, data, 3);
+  res->language_code = convert_lang_code (data);
   data += 3;
 
   res->text = get_encoding_and_convert ((const gchar *) data + 1, *data);
 
+  *desc = res;
+
   return TRUE;
 }
 
@@ -1793,7 +1959,7 @@ gst_mpegts_descriptor_parse_dvb_scrambling (const GstMpegTsDescriptor *
  * gst_mpegts_descriptor_parse_dvb_data_broadcast_id:
  * @descriptor: a %GST_MTS_DESC_DVB_DATA_BROADCAST_ID #GstMpegTsDescriptor
  * @data_broadcast_id: (out): the data broadcast id
- * @id_selector_bytes: (out): the selector bytes, if present
+ * @id_selector_bytes: (out) (transfer full): the selector bytes, if present
  * @len: (out): the length of #id_selector_bytes
  *
  * Parses out the data broadcast id from the @descriptor.
@@ -1825,6 +1991,30 @@ gst_mpegts_descriptor_parse_dvb_data_broadcast_id (const GstMpegTsDescriptor
 }
 
 /* GST_MTS_DESC_EXT_DVB_T2_DELIVERY_SYSTEM (0x7F && 0x04) */
+static GstMpegTsT2DeliverySystemDescriptor
+    * _gst_mpegts_t2_delivery_system_descriptor_copy
+    (GstMpegTsT2DeliverySystemDescriptor * source)
+{
+  GstMpegTsT2DeliverySystemDescriptor *copy;
+
+  copy = g_slice_dup (GstMpegTsT2DeliverySystemDescriptor, source);
+  copy->cells = g_ptr_array_ref (source->cells);
+
+  return copy;
+}
+
+void gst_mpegts_t2_delivery_system_descriptor_free
+    (GstMpegTsT2DeliverySystemDescriptor * source)
+{
+  g_ptr_array_unref (source->cells);
+  g_slice_free (GstMpegTsT2DeliverySystemDescriptor, source);
+}
+
+G_DEFINE_BOXED_TYPE (GstMpegTsT2DeliverySystemDescriptor,
+    gst_mpegts_t2_delivery_system_descriptor,
+    (GBoxedCopyFunc) _gst_mpegts_t2_delivery_system_descriptor_copy,
+    (GFreeFunc) gst_mpegts_t2_delivery_system_descriptor_free);
+
 static void
     _gst_mpegts_t2_delivery_system_cell_extension_free
     (GstMpegTsT2DeliverySystemCellExtension * ext)
@@ -1836,13 +2026,14 @@ static void
 _gst_mpegts_t2_delivery_system_cell_free (GstMpegTsT2DeliverySystemCell * cell)
 {
   g_ptr_array_unref (cell->sub_cells);
+  g_array_unref (cell->centre_frequencies);
   g_slice_free (GstMpegTsT2DeliverySystemCell, cell);
 }
 
 /**
  * gst_mpegts_descriptor_parse_dvb_t2_delivery_system:
  * @descriptor: a %GST_MTS_DESC_EXT_DVB_T2_DELIVERY_SYSTEM #GstMpegTsDescriptor
- * @res: (out) (transfer none): #GstMpegTsT2DeliverySystemDescriptor
+ * @res: (out) (transfer full): #GstMpegTsT2DeliverySystemDescriptor
  *
  * Parses out the DVB-T2 delivery system from the @descriptor.
  *
@@ -1850,19 +2041,22 @@ _gst_mpegts_t2_delivery_system_cell_free (GstMpegTsT2DeliverySystemCell * cell)
  */
 gboolean
 gst_mpegts_descriptor_parse_dvb_t2_delivery_system (const GstMpegTsDescriptor
-    * descriptor, GstMpegTsT2DeliverySystemDescriptor * res)
+    * descriptor, GstMpegTsT2DeliverySystemDescriptor ** desc)
 {
   guint8 *data;
   guint8 len, freq_len, sub_cell_len;
   guint32 tmp_freq;
   guint8 i;
+  GstMpegTsT2DeliverySystemDescriptor *res;
 
-  g_return_val_if_fail (descriptor != NULL && res != NULL, FALSE);
+  g_return_val_if_fail (descriptor != NULL && desc != NULL, FALSE);
   __common_desc_ext_checks (descriptor, GST_MTS_DESC_EXT_DVB_T2_DELIVERY_SYSTEM,
       4, FALSE);
 
   data = (guint8 *) descriptor->data + 3;
 
+  res = g_slice_new0 (GstMpegTsT2DeliverySystemDescriptor);
+
   res->plp_id = *data;
   data += 1;
 
@@ -2007,5 +2201,7 @@ gst_mpegts_descriptor_parse_dvb_t2_delivery_system (const GstMpegTsDescriptor
       }
     }
   }
+
+  *desc = res;
   return TRUE;
 }
index 83ad97f..d2ffd33 100644 (file)
@@ -449,8 +449,14 @@ struct _GstMpegTsDVBLinkageDescriptor
   guint8                            *private_data_bytes;
 };
 
+#define GST_TYPE_MPEGTS_DVB_LINKAGE_DESCRIPTOR ( gst_mpegts_dvb_linkage_descriptor_get_type())
+
+GType gst_mpegts_dvb_linkage_descriptor_get_type (void);
+
+void gst_mpegts_dvb_linkage_descriptor_free (GstMpegTsDVBLinkageDescriptor * source);
+
 gboolean gst_mpegts_descriptor_parse_dvb_linkage (const GstMpegTsDescriptor * descriptor,
-                                                  GstMpegTsDVBLinkageDescriptor * res);
+                                                  GstMpegTsDVBLinkageDescriptor ** res);
 
 /* GST_MTS_DESC_DVB_SHORT_EVENT (0x4D) */
 gboolean gst_mpegts_descriptor_parse_dvb_short_event (const GstMpegTsDescriptor *descriptor,
@@ -483,15 +489,20 @@ struct _GstMpegTsExtendedEventDescriptor
 {
   guint8 descriptor_number;
   guint8 last_descriptor_number;
-  gchar  language_code[4];
+  gchar  *language_code;
   GPtrArray *items;
   gchar *text;
 };
 
+#define GST_TYPE_MPEGTS_EXTENDED_EVENT_DESCRIPTOR (gst_mpegts_extended_event_descriptor_get_type())
+
+GType gst_mpegts_extended_event_descriptor_get_type (void);
+void gst_mpegts_extended_event_descriptor_free (GstMpegTsExtendedEventDescriptor * source);
 gboolean gst_mpegts_descriptor_parse_dvb_extended_event (const GstMpegTsDescriptor *descriptor,
-                                                         GstMpegTsExtendedEventDescriptor *res);
+                                                         GstMpegTsExtendedEventDescriptor **res);
 
 /* GST_MTS_DESC_DVB_COMPONENT (0x50) */
+#define GST_TYPE_MPEGTS_COMPONENT_DESCRIPTOR (gst_mpegts_component_descriptor_get_type ())
 typedef enum {
   GST_MPEGTS_STREAM_CONTENT_MPEG2_VIDEO          = 0x01,
   GST_MPEGTS_STREAM_CONTENT_MPEG1_LAYER2_AUDIO   = 0x02,
@@ -509,13 +520,14 @@ struct _GstMpegTsComponentDescriptor
   guint8 stream_content;
   guint8 component_type;
   guint8 component_tag;
-  /* FIXME : Make it a separate (allocated, null-terminated) return value  */
-  gchar  language_code[4];
+  gchar  *language_code;
   gchar *text;
 };
 
+GType gst_mpegts_component_descriptor_get_type (void);
+void gst_mpegts_dvb_component_descriptor_free (GstMpegTsComponentDescriptor * source);
 gboolean gst_mpegts_descriptor_parse_dvb_component (const GstMpegTsDescriptor *descriptor,
-                                                   GstMpegTsComponentDescriptor *res);
+                                                   GstMpegTsComponentDescriptor **res);
 
 /* GST_MTS_DESC_DVB_STREAM_IDENTIFIER (0x52) */
 gboolean gst_mpegts_descriptor_parse_dvb_stream_identifier (const GstMpegTsDescriptor *descriptor,
@@ -562,7 +574,7 @@ typedef struct _GstMpegTsDVBParentalRatingItem GstMpegTsDVBParentalRatingItem;
  */
 struct _GstMpegTsDVBParentalRatingItem
 {
-  gchar  country_code[4];
+  gchar  *country_code;
   guint8 rating;
 };
 
@@ -586,7 +598,7 @@ typedef enum {
 } GstMpegTsDVBTeletextType;
 
 gboolean gst_mpegts_descriptor_parse_dvb_teletext_idx (const GstMpegTsDescriptor *
-    descriptor, guint idx, gchar (*language_code)[4],
+    descriptor, guint idx, gchar ** language_code,
     GstMpegTsDVBTeletextType * teletext_type, guint8 * magazine_number,
     guint8 * page_number);
 
@@ -595,7 +607,7 @@ guint gst_mpegts_descriptor_parse_dvb_teletext_nb (const GstMpegTsDescriptor *
 
 /* GST_MTS_DESC_DVB_SUBTITLING (0x59) */
 gboolean gst_mpegts_descriptor_parse_dvb_subtitling_idx (const GstMpegTsDescriptor *descriptor,
-                                                        guint idx, gchar (*lang)[4],
+                                                        guint idx, gchar ** lang,
                                                         guint8 *type, guint16 *composition_page_id,
                                                         guint16 *ancillary_page_id);
 guint gst_mpegts_descriptor_parse_dvb_subtitling_nb (const GstMpegTsDescriptor *descriptor);
@@ -691,7 +703,7 @@ typedef struct _GstMpegTsDvbMultilingualNetworkNameItem GstMpegTsDvbMultilingual
  */
 struct _GstMpegTsDvbMultilingualNetworkNameItem
 {
-  gchar language_code[4];
+  gchar *language_code;
   gchar *network_name;
 };
 
@@ -710,7 +722,7 @@ typedef struct _GstMpegTsDvbMultilingualBouquetNameItem GstMpegTsDvbMultilingual
  */
 struct _GstMpegTsDvbMultilingualBouquetNameItem
 {
-  gchar language_code[4];
+  gchar *language_code;
   gchar *bouquet_name;
 };
 
@@ -730,7 +742,7 @@ typedef struct _GstMpegTsDvbMultilingualServiceNameItem GstMpegTsDvbMultilingual
  */
 struct _GstMpegTsDvbMultilingualServiceNameItem
 {
-  gchar language_code[4];
+  gchar *language_code;
   gchar *provider_name;
   gchar *service_name;
 };
@@ -748,7 +760,7 @@ typedef struct _GstMpegTsDvbMultilingualComponentItem GstMpegTsDvbMultilingualCo
  */
 struct _GstMpegTsDvbMultilingualComponentItem
 {
-  gchar language_code[4];
+  gchar *language_code;
   gchar *description;
 };
 
@@ -779,13 +791,18 @@ struct _GstMpegTsDataBroadcastDescriptor
 {
   guint16     data_broadcast_id;
   guint8      component_tag;
+  guint8      length;
   guint8      *selector_bytes;
-  gchar       language_code[4];
+  gchar       *language_code;
   gchar       *text;
 };
 
+
+#define GST_TYPE_MPEGTS_DVB_DATA_BROADCAST_DESCRIPTOR (gst_mpegts_dvb_data_broadcast_descriptor_get_type ())
+GType gst_mpegts_dvb_data_broadcast_descriptor_get_type (void);
+void gst_mpegts_dvb_data_broadcast_descriptor_free (GstMpegTsDataBroadcastDescriptor * source);
 gboolean gst_mpegts_descriptor_parse_dvb_data_broadcast (const GstMpegTsDescriptor
-              *descriptor, GstMpegTsDataBroadcastDescriptor * res);
+              *descriptor, GstMpegTsDataBroadcastDescriptor ** res);
 
 /* GST_MTS_DESC_DVB_SCRAMBLING (0x65) */
 typedef enum
@@ -872,8 +889,11 @@ struct _GstMpegTsT2DeliverySystemDescriptor
   GPtrArray                             *cells;
 };
 
+#define GST_TYPE_MPEGTS_T2_DELIVERY_SYSTEM_DESCRIPTOR (gst_mpegts_t2_delivery_system_descriptor_get_type ())
+GType gst_mpegts_t2_delivery_system_descriptor_get_type (void);
+void gst_mpegts_t2_delivery_system_descriptor_free (GstMpegTsT2DeliverySystemDescriptor * source);
 gboolean gst_mpegts_descriptor_parse_dvb_t2_delivery_system (const GstMpegTsDescriptor
-              *descriptor, GstMpegTsT2DeliverySystemDescriptor * res);
+              *descriptor, GstMpegTsT2DeliverySystemDescriptor ** res);
 
 G_END_DECLS
 
index a3e6dc1..59fe077 100644 (file)
@@ -32,6 +32,7 @@ GST_DEBUG_CATEGORY_EXTERN (gst_mpegts_debug);
 G_GNUC_INTERNAL void __initialize_descriptors (void);
 G_GNUC_INTERNAL guint32 _calc_crc32 (const guint8 *data, guint datalen);
 G_GNUC_INTERNAL gchar *get_encoding_and_convert (const gchar *text, guint length);
+G_GNUC_INTERNAL gchar *convert_lang_code (guint8 * data);
 G_GNUC_INTERNAL guint8 *dvb_text_from_utf8 (const gchar * text, gsize *out_size);
 G_GNUC_INTERNAL void _free_descriptor (GstMpegTsDescriptor *descriptor);
 G_GNUC_INTERNAL GstMpegTsDescriptor *_new_descriptor (guint8 tag, guint8 length);
index 9a89627..edcad5c 100644 (file)
@@ -622,6 +622,17 @@ failed:
   }
 }
 
+gchar *
+convert_lang_code (guint8 * data)
+{
+  gchar *code;
+  /* the iso language code and country code is always 3 byte long */
+  code = g_malloc0 (4);
+  memcpy (code, data, 3);
+
+  return code;
+}
+
 void
 _packetize_descriptor_array (GPtrArray * array, guint8 ** out_data)
 {
@@ -855,10 +866,43 @@ gst_mpegts_descriptor_from_registration (const gchar * format_identifier,
 }
 
 /* GST_MTS_DESC_ISO_639_LANGUAGE (0x0A) */
+static GstMpegTsISO639LanguageDescriptor *
+_gst_mpegts_iso_639_language_descriptor_copy (GstMpegTsISO639LanguageDescriptor
+    * source)
+{
+  GstMpegTsISO639LanguageDescriptor *copy;
+  guint i;
+
+  copy = g_slice_dup (GstMpegTsISO639LanguageDescriptor, source);
+
+  for (i = 0; i < source->nb_language; i++) {
+    copy->language[i] = g_strdup (source->language[i]);
+  }
+
+  return copy;
+}
+
+void
+gst_mpegts_iso_639_language_descriptor_free (GstMpegTsISO639LanguageDescriptor
+    * desc)
+{
+  guint i;
+
+  for (i = 0; i < desc->nb_language; i++) {
+    g_free (desc->language[i]);
+  }
+  g_slice_free (GstMpegTsISO639LanguageDescriptor, desc);
+}
+
+G_DEFINE_BOXED_TYPE (GstMpegTsISO639LanguageDescriptor,
+    gst_mpegts_iso_639_language,
+    (GBoxedCopyFunc) _gst_mpegts_iso_639_language_descriptor_copy,
+    (GFreeFunc) gst_mpegts_iso_639_language_descriptor_free);
+
 /**
  * gst_mpegts_descriptor_parse_iso_639_language:
  * @descriptor: a %GST_MTS_DESC_ISO_639_LANGUAGE #GstMpegTsDescriptor
- * @res: (out) (transfer none): the #GstMpegTsISO639LanguageDescriptor to fill
+ * @res: (out) (transfer full): the #GstMpegTsISO639LanguageDescriptor to fill
  *
  * Extracts the iso 639-2 language information from @descriptor.
  *
@@ -869,23 +913,30 @@ gst_mpegts_descriptor_from_registration (const gchar * format_identifier,
  */
 gboolean
 gst_mpegts_descriptor_parse_iso_639_language (const GstMpegTsDescriptor *
-    descriptor, GstMpegTsISO639LanguageDescriptor * res)
+    descriptor, GstMpegTsISO639LanguageDescriptor ** desc)
 {
   guint i;
   guint8 *data;
+  GstMpegTsISO639LanguageDescriptor *res;
 
-  g_return_val_if_fail (descriptor != NULL && res != NULL, FALSE);
+  g_return_val_if_fail (descriptor != NULL && desc != NULL, FALSE);
   /* This descriptor can be empty, no size check needed */
   __common_desc_checks (descriptor, GST_MTS_DESC_ISO_639_LANGUAGE, 0, FALSE);
 
   data = (guint8 *) descriptor->data + 2;
+
+  res = g_slice_new0 (GstMpegTsISO639LanguageDescriptor);
+
   /* Each language is 3 + 1 bytes */
   res->nb_language = descriptor->length / 4;
   for (i = 0; i < res->nb_language; i++) {
-    memcpy (res->language[i], data, 3);
+    res->language[i] = convert_lang_code (data);
     res->audio_type[i] = data[3];
     data += 4;
   }
+
+  *desc = res;
+
   return TRUE;
 
 }
@@ -894,7 +945,7 @@ gst_mpegts_descriptor_parse_iso_639_language (const GstMpegTsDescriptor *
  * gst_mpegts_descriptor_parse_iso_639_language_idx:
  * @descriptor: a %GST_MTS_DESC_ISO_639_LANGUAGE #GstMpegTsDescriptor
  * @idx: Table id of the language to parse
- * @lang: (out) (transfer none): 4-byte gchar array to hold the language code
+ * @lang: (out) (transfer full): 4-byte gchar array to hold the language code
  * @audio_type: (out) (transfer none) (allow-none): the #GstMpegTsIso639AudioType to set
  *
  * Extracts the iso 639-2 language information from specific table id in @descriptor.
@@ -906,8 +957,7 @@ gst_mpegts_descriptor_parse_iso_639_language (const GstMpegTsDescriptor *
  */
 gboolean
 gst_mpegts_descriptor_parse_iso_639_language_idx (const GstMpegTsDescriptor *
-    descriptor, guint idx, gchar (*lang)[4],
-    GstMpegTsIso639AudioType * audio_type)
+    descriptor, guint idx, gchar ** lang, GstMpegTsIso639AudioType * audio_type)
 {
   guint8 *data;
 
@@ -920,8 +970,7 @@ gst_mpegts_descriptor_parse_iso_639_language_idx (const GstMpegTsDescriptor *
 
   data = (guint8 *) descriptor->data + 2 + idx * 4;
 
-  memcpy (lang, data, 3);
-  (*lang)[3] = 0;
+  *lang = convert_lang_code (data);
 
   data += 3;
 
@@ -969,6 +1018,7 @@ gst_mpegts_descriptor_parse_logical_channel (const GstMpegTsDescriptor *
   __common_desc_checks (descriptor, GST_MTS_DESC_DTG_LOGICAL_CHANNEL, 0, FALSE);
 
   data = (guint8 *) descriptor->data + 2;
+
   res->nb_channels = descriptor->length / 4;
 
   for (i = 0; i < res->nb_channels; i++) {
index 7c36788..d42a5b7 100644 (file)
@@ -287,14 +287,17 @@ typedef struct _GstMpegTsISO639LanguageDescriptor GstMpegTsISO639LanguageDescrip
 struct _GstMpegTsISO639LanguageDescriptor
 {
   guint                    nb_language;
-  gchar                    language[64][3];
+  gchar                    *language[64];
   GstMpegTsIso639AudioType audio_type[64];
 };
 
+#define GST_TYPE_MPEGTS_ISO_639_LANGUAGE (gst_mpegts_iso_639_language_get_type ())
+GType gst_mpegts_iso_639_language_get_type (void);
+void gst_mpegts_iso_639_language_descriptor_free (GstMpegTsISO639LanguageDescriptor * desc);
 gboolean gst_mpegts_descriptor_parse_iso_639_language (const GstMpegTsDescriptor *descriptor,
-                                                      GstMpegTsISO639LanguageDescriptor *res);
+                                                      GstMpegTsISO639LanguageDescriptor **res);
 gboolean gst_mpegts_descriptor_parse_iso_639_language_idx (const GstMpegTsDescriptor *descriptor,
-                                                           guint idx, gchar (*lang)[4],
+                                                           guint idx, gchar **lang,
                                                            GstMpegTsIso639AudioType *audio_type);
 guint gst_mpegts_descriptor_parse_iso_639_language_nb (const GstMpegTsDescriptor *descriptor);
 
index 5d11271..dc3a2ff 100644 (file)
@@ -967,7 +967,7 @@ gst_ts_demux_create_tags (TSDemuxStream * stream)
       mpegts_get_descriptor_from_stream (bstream,
       GST_MTS_DESC_ISO_639_LANGUAGE);
   if (desc) {
-    gchar lang_code[4];
+    gchar *lang_code;
 
     nb = gst_mpegts_descriptor_parse_iso_639_language_nb (desc);
 
@@ -975,8 +975,10 @@ gst_ts_demux_create_tags (TSDemuxStream * stream)
 
     for (i = 0; i < nb; i++)
       if (gst_mpegts_descriptor_parse_iso_639_language_idx (desc, i, &lang_code,
-              NULL))
+              NULL)) {
         add_iso639_language_to_tags (stream, lang_code);
+        g_free (lang_code);
+      }
 
     return;
   }
@@ -985,7 +987,7 @@ gst_ts_demux_create_tags (TSDemuxStream * stream)
       mpegts_get_descriptor_from_stream (bstream, GST_MTS_DESC_DVB_SUBTITLING);
 
   if (desc) {
-    gchar lang_code[4];
+    gchar *lang_code;
 
     nb = gst_mpegts_descriptor_parse_dvb_subtitling_nb (desc);
 
@@ -993,8 +995,10 @@ gst_ts_demux_create_tags (TSDemuxStream * stream)
 
     for (i = 0; i < nb; i++)
       if (gst_mpegts_descriptor_parse_dvb_subtitling_idx (desc, i, &lang_code,
-              NULL, NULL, NULL))
+              NULL, NULL, NULL)) {
         add_iso639_language_to_tags (stream, lang_code);
+        g_free (lang_code);
+      }
   }
 }
 
index 86c53ee..aa53561 100644 (file)
@@ -178,8 +178,9 @@ dump_terrestrial_delivery (GstMpegTsDescriptor * desc, guint spacing)
     g_printf ("%*s   Constellation     : %d (%s)\n", spacing, "",
         res.constellation, enum_name (GST_TYPE_MPEG_TS_MODULATION_TYPE,
             res.constellation));
-    g_printf ("%*s   Hierarchy         : %d (%s)\n", spacing, "", res.hierarchy,
-        enum_name (GST_TYPE_MPEG_TS_TERRESTRIAL_HIERARCHY, res.hierarchy));
+    g_printf ("%*s   Hierarchy         : %d (%s)\n", spacing, "",
+        res.hierarchy, enum_name (GST_TYPE_MPEG_TS_TERRESTRIAL_HIERARCHY,
+            res.hierarchy));
     g_printf ("%*s   Code Rate HP      : %d (%s)\n", spacing, "",
         res.code_rate_hp, enum_name (GST_TYPE_MPEG_TS_DVB_CODE_RATE,
             res.code_rate_hp));
@@ -310,28 +311,25 @@ dump_multiligual_component (GstMpegTsDescriptor * desc, guint spacing)
 static void
 dump_linkage (GstMpegTsDescriptor * desc, guint spacing)
 {
-  GstMpegTsDVBLinkageDescriptor res;
-
-  res.private_data_length = 0;
-  res.private_data_bytes = NULL;
+  GstMpegTsDVBLinkageDescriptor *res;
 
   if (gst_mpegts_descriptor_parse_dvb_linkage (desc, &res)) {
     g_printf ("%*s Linkage Descriptor : 0x%02x (%s)\n", spacing, "",
-        res.linkage_type, enum_name (GST_TYPE_MPEG_TS_DVB_LINKAGE_TYPE,
-            res.linkage_type));
+        res->linkage_type, enum_name (GST_TYPE_MPEG_TS_DVB_LINKAGE_TYPE,
+            res->linkage_type));
 
     g_printf ("%*s   Transport Stream ID : 0x%04x\n", spacing, "",
-        res.transport_stream_id);
+        res->transport_stream_id);
     g_printf ("%*s   Original Network ID : 0x%04x\n", spacing, "",
-        res.original_network_id);
+        res->original_network_id);
     g_printf ("%*s   Service ID          : 0x%04x\n", spacing, "",
-        res.service_id);
+        res->service_id);
 
-    switch (res.linkage_type) {
+    switch (res->linkage_type) {
       case GST_MPEGTS_DVB_LINKAGE_MOBILE_HAND_OVER:
       {
         GstMpegTsDVBLinkageMobileHandOver *linkage =
-            (GstMpegTsDVBLinkageMobileHandOver *) res.linkage_data;
+            (GstMpegTsDVBLinkageMobileHandOver *) res->linkage_data;
         g_printf ("%*s   hand_over_type    : 0x%02x (%s)\n", spacing,
             "", linkage->hand_over_type,
             enum_name (GST_TYPE_MPEG_TS_DVB_LINKAGE_HAND_OVER_TYPE,
@@ -347,7 +345,7 @@ dump_linkage (GstMpegTsDescriptor * desc, guint spacing)
       case GST_MPEGTS_DVB_LINKAGE_EVENT:
       {
         GstMpegTsDVBLinkageEvent *linkage =
-            (GstMpegTsDVBLinkageEvent *) res.linkage_data;
+            (GstMpegTsDVBLinkageEvent *) res->linkage_data;
         g_printf ("%*s   target_event_id   : 0x%04x\n", spacing, "",
             linkage->target_event_id);
         g_printf ("%*s   target_listed     : %s\n", spacing, "",
@@ -359,7 +357,7 @@ dump_linkage (GstMpegTsDescriptor * desc, guint spacing)
       case GST_MPEGTS_DVB_LINKAGE_EXTENDED_EVENT:
       {
         guint i;
-        GPtrArray *items = (GPtrArray *) res.linkage_data;
+        GPtrArray *items = (GPtrArray *) res->linkage_data;
 
         for (i = 0; i < items->len; i++) {
           GstMpegTsDVBLinkageExtendedEvent *linkage =
@@ -398,31 +396,31 @@ dump_linkage (GstMpegTsDescriptor * desc, guint spacing)
       default:
         break;
     }
-    if (res.private_data_length > 0) {
-      dump_memory_bytes (res.private_data_bytes, res.private_data_length,
+    if (res->private_data_length > 0) {
+      dump_memory_bytes (res->private_data_bytes, res->private_data_length,
           spacing + 2);
-      g_free ((gpointer) res.private_data_bytes);
     }
+    gst_mpegts_dvb_linkage_descriptor_free (res);
   }
 }
 
 static void
 dump_component (GstMpegTsDescriptor * desc, guint spacing)
 {
-  GstMpegTsComponentDescriptor res;
-
-  res.text = NULL;
+  GstMpegTsComponentDescriptor *res;
 
   if (gst_mpegts_descriptor_parse_dvb_component (desc, &res)) {
     g_printf ("%*s stream_content : 0x%02x (%s)\n", spacing, "",
-        res.stream_content,
+        res->stream_content,
         enum_name (GST_TYPE_MPEG_TS_COMPONENT_STREAM_CONTENT,
-            res.stream_content));
-    g_printf ("%*s component_type : 0x%02x\n", spacing, "", res.component_type);
-    g_printf ("%*s component_tag  : 0x%02x\n", spacing, "", res.component_tag);
-    g_printf ("%*s language_code  : %s\n", spacing, "", res.language_code);
+            res->stream_content));
+    g_printf ("%*s component_type : 0x%02x\n", spacing, "",
+        res->component_type);
+    g_printf ("%*s component_tag  : 0x%02x\n", spacing, "", res->component_tag);
+    g_printf ("%*s language_code  : %s\n", spacing, "", res->language_code);
     g_printf ("%*s text           : %s\n", spacing, "",
-        res.text ? res.text : "NULL");
+        res->text ? res->text : "NULL");
+    gst_mpegts_dvb_component_descriptor_free (res);
   }
 }
 
@@ -452,35 +450,37 @@ static void
 dump_iso_639_language (GstMpegTsDescriptor * desc, guint spacing)
 {
   guint i;
-  GstMpegTsISO639LanguageDescriptor res;
+  GstMpegTsISO639LanguageDescriptor *res;
 
   if (gst_mpegts_descriptor_parse_iso_639_language (desc, &res)) {
-    for (i = 0; i < res.nb_language; i++)
+    for (i = 0; i < res->nb_language; i++) {
       g_print
-          ("%*s ISO 639 Language Descriptor %c%c%c , audio_type:0x%x (%s)\n",
-          spacing, "", res.language[i][0], res.language[i][1],
-          res.language[i][2], res.audio_type[i],
-          enum_name (GST_TYPE_MPEG_TS_ISO639_AUDIO_TYPE, res.audio_type[i]));
+          ("%*s ISO 639 Language Descriptor %s , audio_type:0x%x (%s)\n",
+          spacing, "", res->language[i], res->audio_type[i],
+          enum_name (GST_TYPE_MPEG_TS_ISO639_AUDIO_TYPE, res->audio_type[i]));
+    }
+    gst_mpegts_iso_639_language_descriptor_free (res);
   }
 }
 
 static void
 dump_dvb_extended_event (GstMpegTsDescriptor * desc, guint spacing)
 {
-  GstMpegTsExtendedEventDescriptor res;
+  GstMpegTsExtendedEventDescriptor *res;
 
   if (gst_mpegts_descriptor_parse_dvb_extended_event (desc, &res)) {
     guint i;
     g_printf ("%*s DVB Extended Event\n", spacing, "");
     g_printf ("%*s   descriptor_number:%d, last_descriptor_number:%d\n",
-        spacing, "", res.descriptor_number, res.last_descriptor_number);
-    g_printf ("%*s   language_code:%s\n", spacing, "", res.language_code);
-    g_printf ("%*s   text : %s\n", spacing, "", res.text);
-    for (i = 0; i < res.items->len; i++) {
-      GstMpegTsExtendedEventItem *item = g_ptr_array_index (res.items, i);
+        spacing, "", res->descriptor_number, res->last_descriptor_number);
+    g_printf ("%*s   language_code:%s\n", spacing, "", res->language_code);
+    g_printf ("%*s   text : %s\n", spacing, "", res->text);
+    for (i = 0; i < res->items->len; i++) {
+      GstMpegTsExtendedEventItem *item = g_ptr_array_index (res->items, i);
       g_printf ("%*s     #%d [description:item]  %s : %s\n",
           spacing, "", i, item->item_description, item->item);
     }
+    gst_mpegts_extended_event_descriptor_free (res);
   }
 }
 
@@ -579,8 +579,18 @@ dump_descriptors (GPtrArray * descriptors, guint spacing)
       }
       case GST_MTS_DESC_DVB_PRIVATE_DATA_SPECIFIER:
       {
-        if (!DUMP_DESCRIPTORS)
-          dump_memory_content (desc, spacing + 2);
+        guint32 specifier;
+        guint8 len = 0, *data = NULL;
+
+        if (gst_mpegts_descriptor_parse_dvb_private_data_specifier (desc,
+                &specifier, &data, &len)) {
+          g_printf ("%*s   private_data_specifier : 0x%08x\n", spacing, "",
+              specifier);
+          if (len > 0) {
+            dump_memory_bytes (data, len, spacing + 2);
+            g_free (data);
+          }
+        }
         break;
       }
       case GST_MTS_DESC_DVB_FREQUENCY_LIST:
@@ -647,6 +657,25 @@ dump_descriptors (GPtrArray * descriptors, guint spacing)
         }
         break;
       }
+      case GST_MTS_DESC_DVB_DATA_BROADCAST:
+      {
+        GstMpegTsDataBroadcastDescriptor *res;
+
+        if (gst_mpegts_descriptor_parse_dvb_data_broadcast (desc, &res)) {
+          g_printf ("%*s   data_broadcast_id : 0x%04x\n", spacing, "",
+              res->data_broadcast_id);
+          g_printf ("%*s   component_tag     : 0x%02x\n", spacing, "",
+              res->component_tag);
+          if (res->length > 0) {
+            g_printf ("%*s   selector_bytes:\n", spacing, "");
+            dump_memory_bytes (res->selector_bytes, res->length, spacing + 2);
+          }
+          g_printf ("%*s   text              : %s\n", spacing, "",
+              res->text ? res->text : "NULL");
+          gst_mpegts_dvb_data_broadcast_descriptor_free (res);
+        }
+        break;
+      }
       case GST_MTS_DESC_ISO_639_LANGUAGE:
         dump_iso_639_language (desc, spacing + 2);
         break;
@@ -672,7 +701,7 @@ dump_descriptors (GPtrArray * descriptors, guint spacing)
       }
       case GST_MTS_DESC_DVB_SUBTITLING:
       {
-        gchar lang[4];
+        gchar *lang;
         guint8 type;
         guint16 composition;
         guint16 ancillary;
@@ -687,13 +716,14 @@ dump_descriptors (GPtrArray * descriptors, guint spacing)
               composition);
           g_printf ("%*s      ancillary page id   : %u\n", spacing, "",
               ancillary);
+          g_free (lang);
         }
       }
         break;
       case GST_MTS_DESC_DVB_TELETEXT:
       {
         GstMpegTsDVBTeletextType type;
-        gchar lang[4];
+        gchar *lang;
         guint8 magazine, page_number;
         guint j;
 
@@ -705,6 +735,7 @@ dump_descriptors (GPtrArray * descriptors, guint spacing)
           g_printf ("%*s      language    : %s\n", spacing, "", lang);
           g_printf ("%*s      magazine    : %u\n", spacing, "", magazine);
           g_printf ("%*s      page number : %u\n", spacing, "", page_number);
+          g_free (lang);
         }
       }
         break;