linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private
@ 2014-01-04 17:07 André Roth
  2014-01-04 17:07 ` [PATCH 02/11] libdvbv5: add attribute packed to structs and unions André Roth
                   ` (10 more replies)
  0 siblings, 11 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:07 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/include/libdvbv5/descriptors.h |    2 --
 lib/libdvbv5/descriptors.c         |   44 ++++++++++++++++++------------------
 2 files changed, 22 insertions(+), 24 deletions(-)

diff --git a/lib/include/libdvbv5/descriptors.h b/lib/include/libdvbv5/descriptors.h
index 6f89aeb..36bcc61 100644
--- a/lib/include/libdvbv5/descriptors.h
+++ b/lib/include/libdvbv5/descriptors.h
@@ -78,8 +78,6 @@ void dvb_desc_default_print  (struct dvb_v5_fe_parms *parms, const struct dvb_de
 	for( _struct *_desc = (_struct *) _tbl->descriptor; _desc; _desc = (_struct *) _desc->next ) \
 		if(_desc->type == _type) \
 
-ssize_t dvb_desc_init(const uint8_t *buf, struct dvb_desc *desc);
-
 uint32_t bcd(uint32_t bcd);
 
 void hexdump(struct dvb_v5_fe_parms *parms, const char *prefix, const unsigned char *buf, int len);
diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c
index a2176b4..626f81d 100644
--- a/lib/libdvbv5/descriptors.c
+++ b/lib/libdvbv5/descriptors.c
@@ -56,12 +56,11 @@
 #include <libdvbv5/desc_partial_reception.h>
 #include <libdvbv5/desc_extension.h>
 
-ssize_t dvb_desc_init(const uint8_t *buf, struct dvb_desc *desc)
+static void dvb_desc_init(uint8_t type, uint8_t length, struct dvb_desc *desc)
 {
-	desc->type   = buf[0];
-	desc->length = buf[1];
+	desc->type   = type;
+	desc->length = length;
 	desc->next   = NULL;
-	return 2;
 }
 
 void dvb_desc_default_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
@@ -94,16 +93,27 @@ char *default_charset = "iso-8859-1";
 char *output_charset = "utf-8";
 
 void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
-			   uint16_t section_length, struct dvb_desc **head_desc)
+			   uint16_t buflen, struct dvb_desc **head_desc)
 {
-	const uint8_t *ptr = buf;
+	const uint8_t *ptr = buf, *endbuf = buf + buflen;
 	struct dvb_desc *current = NULL;
 	struct dvb_desc *last = NULL;
-	while (ptr < buf + section_length) {
-		unsigned desc_type = ptr[0];
-		int desc_len  = ptr[1];
+
+	*head_desc = NULL;
+
+	while (ptr + 2 <= endbuf ) {
+		uint8_t desc_type = ptr[0];
+		uint8_t desc_len  = ptr[1];
 		size_t size;
 
+		ptr += 2; /* skip type and length */
+
+		if (ptr + desc_len > endbuf) {
+			dvb_logerr("short read of %zd/%d bytes parsing descriptor %#02x",
+				   endbuf - ptr, desc_len, desc_type);
+			return;
+		}
+
 		switch (parms->verbose) {
 		case 0:
 		case 1:
@@ -119,11 +129,6 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 			hexdump(parms, "content: ", ptr + 2, desc_len);
 		}
 
-		if (desc_len > section_length - 2) {
-			dvb_logwarn("descriptor type %0x02x is too big",
-				   desc_type);
-			return;
-		}
 
 		dvb_desc_init_func init = dvb_descriptors[desc_type].init;
 		if (!init) {
@@ -133,21 +138,16 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 			size = dvb_descriptors[desc_type].size;
 		}
 		if (!size) {
-			dvb_logwarn("descriptor type 0x%02x has no size defined", desc_type);
-			size = 4096;
-		}
-		if (ptr + 2 >=  buf + section_length) {
-			dvb_logwarn("descriptor type 0x%02x is truncated: desc len %d, section len %zd",
-				   desc_type, desc_len, section_length - (ptr - buf));
+			dvb_logerr("descriptor type 0x%02x has no size defined", desc_type);
 			return;
 		}
 
-		current = calloc(1, size);
+		current = malloc(size);
 		if (!current) {
 			dvb_perror("Out of memory");
 			return;
 		}
-		ptr += dvb_desc_init(ptr, current); /* the standard header was read */
+		dvb_desc_init(desc_type, desc_len, current); /* initialize the standard header */
 		init(parms, ptr, current);
 		if (!*head_desc)
 			*head_desc = current;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 02/11] libdvbv5: add attribute packed to structs and unions
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
@ 2014-01-04 17:07 ` André Roth
  2014-01-04 17:07 ` [PATCH 03/11] libdvbv5: add parser for CAT André Roth
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:07 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/include/libdvbv5/atsc_header.h                |    2 +-
 lib/include/libdvbv5/desc_atsc_service_location.h |    4 ++--
 lib/include/libdvbv5/desc_cable_delivery.h        |    8 ++++----
 lib/include/libdvbv5/desc_event_extended.h        |    4 ++--
 lib/include/libdvbv5/desc_frequency_list.h        |    4 ++--
 lib/include/libdvbv5/desc_isdbt_delivery.h        |    4 ++--
 lib/include/libdvbv5/desc_logical_channel.h       |    4 ++--
 lib/include/libdvbv5/desc_sat.h                   |    4 ++--
 lib/include/libdvbv5/desc_service_location.h      |    8 ++++----
 lib/include/libdvbv5/desc_t2_delivery.h           |    4 ++--
 lib/include/libdvbv5/header.h                     |    4 ++--
 lib/include/libdvbv5/mpeg_es.h                    |    6 +++---
 lib/include/libdvbv5/mpeg_ts.h                    |    2 +-
 lib/include/libdvbv5/nit.h                        |    4 ++--
 lib/include/libdvbv5/pat.h                        |    2 +-
 lib/include/libdvbv5/pmt.h                        |   16 ++++++++--------
 lib/include/libdvbv5/sdt.h                        |    2 +-
 lib/include/libdvbv5/vct.h                        |    4 ++--
 18 files changed, 43 insertions(+), 43 deletions(-)

diff --git a/lib/include/libdvbv5/atsc_header.h b/lib/include/libdvbv5/atsc_header.h
index 1e7148e..9685b37 100644
--- a/lib/include/libdvbv5/atsc_header.h
+++ b/lib/include/libdvbv5/atsc_header.h
@@ -36,7 +36,7 @@ struct atsc_table_header {
 			uint16_t priv:1;
 			uint16_t syntax:1;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 	uint16_t id;
 	uint8_t  current_next:1;
 	uint8_t  version:5;
diff --git a/lib/include/libdvbv5/desc_atsc_service_location.h b/lib/include/libdvbv5/desc_atsc_service_location.h
index 47113f2..1ff2341 100644
--- a/lib/include/libdvbv5/desc_atsc_service_location.h
+++ b/lib/include/libdvbv5/desc_atsc_service_location.h
@@ -32,7 +32,7 @@ struct atsc_desc_service_location_elementary {
 			uint16_t elementary_pid:13;
 			uint16_t reserved:3;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 	char ISO_639_language_code[3];
 } __attribute__((packed));
 
@@ -49,7 +49,7 @@ struct atsc_desc_service_location {
 			uint16_t pcr_pid:13;
 			uint16_t reserved:3;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 
 	uint8_t number_elements;
 } __attribute__((packed));
diff --git a/lib/include/libdvbv5/desc_cable_delivery.h b/lib/include/libdvbv5/desc_cable_delivery.h
index 70f5a5b..c2bab5a 100644
--- a/lib/include/libdvbv5/desc_cable_delivery.h
+++ b/lib/include/libdvbv5/desc_cable_delivery.h
@@ -37,16 +37,16 @@ struct dvb_desc_cable_delivery {
 		struct {
 			uint16_t fec_outer:4;
 			uint16_t reserved_future_use:12;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 	uint8_t modulation;
 	union {
 		uint32_t bitfield2;
 		struct {
 			uint32_t fec_inner:4;
 			uint32_t symbol_rate:28;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 } __attribute__((packed));
 
 struct dvb_v5_fe_parms;
diff --git a/lib/include/libdvbv5/desc_event_extended.h b/lib/include/libdvbv5/desc_event_extended.h
index a543590..03fb1f1 100644
--- a/lib/include/libdvbv5/desc_event_extended.h
+++ b/lib/include/libdvbv5/desc_event_extended.h
@@ -34,9 +34,9 @@ struct dvb_desc_event_extended {
 		struct {
 			uint8_t last_id:4;
 			uint8_t id:4;
-		};
+		} __attribute__((packed));
 		uint8_t ids;
-	};
+	} __attribute__((packed));
 
 	unsigned char language[4];
 	char *text;
diff --git a/lib/include/libdvbv5/desc_frequency_list.h b/lib/include/libdvbv5/desc_frequency_list.h
index e6e7945..55723c7 100644
--- a/lib/include/libdvbv5/desc_frequency_list.h
+++ b/lib/include/libdvbv5/desc_frequency_list.h
@@ -38,8 +38,8 @@ struct dvb_desc_frequency_list {
 		struct {
 			uint8_t freq_type:2;
 			uint8_t reserved:6;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 } __attribute__((packed));
 
 struct dvb_v5_fe_parms;
diff --git a/lib/include/libdvbv5/desc_isdbt_delivery.h b/lib/include/libdvbv5/desc_isdbt_delivery.h
index 4df30df..5bac178 100644
--- a/lib/include/libdvbv5/desc_isdbt_delivery.h
+++ b/lib/include/libdvbv5/desc_isdbt_delivery.h
@@ -38,8 +38,8 @@ struct isdbt_desc_terrestrial_delivery_system {
 			uint16_t transmission_mode:2;
 			uint16_t guard_interval:2;
 			uint16_t area_code:6;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 } __attribute__((packed));
 
 struct dvb_v5_fe_parms;
diff --git a/lib/include/libdvbv5/desc_logical_channel.h b/lib/include/libdvbv5/desc_logical_channel.h
index ce1206c..bbccb81 100644
--- a/lib/include/libdvbv5/desc_logical_channel.h
+++ b/lib/include/libdvbv5/desc_logical_channel.h
@@ -36,8 +36,8 @@ struct dvb_desc_logical_channel_number {
 			uint16_t logical_channel_number:10;
 			uint16_t reserved:5;
 			uint16_t visible_service_flag:1;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 } __attribute__((packed));
 
 struct dvb_desc_logical_channel {
diff --git a/lib/include/libdvbv5/desc_sat.h b/lib/include/libdvbv5/desc_sat.h
index bb55319..9e192c6 100644
--- a/lib/include/libdvbv5/desc_sat.h
+++ b/lib/include/libdvbv5/desc_sat.h
@@ -42,8 +42,8 @@ struct dvb_desc_sat {
 		struct {
 			uint32_t fec:4;
 			uint32_t symbol_rate:28;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 } __attribute__((packed));
 
 struct dvb_v5_fe_parms;
diff --git a/lib/include/libdvbv5/desc_service_location.h b/lib/include/libdvbv5/desc_service_location.h
index 89ed055..046bedc 100644
--- a/lib/include/libdvbv5/desc_service_location.h
+++ b/lib/include/libdvbv5/desc_service_location.h
@@ -31,8 +31,8 @@ struct dvb_desc_service_location_element {
 		struct {
 			uint16_t elementary_pid:13;
 			uint16_t reserved:3;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 	uint8_t language[4];
 } __attribute__((packed));
 
@@ -46,8 +46,8 @@ struct dvb_desc_service_location {
 		struct {
 			uint16_t pcr_pid:13;
 			uint16_t reserved:3;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 	uint8_t elements;
 	struct dvb_desc_service_location_element *element;
 } __attribute__((packed));
diff --git a/lib/include/libdvbv5/desc_t2_delivery.h b/lib/include/libdvbv5/desc_t2_delivery.h
index a36f6c1..a51f897 100644
--- a/lib/include/libdvbv5/desc_t2_delivery.h
+++ b/lib/include/libdvbv5/desc_t2_delivery.h
@@ -43,8 +43,8 @@ struct dvb_desc_t2_delivery {
 			uint16_t reserved:2;
 			uint16_t bandwidth:3;
 			uint16_t SISO_MISO:2;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 
 	uint32_t *centre_frequency;
 	uint8_t frequency_loop_length;
diff --git a/lib/include/libdvbv5/header.h b/lib/include/libdvbv5/header.h
index c8cd466..39871c9 100644
--- a/lib/include/libdvbv5/header.h
+++ b/lib/include/libdvbv5/header.h
@@ -35,7 +35,7 @@ struct dvb_ts_packet_header {
 			uint16_t payload_unit_start_indicator:1;
 			uint16_t transport_error_indicator:1;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 	uint8_t continuity_counter:4;
 	uint8_t adaptation_field_control:2;
 	uint8_t transport_scrambling_control:2;
@@ -55,7 +55,7 @@ struct dvb_table_header {
 			uint8_t  zero2:1;
 			uint8_t  syntax:1;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 	uint16_t id;
 	uint8_t  current_next:1;
 	uint8_t  version:5;
diff --git a/lib/include/libdvbv5/mpeg_es.h b/lib/include/libdvbv5/mpeg_es.h
index 4c6a862..4f1786e 100644
--- a/lib/include/libdvbv5/mpeg_es.h
+++ b/lib/include/libdvbv5/mpeg_es.h
@@ -47,7 +47,7 @@ struct dvb_mpeg_es_seq_start {
 			uint32_t height:12;
 			uint32_t width:12;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 	union {
 		uint32_t bitfield3;
 		struct {
@@ -58,7 +58,7 @@ struct dvb_mpeg_es_seq_start {
 			uint32_t one:1;
 			uint32_t bitrate:18;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 } __attribute__((packed));
 
 struct dvb_mpeg_es_pic_start {
@@ -77,7 +77,7 @@ struct dvb_mpeg_es_pic_start {
 			uint32_t coding_type:3;
 			uint32_t temporal_ref:10;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 } __attribute__((packed));
 
 enum dvb_mpeg_es_frame_t
diff --git a/lib/include/libdvbv5/mpeg_ts.h b/lib/include/libdvbv5/mpeg_ts.h
index de4fc3f..a877f42 100644
--- a/lib/include/libdvbv5/mpeg_ts.h
+++ b/lib/include/libdvbv5/mpeg_ts.h
@@ -51,7 +51,7 @@ struct dvb_mpeg_ts {
 			uint16_t payload_start:1;
 			uint16_t tei:1;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 	struct {
 		uint8_t continuity_counter:4;
 		uint8_t adaptation_field:2;
diff --git a/lib/include/libdvbv5/nit.h b/lib/include/libdvbv5/nit.h
index 09fe596..48feecc 100644
--- a/lib/include/libdvbv5/nit.h
+++ b/lib/include/libdvbv5/nit.h
@@ -49,7 +49,7 @@ struct dvb_table_nit_transport {
 			uint16_t section_length:12;
 			uint16_t reserved:4;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 	struct dvb_desc *descriptor;
 	struct dvb_table_nit_transport *next;
 } __attribute__((packed));
@@ -62,7 +62,7 @@ struct dvb_table_nit {
 			uint16_t desc_length:12;
 			uint16_t reserved:4;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 	struct dvb_desc *descriptor;
 	struct dvb_table_nit_transport *transport;
 } __attribute__((packed));
diff --git a/lib/include/libdvbv5/pat.h b/lib/include/libdvbv5/pat.h
index 899815c..2004836 100644
--- a/lib/include/libdvbv5/pat.h
+++ b/lib/include/libdvbv5/pat.h
@@ -38,7 +38,7 @@ struct dvb_table_pat_program {
 			uint16_t pid:13;
 			uint8_t  reserved:3;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 	struct dvb_table_pat_program *next;
 } __attribute__((packed));
 
diff --git a/lib/include/libdvbv5/pmt.h b/lib/include/libdvbv5/pmt.h
index e1d44cb..f1b7cef 100644
--- a/lib/include/libdvbv5/pmt.h
+++ b/lib/include/libdvbv5/pmt.h
@@ -64,16 +64,16 @@ struct dvb_table_pmt_stream {
 		struct {
 			uint16_t elementary_pid:13;
 			uint16_t reserved:3;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 	union {
 		uint16_t bitfield2;
 		struct {
 			uint16_t section_length:10;
 			uint16_t zero:2;
 			uint16_t reserved2:4;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 	struct dvb_desc *descriptor;
 	struct dvb_table_pmt_stream *next;
 } __attribute__((packed));
@@ -85,8 +85,8 @@ struct dvb_table_pmt {
 		struct {
 			uint16_t pcr_pid:13;
 			uint16_t reserved2:3;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 
 	union {
 		uint16_t bitfield2;
@@ -94,8 +94,8 @@ struct dvb_table_pmt {
 			uint16_t prog_length:10;
 			uint16_t zero3:2;
 			uint16_t reserved3:4;
-		};
-	};
+		} __attribute__((packed));
+	} __attribute__((packed));
 	struct dvb_table_pmt_stream *stream;
 } __attribute__((packed));
 
diff --git a/lib/include/libdvbv5/sdt.h b/lib/include/libdvbv5/sdt.h
index 77ec5b1..17c51f2 100644
--- a/lib/include/libdvbv5/sdt.h
+++ b/lib/include/libdvbv5/sdt.h
@@ -44,7 +44,7 @@ struct dvb_table_sdt_service {
 			uint16_t free_CA_mode:1;
 			uint16_t running_status:3;
 		} __attribute__((packed));
-	};
+	} __attribute__((packed));
 	struct dvb_desc *descriptor;
 	struct dvb_table_sdt_service *next;
 } __attribute__((packed));
diff --git a/lib/include/libdvbv5/vct.h b/lib/include/libdvbv5/vct.h
index 6935f30..0dc64fd 100644
--- a/lib/include/libdvbv5/vct.h
+++ b/lib/include/libdvbv5/vct.h
@@ -104,8 +104,8 @@ union atsc_table_vct_descriptor_length {
 	struct {
 		uint16_t descriptor_length:10;
 		uint16_t reserved:6;
-	};
-};
+	} __attribute__((packed));
+} __attribute__((packed));
 
 #define atsc_vct_channel_foreach(_channel, _vct) \
 	for (struct atsc_table_vct_channel *_channel = _vct->channel; _channel; _channel = _channel->next) \
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 03/11] libdvbv5: add parser for CAT
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
  2014-01-04 17:07 ` [PATCH 02/11] libdvbv5: add attribute packed to structs and unions André Roth
@ 2014-01-04 17:07 ` André Roth
  2014-01-04 17:07 ` [PATCH 04/11] libdvbv5: add parser for ca and ca_identifier descriptors André Roth
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:07 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/include/libdvbv5/cat.h     |   51 +++++++++++++++++++++++++++++++
 lib/libdvbv5/Makefile.am       |    2 ++
 lib/libdvbv5/descriptors.c     |    2 ++
 lib/libdvbv5/descriptors/cat.c |   66 ++++++++++++++++++++++++++++++++++++++++
 4 files changed, 121 insertions(+)
 create mode 100644 lib/include/libdvbv5/cat.h
 create mode 100644 lib/libdvbv5/descriptors/cat.c

diff --git a/lib/include/libdvbv5/cat.h b/lib/include/libdvbv5/cat.h
new file mode 100644
index 0000000..4c442a8
--- /dev/null
+++ b/lib/include/libdvbv5/cat.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2013 - Andre Roth <neolynx@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation version 2
+ * of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ *
+ */
+
+#ifndef _CAT_H
+#define _CAT_H
+
+#include <stdint.h>
+#include <unistd.h> /* ssize_t */
+
+#include <libdvbv5/header.h>
+
+#define DVB_TABLE_CAT      0x01
+#define DVB_TABLE_CAT_PID  0x0001
+
+struct dvb_table_cat {
+	struct dvb_table_header header;
+	struct dvb_desc *descriptor;
+} __attribute__((packed));
+
+struct dvb_v5_fe_parms;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void dvb_table_cat_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
+void dvb_table_cat_free(struct dvb_table_cat *cat);
+void dvb_table_cat_print(struct dvb_v5_fe_parms *parms, struct dvb_table_cat *t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/libdvbv5/Makefile.am b/lib/libdvbv5/Makefile.am
index 8f89531..0abe42d 100644
--- a/lib/libdvbv5/Makefile.am
+++ b/lib/libdvbv5/Makefile.am
@@ -39,6 +39,7 @@ otherinclude_HEADERS = \
 	../include/libdvbv5/atsc_header.h \
 	../include/libdvbv5/mgt.h \
 	../include/libdvbv5/eit.h \
+	../include/libdvbv5/cat.h \
 	../include/libdvbv5/atsc_eit.h \
 	../include/libdvbv5/desc_service_location.h \
 	../include/libdvbv5/mpeg_ts.h \
@@ -74,6 +75,7 @@ libdvbv5_la_SOURCES = \
 	descriptors/vct.c		\
 	descriptors/mgt.c		\
 	descriptors/eit.c		\
+	descriptors/cat.c		\
 	descriptors/atsc_eit.c		\
 	descriptors/desc_language.c		\
 	descriptors/desc_network_name.c		\
diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c
index 626f81d..e888123 100644
--- a/lib/libdvbv5/descriptors.c
+++ b/lib/libdvbv5/descriptors.c
@@ -31,6 +31,7 @@
 #include <libdvbv5/dvb-log.h>
 
 #include <libdvbv5/pat.h>
+#include <libdvbv5/cat.h>
 #include <libdvbv5/pmt.h>
 #include <libdvbv5/nit.h>
 #include <libdvbv5/sdt.h>
@@ -78,6 +79,7 @@ void dvb_desc_default_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc
 
 const struct dvb_table_init dvb_table_initializers[] = {
 	[DVB_TABLE_PAT]          = { dvb_table_pat_init, sizeof(struct dvb_table_pat) },
+	[DVB_TABLE_CAT]          = { dvb_table_cat_init, sizeof(struct dvb_table_cat) },
 	[DVB_TABLE_PMT]          = { dvb_table_pmt_init, sizeof(struct dvb_table_pmt) },
 	[DVB_TABLE_NIT]          = { dvb_table_nit_init, sizeof(struct dvb_table_nit) },
 	[DVB_TABLE_SDT]          = { dvb_table_sdt_init, sizeof(struct dvb_table_sdt) },
diff --git a/lib/libdvbv5/descriptors/cat.c b/lib/libdvbv5/descriptors/cat.c
new file mode 100644
index 0000000..e6fc64e
--- /dev/null
+++ b/lib/libdvbv5/descriptors/cat.c
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2013 - Andre Roth <neolynx@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation version 2
+ * of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ *
+ */
+
+#include <libdvbv5/cat.h>
+#include <libdvbv5/descriptors.h>
+#include <libdvbv5/dvb-fe.h>
+
+void dvb_table_cat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
+			ssize_t buflen, uint8_t *table, ssize_t *table_length)
+{
+	struct dvb_table_cat *cat = (void *)table;
+	struct dvb_desc **head_desc = &cat->descriptor;
+	const uint8_t *p = buf, *endbuf = buf + buflen - 4;
+	size_t size;
+
+	if (*table_length > 0) {
+		/* find end of current lists */
+		while (*head_desc != NULL)
+			head_desc = &(*head_desc)->next;
+	}
+
+	size = offsetof(struct dvb_table_cat, descriptor);
+	if (p + size > endbuf) {
+		dvb_logerr("CAT table was truncated while filling dvb_table_cat. Need %zu bytes, but has only %zu.",
+			   size, buflen);
+		return;
+	}
+
+	memcpy(table, p, size);
+	p += size;
+	*table_length = sizeof(struct dvb_table_cat);
+
+	size = endbuf - p;
+	dvb_parse_descriptors(parms, p, size, head_desc);
+}
+
+void dvb_table_cat_free(struct dvb_table_cat *cat)
+{
+	dvb_free_descriptors((struct dvb_desc **) &cat->descriptor);
+	free(cat);
+}
+
+void dvb_table_cat_print(struct dvb_v5_fe_parms *parms, struct dvb_table_cat *cat)
+{
+	dvb_log("cat");
+	dvb_table_header_print(parms, &cat->header);
+	dvb_print_descriptors(parms, cat->descriptor);
+}
+
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 04/11] libdvbv5: add parser for ca and ca_identifier descriptors
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
  2014-01-04 17:07 ` [PATCH 02/11] libdvbv5: add attribute packed to structs and unions André Roth
  2014-01-04 17:07 ` [PATCH 03/11] libdvbv5: add parser for CAT André Roth
@ 2014-01-04 17:07 ` André Roth
  2014-01-04 17:07 ` [PATCH 05/11] libdvbv5: fix PMT parser André Roth
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:07 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/include/libdvbv5/desc_ca.h                |   63 ++++++++++++++++++++++++
 lib/include/libdvbv5/desc_ca_identifier.h     |   55 +++++++++++++++++++++
 lib/libdvbv5/Makefile.am                      |   10 ++--
 lib/libdvbv5/descriptors.c                    |   18 +++----
 lib/libdvbv5/descriptors/desc_ca.c            |   64 +++++++++++++++++++++++++
 lib/libdvbv5/descriptors/desc_ca_identifier.c |   58 ++++++++++++++++++++++
 6 files changed, 257 insertions(+), 11 deletions(-)
 create mode 100644 lib/include/libdvbv5/desc_ca.h
 create mode 100644 lib/include/libdvbv5/desc_ca_identifier.h
 create mode 100644 lib/libdvbv5/descriptors/desc_ca.c
 create mode 100644 lib/libdvbv5/descriptors/desc_ca_identifier.c

diff --git a/lib/include/libdvbv5/desc_ca.h b/lib/include/libdvbv5/desc_ca.h
new file mode 100644
index 0000000..12f4ff3
--- /dev/null
+++ b/lib/include/libdvbv5/desc_ca.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2013 - Andre Roth <neolynx@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation version 2
+ * of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ *
+ * Described at ETSI EN 300 468 V1.11.1 (2010-04)
+ */
+
+#ifndef _CA_H
+#define _CA_H
+
+#include <stdint.h>
+#include <unistd.h> /* ssize_t */
+
+struct dvb_desc_ca {
+	uint8_t type;
+	uint8_t length;
+	struct dvb_desc *next;
+
+	uint16_t ca_id;
+	union {
+		uint16_t bitfield1;
+		struct {
+			uint16_t ca_pid:13;
+			uint16_t reserved:3;
+		} __attribute__((packed));
+	} __attribute__((packed));
+
+	uint8_t *privdata;
+	uint8_t privdata_len;
+} __attribute__((packed));
+
+struct dvb_v5_fe_parms;
+
+#define dvb_desc_ca_field_first ca_id
+#define dvb_desc_ca_field_last  privdata
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void dvb_desc_ca_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+void dvb_desc_ca_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
+void dvb_desc_ca_free (struct dvb_desc *desc);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/include/libdvbv5/desc_ca_identifier.h b/lib/include/libdvbv5/desc_ca_identifier.h
new file mode 100644
index 0000000..18df191
--- /dev/null
+++ b/lib/include/libdvbv5/desc_ca_identifier.h
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2013 - Andre Roth <neolynx@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation version 2
+ * of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ *
+ * Described at ETSI EN 300 468 V1.11.1 (2010-04)
+ */
+
+#ifndef _CA_IDENTIFIER_H
+#define _CA_IDENTIFIER_H
+
+#include <stdint.h>
+#include <unistd.h> /* ssize_t */
+
+struct dvb_desc_ca_identifier {
+	uint8_t type;
+	uint8_t length;
+	struct dvb_desc *next;
+
+	uint8_t caid_count;
+	uint16_t *caids;
+
+} __attribute__((packed));
+
+struct dvb_v5_fe_parms;
+
+#define dvb_desc_ca_identifier_field_first ca_id
+#define dvb_desc_ca_identifier_field_last  privdata
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void dvb_desc_ca_identifier_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+void dvb_desc_ca_identifier_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
+void dvb_desc_ca_identifier_free (struct dvb_desc *desc);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/lib/libdvbv5/Makefile.am b/lib/libdvbv5/Makefile.am
index 0abe42d..667a1af 100644
--- a/lib/libdvbv5/Makefile.am
+++ b/lib/libdvbv5/Makefile.am
@@ -33,6 +33,9 @@ otherinclude_HEADERS = \
 	../include/libdvbv5/desc_logical_channel.h \
 	../include/libdvbv5/desc_ts_info.h \
 	../include/libdvbv5/desc_partial_reception.h \
+	../include/libdvbv5/desc_service_location.h \
+	../include/libdvbv5/desc_ca.h \
+	../include/libdvbv5/desc_ca_identifier.h \
 	../include/libdvbv5/nit.h \
 	../include/libdvbv5/sdt.h \
 	../include/libdvbv5/vct.h \
@@ -41,7 +44,6 @@ otherinclude_HEADERS = \
 	../include/libdvbv5/eit.h \
 	../include/libdvbv5/cat.h \
 	../include/libdvbv5/atsc_eit.h \
-	../include/libdvbv5/desc_service_location.h \
 	../include/libdvbv5/mpeg_ts.h \
 	../include/libdvbv5/mpeg_pes.h \
 	../include/libdvbv5/mpeg_es.h
@@ -96,8 +98,10 @@ libdvbv5_la_SOURCES = \
 	descriptors/desc_ts_info.c		\
 	descriptors/desc_partial_reception.c	\
 	descriptors/desc_service_location.c	\
-	descriptors/mpeg_ts.c		\
-	descriptors/mpeg_pes.c		\
+	descriptors/desc_ca.c			\
+	descriptors/desc_ca_identifier.c	\
+	descriptors/mpeg_ts.c			\
+	descriptors/mpeg_pes.c			\
 	descriptors/mpeg_es.c
 
 libdvbv5_la_CPPFLAGS = -I../.. $(ENFORCE_LIBDVBV5_STATIC)
diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c
index e888123..93239e6 100644
--- a/lib/libdvbv5/descriptors.c
+++ b/lib/libdvbv5/descriptors.c
@@ -55,6 +55,8 @@
 #include <libdvbv5/desc_ts_info.h>
 #include <libdvbv5/desc_logical_channel.h>
 #include <libdvbv5/desc_partial_reception.h>
+#include <libdvbv5/desc_ca.h>
+#include <libdvbv5/desc_ca_identifier.h>
 #include <libdvbv5/desc_extension.h>
 
 static void dvb_desc_init(uint8_t type, uint8_t length, struct dvb_desc *desc)
@@ -243,10 +245,10 @@ const struct dvb_descriptor dvb_descriptors[] = {
 	},
 	[conditional_access_descriptor] = {
 		.name  = "conditional_access_descriptor",
-		.init  = NULL,
-		.print = NULL,
-		.free  = NULL,
-		.size  = 0,
+		.init  = dvb_desc_ca_init,
+		.print = dvb_desc_ca_print,
+		.free  = dvb_desc_ca_free,
+		.size  = sizeof(struct dvb_desc_ca),
 	},
 	[iso639_language_descriptor] = {
 		.name  = "iso639_language_descriptor",
@@ -572,10 +574,10 @@ const struct dvb_descriptor dvb_descriptors[] = {
 	},
 	[CA_identifier_descriptor] = {
 		.name  = "CA_identifier_descriptor",
-		.init  = NULL,
-		.print = NULL,
-		.free  = NULL,
-		.size  = 0,
+		.init  = dvb_desc_ca_identifier_init,
+		.print = dvb_desc_ca_identifier_print,
+		.free  = dvb_desc_ca_identifier_free,
+		.size  = sizeof(struct dvb_desc_ca_identifier),
 	},
 	[content_descriptor] = {
 		.name  = "content_descriptor",
diff --git a/lib/libdvbv5/descriptors/desc_ca.c b/lib/libdvbv5/descriptors/desc_ca.c
new file mode 100644
index 0000000..6b48175
--- /dev/null
+++ b/lib/libdvbv5/descriptors/desc_ca.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2013 - Andre Roth <neolynx@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation version 2
+ * of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ *
+ * Described at ETSI EN 300 468 V1.11.1 (2010-04)
+ */
+
+#include <libdvbv5/desc_ca.h>
+#include <libdvbv5/descriptors.h>
+#include <libdvbv5/dvb-fe.h>
+
+void dvb_desc_ca_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+{
+	size_t size = offsetof(struct dvb_desc_ca, dvb_desc_ca_field_last) - offsetof(struct dvb_desc_ca, dvb_desc_ca_field_first);
+	struct dvb_desc_ca *d = (struct dvb_desc_ca *) desc;
+
+	memcpy(((uint8_t *) d ) + sizeof(struct dvb_desc), buf, size);
+	bswap16(d->ca_id);
+	bswap16(d->bitfield1);
+
+	if (d->length > size) {
+		size = d->length - size;
+		d->privdata = malloc(size);
+		d->privdata_len = size;
+		memcpy(d->privdata, buf + 4, size);
+	} else {
+		d->privdata = NULL;
+		d->privdata_len = 0;
+	}
+	/*hexdump(parms, "desc ca ", buf, desc->length);*/
+	/*dvb_desc_ca_print(parms, desc);*/
+}
+
+void dvb_desc_ca_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
+{
+	const struct dvb_desc_ca *d = (const struct dvb_desc_ca *) desc;
+	dvb_log("|           ca_id             %04x", d->ca_id);
+	dvb_log("|           ca_pid            %04x", d->ca_pid);
+	dvb_log("|           privdata length   %d", d->privdata_len);
+	if (d->privdata)
+		hexdump(parms, "|           privdata          ", d->privdata, d->privdata_len);
+}
+
+void dvb_desc_ca_free(struct dvb_desc *desc)
+{
+	struct dvb_desc_ca *d = (struct dvb_desc_ca *) desc;
+	if (d->privdata)
+		free(d->privdata);
+}
+
diff --git a/lib/libdvbv5/descriptors/desc_ca_identifier.c b/lib/libdvbv5/descriptors/desc_ca_identifier.c
new file mode 100644
index 0000000..4740a01
--- /dev/null
+++ b/lib/libdvbv5/descriptors/desc_ca_identifier.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2013 - Andre Roth <neolynx@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation version 2
+ * of the License.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Or, point your browser to http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ *
+ * Described at ETSI EN 300 468 V1.11.1 (2010-04)
+ */
+
+#include <libdvbv5/desc_ca_identifier.h>
+#include <libdvbv5/descriptors.h>
+#include <libdvbv5/dvb-fe.h>
+
+void dvb_desc_ca_identifier_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+{
+	struct dvb_desc_ca_identifier *d = (struct dvb_desc_ca_identifier *) desc;
+	int i;
+
+	d->caid_count = d->length >> 1; /* FIXME: warn if odd */
+	d->caids = malloc(d->length);
+	if (!d->caids) {
+		dvb_logerr("dvb_desc_ca_identifier_init: out of memory");
+		return;
+	}
+	for (i = 0; i < d->caid_count; i++) {
+		d->caids[i] = ((uint16_t *) buf)[i];
+		bswap16(d->caids[i]);
+	}
+}
+
+void dvb_desc_ca_identifier_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
+{
+	const struct dvb_desc_ca_identifier *d = (const struct dvb_desc_ca_identifier *) desc;
+	int i;
+
+	for (i = 0; i < d->caid_count; i++)
+		dvb_log("|           caid %d            %04x", i, d->caids[i]);
+}
+
+void dvb_desc_ca_identifier_free(struct dvb_desc *desc)
+{
+	struct dvb_desc_ca_identifier *d = (struct dvb_desc_ca_identifier *) desc;
+	if (d->caids)
+		free(d->caids);
+}
+
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 05/11] libdvbv5: fix PMT parser
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
                   ` (2 preceding siblings ...)
  2014-01-04 17:07 ` [PATCH 04/11] libdvbv5: add parser for ca and ca_identifier descriptors André Roth
@ 2014-01-04 17:07 ` André Roth
  2014-01-04 17:07 ` [PATCH 06/11] libdvbv5: cleanup printing tables and descriptors André Roth
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:07 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/include/libdvbv5/pmt.h     |    6 +++++-
 lib/libdvbv5/descriptors/pmt.c |   22 +++++++++++++++-------
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/lib/include/libdvbv5/pmt.h b/lib/include/libdvbv5/pmt.h
index f1b7cef..a2183ac 100644
--- a/lib/include/libdvbv5/pmt.h
+++ b/lib/include/libdvbv5/pmt.h
@@ -96,9 +96,13 @@ struct dvb_table_pmt {
 			uint16_t reserved3:4;
 		} __attribute__((packed));
 	} __attribute__((packed));
+	struct dvb_desc *descriptor;
 	struct dvb_table_pmt_stream *stream;
 } __attribute__((packed));
 
+#define dvb_pmt_field_first header
+#define dvb_pmt_field_last descriptor
+
 #define dvb_pmt_stream_foreach(_stream, _pmt) \
   for (struct dvb_table_pmt_stream *_stream = _pmt->stream; _stream; _stream = _stream->next) \
 
@@ -108,7 +112,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_table_pmt_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
+void dvb_table_pmt_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, struct dvb_table_pmt *pmt, ssize_t *table_length);
 void dvb_table_pmt_free(struct dvb_table_pmt *pmt);
 void dvb_table_pmt_print(struct dvb_v5_fe_parms *parms, const struct dvb_table_pmt *pmt);
 
diff --git a/lib/libdvbv5/descriptors/pmt.c b/lib/libdvbv5/descriptors/pmt.c
index 3915414..5d42eb7 100644
--- a/lib/libdvbv5/descriptors/pmt.c
+++ b/lib/libdvbv5/descriptors/pmt.c
@@ -26,10 +26,9 @@
 #include <string.h> /* memcpy */
 
 void dvb_table_pmt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
-			ssize_t buflen, uint8_t *table, ssize_t *table_length)
+			ssize_t buflen, struct dvb_table_pmt *pmt, ssize_t *table_length)
 {
 	const uint8_t *p = buf, *endbuf = buf + buflen - 4;
-	struct dvb_table_pmt *pmt = (void *)table;
 	struct dvb_table_pmt_stream **head = &pmt->stream;
 	size_t size;
 
@@ -38,13 +37,13 @@ void dvb_table_pmt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 		while (*head != NULL)
 			head = &(*head)->next;
 	} else {
-		size = offsetof(struct dvb_table_pmt, stream);
+		size = offsetof(struct dvb_table_pmt, dvb_pmt_field_last);
 		if (p + size > endbuf) {
 			dvb_logerr("PMT table was truncated. Need %zu bytes, but has only %zu.",
 				size, buflen);
 			return;
 		}
-		memcpy(table, p, size);
+		memcpy(pmt, p, size);
 		p += size;
 		*table_length = sizeof(struct dvb_table_pmt);
 
@@ -52,7 +51,8 @@ void dvb_table_pmt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 		bswap16(pmt->bitfield2);
 		pmt->stream = NULL;
 
-		/* skip prog section */
+		dvb_parse_descriptors(parms, p, pmt->prog_length,
+				      &pmt->descriptor);
 		p += pmt->prog_length;
 	}
 
@@ -74,15 +74,22 @@ void dvb_table_pmt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 		*head = stream;
 		head = &(*head)->next;
 
+		if (stream->section_length > endbuf - p) {
+			dvb_logerr("PMT stream section length > buffer: %zd", stream->section_length - (endbuf - p));
+			stream->section_length = endbuf - p;
+		}
 		/* get the descriptors for each program */
 		dvb_parse_descriptors(parms, p, stream->section_length,
 				      &stream->descriptor);
 
 		p += stream->section_length;
 	}
-	if (endbuf - p)
-		dvb_logerr("PAT table has %zu spurious bytes at the end.",
+	if (p < endbuf)
+		dvb_logerr("PMT table has %zu spurious bytes at the end.",
 			   endbuf - p);
+	if (p > endbuf)
+		dvb_logerr("PMT oops  %zu ",
+			   p - endbuf);
 }
 
 void dvb_table_pmt_free(struct dvb_table_pmt *pmt)
@@ -94,6 +101,7 @@ void dvb_table_pmt_free(struct dvb_table_pmt *pmt)
 		stream = stream->next;
 		free(tmp);
 	}
+	dvb_free_descriptors((struct dvb_desc **) &pmt->descriptor);
 	free(pmt);
 }
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 06/11] libdvbv5: cleanup printing tables and descriptors
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
                   ` (3 preceding siblings ...)
  2014-01-04 17:07 ` [PATCH 05/11] libdvbv5: fix PMT parser André Roth
@ 2014-01-04 17:07 ` André Roth
  2014-01-04 17:07 ` [PATCH 07/11] libdvbv5: use DVB_DESC_HEADER macro in all descriptors André Roth
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:07 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

- log hex values where appropriate
- cleanup indents

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/libdvbv5/descriptors.c                            |    4 ++--
 lib/libdvbv5/descriptors/cat.c                        |    2 +-
 lib/libdvbv5/descriptors/desc_atsc_service_location.c |    1 -
 lib/libdvbv5/descriptors/desc_ca.c                    |    4 ++--
 lib/libdvbv5/descriptors/desc_ca_identifier.c         |    2 +-
 lib/libdvbv5/descriptors/desc_cable_delivery.c        |    1 -
 lib/libdvbv5/descriptors/desc_event_extended.c        |    2 +-
 lib/libdvbv5/descriptors/desc_event_short.c           |    6 +++---
 lib/libdvbv5/descriptors/desc_extension.c             |    2 +-
 lib/libdvbv5/descriptors/desc_frequency_list.c        |    4 ++--
 lib/libdvbv5/descriptors/desc_hierarchy.c             |    1 -
 lib/libdvbv5/descriptors/desc_isdbt_delivery.c        |    1 -
 lib/libdvbv5/descriptors/desc_language.c              |    2 +-
 lib/libdvbv5/descriptors/desc_service.c               |    7 +++----
 lib/libdvbv5/descriptors/desc_t2_delivery.c           |    1 -
 lib/libdvbv5/descriptors/desc_terrestrial_delivery.c  |    1 -
 lib/libdvbv5/descriptors/desc_ts_info.c               |    1 -
 lib/libdvbv5/descriptors/mpeg_pes.c                   |   10 +++++-----
 lib/libdvbv5/descriptors/mpeg_ts.c                    |    6 +++---
 lib/libdvbv5/descriptors/nit.c                        |    2 +-
 lib/libdvbv5/descriptors/pat.c                        |    4 ++--
 lib/libdvbv5/descriptors/pmt.c                        |    7 ++++---
 lib/libdvbv5/descriptors/sdt.c                        |    6 +++---
 23 files changed, 35 insertions(+), 42 deletions(-)

diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c
index 93239e6..4bf9d59 100644
--- a/lib/libdvbv5/descriptors.c
+++ b/lib/libdvbv5/descriptors.c
@@ -75,8 +75,7 @@ void dvb_desc_default_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc
 {
 	if (!parms)
 		parms = dvb_fe_dummy();
-	dvb_log("|                   %s (%#02x)", dvb_descriptors[desc->type].name, desc->type);
-	hexdump(parms, "|                       ", desc->data, desc->length);
+	hexdump(parms, "|           ", desc->data, desc->length);
 }
 
 const struct dvb_table_init dvb_table_initializers[] = {
@@ -168,6 +167,7 @@ void dvb_print_descriptors(struct dvb_v5_fe_parms *parms, struct dvb_desc *desc)
 		dvb_desc_print_func print = dvb_descriptors[desc->type].print;
 		if (!print)
 			print = dvb_desc_default_print;
+		dvb_log("|        0x%02x: %s", desc->type, dvb_descriptors[desc->type].name);
 		print(parms, desc);
 		desc = desc->next;
 	}
diff --git a/lib/libdvbv5/descriptors/cat.c b/lib/libdvbv5/descriptors/cat.c
index e6fc64e..82da031 100644
--- a/lib/libdvbv5/descriptors/cat.c
+++ b/lib/libdvbv5/descriptors/cat.c
@@ -59,7 +59,7 @@ void dvb_table_cat_free(struct dvb_table_cat *cat)
 
 void dvb_table_cat_print(struct dvb_v5_fe_parms *parms, struct dvb_table_cat *cat)
 {
-	dvb_log("cat");
+	dvb_log("CAT");
 	dvb_table_header_print(parms, &cat->header);
 	dvb_print_descriptors(parms, cat->descriptor);
 }
diff --git a/lib/libdvbv5/descriptors/desc_atsc_service_location.c b/lib/libdvbv5/descriptors/desc_atsc_service_location.c
index 5e3f461..6da43b6 100644
--- a/lib/libdvbv5/descriptors/desc_atsc_service_location.c
+++ b/lib/libdvbv5/descriptors/desc_atsc_service_location.c
@@ -64,7 +64,6 @@ void atsc_desc_service_location_print(struct dvb_v5_fe_parms *parms, const struc
 	struct atsc_desc_service_location_elementary *el = s_loc->elementary;
 	int i;
 
-	dvb_log("|       service location");
 	dvb_log("|           pcr PID               %d", s_loc->pcr_pid);
 	dvb_log("|\\ elementary service - %d elementaries", s_loc->number_elements);
 	for (i = 0; i < s_loc->number_elements; i++) {
diff --git a/lib/libdvbv5/descriptors/desc_ca.c b/lib/libdvbv5/descriptors/desc_ca.c
index 6b48175..40edfde 100644
--- a/lib/libdvbv5/descriptors/desc_ca.c
+++ b/lib/libdvbv5/descriptors/desc_ca.c
@@ -48,8 +48,8 @@ void dvb_desc_ca_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct
 void dvb_desc_ca_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
 {
 	const struct dvb_desc_ca *d = (const struct dvb_desc_ca *) desc;
-	dvb_log("|           ca_id             %04x", d->ca_id);
-	dvb_log("|           ca_pid            %04x", d->ca_pid);
+	dvb_log("|           ca_id             0x%04x", d->ca_id);
+	dvb_log("|           ca_pid            0x%04x", d->ca_pid);
 	dvb_log("|           privdata length   %d", d->privdata_len);
 	if (d->privdata)
 		hexdump(parms, "|           privdata          ", d->privdata, d->privdata_len);
diff --git a/lib/libdvbv5/descriptors/desc_ca_identifier.c b/lib/libdvbv5/descriptors/desc_ca_identifier.c
index 4740a01..95e0569 100644
--- a/lib/libdvbv5/descriptors/desc_ca_identifier.c
+++ b/lib/libdvbv5/descriptors/desc_ca_identifier.c
@@ -46,7 +46,7 @@ void dvb_desc_ca_identifier_print(struct dvb_v5_fe_parms *parms, const struct dv
 	int i;
 
 	for (i = 0; i < d->caid_count; i++)
-		dvb_log("|           caid %d            %04x", i, d->caids[i]);
+		dvb_log("|           caid %d            0x%04x", i, d->caids[i]);
 }
 
 void dvb_desc_ca_identifier_free(struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_cable_delivery.c b/lib/libdvbv5/descriptors/desc_cable_delivery.c
index 0aa7719..6a1c7bb 100644
--- a/lib/libdvbv5/descriptors/desc_cable_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_cable_delivery.c
@@ -41,7 +41,6 @@ void dvb_desc_cable_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *
 void dvb_desc_cable_delivery_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
 {
 	const struct dvb_desc_cable_delivery *cable = (const struct dvb_desc_cable_delivery *) desc;
-	dvb_log("|        cable delivery");
 	dvb_log("|           length            %d", cable->length);
 	dvb_log("|           frequency         %d", cable->frequency);
 	dvb_log("|           fec outer         %d", cable->fec_outer);
diff --git a/lib/libdvbv5/descriptors/desc_event_extended.c b/lib/libdvbv5/descriptors/desc_event_extended.c
index bb05951..0970484 100644
--- a/lib/libdvbv5/descriptors/desc_event_extended.c
+++ b/lib/libdvbv5/descriptors/desc_event_extended.c
@@ -74,6 +74,6 @@ void dvb_desc_event_extended_free(struct dvb_desc *desc)
 void dvb_desc_event_extended_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
 {
 	const struct dvb_desc_event_extended *event = (const struct dvb_desc_event_extended *) desc;
-	dvb_log("|   Description   '%s'", event->text);
+	dvb_log("|           '%s'", event->text);
 }
 
diff --git a/lib/libdvbv5/descriptors/desc_event_short.c b/lib/libdvbv5/descriptors/desc_event_short.c
index 1978beb..98809a5 100644
--- a/lib/libdvbv5/descriptors/desc_event_short.c
+++ b/lib/libdvbv5/descriptors/desc_event_short.c
@@ -67,8 +67,8 @@ void dvb_desc_event_short_free(struct dvb_desc *desc)
 void dvb_desc_event_short_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
 {
 	const struct dvb_desc_event_short *event = (const struct dvb_desc_event_short *) desc;
-	dvb_log("|   Name          '%s'", event->name);
-	dvb_log("|   Language      '%s'", event->language);
-	dvb_log("|   Description   '%s'", event->text);
+	dvb_log("|           name          '%s'", event->name);
+	dvb_log("|           language      '%s'", event->language);
+	dvb_log("|           sescription   '%s'", event->text);
 }
 
diff --git a/lib/libdvbv5/descriptors/desc_extension.c b/lib/libdvbv5/descriptors/desc_extension.c
index 400372f..0adf9c0 100644
--- a/lib/libdvbv5/descriptors/desc_extension.c
+++ b/lib/libdvbv5/descriptors/desc_extension.c
@@ -178,7 +178,7 @@ void extension_descriptor_print(struct dvb_v5_fe_parms *parms,
 {
 	struct dvb_extension_descriptor *ext = (void *)desc;
 	uint8_t type = ext->extension_code;
-	dvb_log("Extension descriptor %s type 0x%02x",
+	dvb_log("|           descriptor %s type 0x%02x",
 		dvb_ext_descriptors[type].name, type);
 
 	if (dvb_ext_descriptors[type].print)
diff --git a/lib/libdvbv5/descriptors/desc_frequency_list.c b/lib/libdvbv5/descriptors/desc_frequency_list.c
index 447e412..28ba068 100644
--- a/lib/libdvbv5/descriptors/desc_frequency_list.c
+++ b/lib/libdvbv5/descriptors/desc_frequency_list.c
@@ -59,11 +59,11 @@ void dvb_desc_frequency_list_init(struct dvb_v5_fe_parms *parms, const uint8_t *
 void dvb_desc_frequency_list_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
 {
 	const struct dvb_desc_frequency_list *d = (const struct dvb_desc_frequency_list *) desc;
-	dvb_log("|       frequency list type: %d", d->freq_type);
+	dvb_log("|           type: %d", d->freq_type);
 	int i = 0;
 
 	for (i = 0; i < d->frequencies; i++) {
-		dvb_log("|       frequency : %d", d->frequency[i]);
+		dvb_log("|           frequency : %d", d->frequency[i]);
 	}
 }
 
diff --git a/lib/libdvbv5/descriptors/desc_hierarchy.c b/lib/libdvbv5/descriptors/desc_hierarchy.c
index a591ed8..346a9c0 100644
--- a/lib/libdvbv5/descriptors/desc_hierarchy.c
+++ b/lib/libdvbv5/descriptors/desc_hierarchy.c
@@ -35,7 +35,6 @@ void dvb_desc_hierarchy_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 void dvb_desc_hierarchy_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
 {
 	const struct dvb_desc_hierarchy *hierarchy = (const struct dvb_desc_hierarchy *) desc;
-	dvb_log("|	Hierarchy");
 	dvb_log("|           type           %d", hierarchy->hierarchy_type);
 	dvb_log("|           layer          %d", hierarchy->layer);
 	dvb_log("|           embedded_layer %d", hierarchy->embedded_layer);
diff --git a/lib/libdvbv5/descriptors/desc_isdbt_delivery.c b/lib/libdvbv5/descriptors/desc_isdbt_delivery.c
index df04580..bd22456 100644
--- a/lib/libdvbv5/descriptors/desc_isdbt_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_isdbt_delivery.c
@@ -83,7 +83,6 @@ void isdbt_desc_delivery_print(struct dvb_v5_fe_parms *parms, const struct dvb_d
 	const struct isdbt_desc_terrestrial_delivery_system *d = (const void *) desc;
 	int i;
 
-	dvb_log("|        ISDB-T delivery");
 	dvb_log("|           transmission mode %s (%d)",
 		tm_name[d->transmission_mode], d->transmission_mode);
 	dvb_log("|           guard interval    %s (%d)",
diff --git a/lib/libdvbv5/descriptors/desc_language.c b/lib/libdvbv5/descriptors/desc_language.c
index 0b47371..264be55 100644
--- a/lib/libdvbv5/descriptors/desc_language.c
+++ b/lib/libdvbv5/descriptors/desc_language.c
@@ -37,6 +37,6 @@ void dvb_desc_language_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, s
 void dvb_desc_language_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
 {
 	const struct dvb_desc_language *lang = (const struct dvb_desc_language *) desc;
-	dvb_log("|                   lang: %s (type: %d)", lang->language, lang->audio_type);
+	dvb_log("|           lang: %s (type: %d)", lang->language, lang->audio_type);
 }
 
diff --git a/lib/libdvbv5/descriptors/desc_service.c b/lib/libdvbv5/descriptors/desc_service.c
index 2f1b6ef..1e38451 100644
--- a/lib/libdvbv5/descriptors/desc_service.c
+++ b/lib/libdvbv5/descriptors/desc_service.c
@@ -30,7 +30,6 @@ void dvb_desc_service_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, st
 	uint8_t len;        /* the length of the string in the input data */
 	uint8_t len1, len2; /* the lenght of the output strings */
 
-        /*hexdump(parms, "service desc: ", buf - 2, desc->length + 2);*/
 	service->service_type = buf[0];
 	buf++;
 
@@ -63,8 +62,8 @@ void dvb_desc_service_free(struct dvb_desc *desc)
 void dvb_desc_service_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
 {
 	const struct dvb_desc_service *service = (const struct dvb_desc_service *) desc;
-	dvb_log("|   service type     %d", service->service_type);
-	dvb_log("|           name     '%s'", service->name);
-	dvb_log("|           provider '%s'", service->provider);
+	dvb_log("|           service type  %d", service->service_type);
+	dvb_log("|           name          '%s'", service->name);
+	dvb_log("|           provider      '%s'", service->provider);
 }
 
diff --git a/lib/libdvbv5/descriptors/desc_t2_delivery.c b/lib/libdvbv5/descriptors/desc_t2_delivery.c
index a563164..31c6974 100644
--- a/lib/libdvbv5/descriptors/desc_t2_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_t2_delivery.c
@@ -98,7 +98,6 @@ void dvb_desc_t2_delivery_print(struct dvb_v5_fe_parms *parms,
 	const struct dvb_desc_t2_delivery *d = desc;
 	int i;
 
-	dvb_log("|       DVB-T2 delivery");
 	dvb_log("|           plp_id                    %d", d->plp_id);
 	dvb_log("|           system_id                 %d", d->system_id);
 
diff --git a/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c b/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c
index 745813f..889ded3 100644
--- a/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c
@@ -39,7 +39,6 @@ void dvb_desc_terrestrial_delivery_init(struct dvb_v5_fe_parms *parms, const uin
 void dvb_desc_terrestrial_delivery_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
 {
 	const struct dvb_desc_terrestrial_delivery *tdel = (const struct dvb_desc_terrestrial_delivery *) desc;
-	dvb_log("|       terrestrial delivery");
 	dvb_log("|           length                %d", tdel->length);
 	dvb_log("|           centre frequency      %d", tdel->centre_frequency * 10);
 	dvb_log("|           mpe_fec_indicator     %d", tdel->mpe_fec_indicator);
diff --git a/lib/libdvbv5/descriptors/desc_ts_info.c b/lib/libdvbv5/descriptors/desc_ts_info.c
index 02fcb82..233d331 100644
--- a/lib/libdvbv5/descriptors/desc_ts_info.c
+++ b/lib/libdvbv5/descriptors/desc_ts_info.c
@@ -69,7 +69,6 @@ void dvb_desc_ts_info_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc
 
 	t = &d->transmission_type;
 
-	dvb_log("|        TS Information");
 	dvb_log("|           remote key ID     %d", d->remote_control_key_id);
 	dvb_log("|           name              %s", d->ts_name);
 	dvb_log("|           emphasis name     %s", d->ts_name_emph);
diff --git a/lib/libdvbv5/descriptors/mpeg_pes.c b/lib/libdvbv5/descriptors/mpeg_pes.c
index ab1cadf..65f5cf1 100644
--- a/lib/libdvbv5/descriptors/mpeg_pes.c
+++ b/lib/libdvbv5/descriptors/mpeg_pes.c
@@ -34,7 +34,7 @@ void dvb_mpeg_pes_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_
 	bswap16(pes->length);
 
 	if (pes->sync != 0x000001) {
-		dvb_logerr("mpeg pes invalid");
+		dvb_logerr("mpeg pes invalid, sync 0x%06x should be 0x000001", pes->sync);
 		return;
 	}
 
@@ -47,7 +47,7 @@ void dvb_mpeg_pes_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_
 		   pes->stream_id == DVB_MPEG_STREAM_DIRECTORY ||
 		   pes->stream_id == DVB_MPEG_STREAM_DSMCC ||
 		   pes->stream_id == DVB_MPEG_STREAM_H222E ) {
-		dvb_logerr("mpeg pes: unsupported stream type %#04x", pes->stream_id);
+		dvb_logerr("mpeg pes: unsupported stream type 0x%04x", pes->stream_id);
 	} else {
 		memcpy(pes->optional, p, sizeof(struct dvb_mpeg_pes_optional) -
 					 sizeof(pes->optional->pts) -
@@ -94,8 +94,8 @@ void dvb_mpeg_pes_free(struct dvb_mpeg_pes *ts)
 void dvb_mpeg_pes_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_pes *pes)
 {
 	dvb_log("MPEG PES");
-	dvb_log(" - sync      %#08x", pes->sync);
-	dvb_log(" - stream_id %#04x", pes->stream_id);
+	dvb_log(" - sync      0x%08x", pes->sync);
+	dvb_log(" - stream_id 0x%04x", pes->stream_id);
 	dvb_log(" - length    %d", pes->length);
 	if (pes->stream_id == DVB_MPEG_STREAM_PADDING) {
 	} else if (pes->stream_id == DVB_MPEG_STREAM_MAP ||
@@ -105,7 +105,7 @@ void dvb_mpeg_pes_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_pes *pes)
 		   pes->stream_id == DVB_MPEG_STREAM_DIRECTORY ||
 		   pes->stream_id == DVB_MPEG_STREAM_DSMCC ||
 		   pes->stream_id == DVB_MPEG_STREAM_H222E ) {
-		dvb_log("  mpeg pes unsupported stream type %#04x", pes->stream_id);
+		dvb_log("  mpeg pes unsupported stream type 0x%04x", pes->stream_id);
 	} else {
 		dvb_log("  mpeg pes optional");
 		dvb_log("   - two                      %d", pes->optional->two);
diff --git a/lib/libdvbv5/descriptors/mpeg_ts.c b/lib/libdvbv5/descriptors/mpeg_ts.c
index 83e983a..c2154af 100644
--- a/lib/libdvbv5/descriptors/mpeg_ts.c
+++ b/lib/libdvbv5/descriptors/mpeg_ts.c
@@ -25,7 +25,7 @@
 ssize_t dvb_mpeg_ts_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length)
 {
 	if (buf[0] != DVB_MPEG_TS) {
-		dvb_logerr("mpeg ts invalid marker %#02x, sould be %#02x", buf[0], DVB_MPEG_TS);
+		dvb_logerr("mpeg ts invalid marker 0x%02x, sould be 0x%02x", buf[0], DVB_MPEG_TS);
 		*table_length = 0;
 		return 0;
 	}
@@ -58,11 +58,11 @@ void dvb_mpeg_ts_free(struct dvb_mpeg_ts *ts)
 void dvb_mpeg_ts_print(struct dvb_v5_fe_parms *parms, struct dvb_mpeg_ts *ts)
 {
 	dvb_log("MPEG TS");
-	dvb_log(" - sync byte          %#02x", ts->sync_byte);
+	dvb_log(" - sync byte        0x%02x", ts->sync_byte);
 	dvb_log(" - tei                %d", ts->tei);
 	dvb_log(" - payload_start      %d", ts->payload_start);
 	dvb_log(" - priority           %d", ts->priority);
-	dvb_log(" - pid                %d", ts->pid);
+	dvb_log(" - pid              0x%04x", ts->pid);
 	dvb_log(" - scrambling         %d", ts->scrambling);
 	dvb_log(" - adaptation_field   %d", ts->adaptation_field);
 	dvb_log(" - continuity_counter %d", ts->continuity_counter);
diff --git a/lib/libdvbv5/descriptors/nit.c b/lib/libdvbv5/descriptors/nit.c
index ca565dd..b351a6b 100644
--- a/lib/libdvbv5/descriptors/nit.c
+++ b/lib/libdvbv5/descriptors/nit.c
@@ -143,7 +143,7 @@ void dvb_table_nit_print(struct dvb_v5_fe_parms *parms, struct dvb_table_nit *ni
 	const struct dvb_table_nit_transport *transport = nit->transport;
 	uint16_t transports = 0;
 	while(transport) {
-		dvb_log("|- Transport: %-7d Network: %-7d", transport->transport_id, transport->network_id);
+		dvb_log("|- transport %04x network %04x", transport->transport_id, transport->network_id);
 		dvb_print_descriptors(parms, transport->descriptor);
 		transport = transport->next;
 		transports++;
diff --git a/lib/libdvbv5/descriptors/pat.c b/lib/libdvbv5/descriptors/pat.c
index 67d267b..1d1c124 100644
--- a/lib/libdvbv5/descriptors/pat.c
+++ b/lib/libdvbv5/descriptors/pat.c
@@ -94,10 +94,10 @@ void dvb_table_pat_print(struct dvb_v5_fe_parms *parms, struct dvb_table_pat *pa
 
 	dvb_log("PAT");
 	dvb_table_header_print(parms, &pat->header);
-	dvb_log("|\\  program  service (%d programs)", pat->programs);
+	dvb_log("|\\ %d program%s", pat->programs, pat->programs != 1 ? "s" : "");
 
 	while (pgm) {
-		dvb_log("|- %7d %7d", pgm->pid, pgm->service_id);
+		dvb_log("|- program 0x%04x  ->  service 0x%04x", pgm->pid, pgm->service_id);
 		pgm = pgm->next;
 	}
 }
diff --git a/lib/libdvbv5/descriptors/pmt.c b/lib/libdvbv5/descriptors/pmt.c
index 5d42eb7..954a51f 100644
--- a/lib/libdvbv5/descriptors/pmt.c
+++ b/lib/libdvbv5/descriptors/pmt.c
@@ -109,16 +109,17 @@ void dvb_table_pmt_print(struct dvb_v5_fe_parms *parms, const struct dvb_table_p
 {
 	dvb_log("PMT");
 	dvb_table_header_print(parms, &pmt->header);
-	dvb_log("|- pcr_pid       %d", pmt->pcr_pid);
+	dvb_log("|- pcr_pid       %04x", pmt->pcr_pid);
 	dvb_log("|  reserved2     %d", pmt->reserved2);
 	dvb_log("|  prog length   %d", pmt->prog_length);
 	dvb_log("|  zero3         %d", pmt->zero3);
 	dvb_log("|  reserved3     %d", pmt->reserved3);
-	dvb_log("|\\  pid     type");
+	dvb_print_descriptors(parms, pmt->descriptor);
+	dvb_log("|\\");
 	const struct dvb_table_pmt_stream *stream = pmt->stream;
 	uint16_t streams = 0;
 	while(stream) {
-		dvb_log("|- %5d   %s (%d)", stream->elementary_pid,
+		dvb_log("|- stream 0x%04x: %s (%x)", stream->elementary_pid,
 				pmt_stream_name[stream->type], stream->type);
 		dvb_print_descriptors(parms, stream->descriptor);
 		stream = stream->next;
diff --git a/lib/libdvbv5/descriptors/sdt.c b/lib/libdvbv5/descriptors/sdt.c
index c15512f..861a352 100644
--- a/lib/libdvbv5/descriptors/sdt.c
+++ b/lib/libdvbv5/descriptors/sdt.c
@@ -73,7 +73,7 @@ void dvb_table_sdt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 		p += service->section_length;
 	}
 	if (endbuf - p)
-		dvb_logerr("PAT table has %zu spurious bytes at the end.",
+		dvb_logerr("SDT table has %zu spurious bytes at the end.",
 			   endbuf - p);
 }
 
@@ -94,11 +94,11 @@ void dvb_table_sdt_print(struct dvb_v5_fe_parms *parms, struct dvb_table_sdt *sd
 	dvb_log("SDT");
 	dvb_table_header_print(parms, &sdt->header);
 	dvb_log("|- network_id         %d", sdt->network_id);
-	dvb_log("|\\  service_id");
+	dvb_log("|\\");
 	const struct dvb_table_sdt_service *service = sdt->service;
 	uint16_t services = 0;
 	while(service) {
-		dvb_log("|- %7d", service->service_id);
+		dvb_log("|- service 0x%04x", service->service_id);
 		dvb_log("|   EIT schedule          %d", service->EIT_schedule);
 		dvb_log("|   EIT present following %d", service->EIT_present_following);
 		dvb_log("|   free CA mode          %d", service->free_CA_mode);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 07/11] libdvbv5: use DVB_DESC_HEADER macro in all descriptors
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
                   ` (4 preceding siblings ...)
  2014-01-04 17:07 ` [PATCH 06/11] libdvbv5: cleanup printing tables and descriptors André Roth
@ 2014-01-04 17:07 ` André Roth
  2014-01-04 17:07 ` [PATCH 08/11] libdvbv5: make dvb_desc_default_init and dvb_desc_default_print private André Roth
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:07 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/include/libdvbv5/desc_atsc_service_location.h |    7 ++-----
 lib/include/libdvbv5/desc_ca.h                    |    7 ++-----
 lib/include/libdvbv5/desc_ca_identifier.h         |    7 ++-----
 lib/include/libdvbv5/desc_cable_delivery.h        |    7 ++-----
 lib/include/libdvbv5/desc_event_extended.h        |    7 ++-----
 lib/include/libdvbv5/desc_event_short.h           |    7 ++-----
 lib/include/libdvbv5/desc_extension.h             |    7 ++-----
 lib/include/libdvbv5/desc_frequency_list.h        |    7 ++-----
 lib/include/libdvbv5/desc_hierarchy.h             |    6 ++----
 lib/include/libdvbv5/desc_isdbt_delivery.h        |    8 +++-----
 lib/include/libdvbv5/desc_language.h              |    7 ++-----
 lib/include/libdvbv5/desc_logical_channel.h       |    7 ++-----
 lib/include/libdvbv5/desc_network_name.h          |    7 ++-----
 lib/include/libdvbv5/desc_partial_reception.h     |    7 ++-----
 lib/include/libdvbv5/desc_sat.h                   |    7 ++-----
 lib/include/libdvbv5/desc_service.h               |    7 ++-----
 lib/include/libdvbv5/desc_service_list.h          |    7 ++-----
 lib/include/libdvbv5/desc_service_location.h      |    7 ++-----
 lib/include/libdvbv5/desc_t2_delivery.h           |    5 +++--
 lib/include/libdvbv5/desc_terrestrial_delivery.h  |    7 ++-----
 lib/include/libdvbv5/desc_ts_info.h               |    7 ++-----
 lib/include/libdvbv5/descriptors.h                |    9 ++++++---
 22 files changed, 50 insertions(+), 104 deletions(-)

diff --git a/lib/include/libdvbv5/desc_atsc_service_location.h b/lib/include/libdvbv5/desc_atsc_service_location.h
index 1ff2341..ebe11b7 100644
--- a/lib/include/libdvbv5/desc_atsc_service_location.h
+++ b/lib/include/libdvbv5/desc_atsc_service_location.h
@@ -21,8 +21,7 @@
 #ifndef _ATSC_SERVICE_LOCATION_H
 #define _ATSC_SERVICE_LOCATION_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct atsc_desc_service_location_elementary {
 	uint8_t stream_type;
@@ -37,9 +36,7 @@ struct atsc_desc_service_location_elementary {
 } __attribute__((packed));
 
 struct atsc_desc_service_location {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	struct atsc_desc_service_location_elementary *elementary;
 
diff --git a/lib/include/libdvbv5/desc_ca.h b/lib/include/libdvbv5/desc_ca.h
index 12f4ff3..49d346b 100644
--- a/lib/include/libdvbv5/desc_ca.h
+++ b/lib/include/libdvbv5/desc_ca.h
@@ -22,13 +22,10 @@
 #ifndef _CA_H
 #define _CA_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_ca {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	uint16_t ca_id;
 	union {
diff --git a/lib/include/libdvbv5/desc_ca_identifier.h b/lib/include/libdvbv5/desc_ca_identifier.h
index 18df191..1136a84 100644
--- a/lib/include/libdvbv5/desc_ca_identifier.h
+++ b/lib/include/libdvbv5/desc_ca_identifier.h
@@ -22,13 +22,10 @@
 #ifndef _CA_IDENTIFIER_H
 #define _CA_IDENTIFIER_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_ca_identifier {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	uint8_t caid_count;
 	uint16_t *caids;
diff --git a/lib/include/libdvbv5/desc_cable_delivery.h b/lib/include/libdvbv5/desc_cable_delivery.h
index c2bab5a..25d6ab2 100644
--- a/lib/include/libdvbv5/desc_cable_delivery.h
+++ b/lib/include/libdvbv5/desc_cable_delivery.h
@@ -23,13 +23,10 @@
 #ifndef _CABLE_DELIVERY_H
 #define _CABLE_DELIVERY_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_cable_delivery {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	uint32_t frequency;
 	union {
diff --git a/lib/include/libdvbv5/desc_event_extended.h b/lib/include/libdvbv5/desc_event_extended.h
index 03fb1f1..f816a2a 100644
--- a/lib/include/libdvbv5/desc_event_extended.h
+++ b/lib/include/libdvbv5/desc_event_extended.h
@@ -22,13 +22,10 @@
 #ifndef _DESC_EVENT_EXTENDED_H
 #define _DESC_EVENT_EXTENDED_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_event_extended {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	union {
 		struct {
diff --git a/lib/include/libdvbv5/desc_event_short.h b/lib/include/libdvbv5/desc_event_short.h
index 521fbca..68c7f64 100644
--- a/lib/include/libdvbv5/desc_event_short.h
+++ b/lib/include/libdvbv5/desc_event_short.h
@@ -22,13 +22,10 @@
 #ifndef _DESC_EVENT_SHORT_H
 #define _DESC_EVENT_SHORT_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_event_short {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	unsigned char language[4];
 	char *name;
diff --git a/lib/include/libdvbv5/desc_extension.h b/lib/include/libdvbv5/desc_extension.h
index 5921cba..c19ec70 100644
--- a/lib/include/libdvbv5/desc_extension.h
+++ b/lib/include/libdvbv5/desc_extension.h
@@ -21,8 +21,7 @@
 #ifndef _EXTENSION_DESC_H
 #define _EXTENSION_DESC_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_v5_fe_parms;
 
@@ -42,9 +41,7 @@ enum extension_descriptors {
 };
 
 struct dvb_extension_descriptor {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	uint8_t extension_code;
 
diff --git a/lib/include/libdvbv5/desc_frequency_list.h b/lib/include/libdvbv5/desc_frequency_list.h
index 55723c7..ca155fa 100644
--- a/lib/include/libdvbv5/desc_frequency_list.h
+++ b/lib/include/libdvbv5/desc_frequency_list.h
@@ -22,13 +22,10 @@
 #ifndef _DESC_FREQUENCY_LIST_H
 #define _DESC_FREQUENCY_LIST_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_frequency_list {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	uint8_t frequencies;
 	uint32_t *frequency;
diff --git a/lib/include/libdvbv5/desc_hierarchy.h b/lib/include/libdvbv5/desc_hierarchy.h
index 9dd44c2..3b08d66 100644
--- a/lib/include/libdvbv5/desc_hierarchy.h
+++ b/lib/include/libdvbv5/desc_hierarchy.h
@@ -22,12 +22,10 @@
 #ifndef _HIERARCHY_H
 #define _HIERARCHY_H
 
-#include <stdint.h>
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_hierarchy {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	uint8_t hierarchy_type:4;
 	uint8_t reserved:4;
diff --git a/lib/include/libdvbv5/desc_isdbt_delivery.h b/lib/include/libdvbv5/desc_isdbt_delivery.h
index 5bac178..ae23475 100644
--- a/lib/include/libdvbv5/desc_isdbt_delivery.h
+++ b/lib/include/libdvbv5/desc_isdbt_delivery.h
@@ -22,13 +22,11 @@
 #ifndef _ISDBT_DELIVERY_H
 #define _ISDBT_DELIVERY_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct isdbt_desc_terrestrial_delivery_system {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
+
 	uint16_t *frequency;
 	unsigned num_freqs;
 
diff --git a/lib/include/libdvbv5/desc_language.h b/lib/include/libdvbv5/desc_language.h
index 44fe1a4..f8b9634 100644
--- a/lib/include/libdvbv5/desc_language.h
+++ b/lib/include/libdvbv5/desc_language.h
@@ -22,13 +22,10 @@
 #ifndef _DESC_LANGUAGE_H
 #define _DESC_LANGUAGE_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_language {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	unsigned char language[4];
 	uint8_t audio_type;
diff --git a/lib/include/libdvbv5/desc_logical_channel.h b/lib/include/libdvbv5/desc_logical_channel.h
index bbccb81..28a6ac4 100644
--- a/lib/include/libdvbv5/desc_logical_channel.h
+++ b/lib/include/libdvbv5/desc_logical_channel.h
@@ -25,8 +25,7 @@
 #ifndef _LCN_DESC_H
 #define _LCN_DESC_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_logical_channel_number {
 	uint16_t service_id;
@@ -41,9 +40,7 @@ struct dvb_desc_logical_channel_number {
 } __attribute__((packed));
 
 struct dvb_desc_logical_channel {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	struct dvb_desc_logical_channel_number *lcn;
 } __attribute__((packed));
diff --git a/lib/include/libdvbv5/desc_network_name.h b/lib/include/libdvbv5/desc_network_name.h
index 060b2e8..20e23a7 100644
--- a/lib/include/libdvbv5/desc_network_name.h
+++ b/lib/include/libdvbv5/desc_network_name.h
@@ -22,13 +22,10 @@
 #ifndef _DESC_NETWORK_NAME_H
 #define _DESC_NETWORK_NAME_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_network_name {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	char *network_name;
 	char *network_name_emph;
diff --git a/lib/include/libdvbv5/desc_partial_reception.h b/lib/include/libdvbv5/desc_partial_reception.h
index c6c45f7..3f40e5f 100644
--- a/lib/include/libdvbv5/desc_partial_reception.h
+++ b/lib/include/libdvbv5/desc_partial_reception.h
@@ -25,17 +25,14 @@
 #ifndef _PARTIAL_RECEPTION_H
 #define _PARTIAL_RECEPTION_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct isdb_partial_reception_service_id {
 	uint16_t service_id;
 } __attribute__((packed));
 
 struct isdb_desc_partial_reception {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	struct isdb_partial_reception_service_id *partial_reception;
 } __attribute__((packed));
diff --git a/lib/include/libdvbv5/desc_sat.h b/lib/include/libdvbv5/desc_sat.h
index 9e192c6..8f2b1a6 100644
--- a/lib/include/libdvbv5/desc_sat.h
+++ b/lib/include/libdvbv5/desc_sat.h
@@ -22,13 +22,10 @@
 #ifndef _SAT_H
 #define _SAT_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_sat {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	uint32_t frequency;
 	uint16_t orbit;
diff --git a/lib/include/libdvbv5/desc_service.h b/lib/include/libdvbv5/desc_service.h
index 8f269aa..dc26eac 100644
--- a/lib/include/libdvbv5/desc_service.h
+++ b/lib/include/libdvbv5/desc_service.h
@@ -22,13 +22,10 @@
 #ifndef _DESC_SERVICE_H
 #define _DESC_SERVICE_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_service {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	uint8_t service_type;
 	char *name;
diff --git a/lib/include/libdvbv5/desc_service_list.h b/lib/include/libdvbv5/desc_service_list.h
index 8e7d73f..0dc34c0 100644
--- a/lib/include/libdvbv5/desc_service_list.h
+++ b/lib/include/libdvbv5/desc_service_list.h
@@ -22,8 +22,7 @@
 #ifndef _DESC_SERVICE_LIST_H
 #define _DESC_SERVICE_LIST_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_service_list_table {
 	uint16_t service_id;
@@ -31,9 +30,7 @@ struct dvb_desc_service_list_table {
 } __attribute__((packed));
 
 struct dvb_desc_service_list {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	//struct dvb_desc_service_list_table services[];
 } __attribute__((packed));
diff --git a/lib/include/libdvbv5/desc_service_location.h b/lib/include/libdvbv5/desc_service_location.h
index 046bedc..958dd04 100644
--- a/lib/include/libdvbv5/desc_service_location.h
+++ b/lib/include/libdvbv5/desc_service_location.h
@@ -21,8 +21,7 @@
 #ifndef _SERVICE_LOCATION_H
 #define _SERVICE_LOCATION_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_service_location_element {
 	uint8_t stream_type;
@@ -37,9 +36,7 @@ struct dvb_desc_service_location_element {
 } __attribute__((packed));
 
 struct dvb_desc_service_location {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	union {
 		uint16_t bitfield;
diff --git a/lib/include/libdvbv5/desc_t2_delivery.h b/lib/include/libdvbv5/desc_t2_delivery.h
index a51f897..ed0d7a3 100644
--- a/lib/include/libdvbv5/desc_t2_delivery.h
+++ b/lib/include/libdvbv5/desc_t2_delivery.h
@@ -22,8 +22,7 @@
 #ifndef _T2_DELIVERY_H
 #define _T2_DELIVERY_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_t2_delivery_subcell {
 	uint8_t cell_id_extension;
@@ -31,6 +30,8 @@ struct dvb_desc_t2_delivery_subcell {
 } __attribute__((packed));
 
 struct dvb_desc_t2_delivery {
+	/* extended descriptor */
+
 	uint8_t plp_id;
 	uint16_t system_id;
 	union {
diff --git a/lib/include/libdvbv5/desc_terrestrial_delivery.h b/lib/include/libdvbv5/desc_terrestrial_delivery.h
index 9404169..72e449e 100644
--- a/lib/include/libdvbv5/desc_terrestrial_delivery.h
+++ b/lib/include/libdvbv5/desc_terrestrial_delivery.h
@@ -24,13 +24,10 @@
 #ifndef _TERRESTRIAL_DELIVERY_H
 #define _TERRESTRIAL_DELIVERY_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_terrestrial_delivery {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	uint32_t centre_frequency;
 	uint8_t reserved_future_use1:2;
diff --git a/lib/include/libdvbv5/desc_ts_info.h b/lib/include/libdvbv5/desc_ts_info.h
index 523aa04..60eed5d 100644
--- a/lib/include/libdvbv5/desc_ts_info.h
+++ b/lib/include/libdvbv5/desc_ts_info.h
@@ -22,8 +22,7 @@
 #ifndef _TS_INFO_H
 #define _TS_INFO_H
 
-#include <stdint.h>
-#include <unistd.h> /* ssize_t */
+#include <libdvbv5/descriptors.h>
 
 struct dvb_desc_ts_info_transmission_type {
 	uint8_t transmission_type_info;
@@ -31,9 +30,7 @@ struct dvb_desc_ts_info_transmission_type {
 } __attribute__((packed));
 
 struct dvb_desc_ts_info {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	char *ts_name, *ts_name_emph;
 	struct dvb_desc_ts_info_transmission_type transmission_type;
diff --git a/lib/include/libdvbv5/descriptors.h b/lib/include/libdvbv5/descriptors.h
index 36bcc61..ae33fda 100644
--- a/lib/include/libdvbv5/descriptors.h
+++ b/lib/include/libdvbv5/descriptors.h
@@ -54,10 +54,13 @@ extern char *output_charset;
 	b = ntohl(b); \
 } while (0)
 
+#define DVB_DESC_HEADER() \
+	uint8_t type; \
+	uint8_t length; \
+	struct dvb_desc *next
+
 struct dvb_desc {
-	uint8_t type;
-	uint8_t length;
-	struct dvb_desc *next;
+	DVB_DESC_HEADER();
 
 	uint8_t data[];
 } __attribute__((packed));
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 08/11] libdvbv5: make dvb_desc_default_init and dvb_desc_default_print private
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
                   ` (5 preceding siblings ...)
  2014-01-04 17:07 ` [PATCH 07/11] libdvbv5: use DVB_DESC_HEADER macro in all descriptors André Roth
@ 2014-01-04 17:07 ` André Roth
  2014-01-04 17:07 ` [PATCH 09/11] libdvbv5: use TABLE_INIT macro André Roth
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:07 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/include/libdvbv5/descriptors.h |   16 ++++++++--------
 lib/libdvbv5/descriptors.c         |    4 ++--
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/lib/include/libdvbv5/descriptors.h b/lib/include/libdvbv5/descriptors.h
index ae33fda..d5feb4f 100644
--- a/lib/include/libdvbv5/descriptors.h
+++ b/lib/include/libdvbv5/descriptors.h
@@ -65,14 +65,6 @@ struct dvb_desc {
 	uint8_t data[];
 } __attribute__((packed));
 
-void dvb_desc_default_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
-#ifdef __cplusplus
-extern "C" {
-#endif
-void dvb_desc_default_print  (struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
-#ifdef __cplusplus
-}
-#endif
 
 #define dvb_desc_foreach( _desc, _tbl ) \
 	for( struct dvb_desc *_desc = _tbl->descriptor; _desc; _desc = _desc->next ) \
@@ -81,6 +73,10 @@ void dvb_desc_default_print  (struct dvb_v5_fe_parms *parms, const struct dvb_de
 	for( _struct *_desc = (_struct *) _tbl->descriptor; _desc; _desc = (_struct *) _desc->next ) \
 		if(_desc->type == _type) \
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 uint32_t bcd(uint32_t bcd);
 
 void hexdump(struct dvb_v5_fe_parms *parms, const char *prefix, const unsigned char *buf, int len);
@@ -89,6 +85,10 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ui
 void dvb_free_descriptors(struct dvb_desc **list);
 void dvb_print_descriptors(struct dvb_v5_fe_parms *parms, struct dvb_desc *desc);
 
+#ifdef __cplusplus
+}
+#endif
+
 struct dvb_v5_fe_parms;
 
 typedef void (*dvb_desc_init_func) (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c
index 4bf9d59..48f3fe7 100644
--- a/lib/libdvbv5/descriptors.c
+++ b/lib/libdvbv5/descriptors.c
@@ -66,12 +66,12 @@ static void dvb_desc_init(uint8_t type, uint8_t length, struct dvb_desc *desc)
 	desc->next   = NULL;
 }
 
-void dvb_desc_default_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+static void dvb_desc_default_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	memcpy(desc->data, buf, desc->length);
 }
 
-void dvb_desc_default_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
+static void dvb_desc_default_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
 {
 	if (!parms)
 		parms = dvb_fe_dummy();
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 09/11] libdvbv5: use TABLE_INIT macro
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
                   ` (6 preceding siblings ...)
  2014-01-04 17:07 ` [PATCH 08/11] libdvbv5: make dvb_desc_default_init and dvb_desc_default_print private André Roth
@ 2014-01-04 17:07 ` André Roth
  2014-01-04 17:08 ` [PATCH 10/11] libdvbv5: descriptor parser return int André Roth
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:07 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/include/libdvbv5/descriptors.h |    2 +-
 lib/libdvbv5/descriptors.c         |   24 +++++++++++++-----------
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/lib/include/libdvbv5/descriptors.h b/lib/include/libdvbv5/descriptors.h
index d5feb4f..bc80940 100644
--- a/lib/include/libdvbv5/descriptors.h
+++ b/lib/include/libdvbv5/descriptors.h
@@ -35,7 +35,7 @@
 
 struct dvb_v5_fe_parms;
 
-typedef void (*dvb_table_init_func)(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
+typedef void (*dvb_table_init_func)(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, void *table, ssize_t *table_length);
 
 struct dvb_table_init {
 	dvb_table_init_func init;
diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c
index 48f3fe7..c7d535c 100644
--- a/lib/libdvbv5/descriptors.c
+++ b/lib/libdvbv5/descriptors.c
@@ -78,18 +78,20 @@ static void dvb_desc_default_print(struct dvb_v5_fe_parms *parms, const struct d
 	hexdump(parms, "|           ", desc->data, desc->length);
 }
 
+#define TABLE_INIT( _x ) { (dvb_table_init_func) _x##_init, sizeof(struct _x) }
+
 const struct dvb_table_init dvb_table_initializers[] = {
-	[DVB_TABLE_PAT]          = { dvb_table_pat_init, sizeof(struct dvb_table_pat) },
-	[DVB_TABLE_CAT]          = { dvb_table_cat_init, sizeof(struct dvb_table_cat) },
-	[DVB_TABLE_PMT]          = { dvb_table_pmt_init, sizeof(struct dvb_table_pmt) },
-	[DVB_TABLE_NIT]          = { dvb_table_nit_init, sizeof(struct dvb_table_nit) },
-	[DVB_TABLE_SDT]          = { dvb_table_sdt_init, sizeof(struct dvb_table_sdt) },
-	[DVB_TABLE_EIT]          = { dvb_table_eit_init, sizeof(struct dvb_table_eit) },
-	[DVB_TABLE_EIT_SCHEDULE] = { dvb_table_eit_init, sizeof(struct dvb_table_eit) },
-	[ATSC_TABLE_MGT]         = { atsc_table_mgt_init, sizeof(struct atsc_table_mgt) },
-	[ATSC_TABLE_EIT]         = { atsc_table_eit_init, sizeof(struct atsc_table_eit) },
-	[ATSC_TABLE_TVCT]        = { atsc_table_vct_init, sizeof(struct atsc_table_vct) },
-	[ATSC_TABLE_CVCT]        = { atsc_table_vct_init, sizeof(struct atsc_table_vct) },
+	[DVB_TABLE_PAT]          = TABLE_INIT(dvb_table_pat),
+	[DVB_TABLE_CAT]          = TABLE_INIT(dvb_table_cat),
+	[DVB_TABLE_PMT]          = TABLE_INIT(dvb_table_pmt),
+	[DVB_TABLE_NIT]          = TABLE_INIT(dvb_table_nit),
+	[DVB_TABLE_SDT]          = TABLE_INIT(dvb_table_sdt),
+	[DVB_TABLE_EIT]          = TABLE_INIT(dvb_table_eit),
+	[DVB_TABLE_EIT_SCHEDULE] = TABLE_INIT(dvb_table_eit),
+	[ATSC_TABLE_MGT]         = TABLE_INIT(atsc_table_mgt),
+	[ATSC_TABLE_EIT]         = TABLE_INIT(atsc_table_eit),
+	[ATSC_TABLE_TVCT]        = TABLE_INIT(atsc_table_vct),
+	[ATSC_TABLE_CVCT]        = TABLE_INIT(atsc_table_vct),
 };
 
 char *default_charset = "iso-8859-1";
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 10/11] libdvbv5: descriptor parser return int
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
                   ` (7 preceding siblings ...)
  2014-01-04 17:07 ` [PATCH 09/11] libdvbv5: use TABLE_INIT macro André Roth
@ 2014-01-04 17:08 ` André Roth
  2014-01-04 17:08 ` [PATCH 11/11] libdvbv5: remove unneeded includes André Roth
  2014-01-07 16:15 ` [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private Mauro Carvalho Chehab
  10 siblings, 0 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:08 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/include/libdvbv5/desc_atsc_service_location.h     |    2 +-
 lib/include/libdvbv5/desc_ca.h                        |    2 +-
 lib/include/libdvbv5/desc_ca_identifier.h             |    2 +-
 lib/include/libdvbv5/desc_cable_delivery.h            |    2 +-
 lib/include/libdvbv5/desc_event_extended.h            |    2 +-
 lib/include/libdvbv5/desc_event_short.h               |    2 +-
 lib/include/libdvbv5/desc_extension.h                 |    4 ++--
 lib/include/libdvbv5/desc_frequency_list.h            |    2 +-
 lib/include/libdvbv5/desc_hierarchy.h                 |    2 +-
 lib/include/libdvbv5/desc_isdbt_delivery.h            |    2 +-
 lib/include/libdvbv5/desc_language.h                  |    2 +-
 lib/include/libdvbv5/desc_logical_channel.h           |    2 +-
 lib/include/libdvbv5/desc_network_name.h              |    2 +-
 lib/include/libdvbv5/desc_partial_reception.h         |    2 +-
 lib/include/libdvbv5/desc_sat.h                       |    2 +-
 lib/include/libdvbv5/desc_service.h                   |    2 +-
 lib/include/libdvbv5/desc_service_list.h              |    2 +-
 lib/include/libdvbv5/desc_service_location.h          |    2 +-
 lib/include/libdvbv5/desc_t2_delivery.h               |    2 +-
 lib/include/libdvbv5/desc_terrestrial_delivery.h      |    2 +-
 lib/include/libdvbv5/desc_ts_info.h                   |    2 +-
 lib/include/libdvbv5/descriptors.h                    |    4 ++--
 lib/libdvbv5/descriptors.c                            |   16 ++++++++++------
 lib/libdvbv5/descriptors/desc_atsc_service_location.c |    5 +++--
 lib/libdvbv5/descriptors/desc_ca.c                    |    3 ++-
 lib/libdvbv5/descriptors/desc_ca_identifier.c         |    5 +++--
 lib/libdvbv5/descriptors/desc_cable_delivery.c        |    3 ++-
 lib/libdvbv5/descriptors/desc_event_extended.c        |    3 ++-
 lib/libdvbv5/descriptors/desc_event_short.c           |    3 ++-
 lib/libdvbv5/descriptors/desc_extension.c             |    9 ++++++---
 lib/libdvbv5/descriptors/desc_frequency_list.c        |    3 ++-
 lib/libdvbv5/descriptors/desc_hierarchy.c             |    3 ++-
 lib/libdvbv5/descriptors/desc_isdbt_delivery.c        |    7 ++++---
 lib/libdvbv5/descriptors/desc_language.c              |    3 ++-
 lib/libdvbv5/descriptors/desc_logical_channel.c       |    5 +++--
 lib/libdvbv5/descriptors/desc_network_name.c          |    3 ++-
 lib/libdvbv5/descriptors/desc_partial_reception.c     |    5 +++--
 lib/libdvbv5/descriptors/desc_sat.c                   |    4 +++-
 lib/libdvbv5/descriptors/desc_service.c               |    3 ++-
 lib/libdvbv5/descriptors/desc_service_list.c          |    3 ++-
 lib/libdvbv5/descriptors/desc_service_location.c      |    3 ++-
 lib/libdvbv5/descriptors/desc_t2_delivery.c           |   11 ++++++-----
 lib/libdvbv5/descriptors/desc_terrestrial_delivery.c  |    3 ++-
 lib/libdvbv5/descriptors/desc_ts_info.c               |    3 ++-
 44 files changed, 91 insertions(+), 63 deletions(-)

diff --git a/lib/include/libdvbv5/desc_atsc_service_location.h b/lib/include/libdvbv5/desc_atsc_service_location.h
index ebe11b7..310efa3 100644
--- a/lib/include/libdvbv5/desc_atsc_service_location.h
+++ b/lib/include/libdvbv5/desc_atsc_service_location.h
@@ -57,7 +57,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void atsc_desc_service_location_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int atsc_desc_service_location_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void atsc_desc_service_location_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void atsc_desc_service_location_free(struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_ca.h b/lib/include/libdvbv5/desc_ca.h
index 49d346b..34723d7 100644
--- a/lib/include/libdvbv5/desc_ca.h
+++ b/lib/include/libdvbv5/desc_ca.h
@@ -49,7 +49,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_ca_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_ca_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_ca_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void dvb_desc_ca_free (struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_ca_identifier.h b/lib/include/libdvbv5/desc_ca_identifier.h
index 1136a84..a4b8537 100644
--- a/lib/include/libdvbv5/desc_ca_identifier.h
+++ b/lib/include/libdvbv5/desc_ca_identifier.h
@@ -41,7 +41,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_ca_identifier_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_ca_identifier_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_ca_identifier_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void dvb_desc_ca_identifier_free (struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_cable_delivery.h b/lib/include/libdvbv5/desc_cable_delivery.h
index 25d6ab2..d794285 100644
--- a/lib/include/libdvbv5/desc_cable_delivery.h
+++ b/lib/include/libdvbv5/desc_cable_delivery.h
@@ -52,7 +52,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_cable_delivery_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_cable_delivery_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_cable_delivery_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 
 extern const unsigned dvbc_modulation_table[];
diff --git a/lib/include/libdvbv5/desc_event_extended.h b/lib/include/libdvbv5/desc_event_extended.h
index f816a2a..439adbe 100644
--- a/lib/include/libdvbv5/desc_event_extended.h
+++ b/lib/include/libdvbv5/desc_event_extended.h
@@ -46,7 +46,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_event_extended_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_event_extended_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_event_extended_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void dvb_desc_event_extended_free (struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_event_short.h b/lib/include/libdvbv5/desc_event_short.h
index 68c7f64..d666aad 100644
--- a/lib/include/libdvbv5/desc_event_short.h
+++ b/lib/include/libdvbv5/desc_event_short.h
@@ -40,7 +40,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_event_short_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_event_short_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_event_short_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void dvb_desc_event_short_free (struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_extension.h b/lib/include/libdvbv5/desc_extension.h
index c19ec70..8b2606a 100644
--- a/lib/include/libdvbv5/desc_extension.h
+++ b/lib/include/libdvbv5/desc_extension.h
@@ -49,7 +49,7 @@ struct dvb_extension_descriptor {
 } __attribute__((packed));
 
 
-typedef void (*dvb_desc_ext_init_func) (struct dvb_v5_fe_parms *parms,
+typedef int  (*dvb_desc_ext_init_func) (struct dvb_v5_fe_parms *parms,
 					const uint8_t *buf,
 					struct dvb_extension_descriptor *ext,
 					void *desc);
@@ -71,7 +71,7 @@ struct dvb_ext_descriptor {
 extern "C" {
 #endif
 
-void extension_descriptor_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int extension_descriptor_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void extension_descriptor_free(struct dvb_desc *descriptor);
 void extension_descriptor_print(struct dvb_v5_fe_parms *parms,
 				const struct dvb_desc *desc);
diff --git a/lib/include/libdvbv5/desc_frequency_list.h b/lib/include/libdvbv5/desc_frequency_list.h
index ca155fa..dc62461 100644
--- a/lib/include/libdvbv5/desc_frequency_list.h
+++ b/lib/include/libdvbv5/desc_frequency_list.h
@@ -45,7 +45,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_frequency_list_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_frequency_list_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_frequency_list_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 
 #ifdef __cplusplus
diff --git a/lib/include/libdvbv5/desc_hierarchy.h b/lib/include/libdvbv5/desc_hierarchy.h
index 3b08d66..e4b702c 100644
--- a/lib/include/libdvbv5/desc_hierarchy.h
+++ b/lib/include/libdvbv5/desc_hierarchy.h
@@ -46,7 +46,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_hierarchy_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_hierarchy_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_hierarchy_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 
 #ifdef __cplusplus
diff --git a/lib/include/libdvbv5/desc_isdbt_delivery.h b/lib/include/libdvbv5/desc_isdbt_delivery.h
index ae23475..5131d1a 100644
--- a/lib/include/libdvbv5/desc_isdbt_delivery.h
+++ b/lib/include/libdvbv5/desc_isdbt_delivery.h
@@ -46,7 +46,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void isdbt_desc_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int isdbt_desc_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void isdbt_desc_delivery_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void isdbt_desc_delivery_free(struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_language.h b/lib/include/libdvbv5/desc_language.h
index f8b9634..1b23a24 100644
--- a/lib/include/libdvbv5/desc_language.h
+++ b/lib/include/libdvbv5/desc_language.h
@@ -37,7 +37,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_language_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_language_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_language_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 
 #ifdef __cplusplus
diff --git a/lib/include/libdvbv5/desc_logical_channel.h b/lib/include/libdvbv5/desc_logical_channel.h
index 28a6ac4..83d44e5 100644
--- a/lib/include/libdvbv5/desc_logical_channel.h
+++ b/lib/include/libdvbv5/desc_logical_channel.h
@@ -51,7 +51,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_logical_channel_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_logical_channel_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_logical_channel_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void dvb_desc_logical_channel_free(struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_network_name.h b/lib/include/libdvbv5/desc_network_name.h
index 20e23a7..cabf9c3 100644
--- a/lib/include/libdvbv5/desc_network_name.h
+++ b/lib/include/libdvbv5/desc_network_name.h
@@ -37,7 +37,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_network_name_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_network_name_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_network_name_free (struct dvb_desc *desc);
 void dvb_desc_network_name_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_partial_reception.h b/lib/include/libdvbv5/desc_partial_reception.h
index 3f40e5f..05230e7 100644
--- a/lib/include/libdvbv5/desc_partial_reception.h
+++ b/lib/include/libdvbv5/desc_partial_reception.h
@@ -43,7 +43,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void isdb_desc_partial_reception_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int isdb_desc_partial_reception_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void isdb_desc_partial_reception_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void isdb_desc_partial_reception_free(struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_sat.h b/lib/include/libdvbv5/desc_sat.h
index 8f2b1a6..eca70d4 100644
--- a/lib/include/libdvbv5/desc_sat.h
+++ b/lib/include/libdvbv5/desc_sat.h
@@ -49,7 +49,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_sat_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_sat_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_sat_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 
 extern const unsigned dvbs_dvbc_dvbs_freq_inner[];
diff --git a/lib/include/libdvbv5/desc_service.h b/lib/include/libdvbv5/desc_service.h
index dc26eac..93ee4cc 100644
--- a/lib/include/libdvbv5/desc_service.h
+++ b/lib/include/libdvbv5/desc_service.h
@@ -40,7 +40,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_service_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_service_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_service_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void dvb_desc_service_free (struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_service_list.h b/lib/include/libdvbv5/desc_service_list.h
index 0dc34c0..167e251 100644
--- a/lib/include/libdvbv5/desc_service_list.h
+++ b/lib/include/libdvbv5/desc_service_list.h
@@ -41,7 +41,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_service_list_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_service_list_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_service_list_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 
 #ifdef __cplusplus
diff --git a/lib/include/libdvbv5/desc_service_location.h b/lib/include/libdvbv5/desc_service_location.h
index 958dd04..af3379b 100644
--- a/lib/include/libdvbv5/desc_service_location.h
+++ b/lib/include/libdvbv5/desc_service_location.h
@@ -55,7 +55,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_service_location_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_service_location_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_service_location_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void dvb_desc_service_location_free (struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/desc_t2_delivery.h b/lib/include/libdvbv5/desc_t2_delivery.h
index ed0d7a3..55c967d 100644
--- a/lib/include/libdvbv5/desc_t2_delivery.h
+++ b/lib/include/libdvbv5/desc_t2_delivery.h
@@ -59,7 +59,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_t2_delivery_init(struct dvb_v5_fe_parms *parms,
+int dvb_desc_t2_delivery_init(struct dvb_v5_fe_parms *parms,
 			       const uint8_t *buf,
 			       struct dvb_extension_descriptor *ext,
 			       void *desc);
diff --git a/lib/include/libdvbv5/desc_terrestrial_delivery.h b/lib/include/libdvbv5/desc_terrestrial_delivery.h
index 72e449e..6f48e76 100644
--- a/lib/include/libdvbv5/desc_terrestrial_delivery.h
+++ b/lib/include/libdvbv5/desc_terrestrial_delivery.h
@@ -51,7 +51,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_terrestrial_delivery_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_terrestrial_delivery_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_terrestrial_delivery_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 extern const unsigned dvbt_bw[];
 extern const unsigned dvbt_modulation[];
diff --git a/lib/include/libdvbv5/desc_ts_info.h b/lib/include/libdvbv5/desc_ts_info.h
index 60eed5d..a34a721 100644
--- a/lib/include/libdvbv5/desc_ts_info.h
+++ b/lib/include/libdvbv5/desc_ts_info.h
@@ -52,7 +52,7 @@ struct dvb_v5_fe_parms;
 extern "C" {
 #endif
 
-void dvb_desc_ts_info_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+int dvb_desc_ts_info_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 void dvb_desc_ts_info_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 void dvb_desc_ts_info_free(struct dvb_desc *desc);
 
diff --git a/lib/include/libdvbv5/descriptors.h b/lib/include/libdvbv5/descriptors.h
index bc80940..3e09f85 100644
--- a/lib/include/libdvbv5/descriptors.h
+++ b/lib/include/libdvbv5/descriptors.h
@@ -81,7 +81,7 @@ uint32_t bcd(uint32_t bcd);
 
 void hexdump(struct dvb_v5_fe_parms *parms, const char *prefix, const unsigned char *buf, int len);
 
-void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf, uint16_t section_length, struct dvb_desc **head_desc);
+int dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf, uint16_t section_length, struct dvb_desc **head_desc);
 void dvb_free_descriptors(struct dvb_desc **list);
 void dvb_print_descriptors(struct dvb_v5_fe_parms *parms, struct dvb_desc *desc);
 
@@ -91,7 +91,7 @@ void dvb_print_descriptors(struct dvb_v5_fe_parms *parms, struct dvb_desc *desc)
 
 struct dvb_v5_fe_parms;
 
-typedef void (*dvb_desc_init_func) (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
+typedef int (*dvb_desc_init_func) (struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc);
 typedef void (*dvb_desc_print_func)(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc);
 typedef void (*dvb_desc_free_func) (struct dvb_desc *desc);
 
diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c
index c7d535c..30b3a6d 100644
--- a/lib/libdvbv5/descriptors.c
+++ b/lib/libdvbv5/descriptors.c
@@ -66,9 +66,10 @@ static void dvb_desc_init(uint8_t type, uint8_t length, struct dvb_desc *desc)
 	desc->next   = NULL;
 }
 
-static void dvb_desc_default_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+static int dvb_desc_default_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	memcpy(desc->data, buf, desc->length);
+	return 0;
 }
 
 static void dvb_desc_default_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
@@ -97,7 +98,7 @@ const struct dvb_table_init dvb_table_initializers[] = {
 char *default_charset = "iso-8859-1";
 char *output_charset = "utf-8";
 
-void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
+int dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 			   uint16_t buflen, struct dvb_desc **head_desc)
 {
 	const uint8_t *ptr = buf, *endbuf = buf + buflen;
@@ -116,7 +117,7 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 		if (ptr + desc_len > endbuf) {
 			dvb_logerr("short read of %zd/%d bytes parsing descriptor %#02x",
 				   endbuf - ptr, desc_len, desc_type);
-			return;
+			return -1;
 		}
 
 		switch (parms->verbose) {
@@ -144,16 +145,18 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 		}
 		if (!size) {
 			dvb_logerr("descriptor type 0x%02x has no size defined", desc_type);
-			return;
+			return -2;
 		}
 
 		current = malloc(size);
 		if (!current) {
 			dvb_perror("Out of memory");
-			return;
+			return -3;
 		}
 		dvb_desc_init(desc_type, desc_len, current); /* initialize the standard header */
-		init(parms, ptr, current);
+		if (init(parms, ptr, current) != 0) {
+			return -4;
+		}
 		if (!*head_desc)
 			*head_desc = current;
 		if (last)
@@ -161,6 +164,7 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
 		last = current;
 		ptr += current->length;     /* standard descriptor header plus descriptor length */
 	}
+	return 0;
 }
 
 void dvb_print_descriptors(struct dvb_v5_fe_parms *parms, struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_atsc_service_location.c b/lib/libdvbv5/descriptors/desc_atsc_service_location.c
index 6da43b6..d47eee0 100644
--- a/lib/libdvbv5/descriptors/desc_atsc_service_location.c
+++ b/lib/libdvbv5/descriptors/desc_atsc_service_location.c
@@ -22,7 +22,7 @@
 #include <libdvbv5/desc_atsc_service_location.h>
 #include <libdvbv5/dvb-fe.h>
 
-void atsc_desc_service_location_init(struct dvb_v5_fe_parms *parms,
+int atsc_desc_service_location_init(struct dvb_v5_fe_parms *parms,
 				     const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct atsc_desc_service_location *s_loc = (struct atsc_desc_service_location *)desc;
@@ -41,7 +41,7 @@ void atsc_desc_service_location_init(struct dvb_v5_fe_parms *parms,
 		s_loc->elementary = malloc(s_loc->number_elements * sizeof(*s_loc->elementary));
 		if (!s_loc->elementary) {
 			dvb_perror("Can't allocate space for ATSC service location elementary data");
-			return;
+			return -1;
 		}
 
 		el = s_loc->elementary;
@@ -56,6 +56,7 @@ void atsc_desc_service_location_init(struct dvb_v5_fe_parms *parms,
 	} else {
 		s_loc->elementary = NULL;
 	}
+	return 0;
 }
 
 void atsc_desc_service_location_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_ca.c b/lib/libdvbv5/descriptors/desc_ca.c
index 40edfde..01d3b8c 100644
--- a/lib/libdvbv5/descriptors/desc_ca.c
+++ b/lib/libdvbv5/descriptors/desc_ca.c
@@ -23,7 +23,7 @@
 #include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
-void dvb_desc_ca_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_ca_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	size_t size = offsetof(struct dvb_desc_ca, dvb_desc_ca_field_last) - offsetof(struct dvb_desc_ca, dvb_desc_ca_field_first);
 	struct dvb_desc_ca *d = (struct dvb_desc_ca *) desc;
@@ -43,6 +43,7 @@ void dvb_desc_ca_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct
 	}
 	/*hexdump(parms, "desc ca ", buf, desc->length);*/
 	/*dvb_desc_ca_print(parms, desc);*/
+	return 0;
 }
 
 void dvb_desc_ca_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_ca_identifier.c b/lib/libdvbv5/descriptors/desc_ca_identifier.c
index 95e0569..c986ac7 100644
--- a/lib/libdvbv5/descriptors/desc_ca_identifier.c
+++ b/lib/libdvbv5/descriptors/desc_ca_identifier.c
@@ -23,7 +23,7 @@
 #include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
-void dvb_desc_ca_identifier_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_ca_identifier_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_ca_identifier *d = (struct dvb_desc_ca_identifier *) desc;
 	int i;
@@ -32,12 +32,13 @@ void dvb_desc_ca_identifier_init(struct dvb_v5_fe_parms *parms, const uint8_t *b
 	d->caids = malloc(d->length);
 	if (!d->caids) {
 		dvb_logerr("dvb_desc_ca_identifier_init: out of memory");
-		return;
+		return -1;
 	}
 	for (i = 0; i < d->caid_count; i++) {
 		d->caids[i] = ((uint16_t *) buf)[i];
 		bswap16(d->caids[i]);
 	}
+	return 0;
 }
 
 void dvb_desc_ca_identifier_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_cable_delivery.c b/lib/libdvbv5/descriptors/desc_cable_delivery.c
index 6a1c7bb..5263a56 100644
--- a/lib/libdvbv5/descriptors/desc_cable_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_cable_delivery.c
@@ -24,7 +24,7 @@
 #include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
-void dvb_desc_cable_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_cable_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_cable_delivery *cable = (struct dvb_desc_cable_delivery *) desc;
 	/* copy only the data - length already initialize */
@@ -36,6 +36,7 @@ void dvb_desc_cable_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *
 	bswap32(cable->bitfield2);
 	cable->frequency   = bcd(cable->frequency) * 100;
 	cable->symbol_rate = bcd(cable->symbol_rate) * 100;
+	return 0;
 }
 
 void dvb_desc_cable_delivery_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_event_extended.c b/lib/libdvbv5/descriptors/desc_event_extended.c
index 0970484..6689aa2 100644
--- a/lib/libdvbv5/descriptors/desc_event_extended.c
+++ b/lib/libdvbv5/descriptors/desc_event_extended.c
@@ -24,7 +24,7 @@
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
 
-void dvb_desc_event_extended_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_event_extended_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_event_extended *event = (struct dvb_desc_event_extended *) desc;
 	uint8_t len;  /* the length of the string in the input data */
@@ -62,6 +62,7 @@ void dvb_desc_event_extended_init(struct dvb_v5_fe_parms *parms, const uint8_t *
 	buf++;
 	parse_string(parms, &event->text, &event->text_emph, buf, len1, default_charset, output_charset);
 	buf += len;
+	return 0;
 }
 
 void dvb_desc_event_extended_free(struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_event_short.c b/lib/libdvbv5/descriptors/desc_event_short.c
index 98809a5..a4fb2d0 100644
--- a/lib/libdvbv5/descriptors/desc_event_short.c
+++ b/lib/libdvbv5/descriptors/desc_event_short.c
@@ -24,7 +24,7 @@
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
 
-void dvb_desc_event_short_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_event_short_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_event_short *event = (struct dvb_desc_event_short *) desc;
 	uint8_t len;        /* the length of the string in the input data */
@@ -53,6 +53,7 @@ void dvb_desc_event_short_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf
 	buf++;
 	parse_string(parms, &event->text, &event->text_emph, buf, len2, default_charset, output_charset);
 	buf += len;
+	return 0;
 }
 
 void dvb_desc_event_short_free(struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_extension.c b/lib/libdvbv5/descriptors/desc_extension.c
index 0adf9c0..91748bb 100644
--- a/lib/libdvbv5/descriptors/desc_extension.c
+++ b/lib/libdvbv5/descriptors/desc_extension.c
@@ -117,7 +117,7 @@ const struct dvb_ext_descriptor dvb_ext_descriptors[] = {
 	},
 };
 
-void extension_descriptor_init(struct dvb_v5_fe_parms *parms,
+int extension_descriptor_init(struct dvb_v5_fe_parms *parms,
 				     const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_extension_descriptor *ext = (void *)desc;
@@ -153,10 +153,13 @@ void extension_descriptor_init(struct dvb_v5_fe_parms *parms,
 
 	ext->descriptor = calloc(1, size);
 
-	if (init)
-		init(parms, p, ext, ext->descriptor);
+	if (init) {
+		if (init(parms, p, ext, ext->descriptor) != 0)
+			return -1;
+	}
 	else
 		memcpy(ext->descriptor, p, size);
+	return 0;
 }
 
 void extension_descriptor_free(struct dvb_desc *descriptor)
diff --git a/lib/libdvbv5/descriptors/desc_frequency_list.c b/lib/libdvbv5/descriptors/desc_frequency_list.c
index 28ba068..e1183b9 100644
--- a/lib/libdvbv5/descriptors/desc_frequency_list.c
+++ b/lib/libdvbv5/descriptors/desc_frequency_list.c
@@ -23,7 +23,7 @@
 #include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
-void dvb_desc_frequency_list_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_frequency_list_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_frequency_list *d = (struct dvb_desc_frequency_list *) desc;
 	size_t len;
@@ -54,6 +54,7 @@ void dvb_desc_frequency_list_init(struct dvb_v5_fe_parms *parms, const uint8_t *
 				break;
 		}
 	}
+	return 0;
 }
 
 void dvb_desc_frequency_list_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_hierarchy.c b/lib/libdvbv5/descriptors/desc_hierarchy.c
index 346a9c0..0f7675c 100644
--- a/lib/libdvbv5/descriptors/desc_hierarchy.c
+++ b/lib/libdvbv5/descriptors/desc_hierarchy.c
@@ -23,13 +23,14 @@
 #include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
-void dvb_desc_hierarchy_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_hierarchy_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_hierarchy *hierarchy = (struct dvb_desc_hierarchy *) desc;
 	/* copy from .length */
 	memcpy(((uint8_t *) hierarchy ) + sizeof(hierarchy->type) + sizeof(hierarchy->length) + sizeof(hierarchy->next),
 		buf,
 		hierarchy->length);
+	return 0;
 }
 
 void dvb_desc_hierarchy_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_isdbt_delivery.c b/lib/libdvbv5/descriptors/desc_isdbt_delivery.c
index bd22456..9ef5df4 100644
--- a/lib/libdvbv5/descriptors/desc_isdbt_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_isdbt_delivery.c
@@ -22,7 +22,7 @@
 #include <libdvbv5/desc_isdbt_delivery.h>
 #include <libdvbv5/dvb-fe.h>
 
-void isdbt_desc_delivery_init(struct dvb_v5_fe_parms *parms,
+int isdbt_desc_delivery_init(struct dvb_v5_fe_parms *parms,
 			      const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct isdbt_desc_terrestrial_delivery_system *d = (void *)desc;
@@ -38,16 +38,17 @@ void isdbt_desc_delivery_init(struct dvb_v5_fe_parms *parms,
 
 	d->num_freqs = d->length / 2;
 	if (!len)
-		return;
+		return -1;
 	d->frequency = malloc(d->num_freqs * sizeof(*d->frequency));
 	if (!d->frequency) {
 		dvb_perror("Can't allocate space for ISDB-T frequencies");
-		return;
+		return -2;
 	}
 	memcpy(d->frequency, p, d->num_freqs * sizeof(*d->frequency));
 
 	for (i = 0; i < d->num_freqs; i++)
 		bswap16(d->frequency[i]);
+	return 0;
 }
 
 static const char *interval_name[] = {
diff --git a/lib/libdvbv5/descriptors/desc_language.c b/lib/libdvbv5/descriptors/desc_language.c
index 264be55..cfc91b7 100644
--- a/lib/libdvbv5/descriptors/desc_language.c
+++ b/lib/libdvbv5/descriptors/desc_language.c
@@ -23,7 +23,7 @@
 #include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
-void dvb_desc_language_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_language_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_language *lang = (struct dvb_desc_language *) desc;
 
@@ -32,6 +32,7 @@ void dvb_desc_language_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, s
 	lang->language[2] = buf[2];
 	lang->language[3] = '\0';
 	lang->audio_type  = buf[3];
+	return 0;
 }
 
 void dvb_desc_language_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_logical_channel.c b/lib/libdvbv5/descriptors/desc_logical_channel.c
index d3edbd9..6ebea03 100644
--- a/lib/libdvbv5/descriptors/desc_logical_channel.c
+++ b/lib/libdvbv5/descriptors/desc_logical_channel.c
@@ -27,7 +27,7 @@
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
 
-void dvb_desc_logical_channel_init(struct dvb_v5_fe_parms *parms,
+int dvb_desc_logical_channel_init(struct dvb_v5_fe_parms *parms,
 			      const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_logical_channel *d = (void *)desc;
@@ -38,7 +38,7 @@ void dvb_desc_logical_channel_init(struct dvb_v5_fe_parms *parms,
 	d->lcn = malloc(d->length);
 	if (!d->lcn) {
 		dvb_perror("Out of memory!");
-		return;
+		return -1;
 	}
 
 	memcpy(d->lcn, p, d->length);
@@ -49,6 +49,7 @@ void dvb_desc_logical_channel_init(struct dvb_v5_fe_parms *parms,
 		bswap16(d->lcn[i].service_id);
 		bswap16(d->lcn[i].bitfield);
 	}
+	return 0;
 }
 
 void dvb_desc_logical_channel_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_network_name.c b/lib/libdvbv5/descriptors/desc_network_name.c
index 260856e..03f98fa 100644
--- a/lib/libdvbv5/descriptors/desc_network_name.c
+++ b/lib/libdvbv5/descriptors/desc_network_name.c
@@ -24,7 +24,7 @@
 #include <libdvbv5/dvb-fe.h>
 #include "parse_string.h"
 
-void dvb_desc_network_name_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_network_name_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_network_name *net = (struct dvb_desc_network_name *) desc;
 	uint8_t len;  /* the length of the string in the input data */
@@ -36,6 +36,7 @@ void dvb_desc_network_name_init(struct dvb_v5_fe_parms *parms, const uint8_t *bu
 	net->network_name_emph = NULL;
 	parse_string(parms, &net->network_name, &net->network_name_emph, buf, len1, default_charset, output_charset);
 	buf += len;
+	return 0;
 }
 
 void dvb_desc_network_name_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_partial_reception.c b/lib/libdvbv5/descriptors/desc_partial_reception.c
index 58d3fe6..4d19f14 100644
--- a/lib/libdvbv5/descriptors/desc_partial_reception.c
+++ b/lib/libdvbv5/descriptors/desc_partial_reception.c
@@ -24,7 +24,7 @@
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
 
-void isdb_desc_partial_reception_init(struct dvb_v5_fe_parms *parms,
+int isdb_desc_partial_reception_init(struct dvb_v5_fe_parms *parms,
 			      const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct isdb_desc_partial_reception *d = (void *)desc;
@@ -35,7 +35,7 @@ void isdb_desc_partial_reception_init(struct dvb_v5_fe_parms *parms,
 	d->partial_reception = malloc(d->length);
 	if (!d->partial_reception) {
 		dvb_perror("Out of memory!");
-		return;
+		return -1;
 	}
 
 	memcpy(d->partial_reception, p, d->length);
@@ -44,6 +44,7 @@ void isdb_desc_partial_reception_init(struct dvb_v5_fe_parms *parms,
 
 	for (i = 0; i < len; i++)
 		bswap16(d->partial_reception[i].service_id);
+	return 0;
 }
 
 void isdb_desc_partial_reception_free(struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_sat.c b/lib/libdvbv5/descriptors/desc_sat.c
index b38ab5f..b57ee22 100644
--- a/lib/libdvbv5/descriptors/desc_sat.c
+++ b/lib/libdvbv5/descriptors/desc_sat.c
@@ -23,7 +23,7 @@
 #include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
-void dvb_desc_sat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_sat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_sat *sat = (struct dvb_desc_sat *) desc;
 	/* copy from .length */
@@ -36,6 +36,8 @@ void dvb_desc_sat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct
 	sat->orbit = bcd(sat->orbit);
 	sat->frequency   = bcd(sat->frequency) * 10;
 	sat->symbol_rate = bcd(sat->symbol_rate) * 100;
+
+	return 0;
 }
 
 void dvb_desc_sat_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_service.c b/lib/libdvbv5/descriptors/desc_service.c
index 1e38451..fdcea02 100644
--- a/lib/libdvbv5/descriptors/desc_service.c
+++ b/lib/libdvbv5/descriptors/desc_service.c
@@ -24,7 +24,7 @@
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
 
-void dvb_desc_service_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_service_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_service *service = (struct dvb_desc_service *) desc;
 	uint8_t len;        /* the length of the string in the input data */
@@ -48,6 +48,7 @@ void dvb_desc_service_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, st
 	buf++;
 	parse_string(parms, &service->name, &service->name_emph, buf, len2, default_charset, output_charset);
 	buf += len;
+	return 0;
 }
 
 void dvb_desc_service_free(struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_service_list.c b/lib/libdvbv5/descriptors/desc_service_list.c
index b81f961..a9a99e9 100644
--- a/lib/libdvbv5/descriptors/desc_service_list.c
+++ b/lib/libdvbv5/descriptors/desc_service_list.c
@@ -25,7 +25,7 @@
 
 /* FIXME: implement */
 
-void dvb_desc_service_list_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_service_list_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	/*struct dvb_desc_service_list *slist = (struct dvb_desc_service_list *) desc;*/
 
@@ -41,6 +41,7 @@ void dvb_desc_service_list_init(struct dvb_v5_fe_parms *parms, const uint8_t *bu
 
 	/*return sizeof(struct dvb_desc_service_list) + slist->length + sizeof(struct dvb_desc_service_list_table);*/
 	/* FIXME: make linked list */
+	return 0;
 }
 
 void dvb_desc_service_list_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_service_location.c b/lib/libdvbv5/descriptors/desc_service_location.c
index c636862..8dde550 100644
--- a/lib/libdvbv5/descriptors/desc_service_location.c
+++ b/lib/libdvbv5/descriptors/desc_service_location.c
@@ -22,7 +22,7 @@
 #include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
-void dvb_desc_service_location_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_service_location_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_service_location *service_location = (struct dvb_desc_service_location *) desc;
 	/* copy from .next */
@@ -47,6 +47,7 @@ void dvb_desc_service_location_init(struct dvb_v5_fe_parms *parms, const uint8_t
 		bswap16(element->bitfield);
 		element++;
 	}
+	return 0;
 }
 
 void dvb_desc_service_location_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_t2_delivery.c b/lib/libdvbv5/descriptors/desc_t2_delivery.c
index 31c6974..b7f2d0b 100644
--- a/lib/libdvbv5/descriptors/desc_t2_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_t2_delivery.c
@@ -24,7 +24,7 @@
 #include <libdvbv5/desc_t2_delivery.h>
 #include <libdvbv5/dvb-fe.h>
 
-void dvb_desc_t2_delivery_init(struct dvb_v5_fe_parms *parms,
+int dvb_desc_t2_delivery_init(struct dvb_v5_fe_parms *parms,
 			       const uint8_t *buf,
 			       struct dvb_extension_descriptor *ext,
 			       void *desc)
@@ -39,7 +39,7 @@ void dvb_desc_t2_delivery_init(struct dvb_v5_fe_parms *parms,
 
 	if (desc_len < len) {
 		dvb_logwarn("T2 delivery descriptor is too small");
-		return;
+		return -1;
 	}
 	if (desc_len < len2) {
 		memcpy(p, buf, len);
@@ -48,7 +48,7 @@ void dvb_desc_t2_delivery_init(struct dvb_v5_fe_parms *parms,
 		if (desc_len != len)
 			dvb_logwarn("T2 delivery descriptor is truncated");
 
-		return;
+		return -2;
 	}
 	memcpy(p, buf, len2);
 	p += len2;
@@ -68,7 +68,7 @@ void dvb_desc_t2_delivery_init(struct dvb_v5_fe_parms *parms,
 				     sizeof(*d->centre_frequency));
 	if (!d->centre_frequency) {
 		dvb_perror("Out of memory");
-		return;
+		return -3;
 	}
 
 	memcpy(d->centre_frequency, p, sizeof(*d->centre_frequency) * d->frequency_loop_length);
@@ -83,12 +83,13 @@ void dvb_desc_t2_delivery_init(struct dvb_v5_fe_parms *parms,
 	d->subcell = calloc(d->subcel_info_loop_length, sizeof(*d->subcell));
 	if (!d->subcell) {
 		dvb_perror("Out of memory");
-		return;
+		return -4;
 	}
 	memcpy(d->subcell, p, sizeof(*d->subcell) * d->subcel_info_loop_length);
 
 	for (i = 0; i < d->subcel_info_loop_length; i++)
 		bswap16(d->subcell[i].transposer_frequency);
+	return 0;
 }
 
 void dvb_desc_t2_delivery_print(struct dvb_v5_fe_parms *parms,
diff --git a/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c b/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c
index 889ded3..0c568b0 100644
--- a/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c
@@ -25,7 +25,7 @@
 #include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
-void dvb_desc_terrestrial_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
+int dvb_desc_terrestrial_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_terrestrial_delivery *tdel = (struct dvb_desc_terrestrial_delivery *) desc;
 	/* copy from .length */
@@ -34,6 +34,7 @@ void dvb_desc_terrestrial_delivery_init(struct dvb_v5_fe_parms *parms, const uin
 			tdel->length);
 	bswap32(tdel->centre_frequency);
 	bswap32(tdel->reserved_future_use2);
+	return 0;
 }
 
 void dvb_desc_terrestrial_delivery_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_ts_info.c b/lib/libdvbv5/descriptors/desc_ts_info.c
index 233d331..f2867e5 100644
--- a/lib/libdvbv5/descriptors/desc_ts_info.c
+++ b/lib/libdvbv5/descriptors/desc_ts_info.c
@@ -24,7 +24,7 @@
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
 
-void dvb_desc_ts_info_init(struct dvb_v5_fe_parms *parms,
+int dvb_desc_ts_info_init(struct dvb_v5_fe_parms *parms,
 			      const uint8_t *buf, struct dvb_desc *desc)
 {
 	struct dvb_desc_ts_info *d = (void *)desc;
@@ -59,6 +59,7 @@ void dvb_desc_ts_info_init(struct dvb_v5_fe_parms *parms,
 		bswap16(d->service_id[i]);
 
 	p += sizeof(*d->service_id) * t->num_of_service;
+	return 0;
 }
 
 void dvb_desc_ts_info_print(struct dvb_v5_fe_parms *parms, const struct dvb_desc *desc)
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 11/11] libdvbv5: remove unneeded includes
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
                   ` (8 preceding siblings ...)
  2014-01-04 17:08 ` [PATCH 10/11] libdvbv5: descriptor parser return int André Roth
@ 2014-01-04 17:08 ` André Roth
  2014-01-07 16:15 ` [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private Mauro Carvalho Chehab
  10 siblings, 0 replies; 12+ messages in thread
From: André Roth @ 2014-01-04 17:08 UTC (permalink / raw)
  To: linux-media; +Cc: André Roth

Signed-off-by: André Roth <neolynx@gmail.com>
---
 lib/libdvbv5/descriptors/desc_atsc_service_location.c |    1 -
 lib/libdvbv5/descriptors/desc_ca.c                    |    1 -
 lib/libdvbv5/descriptors/desc_ca_identifier.c         |    1 -
 lib/libdvbv5/descriptors/desc_cable_delivery.c        |    1 -
 lib/libdvbv5/descriptors/desc_event_extended.c        |    1 -
 lib/libdvbv5/descriptors/desc_event_short.c           |    1 -
 lib/libdvbv5/descriptors/desc_extension.c             |    1 -
 lib/libdvbv5/descriptors/desc_frequency_list.c        |    1 -
 lib/libdvbv5/descriptors/desc_hierarchy.c             |    1 -
 lib/libdvbv5/descriptors/desc_isdbt_delivery.c        |    1 -
 lib/libdvbv5/descriptors/desc_language.c              |    1 -
 lib/libdvbv5/descriptors/desc_logical_channel.c       |    1 -
 lib/libdvbv5/descriptors/desc_network_name.c          |    1 -
 lib/libdvbv5/descriptors/desc_partial_reception.c     |    1 -
 lib/libdvbv5/descriptors/desc_sat.c                   |    1 -
 lib/libdvbv5/descriptors/desc_service.c               |    1 -
 lib/libdvbv5/descriptors/desc_service_list.c          |    1 -
 lib/libdvbv5/descriptors/desc_service_location.c      |    1 -
 lib/libdvbv5/descriptors/desc_t2_delivery.c           |    1 -
 lib/libdvbv5/descriptors/desc_terrestrial_delivery.c  |    1 -
 lib/libdvbv5/descriptors/desc_ts_info.c               |    1 -
 21 files changed, 21 deletions(-)

diff --git a/lib/libdvbv5/descriptors/desc_atsc_service_location.c b/lib/libdvbv5/descriptors/desc_atsc_service_location.c
index d47eee0..a654adc 100644
--- a/lib/libdvbv5/descriptors/desc_atsc_service_location.c
+++ b/lib/libdvbv5/descriptors/desc_atsc_service_location.c
@@ -18,7 +18,6 @@
  *
  */
 
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/desc_atsc_service_location.h>
 #include <libdvbv5/dvb-fe.h>
 
diff --git a/lib/libdvbv5/descriptors/desc_ca.c b/lib/libdvbv5/descriptors/desc_ca.c
index 01d3b8c..791bda2 100644
--- a/lib/libdvbv5/descriptors/desc_ca.c
+++ b/lib/libdvbv5/descriptors/desc_ca.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_ca.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
 int dvb_desc_ca_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_ca_identifier.c b/lib/libdvbv5/descriptors/desc_ca_identifier.c
index c986ac7..3102d01 100644
--- a/lib/libdvbv5/descriptors/desc_ca_identifier.c
+++ b/lib/libdvbv5/descriptors/desc_ca_identifier.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_ca_identifier.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
 int dvb_desc_ca_identifier_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_cable_delivery.c b/lib/libdvbv5/descriptors/desc_cable_delivery.c
index 5263a56..0b599e6 100644
--- a/lib/libdvbv5/descriptors/desc_cable_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_cable_delivery.c
@@ -21,7 +21,6 @@
  */
 
 #include <libdvbv5/desc_cable_delivery.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
 int dvb_desc_cable_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_event_extended.c b/lib/libdvbv5/descriptors/desc_event_extended.c
index 6689aa2..de20d06 100644
--- a/lib/libdvbv5/descriptors/desc_event_extended.c
+++ b/lib/libdvbv5/descriptors/desc_event_extended.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_event_extended.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
 
diff --git a/lib/libdvbv5/descriptors/desc_event_short.c b/lib/libdvbv5/descriptors/desc_event_short.c
index a4fb2d0..c4f5efe 100644
--- a/lib/libdvbv5/descriptors/desc_event_short.c
+++ b/lib/libdvbv5/descriptors/desc_event_short.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_event_short.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
 
diff --git a/lib/libdvbv5/descriptors/desc_extension.c b/lib/libdvbv5/descriptors/desc_extension.c
index 91748bb..0aaeba8 100644
--- a/lib/libdvbv5/descriptors/desc_extension.c
+++ b/lib/libdvbv5/descriptors/desc_extension.c
@@ -18,7 +18,6 @@
  *
  */
 
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/desc_extension.h>
 #include <libdvbv5/desc_t2_delivery.h>
 #include <libdvbv5/dvb-fe.h>
diff --git a/lib/libdvbv5/descriptors/desc_frequency_list.c b/lib/libdvbv5/descriptors/desc_frequency_list.c
index e1183b9..1ee563c 100644
--- a/lib/libdvbv5/descriptors/desc_frequency_list.c
+++ b/lib/libdvbv5/descriptors/desc_frequency_list.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_frequency_list.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
 int dvb_desc_frequency_list_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_hierarchy.c b/lib/libdvbv5/descriptors/desc_hierarchy.c
index 0f7675c..a85c8da 100644
--- a/lib/libdvbv5/descriptors/desc_hierarchy.c
+++ b/lib/libdvbv5/descriptors/desc_hierarchy.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_hierarchy.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
 int dvb_desc_hierarchy_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_isdbt_delivery.c b/lib/libdvbv5/descriptors/desc_isdbt_delivery.c
index 9ef5df4..336ca85 100644
--- a/lib/libdvbv5/descriptors/desc_isdbt_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_isdbt_delivery.c
@@ -18,7 +18,6 @@
  *
  */
 
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/desc_isdbt_delivery.h>
 #include <libdvbv5/dvb-fe.h>
 
diff --git a/lib/libdvbv5/descriptors/desc_language.c b/lib/libdvbv5/descriptors/desc_language.c
index cfc91b7..5477ae7 100644
--- a/lib/libdvbv5/descriptors/desc_language.c
+++ b/lib/libdvbv5/descriptors/desc_language.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_language.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
 int dvb_desc_language_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_logical_channel.c b/lib/libdvbv5/descriptors/desc_logical_channel.c
index 6ebea03..7137c57 100644
--- a/lib/libdvbv5/descriptors/desc_logical_channel.c
+++ b/lib/libdvbv5/descriptors/desc_logical_channel.c
@@ -22,7 +22,6 @@
  *	http://tdt.telecom.pt/recursos/apresentacoes/Signalling Specifications for DTT deployment in Portugal.pdf
  */
 
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/desc_logical_channel.h>
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
diff --git a/lib/libdvbv5/descriptors/desc_network_name.c b/lib/libdvbv5/descriptors/desc_network_name.c
index 03f98fa..95d8501 100644
--- a/lib/libdvbv5/descriptors/desc_network_name.c
+++ b/lib/libdvbv5/descriptors/desc_network_name.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_network_name.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 #include "parse_string.h"
 
diff --git a/lib/libdvbv5/descriptors/desc_partial_reception.c b/lib/libdvbv5/descriptors/desc_partial_reception.c
index 4d19f14..0e4d25c 100644
--- a/lib/libdvbv5/descriptors/desc_partial_reception.c
+++ b/lib/libdvbv5/descriptors/desc_partial_reception.c
@@ -19,7 +19,6 @@
  * Described on ARIB STD-B10 as Partial reception descriptor
  */
 
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/desc_partial_reception.h>
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
diff --git a/lib/libdvbv5/descriptors/desc_sat.c b/lib/libdvbv5/descriptors/desc_sat.c
index b57ee22..c763e4e 100644
--- a/lib/libdvbv5/descriptors/desc_sat.c
+++ b/lib/libdvbv5/descriptors/desc_sat.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_sat.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
 int dvb_desc_sat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_service.c b/lib/libdvbv5/descriptors/desc_service.c
index fdcea02..f13a9e6 100644
--- a/lib/libdvbv5/descriptors/desc_service.c
+++ b/lib/libdvbv5/descriptors/desc_service.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_service.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
 
diff --git a/lib/libdvbv5/descriptors/desc_service_list.c b/lib/libdvbv5/descriptors/desc_service_list.c
index a9a99e9..7334f01 100644
--- a/lib/libdvbv5/descriptors/desc_service_list.c
+++ b/lib/libdvbv5/descriptors/desc_service_list.c
@@ -20,7 +20,6 @@
  */
 
 #include <libdvbv5/desc_service_list.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
 /* FIXME: implement */
diff --git a/lib/libdvbv5/descriptors/desc_service_location.c b/lib/libdvbv5/descriptors/desc_service_location.c
index 8dde550..3023561 100644
--- a/lib/libdvbv5/descriptors/desc_service_location.c
+++ b/lib/libdvbv5/descriptors/desc_service_location.c
@@ -19,7 +19,6 @@
  */
 
 #include <libdvbv5/desc_service_location.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
 int dvb_desc_service_location_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_t2_delivery.c b/lib/libdvbv5/descriptors/desc_t2_delivery.c
index b7f2d0b..0d5cab6 100644
--- a/lib/libdvbv5/descriptors/desc_t2_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_t2_delivery.c
@@ -19,7 +19,6 @@
  * Based on ETSI EN 300 468 V1.11.1 (2010-04)
  */
 
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/desc_extension.h>
 #include <libdvbv5/desc_t2_delivery.h>
 #include <libdvbv5/dvb-fe.h>
diff --git a/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c b/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c
index 0c568b0..7eb4b2b 100644
--- a/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c
+++ b/lib/libdvbv5/descriptors/desc_terrestrial_delivery.c
@@ -22,7 +22,6 @@
  */
 
 #include <libdvbv5/desc_terrestrial_delivery.h>
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/dvb-fe.h>
 
 int dvb_desc_terrestrial_delivery_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
diff --git a/lib/libdvbv5/descriptors/desc_ts_info.c b/lib/libdvbv5/descriptors/desc_ts_info.c
index f2867e5..7a6e520 100644
--- a/lib/libdvbv5/descriptors/desc_ts_info.c
+++ b/lib/libdvbv5/descriptors/desc_ts_info.c
@@ -19,7 +19,6 @@
  * Described on ARIB STD-B10 as TS information descriptor
  */
 
-#include <libdvbv5/descriptors.h>
 #include <libdvbv5/desc_ts_info.h>
 #include <libdvbv5/dvb-fe.h>
 #include <parse_string.h>
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private
  2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
                   ` (9 preceding siblings ...)
  2014-01-04 17:08 ` [PATCH 11/11] libdvbv5: remove unneeded includes André Roth
@ 2014-01-07 16:15 ` Mauro Carvalho Chehab
  10 siblings, 0 replies; 12+ messages in thread
From: Mauro Carvalho Chehab @ 2014-01-07 16:15 UTC (permalink / raw)
  To: André Roth; +Cc: linux-media

Em Sat,  4 Jan 2014 18:07:51 +0100
André Roth <neolynx@gmail.com> escreveu:

description?

what are you fixing? why? how?


> Signed-off-by: André Roth <neolynx@gmail.com>
> ---
>  lib/include/libdvbv5/descriptors.h |    2 --
>  lib/libdvbv5/descriptors.c         |   44 ++++++++++++++++++------------------
>  2 files changed, 22 insertions(+), 24 deletions(-)
> 
> diff --git a/lib/include/libdvbv5/descriptors.h b/lib/include/libdvbv5/descriptors.h
> index 6f89aeb..36bcc61 100644
> --- a/lib/include/libdvbv5/descriptors.h
> +++ b/lib/include/libdvbv5/descriptors.h
> @@ -78,8 +78,6 @@ void dvb_desc_default_print  (struct dvb_v5_fe_parms *parms, const struct dvb_de
>  	for( _struct *_desc = (_struct *) _tbl->descriptor; _desc; _desc = (_struct *) _desc->next ) \
>  		if(_desc->type == _type) \
>  
> -ssize_t dvb_desc_init(const uint8_t *buf, struct dvb_desc *desc);
> -
>  uint32_t bcd(uint32_t bcd);
>  
>  void hexdump(struct dvb_v5_fe_parms *parms, const char *prefix, const unsigned char *buf, int len);
> diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c
> index a2176b4..626f81d 100644
> --- a/lib/libdvbv5/descriptors.c
> +++ b/lib/libdvbv5/descriptors.c
> @@ -56,12 +56,11 @@
>  #include <libdvbv5/desc_partial_reception.h>
>  #include <libdvbv5/desc_extension.h>
>  
> -ssize_t dvb_desc_init(const uint8_t *buf, struct dvb_desc *desc)
> +static void dvb_desc_init(uint8_t type, uint8_t length, struct dvb_desc *desc)
>  {
> -	desc->type   = buf[0];
> -	desc->length = buf[1];
> +	desc->type   = type;
> +	desc->length = length;
>  	desc->next   = NULL;
> -	return 2;
>  }
>  
>  void dvb_desc_default_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, struct dvb_desc *desc)
> @@ -94,16 +93,27 @@ char *default_charset = "iso-8859-1";
>  char *output_charset = "utf-8";
>  
>  void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
> -			   uint16_t section_length, struct dvb_desc **head_desc)
> +			   uint16_t buflen, struct dvb_desc **head_desc)
>  {
> -	const uint8_t *ptr = buf;
> +	const uint8_t *ptr = buf, *endbuf = buf + buflen;
>  	struct dvb_desc *current = NULL;
>  	struct dvb_desc *last = NULL;
> -	while (ptr < buf + section_length) {
> -		unsigned desc_type = ptr[0];
> -		int desc_len  = ptr[1];
> +
> +	*head_desc = NULL;
> +
> +	while (ptr + 2 <= endbuf ) {

No spaces before ')'

> +		uint8_t desc_type = ptr[0];
> +		uint8_t desc_len  = ptr[1];
>  		size_t size;
>  
> +		ptr += 2; /* skip type and length */
> +
> +		if (ptr + desc_len > endbuf) {
> +			dvb_logerr("short read of %zd/%d bytes parsing descriptor %#02x",
> +				   endbuf - ptr, desc_len, desc_type);
> +			return;
> +		}
> +
>  		switch (parms->verbose) {
>  		case 0:
>  		case 1:
> @@ -119,11 +129,6 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
>  			hexdump(parms, "content: ", ptr + 2, desc_len);
>  		}
>  
> -		if (desc_len > section_length - 2) {
> -			dvb_logwarn("descriptor type %0x02x is too big",
> -				   desc_type);
> -			return;
> -		}
>  
>  		dvb_desc_init_func init = dvb_descriptors[desc_type].init;
>  		if (!init) {
> @@ -133,21 +138,16 @@ void dvb_parse_descriptors(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
>  			size = dvb_descriptors[desc_type].size;
>  		}
>  		if (!size) {
> -			dvb_logwarn("descriptor type 0x%02x has no size defined", desc_type);
> -			size = 4096;
> -		}
> -		if (ptr + 2 >=  buf + section_length) {
> -			dvb_logwarn("descriptor type 0x%02x is truncated: desc len %d, section len %zd",
> -				   desc_type, desc_len, section_length - (ptr - buf));
> +			dvb_logerr("descriptor type 0x%02x has no size defined", desc_type);
>  			return;
>  		}
>  
> -		current = calloc(1, size);
> +		current = malloc(size);

Please either keep using calloc, or do a memset() to cleanup the newest
buffer. It is a bad idea to let the new buffers uninitialized.

>  		if (!current) {
>  			dvb_perror("Out of memory");
>  			return;
>  		}
> -		ptr += dvb_desc_init(ptr, current); /* the standard header was read */
> +		dvb_desc_init(desc_type, desc_len, current); /* initialize the standard header */
>  		init(parms, ptr, current);
>  		if (!*head_desc)
>  			*head_desc = current;


Btw, I saw some cleanups, but I didn't find any bug to be fixed on the
above.

Also, it is introducing a regression, when it replaced calloc() with
malloc().

Regard
-- 

Cheers,
Mauro

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2014-01-07 16:15 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-01-04 17:07 [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private André Roth
2014-01-04 17:07 ` [PATCH 02/11] libdvbv5: add attribute packed to structs and unions André Roth
2014-01-04 17:07 ` [PATCH 03/11] libdvbv5: add parser for CAT André Roth
2014-01-04 17:07 ` [PATCH 04/11] libdvbv5: add parser for ca and ca_identifier descriptors André Roth
2014-01-04 17:07 ` [PATCH 05/11] libdvbv5: fix PMT parser André Roth
2014-01-04 17:07 ` [PATCH 06/11] libdvbv5: cleanup printing tables and descriptors André Roth
2014-01-04 17:07 ` [PATCH 07/11] libdvbv5: use DVB_DESC_HEADER macro in all descriptors André Roth
2014-01-04 17:07 ` [PATCH 08/11] libdvbv5: make dvb_desc_default_init and dvb_desc_default_print private André Roth
2014-01-04 17:07 ` [PATCH 09/11] libdvbv5: use TABLE_INIT macro André Roth
2014-01-04 17:08 ` [PATCH 10/11] libdvbv5: descriptor parser return int André Roth
2014-01-04 17:08 ` [PATCH 11/11] libdvbv5: remove unneeded includes André Roth
2014-01-07 16:15 ` [PATCH 01/11] libdvbv5: fix dvb_parse_descriptors and make dvb_desc_init private Mauro Carvalho Chehab

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).