Added CRID support which will be useful for Freesat code.

This commit is contained in:
Adam Sutton 2012-07-11 17:01:17 +01:00
parent f1281518b7
commit eb49a06162
2 changed files with 68 additions and 9 deletions

View file

@ -48,6 +48,7 @@
#define DVB_DESC_TELETEXT 0x56
#define DVB_DESC_SUBTITLE 0x59
#define DVB_DESC_AC3 0x6a
#define DVB_DESC_CRID 0x76
#define DVB_DESC_EAC3 0x7a
#define DVB_DESC_AAC 0x7c
#define DVB_DESC_LOCAL_CHAN 0x83

View file

@ -40,8 +40,11 @@ typedef struct eit_status
typedef struct eit_event
{
char title[256];
char summary[256];
char uri[257];
char suri[257];
char title[257];
char summary[257];
char desc[2000];
char *default_charset;
@ -250,6 +253,47 @@ static int _eit_desc_content
return 0;
}
/*
* Content ID
*/
static int _eit_desc_crid
( uint8_t *ptr, int len, eit_event_t *ev )
{
int r;
uint8_t type;
while (len > 3) {
/* Explicit only */
if ( (*ptr & 0x3) == 0 ) {
type = *ptr >> 2;
/* Episode */
if (type == 0x1 || type == 0x31) {
r = dvb_get_string_with_len(ev->uri, sizeof(ev->uri),
ptr+1, len-1, ev->default_charset);
/* Season */
} else if (type == 0x2 || type == 0x32) {
r = dvb_get_string_with_len(ev->suri, sizeof(ev->suri),
ptr+1, len-1, ev->default_charset);
/* Unknown */
} else {
r = ptr[1] + 1;
}
/* Next */
if (r < 0) return -1;
len -= 1 + r;
ptr += 1 + r;
}
}
return 0;
}
/* ************************************************************************
* EIT Event
* ***********************************************************************/
@ -266,6 +310,7 @@ static int _eit_process_event
uint8_t dtag, dlen;
epg_broadcast_t *ebc;
epg_episode_t *ee;
epg_season_t *es;
eit_event_t ev;
if ( len < 12 ) return -1;
@ -323,6 +368,9 @@ static int _eit_process_event
r = _eit_desc_parental(ptr, dlen, &ev);
break;
#endif
case DVB_DESC_CRID:
r = _eit_desc_crid(ptr, dlen, &ev);
break;
default:
r = 0;
_eit_dtag_dump(dtag, dlen, ptr);
@ -334,26 +382,29 @@ static int _eit_process_event
ptr += dlen;
}
/* Metadata */
/* Broadcast Metadata */
*save |= epg_broadcast_set_is_hd(ebc, ev.hd, mod);
*save |= epg_broadcast_set_is_widescreen(ebc, ev.ws, mod);
*save |= epg_broadcast_set_is_audio_desc(ebc, ev.ad, mod);
*save |= epg_broadcast_set_is_subtitled(ebc, ev.st, mod);
*save |= epg_broadcast_set_is_deafsigned(ebc, ev.ds, mod);
/* Create episode */
ee = ebc->episode;
if ( !ee ) {
/* Find episode */
if (*ev.uri) {
ee = epg_episode_find_by_uri(ev.uri, 1, save);
} else if ( !(ee = ebc->episode) ) {
char *uri;
uri = epg_hash(ev.title, ev.summary, ev.desc);
if (uri) {
if ((ee = epg_episode_find_by_uri(uri, 1, save)))
*save |= epg_broadcast_set_episode(ebc, ee, mod);
ee = epg_episode_find_by_uri(uri, 1, save);
free(uri);
}
}
/* Episode data */
/* Update Broadcast */
if (ee) *save |= epg_broadcast_set_episode(ebc, ee, mod);
/* Update Episode */
if (ee) {
*save |= epg_episode_set_is_bw(ee, ev.bw, mod);
if ( *ev.title )
@ -368,6 +419,13 @@ static int _eit_process_event
if ( extra )
*save |= epg_episode_set_extra(ee, extra, mod);
#endif
/* Season */
if (*ev.suri) {
es = epg_season_find_by_uri(ev.suri, 1, save);
if (es)
*save |= epg_episode_set_season(ee, es, mod);
}
}
/* Tidy up */