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