libdvbv5: add suport for DVB-T2 delivery descriptor
authorMauro Carvalho Chehab <m.chehab@samsung.com>
Fri, 15 Nov 2013 20:35:06 +0000 (18:35 -0200)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Wed, 27 Nov 2013 11:24:40 +0000 (09:24 -0200)
ETSI EN 300 468 V1.11.1 defines an special descriptor for DVB-T2.
Add support for it.

Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
lib/include/descriptors/desc_t2_delivery.h [new file with mode: 0644]
lib/libdvbv5/Makefile.am
lib/libdvbv5/descriptors/desc_extension.c
lib/libdvbv5/descriptors/desc_t2_delivery.c [new file with mode: 0644]

diff --git a/lib/include/descriptors/desc_t2_delivery.h b/lib/include/descriptors/desc_t2_delivery.h
new file mode 100644 (file)
index 0000000..bdc52ae
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2013 - Mauro Carvalho Chehab <m.chehab@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation version 2
+ * of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ *
+ * Based on ETSI EN 300 468 V1.11.1 (2010-04)
+ */
+
+#ifndef _T2_DELIVERY_H
+#define _T2_DELIVERY_H
+
+#include <stdint.h>
+#include <unistd.h> /* ssize_t */
+
+struct dvb_desc_t2_delivery_subcell {
+       uint8_t cell_id_extension;
+       uint16_t transposer_frequency;
+} __attribute__((packed));
+
+struct dvb_desc_t2_delivery {
+       uint8_t type;
+       uint8_t length;
+       struct dvb_desc *next;
+
+       uint32_t *centre_frequency;
+       uint8_t frequency_loop_length;
+       uint8_t subcel_info_loop_length;
+       struct dvb_desc_t2_delivery_subcell *subcell;
+
+       uint8_t descriptor_tag_extension;
+       uint8_t plp_id;
+       uint16_t system_id;
+       union {
+               uint16_t bitfield;
+               struct {
+                       uint16_t tfs_flag:1;
+                       uint16_t other_frequency_flag:1;
+                       uint16_t transmission_mode:3;
+                       uint16_t guard_interval:3;
+                       uint16_t reserved:2;
+                       uint16_t bandwidth:3;
+                       uint16_t SISO_MISO:2;
+               };
+       };
+} __attribute__((packed));
+
+struct dvb_v5_fe_parms;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void dvb_desc_t2_delivery_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+void dvb_desc_t2_delivery_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
index da04a3d..0fa04fb 100644 (file)
@@ -33,6 +33,7 @@ libdvbv5_la_SOURCES = \
   descriptors/desc_cable_delivery.c  ../include/descriptors/desc_cable_delivery.h \
   descriptors/desc_sat.c  ../include/descriptors/desc_sat.h \
   descriptors/desc_terrestrial_delivery.c  ../include/descriptors/desc_terrestrial_delivery.h \
+  descriptors/desc_t2_delivery.c  ../include/descriptors/desc_t2_delivery.h \
   descriptors/desc_service.c  ../include/descriptors/desc_service.h \
   descriptors/desc_frequency_list.c  ../include/descriptors/desc_frequency_list.h \
   descriptors/desc_service_list.c  ../include/descriptors/desc_service_list.h \
index a5c95da..92d5147 100644 (file)
@@ -20,6 +20,7 @@
 
 #include "descriptors.h"
 #include "descriptors/desc_extension.h"
+#include "descriptors/desc_t2_delivery.h"
 #include "dvb-fe.h"
 
 const struct dvb_descriptor dvb_ext_descriptors[] = {
@@ -53,10 +54,10 @@ const struct dvb_descriptor dvb_ext_descriptors[] = {
        },
        [T2_delivery_system_descriptor] = {
                .name  = "T2_delivery_system_descriptor",
-               .init  = NULL,
-               .print = NULL,
+               .init  = dvb_desc_t2_delivery_init,
+               .print = dvb_desc_t2_delivery_print,
                .free  = NULL,
-               .size  = 0,
+               .size  = sizeof(struct dvb_desc_t2_delivery),
        },
        [SH_delivery_system_descriptor] = {
                .name  = "SH_delivery_system_descriptor",
diff --git a/lib/libdvbv5/descriptors/desc_t2_delivery.c b/lib/libdvbv5/descriptors/desc_t2_delivery.c
new file mode 100644 (file)
index 0000000..d7b484b
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2013 - Mauro Carvalho Chehab <m.chehab@samsung.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation version 2
+ * of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ *
+ * Based on ETSI EN 300 468 V1.11.1 (2010-04)
+ */
+
+#include "descriptors/desc_t2_delivery.h"
+#include "descriptors.h"
+#include "dvb-fe.h"
+
+void dvb_desc_t2_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+{
+       struct dvb_desc_t2_delivery *d = (struct dvb_desc_t2_delivery *) desc;
+       unsigned char *p = (unsigned char *) buf;
+       size_t len;
+       int i;
+
+       len = sizeof(*d) - offsetof(struct dvb_desc_t2_delivery, centre_frequency);
+       memcpy(&d->centre_frequency, p, len);
+       p += len;
+
+       bswap16(d->system_id);
+
+       if (d->length <= 4)
+               return;
+
+       bswap16(d->bitfield);
+
+       if (d->tfs_flag)
+               d->frequency_loop_length = 1;
+       else {
+               d->frequency_loop_length = *p;
+               p++;
+       }
+
+       d->centre_frequency = malloc(sizeof(*d->centre_frequency) * d->frequency_loop_length);
+       if (!d->centre_frequency)
+               dvb_perror("Out of memory");
+
+       memcpy(d->centre_frequency, p, sizeof(*d->centre_frequency) * d->frequency_loop_length);
+       p += sizeof(*d->centre_frequency) * d->frequency_loop_length;
+
+       for (i = 0; i < d->frequency_loop_length; i++)
+               bswap32(d->centre_frequency[i]);
+
+       d->subcel_info_loop_length = *p;
+       p++;
+
+       d->subcell = malloc(sizeof(*d->subcell) * d->subcel_info_loop_length);
+       if (!d->subcell)
+               dvb_perror("Out of memory");
+       memcpy(d->subcell, p, sizeof(*d->subcell) * d->subcel_info_loop_length);
+
+       for (i = 0; i < d->subcel_info_loop_length; i++)
+               bswap16(d->subcell[i].transposer_frequency);
+}
+
+void dvb_desc_t2_delivery_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
+{
+       const struct dvb_desc_t2_delivery *d = (const struct dvb_desc_t2_delivery *) desc;
+       int i;
+
+       dvb_log("|       t2 delivery");
+       dvb_log("|           descriptor_tag_extension  %d", d->descriptor_tag_extension);
+       dvb_log("|           plp_id                    %d", d->plp_id);
+       dvb_log("|           system_id                 %d", d->system_id);
+
+       if (d->length <= 4)
+               return;
+
+       dvb_log("|           tfs_flag                  %d", d->tfs_flag);
+       dvb_log("|           other_frequency_flag      %d", d->other_frequency_flag);
+       dvb_log("|           transmission_mode         %d", d->transmission_mode);
+       dvb_log("|           guard_interval            %d", d->guard_interval);
+       dvb_log("|           reserved                  %d", d->reserved);
+       dvb_log("|           bandwidth                 %d", d->bandwidth);
+       dvb_log("|           SISO MISO                 %d", d->SISO_MISO);
+
+       for (i = 0; i < d->frequency_loop_length; i++)
+               dvb_log("|           centre frequency[%d]   %d", i, d->centre_frequency[i]);
+
+       for (i = 0; i < d->subcel_info_loop_length; i++) {
+               dvb_log("|           cell_id_extension[%d]  %d", i, d->subcell[i].cell_id_extension);
+               dvb_log("|           transposer frequency   %d", d->subcell[i].transposer_frequency);
+       }
+}