23
23
#include "string_utility.hh"
24
24
#include "application.hh"
25
#include "libucsi/atsc/types.h"
26
27
#define SHORT_EVENT 0x4D
27
28
#define EXTENDED_EVENT 0x4E
30
#define GPS_EPOCH 315964800
32
void dump(guchar* buffer, gsize length)
34
for (guint i = 0; i < length; i++)
36
guchar ch = buffer[i];
37
if (g_ascii_isalnum(ch))
39
Log::write ("buffer[%d] = 0x%02X; // (%c)", i, ch, ch);
43
Log::write ("buffer[%d] = 0x%02X;", i, ch);
29
48
static guint32 crc_table[256] = {
30
49
0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
31
50
0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
165
gsize get_atsc_text(String& string, const guchar* buffer)
167
size_t text_position = 0;
170
gsize number_strings = buffer[offset++];
171
for (guint i = 0; i < number_strings; i++)
174
gsize number_segments = buffer[offset++];
175
for (guint j = 0; j < number_segments; j++)
177
struct atsc_text_string_segment* segment = (struct atsc_text_string_segment*)&buffer[offset];
179
uint8_t* text = NULL;
180
size_t text_length = 0;
182
atsc_text_segment_decode(segment, &text, &text_length, &text_position);
184
string.append((const gchar*)text, text_position);
159
191
gboolean DvbSectionParser::find_descriptor(uint8_t tag, const unsigned char *buf, int descriptors_loop_len,
160
192
const unsigned char **desc, int *desc_len)
367
void DvbSectionParser::parse_psip_mgt(DvbDemuxer& demuxer, MasterGuideTable& table)
369
gsize section_length = read_section(demuxer);
371
guint tables_defined = get_bits(&buffer[offset], 0, 16);
374
for (guint i = 0; i < tables_defined; i++)
376
MasterGuideTableTable mgtt;
377
mgtt.type = get_bits(&buffer[offset], 0, 16);
379
mgtt.pid = get_bits(&buffer[offset], 3, 13);
380
table.tables.push_back(mgtt);
382
guint table_type_descriptors_length = get_bits(&buffer[offset], 4, 12);
383
offset += table_type_descriptors_length + 2;
387
void DvbSectionParser::parse_psip_eis(DvbDemuxer& demuxer, EventInformationSection& section)
389
gsize section_length = read_section(demuxer);
392
section.service_id = get_bits(&buffer[offset], 0, 16);
395
guint num_events_in_section = buffer[offset++];
397
for (int i = 0; i < num_events_in_section; i++)
401
event.event_id = get_bits (&buffer[offset], 2, 14); offset += 2;
402
event.start_time = get_bits (&buffer[offset], 0, 32); offset += 4;
403
event.duration = get_bits (&buffer[offset], 4, 20); offset += 3;
405
event.start_time += GPS_EPOCH;
406
event.start_time += timezone;
408
gsize title_length = buffer[offset++];
409
if (title_length > 0)
411
get_atsc_text (event.title, &buffer[offset++]);
412
offset += title_length;
415
guint descriptors_length = buffer[offset++];
416
offset += descriptors_length;
418
section.events.push_back(event);
335
422
void DvbSectionParser::parse_eis(DvbDemuxer& demuxer, EventInformationSection& section)
337
424
gsize section_length = read_section(demuxer);
357
event.event_id = get_bits (&buffer[offset], 0, 16);
358
event.start_time_MJD = get_bits (&buffer[offset], 16, 16);
359
event.start_time_UTC = get_bits (&buffer[offset], 32, 24);
360
event.duration = get_bits (&buffer[offset], 56, 24);
361
event.running_status = get_bits (&buffer[offset], 80, 3);
362
event.free_CA_mode = get_bits (&buffer[offset], 83, 1);
444
gulong start_time_MJD; // 16
445
gulong start_time_UTC; // 24
448
event.event_id = get_bits (&buffer[offset], 0, 16);
449
start_time_MJD = get_bits (&buffer[offset], 16, 16);
450
start_time_UTC = get_bits (&buffer[offset], 32, 24);
451
duration = get_bits (&buffer[offset], 56, 24);
452
event.running_status = get_bits (&buffer[offset], 80, 3);
453
event.free_CA_mode = get_bits (&buffer[offset], 83, 1);
364
455
unsigned int descriptors_loop_length = get_bits (&buffer[offset], 84, 12);
366
457
unsigned int end_descriptor_offset = descriptors_loop_length + offset;
368
event.dur_hour = ((event.duration >> 20)&0xf)*10+((event.duration >> 16)&0xf);
369
event.dur_min = ((event.duration >> 12)&0xf)*10+((event.duration >> 8)&0xf);
370
event.dur_sec = ((event.duration >> 4)&0xf)*10+((event.duration )&0xf);
459
guint event_dur_hour = ((duration >> 20)&0xf)*10+((duration >> 16)&0xf);
460
guint event_dur_min = ((duration >> 12)&0xf)*10+((duration >> 8)&0xf);
461
guint event_dur_sec = ((duration >> 4)&0xf)*10+((duration )&0xf);
372
if ( event.start_time_MJD > 0 )
463
event.duration = (event_dur_hour*60 + event_dur_min) * 60;
465
guint event_start_day = 0;
466
guint event_start_month = 0;
467
guint event_start_year = 0;
469
if (start_time_MJD > 0 && event.event_id != 0)
374
long year = (long) ((event.start_time_MJD - 15078.2) / 365.25);
375
long month = (long) ((event.start_time_MJD - 14956.1 - (long)(year * 365.25) ) / 30.6001);
376
event.start_day = (long) (event.start_time_MJD - 14956 - (long)(year * 365.25) - (long)(month * 30.6001));
471
long year = (long) ((start_time_MJD - 15078.2) / 365.25);
472
long month = (long) ((start_time_MJD - 14956.1 - (long)(year * 365.25) ) / 30.6001);
473
event_start_day = (long) (start_time_MJD - 14956 - (long)(year * 365.25) - (long)(month * 30.6001));
378
475
long k = (month == 14 || month == 15) ? 1 : 0;
380
event.start_year = year + k + 1900;
381
event.start_month = month - 1 - k * 12;
384
event.start_hour = ((event.start_time_UTC >> 20)&0xf)*10+((event.start_time_UTC >> 16)&0xf);
385
event.start_min = ((event.start_time_UTC >> 12)&0xf)*10+((event.start_time_UTC >> 8)&0xf);
386
event.start_sec = ((event.start_time_UTC >> 4)&0xf)*10+((event.start_time_UTC )&0xf);
388
while (offset < end_descriptor_offset)
390
offset += decode_short_event(&buffer[offset], event);
477
event_start_year = year + k + 1900;
478
event_start_month = month - 1 - k * 12;
480
guint event_start_hour = ((start_time_UTC >> 20)&0xf)*10+((start_time_UTC >> 16)&0xf);
481
guint event_start_min = ((start_time_UTC >> 12)&0xf)*10+((start_time_UTC >> 8)&0xf);
482
guint event_start_sec = ((start_time_UTC >> 4)&0xf)*10+((start_time_UTC )&0xf);
486
memset(&t, 0, sizeof(struct tm));
488
t.tm_min = event_start_min;
489
t.tm_hour = event_start_hour;
490
t.tm_mday = event_start_day;
491
t.tm_mon = event_start_month - 1;
492
t.tm_year = event_start_year - 1900;
494
event.start_time = mktime(&t);
393
if (offset > end_descriptor_offset)
395
throw Exception("ASSERT: offset > end_descriptor_offset");
496
while (offset < end_descriptor_offset)
498
offset += decode_event_descriptor(&buffer[offset], event);
501
if (offset > end_descriptor_offset)
503
throw Exception("ASSERT: offset > end_descriptor_offset");
506
section.events.push_back( event );
398
section.events.push_back( event );
400
509
section.crc = get_bits (&buffer[offset], 0, 32);
409
gsize DvbSectionParser::decode_short_event (const guchar* buffer, Event& event)
518
gsize DvbSectionParser::decode_event_descriptor (const guchar* event_buffer, Event& event)
520
if (event_buffer[1] == 0)
416
gsize descriptor_length = buffer[1] + 2;
525
gsize descriptor_length = event_buffer[1] + 2;
527
guint descriptor_tag = event_buffer[0];
528
switch(descriptor_tag)
536
language = get_lang_desc (event_buffer);
537
unsigned int offset = 6;
538
guint length_of_items = event_buffer[offset];
540
while (length_of_items > offset - 7)
542
offset += get_text(description, &event_buffer[offset]);
543
offset += get_text(title, &event_buffer[offset]);
545
offset += get_text(description, &event_buffer[offset]);
547
if (event.description.is_empty())
549
event.description = description;
552
if (event.title.is_empty())
420
559
case SHORT_EVENT:
424
563
String description;
426
language = get_lang_desc (buffer);
565
language = get_lang_desc (event_buffer);
427
566
unsigned int offset = 5;
428
offset += get_text(title, &buffer[offset]);
429
offset += get_text(description, &buffer[offset]);
567
offset += get_text(title, &event_buffer[offset]);
568
offset += get_text(description, &event_buffer[offset]);
431
570
if (event.title.is_empty())
601
741
Log::write("Length: %d", length);
602
742
for (guint i = 0; i < (length+1); i++)
604
gchar ch = buffer[i];
744
gchar ch = text_buffer[i];
605
745
if (!isprint(ch))
607
Log::write("buffer[%d]\t= 0x%02X", i, buffer[i]);
747
Log::write("text_buffer[%d]\t= 0x%02X", i, text_buffer[i]);
611
Log::write("buffer[%d]\t= 0x%02X '%c'", i, buffer[i], buffer[i]);
751
Log::write("text_buffer[%d]\t= 0x%02X '%c'", i, text_buffer[i], text_buffer[i]);
614
754
throw Exception(message);