[patch] 3/3: Add support for descriptor 0x5a

Johann Hanne <[email protected]>
Newsgroups gmane.comp.video.videolan.libdvbpsi.devel
Message-ID <200804251937.02093.jhml__47609.2711709954$1209145087$gmane$org@gmx.net>
Hi,

the attached patch adds support for descriptor 0x5a (terrestrial delivery 
system descriptor). Please apply.

Cheers, Johann

_______________________________________________
libdvbpsi-devel mailing list
[email protected]
http://mailman.videolan.org/listinfo/libdvbpsi-devel
add_dr5a_support.diff (text/x-diff, 12.2 KB)
diff -uNr libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr_5a.c libdvbpsi-trunk-r170+dr43+dr58+dr5a/src/descriptors/dr_5a.c
--- libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr_5a.c	1970-01-01 01:00:00.000000000 +0100
+++ libdvbpsi-trunk-r170+dr43+dr58+dr5a/src/descriptors/dr_5a.c	2008-04-25 19:15:27.000000000 +0200
@@ -0,0 +1,143 @@
+/*****************************************************************************
+ * dr_5a.c
+ * (c)2001-2008 VideoLAN
+ * $Id: $
+ *
+ * Authors: Johann Hanne
+ *
+ * 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; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ *****************************************************************************/
+
+
+#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_5a.h"
+
+
+/*****************************************************************************
+ * dvbpsi_DecodeTerrDelivSysDr
+ *****************************************************************************/
+dvbpsi_terr_deliv_sys_dr_t * dvbpsi_DecodeTerrDelivSysDr(
+                                        dvbpsi_descriptor_t * p_descriptor)
+{
+  dvbpsi_terr_deliv_sys_dr_t * p_decoded;
+
+  /* Check the tag */
+  if(p_descriptor->i_tag != 0x5a)
+  {
+    DVBPSI_ERROR_ARG("dr_5a 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_terr_deliv_sys_dr_t*)malloc(sizeof(dvbpsi_terr_deliv_sys_dr_t));
+  if(!p_decoded)
+  {
+    DVBPSI_ERROR("dr_5a decoder", "out of memory");
+    return NULL;
+  }
+
+  /* Decode data */
+  p_decoded->i_centre_frequency      =    (uint32_t)(p_descriptor->p_data[0] << 24)
+                                        | (uint32_t)(p_descriptor->p_data[1] << 16)
+                                        | (uint32_t)(p_descriptor->p_data[2] <<  8)
+                                        | (uint32_t)(p_descriptor->p_data[3]);
+  p_decoded->i_bandwidth             =    (p_descriptor->p_data[4] >> 5) & 0x07;
+  p_decoded->i_priority              =    (p_descriptor->p_data[4] >> 4) & 0x01;
+  p_decoded->i_time_slice_indicator  =    (p_descriptor->p_data[4] >> 3) & 0x01;
+  p_decoded->i_mpe_fec_indicator     =    (p_descriptor->p_data[4] >> 2) & 0x01;
+  p_decoded->i_constellation         =    (p_descriptor->p_data[5] >> 6) & 0x03;
+  p_decoded->i_hierarchy_information =    (p_descriptor->p_data[5] >> 3) & 0x07;
+  p_decoded->i_code_rate_hp_stream   =     p_descriptor->p_data[5]       & 0x07;
+  p_decoded->i_code_rate_lp_stream   =    (p_descriptor->p_data[6] >> 5) & 0x07;
+  p_decoded->i_guard_interval        =    (p_descriptor->p_data[6] >> 3) & 0x03;
+  p_decoded->i_transmission_mode     =    (p_descriptor->p_data[6] >> 1) & 0x03;
+  p_decoded->i_other_frequency_flag  =     p_descriptor->p_data[6]       & 0x01;
+
+  p_descriptor->p_decoded = (void*)p_decoded;
+
+  return p_decoded;
+}
+
+
+/*****************************************************************************
+ * dvbpsi_GenTerrDelivSysDr
+ *****************************************************************************/
+dvbpsi_descriptor_t * dvbpsi_GenTerrDelivSysDr(
+                                        dvbpsi_terr_deliv_sys_dr_t * p_decoded,
+                                        int b_duplicate)
+{
+  /* Create the descriptor */
+  dvbpsi_descriptor_t * p_descriptor =
+        dvbpsi_NewDescriptor(0x5a, 11, NULL);
+
+  if(p_descriptor)
+  {
+    /* Encode data */
+    p_descriptor->p_data[0]  =   (p_decoded->i_centre_frequency >> 24) & 0xff;
+    p_descriptor->p_data[1]  =   (p_decoded->i_centre_frequency >> 16) & 0xff;
+    p_descriptor->p_data[2]  =   (p_decoded->i_centre_frequency >>  8) & 0xff;
+    p_descriptor->p_data[3]  =    p_decoded->i_centre_frequency        & 0xff;
+    p_descriptor->p_data[4]  =   (p_decoded->i_bandwidth               & 0x07) << 5
+                               | (p_decoded->i_priority                & 0x01) << 4
+                               | (p_decoded->i_time_slice_indicator    & 0x01) << 3
+                               | (p_decoded->i_mpe_fec_indicator       & 0x01) << 2
+                               | 0x03;
+    p_descriptor->p_data[5]  =   (p_decoded->i_constellation           & 0x03) << 6
+                               | (p_decoded->i_hierarchy_information   & 0x07) << 3
+                               | (p_decoded->i_code_rate_hp_stream     & 0x07);
+    p_descriptor->p_data[6]  =   (p_decoded->i_code_rate_lp_stream     & 0x07) << 5
+                               | (p_decoded->i_guard_interval          & 0x03) << 3
+                               | (p_decoded->i_transmission_mode       & 0x03) << 1
+                               | (p_decoded->i_other_frequency_flag    & 0x01);
+    p_descriptor->p_data[7]  =   0xff;
+    p_descriptor->p_data[8]  =   0xff;
+    p_descriptor->p_data[9]  =   0xff;
+    p_descriptor->p_data[10] =   0xff;
+
+    if(b_duplicate)
+    {
+      /* Duplicate decoded data */
+      dvbpsi_terr_deliv_sys_dr_t * p_dup_decoded =
+        (dvbpsi_terr_deliv_sys_dr_t*)malloc(sizeof(dvbpsi_terr_deliv_sys_dr_t));
+      if(p_dup_decoded)
+        memcpy(p_dup_decoded, p_decoded, sizeof(dvbpsi_terr_deliv_sys_dr_t));
+
+      p_descriptor->p_decoded = (void*)p_dup_decoded;
+    }
+  }
+
+  return p_descriptor;
+}
diff -uNr libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr_5a.h libdvbpsi-trunk-r170+dr43+dr58+dr5a/src/descriptors/dr_5a.h
--- libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr_5a.h	1970-01-01 01:00:00.000000000 +0100
+++ libdvbpsi-trunk-r170+dr43+dr58+dr5a/src/descriptors/dr_5a.h	2008-04-25 19:15:27.000000000 +0200
@@ -0,0 +1,114 @@
+/*****************************************************************************
+ * dr_5a.h
+ * (c)2001-2008 VideoLAN
+ * $Id: $
+ *
+ * Authors: Johann Hanne
+ *
+ * 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; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ *****************************************************************************/
+
+/*!
+ * \file <dr_5a.h>
+ * \author Johann Hanne
+ * \brief Application interface for the DVB terrestrial delivery system
+ *        descriptor decoder and generator.
+ *
+ * Application interface for the DVB terrestrial delivery system descriptor
+ * decoder and generator. This descriptor's definition can be found in
+ * ETSI EN 300 468 section 6.2.13.4.
+ */
+
+#ifndef _DVBPSI_DR_5A_H_
+#define _DVBPSI_DR_5A_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*****************************************************************************
+ * dvbpsi_terr_deliv_sys_dr_t
+ *****************************************************************************/
+/*!
+ * \struct dvbpsi_terr_deliv_sys_dr_s
+ * \brief terrestrial delivery system descriptor structure.
+ *
+ * This structure is used to store a decoded terrestrial delivery system
+ * descriptor. (ETSI EN 300 468 section 6.2.13.4).
+ */
+/*!
+ * \typedef struct dvbpsi_terr_deliv_sys_dr_s dvbpsi_terr_deliv_sys_dr_t
+ * \brief dvbpsi_terr_deliv_sys_dr_t type definition.
+ */
+typedef struct dvbpsi_terr_deliv_sys_dr_s
+{
+  uint32_t     i_centre_frequency;              /*!< centre frequency */
+  uint8_t      i_bandwidth;                     /*!< bandwidth */
+  uint8_t      i_priority;                      /*!< priority */
+  uint8_t      i_time_slice_indicator;          /*!< Time_Slicing_indicator */
+  uint8_t      i_mpe_fec_indicator;             /*!< MPE-FEC_indicator */
+  uint8_t      i_constellation;                 /*!< constellation */
+  uint8_t      i_hierarchy_information;         /*!< hierarchy_information */
+  uint8_t      i_code_rate_hp_stream;           /*!< code_rate-HP_stream */
+  uint8_t      i_code_rate_lp_stream;           /*!< code_rate-LP_stream */
+  uint8_t      i_guard_interval;                /*!< guard_interval */
+  uint8_t      i_transmission_mode;             /*!< transmission_mode */
+  uint8_t      i_other_frequency_flag;          /*!< other_frequency_flag */
+
+} dvbpsi_terr_deliv_sys_dr_t;
+
+
+/*****************************************************************************
+ * dvbpsi_DecodeTerrDelivSysDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_terr_deliv_sys_dr_t * dvbpsi_DecodeTerrDelivSysDr(
+                                        dvbpsi_descriptor_t * p_descriptor)
+ * \brief terrestrial delivery system descriptor decoder.
+ * \param p_descriptor pointer to the descriptor structure
+ * \return a pointer to a new terrestrial delivery system descriptor structure
+ * which contains the decoded data.
+ */
+dvbpsi_terr_deliv_sys_dr_t* dvbpsi_DecodeTerrDelivSysDr(
+                                        dvbpsi_descriptor_t * p_descriptor);
+
+
+/*****************************************************************************
+ * dvbpsi_GenTerrDelivSysDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_descriptor_t * dvbpsi_GenTerrDelivSysDr(
+                        dvbpsi_terr_deliv_sys_dr_t * p_decoded, int b_duplicate)
+ * \brief terrestrial delivery system descriptor generator.
+ * \param p_decoded pointer to a decoded terrestrial delivery system descriptor
+ * 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_GenTerrDelivSysDr(
+                                        dvbpsi_terr_deliv_sys_dr_t * p_decoded,
+                                        int b_duplicate);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#else
+#error "Multiple inclusions of dr_5a.h"
+#endif
diff -uNr libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr.h libdvbpsi-trunk-r170+dr43+dr58+dr5a/src/descriptors/dr.h
--- libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr.h	2008-04-25 19:14:06.000000000 +0200
+++ libdvbpsi-trunk-r170+dr43+dr58+dr5a/src/descriptors/dr.h	2008-04-25 19:16:03.000000000 +0200
@@ -58,6 +58,7 @@
 #include "dr_56.h"
 #include "dr_58.h"
 #include "dr_59.h"
+#include "dr_5a.h"
 #include "dr_69.h"
 
 #else
diff -uNr libdvbpsi-trunk-r170+dr43+dr58/src/Makefile.am libdvbpsi-trunk-r170+dr43+dr58+dr5a/src/Makefile.am
--- libdvbpsi-trunk-r170+dr43+dr58/src/Makefile.am	2008-04-25 19:14:27.000000000 +0200
+++ libdvbpsi-trunk-r170+dr43+dr58+dr5a/src/Makefile.am	2008-04-25 19:16:30.000000000 +0200
@@ -42,6 +42,7 @@
                      descriptors/dr_56.h \
                      descriptors/dr_58.h \
                      descriptors/dr_59.h \
+                     descriptors/dr_5a.h \
                      descriptors/dr_69.h \
                      descriptors/dr.h
 
@@ -71,6 +72,7 @@
                   descriptors/dr_56.c \
                   descriptors/dr_58.c \
                   descriptors/dr_59.c \
+                  descriptors/dr_5a.c \
                   descriptors/dr_69.c
 
 tables_src = tables/pat.c tables/pat_private.h \
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.