LameXP/etc/Patches/Aften-v0.0.8-UTF8.diff

237 lines
6.6 KiB
Diff
Raw Normal View History

2012-04-26 13:43:40 +02:00
aften/aften.c | 23 ++++++++++-
aften/unicode_support.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++
aften/unicode_support.h | 21 ++++++++++
libaften/a52.h | 2 +-
4 files changed, 140 insertions(+), 4 deletions(-)
diff --git a/aften/aften.c b/aften/aften.c
index 143bb1c..a93da2f 100644
--- a/aften/aften.c
+++ b/aften/aften.c
@@ -38,6 +38,7 @@
#include "pcm.h"
#include "helptext.h"
#include "opts.h"
+#include "unicode_support.h"
static const int acmod_to_ch[8] = { 2, 1, 2, 3, 3, 4, 4, 5 };
@@ -82,7 +83,7 @@ print_simd_in_use(FILE *out, AftenSimdInstructions *simd_instructions)
}
int
-main(int argc, char **argv)
+aften_main(int argc, char **argv)
{
void (*aften_remap)(void *samples, int n, int ch,
A52SampleFormat fmt, int acmod) = NULL;
@@ -137,7 +138,7 @@ main(int argc, char **argv)
#endif
ifp[i] = stdin;
} else {
- ifp[i] = fopen(opts.infile[i], "rb");
+ ifp[i] = fopen_utf8(opts.infile[i], "rb");
if (!ifp[i]) {
fprintf(stderr, "error opening input file: %s\n", opts.infile[i]);
goto error_end;
@@ -235,7 +236,7 @@ main(int argc, char **argv)
#endif
ofp = stdout;
} else {
- ofp = fopen(opts.outfile, "wb");
+ ofp = fopen_utf8(opts.outfile, "wb");
if (!ofp) {
fprintf(stderr, "error opening output file: %s\n", opts.outfile);
goto error_end;
@@ -327,6 +328,7 @@ main(int argc, char **argv)
"bw: %2.1f | bitrate: %4.1f kbps ",
percent, (qual / (frame_cnt+1)),
(bw / (frame_cnt+1)), kbps);
+ fflush(stderr);
}
t0 = t1;
last_update_clock = current_clock;
@@ -335,6 +337,7 @@ main(int argc, char **argv)
fprintf(stderr, "frame: %7d | q: %4d | bw: %2d | bitrate: %3d kbps\n",
frame_cnt, s.status.quality, s.status.bwcode,
s.status.bit_rate);
+ fflush(stderr);
}
}
fwrite(frame, 1, fs, ofp);
@@ -352,11 +355,13 @@ main(int argc, char **argv)
if (s.verbose == 1) {
fprintf(stderr, "\rprogress: 100%% | q: %4.1f | bw: %2.1f | bitrate: %4.1f kbps\n\n",
(qual / frame_cnt), (bw / frame_cnt), kbps);
+ fflush(stderr);
} else if (s.verbose == 2) {
fprintf(stderr, "\n");
fprintf(stderr, "average quality: %4.1f\n", (qual / frame_cnt));
fprintf(stderr, "average bandwidth: %2.1f\n", (bw / frame_cnt));
fprintf(stderr, "average bitrate: %4.1f kbps\n\n", kbps);
+ fflush(stderr);
}
}
goto end;
@@ -382,3 +387,15 @@ end:
return ret_val;
}
+
+int wmain(int argc, wchar_t **argv_utf16)
+{
+ int result = 0;
+ char **argv_utf8 = NULL;
+
+ init_commandline_arguments_utf8(argc, &argv_utf8, argv_utf16);
+ result = aften_main(argc, argv_utf8);
+ free_commandline_arguments_utf8(argc, &argv_utf8);
+
+ return result;
+}
diff --git a/aften/unicode_support.c b/aften/unicode_support.c
new file mode 100644
index 0000000..21ecd5c
--- /dev/null
+++ b/aften/unicode_support.c
@@ -0,0 +1,98 @@
+#include "unicode_support.h"
+
+#include <stdio.h>
+#include <windows.h>
+
+char *utf16_to_utf8(const wchar_t *input)
+{
+ char *Buffer;
+ int BuffSize, Result;
+
+ BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL);
+ Buffer = (char*) malloc(sizeof(char) * BuffSize);
+
+ if(!Buffer)
+ {
+ fprintf(stderr, "Error in utf16_to_utf8: Memory allocation failed!\n");
+ return NULL;
+ }
+
+ Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL);
+ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
+}
+
+wchar_t *utf8_to_utf16(const char *input)
+{
+ wchar_t *Buffer;
+ int BuffSize, Result;
+
+ BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0);
+ Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize);
+
+ if(!Buffer)
+ {
+ fprintf(stderr, "Error in utf8_to_utf16: Memory allocation failed!\n");
+ return NULL;
+ }
+
+ Result = MultiByteToWideChar(CP_UTF8, 0, input, -1, Buffer, BuffSize);
+ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL;
+}
+
+void init_commandline_arguments_utf8(int argc, char ***argv_utf8, wchar_t **argv_utf16)
+{
+ int i = 0;
+
+ *argv_utf8 = (char**) malloc(argc * sizeof(char*));
+ if(!(*argv_utf8))
+ {
+ fprintf(stderr, "Error in init_commandline_arguments_utf8: Memory allocation failed!\n");
+ exit(-1);
+ }
+
+ for(i = 0; i < argc; i++)
+ {
+ (*argv_utf8)[i] = utf16_to_utf8(argv_utf16[i]);
+ if(!(*argv_utf8)[i])
+ {
+ fprintf(stderr, "Error in init_commandline_arguments_utf8: Memory allocation failed!\n");
+ exit(-1);
+ }
+ }
+}
+
+void free_commandline_arguments_utf8(int argc, char ***argv_utf8)
+{
+ int i = 0;
+
+ if(*argv_utf8 != NULL)
+ {
+ for(i = 0; i < argc; i++)
+ {
+ if((*argv_utf8)[i] != NULL)
+ {
+ free((*argv_utf8)[i]);
+ (*argv_utf8)[i] = NULL;
+ }
+ }
+ free(*argv_utf8);
+ *argv_utf8 = NULL;
+ }
+}
+
+FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8)
+{
+ FILE *ret = NULL;
+ wchar_t *filename_utf16 = utf8_to_utf16(filename_utf8);
+ wchar_t *mode_utf16 = utf8_to_utf16(mode_utf8);
+
+ if(filename_utf16 && mode_utf16)
+ {
+ ret = _wfopen(filename_utf16, mode_utf16);
+ }
+
+ if(filename_utf16) free(filename_utf16);
+ if(mode_utf16) free(mode_utf16);
+
+ return ret;
+}
diff --git a/aften/unicode_support.h b/aften/unicode_support.h
new file mode 100644
index 0000000..cc13fd9
--- /dev/null
+++ b/aften/unicode_support.h
@@ -0,0 +1,21 @@
+#ifndef UNICODE_SUPPORT_H_INCLUDED
+#define UNICODE_SUPPORT_H_INCLUDED
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+char *utf16_to_utf8(const wchar_t *input);
+wchar_t *utf8_to_utf16(const char *input);
+void init_commandline_arguments_utf8(int argc, char ***argv_utf8, wchar_t **argv_utf16);
+void free_commandline_arguments_utf8(int argc, char ***argv_utf8);
+FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
\ No newline at end of file
diff --git a/libaften/a52.h b/libaften/a52.h
index 9a6812b..85c6fa5 100644
--- a/libaften/a52.h
+++ b/libaften/a52.h
@@ -32,7 +32,7 @@
#include "a52tab.h"
#include "aften-types.h"
-#define AFTEN_VERSION "git"
+#define AFTEN_VERSION "0.0.8+"
#define A52_MAX_CHANNELS 6