added component descriptor

This commit is contained in:
hummypkg 2011-06-02 14:38:25 +00:00 committed by HummyPkg
parent db87f8326e
commit edbc4aedea
5 changed files with 111 additions and 21 deletions

View File

@ -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;
}

View File

@ -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
View File

@ -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;

42
test Normal file
View File

@ -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
View File

@ -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))