Beispiel #1
0
Datei: h78.c Projekt: cesarbs/h78
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;
}
Beispiel #2
0
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;
		}
	}
}