void dec_run_length(FILE *in_fp) { printf("Applying run-length decoding...\n"); for(curr_channel=0; curr_channel<input_file_header->numChannels; curr_channel++) { bdestroy(&data_buffer[curr_channel]); binit(&data_buffer[curr_channel], output_buffer[curr_channel].n_bytes*8-(8-output_buffer[curr_channel].bits_last)); bit_buffer_cpy(&data_buffer[curr_channel], &output_buffer[curr_channel], output_buffer[curr_channel].n_bytes*8-(8-output_buffer[curr_channel].bits_last)); bdestroy(&output_buffer[curr_channel]); binit(&output_buffer[curr_channel], input_file_header->subchunk2size); if(sec_enc==RUN_LENGTH){ rl_decode(max_bits[curr_channel]+1, nbits_code[curr_channel], nbits_run[curr_channel], &data_buffer[curr_channel], &output_buffer[curr_channel]); }else{ rl_decode(input_file_header->bitsPerSample, nbits_code[curr_channel], nbits_run[curr_channel], &data_buffer[curr_channel], &output_buffer[curr_channel]); } /*bprint(&output_buffer[curr_channel]);*/ } }
int main(int argc, char **argv) { FILE *input, *output; int input_size, output_size; char *input_buffer, *output_buffer; /* If we didn't get enough arguments, complain. */ if (argc != 3) { usage(argv[0]); return 1; } input = fopen(argv[1], "rb"); if (input == NULL) { printf("Couldn't open input file \"%s\"!\n", argv[1]); return 2; } output = fopen(argv[2], "wb"); if (output == NULL) { printf("Couldn't open output file \"%s\"!\n", argv[2]); return 3; } printf("Decoding file \"%s\" into file \"%s\".\n", argv[1], argv[2]); /* Load the input file into a buffer in memory. */ fseek(input, 0, SEEK_END); input_size = ftell(input); fseek(input, 0, SEEK_SET); input_buffer = malloc(input_size + 1); fread(input_buffer, sizeof(unsigned char), input_size, input); /* Decode the input file, and write the resutls to the output file. */ output_buffer = rl_decode(input_buffer, input_size, &output_size); fwrite(output_buffer, sizeof(unsigned char), output_size, output); printf("All done!\n"); fclose(output); fclose(input); free(input_buffer); free(output_buffer); return 0; }