bool opentv_read_channels_bat (unsigned char *data, unsigned int length) { unsigned short int bouquet_descriptors_length = ((data[8] & 0x0f) << 8) | data[9]; unsigned short int transport_stream_loop_length = ((data[bouquet_descriptors_length + 10] & 0x0f) << 8) | data[bouquet_descriptors_length + 11]; unsigned int offset1 = bouquet_descriptors_length + 12; bool ret = false; while (transport_stream_loop_length > 0) { unsigned short int tid = (data[offset1] << 8) | data[offset1 + 1]; unsigned short int nid = (data[offset1 + 2] << 8) | data[offset1 + 3]; unsigned short int transport_descriptor_length = ((data[offset1 + 4] & 0x0f) << 8) | data[offset1 + 5]; unsigned int offset2 = offset1 + 6; offset1 += (transport_descriptor_length + 6); transport_stream_loop_length -= (transport_descriptor_length + 6); while (transport_descriptor_length > 0) { unsigned char descriptor_tag = data[offset2]; unsigned char descriptor_length = data[offset2 + 1]; unsigned int offset3 = offset2 + 2; offset2 += (descriptor_length + 2); transport_descriptor_length -= (descriptor_length + 2); if (descriptor_tag == 0xb1) { offset3 += 2; descriptor_length -= 2; while (descriptor_length > 0) { unsigned short int channel_id; //unsigned short int sky_id; channel_id = (data[offset3 + 3] << 8) | data[offset3 + 4]; //sky_id = ( data[offset3+5] << 8 ) | data[offset3+6]; if (channels[channel_id] == NULL) { channels[channel_id] = epgdb_channels_add (nid, tid, (data[offset3] << 8) | data[offset3 + 1]); ch_count++; ret = true; } offset3 += 9; descriptor_length -= 9; } } } } return ret; }
bool dbmerge_merge (FILE *fd_h, FILE *fd_d, void(*progress_callback)(int, int)) { char tmp[256]; unsigned char revision; int channels_count, i, j, aliases_groups_count, indexes_count; time_t now = time (NULL); /* read headers */ fread (tmp, strlen (MAGIC_HEADERS), 1, fd_h); if (memcmp (tmp, MAGIC_HEADERS, strlen (MAGIC_HEADERS)) != 0) { log_add ("Bad magic header"); return false; } fread (&revision, sizeof (unsigned char), 1, fd_h); if (revision != DB_REVISION) { log_add ("Bad db revision"); return false; } fseek (fd_h, 22, SEEK_SET); fread (&channels_count, sizeof (int), 1, fd_h); for (i=0; i<channels_count; i++) { int titles_count; epgdb_channel_t *tmp; epgdb_channel_t *channel, *channel_tmp; channel_tmp = _malloc (sizeof (epgdb_channel_t)); fread (channel_tmp, sizeof (epgdb_channel_header_t), 1, fd_h); channel = epgdb_channels_add (channel_tmp->nid, channel_tmp->tsid, channel_tmp->sid); _free (channel_tmp); fread (&titles_count, sizeof (int), 1, fd_h); for (j=0; j<titles_count; j++) { char *desc, *ldesc; epgdb_title_t *title = _malloc (sizeof (epgdb_title_t)); fread (title, sizeof (epgdb_title_header_t), 1, fd_h); desc = dbmerge_read_description (fd_d, title); ldesc = dbmerge_read_long_description (fd_d, title); title = epgdb_titles_add (channel, title); epgdb_titles_set_description(title, desc); epgdb_titles_set_long_description(title, ldesc); _free (desc); _free (ldesc); } if (progress_callback) progress_callback (i, channels_count); } return true; }