@@ -78,7 +78,7 @@ struct dvb_v5_fe_parms;
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);
+ssize_t atsc_table_eit_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, struct atsc_table_eit *eit, 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);
@@ -40,7 +40,7 @@ struct dvb_v5_fe_parms;
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);
+ssize_t dvb_table_cat_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, struct dvb_table_cat *cat, 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);
@@ -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;
@@ -79,7 +79,7 @@ extern const char *dvb_eit_running_status_name[8];
extern "C" {
#endif
-void dvb_table_eit_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
+ssize_t dvb_table_eit_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, struct dvb_table_eit *eit, ssize_t *table_length);
void dvb_table_eit_free(struct dvb_table_eit *eit);
void dvb_table_eit_print(struct dvb_v5_fe_parms *parms, struct dvb_table_eit *eit);
void dvb_time(const uint8_t data[5], struct tm *tm);
@@ -68,7 +68,7 @@ struct dvb_v5_fe_parms;
extern "C" {
#endif
-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);
+ssize_t atsc_table_mgt_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, struct atsc_table_mgt *mgt, 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);
@@ -85,7 +85,7 @@ struct dvb_v5_fe_parms;
extern "C" {
#endif
-void dvb_table_nit_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
+ssize_t dvb_table_nit_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, struct dvb_table_nit *nit, ssize_t *table_length);
void dvb_table_nit_free(struct dvb_table_nit *nit);
void dvb_table_nit_print(struct dvb_v5_fe_parms *parms, struct dvb_table_nit *nit);
@@ -57,7 +57,7 @@ struct dvb_v5_fe_parms;
extern "C" {
#endif
-void dvb_table_pat_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
+ssize_t dvb_table_pat_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, struct dvb_table_pat *pat, ssize_t *table_length);
void dvb_table_pat_free(struct dvb_table_pat *pat);
void dvb_table_pat_print(struct dvb_v5_fe_parms *parms, struct dvb_table_pat *t);
@@ -112,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);
+ssize_t 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);
@@ -65,7 +65,7 @@ struct dvb_v5_fe_parms;
extern "C" {
#endif
-void dvb_table_sdt_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length);
+ssize_t dvb_table_sdt_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, struct dvb_table_sdt *sdt, ssize_t *table_lengh);
void dvb_table_sdt_free(struct dvb_table_sdt *sdt);
void dvb_table_sdt_print(struct dvb_v5_fe_parms *parms, struct dvb_table_sdt *sdt);
@@ -115,7 +115,7 @@ struct dvb_v5_fe_parms;
extern "C" {
#endif
-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);
+ssize_t atsc_table_vct_init (struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, struct atsc_table_vct *vct, 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);
@@ -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";
@@ -21,10 +21,10 @@
#include <libdvbv5/atsc_eit.h>
#include <libdvbv5/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)
+ssize_t atsc_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
+ ssize_t buflen, struct atsc_table_eit *eit, ssize_t *table_length)
{
const uint8_t *p = buf, *endbuf = buf + buflen - 4; /* minus CRC */;
- struct atsc_table_eit *eit = (struct atsc_table_eit *) table;
struct atsc_table_eit_event **head;
int i = 0;
struct atsc_table_eit_event *last = NULL;
@@ -33,7 +33,7 @@ void atsc_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssiz
if (p + size > endbuf) {
dvb_logerr("%s: short read %zd/%zd bytes", __func__,
size, endbuf - p);
- return;
+ return -1;
}
if (*table_length > 0) {
@@ -60,7 +60,7 @@ void atsc_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssiz
if (p + size > endbuf) {
dvb_logerr("%s: short read %zd/%zd bytes", __func__,
size, endbuf - p);
- return;
+ return -2;
}
event = (struct atsc_table_eit_event *) malloc(sizeof(struct atsc_table_eit_event));
memcpy(event, p, size);
@@ -78,7 +78,7 @@ void atsc_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssiz
if (p + size > endbuf) {
dvb_logerr("%s: short read %zd/%zd bytes", __func__,
size, endbuf - p);
- return;
+ return -3;
}
/* TODO: parse title */
p += size;
@@ -93,7 +93,7 @@ void atsc_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssiz
if (p + size > endbuf) {
dvb_logerr("%s: short read %zd/%zd bytes", __func__,
size, endbuf - p);
- return;
+ return -4;
}
memcpy(&dl, p, size);
p += size;
@@ -103,13 +103,16 @@ void atsc_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssiz
if (p + size > endbuf) {
dvb_logerr("%s: short read %zd/%zd bytes", __func__,
size, endbuf - p);
- return;
+ return -5;
}
dvb_parse_descriptors(parms, p, size, &event->descriptor);
p += size;
last = event;
}
+
+ *table_length = p - buf;
+ return p - buf;
}
void atsc_table_eit_free(struct atsc_table_eit *eit)
@@ -22,10 +22,9 @@
#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)
+ssize_t dvb_table_cat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
+ ssize_t buflen, struct dvb_table_cat *cat, 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;
@@ -33,7 +32,7 @@ void dvb_table_cat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (buf[0] != DVB_TABLE_CAT) {
dvb_logerr("%s: invalid marker 0x%02x, sould be 0x%02x", __func__, buf[0], DVB_TABLE_CAT);
*table_length = 0;
- return;
+ return -1;
}
if (*table_length > 0) {
@@ -46,15 +45,18 @@ void dvb_table_cat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
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;
+ return -2;
}
- memcpy(table, p, size);
+ memcpy(cat, p, size);
p += size;
*table_length = sizeof(struct dvb_table_cat);
size = endbuf - p;
dvb_parse_descriptors(parms, p, size, head_desc);
+
+ *table_length = p - buf;
+ return p - buf;
}
void dvb_table_cat_free(struct dvb_table_cat *cat)
@@ -22,10 +22,9 @@
#include <libdvbv5/eit.h>
#include <libdvbv5/dvb-fe.h>
-void dvb_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, uint8_t *table, ssize_t *table_length)
+ssize_t dvb_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize_t buflen, struct dvb_table_eit *eit, ssize_t *table_length)
{
const uint8_t *p = buf;
- struct dvb_table_eit *eit = (struct dvb_table_eit *) table;
struct dvb_table_eit_event **head;
if (*table_length > 0) {
@@ -90,6 +89,8 @@ void dvb_table_eit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssize
p += event->section_length;
last = event;
}
+ *table_length = p - buf;
+ return p - buf;
}
void dvb_table_eit_free(struct dvb_table_eit *eit)
@@ -21,10 +21,10 @@
#include <libdvbv5/mgt.h>
#include <libdvbv5/dvb-fe.h>
-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)
+ssize_t atsc_table_mgt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
+ ssize_t buflen, struct atsc_table_mgt *mgt, ssize_t *table_length)
{
const uint8_t *p = buf, *endbuf = buf + buflen - 4; /* minus CRC */
- struct atsc_table_mgt *mgt = (struct atsc_table_mgt *) table;
struct dvb_desc **head_desc;
struct atsc_table_mgt_table **head;
int i = 0;
@@ -34,7 +34,7 @@ void atsc_table_mgt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssiz
if (p + size > endbuf) {
dvb_logerr("%s: short read %zd/%zd bytes", __func__,
size, endbuf - p);
- return;
+ return -1;
}
if (*table_length > 0) {
@@ -48,7 +48,7 @@ void atsc_table_mgt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssiz
/* FIXME: read current mgt->tables for loop below */
} else {
- memcpy(table, p, size);
+ memcpy(mgt, p, size);
*table_length = sizeof(struct atsc_table_mgt);
bswap16(mgt->tables);
@@ -67,7 +67,7 @@ void atsc_table_mgt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssiz
if (p + size > endbuf) {
dvb_logerr("%s: short read %zd/%zd bytes", __func__,
size, endbuf - p);
- return;
+ return -2;
}
table = (struct atsc_table_mgt_table *) malloc(sizeof(struct atsc_table_mgt_table));
memcpy(table, p, size);
@@ -90,14 +90,18 @@ void atsc_table_mgt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf, ssiz
if (p + size > endbuf) {
dvb_logerr("%s: short read %zd/%zd bytes", __func__,
size, endbuf - p);
- return;
+ return -3;
}
dvb_parse_descriptors(parms, p, size, &table->descriptor);
p += size;
last = table;
}
+
/* TODO: parse MGT descriptors here into head_desc */
+
+ *table_length = p - buf;
+ return p - buf;
}
void atsc_table_mgt_free(struct atsc_table_mgt *mgt)
@@ -22,11 +22,10 @@
#include <libdvbv5/nit.h>
#include <libdvbv5/dvb-fe.h>
-void dvb_table_nit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
- ssize_t buflen, uint8_t *table, ssize_t *table_length)
+ssize_t dvb_table_nit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
+ ssize_t buflen, struct dvb_table_nit *nit, ssize_t *table_length)
{
const uint8_t *p = buf, *endbuf = buf + buflen - 4;
- struct dvb_table_nit *nit = (void *)table;
struct dvb_desc **head_desc = &nit->descriptor;
struct dvb_table_nit_transport **head = &nit->transport;
size_t size;
@@ -43,7 +42,7 @@ void dvb_table_nit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
size = offsetof(struct dvb_table_nit, descriptor);
if (p + size > endbuf) {
dvb_logerr("NIT table (cont) was truncated");
- return;
+ return -1;
}
p += size;
t = (struct dvb_table_nit *)buf;
@@ -55,9 +54,9 @@ void dvb_table_nit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (p + size > endbuf) {
dvb_logerr("NIT table was truncated while filling dvb_table_nit. Need %zu bytes, but has only %zu.",
size, buflen);
- return;
+ return -2;
}
- memcpy(table, p, size);
+ memcpy(nit, p, size);
p += size;
*table_length = sizeof(struct dvb_table_nit);
@@ -71,7 +70,7 @@ void dvb_table_nit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (p + size > endbuf) {
dvb_logerr("NIT table was truncated while getting NIT descriptors. Need %zu bytes, but has only %zu.",
size, endbuf - p);
- return;
+ return -3;
}
dvb_parse_descriptors(parms, p, size, head_desc);
p += size;
@@ -80,7 +79,7 @@ void dvb_table_nit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (p + size > endbuf) {
dvb_logerr("NIT table was truncated while getting NIT transports. Need %zu bytes, but has only %zu.",
size, endbuf - p);
- return;
+ return -4;
}
p += size;
@@ -90,8 +89,8 @@ void dvb_table_nit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
transport = malloc(sizeof(struct dvb_table_nit_transport));
if (!transport) {
- dvb_perror("Out of memory");
- return;
+ dvb_perror(__func__);
+ return -5;
}
memcpy(transport, p, size);
p += size;
@@ -111,7 +110,7 @@ void dvb_table_nit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (p + transport->section_length > endbuf) {
dvb_logerr("NIT table was truncated while getting NIT transport descriptors. Need %u bytes, but has only %zu.",
transport->section_length, endbuf - p);
- return;
+ return -6;
}
dvb_parse_descriptors(parms, p, transport->section_length, head_desc);
p += transport->section_length;
@@ -119,6 +118,8 @@ void dvb_table_nit_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (endbuf - p)
dvb_logerr("NIT table has %zu spurious bytes at the end.",
endbuf - p);
+ *table_length = p - buf;
+ return p - buf;
}
void dvb_table_nit_free(struct dvb_table_nit *nit)
@@ -23,10 +23,9 @@
#include <libdvbv5/descriptors.h>
#include <libdvbv5/dvb-fe.h>
-void dvb_table_pat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
- ssize_t buflen, uint8_t *table, ssize_t *table_length)
+ssize_t dvb_table_pat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
+ ssize_t buflen, struct dvb_table_pat *pat, ssize_t *table_length)
{
- struct dvb_table_pat *pat = (void *)table;
struct dvb_table_pat_program **head = &pat->program;
const uint8_t *p = buf, *endbuf = buf + buflen - 4;
size_t size;
@@ -40,9 +39,9 @@ void dvb_table_pat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (p + size > endbuf) {
dvb_logerr("PAT table was truncated. Need %zu bytes, but has only %zu.",
size, buflen);
- return;
+ return -1;
}
- memcpy(table, buf, size);
+ memcpy(pat, buf, size);
p += size;
pat->programs = 0;
pat->program = NULL;
@@ -56,7 +55,7 @@ void dvb_table_pat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
pgm = malloc(sizeof(struct dvb_table_pat_program));
if (!pgm) {
dvb_perror("Out of memory");
- return;
+ return -2;
}
memcpy(pgm, p, size);
@@ -74,6 +73,8 @@ void dvb_table_pat_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (endbuf - p)
dvb_logerr("PAT table has %zu spurious bytes at the end.",
endbuf - p);
+ *table_length = p - buf;
+ return p - buf;
}
void dvb_table_pat_free(struct dvb_table_pat *pat)
@@ -25,18 +25,17 @@
#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 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)
{
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;
if (buf[0] != DVB_TABLE_PMT) {
dvb_logerr("%s: invalid marker 0x%02x, sould be 0x%02x", __func__, buf[0], DVB_TABLE_PMT);
*table_length = 0;
- return;
+ return -1;
}
if (*table_length > 0) {
@@ -48,7 +47,7 @@ void dvb_table_pmt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (p + size > endbuf) {
dvb_logerr("%s: short read %zd/%zd bytes", __func__,
size, endbuf - p);
- return;
+ return -2;
}
memcpy(pmt, p, size);
p += size;
@@ -109,6 +108,7 @@ void dvb_table_pmt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
__func__, endbuf - p);
*table_length = p - buf;
+ return p - buf;
}
void dvb_table_pmt_free(struct dvb_table_pmt *pmt)
@@ -22,11 +22,10 @@
#include <libdvbv5/sdt.h>
#include <libdvbv5/dvb-fe.h>
-void dvb_table_sdt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
- ssize_t buflen, uint8_t *table, ssize_t *table_length)
+ssize_t dvb_table_sdt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
+ ssize_t buflen, struct dvb_table_sdt *sdt, ssize_t *table_length)
{
const uint8_t *p = buf, *endbuf = buf + buflen - 4;
- struct dvb_table_sdt *sdt = (void *)table;
struct dvb_table_sdt_service **head = &sdt->service;
size_t size = offsetof(struct dvb_table_sdt, service);
@@ -38,7 +37,7 @@ void dvb_table_sdt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (p + size > endbuf) {
dvb_logerr("SDT table was truncated. Need %zu bytes, but has only %zu.",
size, buflen);
- return;
+ return -1;
}
memcpy(sdt, p, size);
*table_length = sizeof(struct dvb_table_sdt);
@@ -75,6 +74,9 @@ void dvb_table_sdt_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (endbuf - p)
dvb_logerr("SDT table has %zu spurious bytes at the end.",
endbuf - p);
+
+ *table_length = p - buf;
+ return p - buf;
}
void dvb_table_sdt_free(struct dvb_table_sdt *sdt)
@@ -23,11 +23,10 @@
#include <libdvbv5/dvb-fe.h>
#include <parse_string.h>
-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)
+ssize_t atsc_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
+ ssize_t buflen, struct atsc_table_vct *vct, ssize_t *table_length)
{
const uint8_t *p = buf, *endbuf = buf + buflen - 4;
- struct atsc_table_vct *vct = (void *)table;
struct atsc_table_vct_channel **head = &vct->channel;
int i, n;
size_t size = offsetof(struct atsc_table_vct, channel);
@@ -35,7 +34,7 @@ void atsc_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (p + size > endbuf) {
dvb_logerr("VCT table was truncated. Need %zu bytes, but has only %zu.",
size, buflen);
- return;
+ return -1;
}
if (*table_length > 0) {
@@ -99,7 +98,7 @@ void atsc_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (endbuf - p < channel->descriptors_length) {
dvb_logerr("%s: short read %d/%zd bytes", __func__,
channel->descriptors_length, endbuf - p);
- return;
+ return -2;
}
/* get the descriptors for each program */
@@ -118,7 +117,7 @@ void atsc_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (endbuf - p < d->descriptor_length) {
dvb_logerr("%s: short read %d/%zd bytes", __func__,
d->descriptor_length, endbuf - p);
- return;
+ return -3;
}
dvb_parse_descriptors(parms, p, d->descriptor_length,
&vct->descriptor);
@@ -126,6 +125,8 @@ void atsc_table_vct_init(struct dvb_v5_fe_parms *parms, const uint8_t *buf,
if (endbuf - p)
dvb_logerr("VCT table has %zu spurious bytes at the end.",
endbuf - p);
+ *table_length = p - buf;
+ return p - buf;
}
void atsc_table_vct_free(struct atsc_table_vct *vct)
this will allow simplifying the parser functions and to return the number of bytes read or an error code. Signed-off-by: André Roth <neolynx@gmail.com> --- lib/include/libdvbv5/atsc_eit.h | 2 +- lib/include/libdvbv5/cat.h | 2 +- lib/include/libdvbv5/descriptors.h | 2 +- lib/include/libdvbv5/eit.h | 2 +- lib/include/libdvbv5/mgt.h | 2 +- lib/include/libdvbv5/nit.h | 2 +- lib/include/libdvbv5/pat.h | 2 +- lib/include/libdvbv5/pmt.h | 2 +- lib/include/libdvbv5/sdt.h | 2 +- lib/include/libdvbv5/vct.h | 2 +- lib/libdvbv5/descriptors.c | 24 +++++++++++++----------- lib/libdvbv5/descriptors/atsc_eit.c | 17 ++++++++++------- lib/libdvbv5/descriptors/cat.c | 14 ++++++++------ lib/libdvbv5/descriptors/eit.c | 5 +++-- lib/libdvbv5/descriptors/mgt.c | 16 ++++++++++------ lib/libdvbv5/descriptors/nit.c | 23 ++++++++++++----------- lib/libdvbv5/descriptors/pat.c | 13 +++++++------ lib/libdvbv5/descriptors/pmt.c | 10 +++++----- lib/libdvbv5/descriptors/sdt.c | 10 ++++++---- lib/libdvbv5/descriptors/vct.c | 13 +++++++------ 20 files changed, 91 insertions(+), 74 deletions(-)