gst/mpegtsparse/: Parsed the satellite delivery system descriptor and added into nit's transport structure for delive...

Original commit message from CVS:
* gst/mpegtsparse/gstmpegdesc.h:
* gst/mpegtsparse/mpegtspacketizer.c:
Parsed the satellite delivery system descriptor and
added into nit's transport structure for delivery
over the bus.
This commit is contained in:
Zaheer Abbas Merali 2008-01-23 09:49:27 +00:00
parent 450442adae
commit 457fd5e1af
3 changed files with 146 additions and 2 deletions

View file

@ -1,3 +1,11 @@
2008-01-23 Zaheer Abbas Merali <zaheerabbas at merali dot org>
* gst/mpegtsparse/gstmpegdesc.h:
* gst/mpegtsparse/mpegtspacketizer.c:
Parsed the satellite delivery system descriptor and
added into nit's transport structure for delivery
over the bus.
2008-01-22 Zaheer Abbas Merali <zaheerabbas at merali dot org>
* gst/mpegtsparse/mpegtspacketizer.c:

View file

@ -265,6 +265,15 @@
#define DESC_DVB_SHORT_EVENT_description_text(desc) (desc + 6 + DESC_DVB_SHORT_EVENT_name_length(desc) + 1)
#define DESC_DVB_SHORT_EVENT_description_length(desc) (desc[6 + DESC_DVB_SHORT_EVENT_name_length(desc)])
/* DVB Satellite Delivery System Descriptor */
#define DESC_DVB_SATELLITE_DELIVERY_SYSTEM_frequency(desc) (desc + 2)
#define DESC_DVB_SATELLITE_DELIVERY_SYSTEM_orbital_position(desc) (desc + 6)
#define DESC_DVB_SATELLITE_DELIVERY_SYSTEM_west_east_flag(desc) ((desc[8] & 0x80) == 0x80)
#define DESC_DVB_SATELLITE_DELIVERY_SYSTEM_polarization(desc) ((desc[8] & 0x60) >> 5)
#define DESC_DVB_SATELLITE_DELIVERY_SYSTEM_modulation(desc) (desc[8] & 0x1F)
#define DESC_DVB_SATELLITE_DELIVERY_SYSTEM_symbol_rate(desc) (desc + 9)
#define DESC_DVB_SATELLITE_DELIVERY_SYSTEM_fec_inner(desc) (desc[12] & 0x0F)
typedef struct {
guint n_desc;
guint8 data_length;

View file

@ -548,7 +548,7 @@ GstStructure *
mpegts_packetizer_parse_nit (MpegTSPacketizer * packetizer,
MpegTSPacketizerSection * section)
{
GstStructure *nit = NULL, *transport = NULL;
GstStructure *nit = NULL, *transport = NULL, *satellite = NULL;
guint8 *data, *end, *entry_begin;
guint16 network_id, transport_stream_id, original_network_id;
guint tmp;
@ -626,7 +626,6 @@ mpegts_packetizer_parse_nit (MpegTSPacketizer * packetizer,
NULL);
g_free (networkname_tmp);
}
gst_mpeg_descriptor_free (mpegdescriptor);
descriptors = g_value_array_new (0);
@ -681,6 +680,134 @@ mpegts_packetizer_parse_nit (MpegTSPacketizer * packetizer,
gst_structure_free (transport);
goto error;
}
GstMPEGDescriptor *mpegdescriptor =
gst_mpeg_descriptor_parse (data, descriptors_loop_length);
guint8 *satellitedelivery;
if ((satellitedelivery =
gst_mpeg_descriptor_find (mpegdescriptor,
DESC_DVB_SATELLITE_DELIVERY_SYSTEM))) {
guint8 *frequency_bcd =
DESC_DVB_SATELLITE_DELIVERY_SYSTEM_frequency (satellitedelivery);
guint32 frequency =
10 * ((frequency_bcd[3] & 0x0F) +
10 * ((frequency_bcd[3] & 0xF0) >> 4) +
100 * (frequency_bcd[2] & 0x0F) +
1000 * ((frequency_bcd[2] & 0xF0) >> 4) +
10000 * (frequency_bcd[1] & 0x0F) +
100000 * ((frequency_bcd[1] & 0xF0) >> 4) +
1000000 * (frequency_bcd[0] & 0x0F) +
10000000 * ((frequency_bcd[0] & 0xF0) >> 4));
guint8 *orbital_bcd =
DESC_DVB_SATELLITE_DELIVERY_SYSTEM_orbital_position
(satellitedelivery);
gfloat orbital =
(orbital_bcd[1] & 0x0F) / 10. + ((orbital_bcd[1] & 0xF0) >> 4) +
10 * (orbital_bcd[0] & 0x0F) + 100 * ((orbital_bcd[0] & 0xF0) >> 4);
gboolean east =
DESC_DVB_SATELLITE_DELIVERY_SYSTEM_west_east_flag
(satellitedelivery);
guint8 polarization =
DESC_DVB_SATELLITE_DELIVERY_SYSTEM_polarization (satellitedelivery);
gchar *polarization_str;
guint8 modulation =
DESC_DVB_SATELLITE_DELIVERY_SYSTEM_modulation (satellitedelivery);
gchar *modulation_str;
guint8 *symbol_rate_bcd =
DESC_DVB_SATELLITE_DELIVERY_SYSTEM_symbol_rate (satellitedelivery);
guint32 symbol_rate =
(symbol_rate_bcd[2] & 0x0F) +
10 * ((symbol_rate_bcd[2] & 0xF0) >> 4) +
100 * (symbol_rate_bcd[1] & 0x0F) +
1000 * ((symbol_rate_bcd[1] & 0xF0) >> 4) +
10000 * (symbol_rate_bcd[0] & 0x0F) +
100000 * ((symbol_rate_bcd[0] & 0xF0) >> 4);
guint8 fec_inner =
DESC_DVB_SATELLITE_DELIVERY_SYSTEM_fec_inner (satellitedelivery);
gchar *fec_inner_str;
switch (polarization) {
case 0:
polarization_str = g_strdup ("horizontal");
break;
case 1:
polarization_str = g_strdup ("vertical");
break;
case 2:
polarization_str = g_strdup ("left");
break;
case 3:
polarization_str = g_strdup ("right");
break;
default:
polarization_str = g_strdup ("");
}
switch (fec_inner) {
case 0:
fec_inner_str = g_strdup ("undefined");
break;
case 1:
fec_inner_str = g_strdup ("1/2");
break;
case 2:
fec_inner_str = g_strdup ("2/3");
break;
case 3:
fec_inner_str = g_strdup ("3/4");
break;
case 4:
fec_inner_str = g_strdup ("5/6");
break;
case 5:
fec_inner_str = g_strdup ("7/8");
break;
case 6:
fec_inner_str = g_strdup ("8/9");
break;
case 0xF:
fec_inner_str = g_strdup ("none");
break;
default:
fec_inner_str = g_strdup ("reserved");
}
switch (modulation) {
case 0x00:
modulation_str = g_strdup ("undefined");
break;
case 0x01:
modulation_str = g_strdup ("QAM16");
break;
case 0x02:
modulation_str = g_strdup ("QAM32");
break;
case 0x03:
modulation_str = g_strdup ("QAM64");
break;
case 0x04:
modulation_str = g_strdup ("QAM128");
break;
case 0x05:
modulation_str = g_strdup ("QAM256");
break;
default:
modulation_str = g_strdup ("reserved");
}
satellite = gst_structure_new ("satellite",
"orbital", G_TYPE_FLOAT, orbital,
"east-or-west", G_TYPE_STRING, east ? "east" : "west",
"modulation", G_TYPE_STRING, modulation_str,
"frequency", G_TYPE_UINT, frequency,
"polarization", G_TYPE_STRING, polarization_str,
"symbol-rate", G_TYPE_UINT, symbol_rate,
"inner-fec", G_TYPE_STRING, fec_inner_str, NULL);
g_free (polarization_str);
g_free (fec_inner_str);
g_free (modulation_str);
gst_structure_set (transport, "satellite", GST_TYPE_STRUCTURE,
satellite, NULL);
}
gst_mpeg_descriptor_free (mpegdescriptor);
descriptors = g_value_array_new (0);
if (!mpegts_packetizer_parse_descriptors (packetizer,