mpegts: Add support for DVB terrestrial delivery system descriptor
authorStefan Ringel <linuxtv@stefanringel.de>
Mon, 10 Feb 2014 20:52:28 +0000 (21:52 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Sun, 16 Feb 2014 09:13:53 +0000 (10:13 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=724069

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

index e3aa9c2..7e64adf 100644 (file)
@@ -48,7 +48,6 @@
  *   * GST_MTS_DESC_DVB_STREAM_IDENTIFIER
  *   * GST_MTS_DESC_DVB_EXTENDED_EVENT
  *   * GST_MTS_DESC_DVB_COMPONENT
- *   * GST_MTS_DESC_DVB_TERRESTRIAL_DELIVERY_SYSTEM
  *   * GST_MTS_DESC_DVB_FREQUENCY_LIST
  */
 
@@ -483,3 +482,179 @@ gst_mpegts_descriptor_from_dvb_subtitling (const gchar * lang,
 
   return descriptor;
 }
+
+/* GST_MTS_DESC_DVB_TERRESTRIAL_DELIVERY_SYSTEM (0x5A) */
+/**
+ * gst_mpegts_descriptor_parse_dvb_terrestrial_delivary_system:
+ * @descriptor: a %GST_MTS_DESC_DVB_CONTENT #GstMpegTsDescriptor
+ * @res: (out) (transfer none): #GstMpegTsTerrestrialSystemDescriptor
+ *
+ * Parses out the terrestrial delivery system from the @descriptor:
+ *
+ * Returns: %TRUE if the parsing happened correctly, else %FALSE.
+ */
+gboolean
+gst_mpegts_descriptor_parse_terrestrial_delivery_system (const
+    GstMpegTsDescriptor * descriptor,
+    GstMpegTsTerrestrialDeliverySystemDescriptor * res)
+{
+  guint8 *data;
+  guint8 tmp;
+
+  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->tag == 0x5a, FALSE);
+
+  data = (guint8 *) descriptor->data + 2;
+
+  res->frequency = 0;
+  res->frequency =
+      *(data + 3) | *(data + 2) << 8 | *(data + 1) << 16 | *data << 24;
+  res->frequency *= 10;
+
+  data += 4;
+
+  tmp = *data;
+  switch ((tmp >> 5) & 0x07) {
+    case 0:
+      res->bandwidth = GST_MPEGTS_BANDWIDTH_8;
+      break;
+    case 1:
+      res->bandwidth = GST_MPEGTS_BANDWIDTH_7;
+      break;
+    case 2:
+      res->bandwidth = GST_MPEGTS_BANDWIDTH_6;
+      break;
+    case 3:
+      res->bandwidth = GST_MPEGTS_BANDWIDTH_5;
+      break;
+    default:
+      res->bandwidth = GST_MPEGTS_BANDWIDTH_AUTO;
+      break;
+  }
+
+  res->priority = (tmp >> 4) & 0x01;
+  res->time_slicing = (tmp >> 3) & 0x01;
+  res->mpe_fec = (tmp >> 2) & 0x01;
+  data += 1;
+
+  tmp = *data;
+  switch ((tmp >> 6) & 0x03) {
+    case 0:
+      res->constellation = GST_MPEGTS_MODULATION_QPSK;
+      break;
+    case 1:
+      res->constellation = GST_MPEGTS_MODULATION_QAM_16;
+      break;
+    case 2:
+      res->constellation = GST_MPEGTS_MODULATION_QAM_64;
+      break;
+    default:
+      break;
+  }
+
+  switch ((tmp >> 3) & 0x07) {
+    case 0:
+      res->hierarchy = GST_MPEGTS_HIERARCHY_NONE;
+      break;
+    case 1:
+      res->hierarchy = GST_MPEGTS_HIERARCHY_1;
+      break;
+    case 2:
+      res->hierarchy = GST_MPEGTS_HIERARCHY_2;
+      break;
+    case 3:
+      res->hierarchy = GST_MPEGTS_HIERARCHY_4;
+      break;
+    case 4:
+      res->hierarchy = GST_MPEGTS_HIERARCHY_NONE;
+      break;
+    case 5:
+      res->hierarchy = GST_MPEGTS_HIERARCHY_1;
+      break;
+    case 6:
+      res->hierarchy = GST_MPEGTS_HIERARCHY_2;
+      break;
+    case 7:
+      res->hierarchy = GST_MPEGTS_HIERARCHY_4;
+      break;
+    default:
+      break;
+  }
+
+  switch (tmp & 0x07) {
+    case 0:
+      res->code_rate_hp = GST_MPEGTS_FEC_1_2;
+      break;
+    case 1:
+      res->code_rate_hp = GST_MPEGTS_FEC_2_3;
+      break;
+    case 2:
+      res->code_rate_hp = GST_MPEGTS_FEC_3_4;
+      break;
+    case 3:
+      res->code_rate_hp = GST_MPEGTS_FEC_5_6;
+      break;
+    case 4:
+      res->code_rate_hp = GST_MPEGTS_FEC_7_8;
+      break;
+    default:
+      break;
+  }
+  data += 1;
+
+  tmp = *data;
+  switch ((tmp >> 5) & 0x07) {
+    case 0:
+      res->code_rate_lp = GST_MPEGTS_FEC_1_2;
+      break;
+    case 1:
+      res->code_rate_lp = GST_MPEGTS_FEC_2_3;
+      break;
+    case 2:
+      res->code_rate_lp = GST_MPEGTS_FEC_3_4;
+      break;
+    case 3:
+      res->code_rate_lp = GST_MPEGTS_FEC_5_6;
+      break;
+    case 4:
+      res->code_rate_lp = GST_MPEGTS_FEC_7_8;
+      break;
+    default:
+      break;
+  }
+
+  switch ((tmp >> 3) & 0x03) {
+    case 0:
+      res->guard_interval = GST_MPEGTS_GUARD_INTERVAL_1_32;
+      break;
+    case 1:
+      res->guard_interval = GST_MPEGTS_GUARD_INTERVAL_1_16;
+      break;
+    case 2:
+      res->guard_interval = GST_MPEGTS_GUARD_INTERVAL_1_8;
+      break;
+    case 3:
+      res->guard_interval = GST_MPEGTS_GUARD_INTERVAL_1_4;
+      break;
+    default:
+      break;
+  }
+
+  switch ((tmp >> 1) & 0x03) {
+    case 0:
+      res->transmission_mode = GST_MPEGTS_TRANSMISSION_MODE_2K;
+      break;
+    case 1:
+      res->transmission_mode = GST_MPEGTS_TRANSMISSION_MODE_4K;
+      break;
+    case 2:
+      res->transmission_mode = GST_MPEGTS_TRANSMISSION_MODE_8K;
+      break;
+    default:
+      break;
+  }
+  res->other_frequency = tmp & 0x01;
+
+  return TRUE;
+}
index 3d703ac..cd627ab 100644 (file)
@@ -376,7 +376,88 @@ GstMpegTsDescriptor * gst_mpegts_descriptor_from_dvb_subtitling (const gchar *la
 
 
 /* GST_MTS_DESC_DVB_TERRESTRIAL_DELIVERY_SYSTEM (0x5A) */
-/* FIXME : Implement */
+typedef struct _GstMpegTsTerrestrialDeliverySystemDescriptor GstMpegTsTerrestrialDeliverySystemDescriptor;
+
+typedef enum {
+  GST_MPEGTS_BANDWIDTH_8 = 0,
+  GST_MPEGTS_BANDWIDTH_7,
+  GST_MPEGTS_BANDWIDTH_6,
+  GST_MPEGTS_BANDWIDTH_AUTO,
+  GST_MPEGTS_BANDWIDTH_5,
+  GST_MPEGTS_BANDWIDTH_10,
+  GST_MPEGTS_BANDWIDTH_1_172
+} GstMpegTsTerrestrialBandwidth;
+
+typedef enum {
+  GST_MPEGTS_TRANSMISSION_MODE_2K = 0,
+  GST_MPEGTS_TRANSMISSION_MODE_8K,
+  GST_MPEGTS_TRANSMISSION_MODE_AUTO,
+  GST_MPEGTS_TRANSMISSION_MODE_4K,
+  GST_MPEGTS_TRANSMISSION_MODE_1K,
+  GST_MPEGTS_TRANSMISSION_MODE_16K,
+  GST_MPEGTS_TRANSMISSION_MODE_32K,
+  GST_MPEGTS_TRANSMISSION_MODE_C1,
+  GST_MPEGTS_TRANSMISSION_MODE_C3780
+} GstMpegTsTerrestrialTransmissionMode;
+
+typedef enum {
+  GST_MPEGTS_GUARD_INTERVAL_1_32 = 0,
+  GST_MPEGTS_GUARD_INTERVAL_1_16,
+  GST_MPEGTS_GUARD_INTERVAL_1_8,
+  GST_MPEGTS_GUARD_INTERVAL_1_4,
+  GST_MPEGTS_GUARD_INTERVAL_AUTO,
+  GST_MPEGTS_GUARD_INTERVAL_1_128,
+  GST_MPEGTS_GUARD_INTERVAL_19_128,
+  GST_MPEGTS_GUARD_INTERVAL_19_256,
+  GST_MPEGTS_GUARD_INTERVAL_PN420,
+  GST_MPEGTS_GUARD_INTERVAL_PN595,
+  GST_MPEGTS_GUARD_INTERVAL_PN945
+} GstMpegTsTerrestrialGuardInterval;
+
+typedef enum {
+  GST_MPEGTS_HIERARCHY_NONE = 0,
+  GST_MPEGTS_HIERARCHY_1,
+  GST_MPEGTS_HIERARCHY_2,
+  GST_MPEGTS_HIERARCHY_4,
+  GST_MPEGTS_HIERARCHY_AUTO
+} GstMpegTsTerrestrialHierarchy;
+
+/**
+ * GstMpegTsTerrestrialDeliverySystemDescriptor:
+ * @frequency: the frequency in Hz (Hertz)
+ * @bandwidth: the bandwidth
+ * @priority: %TRUE High Priority %FALSE Low Priority
+ * @time_slicing: %TRUE no time slicing %FALSE time slicing
+ * @mpe_fec: %TRUE no mpe-fec is used %FALSE mpe-fec is use
+ * @constellation: the constallation
+ * @hierarchy: the hierarchy
+ * @code_rate_hp:
+ * @code_rate_lp:
+ * @guard_interval:
+ * @transmission_mode:
+ * @other_frequency: %TRUE more frequency are use, else not
+ *
+ * Terrestrial Delivery System Descriptor (EN 300 468 v.1.13.1)
+ */
+
+struct _GstMpegTsTerrestrialDeliverySystemDescriptor
+{
+  guint32                              frequency;
+  GstMpegTsTerrestrialBandwidth                bandwidth;
+  gboolean                             priority;
+  gboolean                             time_slicing;
+  gboolean                             mpe_fec;
+  GstMpegTsModulationType              constellation;
+  GstMpegTsTerrestrialHierarchy                hierarchy;
+  GstMpegTsDVBCodeRate                 code_rate_hp;
+  GstMpegTsDVBCodeRate                 code_rate_lp;
+  GstMpegTsTerrestrialGuardInterval    guard_interval;
+  GstMpegTsTerrestrialTransmissionMode transmission_mode;
+  gboolean                             other_frequency;
+};
+
+gboolean gst_mpegts_descriptor_parse_terrestrial_delivery_system (const GstMpegTsDescriptor
+              *descriptor, GstMpegTsTerrestrialDeliverySystemDescriptor * res);
 
 /* GST_MTS_DESC_DVB_FREQUENCY_LIST (0x62) */
 /* FIXME : Implement */