add support for descriptor 78
This commit is contained in:
parent
874e8bb6b8
commit
bb729d2802
37
descriptor.c
37
descriptor.c
|
@ -86,6 +86,31 @@ read_descriptor(struct epg *epg, struct descriptor *d)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DS_EXTENDED_EVENT:
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
epg->offset++; /* Skip descriptor number and last descriptor */
|
||||||
|
memcpy(d->content.d78.lang, epg->bin + epg->offset, 3);
|
||||||
|
epg->offset += 3;
|
||||||
|
|
||||||
|
d->content.d78.items = epg->bin[epg->offset++];
|
||||||
|
if (debug > 1 && d->content.d78.items > 0)
|
||||||
|
printf("Extended event items: %d\n",
|
||||||
|
d->content.d78.items);
|
||||||
|
/* Skip items. */
|
||||||
|
for (i = 0; i < d->content.d78.items; i++)
|
||||||
|
{
|
||||||
|
int l = epg->bin[epg->offset++];
|
||||||
|
epg->offset += l;
|
||||||
|
}
|
||||||
|
|
||||||
|
d->content.d78.text =
|
||||||
|
read_lstring(epg, &d->content.d78.textlen);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case DS_COMPONENT:
|
case DS_COMPONENT:
|
||||||
memcpy(&d->content.d80, epg->bin + epg->offset, 6);
|
memcpy(&d->content.d80, epg->bin + epg->offset, 6);
|
||||||
epg->offset += 6;
|
epg->offset += 6;
|
||||||
|
@ -216,6 +241,11 @@ free_descriptor(struct descriptor *d)
|
||||||
free(d->content.d77.text);
|
free(d->content.d77.text);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DS_EXTENDED_EVENT:
|
||||||
|
if (d->content.d78.text)
|
||||||
|
free(d->content.d78.text);
|
||||||
|
break;
|
||||||
|
|
||||||
case DS_COMPONENT:
|
case DS_COMPONENT:
|
||||||
if (d->content.d80.text)
|
if (d->content.d80.text)
|
||||||
free(d->content.d80.text);
|
free(d->content.d80.text);
|
||||||
|
@ -325,6 +355,13 @@ dump_descriptor(struct descriptor *d, int content)
|
||||||
DUMPHEX(d, content.d77.text, d->content.d77.textlen);
|
DUMPHEX(d, content.d77.text, d->content.d77.textlen);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DS_EXTENDED_EVENT:
|
||||||
|
DUMPNSTR(d, content.d78.lang, 3);
|
||||||
|
DUMPINT(d, content.d78.items);
|
||||||
|
DUMPINT(d, content.d78.textlen);
|
||||||
|
DUMPHEX(d, content.d78.text, d->content.d78.textlen);
|
||||||
|
break;
|
||||||
|
|
||||||
case DS_COMPONENT:
|
case DS_COMPONENT:
|
||||||
DUMPINT(d, content.d80.stream_content);
|
DUMPINT(d, content.d80.stream_content);
|
||||||
DUMPINT(d, content.d80.reserved);
|
DUMPINT(d, content.d80.reserved);
|
||||||
|
|
20
descriptor.h
20
descriptor.h
|
@ -3,11 +3,12 @@
|
||||||
* by af123, 2011
|
* by af123, 2011
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define DS_LINKAGE 74
|
#define DS_LINKAGE 74 /* 0x4a */
|
||||||
#define DS_SHORT_EVENT 77
|
#define DS_SHORT_EVENT 77 /* 0x4d */
|
||||||
#define DS_COMPONENT 80
|
#define DS_EXTENDED_EVENT 78 /* 0x4e */
|
||||||
#define DS_CONTENT 84
|
#define DS_COMPONENT 80 /* 0x50 */
|
||||||
#define DS_PRIVATE_DATA_SPECIFIER 95
|
#define DS_CONTENT 84 /* 0x54 */
|
||||||
|
#define DS_PRIVATE_DATA_SPECIFIER 95 /* 0x5f */
|
||||||
#define DS_CONTENT_IDENTIFIER 118
|
#define DS_CONTENT_IDENTIFIER 118
|
||||||
#define DS_FTA_CONTENT_MGMT 126
|
#define DS_FTA_CONTENT_MGMT 126
|
||||||
#define DS_USER_DEFINED 137
|
#define DS_USER_DEFINED 137
|
||||||
|
@ -18,7 +19,8 @@
|
||||||
#define PARSER_CRID_EVENT 3
|
#define PARSER_CRID_EVENT 3
|
||||||
#define PARSER_CRID_SERIES 4
|
#define PARSER_CRID_SERIES 4
|
||||||
#define PARSER_CRID_REC 5
|
#define PARSER_CRID_REC 5
|
||||||
#define PARSER_MAX 6
|
#define PARSER_EXTENDED_EVENT 6
|
||||||
|
#define PARSER_MAX 7
|
||||||
|
|
||||||
#define CRIDT_EVENT '1'
|
#define CRIDT_EVENT '1'
|
||||||
#define CRIDT_SERIES '2'
|
#define CRIDT_SERIES '2'
|
||||||
|
@ -44,6 +46,12 @@ struct descriptor {
|
||||||
char *name;
|
char *name;
|
||||||
char *text;
|
char *text;
|
||||||
} d77; /* SHORT_EVENT */
|
} d77; /* SHORT_EVENT */
|
||||||
|
struct {
|
||||||
|
char lang[3];
|
||||||
|
unsigned int items;
|
||||||
|
unsigned int textlen;
|
||||||
|
char *text;
|
||||||
|
} d78; /* EXTENDED_EVENT */
|
||||||
struct {
|
struct {
|
||||||
unsigned int stream_content:4;
|
unsigned int stream_content:4;
|
||||||
unsigned int reserved:4;
|
unsigned int reserved:4;
|
||||||
|
|
49
epg.c
49
epg.c
|
@ -288,8 +288,12 @@ parse(char *epgpath,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debug)
|
if (debug)
|
||||||
printf("Checking descriptor: %d (%d)\n",
|
printf("Checking descriptor: "
|
||||||
dstag, dslen);
|
"%d/%#x (%d)\n",
|
||||||
|
dstag, dstag, dslen);
|
||||||
|
if (debug > 3)
|
||||||
|
hexdump(epg->bin + epg->offset,
|
||||||
|
dslen + 2, 0);
|
||||||
|
|
||||||
switch (dstag)
|
switch (dstag)
|
||||||
{
|
{
|
||||||
|
@ -300,6 +304,13 @@ parse(char *epgpath,
|
||||||
dslist[PARSER_SHORT_EVENT] = ds;
|
dslist[PARSER_SHORT_EVENT] = ds;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DS_EXTENDED_EVENT:
|
||||||
|
if (!(ds = read_descriptor_header(epg)))
|
||||||
|
break;
|
||||||
|
read_descriptor(epg, ds);
|
||||||
|
dslist[PARSER_EXTENDED_EVENT] = ds;
|
||||||
|
break;
|
||||||
|
|
||||||
case DS_CONTENT_IDENTIFIER:
|
case DS_CONTENT_IDENTIFIER:
|
||||||
if (!(ds = read_descriptor_header(epg)))
|
if (!(ds = read_descriptor_header(epg)))
|
||||||
break;
|
break;
|
||||||
|
@ -347,17 +358,39 @@ parse(char *epgpath,
|
||||||
*/
|
*/
|
||||||
|
|
||||||
default:
|
default:
|
||||||
if (debug > 3)
|
if (debug > 2)
|
||||||
{
|
printf("! Unhandled.\n");
|
||||||
printf("Unhandled.\n");
|
|
||||||
hexdump(epg->bin + epg->offset,
|
|
||||||
dslen + 2, 0);
|
|
||||||
}
|
|
||||||
epg->offset += dslen + 2;
|
epg->offset += dslen + 2;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Move synopsis from extended event descriptor into
|
||||||
|
* short description if appropriate. */
|
||||||
|
if (dslist[PARSER_SHORT_EVENT] &&
|
||||||
|
dslist[PARSER_EXTENDED_EVENT] &&
|
||||||
|
dslist[PARSER_EXTENDED_EVENT]->content.d78.textlen
|
||||||
|
> 0 &&
|
||||||
|
dslist[PARSER_SHORT_EVENT]->content.d77.textlen
|
||||||
|
== 2 &&
|
||||||
|
dslist[PARSER_SHORT_EVENT]->content.d77.text[1]
|
||||||
|
== '\0')
|
||||||
|
{
|
||||||
|
if (debug > 3)
|
||||||
|
printf("Moving event text from "
|
||||||
|
"extended to short event.\n");
|
||||||
|
free(dslist[PARSER_SHORT_EVENT]
|
||||||
|
->content.d77.text);
|
||||||
|
dslist[PARSER_SHORT_EVENT]->content.d77.text
|
||||||
|
= dslist[PARSER_EXTENDED_EVENT]->
|
||||||
|
content.d78.text;
|
||||||
|
dslist[PARSER_SHORT_EVENT]->content.d77.textlen
|
||||||
|
= dslist[PARSER_EXTENDED_EVENT]->
|
||||||
|
content.d78.textlen;
|
||||||
|
dslist[PARSER_EXTENDED_EVENT]->content.d78.text
|
||||||
|
= (char *)NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
(
|
(
|
||||||
!(filterflags & FILTER_CRID) ||
|
!(filterflags & FILTER_CRID) ||
|
||||||
|
|
17
main.c
17
main.c
|
@ -75,6 +75,7 @@ syntax()
|
||||||
" now Show what is currently on.\n"
|
" now Show what is currently on.\n"
|
||||||
" first Show the time of the earliest record.\n"
|
" first Show the time of the earliest record.\n"
|
||||||
" last Show the time of the latest record.\n"
|
" last Show the time of the latest record.\n"
|
||||||
|
" d78 Check for records with d78.\n"
|
||||||
" parse Parse the EPG, no output.\n"
|
" parse Parse the EPG, no output.\n"
|
||||||
" search <text> Search programme names for text.\n"
|
" search <text> Search programme names for text.\n"
|
||||||
" searchall <text> "
|
" searchall <text> "
|
||||||
|
@ -127,6 +128,20 @@ earliest(struct epg *epg __attribute__((unused)),
|
||||||
latest_stamp = tm;
|
latest_stamp = tm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
d78check(struct epg *epg __attribute__((unused)),
|
||||||
|
struct section *s __attribute__((unused)),
|
||||||
|
struct data *d __attribute__((unused)),
|
||||||
|
struct descriptor **ds __attribute__((unused)),
|
||||||
|
void *var __attribute__((unused)))
|
||||||
|
{
|
||||||
|
if (ds[PARSER_EXTENDED_EVENT])
|
||||||
|
{
|
||||||
|
printf("Found descriptor 78 in event.\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
dumpraw(struct epg *epg __attribute__((unused)),
|
dumpraw(struct epg *epg __attribute__((unused)),
|
||||||
struct section *s, struct data *d, struct descriptor **ds,
|
struct section *s, struct data *d, struct descriptor **ds,
|
||||||
|
@ -832,6 +847,8 @@ nextopt:
|
||||||
parse(epgpath, latest, NULL, filter);
|
parse(epgpath, latest, NULL, filter);
|
||||||
printf("%ld\n", latest_stamp);
|
printf("%ld\n", latest_stamp);
|
||||||
}
|
}
|
||||||
|
else if (!strcmp(argv[0], "d78"))
|
||||||
|
parse(epgpath, d78check, NULL, filter);
|
||||||
else if (!strcmp(argv[0], "first"))
|
else if (!strcmp(argv[0], "first"))
|
||||||
{
|
{
|
||||||
parse(epgpath, earliest, NULL, filter);
|
parse(epgpath, earliest, NULL, filter);
|
||||||
|
|
Loading…
Reference in New Issue