added component descriptor
This commit is contained in:
parent
db87f8326e
commit
edbc4aedea
56
descriptor.c
56
descriptor.c
|
@ -24,13 +24,35 @@ read_descriptor_header(struct epg *epg)
|
|||
return &d;
|
||||
}
|
||||
|
||||
static char *
|
||||
string_to_end(struct epg *epg, struct descriptor *d, int sofar,
|
||||
unsigned int *len)
|
||||
{
|
||||
int rest = d->len - sofar;
|
||||
char *str;
|
||||
|
||||
printf("string_to_end(%d, %d, %d)\n", d->len, sofar, rest);
|
||||
|
||||
*len = rest;
|
||||
|
||||
if (rest <= 0)
|
||||
return NULL;;
|
||||
|
||||
str = (char *)malloc(rest + 1);
|
||||
memcpy(str, epg->bin + epg->offset, rest);
|
||||
str[rest] = '\0';
|
||||
epg->offset += rest;
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
void
|
||||
read_descriptor(struct epg *epg, struct descriptor *d)
|
||||
{
|
||||
switch (d->tag)
|
||||
{
|
||||
case 77:
|
||||
memcpy(d->content.d77.language, epg->bin + epg->offset, 3);
|
||||
case DS_SHORT_EVENT:
|
||||
memcpy(d->content.d77.lang, epg->bin + epg->offset, 3);
|
||||
epg->offset += 3;
|
||||
|
||||
d->content.d77.namelen = epg->bin[epg->offset++];
|
||||
|
@ -45,6 +67,14 @@ read_descriptor(struct epg *epg, struct descriptor *d)
|
|||
|
||||
break;
|
||||
|
||||
case DS_COMPONENT:
|
||||
memcpy(&d->content.d80, epg->bin + epg->offset, 6);
|
||||
epg->offset += 6;
|
||||
|
||||
d->content.d80.text = string_to_end(epg, d, 6,
|
||||
&d->content.d80.textlen);
|
||||
break;
|
||||
|
||||
default:
|
||||
epg->offset += d->len;
|
||||
break;
|
||||
|
@ -63,8 +93,14 @@ free_descriptor(struct descriptor *d)
|
|||
switch (d->tag)
|
||||
{
|
||||
case DS_SHORT_EVENT:
|
||||
free(d->content.d77.name);
|
||||
free(d->content.d77.text);
|
||||
if (d->content.d77.name)
|
||||
free(d->content.d77.name);
|
||||
if (d->content.d77.text)
|
||||
free(d->content.d77.text);
|
||||
break;
|
||||
case DS_COMPONENT:
|
||||
if (d->content.d80.text)
|
||||
free(d->content.d80.text);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -103,7 +139,7 @@ dump_descriptor(struct descriptor *d, int content)
|
|||
switch (d->tag)
|
||||
{
|
||||
case DS_SHORT_EVENT:
|
||||
DUMPNSTR(d, content.d77.language, 3);
|
||||
DUMPNSTR(d, content.d77.lang, 3);
|
||||
DUMPINT(d, content.d77.namelen);
|
||||
//DUMPNSTR(d, content.d77.name, d->content.d77.namelen);
|
||||
DUMPHEX(d, content.d77.name, d->content.d77.namelen);
|
||||
|
@ -112,6 +148,16 @@ dump_descriptor(struct descriptor *d, int content)
|
|||
DUMPHEX(d, content.d77.text, d->content.d77.textlen);
|
||||
break;
|
||||
|
||||
case DS_COMPONENT:
|
||||
DUMPINT(d, content.d80.stream_content);
|
||||
DUMPINT(d, content.d80.reserved);
|
||||
DUMPINT(d, content.d80.type);
|
||||
DUMPINT(d, content.d80.tag);
|
||||
DUMPNSTR(d, content.d80.lang, 3);
|
||||
if (d->content.d80.textlen)
|
||||
DUMPHEX(d, content.d80.text, d->content.d80.textlen);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
11
descriptor.h
11
descriptor.h
|
@ -12,12 +12,21 @@ struct descriptor {
|
|||
unsigned int len:8;
|
||||
union {
|
||||
struct {
|
||||
char language[3];
|
||||
char lang[3];
|
||||
unsigned int namelen:8;
|
||||
unsigned int textlen:8;
|
||||
char *name;
|
||||
char *text;
|
||||
} d77;
|
||||
struct {
|
||||
unsigned int stream_content:4;
|
||||
unsigned int reserved:4;
|
||||
unsigned int type:8;
|
||||
unsigned int tag:8;
|
||||
char lang[3];
|
||||
char *text;
|
||||
unsigned int textlen;
|
||||
} d80;
|
||||
} content;
|
||||
};
|
||||
|
||||
|
|
20
main.c
20
main.c
|
@ -48,7 +48,7 @@ main(int argc, char **argv)
|
|||
|
||||
if (!(h = read_section(epg)))
|
||||
break;
|
||||
//dump_section(h);
|
||||
dump_section(h);
|
||||
|
||||
send = epg->offset - 11 + h->u1.u.length - 4;
|
||||
|
||||
|
@ -59,7 +59,7 @@ main(int argc, char **argv)
|
|||
|
||||
if (!(d = read_data(epg)))
|
||||
break;
|
||||
//dump_data(d);
|
||||
dump_data(d);
|
||||
|
||||
dend = epg->offset + d->u1.u.descriptors_loop_length;
|
||||
while (epg->offset < dend)
|
||||
|
@ -67,17 +67,8 @@ main(int argc, char **argv)
|
|||
struct descriptor *ds;
|
||||
|
||||
ds = read_descriptor_header(epg);
|
||||
if (ds->tag == DS_SHORT_EVENT)
|
||||
{
|
||||
read_descriptor(epg, ds);
|
||||
dump_descriptor(ds, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
dump_descriptor(ds, 0);
|
||||
skip_descriptor(epg, ds);
|
||||
}
|
||||
printf("Offset: %d / %d\n", epg->offset, dend);
|
||||
read_descriptor(epg, ds);
|
||||
dump_descriptor(ds, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -87,9 +78,10 @@ printf("Offset: %d / %d\n", epg->offset, dend);
|
|||
/* Skip padding bytes... */
|
||||
while (epg->bin[epg->offset] == 'U')
|
||||
epg->offset++;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
stop:
|
||||
close_file(epg);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
{'CRC_32': 3423408323L,
|
||||
'current_next_indicator': 1,
|
||||
'datas': [{'descriptors': [{'descriptor_length': 2,
|
||||
'descriptor_tag': 84,
|
||||
'unknown': '\x00\x00'},
|
||||
{'ISO_639_language_code': 'eng',
|
||||
'component_tag': 1,
|
||||
'component_type': 1,
|
||||
'descriptor_length': 6,
|
||||
'descriptor_tag': 80,
|
||||
'reserved_future_use': 15,
|
||||
'stream_content': 2,
|
||||
'text': ''},
|
||||
{'ISO_639_language_code': 'eng',
|
||||
'descriptor_length': 38,
|
||||
'descriptor_tag': 77,
|
||||
'event_name': '\x1f\x01\x05g60\xe3/U\x86$~\xe8\x80',
|
||||
'event_name_length': 14,
|
||||
'text': '\x1f\x01\xa9\x89\x1f\xbaS/UO\xaf\xb6\x9dNj\xc8a\xeb\x9d',
|
||||
'text_length': 19}],
|
||||
'descriptors_loop_length': 52,
|
||||
'duration': datetime.timedelta(0, 21600),
|
||||
'event_id': 795,
|
||||
'free_CA_mode': 0,
|
||||
'running_status': 0,
|
||||
'start_time': datetime.datetime(2011, 6, 1, 0, 0)}],
|
||||
'last_section_number': 248,
|
||||
'last_table_id': 97,
|
||||
'original_network_id': 9018,
|
||||
'pre_header_1': '(Gq\x87\x00\x00\x00\x00\x02\x00\x00\x00\x00\x01',
|
||||
'pre_header_2': '\x00\x00\x00\x00',
|
||||
'reserved': 3,
|
||||
'reserved_future_use': 1,
|
||||
'section_length': 79,
|
||||
'section_number': 0,
|
||||
'section_syntax_indicator': 1,
|
||||
'segment_last_section_number': 0,
|
||||
'service_id': 26560,
|
||||
'table_id': 96,
|
||||
'total_length': 84,
|
||||
'transport_stream_id': 24576,
|
||||
'version_number': 6}
|
3
util.h
3
util.h
|
@ -7,5 +7,6 @@
|
|||
#define DUMPINT(ss,xx) printf(" %30s: %d\n", #xx, ss->xx)
|
||||
#define DUMPSTR(ss,xx) printf(" %30s: %s\n", #xx, ss->xx)
|
||||
#define DUMPNSTR(ss,xx,nn) printf(" %30s: %.*s\n", #xx, nn, ss->xx)
|
||||
#define DUMPHEX(ss,xx,nn) printf(" %30s: %s\n", #xx, hexstr(ss->xx, nn))
|
||||
#define DUMPHEX(ss,xx,nn) printf(" %30s: %s\n", #xx, \
|
||||
hexstr((uint8_t *)ss->xx, nn))
|
||||
|
||||
|
|
Loading…
Reference in New Issue