Recognize extensions with capital letters / capslock, print which format was written in "Wrote:" prints
Fixes: #144
diff --git a/apps/avifdec.c b/apps/avifdec.c
index 9880000..8f3a266 100644
--- a/apps/avifdec.c
+++ b/apps/avifdec.c
@@ -140,24 +140,22 @@
printf("Image details:\n");
avifImageDump(avif);
- const char * fileExt = strrchr(outputFilename, '.');
- if (!fileExt) {
- fprintf(stderr, "Cannot determine output file extension: %s\n", outputFilename);
- returnCode = 1;
- } else if (!strcmp(fileExt, ".y4m")) {
+ avifAppFileFormat outputFormat = avifGuessFileFormat(outputFilename);
+ if (outputFormat == AVIF_APP_FILE_FORMAT_UNKNOWN) {
+ } else if (outputFormat == AVIF_APP_FILE_FORMAT_Y4M) {
if (!y4mWrite(avif, outputFilename)) {
returnCode = 1;
}
- } else if (!strcmp(fileExt, ".jpg") || !strcmp(fileExt, ".jpeg")) {
+ } else if (outputFormat == AVIF_APP_FILE_FORMAT_JPEG) {
if (!avifJPEGWrite(avif, outputFilename, jpegQuality)) {
returnCode = 1;
}
- } else if (!strcmp(fileExt, ".png")) {
+ } else if (outputFormat == AVIF_APP_FILE_FORMAT_PNG) {
if (!avifPNGWrite(avif, outputFilename, requestedDepth)) {
returnCode = 1;
}
} else {
- fprintf(stderr, "Unrecognized file extension: %s\n", fileExt + 1);
+ fprintf(stderr, "Unrecognized file extension: %s\n", inputFilename);
returnCode = 1;
}
} else {
diff --git a/apps/avifenc.c b/apps/avifenc.c
index 6a6722a..357596c 100644
--- a/apps/avifenc.c
+++ b/apps/avifenc.c
@@ -334,13 +334,13 @@
avifImageSetProfileNCLX(avif, &nclx);
}
- const char * fileExt = strrchr(inputFilename, '.');
- if (!fileExt) {
+ avifAppFileFormat inputFormat = avifGuessFileFormat(inputFilename);
+ if (inputFormat == AVIF_APP_FILE_FORMAT_UNKNOWN) {
fprintf(stderr, "Cannot determine input file extension: %s\n", inputFilename);
returnCode = 1;
goto cleanup;
}
- if (!strcmp(fileExt, ".y4m")) {
+ if (inputFormat == AVIF_APP_FILE_FORMAT_Y4M) {
if (requestedRangeSet) {
fprintf(stderr, "WARNING: Ignoring range (-r) value when encoding from y4m content.\n");
}
@@ -353,18 +353,18 @@
nclx.range = avif->yuvRange;
avifImageSetProfileNCLX(avif, &nclx);
}
- } else if (!strcmp(fileExt, ".jpg") || !strcmp(fileExt, ".jpeg")) {
+ } else if (inputFormat == AVIF_APP_FILE_FORMAT_JPEG) {
if (!avifJPEGRead(avif, inputFilename, requestedFormat, requestedDepth)) {
returnCode = 1;
goto cleanup;
}
- } else if (!strcmp(fileExt, ".png")) {
+ } else if (inputFormat == AVIF_APP_FILE_FORMAT_PNG) {
if (!avifPNGRead(avif, inputFilename, requestedFormat, requestedDepth)) {
returnCode = 1;
goto cleanup;
}
} else {
- fprintf(stderr, "Unrecognized file extension: %s\n", fileExt + 1);
+ fprintf(stderr, "Unrecognized file extension: %s\n", inputFilename);
returnCode = 1;
goto cleanup;
}
@@ -436,7 +436,7 @@
fprintf(stderr, "Failed to write %zu bytes: %s\n", raw.size, outputFilename);
returnCode = 1;
} else {
- printf("Wrote: %s\n", outputFilename);
+ printf("Wrote AVIF: %s\n", outputFilename);
}
fclose(f);
diff --git a/apps/shared/avifjpeg.c b/apps/shared/avifjpeg.c
index a5b6e6d..dcefb41 100644
--- a/apps/shared/avifjpeg.c
+++ b/apps/shared/avifjpeg.c
@@ -149,7 +149,7 @@
jpeg_finish_compress(&cinfo);
ret = AVIF_TRUE;
- printf("Wrote: %s\n", outputFilename);
+ printf("Wrote JPEG: %s\n", outputFilename);
cleanup:
if (f) {
fclose(f);
diff --git a/apps/shared/avifpng.c b/apps/shared/avifpng.c
index 43f7a98..843d6b0 100644
--- a/apps/shared/avifpng.c
+++ b/apps/shared/avifpng.c
@@ -210,7 +210,7 @@
png_write_end(png, NULL);
writeResult = AVIF_TRUE;
- printf("Wrote: %s\n", outputFilename);
+ printf("Wrote PNG: %s\n", outputFilename);
cleanup:
if (f) {
fclose(f);
diff --git a/apps/shared/avifutil.c b/apps/shared/avifutil.c
index 6f26ab0..3856ac8 100644
--- a/apps/shared/avifutil.c
+++ b/apps/shared/avifutil.c
@@ -3,6 +3,7 @@
#include "avifutil.h"
+#include <ctype.h>
#include <stdio.h>
#include <string.h>
@@ -63,3 +64,34 @@
avifCodecVersions(codecVersions);
printf("Version: %s (%s)\n\n", avifVersion(), codecVersions);
}
+
+avifAppFileFormat avifGuessFileFormat(const char * filename)
+{
+ const char * fileExt = strrchr(filename, '.');
+ if (!fileExt) {
+ return AVIF_APP_FILE_FORMAT_UNKNOWN;
+ }
+ ++fileExt; // skip past the dot
+
+ char lowercaseExt[8]; // This only needs to fit up to "jpeg", so this is plenty
+ const size_t fileExtLen = strlen(fileExt);
+ if (fileExtLen >= sizeof(lowercaseExt)) { // >= accounts for NULL terminator
+ return AVIF_APP_FILE_FORMAT_UNKNOWN;
+ }
+
+ for (size_t i = 0; i < fileExtLen; ++i) {
+ lowercaseExt[i] = (char)tolower(fileExt[i]);
+ }
+ lowercaseExt[fileExtLen] = 0;
+
+ if (!strcmp(lowercaseExt, "avif")) {
+ return AVIF_APP_FILE_FORMAT_AVIF;
+ } else if (!strcmp(lowercaseExt, "y4m")) {
+ return AVIF_APP_FILE_FORMAT_Y4M;
+ } else if (!strcmp(lowercaseExt, "jpg") || !strcmp(lowercaseExt, "jpeg")) {
+ return AVIF_APP_FILE_FORMAT_JPEG;
+ } else if (!strcmp(lowercaseExt, "png")) {
+ return AVIF_APP_FILE_FORMAT_PNG;
+ }
+ return AVIF_APP_FILE_FORMAT_UNKNOWN;
+}
diff --git a/apps/shared/avifutil.h b/apps/shared/avifutil.h
index be02635..83f08ee 100644
--- a/apps/shared/avifutil.h
+++ b/apps/shared/avifutil.h
@@ -9,4 +9,16 @@
void avifImageDump(avifImage * avif);
void avifPrintVersions(void);
+typedef enum avifAppFileFormat
+{
+ AVIF_APP_FILE_FORMAT_UNKNOWN = 0,
+
+ AVIF_APP_FILE_FORMAT_AVIF,
+ AVIF_APP_FILE_FORMAT_JPEG,
+ AVIF_APP_FILE_FORMAT_PNG,
+ AVIF_APP_FILE_FORMAT_Y4M
+} avifAppFileFormat;
+
+avifAppFileFormat avifGuessFileFormat(const char * filename);
+
#endif // ifndef LIBAVIF_APPS_SHARED_AVIFUTIL_H
diff --git a/apps/shared/y4m.c b/apps/shared/y4m.c
index 8547642..72e97a2 100644
--- a/apps/shared/y4m.c
+++ b/apps/shared/y4m.c
@@ -422,7 +422,7 @@
cleanup:
fclose(f);
if (success) {
- printf("Wrote: %s\n", outputFilename);
+ printf("Wrote Y4M: %s\n", outputFilename);
}
return success;
}