libdvbpsi patches

Mélanie Benoît <[email protected]> Tue, 16 Dec 2014 15:47:11 +0100
Newsgroups gmane.comp.video.videolan.libdvbpsi.devel
Message-ID <CAMxPy4yQEx53=4aQeKWn01V8hfTaut0TMtX+Gu=hdFS9am2RLA@mail.gmail.com>
Hello,

I attached few git patches for libdvbpsi.
Feel free to integrate them and let me know if you have any comment or
suggestion regarding those patches.
Regards,

-- 
Mélanie Benoit

_______________________________________________
libdvbpsi-devel mailing list
[email protected]
https://mailman.videolan.org/listinfo/libdvbpsi-devel
0001-descriptors-dr_56-Fix-teletext_descriptor-0x56-gener.patch (text/x-patch, 880 B)
From ff1f2a3d9d32647c1ec9d2bbead67b9f99ee62a1 Mon Sep 17 00:00:00 2001
From: mbenoit <[email protected]>
Date: Mon, 15 Dec 2014 21:55:30 +0100
Subject: [PATCH 1/4] descriptors/dr_56: Fix teletext_descriptor (0x56)
 generation (wrong size allocation)

---
 src/descriptors/dr_56.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/descriptors/dr_56.c b/src/descriptors/dr_56.c
index a0edb1f..4729cf0 100644
--- a/src/descriptors/dr_56.c
+++ b/src/descriptors/dr_56.c
@@ -105,7 +105,7 @@ dvbpsi_descriptor_t * dvbpsi_GenTeletextDr(dvbpsi_teletext_dr_t * p_decoded,
 
     /* Create the descriptor */
     dvbpsi_descriptor_t * p_descriptor =
-            dvbpsi_NewDescriptor(0x56, p_decoded->i_pages_number * 8 , NULL);
+            dvbpsi_NewDescriptor(0x56, p_decoded->i_pages_number * 5 , NULL);
     if (!p_descriptor)
         return NULL;
 
-- 
2.2.0
0002-descriptors-dr_83-Add-support-for-generation-of-Logi.patch (text/x-patch, 3 KB)
From a4f1425ff669d591c2a0bd2ccaeb96b7cdafc60c Mon Sep 17 00:00:00 2001
From: mbenoit <[email protected]>
Date: Mon, 15 Dec 2014 22:01:59 +0100
Subject: [PATCH 2/4] descriptors/dr_83: Add support for generation of Logical
 Channel Number descriptor

---
 src/descriptors/dr_83.c | 31 +++++++++++++++++++++++++++++++
 src/descriptors/dr_83.h | 17 ++++++++++++++++-
 2 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/src/descriptors/dr_83.c b/src/descriptors/dr_83.c
index ce7bc27..6b1fa5e 100644
--- a/src/descriptors/dr_83.c
+++ b/src/descriptors/dr_83.c
@@ -83,3 +83,34 @@ dvbpsi_lcn_dr_t *dvbpsi_DecodeLCNDr(dvbpsi_descriptor_t *p_descriptor)
 
     return p_decoded;
 }
+
+/*****************************************************************************
+ * dvbpsi_GenLCNDr
+ *****************************************************************************/
+dvbpsi_descriptor_t* dvbpsi_GenLCNDr(dvbpsi_lcn_dr_t* p_decoded,
+                                       bool b_duplicate)
+{
+  dvbpsi_descriptor_t* p_descriptor = dvbpsi_NewDescriptor(0x83, p_decoded->i_number_of_entries * 4, 0);
+  if (NULL == p_descriptor) {
+    return NULL;
+  }
+
+  for (int i = 0; i < p_decoded->i_number_of_entries; i++ )
+  {
+    p_descriptor->p_data[4 * i] = p_decoded->p_entries[i].i_service_id >> 8;
+    p_descriptor->p_data[4 * i + 1] = p_decoded->p_entries[i].i_service_id;
+    p_descriptor->p_data[4 * i + 2] = (p_decoded->p_entries[i].b_visible_service_flag << 7);
+    p_descriptor->p_data[4 * i + 2] |= (p_decoded->p_entries[i].i_logical_channel_number >> 8);
+    p_descriptor->p_data[4 * i + 3] = p_decoded->p_entries[i].i_logical_channel_number;
+  }
+
+  if (b_duplicate)
+  {
+    dvbpsi_lcn_dr_t * p_dup = (dvbpsi_lcn_dr_t*) malloc(sizeof (dvbpsi_lcn_dr_t));
+    if (NULL != p_dup)
+      memcpy(p_dup, p_decoded, sizeof(dvbpsi_lcn_dr_t));
+    p_descriptor->p_decoded = (void*)p_dup;
+  }
+
+  return p_descriptor;
+}
\ No newline at end of file
diff --git a/src/descriptors/dr_83.h b/src/descriptors/dr_83.h
index 0ec4f6a..f0bd762 100644
--- a/src/descriptors/dr_83.h
+++ b/src/descriptors/dr_83.h
@@ -85,9 +85,24 @@ typedef struct dvbpsi_lcn_dr_s
  */
 dvbpsi_lcn_dr_t *dvbpsi_DecodeLCNDr(dvbpsi_descriptor_t *p_descriptor);
 
+/*****************************************************************************
+ * dvbpsi_GenLCNDr
+ *****************************************************************************/
+/*!
+ * \fn dvbpsi_descriptor_t * dvbpsi_GenLogicalChannelDr(
+                        dvbpsi_lcn_dr_t* p_decoded, bool b_duplicate)
+ * \brief "logical_channel" descriptor generator.
+ * \param p_decoded pointer to a decoded "logical_channel" 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_GenLCNDr(dvbpsi_lcn_dr_t* p_decoded, bool b_duplicate);
+
 #ifdef __cplusplus
 };
 #endif
 
-#endif
+#endif // _DR_83_H
 
-- 
2.2.0
0003-descriptors-dr_a1-Add-support-for-generation-of-Serv.patch (text/x-patch, 4.7 KB)
From c93179200ac29f010c00d61cfcfb3295fc3a7de9 Mon Sep 17 00:00:00 2001
From: mbenoit <[email protected]>
Date: Mon, 15 Dec 2014 22:07:07 +0100
Subject: [PATCH 3/4] descriptors/dr_a1: Add support for generation of Service
 Location descriptor

---
 src/descriptors/dr_a1.c | 70 ++++++++++++++++++++++---------------------------
 src/descriptors/dr_a1.h |  8 +++---
 2 files changed, 35 insertions(+), 43 deletions(-)

diff --git a/src/descriptors/dr_a1.c b/src/descriptors/dr_a1.c
index faeb8a2..796f3c0 100644
--- a/src/descriptors/dr_a1.c
+++ b/src/descriptors/dr_a1.c
@@ -91,49 +91,43 @@ dvbpsi_DecodeServiceLocationDr (dvbpsi_descriptor_t * p_descriptor)
     return p_decoded;
 }
 
-#if 0
+
 /*****************************************************************************
- * dvbpsi_GenServiceDr
+ * dvbpsi_GenServiceLocationDr
  *****************************************************************************/
-dvbpsi_descriptor_t *
-dvbpsi_GenServiceDr (dvbpsi_service_location_dr_t * p_decoded,
-		     bool b_duplicate)
+dvbpsi_descriptor_t* dvbpsi_GenServiceLocationDr(
+                                        dvbpsi_service_location_dr_t* p_decoded,
+                                        bool b_duplicate)
 {
-    /* Create the descriptor */
-    dvbpsi_descriptor_t *p_descriptor =
-            dvbpsi_NewDescriptor (0x48,
-                                  3 + p_decoded->i_service_location_name_length +
-                                  p_decoded->i_service_location_provider_name_length,
-                                  NULL);
-
-    if (p_descriptor)
+    uint8_t i_desc_length = 3 + p_decoded->i_number_elements * 6;
+    dvbpsi_descriptor_t* p_descriptor = dvbpsi_NewDescriptor(0xa1, i_desc_length, NULL);
+    if (!p_descriptor)
+        return NULL;
+
+    uint8_t* p_data = p_descriptor->p_data;
+    p_data[0] = p_decoded->i_pcr_pid >> 8;
+    p_data[1] = p_decoded->i_pcr_pid;
+    p_data[2] = p_decoded->i_number_elements;
+
+    p_data += 3;
+    for (uint8_t i = 0; i < p_decoded->i_number_elements; ++i) {
+      dvbpsi_service_location_element_t p_es = p_decoded->elements[i];
+      uint8_t* p_es_data = p_data;
+      p_es_data[0] = p_es.i_stream_type;
+      p_es_data[1] = p_es.i_elementary_pid >> 8;
+      p_es_data[2] = p_es.i_elementary_pid;
+      p_es_data[3] = p_es.i_iso_639_code[0];
+      p_es_data[4] = p_es.i_iso_639_code[1];
+      p_es_data[5] = p_es.i_iso_639_code[2];
+
+      p_data += 6;
+    }
+
+    if (b_duplicate)
     {
-        /* Encode data */
-        p_descriptor->p_data[0] = p_decoded->i_service_type;
-        p_descriptor->p_data[1] = p_decoded->i_service_provider_name_length;
-        if (p_decoded->i_service_provider_name_length)
-            memcpy (p_descriptor->p_data + 2,
-                    p_decoded->i_service_provider_name,
-                    p_decoded->i_service_provider_name_length);
-        p_descriptor->p_data[2 + p_decoded->i_service_provider_name_length] =
-                p_decoded->i_service_name_length;
-        if (p_decoded->i_service_name_length)
-            memcpy (p_descriptor->p_data + 3 +
-                    p_decoded->i_service_provider_name_length,
-                    p_decoded->i_service_name, p_decoded->i_service_name_length);
-
-        if (b_duplicate)
-        {
-            /* Duplicate decoded data */
-            dvbpsi_service_dr_t *p_dup_decoded =
-                    (dvbpsi_service_dr_t *) malloc (sizeof (dvbpsi_service_dr_t));
-            if (p_dup_decoded)
-                memcpy (p_dup_decoded, p_decoded, sizeof (dvbpsi_service_dr_t));
-
-            p_descriptor->p_decoded = (void *) p_dup_decoded;
-        }
+      p_descriptor->p_decoded = dvbpsi_DuplicateDecodedDescriptor(p_decoded,
+        sizeof(dvbpsi_service_location_dr_t));
     }
 
     return p_descriptor;
 }
-#endif
diff --git a/src/descriptors/dr_a1.h b/src/descriptors/dr_a1.h
index 5130168..b2072e4 100644
--- a/src/descriptors/dr_a1.h
+++ b/src/descriptors/dr_a1.h
@@ -81,7 +81,6 @@ typedef struct dvbpsi_service_location_dr_s
 dvbpsi_service_location_dr_t
     *dvbpsi_DecodeServiceLocationDr (dvbpsi_descriptor_t * p_descriptor);
 
-#if 0
 /*****************************************************************************
  * dvbpsi_GenServiceDataDr
  *****************************************************************************/
@@ -95,10 +94,9 @@ dvbpsi_service_location_dr_t
  * the descriptor
  * \return a pointer to a new descriptor structure which contains encoded data.
  */
-dvbpsi_descriptor_t *dvbpsi_GenServiceLocationDr (dvbpsi_service_dr_t *
-						    p_decoded,
-						    bool b_duplicate);
-#endif
+dvbpsi_descriptor_t* dvbpsi_GenServiceLocationDr(
+                                        dvbpsi_service_location_dr_t* p_decoded,
+                                        bool b_duplicate);
 
 
 #ifdef __cplusplus
-- 
2.2.0
0004-tables-eit-Fix-invalid-parsing-of-free_ca-field.patch (text/x-patch, 1 KB)
From 54b928211499560e96b1acf2b8d1429508ff0e4f Mon Sep 17 00:00:00 2001
From: mbenoit <[email protected]>
Date: Mon, 15 Dec 2014 22:09:36 +0100
Subject: [PATCH 4/4] tables/eit: Fix invalid parsing of 'free_ca' field

---
 src/tables/eit.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/tables/eit.c b/src/tables/eit.c
index 6e359a2..fa1ae7e 100644
--- a/src/tables/eit.c
+++ b/src/tables/eit.c
@@ -535,7 +535,7 @@ void dvbpsi_eit_sections_decode(dvbpsi_eit_t* p_eit,
                                   ((uint32_t)(p_byte[8]) << 8)  |
                                               p_byte[9];
             uint8_t i_running_status = (uint8_t)(p_byte[10]) >> 5;
-            bool b_free_ca = ((p_byte[10] & 0x8) == 0x8) ? false : true;
+            bool b_free_ca = ((p_byte[10] & 0x10) == 0x10) ? true : false;
             uint16_t i_ev_length = ((uint16_t)(p_byte[10] & 0xf) << 8) |
                                                p_byte[11];
             dvbpsi_eit_event_t *p_event = dvbpsi_eit_event_add(p_eit,
-- 
2.2.0