[PATCH] Add 0x4B Descriptor Decoder/Generator support

Roberto Corno <[email protected]>
Newsgroups gmane.comp.video.videolan.libdvbpsi.devel
Message-ID <CAO6YRm9-r6Mtb+dw2HOZYmswQkTjPNeFd8xQ9-OnXhUcMdy9Jw@mail.gmail.com>
Added support for decoding/generating 0x4B (NVOD reference) DVB descriptor
Regards,
Roberto

_______________________________________________
libdvbpsi-devel mailing list
[email protected]
http://mailman.videolan.org/listinfo/libdvbpsi-devel
0001-Add-0x4B-Descriptor-Decoder-Generator-support.patch (application/octet-stream, 10.9 KB)
From 1dc6d085f8570664084fd0dc87b73d47591be8e4 Mon Sep 17 00:00:00 2001
From: Roberto Corno <[email protected]>
Date: Thu, 30 Aug 2012 11:31:34 +0200
Subject: [PATCH 1/2] Add 0x4B Descriptor Decoder/Generator support

---
 src/Makefile.am         |    2 +
 src/descriptors/dr.h    |    1 +
 src/descriptors/dr_4b.c |  117 ++++++++++++++++++++++++++++++++++++++++++++
 src/descriptors/dr_4b.h |  123 +++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 243 insertions(+), 0 deletions(-)
 create mode 100644 src/descriptors/dr_4b.c
 create mode 100644 src/descriptors/dr_4b.h

diff --git a/src/Makefile.am b/src/Makefile.am
index 9ba6e27..f9a5c4f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -46,6 +46,7 @@ pkginclude_HEADERS = dvbpsi.h psi.h descriptor.h demux.h \
                      descriptors/dr_48.h \
                      descriptors/dr_49.h \
                      descriptors/dr_4a.h \
+                     descriptors/dr_4b.h \
                      descriptors/dr_4d.h \
                      descriptors/dr_4e.h \
                      descriptors/dr_52.h \
@@ -90,6 +91,7 @@ descriptors_src = descriptors/dr_02.c \
                   descriptors/dr_48.c \
                   descriptors/dr_49.c \
                   descriptors/dr_4a.c \
+                  descriptors/dr_4b.c \
                   descriptors/dr_4d.c \
                   descriptors/dr_4e.c \
                   descriptors/dr_52.c \
diff --git a/src/descriptors/dr.h b/src/descriptors/dr.h
index 6f2fd34..8a27329 100644
--- a/src/descriptors/dr.h
+++ b/src/descriptors/dr.h
@@ -58,6 +58,7 @@
 #include "dr_48.h"
 #include "dr_49.h"
 #include "dr_4a.h"
+#include "dr_4b.h"
 #include "dr_4d.h"
 #include "dr_4e.h"
 #include "dr_52.h"
diff --git a/src/descriptors/dr_4b.c b/src/descriptors/dr_4b.c
new file mode 100644
index 0000000..aba5a6b
--- /dev/null
+++ b/src/descriptors/dr_4b.c
@@ -0,0 +1,117 @@
+/*
+ * dr_4b.c
+ * Copyright (C) 2012 VideoLAN
+ *
+ * Authors: Roberto Corno <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.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_4b.h"
+
+/*****************************************************************************
+ * dvbpsi_DecodeNVODReferenceDr
+ *****************************************************************************/
+dvbpsi_nvod_ref_dr_t* dvbpsi_DecodeNVODReferenceDr(dvbpsi_descriptor_t * p_descriptor)
+{
+    /* Check the tag */
+    if (p_descriptor->i_tag != 0x4B)
+        return NULL;
+
+    /* Don't decode twice */
+    if (p_descriptor->p_decoded)
+        return p_descriptor->p_decoded;
+
+    /* Check the length */
+    if (p_descriptor->i_length < 6)
+        return NULL;
+    if (p_descriptor->i_length % 6!=0)
+        return NULL;
+
+    /* Allocate memory */
+    dvbpsi_nvod_ref_dr_t * p_decoded;
+    p_decoded = (dvbpsi_nvod_ref_dr_t*)calloc(1, sizeof(dvbpsi_nvod_ref_dr_t));
+    if (!p_decoded)
+        return NULL;
+
+    /* Decode data */
+    p_decoded->i_references = p_descriptor->i_length % 6;
+
+    for (int i = 0; i < p_decoded->i_references; i++) {
+      int pos = i*6;
+      p_decoded->p_nvod_refs[i].i_transport_stream_id = p_descriptor->p_data[pos] << 8
+                                                      | p_descriptor->p_data[pos+1];
+      p_decoded->p_nvod_refs[i].i_original_network_id = p_descriptor->p_data[pos+2] << 8
+                                                      | p_descriptor->p_data[pos+3];
+      p_decoded->p_nvod_refs[i].i_service_id = p_descriptor->p_data[pos+4] << 8
+                                                      | p_descriptor->p_data[pos+5];
+    }
+
+    p_descriptor->p_decoded = (void*)p_decoded;
+
+    return p_decoded;
+}
+
+/*****************************************************************************
+ * dvbpsi_GenNVODReferenceDr
+ *****************************************************************************/
+dvbpsi_descriptor_t * dvbpsi_GenNVODReferenceDr(dvbpsi_nvod_ref_dr_t * p_decoded,
+                                          bool b_duplicate)
+{
+    /* Create the descriptor */
+    dvbpsi_descriptor_t * p_descriptor =
+            dvbpsi_NewDescriptor(0x4b, p_decoded->i_references * 6, NULL);
+    if (!p_descriptor)
+        return NULL;
+
+    /* Encode data */
+    int pos = 0;
+    for (int i = 0; i < p_decoded->i_references; i++ ) {
+    	p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_transport_stream_id >> 8;
+        p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_transport_stream_id;
+        p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_original_network_id >> 8;
+        p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_original_network_id;
+        p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_service_id >> 8;
+        p_descriptor->p_data[pos++] = p_decoded->p_nvod_refs[i].i_service_id;
+    }
+
+    if (b_duplicate)
+    {
+        /* Duplicate decoded data */
+        p_descriptor->p_decoded =
+               dvbpsi_DuplicateDecodedDescriptor(p_decoded,
+                      sizeof(dvbpsi_nvod_ref_dr_t));
+    }
+
+    return p_descriptor;
+}
diff --git a/src/descriptors/dr_4b.h b/src/descriptors/dr_4b.h
new file mode 100644
index 0000000..455f381
--- /dev/null
+++ b/src/descriptors/dr_4b.h
@@ -0,0 +1,123 @@
+/*****************************************************************************
+ * dr_4a.h
+ * Copyright (C) 2012 VideoLAN
+ *
+ * Authors: Roberto Corno <[email protected]>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ *****************************************************************************/
+
+/*!
+ * \file <dr_4b.h>
+ * \author Corno Roberto <[email protected]>
+ * \brief Application interface for the Near Video On Demand (NVOD) reference
+ * descriptor decoder and generator.
+ *
+ * Application interface for the DVB Near Video On Demand (NVOD) reference
+ * descriptor decoder and generator. This descriptor's definition can be found in
+ * ETSI EN 300 468 section 6.2.26.
+ */
+#ifndef DR_4B_H_
+#define DR_4B_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************
+ * dvbpsi_nvod_ref_t
+ *****************************************************************************/
+/*!
+ * \struct dvbpsi_nvod_ref_t
+ * \brief one "NVOD reference" structure.
+ *
+ * This structure is used since vbidata_t structure will contain several
+ * of these structures
+ */
+/*!
+ * \typedef struct dvbpsi_nvod_ref_s dvbpsi_nvod_ref_t
+ * \brief dvbpsi_nvod_ref_dr_t type definition.
+ */
+/*!
+ * \struct dvbpsi_linkage_s
+ * \brief struct dvbpsi_nvod_ref_s @see dvbpsi_nvod_ref_t
+ */
+typedef struct dvbpsi_nvod_ref_s
+{
+  uint16_t       i_transport_stream_id;         /*!< transport stream id */
+  uint16_t       i_original_network_id;         /*!< original network id */
+  uint16_t       i_service_id;                  /*!< service id */
+} dvbpsi_nvod_ref_t;
+
+/*****************************************************************************
+ * dvbpsi_nvod_ref_dr_t
+ *****************************************************************************/
+/*!
+ * \struct dvbpsi_nvod_ref_dr_t
+ * \brief "NVOD reference" descriptor structure.
+ *
+ * This structure is used to store a decoded "Near Video On Demand (NVOD) reference"
+ * descriptor. (ETSI EN 300 468 section 6.2.26).
+ */
+/*!
+ * \typedef struct dvbpsi_nvod_ref_dr_s dvbpsi_nvod_ref_dr_t
+ * \brief dvbpsi_nvod_ref_dr_t type definition.
+ */
+/*!
+ * \struct dvbpsi_linkage_dr_s
+ * \brief struct dvbpsi_nvod_ref_dr_s @see dvbpsi_nvod_ref_dr_t
+ */
+typedef struct dvbpsi_nvod_ref_dr_s
+{
+  uint8_t               i_references;           /*!< number of nvod references */
+  dvbpsi_nvod_ref_t     p_nvod_refs[43];       /*!< NVOD references */
+} dvbpsi_nvod_ref_dr_t;
+
+/*****************************************************************************
+ * dvbpsi_DecodeNVODReferenceDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_nvod_ref_dr_t * dvbpsi_DecodeNVODReferenceDr(
+                                        dvbpsi_descriptor_t * p_descriptor)
+ * \brief "NVOD reference" descriptor decoder.
+ * \param p_descriptor pointer to the descriptor structure
+ * \return a pointer to a new "NVOD reference" descriptor structure
+ * which contains the decoded data.
+ */
+dvbpsi_nvod_ref_dr_t* dvbpsi_DecodeNVODReferenceDr(dvbpsi_descriptor_t * p_descriptor);
+
+/*****************************************************************************
+ * dvbpsi_GenNVODReferenceDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_descriptor_t *dvbpsi_GenNVODReferenceDr(dvbpsi_nvod_ref_dr_t *p_decoded,
+                                          bool b_duplicate);
+ * \brief "NVOD reference" descriptor generator.
+ * \param p_decoded pointer to a decoded "NVOD reference" descriptor structure
+ * \param b_duplicate if true 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_GenNVODReferenceDr(dvbpsi_nvod_ref_dr_t * p_decoded,
+                                         bool b_duplicate);
+
+#ifdef __cplusplus
+};
+#endif
+
+#else
+#error "Multiple inclusions of dr_4b.h"
+#endif /* DR_4B_H_ */
-- 
1.7.5.4
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.