add support for parsing caption service descriptor 0x86

[email protected] (Michael Krufky)
Newsgroups gmane.comp.video.videolan.libdvbpsi.devel
Message-ID <[email protected]>
libdvbpsi | branch: master | Michael Krufky <[email protected]> | Sat May 18 09:27:45 2013 -0400| [be8f6af07463dadc75b65e980d9d46b3b891cab1] | committer: Jean-Paul Saman

add support for parsing caption service descriptor 0x86

Signed-off-by: Michael Krufky <[email protected]>

> http://git.videolan.org/gitweb.cgi/libdvbpsi.git/?a=commit;h=be8f6af07463dadc75b65e980d9d46b3b891cab1
---

 src/Makefile.am         |    2 +
 src/descriptors/dr_86.c |  103 +++++++++++++++++++++++++++++++++++++++++++++++
 src/descriptors/dr_86.h |   98 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 203 insertions(+)

diff --git a/src/Makefile.am b/src/Makefile.am
index 459c1aa..e8a0b6c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -67,6 +67,7 @@ pkginclude_HEADERS = dvbpsi.h psi.h descriptor.h demux.h \
                      descriptors/dr_76.h \
                      descriptors/dr_7c.h \
 		     descriptors/dr_83.h \
+		     descriptors/dr_86.h \
 		     descriptors/dr_8a.h \
                      descriptors/dr.h
 
@@ -117,6 +118,7 @@ descriptors_src = descriptors/dr_02.c \
                   descriptors/dr_76.c \
                   descriptors/dr_7c.c \
                   descriptors/dr_83.c \
+                  descriptors/dr_86.c \
 		  descriptors/dr_8a.c
 
 tables_src = tables/pat.c tables/pat_private.h \
diff --git a/src/descriptors/dr_86.c b/src/descriptors/dr_86.c
new file mode 100644
index 0000000..4d781a4
--- /dev/null
+++ b/src/descriptors/dr_86.c
@@ -0,0 +1,103 @@
+/*
+Copyright (C) 2013  Michael Krufky
+
+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
+
+dr_86.c
+
+Decode Caption Service Descriptor.
+
+*/
+#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_86.h"
+
+/*****************************************************************************
+ * dvbpsi_DecodeCaptionServiceDr
+ *****************************************************************************/
+dvbpsi_caption_service_dr_t *dvbpsi_DecodeCaptionServiceDr(dvbpsi_descriptor_t *p_descriptor)
+{
+    dvbpsi_caption_service_dr_t *p_decoded;
+    uint8_t * buf = p_descriptor->p_data;
+
+    /* Check the tag */
+    if (p_descriptor->i_tag != 0x86)
+        return NULL;
+
+    /* Don't decode twice */
+    if (p_descriptor->p_decoded)
+        return p_descriptor->p_decoded;
+
+    /* Check length */
+    if ((p_descriptor->i_length - 1) % 6)
+        return NULL;
+
+    p_decoded = (dvbpsi_caption_service_dr_t*)malloc(sizeof(dvbpsi_caption_service_dr_t));
+    if (!p_decoded)
+        return NULL;
+
+    p_descriptor->p_decoded = (void*)p_decoded;
+
+    p_decoded->p_first_service = NULL;
+
+    p_decoded->i_number_of_services = 0x1f & buf[0];
+    buf++;
+
+    for (int i = 0; i < p_decoded->i_number_of_services; i++)
+    {
+        dvbpsi_caption_service_t * p_service =
+            (dvbpsi_caption_service_t*)malloc(sizeof(dvbpsi_caption_service_t));
+
+        if (!p_service) return NULL;
+
+        memset(p_service, 0, sizeof(dvbpsi_caption_service_t));
+
+        memcpy(p_service->i_iso_639_code, buf, 3);
+        buf += 3;
+        p_service->b_digital_cc             = 0x01 & (buf[0] >> 7);
+        p_service->b_line21_field           = 0x01 &  buf[0];
+        p_service->i_caption_service_number = (p_service->b_digital_cc) ? 0x3F &  buf[0] : 0;
+        buf++;
+        p_service->b_easy_reader            = 0x01 & (buf[0] >> 7);
+        p_service->b_wide_aspect_ratio      = 0x01 & (buf[0] >> 6);
+
+        if (p_decoded->p_first_service == NULL)
+            p_decoded->p_first_service = p_service;
+        else
+        {
+            dvbpsi_caption_service_t* p_last_service = p_decoded->p_first_service;
+            while (p_last_service->p_next != NULL)
+              p_last_service = p_last_service->p_next;
+            p_last_service->p_next = p_service;
+        }
+        buf += 2;
+    }
+    return p_decoded;
+}
diff --git a/src/descriptors/dr_86.h b/src/descriptors/dr_86.h
new file mode 100644
index 0000000..ceaf80d
--- /dev/null
+++ b/src/descriptors/dr_86.h
@@ -0,0 +1,98 @@
+/*
+Copyright (C) 2013  Michael Krufky
+
+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
+
+dr_86.h
+
+Decode Caption Service Descriptor.
+
+*/
+
+/*!
+ * \file dr_86.h
+ * \author Michael Krufky
+ * \brief Decode Caption Service Descriptor.
+ */
+
+#ifndef _DR_86_H
+#define _DR_86_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*****************************************************************************
+ * dvbpsi_caption_service_t
+ *****************************************************************************/
+/*!
+ * \struct dvbpsi_caption_service_s
+ * \brief Caption Service
+ *
+ * This structure is used to store a decoded Caption Service.
+ */
+/*!
+ * \typedef struct dvbpsi_caption_service_s dvbpsi_caption_service_t
+ * \brief dvbpsi_caption_service_t type definition.
+ */
+typedef struct dvbpsi_caption_service_s
+{
+    char     i_iso_639_code[3];
+    int      b_digital_cc;
+    int      b_line21_field;
+    uint16_t i_caption_service_number;
+    int      b_easy_reader;
+    int      b_wide_aspect_ratio;
+
+    struct dvbpsi_caption_service_s *p_next;
+}dvbpsi_caption_service_t;
+
+/*****************************************************************************
+ * dvbpsi_caption_service_dr_s
+ *****************************************************************************/
+/*!
+ * \struct dvbpsi_caption_service_dr_s
+ * \brief Caption Service Descriptor
+ *
+ * This structure is used to store a decoded Caption Service descriptor.
+ */
+/*!
+ * \typedef struct dvbpsi_caption_service_dr_s dvbpsi_caption_service_dr_t
+ * \brief dvbpsi_caption_service_dr_t type definition.
+ */
+typedef struct dvbpsi_caption_service_dr_s
+{
+    uint8_t i_number_of_services;
+    dvbpsi_caption_service_t *p_first_service;
+}dvbpsi_caption_service_dr_t;
+
+/*****************************************************************************
+ * dvbpsi_DecodeCaptionServiceDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_caption_service_dr_t dvbpsi_DecodeCaptionServiceDr(dvbpsi_descriptor_t *p_descriptor)
+ * \brief Decode a Caption Service descriptor (tag 0x86)
+ * \param p_descriptor Raw descriptor to decode.
+ * \return NULL if the descriptor could not be decoded or a pointer to a
+ *         dvbpsi_caption_service_dr_t structure.
+ */
+dvbpsi_caption_service_dr_t *dvbpsi_DecodeCaptionServiceDr(dvbpsi_descriptor_t *p_descriptor);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+

_______________________________________________
libdvbpsi-devel mailing list
[email protected]
https://mailman.videolan.org/listinfo/libdvbpsi-devel
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.