[libdvbpsi-devel] [PATCH] Add 0x40 descriptor support

Roberto Corno corno.roberto at gmail.com
Fri Dec 2 12:05:08 CET 2011


---
 src/descriptors/dr.h    |    1 +
 src/descriptors/dr_40.c |   90 +++++++++++++++++++++++++++++++++++++++++++++++
 src/descriptors/dr_40.h |   86 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 177 insertions(+), 0 deletions(-)
 create mode 100644 src/descriptors/dr_40.c
 create mode 100644 src/descriptors/dr_40.h

diff --git a/src/descriptors/dr.h b/src/descriptors/dr.h
index faf318a..93b27ee 100644
--- a/src/descriptors/dr.h
+++ b/src/descriptors/dr.h
@@ -46,6 +46,7 @@
 #include "dr_0d.h"
 #include "dr_0e.h"
 #include "dr_0f.h"
+#include "dr_40.h"
 #include "dr_42.h"
 #include "dr_43.h"
 #include "dr_44.h"
diff --git a/src/descriptors/dr_40.c b/src/descriptors/dr_40.c
new file mode 100644
index 0000000..0ae431e
--- /dev/null
+++ b/src/descriptors/dr_40.c
@@ -0,0 +1,90 @@
+
+
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(HAVE_INTTYPES_H)
+#include <inttypes.h>
+#elif defined(HAVE_STDINT_H)
+#include <stdint.h>
+#endif
+
+#include "../dvbpsi.h"
+#include "../dvbpsi_private.h"
+#include "../descriptor.h"
+
+#include "dr_40.h"
+
+/*****************************************************************************
+ * dvbpsi_DecodeNetworkNameDr
+ *****************************************************************************/
+dvbpsi_network_name_dr_t* dvbpsi_DecodeNetworkNameDr(
+                                        dvbpsi_descriptor_t * p_descriptor) {
+	dvbpsi_network_name_dr_t * p_decoded;
+
+  /* Check the tag */
+  if(p_descriptor->i_tag != 0x40)
+  {
+	DVBPSI_ERROR_ARG("dr_40 decoder", "bad tag (0x%x)", p_descriptor->i_tag);
+	return NULL;
+  }
+  /* Don't decode twice */
+  if(p_descriptor->p_decoded)
+	return p_descriptor->p_decoded;
+  /* Allocate memory */
+  p_decoded =
+        (dvbpsi_network_name_dr_t*)malloc(sizeof(dvbpsi_network_name_dr_t));
+  if(!p_decoded)
+  {
+    DVBPSI_ERROR("dr_40 decoder", "out of memory");
+    return NULL;
+  }
+  /* Decode data */
+  p_decoded->i_name_length = p_descriptor->i_length;
+  if(p_decoded->i_name_length)
+    memcpy(p_decoded->i_name_byte,
+           p_descriptor->p_data,
+           p_decoded->i_name_length);
+
+  p_descriptor->p_decoded = (void*)p_decoded;
+
+  return p_decoded;
+}
+
+
+/*****************************************************************************
+ * dvbpsi_GenNetworkNameDr
+ *****************************************************************************/
+dvbpsi_descriptor_t * dvbpsi_GenNetworkNameDr(
+                                        dvbpsi_network_name_dr_t * p_decoded,
+                                        int b_duplicate) {
+  /* Create the descriptor */
+  dvbpsi_descriptor_t * p_descriptor =
+		dvbpsi_NewDescriptor(0x40, p_decoded->i_name_length, NULL);
+
+  if(p_descriptor)
+  {
+    /* Encode data */
+    if(p_decoded->i_name_length)
+      memcpy(p_descriptor->p_data,
+             p_decoded->i_name_byte,
+             p_decoded->i_name_length);
+
+    if(b_duplicate)
+    {
+      /* Duplicate decoded data */
+    	dvbpsi_network_name_dr_t * p_dup_decoded =
+        (dvbpsi_network_name_dr_t*)malloc(sizeof(dvbpsi_network_name_dr_t));
+      if(p_dup_decoded)
+        memcpy(p_dup_decoded, p_decoded, sizeof(dvbpsi_network_name_dr_t));
+
+      p_descriptor->p_decoded = (void*)p_dup_decoded;
+    }
+  }
+
+  return p_descriptor;
+}
diff --git a/src/descriptors/dr_40.h b/src/descriptors/dr_40.h
new file mode 100644
index 0000000..4c9c8ee
--- /dev/null
+++ b/src/descriptors/dr_40.h
@@ -0,0 +1,86 @@
+/*
+ * dr_40.h
+ *
+ *  Created on: Nov 22, 2011
+ *      Author: rcorno
+ */
+
+/*!
+ * \file <dr_40.h>
+ * \author Corno Roberto <corno.roberto at gmail.com>
+ * \brief Application interface for the DVB "network name"
+ * descriptor decoder and generator.
+ *
+ * Application interface for the DVB "network name" descriptor
+ * decoder and generator. This descriptor's definition can be found in
+ * ETSI EN 300 468 section 6.2.27.
+ */
+
+#ifndef DR_40_H_
+#define DR_40_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************
+ * dvbpsi_network_name_dr_t
+ *****************************************************************************/
+/*!
+ * \struct dvbpsi_network_name_dr_t
+ * \brief "network name" descriptor structure.
+ *
+ * This structure is used to store a decoded "network name"
+ * descriptor. (ETSI EN 300 468 section 6.2.27).
+ */
+/*!
+ * \typedef struct dvbpsi_network_nameg_dr_s dvbpsi_network_name_dr_t
+ * \brief dvbpsi_network_name_dr_t type definition.
+ */
+typedef struct dvbpsi_network_name_dr_s
+{
+  uint8_t      i_name_length;            /*!< length of the i_name_byte
+                                                  array */
+  uint8_t      i_name_byte[255];         /*!< the name of the delivery system */
+
+} dvbpsi_network_name_dr_t;
+
+/*****************************************************************************
+ * dvbpsi_DecodeNetworkNameDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_network_name_dr_t * dvbpsi_DecodeNetworkNameDr(
+                                        dvbpsi_descriptor_t * p_descriptor)
+ * \brief "network name" descriptor decoder.
+ * \param p_descriptor pointer to the descriptor structure
+ * \return a pointer to a new "network name" descriptor structure
+ * which contains the decoded data.
+ */
+dvbpsi_network_name_dr_t* dvbpsi_DecodeNetworkNameDr(
+                                        dvbpsi_descriptor_t * p_descriptor);
+
+
+/*****************************************************************************
+ * dvbpsi_GenNetworkNameDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_descriptor_t * dvbpsi_GenNetworkNameDr(
+                        dvbpsi_network_name_dr_t * p_decoded, int b_duplicate)
+ * \brief "network name" descriptor generator.
+ * \param p_decoded pointer to a decoded "network name" descriptor
+ * structure
+ * \param b_duplicate if non zero then duplicate the p_decoded structure into
+ * the descriptor
+ * \return a pointer to a new descriptor structure which contains encoded data.
+ */
+dvbpsi_descriptor_t * dvbpsi_GenNetworkNameDr(
+                                        dvbpsi_network_name_dr_t * p_decoded,
+                                        int b_duplicate);
+
+#ifdef __cplusplus
+};
+#endif
+
+#else
+#error "Multiple inclusions of dr_40.h"
+#endif
-- 
1.7.0.4



More information about the libdvbpsi-devel mailing list