diff --git a/.gitignore b/.gitignore index 92b96b4..00aafef 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ output/* samples/* tmp/* -build/* \ No newline at end of file +build/* +autom4te.cache \ No newline at end of file diff --git a/src/Makefile.am b/src/Makefile.am index aa1f8f8..c7fecf3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ bin_PROGRAMS = caesiumclt caesiumclt_SOURCES = main.c utils.c lossless.c compress.c -caesiumclt_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -ljpeg -lturbojpeg -lm -std=c99 -caesiumclt_OBJCFLAGS = -D_FILE_OFFSET_BITS=64 -ljpeg -lturbojpeg -lm \ No newline at end of file +caesiumclt_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -std=c99 +caesiumclt_LDADD = -ljpeg -lturbojpeg -lm \ No newline at end of file diff --git a/src/Makefile.in b/src/Makefile.in index 1425b9e..a45c74f 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -102,7 +102,7 @@ am_caesiumclt_OBJECTS = caesiumclt-main.$(OBJEXT) \ caesiumclt-utils.$(OBJEXT) caesiumclt-lossless.$(OBJEXT) \ caesiumclt-compress.$(OBJEXT) caesiumclt_OBJECTS = $(am_caesiumclt_OBJECTS) -caesiumclt_LDADD = $(LDADD) +caesiumclt_DEPENDENCIES = caesiumclt_LINK = $(CCLD) $(caesiumclt_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) @@ -253,8 +253,8 @@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ caesiumclt_SOURCES = main.c utils.c lossless.c compress.c -caesiumclt_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -ljpeg -lturbojpeg -lm -std=c99 -caesiumclt_OBJCFLAGS = -D_FILE_OFFSET_BITS=64 -ljpeg -lturbojpeg -lm +caesiumclt_CFLAGS = -Wall -D_FILE_OFFSET_BITS=64 -std=c99 +caesiumclt_LDADD = -ljpeg -lturbojpeg -lm all: all-am .SUFFIXES: diff --git a/src/compress.c b/src/compress.c index 4bc1f42..b7dcccd 100755 --- a/src/compress.c +++ b/src/compress.c @@ -61,6 +61,7 @@ unsigned char* cclt_decompress(char* fileName, cclt_compress_parameters* pars) { tjhandle tjDecompressHandle; int fileWidth = 0, fileHeight = 0, jpegSubsamp = 0; + //TODO No error checks here file = fopen(fileName, "rb"); res = fseek(file, 0, SEEK_END); sourceJpegBufferSize = ftell(file); diff --git a/src/lossless.c b/src/lossless.c index 161784f..5b026cc 100755 --- a/src/lossless.c +++ b/src/lossless.c @@ -31,7 +31,7 @@ struct jpeg_decompress_struct cclt_get_markers(char* input) { //Save EXIF info for (int m = 0; m < 16; m++) { - jpeg_save_markers(&einfo, JPEG_APP0 + m, 0xFFFF); + jpeg_save_markers(&einfo, JPEG_APP0 + m, 0xFFFF); } jpeg_read_header(&einfo, TRUE); diff --git a/src/main.c b/src/main.c index 43fc8dc..113c0d3 100755 --- a/src/main.c +++ b/src/main.c @@ -38,6 +38,7 @@ void cclt_start(char** input_files, int n, char* output_folder, cclt_compress_pa } while (i < n) { + off_t i_size, o_size; int status; //Pointer for stat() call char* output_filename = (char*) malloc ((strlen(output_folder) + 2) * sizeof(char)); @@ -91,6 +92,8 @@ void cclt_start(char** input_files, int n, char* output_folder, cclt_compress_pa continue; } + + //Get input file size i_size = st_buf.st_size; *(i_t_size) += i_size; @@ -187,7 +190,7 @@ int main (int argc, char *argv[]) { cclt_start(pars.input_files, pars.input_files_count, pars.output_folder, &pars, &i_t_size, &o_t_size); - fprintf(stdout, "Compression completed.\n%ld bytes -> %ld bytes [%.2f%%]\n", + fprintf(stdout, "-------------------------------\nCompression completed.\n%ld bytes -> %ld bytes [%.2f%%]\n", (long) i_t_size, (long) o_t_size, ((float) o_t_size - i_t_size) * 100 / i_t_size); exit(0); diff --git a/src/utils.c b/src/utils.c index 6e2ca58..b2f9f49 100644 --- a/src/utils.c +++ b/src/utils.c @@ -120,33 +120,6 @@ char* get_filename_with_extension(char* full_path) { return dest; } -void jcopy_markers_execute (j_decompress_ptr srcinfo, j_compress_ptr dstinfo) { - jpeg_saved_marker_ptr marker; - - for (marker = srcinfo->marker_list; marker != NULL; marker = marker->next) { - if (dstinfo->write_JFIF_header && - marker->marker == JPEG_APP0 && - marker->data_length >= 5 && - GETJOCTET(marker->data[0]) == 0x4A && - GETJOCTET(marker->data[1]) == 0x46 && - GETJOCTET(marker->data[2]) == 0x49 && - GETJOCTET(marker->data[3]) == 0x46 && - GETJOCTET(marker->data[4]) == 0) - continue; - if (dstinfo->write_Adobe_marker && - marker->marker == JPEG_APP0+14 && - marker->data_length >= 5 && - GETJOCTET(marker->data[0]) == 0x41 && - GETJOCTET(marker->data[1]) == 0x64 && - GETJOCTET(marker->data[2]) == 0x6F && - GETJOCTET(marker->data[3]) == 0x62 && - GETJOCTET(marker->data[4]) == 0x65) - continue; - jpeg_write_marker(dstinfo, marker->marker, - marker->data, marker->data_length); - } -} - cclt_compress_parameters parse_arguments(int argc, char* argv[]) { //Initialize default params @@ -217,8 +190,15 @@ cclt_compress_parameters parse_arguments(int argc, char* argv[]) { } void cclt_compress_routine(char* input, char* output, cclt_compress_parameters* pars) { - cclt_compress(output, cclt_decompress(input, pars), pars); - cclt_optimize(output, output, pars->exif_copy, input); + enum image_type type = detect_image_type(input); + if (type == JPEG) { + cclt_compress(output, cclt_decompress(input, pars), pars); + cclt_optimize(output, output, pars->exif_copy, input); + } else if (type == PNG) { + printf("PNG detected. Still to implement.\n"); + } else { + return; + } } char** scan_folder(char* dir, int depth) { @@ -255,7 +235,7 @@ char** scan_folder(char* dir, int depth) { chdir(".."); closedir(dp); printf("SEG\n"); - return *files; + return files; } void printdir(char *dir, int depth) @@ -285,3 +265,33 @@ void printdir(char *dir, int depth) closedir(dp); } +enum image_type detect_image_type(char* path) { + FILE* fp; + unsigned char* type_buffer = valloc(2); + + fp = fopen(path, "r"); + + if (fp == NULL) { + fprintf(stderr, "Cannot open input file for type detection. Aborting.\n"); + exit(-14); + } + + if (fread(type_buffer, 1, 2, fp) < 2) { + fprintf(stderr, "Cannot read file type. Aborting.\n"); + exit(-15); + } + + fclose(fp); + + if (((int) type_buffer[0] == 0xFF) && ((int) type_buffer[1] == 0xD8)) { + free(type_buffer); + return JPEG; + } else if (((int) type_buffer[0] == 0x89) && ((int) type_buffer[1] == 0x50)) { + free(type_buffer); + return PNG; + } else { + fprintf(stderr, "Unsupported file type. Skipping.\n"); + return UNKN; + } +} + diff --git a/src/utils.h b/src/utils.h index da8f61f..bc3323e 100644 --- a/src/utils.h +++ b/src/utils.h @@ -6,7 +6,7 @@ #include #define APP_VERSION "1.9.9 BETA" -#define BUILD 20150519 +#define BUILD 20150723 typedef struct cclt_compress_parameters { int quality; @@ -24,6 +24,12 @@ typedef struct cclt_compress_parameters { int recursive; } cclt_compress_parameters; +enum image_type { + JPEG, + PNG, + UNKN, +}; + cclt_compress_parameters initialize_compression_parameters(); int string_to_int(char* in_string); @@ -34,5 +40,6 @@ void jcopy_markers_execute (j_decompress_ptr srcinfo, j_compress_ptr dstinfo); int mkpath(const char *pathname, mode_t mode); cclt_compress_parameters parse_arguments(int argc, char* argv[]); void cclt_compress_routine(char* input, char* output,cclt_compress_parameters* pars); +enum image_type detect_image_type(char* path); #endif