Add 0x50 Descriptor Decoder/Generator support

Roberto Corno <[email protected]>
Newsgroups gmane.comp.video.videolan.libdvbpsi.devel
Message-ID <CAO6YRm_9FaKXa5N21cXyxZjsEyaA=N67DqFy2-eed355Q1dU7w@mail.gmail.com>
Patch for adding DVB descriptor 0x50 support
Patch attached.
Best Regards,
Roberto

_______________________________________________
libdvbpsi-devel mailing list
[email protected]
http://mailman.videolan.org/listinfo/libdvbpsi-devel
0005-Add-0x50-Descriptor-Decoder-Generator-support.patch (application/octet-stream, 10 KB)
From fb541e3295a81e8b5c383683af79baa2fdc5d21a Mon Sep 17 00:00:00 2001
From: Roberto Corno <[email protected]>
Date: Thu, 30 Aug 2012 12:55:08 +0200
Subject: [PATCH 5/5] Add 0x50 Descriptor Decoder/Generator support

---
 src/Makefile.am         |    2 +
 src/descriptors/dr.h    |    1 +
 src/descriptors/dr_50.c |  121 +++++++++++++++++++++++++++++++++++++++++++++++
 src/descriptors/dr_50.h |  104 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 228 insertions(+), 0 deletions(-)
 create mode 100644 src/descriptors/dr_50.c
 create mode 100644 src/descriptors/dr_50.h

diff --git a/src/Makefile.am b/src/Makefile.am
index 81a0e77..ced91ec 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -50,6 +50,7 @@ pkginclude_HEADERS = dvbpsi.h psi.h descriptor.h demux.h \
                      descriptors/dr_4d.h \
                      descriptors/dr_4e.h \
                      descriptors/dr_4f.h \
+                     descriptors/dr_50.h \
                      descriptors/dr_52.h \
                      descriptors/dr_55.h \
                      descriptors/dr_56.h \
@@ -96,6 +97,7 @@ descriptors_src = descriptors/dr_02.c \
                   descriptors/dr_4d.c \
                   descriptors/dr_4e.c \
                   descriptors/dr_4f.c \
+                  descriptors/dr_50.c \
                   descriptors/dr_52.c \
                   descriptors/dr_55.c \
                   descriptors/dr_56.c \
diff --git a/src/descriptors/dr.h b/src/descriptors/dr.h
index 91192d8..80262d5 100644
--- a/src/descriptors/dr.h
+++ b/src/descriptors/dr.h
@@ -62,6 +62,7 @@
 #include "dr_4d.h"
 #include "dr_4e.h"
 #include "dr_4f.h"
+#include "dr_50.h"
 #include "dr_52.h"
 #include "dr_55.h"
 #include "dr_56.h"
diff --git a/src/descriptors/dr_50.c b/src/descriptors/dr_50.c
new file mode 100644
index 0000000..f6321f9
--- /dev/null
+++ b/src/descriptors/dr_50.c
@@ -0,0 +1,121 @@
+/*
+ * dr_50.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_50.h"
+
+/*****************************************************************************
+ * dvbpsi_DecodeComponentDr
+ *****************************************************************************/
+dvbpsi_component_dr_t* dvbpsi_DecodeComponentDr(dvbpsi_descriptor_t * p_descriptor)
+{
+    /* Check the tag */
+    if (p_descriptor->i_tag != 0x50)
+        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;
+
+    /* Allocate memory */
+    dvbpsi_component_dr_t * p_decoded;
+    p_decoded = (dvbpsi_component_dr_t*)calloc(1, sizeof(dvbpsi_component_dr_t));
+    if (!p_decoded)
+        return NULL;
+
+    /* Decode data */
+    p_decoded->i_stream_content = p_descriptor->p_data[0] & 0x0F;
+    p_decoded->i_component_type = p_descriptor->p_data[1];
+    p_decoded->i_component_tag = p_descriptor->p_data[2];
+    memcpy( &p_decoded->i_iso_639_code[0], &p_descriptor->p_data[3], 3 );
+    if (p_descriptor->i_length > 6)
+    {
+    	p_decoded->i_text_length = p_descriptor->i_length - 6;
+    	p_decoded->i_text = calloc(p_decoded->i_text_length - 6, sizeof(uint8_t));
+        if (!p_decoded)
+        {
+        	free(p_decoded);
+            return NULL;
+        }
+    	memcpy( p_decoded->i_text, &p_descriptor->p_data[6], p_decoded->i_text_length );
+    }
+    else
+    {
+        p_decoded->i_text_length = 0;
+        p_decoded->i_text = NULL;
+    }
+
+    p_descriptor->p_decoded = (void*)p_decoded;
+
+    return p_decoded;
+}
+
+/*****************************************************************************
+ * dvbpsi_GenComponentDr
+ *****************************************************************************/
+dvbpsi_descriptor_t *dvbpsi_GenComponentDr(dvbpsi_component_dr_t * p_decoded,
+                                                  bool b_duplicate)
+{
+    /* Create the descriptor */
+    dvbpsi_descriptor_t * p_descriptor =
+            dvbpsi_NewDescriptor(0x50, 6+p_decoded->i_text_length, NULL);
+    if (!p_descriptor)
+        return NULL;
+
+    /* Encode data */
+	p_descriptor->p_data[0] = p_decoded->i_stream_content+0xF0;
+    p_descriptor->p_data[1] = p_decoded->i_component_type;
+    p_descriptor->p_data[2] = p_decoded->i_component_tag;
+    memcpy( &p_descriptor->p_data[3], p_decoded->i_iso_639_code, 3 );
+    if (p_decoded->i_text_length)
+      memcpy(&p_descriptor->p_data[6],p_decoded->i_text,p_decoded->i_text_length);
+
+    if (b_duplicate)
+    {
+        /* Duplicate decoded data */
+        p_descriptor->p_decoded =
+               dvbpsi_DuplicateDecodedDescriptor(p_decoded,
+                      sizeof(dvbpsi_component_dr_t));
+    }
+
+    return p_descriptor;
+}
diff --git a/src/descriptors/dr_50.h b/src/descriptors/dr_50.h
new file mode 100644
index 0000000..3977ec1
--- /dev/null
+++ b/src/descriptors/dr_50.h
@@ -0,0 +1,104 @@
+/*****************************************************************************
+ * dr_50.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_50.h>
+ * \author Corno Roberto <[email protected]>
+ * \brief Application interface for the time shifted event
+ * descriptor decoder and generator.
+ *
+ * Application interface for the Component descriptor
+ * descriptor decoder and generator. This descriptor's definition can be found in
+ * ETSI EN 300 468 section 6.2.8.
+ */
+
+#ifndef DR_50_H_
+#define DR_50_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************
+ * dvbpsi_component_dr_t
+ *****************************************************************************/
+/*!
+ * \struct dvbpsi_component_dr_t
+ * \brief "Component" descriptor structure.
+ *
+ * This structure is used to store a decoded "Component"
+ * descriptor. (ETSI EN 300 468 section 6.2.8).
+ */
+/*!
+ * \typedef struct dvbpsi_component_dr_s dvbpsi_component_dr_t
+ * \brief dvbpsi_component_dr_t type definition.
+ */
+/*!
+ * \struct dvbpsi_component_dr_s
+ * \brief struct dvbpsi_component_dr_s @see dvbpsi_component_dr_t
+ */
+typedef struct dvbpsi_component_dr_t
+{
+  uint8_t       i_stream_content;         /*!< stream content */
+  uint8_t       i_component_type;         /*!< component type */
+  uint8_t       i_component_tag;          /*!< component tag */
+  uint8_t       i_iso_639_code[3];        /*!< 3 letter ISO 639 language code */
+  int           i_text_length;            /*!< text length */
+  uint8_t      *i_text;                   /*!< text */
+
+} dvbpsi_component_dr_t;
+
+/*****************************************************************************
+ * dvbpsi_DecodeComponentDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_component_dr_t * dvbpsi_DecodeComponentDr(
+                                        dvbpsi_descriptor_t * p_descriptor)
+ * \brief "Component" descriptor decoder.
+ * \param p_descriptor pointer to the descriptor structure
+ * \return a pointer to a new "Component" descriptor structure
+ * which contains the decoded data.
+ */
+dvbpsi_component_dr_t* dvbpsi_DecodeComponentDr(dvbpsi_descriptor_t * p_descriptor);
+
+/*****************************************************************************
+ * dvbpsi_GenComponentDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_descriptor_t *dvbpsi_GenComponentDr(dvbpsi_component_dr_t *p_decoded,
+                                                  bool b_duplicate);
+ * \brief "Component" descriptor generator.
+ * \param p_decoded pointer to a decoded "Component" 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_GenComponentDr(dvbpsi_component_dr_t * p_decoded,
+                                                  bool b_duplicate);
+
+#ifdef __cplusplus
+};
+#endif
+
+#else
+#error "Multiple inclusions of dr_50.h"
+#endif /* DR_50_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.