int decode(const char *filename) { char huffman_outfile[256]; int rc = 0; rc = huffman_decode(filename, huffman_outfile); if (!rc && (prog_opts & LZ78)) { rc = lz78_decode(huffman_outfile, NULL); unlink(huffman_outfile); } return rc; }
int main(void) { char input[512]; char output[512]; int i; scanf("%s", input); // Convert '0' and '1' to integers 0 and 1, respectively for (i = 0; input[i] != '\0'; i++) { input[i] = input[i] - 0x30; } huffman_decode(input, i, output); printf("%s\n", output); }
END_TEST START_TEST(test_huffman_decode_two_chars_with_eos) { uint8_t buf[] = { 0xd3, 0xb3 }; // 0b1101001110110011 (78/N, 81/Q) huffman_result_t result; ck_assert(huffman_decode(buf, 2, &result)); ck_assert_int_eq(2, result.length); char * expected = "NQ"; char * r = (char *) result.value; for (size_t i = 0; i < result.length; i++) { ck_assert_uint_eq(expected[i], r[i]); } free(r); }
END_TEST START_TEST(test_huffman_decode_two_chars) { uint8_t buf[] = { 0xf9, 0xfa }; // 0b11111001 11111010 (42/*, 44/,) huffman_result_t result; ck_assert(huffman_decode(buf, 2, &result)); ck_assert_int_eq(2, result.length); char * expected = "*,"; char * r = (char *) result.value; for (size_t i = 0; i < result.length; i++) { ck_assert_uint_eq(expected[i], r[i]); } free(r); }
END_TEST START_TEST(test_huffman_decode_single_char_with_eos) { uint8_t buf[] = { 0x83 }; // 0b10000011 (61/=) huffman_result_t result; ck_assert(huffman_decode(buf, 1, &result)); ck_assert_int_eq(1, result.length); char * expected = "="; char * r = (char *) result.value; for (size_t i = 0; i < result.length; i++) { ck_assert_uint_eq(expected[i], r[i]); } free(r); }
void opentv_read_summaries (unsigned char *data, unsigned int length, bool huffman_debug) { if (length < 20) return; unsigned short int channel_id = (data[3] << 8) | data[4]; unsigned short int mjd_time = (data[8] << 8) | data[9]; if ((channel_id > 0) && (mjd_time > 0)) { unsigned int offset = 10; while (offset + 4 < length) { unsigned short int event_id; int packet_length = ((data[offset + 2] & 0x0f) << 8) | data[offset + 3]; int packet_length2 = packet_length; char buffer[MAX_SUMMARIE_SIZE]; unsigned short int buffer_size = 0; unsigned int offset2; if (packet_length == 0) break; event_id = (data[offset] << 8) | data[offset + 1]; offset += 4; offset2 = offset; while (packet_length2 > 0) { unsigned char descriptor_tag = data[offset2]; unsigned char descriptor_length = data[offset2 + 1]; offset2 += 2; if (descriptor_tag == 0xb9 && MAX_SUMMARIE_SIZE > buffer_size + descriptor_length && offset2 + descriptor_length < length) { memcpy(&buffer[buffer_size], &data[offset2], descriptor_length); buffer_size += descriptor_length; } packet_length2 -= descriptor_length + 2; offset2 += descriptor_length; } offset += packet_length; if (buffer_size > 0 && channels[channel_id] != NULL) { epgdb_title_t *title = epgdb_titles_get_by_id_and_mjd (channels[channel_id], event_id, mjd_time); if (title != NULL) { char tmp[MAX_SUMMARIE_SIZE * 2]; if (!huffman_decode (buffer, buffer_size, tmp, MAX_SUMMARIE_SIZE * 2, huffman_debug)) tmp[0] = '\0'; if (huffman_debug) { char mtime[20]; struct tm *loctime = localtime ((time_t*)&title->start_time); printf ("Nid: %x Tsid: %x Sid: %x\n", channels[channel_id]->nid, channels[channel_id]->tsid, channels[channel_id]->sid); strftime (mtime, 20, "%d/%m/%Y %H:%M", loctime); printf ("Start time: %s\n", mtime); } epgdb_titles_set_long_description (title, tmp); } } } } }
void opentv_read_titles (unsigned char *data, unsigned int length, bool huffman_debug) { epgdb_title_t *title; unsigned short int channel_id = (data[3] << 8) | data[4]; unsigned short int mjd_time = (data[8] << 8) | data[9]; if ((channel_id > 0) && (mjd_time > 0)) { unsigned int offset = 10; while ((offset + 11) < length) { unsigned short int event_id; unsigned char description_length; unsigned short int packet_length = ((data[offset + 2] & 0x0f) << 8) | data[offset + 3]; if ((data[offset + 4] != 0xb5) || ((packet_length + offset) > length)) break; event_id = (data[offset] << 8) | data[offset + 1]; offset += 4; description_length = data[offset + 1] - 7; if ((offset + 9 + description_length) > length) break; if (channels[channel_id] != NULL) { char tmp[256]; /* prepare struct */ title = _malloc (sizeof (epgdb_title_t)); title->event_id = event_id; title->start_time = ((mjd_time - 40587) * 86400) + ((data[offset + 2] << 9) | (data[offset + 3] << 1)); title->mjd = mjd_time; title->length = ((data[offset + 4] << 9) | (data[offset + 5] << 1)); title->genre_id = data[offset + 6]; title->flags = 0; //title->genre_sub_id = 0; title->iso_639_1 = 'e'; // TODO: load language from provider configuration title->iso_639_2 = 'n'; title->iso_639_3 = 'g'; title = epgdb_titles_add (channels[channel_id], title); if (!huffman_decode (data + offset + 9, description_length, tmp, 256, huffman_debug)) tmp[0] = '\0'; if (huffman_debug) { char mtime[20]; struct tm *loctime = localtime ((time_t*)&title->start_time); printf ("Nid: %x Tsid: %x Sid: %x\n", channels[channel_id]->nid, channels[channel_id]->tsid, channels[channel_id]->sid); strftime (mtime, 20, "%d/%m/%Y %H:%M", loctime); printf ("Start time: %s\n", mtime); } epgdb_titles_set_description (title, tmp); tit_count++; } offset += packet_length; } } }