Re: [PATCH 08/13] libdvbv5: ATSC EIT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Em Sat, 28 Dec 2013 16:45:56 +0100
André Roth <neolynx@xxxxxxxxx> escreveu:

> Signed-off-by: André Roth <neolynx@xxxxxxxxx>
> ---
>  lib/include/descriptors/atsc_eit.h     |  91 +++++++++++++++++++++
>  lib/include/descriptors/atsc_header.h  |  64 +++++++++++++++
>  lib/include/descriptors/mgt.h          |  25 +++---
>  lib/include/descriptors/vct.h          |  39 ++++-----
>  lib/include/dvb-scan.h                 |   2 +-
>  lib/libdvbv5/Makefile.am               |   3 +
>  lib/libdvbv5/descriptors.c             |  19 +++--
>  lib/libdvbv5/descriptors/atsc_eit.c    | 143 +++++++++++++++++++++++++++++++++
>  lib/libdvbv5/descriptors/atsc_header.c |  48 +++++++++++
>  lib/libdvbv5/descriptors/eit.c         |   2 +-
>  lib/libdvbv5/descriptors/mgt.c         |  41 +++++-----
>  lib/libdvbv5/descriptors/vct.c         |  39 +++++----
>  lib/libdvbv5/dvb-file.c                |   2 +-
>  lib/libdvbv5/dvb-scan.c                |  10 +--
>  14 files changed, 442 insertions(+), 86 deletions(-)
>  create mode 100644 lib/include/descriptors/atsc_eit.h
>  create mode 100644 lib/include/descriptors/atsc_header.h
>  create mode 100644 lib/libdvbv5/descriptors/atsc_eit.c
>  create mode 100644 lib/libdvbv5/descriptors/atsc_header.c
> 
> diff --git a/lib/include/descriptors/atsc_eit.h b/lib/include/descriptors/atsc_eit.h
> new file mode 100644
> index 0000000..ded7a64
> --- /dev/null
> +++ b/lib/include/descriptors/atsc_eit.h
> @@ -0,0 +1,91 @@
> +/*
> + * Copyright (c) 2011-2012 - Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>

I'm not the author.

> + * Copyright (c) 2012 - Andre Roth <neolynx@xxxxxxxxx>
> + *
> + * 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 _ATSC_EIT_H
> +#define _ATSC_EIT_H
> +
> +#include <stdint.h>
> +#include <unistd.h> /* ssize_t */
> +#include <time.h>
> +
> +#include "descriptors/atsc_header.h"
> +#include "descriptors.h"
> +
> +#define ATSC_TABLE_EIT        0xCB
> +
> +struct atsc_table_eit_event {
> +	union {
> +		uint16_t bitfield;
> +		struct {
> +	          uint16_t event_id:14;
> +	          uint16_t one:2;
> +		} __attribute__((packed));
> +	} __attribute__((packed));
> +	uint32_t start_time;
> +	union {
> +		uint32_t bitfield2;
> +		struct {
> +			uint32_t title_length:8;
> +			uint32_t duration:20;
> +			uint32_t etm:2;
> +			uint32_t one2:2;
> +			uint32_t :2;
> +		} __attribute__((packed));
> +	} __attribute__((packed));
> +	struct dvb_desc *descriptor;
> +	struct atsc_table_eit_event *next;
> +	struct tm start;
> +	uint16_t source_id;
> +} __attribute__((packed));
> +
> +union atsc_table_eit_desc_length {
> +	uint16_t bitfield;
> +	struct {
> +		uint16_t desc_length:12;
> +		uint16_t reserved:4;
> +	} __attribute__((packed));
> +} __attribute__((packed));
> +
> +struct atsc_table_eit {
> +	struct atsc_table_header header;
> +	uint8_t events;
> +	struct atsc_table_eit_event *event;
> +} __attribute__((packed));
> +
> +#define atsc_eit_event_foreach(_event, _eit) \
> +	for( struct atsc_table_eit_event *_event = _eit->event; _event; _event = _event->next ) \
> +
> +struct dvb_v5_fe_parms;
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +void atsc_table_eit_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
> +void atsc_table_eit_free(struct atsc_table_eit *eit);
> +void atsc_table_eit_print(struct dvb_v5_fe_parms *parms, struct atsc_table_eit *eit);
> +void atsc_time(const uint32_t start_time, struct tm *tm);
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif
> diff --git a/lib/include/descriptors/atsc_header.h b/lib/include/descriptors/atsc_header.h
> new file mode 100644
> index 0000000..481d15f
> --- /dev/null
> +++ b/lib/include/descriptors/atsc_header.h
> @@ -0,0 +1,64 @@
> +/*
> + * Copyright (c) 2011-2012 - Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>

I'm not the author.


> + * Copyright (c) 2012 - Andre Roth <neolynx@xxxxxxxxx>
> + *
> + * 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 _ATSC_HEADER_H
> +#define _ATSC_HEADER_H
> +
> +#include <stdint.h>
> +#include <unistd.h> /* ssize_t */
> +
> +#define ATSC_BASE_PID  0x1FFB
> +
> +struct atsc_table_header {
> +	uint8_t  table_id;
> +	union {
> +		uint16_t bitfield;
> +		struct {
> +			uint16_t section_length:12;
> +			uint16_t one:2;
> +			uint16_t priv:1;
> +			uint16_t syntax:1;
> +		} __attribute__((packed));
> +	};
> +	uint16_t id;
> +	uint8_t  current_next:1;
> +	uint8_t  version:5;
> +	uint8_t  one2:2;
> +
> +	uint8_t  section_id;
> +	uint8_t  last_section;
> +	uint8_t  protocol_version;
> +} __attribute__((packed));
> +
> +struct dvb_v5_fe_parms;
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +int  atsc_table_header_init (struct atsc_table_header *t);
> +void atsc_table_header_print(struct dvb_v5_fe_parms *parms, const struct atsc_table_header *t);
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif
> diff --git a/lib/include/descriptors/mgt.h b/lib/include/descriptors/mgt.h
> index 4a68f2c..889d026 100644
> --- a/lib/include/descriptors/mgt.h
> +++ b/lib/include/descriptors/mgt.h
> @@ -25,12 +25,12 @@
>  #include <stdint.h>
>  #include <unistd.h> /* ssize_t */
>  
> -#include "descriptors/header.h"
> +#include "descriptors/atsc_header.h"
>  #include "descriptors.h"
>  
> -#define DVB_TABLE_MGT      0xC7
> +#define ATSC_TABLE_MGT 0xC7
>  
> -struct dvb_table_mgt_table {
> +struct atsc_table_mgt_table {
>  	uint16_t type;
>  	union {
>  		uint16_t bitfield;
> @@ -50,20 +50,19 @@ struct dvb_table_mgt_table {
>  		} __attribute__((packed));
>  	} __attribute__((packed));
>  	struct dvb_desc *descriptor;
> -	struct dvb_table_mgt_table *next;
> +	struct atsc_table_mgt_table *next;
>  } __attribute__((packed));
>  
> -struct dvb_table_mgt {
> -	struct dvb_table_header header;
> -        uint8_t  protocol_version;
> +struct atsc_table_mgt {
> +	struct atsc_table_header header;
>          uint16_t tables;
> -        struct dvb_table_mgt_table *table;
> +        struct atsc_table_mgt_table *table;
>  	struct dvb_desc *descriptor;
>  } __attribute__((packed));
>  
>  
> -#define dvb_mgt_transport_foreach( tran, mgt ) \
> -  for( struct dvb_table_mgt_transport *tran = mgt->transport; tran; tran = tran->next ) \
> +#define dvb_mgt_table_foreach( tran, mgt ) \
> +  for( struct dvb_table_mgt_table *tran = mgt->table; tran; tran = tran->next ) \
>  
>  struct dvb_v5_fe_parms;
>  
> @@ -71,9 +70,9 @@ struct dvb_v5_fe_parms;
>  extern "C" {
>  #endif
>  
> -void dvb_table_mgt_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
> -void dvb_table_mgt_free(struct dvb_table_mgt *mgt);
> -void dvb_table_mgt_print(struct dvb_v5_fe_parms *parms, struct dvb_table_mgt *mgt);
> +void atsc_table_mgt_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
> +void atsc_table_mgt_free(struct atsc_table_mgt *mgt);
> +void atsc_table_mgt_print(struct dvb_v5_fe_parms *parms, struct atsc_table_mgt *mgt);
>  
>  #ifdef __cplusplus
>  }
> diff --git a/lib/include/descriptors/vct.h b/lib/include/descriptors/vct.h
> index 505a407..8afd0b8 100644
> --- a/lib/include/descriptors/vct.h
> +++ b/lib/include/descriptors/vct.h
> @@ -25,25 +25,25 @@
>  #include <stdint.h>
>  #include <unistd.h> /* ssize_t */
>  
> -#include "descriptors/header.h"
> +#include "descriptors/atsc_header.h"
>  #include "descriptors.h"
>  
> -#define DVB_TABLE_TVCT     0xc8
> -#define DVB_TABLE_CVCT     0xc9
> -#define DVB_TABLE_VCT_PID  0x1ffb
> +#define ATSC_TABLE_TVCT     0xc8
> +#define ATSC_TABLE_CVCT     0xc9
> +#define ATSC_TABLE_VCT_PID  0x1ffb
>  
> -struct dvb_table_vct_channel {
> +struct atsc_table_vct_channel {
>  	uint16_t	__short_name[7];
>  
>  	union {
> -		uint32_t bitfield;
> +		uint32_t bitfield1;

I think you're touching here again, reverting what you've done on a 
previous patch.

>  		struct {
>  			uint32_t	modulation_mode:8;
>  			uint32_t	minor_channel_number:10;
>  			uint32_t	major_channel_number:10;
>  			uint32_t	reserved1:4;
>  		} __attribute__((packed));
> -	};
> +	} __attribute__((packed));
>  
>  	uint32_t	carrier_frequency;
>  	uint16_t	channel_tsid;
> @@ -61,7 +61,8 @@ struct dvb_table_vct_channel {
>  			uint16_t	ETM_location:2;
>  
>  		} __attribute__((packed));
> -	};
> +	} __attribute__((packed));
> +
>  	uint16_t source_id;
>  	union {
>  		uint16_t bitfield3;
> @@ -69,22 +70,22 @@ struct dvb_table_vct_channel {
>  			uint16_t descriptors_length:10;
>  			uint16_t reserved3:6;
>  		} __attribute__((packed));
> -	};
> +	} __attribute__((packed));
>  
>  	/*
>  	 * Everything after descriptor (including it) won't be bit-mapped
>  	 * to the data parsed from the MPEG TS. So, metadata are added there
>  	 */
>  	struct dvb_desc *descriptor;
> -	struct dvb_table_vct_channel *next;
> +	struct atsc_table_vct_channel *next;
>  
>  	/* The channel_short_name is converted to locale charset by vct.c */
>  
>  	char short_name[32];
>  } __attribute__((packed));
>  
> -struct dvb_table_vct {
> -	struct dvb_table_header header;
> +struct atsc_table_vct {
> +	struct atsc_table_header header;
>  
>  	uint8_t ATSC_protocol_version;
>  	uint8_t num_channels_in_section;
> @@ -93,12 +94,12 @@ struct dvb_table_vct {
>  	 * Everything after descriptor (including it) won't be bit-mapped
>  	 * to the data parsed from the MPEG TS. So, metadata are added there
>  	 */
> -	struct dvb_table_vct_channel *channel;
> +	struct atsc_table_vct_channel *channel;
>  	struct dvb_desc *descriptor;
>  } __attribute__((packed));
>  
>  
> -union dvb_table_vct_descriptor_length {
> +union atsc_table_vct_descriptor_length {
>  	uint16_t bitfield;
>  	struct {
>  		uint16_t descriptor_length:10;
> @@ -106,8 +107,8 @@ union dvb_table_vct_descriptor_length {
>  	};
>  };
>  
> -#define dvb_vct_channel_foreach(_channel, _vct) \
> -	for (struct dvb_table_vct_channel *_channel = _vct->channel; _channel; _channel = _channel->next) \
> +#define atsc_vct_channel_foreach(_channel, _vct) \
> +	for (struct atsc_table_vct_channel *_channel = _vct->channel; _channel; _channel = _channel->next) \
>  
>  struct dvb_v5_fe_parms;
>  
> @@ -115,9 +116,9 @@ struct dvb_v5_fe_parms;
>  extern "C" {
>  #endif
>  
> -void dvb_table_vct_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
> -void dvb_table_vct_free(struct dvb_table_vct *vct);
> -void dvb_table_vct_print(struct dvb_v5_fe_parms *parms, struct dvb_table_vct *vct);
> +void atsc_table_vct_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
> +void atsc_table_vct_free(struct atsc_table_vct *vct);
> +void atsc_table_vct_print(struct dvb_v5_fe_parms *parms, struct atsc_table_vct *vct);
>  
>  #ifdef __cplusplus
>  }
> diff --git a/lib/include/dvb-scan.h b/lib/include/dvb-scan.h
> index b5dbfa9..9aef531 100644
> --- a/lib/include/dvb-scan.h
> +++ b/lib/include/dvb-scan.h
> @@ -49,7 +49,7 @@ struct dvb_v5_descriptors {
>  	unsigned num_entry;
>  
>  	struct dvb_table_pat *pat;
> -	struct dvb_table_vct *vct;
> +	struct atsc_table_vct *vct;
>  	struct dvb_v5_descriptors_program *program;
>  	struct dvb_table_nit *nit;
>  	struct dvb_table_sdt *sdt;
> diff --git a/lib/libdvbv5/Makefile.am b/lib/libdvbv5/Makefile.am
> index 9d4b6b9..368baf8 100644
> --- a/lib/libdvbv5/Makefile.am
> +++ b/lib/libdvbv5/Makefile.am
> @@ -48,8 +48,11 @@ libdvbv5_la_SOURCES = \
>    descriptors/nit.c  ../include/descriptors/nit.h \
>    descriptors/sdt.c  ../include/descriptors/sdt.h \
>    descriptors/vct.c  ../include/descriptors/vct.h \
> +  descriptors/atsc_header.c ../include/descriptors/atsc_header.h \
>    descriptors/vct.c  ../include/descriptors/vct.h \
>    descriptors/mgt.c  ../include/descriptors/mgt.h \
> +  descriptors/eit.c  ../include/descriptors/eit.h \
> +  descriptors/atsc_eit.c  ../include/descriptors/atsc_eit.h \
>    descriptors/desc_service_location.c  ../include/descriptors/desc_service_location.h \
>    descriptors/mpeg_ts.c  ../include/descriptors/mpeg_ts.h \
>    descriptors/mpeg_pes.c  ../include/descriptors/mpeg_pes.h \
> diff --git a/lib/libdvbv5/descriptors.c b/lib/libdvbv5/descriptors.c
> index bd1bc03..6df8b8b 100644
> --- a/lib/libdvbv5/descriptors.c
> +++ b/lib/libdvbv5/descriptors.c
> @@ -37,6 +37,7 @@
>  #include "descriptors/eit.h"
>  #include "descriptors/vct.h"
>  #include "descriptors/mgt.h"
> +#include "descriptors/atsc_eit.h"
>  #include "descriptors/desc_language.h"
>  #include "descriptors/desc_network_name.h"
>  #include "descriptors/desc_cable_delivery.h"
> @@ -76,14 +77,16 @@ 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_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_TVCT] = { dvb_table_vct_init, sizeof(struct dvb_table_vct) },
> -	[DVB_TABLE_CVCT] = { dvb_table_vct_init, sizeof(struct dvb_table_vct) },
> +	[DVB_TABLE_PAT]          = { dvb_table_pat_init, sizeof(struct dvb_table_pat) },
> +	[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_TVCT]        = { atsc_table_vct_init, sizeof(struct atsc_table_vct) },
> +	[ATSC_TABLE_CVCT]        = { atsc_table_vct_init, sizeof(struct atsc_table_vct) },
> +	[ATSC_TABLE_MGT]         = { atsc_table_mgt_init, sizeof(struct atsc_table_mgt) },
> +	[ATSC_TABLE_EIT]         = { atsc_table_eit_init, sizeof(struct atsc_table_eit) },
>  };
>  
>  char *default_charset = "iso-8859-1";
> @@ -1355,6 +1358,6 @@ void hexdump(struct dvb_v5_fe_parms *parms, const char *prefix, const unsigned c
>  		for (i = strlen(hex); i < 49; i++)
>  			strncat(spaces, " ", sizeof(spaces));
>  		ascii[j] = '\0';
> -		dvb_log("%s%s %s %s", prefix, hex, spaces, ascii);
> +		dvb_log("%s %s %s %s", prefix, hex, spaces, ascii);
>  	}
>  }
> diff --git a/lib/libdvbv5/descriptors/atsc_eit.c b/lib/libdvbv5/descriptors/atsc_eit.c
> new file mode 100644
> index 0000000..b827ecb
> --- /dev/null
> +++ b/lib/libdvbv5/descriptors/atsc_eit.c
> @@ -0,0 +1,143 @@
> +/*
> + * Copyright (c) 2011-2012 - Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>

I'm not the author.

> + * Copyright (c) 2012 - Andre Roth <neolynx@xxxxxxxxx>
> + *
> + * 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 "descriptors/atsc_eit.h"
> +#include "dvb-fe.h"
> +
> +void atsc_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length)
> +{
> +	const uint8_t *p = buf;
> +	struct atsc_table_eit *eit = (struct atsc_table_eit *) table;
> +	struct atsc_table_eit_event **head;
> +
> +	if (*table_length > 0) {
> +		memcpy(eit, p, sizeof(struct atsc_table_eit) - sizeof(eit->event));

Check before copy. Use offset_of().
> +
> +		/* find end of curent list */
> +		head = &eit->event;
> +		while (*head != NULL)
> +			head = &(*head)->next;
> +	} else {
> +		memcpy(eit, p, sizeof(struct atsc_table_eit) - sizeof(eit->event));

check before copy. Use offset_of().

> +		*table_length = sizeof(struct atsc_table_eit);
> +
> +		eit->event = NULL;
> +		head = &eit->event;
> +	}
> +	p += sizeof(struct atsc_table_eit) - sizeof(eit->event);
> +
> +        hexdump(parms, "eit", p, 64 );
> +
> +        int i = 0;
> +	struct atsc_table_eit_event *last = NULL;
> +	while (i++ < eit->events && (uint8_t *) p < buf + buflen - 4) {
> +		struct atsc_table_eit_event *event = (struct atsc_table_eit_event *) malloc(sizeof(struct atsc_table_eit_event));
> +		memcpy(event, p, sizeof(struct atsc_table_eit_event) -
> +				 sizeof(event->descriptor) -
> +				 sizeof(event->next) -
> +				 sizeof(event->start) -
> +				 sizeof(event->source_id));
> +		p += sizeof(struct atsc_table_eit_event) -
> +		     sizeof(event->descriptor) -
> +		     sizeof(event->next) -
> +		     sizeof(event->start) -
> +		     sizeof(event->source_id);

Please use offset_of().

> +
> +		bswap16(event->bitfield);
> +		bswap32(event->start_time);
> +		bswap32(event->bitfield2);
> +		event->descriptor = NULL;
> +		event->next = NULL;
> +                atsc_time(event->start_time, &event->start);
> +		event->source_id = eit->header.id;
> +
> +                //FIXME: title
> +                p += event->title_length - 1;
> +
> +		if(!*head)
> +			*head = event;
> +		if(last)
> +			last->next = event;
> +
> +		/* get the descriptors for each program */
> +		struct dvb_desc **head_desc = &event->descriptor;
> +                union atsc_table_eit_desc_length dl = *(union atsc_table_eit_desc_length *) p;

data declarations at the beginning.

> +                bswap16(dl.bitfield);
> +                p += sizeof(union atsc_table_eit_desc_length);
> +		dvb_parse_descriptors(parms, p, dl.desc_length, head_desc);
> +
> +		p += dl.desc_length;
> +		last = event;
> +	}
> +}
> +
> +void atsc_table_eit_free(struct atsc_table_eit *eit)
> +{
> +	struct atsc_table_eit_event *event = eit->event;
> +	while (event) {
> +		dvb_free_descriptors((struct dvb_desc **) &event->descriptor);
> +		struct atsc_table_eit_event *tmp = event;
> +		event = event->next;
> +		free(tmp);
> +	}
> +	free(eit);
> +}
> +
> +void atsc_table_eit_print(struct dvb_v5_fe_parms *parms, struct atsc_table_eit *eit)
> +{
> +	dvb_log("EIT");
> +	atsc_table_header_print(parms, &eit->header);
> +	const struct atsc_table_eit_event *event = eit->event;
> +	uint16_t events = 0;
> +	while (event) {
> +		char start[255];
> +		strftime(start, sizeof(start), "%F %T", &event->start);
> +		dvb_log("|-  event %7d", event->event_id);
> +		dvb_log("|   Source                %d", event->source_id);
> +		dvb_log("|   Starttime             %d", event->start_time);
> +		dvb_log("|   Start                 %s UTC", start);
> +		dvb_log("|   Duration              %dh %dm %ds", event->duration / 3600, (event->duration % 3600) / 60, event->duration % 60);
> +		dvb_log("|   ETM                   %d", event->etm);
> +		dvb_log("|   title length          %d", event->title_length);
> +		dvb_print_descriptors(parms, event->descriptor);
> +		event = event->next;
> +		events++;
> +	}
> +	dvb_log("|_  %d events", events);
> +}
> +
> +void atsc_time(const uint32_t start_time, struct tm *tm)
> +{
> +  tm->tm_sec   = 0;
> +  tm->tm_min   = 0;
> +  tm->tm_hour  = 0;
> +  tm->tm_mday  = 6;
> +  tm->tm_mon   = 0;
> +  tm->tm_year  = 80;
> +  tm->tm_isdst = -1;
> +  tm->tm_wday  = 0;
> +  tm->tm_yday  = 0;
> +  mktime(tm);
> +  tm->tm_sec += start_time;
> +  mktime(tm);
> +}
> +
> +
> diff --git a/lib/libdvbv5/descriptors/atsc_header.c b/lib/libdvbv5/descriptors/atsc_header.c
> new file mode 100644
> index 0000000..7b31fa1
> --- /dev/null
> +++ b/lib/libdvbv5/descriptors/atsc_header.c
> @@ -0,0 +1,48 @@
> +/*
> + * Copyright (c) 2011-2012 - Mauro Carvalho Chehab <mchehab@xxxxxxxxxx>

I'm not the author.

> + * Copyright (c) 2012 - Andre Roth <neolynx@xxxxxxxxx>
> + *
> + * 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 "descriptors/atsc_header.h"
> +#include "descriptors.h"
> +#include "dvb-fe.h"
> +
> +int atsc_table_header_init(struct atsc_table_header *t)
> +{
> +	bswap16(t->bitfield);
> +	bswap16(t->id);
> +	return 0;
> +}
> +
> +void atsc_table_header_print(struct dvb_v5_fe_parms *parms, const struct atsc_table_header *t)
> +{
> +	dvb_log("| table_id         %02x", t->table_id);
> +	dvb_log("| section_length   %d", t->section_length);
> +	dvb_log("| syntax           %d", t->syntax);
> +	dvb_log("| priv             %d", t->priv);
> +	dvb_log("| one              %d", t->one);
> +	dvb_log("| id               %d", t->id);
> +	dvb_log("| one2             %d", t->one2);
> +	dvb_log("| version          %d", t->version);
> +	dvb_log("| current_next     %d", t->current_next);
> +	dvb_log("| section_id       %d", t->section_id);
> +	dvb_log("| last_section     %d", t->last_section);
> +	dvb_log("| protocol_version %d", t->protocol_version);
> +}
> +
> diff --git a/lib/libdvbv5/descriptors/eit.c b/lib/libdvbv5/descriptors/eit.c
> index e70cf3b..5ecfc00 100644
> --- a/lib/libdvbv5/descriptors/eit.c
> +++ b/lib/libdvbv5/descriptors/eit.c
> @@ -67,7 +67,7 @@ void dvb_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize
>  		     sizeof(event->service_id);
>  
>  		bswap16(event->event_id);
> -		bswap16(event->bitfield);
> +		bswap16(event->bitfield); // FIXME: needed?

Why not needed?

>  		bswap16(event->bitfield2);
>  		event->descriptor = NULL;
>  		event->next = NULL;
> diff --git a/lib/libdvbv5/descriptors/mgt.c b/lib/libdvbv5/descriptors/mgt.c
> index 272d9d7..b362d51 100644
> --- a/lib/libdvbv5/descriptors/mgt.c
> +++ b/lib/libdvbv5/descriptors/mgt.c
> @@ -22,12 +22,12 @@
>  #include "descriptors/mgt.h"
>  #include "dvb-fe.h"
>  
> -void dvb_table_mgt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length)
> +void atsc_table_mgt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length)
>  {
>  	const uint8_t *p = buf;
> -	struct dvb_table_mgt *mgt = (struct dvb_table_mgt *) table;
> +	struct atsc_table_mgt *mgt = (struct atsc_table_mgt *) table;
>  	struct dvb_desc **head_desc;
> -	struct dvb_table_mgt_table **head;
> +	struct atsc_table_mgt_table **head;
>  	/*int desc_length;*/
>  
>  	if (*table_length > 0) {
> @@ -39,8 +39,8 @@ void dvb_table_mgt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize
>  		while (*head != NULL)
>  			head = &(*head)->next;
>  	} else {
> -		memcpy(table, p, sizeof(struct dvb_table_mgt) - sizeof(mgt->descriptor) - sizeof(mgt->table));
> -		*table_length = sizeof(struct dvb_table_mgt);
> +		memcpy(table, p, sizeof(struct atsc_table_mgt) - sizeof(mgt->descriptor) - sizeof(mgt->table));
> +		*table_length = sizeof(struct atsc_table_mgt);

Please check before copy. Also, use offset_of().
>  
>  		mgt->descriptor = NULL;
>  		mgt->table = NULL;
> @@ -48,16 +48,16 @@ void dvb_table_mgt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize
>  		head = &mgt->table;
>  		bswap16(mgt->tables);
>  	}
> -	p += sizeof(struct dvb_table_mgt) - sizeof(mgt->descriptor) - sizeof(mgt->table);
> +	p += sizeof(struct atsc_table_mgt) - sizeof(mgt->descriptor) - sizeof(mgt->table);
>  

Offset_of()

>  	/*dvb_parse_descriptors(parms, p, desc_length, head_desc);*/
>  	/*p += desc_length;*/
>          int i = 0;
> -	struct dvb_table_mgt_table *last = NULL;
> +	struct atsc_table_mgt_table *last = NULL;

Data declaration at the beginning.

>  	while (i++ < mgt->tables && (uint8_t *) p < buf + buflen - 4) {
> -		struct dvb_table_mgt_table *table = (struct dvb_table_mgt_table *) malloc(sizeof(struct dvb_table_mgt_table));
> -		memcpy(table, p, sizeof(struct dvb_table_mgt_table) - sizeof(table->descriptor) - sizeof(table->next));
> -		p += sizeof(struct dvb_table_mgt_table) - sizeof(table->descriptor) - sizeof(table->next);
> +		struct atsc_table_mgt_table *table = (struct atsc_table_mgt_table *) malloc(sizeof(struct atsc_table_mgt_table));
> +		memcpy(table, p, sizeof(struct atsc_table_mgt_table) - sizeof(table->descriptor) - sizeof(table->next));
> +		p += sizeof(struct atsc_table_mgt_table) - sizeof(table->descriptor) - sizeof(table->next);
>  

Same as above: data declaration at beginning, offset_of() and check before copy.

>  		bswap16(table->type);
>  		bswap16(table->bitfield);
> @@ -80,30 +80,35 @@ void dvb_table_mgt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize
>  	}
>  }
>  
> -void dvb_table_mgt_free(struct dvb_table_mgt *mgt)
> +void atsc_table_mgt_free(struct atsc_table_mgt *mgt)
>  {
> -	struct dvb_table_mgt_table *table = mgt->table;
> +	struct atsc_table_mgt_table *table = mgt->table;
>  	dvb_free_descriptors((struct dvb_desc **) &mgt->descriptor);
>  	while(table) {
>  		dvb_free_descriptors((struct dvb_desc **) &table->descriptor);
> -		struct dvb_table_mgt_table *tmp = table;
> +		struct atsc_table_mgt_table *tmp = table;

Data declaration at the beginning.

>  		table = table->next;
>  		free(tmp);
>  	}
>  	free(mgt);
>  }
>  
> -void dvb_table_mgt_print(struct dvb_v5_fe_parms *parms, struct dvb_table_mgt *mgt)
> +void atsc_table_mgt_print(struct dvb_v5_fe_parms *parms, struct atsc_table_mgt *mgt)
>  {
>  	dvb_log("MGT");
> -	dvb_table_header_print(parms, &mgt->header);
> -	dvb_log("| protocol_version %d", mgt->protocol_version);
> +	atsc_table_header_print(parms, &mgt->header);
>  	dvb_log("| tables           %d", mgt->tables);
>  	/*dvb_print_descriptors(parms, mgt->descriptor);*/
> -	const struct dvb_table_mgt_table *table = mgt->table;
> +	const struct atsc_table_mgt_table *table = mgt->table;
>  	uint16_t tables = 0;
>  	while(table) {
> -                dvb_log("|- type %04x  %d", table->type, table->pid);
> +                dvb_log("|- type %04x    %d", table->type, table->pid);
> +                dvb_log("|  one          %d", table->one);
> +                dvb_log("|  one2         %d", table->one2);
> +                dvb_log("|  type version %d", table->type_version);
> +                dvb_log("|  size         %d", table->size);
> +                dvb_log("|  one3         %d", table->one3);
> +                dvb_log("|  desc_length  %d", table->desc_length);
>  		dvb_print_descriptors(parms, table->descriptor);
>  		table = table->next;
>  		tables++;
> diff --git a/lib/libdvbv5/descriptors/vct.c b/lib/libdvbv5/descriptors/vct.c
> index e567f7a..493f184 100644
> --- a/lib/libdvbv5/descriptors/vct.c
> +++ b/lib/libdvbv5/descriptors/vct.c
> @@ -23,14 +23,14 @@
>  #include "dvb-fe.h"
>  #include "parse_string.h"
>  
> -void dvb_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
> +void atsc_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
>  			ssize_t buflen, uint8_t *table, ssize_t *table_length)
>  {
>  	const uint8_t *p = buf, *endbuf = buf + buflen - 4;
> -	struct dvb_table_vct *vct = (void *)table;
> -	struct dvb_table_vct_channel **head = &vct->channel;
> +	struct atsc_table_vct *vct = (void *)table;
> +	struct atsc_table_vct_channel **head = &vct->channel;
>  	int i, n;
> -	size_t size = offsetof(struct dvb_table_vct, channel);
> +	size_t size = offsetof(struct atsc_table_vct, channel);
>  
>  	if (p + size > endbuf) {
>  		dvb_logerr("VCT table was truncated. Need %zu bytes, but has only %zu.",
> @@ -45,16 +45,16 @@ void dvb_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
>  	} else {
>  		memcpy(vct, p, size);
>  
> -		*table_length = sizeof(struct dvb_table_vct);
> +		*table_length = sizeof(struct atsc_table_vct);
>  
>  		vct->channel = NULL;
>  		vct->descriptor = NULL;
>  	}
>  	p += size;
>  
> -	size = offsetof(struct dvb_table_vct_channel, descriptor);
> +	size = offsetof(struct atsc_table_vct_channel, descriptor);
>  	for (n = 0; n < vct->num_channels_in_section; n++) {
> -		struct dvb_table_vct_channel *channel;
> +		struct atsc_table_vct_channel *channel;
>  
>  		if (p + size > endbuf) {
>  			dvb_logerr("VCT channel table is missing %d elements",
> @@ -63,7 +63,7 @@ void dvb_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
>  			break;
>  		}
>  
> -		channel = malloc(sizeof(struct dvb_table_vct_channel));
> +		channel = malloc(sizeof(struct atsc_table_vct_channel));
>  
>  		memcpy(channel, p, size);
>  		p += size;
> @@ -75,7 +75,7 @@ void dvb_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
>  		bswap32(channel->carrier_frequency);
>  		bswap16(channel->channel_tsid);
>  		bswap16(channel->program_number);
> -		bswap16(channel->bitfield1);
> +		bswap32(channel->bitfield1);
>  		bswap16(channel->bitfield2);
>  		bswap16(channel->source_id);
>  		bswap16(channel->bitfield3);
> @@ -104,9 +104,9 @@ void dvb_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
>  	}
>  
>  	/* Get extra descriptors */
> -	size = sizeof(union dvb_table_vct_descriptor_length);
> +	size = sizeof(union atsc_table_vct_descriptor_length);
>  	while (p + size <= endbuf) {
> -		union dvb_table_vct_descriptor_length *d = (void *)p;
> +		union atsc_table_vct_descriptor_length *d = (void *)p;
>  		bswap16(d->descriptor_length);
>  		p += size;
>  		dvb_parse_descriptors(parms, p, d->descriptor_length,
> @@ -117,12 +117,12 @@ void dvb_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
>  			   endbuf - p);
>  }
>  
> -void dvb_table_vct_free(struct dvb_table_vct *vct)
> +void atsc_table_vct_free(struct atsc_table_vct *vct)
>  {
> -	struct dvb_table_vct_channel *channel = vct->channel;
> +	struct atsc_table_vct_channel *channel = vct->channel;
>  	while(channel) {
>  		dvb_free_descriptors((struct dvb_desc **) &channel->descriptor);
> -		struct dvb_table_vct_channel *tmp = channel;
> +		struct atsc_table_vct_channel *tmp = channel;
>  		channel = channel->next;
>  		free(tmp);
>  	}
> @@ -131,19 +131,19 @@ void dvb_table_vct_free(struct dvb_table_vct *vct)
>  	free(vct);
>  }
>  
> -void dvb_table_vct_print(struct dvb_v5_fe_parms *parms, struct dvb_table_vct *vct)
> +void atsc_table_vct_print(struct dvb_v5_fe_parms *parms, struct atsc_table_vct *vct)
>  {
> -	if (vct->header.table_id == DVB_TABLE_CVCT)
> +	if (vct->header.table_id == ATSC_TABLE_CVCT)
>  		dvb_log("CVCT");
>  	else
>  		dvb_log("TVCT");
>  
> -	dvb_table_header_print(parms, &vct->header);
> +	atsc_table_header_print(parms, &vct->header);
>  
>  	dvb_log("|- Protocol version %d", vct->ATSC_protocol_version);
>  	dvb_log("|- #channels        %d", vct->num_channels_in_section);
>  	dvb_log("|\\  channel_id");
> -	const struct dvb_table_vct_channel *channel = vct->channel;
> +	const struct atsc_table_vct_channel *channel = vct->channel;
>  	uint16_t channels = 0;
>  	while(channel) {
>  		dvb_log("|- Channel                %d.%d: %s",
> @@ -159,7 +159,7 @@ void dvb_table_vct_print(struct dvb_v5_fe_parms *parms, struct dvb_table_vct *vc
>  		dvb_log("|   access controlled     %d", channel->access_controlled);
>  		dvb_log("|   hidden                %d", channel->hidden);
>  
> -		if (vct->header.table_id == DVB_TABLE_CVCT) {
> +		if (vct->header.table_id == ATSC_TABLE_CVCT) {
>  			dvb_log("|   path select           %d", channel->path_select);
>  			dvb_log("|   out of band           %d", channel->out_of_band);
>  		}
> @@ -173,4 +173,3 @@ void dvb_table_vct_print(struct dvb_v5_fe_parms *parms, struct dvb_table_vct *vc
>  	}
>  	dvb_log("|_  %d channels", channels);
>  }
> -
> diff --git a/lib/libdvbv5/dvb-file.c b/lib/libdvbv5/dvb-file.c
> index b6fdc04..9abb1f7 100644
> --- a/lib/libdvbv5/dvb-file.c
> +++ b/lib/libdvbv5/dvb-file.c
> @@ -1027,7 +1027,7 @@ int store_dvb_channel(struct dvb_file **dvb_file,
>  	}
>  
>  	if (dvb_scan_handler->vct) {
> -		dvb_vct_channel_foreach(d, dvb_scan_handler->vct) {
> +		atsc_vct_channel_foreach(d, dvb_scan_handler->vct) {
>  			char *channel = NULL;
>  			char *vchannel = NULL;
>  
> diff --git a/lib/libdvbv5/dvb-scan.c b/lib/libdvbv5/dvb-scan.c
> index 421434e..bd9d2fb 100644
> --- a/lib/libdvbv5/dvb-scan.c
> +++ b/lib/libdvbv5/dvb-scan.c
> @@ -271,7 +271,7 @@ void dvb_scan_free_handler_table(struct dvb_v5_descriptors *dvb_scan_handler)
>  	if (dvb_scan_handler->pat)
>  		dvb_table_pat_free(dvb_scan_handler->pat);
>  	if (dvb_scan_handler->vct)
> -		dvb_table_vct_free(dvb_scan_handler->vct);
> +		atsc_table_vct_free(dvb_scan_handler->vct);
>  	if (dvb_scan_handler->nit)
>  		dvb_table_nit_free(dvb_scan_handler->nit);
>  	if (dvb_scan_handler->sdt)
> @@ -329,14 +329,14 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms,
>  			nit_time = 12;
>  			break;
>  		case SYS_ATSC:
> -			atsc_filter = DVB_TABLE_TVCT;
> +			atsc_filter = ATSC_TABLE_TVCT;
>  			pat_pmt_time = 2;
>  			vct_time = 2;
>  			sdt_time = 5;
>  			nit_time = 5;
>  			break;
>  		case SYS_DVBC_ANNEX_B:
> -			atsc_filter = DVB_TABLE_CVCT;
> +			atsc_filter = ATSC_TABLE_CVCT;
>  			pat_pmt_time = 2;
>  			vct_time = 2;
>  			sdt_time = 5;
> @@ -367,7 +367,7 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms,
>  	/* ATSC-specific VCT table */
>  	if (atsc_filter) {
>  		rc = dvb_read_section(parms, dmx_fd,
> -				      atsc_filter, DVB_TABLE_VCT_PID,
> +				      atsc_filter, ATSC_TABLE_VCT_PID,
>  				      (uint8_t **)&dvb_scan_handler->vct,
>  				      vct_time * timeout_multiply);
>  		if (parms->abort)
> @@ -375,7 +375,7 @@ struct dvb_v5_descriptors *dvb_get_ts_tables(struct dvb_v5_fe_parms *parms,
>  		if (rc < 0)
>  			dvb_logerr("error while waiting for VCT table");
>  		else if (parms->verbose)
> -			dvb_table_vct_print(parms, dvb_scan_handler->vct);
> +			atsc_table_vct_print(parms, dvb_scan_handler->vct);
>  	}
>  
>  	/* PMT tables */

The better is to split the data renames on a separate patch.
I don't like to rename it at the library, as others might be using
the library with the old names. So, we may need to add a compat code
for those using the legacy names.

-- 

Cheers,
Mauro
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux