summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Hervey <edward@collabora.com>2013-08-21 08:40:16 +0200
committerEdward Hervey <edward@collabora.com>2013-08-21 08:59:42 +0200
commit5d06aed3e204c2ae50bf10e61afce46c1baae2e2 (patch)
treee914e88db2eb16b617f46cd90bc88ef386c53145
parent006e7a3428bd097fc6e6c648332bff583dd434f9 (diff)
downloadgstreamer-plugins-bad-5d06aed3e204c2ae50bf10e61afce46c1baae2e2.tar.gz
mpegts: ABI/API break: Use GPtrArray instead of GArray
While it was a great idea, various g-i based bindings don't support GArray with entries greater than sizeof(gpointer) :( So let's just make everybody happy by just using GPtrArray. And since we're breaking the API, also rename the various descriptor fields to no longer have the descriptor_ prefix. It does cost a bit more in terms of memory/cpu usage, but makes it usable from bindings.
-rw-r--r--gst-libs/gst/mpegts/gst-dvb-descriptor.c37
-rw-r--r--gst-libs/gst/mpegts/gst-dvb-section.c87
-rw-r--r--gst-libs/gst/mpegts/gst-dvb-section.h14
-rw-r--r--gst-libs/gst/mpegts/gstmpegtsdescriptor.c115
-rw-r--r--gst-libs/gst/mpegts/gstmpegtsdescriptor.h21
-rw-r--r--gst-libs/gst/mpegts/gstmpegtssection.c64
-rw-r--r--gst-libs/gst/mpegts/gstmpegtssection.h13
-rw-r--r--tests/examples/mpegts/ts-parser.c18
8 files changed, 212 insertions, 157 deletions
diff --git a/gst-libs/gst/mpegts/gst-dvb-descriptor.c b/gst-libs/gst/mpegts/gst-dvb-descriptor.c
index 17b2845cd..5f2faf231 100644
--- a/gst-libs/gst/mpegts/gst-dvb-descriptor.c
+++ b/gst-libs/gst/mpegts/gst-dvb-descriptor.c
@@ -67,12 +67,11 @@ gboolean
gst_mpegts_descriptor_parse_dvb_network_name (const GstMpegTsDescriptor *
descriptor, gchar ** name)
{
- g_return_val_if_fail (descriptor != NULL
- && descriptor->descriptor_data != NULL, FALSE);
- g_return_val_if_fail (descriptor->descriptor_tag == 0x40, FALSE);
+ g_return_val_if_fail (descriptor != NULL && descriptor->data != NULL, FALSE);
+ g_return_val_if_fail (descriptor->tag == 0x40, FALSE);
- *name = get_encoding_and_convert ((gchar *) descriptor->descriptor_data + 2,
- descriptor->descriptor_data[1]);
+ *name = get_encoding_and_convert ((gchar *) descriptor->data + 2,
+ descriptor->data[1]);
return TRUE;
}
@@ -93,12 +92,11 @@ gst_mpegts_descriptor_parse_satellite_delivery_system (const GstMpegTsDescriptor
guint8 *data;
guint8 tmp;
- g_return_val_if_fail (descriptor != NULL
- && descriptor->descriptor_data != NULL, FALSE);
+ g_return_val_if_fail (descriptor != NULL && descriptor->data != NULL, FALSE);
g_return_val_if_fail (res != NULL, FALSE);
- g_return_val_if_fail (descriptor->descriptor_tag == 0x43, FALSE);
+ g_return_val_if_fail (descriptor->tag == 0x43, FALSE);
- data = (guint8 *) descriptor->descriptor_data + 2;
+ data = (guint8 *) descriptor->data + 2;
#define BCD_UN(a) ((a) & 0x0f)
#define BCD_DEC(a) (((a) >> 4) & 0x0f)
@@ -169,12 +167,11 @@ gst_mpegts_descriptor_parse_cable_delivery_system (const GstMpegTsDescriptor *
{
guint8 *data;
- g_return_val_if_fail (descriptor != NULL
- && descriptor->descriptor_data != NULL, FALSE);
+ g_return_val_if_fail (descriptor != NULL && descriptor->data != NULL, FALSE);
g_return_val_if_fail (res != NULL, FALSE);
- g_return_val_if_fail (descriptor->descriptor_tag == 0x44, FALSE);
+ g_return_val_if_fail (descriptor->tag == 0x44, FALSE);
- data = (guint8 *) descriptor->descriptor_data + 2;
+ data = (guint8 *) descriptor->data + 2;
/* BCD in MHz, decimal place after the fourth character */
res->frequency = BCD_32 (data) * 100;
data += 5;
@@ -235,11 +232,10 @@ gst_mpegts_descriptor_parse_dvb_service (const GstMpegTsDescriptor *
{
guint8 *data;
- g_return_val_if_fail (descriptor != NULL
- && descriptor->descriptor_data != NULL, FALSE);
- g_return_val_if_fail (descriptor->descriptor_tag == 0x48, FALSE);
+ g_return_val_if_fail (descriptor != NULL && descriptor->data != NULL, FALSE);
+ g_return_val_if_fail (descriptor->tag == 0x48, FALSE);
- data = (guint8 *) descriptor->descriptor_data + 2;
+ data = (guint8 *) descriptor->data + 2;
if (service_type)
*service_type = *data;
@@ -271,11 +267,10 @@ gst_mpegts_descriptor_parse_dvb_short_event (const GstMpegTsDescriptor *
{
guint8 *data;
- g_return_val_if_fail (descriptor != NULL
- && descriptor->descriptor_data != NULL, FALSE);
- g_return_val_if_fail (descriptor->descriptor_tag == 0x4D, FALSE);
+ g_return_val_if_fail (descriptor != NULL && descriptor->data != NULL, FALSE);
+ g_return_val_if_fail (descriptor->tag == 0x4D, FALSE);
- data = (guint8 *) descriptor->descriptor_data + 2;
+ data = (guint8 *) descriptor->data + 2;
if (language_code) {
*language_code = g_malloc0 (4);
diff --git a/gst-libs/gst/mpegts/gst-dvb-section.c b/gst-libs/gst/mpegts/gst-dvb-section.c
index 48facddcd..0d9b203fa 100644
--- a/gst-libs/gst/mpegts/gst-dvb-section.c
+++ b/gst-libs/gst/mpegts/gst-dvb-section.c
@@ -98,8 +98,13 @@ _parse_utc_time (guint8 * data)
static GstMpegTsEITEvent *
_gst_mpegts_eit_event_copy (GstMpegTsEITEvent * eit)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsEITEvent *copy;
+
+ copy = g_slice_dup (GstMpegTsEITEvent, eit);
+ copy->start_time = gst_date_time_ref (eit->start_time);
+ copy->descriptors = g_ptr_array_ref (eit->descriptors);
+
+ return copy;
}
static void
@@ -107,7 +112,7 @@ _gst_mpegts_eit_event_free (GstMpegTsEITEvent * eit)
{
if (eit->start_time)
gst_date_time_unref (eit->start_time);
- g_array_unref (eit->descriptors);
+ g_ptr_array_unref (eit->descriptors);
g_slice_free (GstMpegTsEITEvent, eit);
}
@@ -118,8 +123,12 @@ G_DEFINE_BOXED_TYPE (GstMpegTsEITEvent, gst_mpegts_eit_event,
static GstMpegTsEIT *
_gst_mpegts_eit_copy (GstMpegTsEIT * eit)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsEIT *copy;
+
+ copy = g_slice_dup (GstMpegTsEIT, eit);
+ copy->events = g_ptr_array_ref (eit->events);
+
+ return copy;
}
static void
@@ -247,14 +256,18 @@ gst_mpegts_section_get_eit (GstMpegTsSection * section)
static GstMpegTsBATStream *
_gst_mpegts_bat_stream_copy (GstMpegTsBATStream * bat)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsBATStream *copy;
+
+ copy = g_slice_dup (GstMpegTsBATStream, bat);
+ copy->descriptors = g_ptr_array_ref (bat->descriptors);
+
+ return copy;
}
static void
_gst_mpegts_bat_stream_free (GstMpegTsBATStream * bat)
{
- g_array_unref (bat->descriptors);
+ g_ptr_array_unref (bat->descriptors);
g_slice_free (GstMpegTsBATStream, bat);
}
@@ -265,14 +278,19 @@ G_DEFINE_BOXED_TYPE (GstMpegTsBATStream, gst_mpegts_bat_stream,
static GstMpegTsBAT *
_gst_mpegts_bat_copy (GstMpegTsBAT * bat)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsBAT *copy;
+
+ copy = g_slice_dup (GstMpegTsBAT, bat);
+ copy->descriptors = g_ptr_array_ref (bat->descriptors);
+ copy->streams = g_ptr_array_ref (bat->streams);
+
+ return copy;
}
static void
_gst_mpegts_bat_free (GstMpegTsBAT * bat)
{
- g_array_unref (bat->descriptors);
+ g_ptr_array_unref (bat->descriptors);
g_ptr_array_unref (bat->streams);
g_slice_free (GstMpegTsBAT, bat);
}
@@ -414,14 +432,18 @@ gst_mpegts_section_get_bat (GstMpegTsSection * section)
static GstMpegTsNITStream *
_gst_mpegts_nit_stream_copy (GstMpegTsNITStream * nit)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsNITStream *copy;
+
+ copy = g_slice_dup (GstMpegTsNITStream, nit);
+ copy->descriptors = g_ptr_array_ref (nit->descriptors);
+
+ return copy;
}
static void
_gst_mpegts_nit_stream_free (GstMpegTsNITStream * nit)
{
- g_array_unref (nit->descriptors);
+ g_ptr_array_unref (nit->descriptors);
g_slice_free (GstMpegTsNITStream, nit);
}
@@ -432,14 +454,18 @@ G_DEFINE_BOXED_TYPE (GstMpegTsNITStream, gst_mpegts_nit_stream,
static GstMpegTsNIT *
_gst_mpegts_nit_copy (GstMpegTsNIT * nit)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsNIT *copy = g_slice_dup (GstMpegTsNIT, nit);
+
+ copy->descriptors = g_ptr_array_ref (nit->descriptors);
+ copy->streams = g_ptr_array_ref (nit->streams);
+
+ return copy;
}
static void
_gst_mpegts_nit_free (GstMpegTsNIT * nit)
{
- g_array_unref (nit->descriptors);
+ g_ptr_array_unref (nit->descriptors);
g_ptr_array_unref (nit->streams);
g_slice_free (GstMpegTsNIT, nit);
}
@@ -584,14 +610,17 @@ gst_mpegts_section_get_nit (GstMpegTsSection * section)
static GstMpegTsSDTService *
_gst_mpegts_sdt_service_copy (GstMpegTsSDTService * sdt)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsSDTService *copy = g_slice_dup (GstMpegTsSDTService, sdt);
+
+ copy->descriptors = g_ptr_array_ref (sdt->descriptors);
+
+ return copy;
}
static void
_gst_mpegts_sdt_service_free (GstMpegTsSDTService * sdt)
{
- g_array_unref (sdt->descriptors);
+ g_ptr_array_unref (sdt->descriptors);
g_slice_free (GstMpegTsSDTService, sdt);
}
@@ -602,8 +631,11 @@ G_DEFINE_BOXED_TYPE (GstMpegTsSDTService, gst_mpegts_sdt_service,
static GstMpegTsSDT *
_gst_mpegts_sdt_copy (GstMpegTsSDT * sdt)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsSDT *copy = g_slice_dup (GstMpegTsSDT, sdt);
+
+ copy->services = g_ptr_array_ref (sdt->services);
+
+ return copy;
}
static void
@@ -769,8 +801,13 @@ gst_mpegts_section_get_tdt (GstMpegTsSection * section)
static GstMpegTsTOT *
_gst_mpegts_tot_copy (GstMpegTsTOT * tot)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsTOT *copy = g_slice_dup (GstMpegTsTOT, tot);
+
+ if (tot->utc_time)
+ copy->utc_time = gst_date_time_ref (tot->utc_time);
+ copy->descriptors = g_ptr_array_ref (tot->descriptors);
+
+ return copy;
}
static void
@@ -778,7 +815,7 @@ _gst_mpegts_tot_free (GstMpegTsTOT * tot)
{
if (tot->utc_time)
gst_date_time_unref (tot->utc_time);
- g_array_unref (tot->descriptors);
+ g_ptr_array_unref (tot->descriptors);
g_slice_free (GstMpegTsTOT, tot);
}
diff --git a/gst-libs/gst/mpegts/gst-dvb-section.h b/gst-libs/gst/mpegts/gst-dvb-section.h
index ebee4346e..502318280 100644
--- a/gst-libs/gst/mpegts/gst-dvb-section.h
+++ b/gst-libs/gst/mpegts/gst-dvb-section.h
@@ -137,7 +137,7 @@ struct _GstMpegTsNITStream
guint16 transport_stream_id;
guint16 original_network_id;
- GArray *descriptors;
+ GPtrArray *descriptors;
};
/**
@@ -155,7 +155,7 @@ struct _GstMpegTsNIT
{
gboolean actual_network;
- GArray *descriptors;
+ GPtrArray *descriptors;
GPtrArray *streams;
};
@@ -178,7 +178,7 @@ struct _GstMpegTsBATStream
guint16 transport_stream_id;
guint16 original_network_id;
- GArray *descriptors;
+ GPtrArray *descriptors;
};
/**
@@ -190,7 +190,7 @@ struct _GstMpegTsBATStream
*/
struct _GstMpegTsBAT
{
- GArray *descriptors;
+ GPtrArray *descriptors;
GPtrArray *streams;
};
@@ -216,7 +216,7 @@ struct _GstMpegTsSDTService
GstMpegTsRunningStatus running_status;
gboolean free_CA_mode;
- GArray *descriptors;
+ GPtrArray *descriptors;
};
/**
@@ -260,7 +260,7 @@ struct _GstMpegTsEITEvent
GstMpegTsRunningStatus running_status;
gboolean free_CA_mode;
- GArray *descriptors;
+ GPtrArray *descriptors;
};
/**
@@ -302,7 +302,7 @@ struct _GstMpegTsTOT
{
GstDateTime *utc_time;
- GArray *descriptors;
+ GPtrArray *descriptors;
};
GType gst_mpegts_tot_get_type (void);
diff --git a/gst-libs/gst/mpegts/gstmpegtsdescriptor.c b/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
index f890b0aac..16a7741ee 100644
--- a/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
+++ b/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
@@ -465,6 +465,27 @@ failed:
}
}
+static GstMpegTsDescriptor *
+_copy_descriptor (GstMpegTsDescriptor * desc)
+{
+ GstMpegTsDescriptor *copy;
+
+ copy = g_slice_dup (GstMpegTsDescriptor, desc);
+ copy->data = g_memdup (desc->data, desc->length + 2);
+
+ return copy;
+}
+
+static void
+_free_descriptor (GstMpegTsDescriptor * desc)
+{
+ g_free ((gpointer) desc->data);
+ g_slice_free (GstMpegTsDescriptor, desc);
+}
+
+G_DEFINE_BOXED_TYPE (GstMpegTsDescriptor, gst_mpegts_descriptor,
+ (GBoxedCopyFunc) _copy_descriptor, (GBoxedFreeFunc) _free_descriptor);
+
/**
* gst_mpegts_parse_descriptors:
* @buffer: (transfer none): descriptors to parse
@@ -479,20 +500,22 @@ failed:
* array of the parsed descriptors or %NULL if there was an error.
* Release with #g_array_unref when done with it.
*/
-GArray *
+GPtrArray *
gst_mpegts_parse_descriptors (guint8 * buffer, gsize buf_len)
{
- GArray *res;
+ GPtrArray *res;
guint8 length;
guint8 *data;
guint i, nb_desc = 0;
/* fast-path */
if (buf_len == 0)
- return g_array_new (FALSE, FALSE, sizeof (GstMpegTsDescriptor));
+ return g_ptr_array_new ();
data = buffer;
+ GST_MEMDUMP ("Full descriptor array", buffer, buf_len);
+
while (data - buffer < buf_len) {
data++; /* skip tag */
length = *data++;
@@ -516,26 +539,28 @@ gst_mpegts_parse_descriptors (guint8 * buffer, gsize buf_len)
return NULL;
}
- res = g_array_sized_new (FALSE, FALSE, sizeof (GstMpegTsDescriptor), nb_desc);
+ res = g_ptr_array_new_full (nb_desc + 1, (GDestroyNotify) _free_descriptor);
data = buffer;
for (i = 0; i < nb_desc; i++) {
- GstMpegTsDescriptor *desc = &g_array_index (res, GstMpegTsDescriptor, i);
-
- desc->descriptor_data = data;
- desc->descriptor_tag = *data++;
- desc->descriptor_length = *data++;
- GST_LOG ("descriptor 0x%02x length:%d", desc->descriptor_tag,
- desc->descriptor_length);
- GST_MEMDUMP ("descriptor", desc->descriptor_data + 2,
- desc->descriptor_length);
- /* Adjust for extended descriptors */
- if (G_UNLIKELY (desc->descriptor_tag == 0x7f)) {
- desc->descriptor_tag_extension = *data++;
- desc->descriptor_length -= 1;
- }
- data += desc->descriptor_length;
+ GstMpegTsDescriptor *desc = g_slice_new0 (GstMpegTsDescriptor);
+
+ desc->data = data;
+ desc->tag = *data++;
+ desc->length = *data++;
+ /* Copy the data now that we known the size */
+ desc->data = g_memdup (desc->data, desc->length + 2);
+ GST_LOG ("descriptor 0x%02x length:%d", desc->tag, desc->length);
+ GST_MEMDUMP ("descriptor", desc->data + 2, desc->length);
+ /* extended descriptors */
+ if (G_UNLIKELY (desc->tag == 0x7f))
+ desc->tag_extension = *data;
+
+ data += desc->length;
+
+ /* Set the descriptor in the array */
+ g_ptr_array_index (res, i) = desc;
}
res->len = nb_desc;
@@ -557,7 +582,7 @@ gst_mpegts_parse_descriptors (guint8 * buffer, gsize buf_len)
* Returns: (transfer none): the first descriptor matchin @tag, else %NULL.
*/
const GstMpegTsDescriptor *
-gst_mpegts_find_descriptor (GArray * descriptors, guint8 tag)
+gst_mpegts_find_descriptor (GPtrArray * descriptors, guint8 tag)
{
guint i, nb_desc;
@@ -565,41 +590,13 @@ gst_mpegts_find_descriptor (GArray * descriptors, guint8 tag)
nb_desc = descriptors->len;
for (i = 0; i < nb_desc; i++) {
- GstMpegTsDescriptor *desc =
- &g_array_index (descriptors, GstMpegTsDescriptor, i);
- if (desc->descriptor_tag == tag)
+ GstMpegTsDescriptor *desc = g_ptr_array_index (descriptors, i);
+ if (desc->tag == tag)
return (const GstMpegTsDescriptor *) desc;
}
return NULL;
}
-static GstMpegTsDescriptor *
-_copy_descriptor (GstMpegTsDescriptor * desc)
-{
- GstMpegTsDescriptor *copy;
-
- copy = g_new0 (GstMpegTsDescriptor, 1);
- copy->descriptor_tag = desc->descriptor_tag;
- copy->descriptor_tag_extension = desc->descriptor_tag_extension;
- copy->descriptor_length = desc->descriptor_length;
- copy->descriptor_data =
- g_memdup (desc->descriptor_data, desc->descriptor_length);
-
- return copy;
-}
-
-/* This freefunc will only ever be used with descriptors returned by the
- * above function. That is why we free the descriptor data (unlike the
- * descriptors created in _parse_descriptors()) */
-static void
-_free_descriptor (GstMpegTsDescriptor * desc)
-{
- g_free ((gpointer) desc->descriptor_data);
- g_free (desc);
-}
-
-G_DEFINE_BOXED_TYPE (GstMpegTsDescriptor, gst_mpegts_descriptor,
- (GBoxedCopyFunc) _copy_descriptor, (GBoxedFreeFunc) _free_descriptor);
/* GST_MTS_DESC_ISO_639_LANGUAGE (0x0A) */
/**
@@ -621,14 +618,13 @@ gst_mpegts_descriptor_parse_iso_639_language (const GstMpegTsDescriptor *
guint i;
guint8 *data;
- g_return_val_if_fail (descriptor != NULL
- && descriptor->descriptor_data != NULL, FALSE);
+ g_return_val_if_fail (descriptor != NULL && descriptor->data != NULL, FALSE);
g_return_val_if_fail (res != NULL, FALSE);
- g_return_val_if_fail (descriptor->descriptor_tag == 0x0A, FALSE);
+ g_return_val_if_fail (descriptor->tag == 0x0A, FALSE);
- data = (guint8 *) descriptor->descriptor_data + 2;
+ data = (guint8 *) descriptor->data + 2;
/* Each language is 3 + 1 bytes */
- res->nb_language = descriptor->descriptor_length / 4;
+ res->nb_language = descriptor->length / 4;
for (i = 0; i < res->nb_language; i++) {
memcpy (res->language[i], data, 3);
res->audio_type[i] = data[3];
@@ -654,12 +650,11 @@ gst_mpegts_descriptor_parse_logical_channel (const GstMpegTsDescriptor *
guint i;
guint8 *data;
- g_return_val_if_fail (descriptor != NULL
- && descriptor->descriptor_data != NULL, FALSE);
- g_return_val_if_fail (descriptor->descriptor_tag == 0x83, FALSE);
+ g_return_val_if_fail (descriptor != NULL && descriptor->data != NULL, FALSE);
+ g_return_val_if_fail (descriptor->tag == 0x83, FALSE);
- data = (guint8 *) descriptor->descriptor_data;
- res->nb_channels = descriptor->descriptor_length / 4;
+ data = (guint8 *) descriptor->data;
+ res->nb_channels = descriptor->length / 4;
for (i = 0; i < res->nb_channels; i++) {
res->channels[i].service_id = GST_READ_UINT16_BE (data);
diff --git a/gst-libs/gst/mpegts/gstmpegtsdescriptor.h b/gst-libs/gst/mpegts/gstmpegtsdescriptor.h
index 2ac27b16d..c976cc13f 100644
--- a/gst-libs/gst/mpegts/gstmpegtsdescriptor.h
+++ b/gst-libs/gst/mpegts/gstmpegtsdescriptor.h
@@ -239,24 +239,25 @@ GType gst_mpegts_descriptor_get_type (void);
/**
* GstMpegTsDescriptor:
- * @descriptor_tag: the type of descriptor
- * @descriptor_tag_extension: the extended type (if @descriptor_tag is 0x7f)
- * @descriptor_length: the length of the descriptor content (excluding tag/length field)
- * @descriptor_data: the full descriptor data (including tag, extension, length)
+ * @tag: the type of descriptor
+ * @tag_extension: the extended type (if @descriptor_tag is 0x7f)
+ * @length: the length of the descriptor content (excluding tag/length field)
+ * @data: the full descriptor data (including tag, extension, length). The first
+ * two bytes are the @tag and @tag_extension.
*
* Mpeg-TS descriptor (ISO/IEC 13818-1).
*/
struct _GstMpegTsDescriptor
{
- guint8 descriptor_tag;
- guint8 descriptor_tag_extension;
- guint8 descriptor_length;
- const guint8 *descriptor_data;
+ guint8 tag;
+ guint8 tag_extension;
+ guint8 length;
+ const guint8 *data;
};
-GArray *gst_mpegts_parse_descriptors (guint8 * buffer, gsize buf_len);
+GPtrArray *gst_mpegts_parse_descriptors (guint8 * buffer, gsize buf_len);
-const GstMpegTsDescriptor * gst_mpegts_find_descriptor (GArray *descriptors,
+const GstMpegTsDescriptor * gst_mpegts_find_descriptor (GPtrArray *descriptors,
guint8 tag);
/* GST_MTS_DESC_ISO_639_LANGUAGE (0x0A) */
diff --git a/gst-libs/gst/mpegts/gstmpegtssection.c b/gst-libs/gst/mpegts/gstmpegtssection.c
index 1a431954e..6b6b3ece6 100644
--- a/gst-libs/gst/mpegts/gstmpegtssection.c
+++ b/gst-libs/gst/mpegts/gstmpegtssection.c
@@ -316,12 +316,27 @@ gst_message_new_mpegts_section (GstObject * parent, GstMpegTsSection * section)
return msg;
}
+static GstMpegTsPatProgram *
+_mpegts_pat_program_copy (GstMpegTsPatProgram * orig)
+{
+ return g_slice_dup (GstMpegTsPatProgram, orig);
+}
+
+static void
+_mpegts_pat_program_free (GstMpegTsPatProgram * orig)
+{
+ g_slice_free (GstMpegTsPatProgram, orig);
+}
+
+G_DEFINE_BOXED_TYPE (GstMpegTsPatProgram, gst_mpegts_pat_program,
+ (GBoxedCopyFunc) _mpegts_pat_program_copy,
+ (GFreeFunc) _mpegts_pat_program_free);
/* Program Association Table */
static gpointer
_parse_pat (GstMpegTsSection * section)
{
- GArray *pat;
+ GPtrArray *pat;
guint16 i = 0, nb_programs;
GstMpegTsPatProgram *program;
guint8 *data, *end;
@@ -335,24 +350,26 @@ _parse_pat (GstMpegTsSection * section)
/* Initialize program list */
nb_programs = (end - 4 - data) / 4;
pat =
- g_array_sized_new (FALSE, FALSE, sizeof (GstMpegTsPatProgram),
- nb_programs);
+ g_ptr_array_new_full (nb_programs,
+ (GDestroyNotify) _mpegts_pat_program_free);
while (data < end - 4) {
- program = &g_array_index (pat, GstMpegTsPatProgram, i);
+ program = g_slice_new0 (GstMpegTsPatProgram);
program->program_number = GST_READ_UINT16_BE (data);
data += 2;
program->network_or_program_map_PID = GST_READ_UINT16_BE (data) & 0x1FFF;
data += 2;
+ g_ptr_array_index (pat, i) = program;
+
i++;
}
pat->len = nb_programs;
if (data != end - 4) {
GST_ERROR ("at the end of PAT data != end - 4");
- g_array_unref (pat);
+ g_ptr_array_unref (pat);
return NULL;
}
@@ -375,7 +392,7 @@ _parse_pat (GstMpegTsSection * section)
* #GstMpegTsPatProgram contained in the section, or %NULL if an error
* happened. Release with #g_ptr_array_unref when done.
*/
-GArray *
+GPtrArray *
gst_mpegts_section_get_pat (GstMpegTsSection * section)
{
g_return_val_if_fail (section->section_type == GST_MPEGTS_SECTION_PAT, NULL);
@@ -384,10 +401,10 @@ gst_mpegts_section_get_pat (GstMpegTsSection * section)
if (!section->cached_parsed)
section->cached_parsed =
__common_desc_checks (section, 12, _parse_pat,
- (GDestroyNotify) g_array_unref);
+ (GDestroyNotify) g_ptr_array_unref);
if (section->cached_parsed)
- return g_array_ref ((GArray *) section->cached_parsed);
+ return g_ptr_array_ref ((GPtrArray *) section->cached_parsed);
return NULL;
}
@@ -397,14 +414,18 @@ gst_mpegts_section_get_pat (GstMpegTsSection * section)
static GstMpegTsPMTStream *
_gst_mpegts_pmt_stream_copy (GstMpegTsPMTStream * pmt)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsPMTStream *copy;
+
+ copy = g_slice_dup (GstMpegTsPMTStream, pmt);
+ copy->descriptors = g_ptr_array_ref (pmt->descriptors);
+
+ return copy;
}
static void
_gst_mpegts_pmt_stream_free (GstMpegTsPMTStream * pmt)
{
- g_array_unref (pmt->descriptors);
+ g_ptr_array_unref (pmt->descriptors);
g_slice_free (GstMpegTsPMTStream, pmt);
}
@@ -415,14 +436,19 @@ G_DEFINE_BOXED_TYPE (GstMpegTsPMTStream, gst_mpegts_pmt_stream,
static GstMpegTsPMT *
_gst_mpegts_pmt_copy (GstMpegTsPMT * pmt)
{
- /* FIXME : IMPLEMENT */
- return NULL;
+ GstMpegTsPMT *copy;
+
+ copy = g_slice_dup (GstMpegTsPMT, pmt);
+ copy->descriptors = g_ptr_array_ref (pmt->descriptors);
+ copy->streams = g_ptr_array_ref (pmt->streams);
+
+ return copy;
}
static void
_gst_mpegts_pmt_free (GstMpegTsPMT * pmt)
{
- g_array_unref (pmt->descriptors);
+ g_ptr_array_unref (pmt->descriptors);
g_ptr_array_unref (pmt->streams);
g_slice_free (GstMpegTsPMT, pmt);
}
@@ -564,7 +590,7 @@ _parse_cat (GstMpegTsSection * section)
* #GstMpegTsDescriptor contained in the section, or %NULL if an error
* happened. Release with #g_array_unref when done.
*/
-GArray *
+GPtrArray *
gst_mpegts_section_get_cat (GstMpegTsSection * section)
{
g_return_val_if_fail (section->section_type == GST_MPEGTS_SECTION_CAT, NULL);
@@ -573,10 +599,10 @@ gst_mpegts_section_get_cat (GstMpegTsSection * section)
if (!section->cached_parsed)
section->cached_parsed =
__common_desc_checks (section, 12, _parse_cat,
- (GDestroyNotify) g_array_unref);
+ (GDestroyNotify) g_ptr_array_unref);
if (section->cached_parsed)
- return g_array_ref ((GArray *) section->cached_parsed);
+ return g_ptr_array_ref ((GPtrArray *) section->cached_parsed);
return NULL;
}
@@ -591,14 +617,14 @@ gst_mpegts_section_get_cat (GstMpegTsSection * section)
* #GstMpegTsDescriptor contained in the section, or %NULL if an error
* happened. Release with #g_array_unref when done.
*/
-GArray *
+GPtrArray *
gst_mpegts_section_get_tsdt (GstMpegTsSection * section)
{
g_return_val_if_fail (section->section_type == GST_MPEGTS_SECTION_TSDT, NULL);
g_return_val_if_fail (section->cached_parsed || section->data, NULL);
if (section->cached_parsed)
- return g_array_ref ((GArray *) section->cached_parsed);
+ return g_ptr_array_ref ((GPtrArray *) section->cached_parsed);
/* FIXME : parse TSDT */
return NULL;
diff --git a/gst-libs/gst/mpegts/gstmpegtssection.h b/gst-libs/gst/mpegts/gstmpegtssection.h
index 766e0c195..c7b9677d3 100644
--- a/gst-libs/gst/mpegts/gstmpegtssection.h
+++ b/gst-libs/gst/mpegts/gstmpegtssection.h
@@ -157,6 +157,8 @@ struct _GstMpegTsSection
/* PAT */
+#define GST_TYPE_MPEGTS_PAT_PROGRAM (gst_mpegts_pat_program_get_type())
+
typedef struct _GstMpegTsPatProgram GstMpegTsPatProgram;
/**
* GstMpegTsPatProgram:
@@ -171,11 +173,12 @@ struct _GstMpegTsPatProgram
guint16 network_or_program_map_PID;
};
-GArray *gst_mpegts_section_get_pat (GstMpegTsSection *section);
+GPtrArray *gst_mpegts_section_get_pat (GstMpegTsSection *section);
+GType gst_mpegts_pat_program_get_type (void);
/* CAT */
-GArray *gst_mpegts_section_get_cat (GstMpegTsSection *section);
+GPtrArray *gst_mpegts_section_get_cat (GstMpegTsSection *section);
/* PMT */
typedef struct _GstMpegTsPMTStream GstMpegTsPMTStream;
@@ -312,7 +315,7 @@ struct _GstMpegTsPMTStream
guint8 stream_type;
guint16 pid;
- GArray *descriptors;
+ GPtrArray *descriptors;
};
/**
@@ -330,7 +333,7 @@ struct _GstMpegTsPMT
{
guint16 pcr_pid;
- GArray *descriptors;
+ GPtrArray *descriptors;
GPtrArray *streams;
};
@@ -341,7 +344,7 @@ const GstMpegTsPMT *gst_mpegts_section_get_pmt (GstMpegTsSection *section);
/* TSDT */
-GArray *gst_mpegts_section_get_tsdt (GstMpegTsSection *section);
+GPtrArray *gst_mpegts_section_get_tsdt (GstMpegTsSection *section);
/* generic */
diff --git a/tests/examples/mpegts/ts-parser.c b/tests/examples/mpegts/ts-parser.c
index 26d32c2f3..89db16f07 100644
--- a/tests/examples/mpegts/ts-parser.c
+++ b/tests/examples/mpegts/ts-parser.c
@@ -120,20 +120,18 @@ dump_iso_639_language (GstMpegTsDescriptor * desc, guint spacing)
static void
-dump_descriptors (GArray * descriptors, guint spacing)
+dump_descriptors (GPtrArray * descriptors, guint spacing)
{
guint i;
for (i = 0; i < descriptors->len; i++) {
- GstMpegTsDescriptor *desc =
- &g_array_index (descriptors, GstMpegTsDescriptor, i);
+ GstMpegTsDescriptor *desc = g_ptr_array_index (descriptors, i);
g_printf ("%*s [descriptor 0x%02x (%s) length:%d]\n", spacing, "",
- desc->descriptor_tag, descriptor_name (desc->descriptor_tag),
- desc->descriptor_length);
- switch (desc->descriptor_tag) {
+ desc->tag, descriptor_name (desc->tag), desc->length);
+ switch (desc->tag) {
case GST_MTS_DESC_REGISTRATION:
{
- const guint8 *data = desc->descriptor_data + 2;
+ const guint8 *data = desc->data + 2;
#define SAFE_CHAR(a) (g_ascii_isalnum(a) ? a : '.')
g_printf ("%*s Registration : %c%c%c%c\n", spacing, "",
SAFE_CHAR (data[0]), SAFE_CHAR (data[1]),
@@ -201,14 +199,14 @@ dump_descriptors (GArray * descriptors, guint spacing)
static void
dump_pat (GstMpegTsSection * section)
{
- GArray *pat = gst_mpegts_section_get_pat (section);
+ GPtrArray *pat = gst_mpegts_section_get_pat (section);
guint i, len;
len = pat->len;
g_printf (" %d program(s):\n", len);
for (i = 0; i < len; i++) {
- GstMpegTsPatProgram *patp = &g_array_index (pat, GstMpegTsPatProgram, i);
+ GstMpegTsPatProgram *patp = g_ptr_array_index (pat, i);
g_print
(" program_number:%6d (0x%04x), network_or_program_map_PID:0x%04x\n",
@@ -216,7 +214,7 @@ dump_pat (GstMpegTsSection * section)
patp->network_or_program_map_PID);
}
- g_array_unref (pat);
+ g_ptr_array_unref (pat);
}
static void