[patch] 2/3: Add support for descriptor 0x58

Johann Hanne <[email protected]>
Newsgroups gmane.comp.video.videolan.libdvbpsi.devel
Message-ID <200804251936.46653.jhml__49187.8973706209$1209145072$gmane$org@gmx.net>
Hi,

the attached patch adds support for descriptor 0x58 (DVB local time offset 
descriptor). Please apply.

Cheers, Johann

_______________________________________________
libdvbpsi-devel mailing list
[email protected]
http://mailman.videolan.org/listinfo/libdvbpsi-devel
add_dr58_support.diff (text/x-diff, 12.2 KB)
diff -uNr libdvbpsi-trunk-r170+dr43/src/descriptors/dr_58.c libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr_58.c
--- libdvbpsi-trunk-r170+dr43/src/descriptors/dr_58.c	1970-01-01 01:00:00.000000000 +0100
+++ libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr_58.c	2008-04-25 19:13:34.000000000 +0200
@@ -0,0 +1,158 @@
+/*****************************************************************************
+ * dr_58.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_58.h"
+
+
+/*****************************************************************************
+ * dvbpsi_DecodeLocalTimeOffsetDr
+ *****************************************************************************/
+dvbpsi_local_time_offset_dr_t * dvbpsi_DecodeLocalTimeOffsetDr(
+                                        dvbpsi_descriptor_t * p_descriptor)
+{
+  dvbpsi_local_time_offset_dr_t * p_decoded;
+  uint8_t * p_data, * p_end;
+  dvbpsi_local_time_offset_t * p_current;
+
+  /* Check the tag */
+  if(p_descriptor->i_tag != 0x58)
+  {
+    DVBPSI_ERROR_ARG("dr_58 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_local_time_offset_dr_t*)malloc(sizeof(dvbpsi_local_time_offset_dr_t));
+  if(!p_decoded)
+  {
+    DVBPSI_ERROR("dr_58 decoder", "out of memory");
+    return NULL;
+  }
+
+  /* Decode data */
+  p_decoded->i_local_time_offsets_number = 0;
+  p_current = p_decoded->p_local_time_offset;
+  p_end = p_descriptor->p_data + p_descriptor->i_length;
+  p_data = p_descriptor->p_data;
+  while(p_data + 13 <= p_end) {
+    memcpy(p_current->i_country_code, p_data, 3);
+    p_current->i_country_region_id          =   (p_data[3] >> 2) & 0x3f;
+    p_current->i_local_time_offset_polarity =   p_data[3] & 0x01;
+    p_current->i_local_time_offset          =   ((uint16_t)p_data[4] << 8)
+                                              |  (uint16_t)p_data[5];
+    p_current->i_time_of_change             =   ((uint64_t)p_data[6] << 32)
+                                              | ((uint64_t)p_data[7] << 24)
+                                              | ((uint64_t)p_data[8] << 16)
+                                              | ((uint64_t)p_data[9] << 8)
+                                              |  (uint64_t)p_data[10];
+    p_current->i_next_time_offset           =   ((uint16_t)p_data[11] << 8)
+                                              |  (uint16_t)p_data[12];
+
+    p_decoded->i_local_time_offsets_number++;
+    p_data += 13;
+    p_current++;
+  }
+
+  p_descriptor->p_decoded = (void*)p_decoded;
+
+  return p_decoded;
+}
+
+
+/*****************************************************************************
+ * dvbpsi_GenLocalTimeOffsetDr
+ *****************************************************************************/
+dvbpsi_descriptor_t * dvbpsi_GenLocalTimeOffsetDr(
+                                        dvbpsi_local_time_offset_dr_t * p_decoded,
+                                        int b_duplicate)
+{
+  uint8_t i_num;
+  dvbpsi_local_time_offset_t * p_current;
+  uint8_t * p_data;
+
+  /* Create the descriptor */
+  dvbpsi_descriptor_t * p_descriptor =
+        dvbpsi_NewDescriptor(0x58, p_decoded->i_local_time_offsets_number * 13, NULL);
+
+  if(p_descriptor)
+  {
+    /* Encode data */
+
+    p_current = p_decoded->p_local_time_offset;
+    p_data = p_descriptor->p_data;
+
+    for(i_num = 0; i_num < p_decoded->i_local_time_offsets_number; i_num++) {
+      memcpy(p_data, p_current->i_country_code, 3);
+      p_data[3]  =   ((p_current->i_country_region_id & 0x3f) << 2)
+                   | 0x02
+                   | (p_current->i_local_time_offset_polarity & 0x01);
+      p_data[4]  =   (p_current->i_local_time_offset >> 8)    & 0xff;
+      p_data[5]  =    p_current->i_local_time_offset          & 0xff;
+      p_data[6]  =   (p_current->i_time_of_change   >> 32)    & 0xff;
+      p_data[7]  =   (p_current->i_time_of_change   >> 24)    & 0xff;
+      p_data[8]  =   (p_current->i_time_of_change   >> 16)    & 0xff;
+      p_data[9]  =   (p_current->i_time_of_change   >>  8)    & 0xff;
+      p_data[10] =    p_current->i_time_of_change             & 0xff;
+      p_data[11] =   (p_current->i_next_time_offset >>  8)    & 0xff;
+      p_data[12] =    p_current->i_next_time_offset           & 0xff;
+
+      p_data += 13;
+      p_current++;
+    }
+
+    if(b_duplicate)
+    {
+      /* Duplicate decoded data */
+      dvbpsi_local_time_offset_dr_t * p_dup_decoded =
+        (dvbpsi_local_time_offset_dr_t*)malloc(sizeof(dvbpsi_local_time_offset_dr_t));
+      if(p_dup_decoded)
+        memcpy(p_dup_decoded, p_decoded, sizeof(dvbpsi_local_time_offset_dr_t));
+
+      p_descriptor->p_decoded = (void*)p_dup_decoded;
+    }
+  }
+
+  return p_descriptor;
+}
diff -uNr libdvbpsi-trunk-r170+dr43/src/descriptors/dr_58.h libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr_58.h
--- libdvbpsi-trunk-r170+dr43/src/descriptors/dr_58.h	1970-01-01 01:00:00.000000000 +0100
+++ libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr_58.h	2008-04-25 19:13:34.000000000 +0200
@@ -0,0 +1,130 @@
+/*****************************************************************************
+ * dr_58.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_58.h>
+ * \author Johann Hanne
+ * \brief Application interface for the DVB "local time offset"
+ * descriptor decoder and generator.
+ *
+ * Application interface for the DVB "local time offset" descriptor
+ * decoder and generator. This descriptor's definition can be found in
+ * ETSI EN 300 468 section 6.2.19.
+ */
+
+#ifndef _DVBPSI_DR_58_H_
+#define _DVBPSI_DR_58_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*****************************************************************************
+ * dvbpsi_local_time_offset_t
+ *****************************************************************************/
+/*!
+ * \struct dvbpsi_local_time_offset_s
+ * \brief one local time offset structure.
+ *
+ * This structure is used since local_time_offset will contain information
+ * for several countries.
+ */
+/*!
+ * \typedef struct dvbpsi_local_time_offset_s dvbpsi_local_time_offset_t
+ * \brief dvbpsi_local_time_offset_t type definition.
+ */
+typedef struct dvbpsi_local_time_offset_s
+{
+  uint8_t       i_country_code[3];            /*!< country_code */
+  uint8_t       i_country_region_id;          /*!< country_region_id */
+  uint8_t       i_local_time_offset_polarity; /*!< local_time_offset_polarity */
+  uint16_t      i_local_time_offset;          /*!< local_time_offset */
+  uint64_t      i_time_of_change;             /*!< time_of_change */
+  uint16_t      i_next_time_offset;           /*!< next_time_offset */
+
+} dvbpsi_local_time_offset_t;
+
+
+/*****************************************************************************
+ * dvbpsi_local_time_offset_dr_t
+ *****************************************************************************/
+/*!
+ * \struct dvbpsi_local_time_offset_dr_s
+ * \brief "local time offset" descriptor structure.
+ *
+ * This structure is used to store a decoded "local time offset"
+ * descriptor. (ETSI EN 300 468 section 6.2.19).
+ */
+/*!
+ * \typedef struct dvbpsi_local_time_offset_dr_s dvbpsi_local_time_offset_dr_t
+ * \brief dvbpsi_local_time_offset_dr_t type definition.
+ */
+typedef struct dvbpsi_local_time_offset_dr_s
+{
+  uint8_t      i_local_time_offsets_number;
+  dvbpsi_local_time_offset_t p_local_time_offset[19];
+
+} dvbpsi_local_time_offset_dr_t;
+
+
+/*****************************************************************************
+ * dvbpsi_DecodeLocalTimeOffsetDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_local_time_offset_dr_t * dvbpsi_DecodeLocalTimeOffsetDr(
+                                        dvbpsi_descriptor_t * p_descriptor)
+ * \brief "local time offset" descriptor decoder.
+ * \param p_descriptor pointer to the descriptor structure
+ * \return a pointer to a new "local time offset" descriptor structure
+ * which contains the decoded data.
+ */
+dvbpsi_local_time_offset_dr_t* dvbpsi_DecodeLocalTimeOffsetDr(
+                                        dvbpsi_descriptor_t * p_descriptor);
+
+
+/*****************************************************************************
+ * dvbpsi_GenLocalTimeOffsetDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_descriptor_t * dvbpsi_GenLocalTimeOffsetDr(
+                        dvbpsi_local_time_offset_data_dr_t * p_decoded, int b_duplicate)
+ * \brief "local time offset" descriptor generator.
+ * \param p_decoded pointer to a decoded "local time offset" 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_GenLocalTimeOffsetDr(
+                                        dvbpsi_local_time_offset_dr_t * p_decoded,
+                                        int b_duplicate);
+
+
+#ifdef __cplusplus
+};
+#endif
+
+#else
+#error "Multiple inclusions of dr_58.h"
+#endif
diff -uNr libdvbpsi-trunk-r170+dr43/src/descriptors/dr.h libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr.h
--- libdvbpsi-trunk-r170+dr43/src/descriptors/dr.h	2008-04-25 19:12:28.000000000 +0200
+++ libdvbpsi-trunk-r170+dr43+dr58/src/descriptors/dr.h	2008-04-25 19:14:06.000000000 +0200
@@ -56,6 +56,7 @@
 #include "dr_52.h"
 #include "dr_55.h"
 #include "dr_56.h"
+#include "dr_58.h"
 #include "dr_59.h"
 #include "dr_69.h"
 
diff -uNr libdvbpsi-trunk-r170+dr43/src/Makefile.am libdvbpsi-trunk-r170+dr43+dr58/src/Makefile.am
--- libdvbpsi-trunk-r170+dr43/src/Makefile.am	2008-04-25 19:12:14.000000000 +0200
+++ libdvbpsi-trunk-r170+dr43+dr58/src/Makefile.am	2008-04-25 19:14:27.000000000 +0200
@@ -40,6 +40,7 @@
                      descriptors/dr_52.h \
                      descriptors/dr_55.h \
                      descriptors/dr_56.h \
+                     descriptors/dr_58.h \
                      descriptors/dr_59.h \
                      descriptors/dr_69.h \
                      descriptors/dr.h
@@ -68,6 +69,7 @@
                   descriptors/dr_52.c \
                   descriptors/dr_55.c \
                   descriptors/dr_56.c \
+                  descriptors/dr_58.c \
                   descriptors/dr_59.c \
                   descriptors/dr_69.c
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.