From 4c69411a19bff7dba6795e182ca89b69c40ae77a Mon Sep 17 00:00:00 2001 From: lordmulder Date: Sun, 22 Jul 2012 00:09:28 +0200 Subject: [PATCH] Added Opus patch for Unicode support and real-time progress updates (flush). --- .../OpusTools-Git20120721-UTF8+Flush.diff | 535 ++++++++++++++++++ 1 file changed, 535 insertions(+) create mode 100644 etc/Patches/OpusTools-Git20120721-UTF8+Flush.diff diff --git a/etc/Patches/OpusTools-Git20120721-UTF8+Flush.diff b/etc/Patches/OpusTools-Git20120721-UTF8+Flush.diff new file mode 100644 index 00000000..bb2605a1 --- /dev/null +++ b/etc/Patches/OpusTools-Git20120721-UTF8+Flush.diff @@ -0,0 +1,535 @@ + src/opusdec.c | 39 ++++++++++-- + src/opusdec.vcxproj | 15 ++++- + src/opusdec.vcxproj.filters | 6 ++ + src/opusenc.c | 24 +++++-- + src/opusenc.vcxproj | 15 ++++- + src/opusenc.vcxproj.filters | 6 ++ + src/opusinfo.vcxproj | 4 +- + src/unicode_support.c | 148 +++++++++++++++++++++++++++++++++++++++++++ + src/unicode_support.h | 16 +++++ + 9 files changed, 256 insertions(+), 17 deletions(-) + +diff --git a/src/opusdec.c b/src/opusdec.c +index 7b7ce7c..d6a0fbb 100644 +--- a/src/opusdec.c ++++ b/src/opusdec.c +@@ -103,6 +103,8 @@ + #include "speex_resampler.h" + #include "stack_alloc.h" + ++#include "unicode_support.h" ++ + #define MINI(_a,_b) ((_a)<(_b)?(_a):(_b)) + #define MAXI(_a,_b) ((_a)>(_b)?(_a):(_b)) + #define CLAMPI(_a,_b,_c) (MAXI(_a,MINI(_b,_c))) +@@ -403,7 +405,7 @@ FILE *out_file_open(char *outFile, int *wav_format, int rate, int mapping_family + } + else + { +- fout = fopen(outFile, "wb"); ++ fout = fopen_utf8(outFile, "wb"); + if (!fout) + { + perror(outFile); +@@ -601,7 +603,7 @@ opus_int64 audio_write(float *pcm, int channels, int frame_size, FILE *fout, Spe + return sampout; + } + +-int main(int argc, char **argv) ++static int opusdec_main(int argc, char **argv) + { + int c; + int option_index = 0; +@@ -651,6 +653,7 @@ int main(int argc, char **argv) + SpeexResamplerState *resampler=NULL; + float gain=1; + int streams=0; ++ size_t last_spin=0; + + output=0; + shapemem.a_buf=0; +@@ -694,7 +697,7 @@ int main(int argc, char **argv) + { + manual_gain=atof (optarg); + }else if(strcmp(long_options[option_index].name,"save-range")==0){ +- frange=fopen(optarg,"w"); ++ frange=fopen_utf8(optarg,"w"); + if(frange==NULL){ + perror(optarg); + fprintf(stderr,"Could not open save-range file: %s\n",optarg); +@@ -744,7 +747,7 @@ int main(int argc, char **argv) + } + else + { +- fin = fopen(inFile, "rb"); ++ fin = fopen_utf8(inFile, "rb"); + if (!fin) + { + perror(inFile); +@@ -861,6 +864,16 @@ int main(int argc, char **argv) + ret = opus_multistream_decode_float(st, NULL, 0, output, lost_size, 0); + } + ++ if(!quiet){ ++ static const char spinner[]="|/-\\"; ++ if(!(last_spin % 100)) { ++ fprintf(stderr,"[%c]\b\b\b", spinner[(last_spin/100) % 3]); ++ fflush(stderr); ++ } ++ last_spin++; ++ } ++ ++ + if (ret<0) + { + fprintf (stderr, "Decoding error: %s\n", opus_strerror(ret)); +@@ -919,8 +932,11 @@ int main(int argc, char **argv) + st=NULL; + } + } +- if (feof(fin)) ++ if (feof(fin)) { ++ fprintf(stderr, "Complete.\n"); ++ fflush(stderr); + break; ++ } + } + + if (fout && wav_format>=0 && audio_size<0x7FFFFFFF) +@@ -968,3 +984,16 @@ int main(int argc, char **argv) + + return 0; + } ++ ++int main( int argc, char **argv ) ++{ ++ int my_argc; ++ char **my_argv; ++ int exit_code; ++ ++ init_commandline_arguments_utf8(&my_argc, &my_argv); ++ exit_code = opusdec_main(my_argc, my_argv); ++ free_commandline_arguments_utf8(&my_argc, &my_argv); ++ ++ return exit_code; ++} +\ No newline at end of file +diff --git a/src/opusdec.vcxproj b/src/opusdec.vcxproj +index 4992007..6bdb0ac 100644 +--- a/src/opusdec.vcxproj ++++ b/src/opusdec.vcxproj +@@ -27,6 +27,7 @@ + + + ++ + + + +@@ -41,6 +42,7 @@ + + + ++ + + + +@@ -165,9 +167,14 @@ + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreaded + Level3 +- ..\..\libogg\include;..\..\opus\include;..\win32;..\include;%(AdditionalIncludeDirectories) ++ ..\..\libogg-1.3.0\include;..\..\opus-git\include;..\win32;..\include;%(AdditionalIncludeDirectories) + true + Speed ++ Full ++ AnySuitable ++ true ++ true ++ NotSet + + + MachineX86 +@@ -175,8 +182,10 @@ + Console + true + true +- celt.lib;opus.lib;silk_common.lib;silk_float.lib;libogg_static.lib;winmm.lib;%(AdditionalDependencies) +- $(OutDir) ++ F:\DeLpHi\EncodePointerLib\Release\EncodePointer.lib;celt.lib;opus.lib;silk_common.lib;silk_float.lib;libogg_static.lib;winmm.lib;%(AdditionalDependencies) ++ $(OutDir);D:\SVN\Tools\opus-git\Release;D:\SVN\Tools\libogg-1.3.0\win32\VS2010\Win32\Release ++ UseLinkTimeCodeGeneration ++ 5.0 + + + "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" VERSION +diff --git a/src/opusdec.vcxproj.filters b/src/opusdec.vcxproj.filters +index cbf5e37..f00f948 100644 +--- a/src/opusdec.vcxproj.filters ++++ b/src/opusdec.vcxproj.filters +@@ -41,6 +41,9 @@ + + Source Files + ++ ++ Source Files ++ + + + +@@ -79,5 +82,8 @@ + + Header Files + ++ ++ Header Files ++ + + +\ No newline at end of file +diff --git a/src/opusenc.c b/src/opusenc.c +index 5836826..3119eec 100644 +--- a/src/opusenc.c ++++ b/src/opusenc.c +@@ -76,6 +76,8 @@ + #define VG_CHECK(x,y) + #endif + ++#include "unicode_support.h" ++ + static void comment_init(char **comments, int* length, const char *vendor_string); + static void comment_add(char **comments, int* length, char *tag, char *val); + +@@ -170,7 +172,7 @@ static inline void print_time(double seconds) + if(seconds>0)fprintf(stderr," %0.4g second%s",seconds,seconds!=1?"s":""); + } + +-int main(int argc, char **argv) ++static int opusenc_main(int argc, char **argv) + { + static const input_format raw_format = {NULL, 0, raw_open, wav_close, "raw",N_("RAW file reader")}; + int option_index=0; +@@ -414,7 +416,7 @@ int main(int argc, char **argv) + opt_ctls_ctlval[opt_ctls*3+2]=atoi(spos+1); + opt_ctls++; + }else if(strcmp(long_options[option_index].name,"save-range")==0){ +- frange=fopen(optarg,"w"); ++ frange=fopen_utf8(optarg,"w"); + if(frange==NULL){ + perror(optarg); + fprintf(stderr,"Could not open save-range file: %s\n",optarg); +@@ -466,7 +468,7 @@ int main(int argc, char **argv) + #endif + fin=stdin; + }else{ +- fin=fopen(inFile, "rb"); ++ fin=fopen_utf8(inFile, "rb"); + if(!fin){ + perror(inFile); + exit(1); +@@ -689,7 +691,7 @@ int main(int argc, char **argv) + #endif + fout=stdout; + }else{ +- fout=fopen(outFile, "wb"); ++ fout=fopen_utf8(outFile, "wb"); + if(!fout){ + perror(outFile); + exit(1); +@@ -907,6 +909,7 @@ int main(int argc, char **argv) + coded_seconds/wall_time, + estbitrate/1000.); + fprintf(stderr,"%s",sbuf); ++ fflush(stderr); //Required for real-time progress updates in GUI's! + last_spin_len=strlen(sbuf); + last_spin=stop_time; + } +@@ -1027,3 +1030,16 @@ static void comment_add(char **comments, int* length, char *tag, char *val) + } + #undef readint + #undef writeint ++ ++int main( int argc, char **argv ) ++{ ++ int my_argc; ++ char **my_argv; ++ int exit_code; ++ ++ init_commandline_arguments_utf8(&my_argc, &my_argv); ++ exit_code = opusenc_main(my_argc, my_argv); ++ free_commandline_arguments_utf8(&my_argc, &my_argv); ++ ++ return exit_code; ++} +diff --git a/src/opusenc.vcxproj b/src/opusenc.vcxproj +index 69f4e24..b3e003f 100644 +--- a/src/opusenc.vcxproj ++++ b/src/opusenc.vcxproj +@@ -27,6 +27,7 @@ + + + ++ + + + +@@ -41,6 +42,7 @@ + + + ++ + + + +@@ -165,9 +167,14 @@ + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreaded + Level3 +- ..\..\libogg\include;..\..\opus\include;..\win32;..\include;%(AdditionalIncludeDirectories) ++ ..\..\libogg-1.3.0\include;..\..\opus-git\include;..\win32;..\include;%(AdditionalIncludeDirectories) + true + Speed ++ Full ++ AnySuitable ++ true ++ true ++ NotSet + + + MachineX86 +@@ -175,8 +182,10 @@ + Console + true + true +- celt.lib;opus.lib;silk_common.lib;silk_float.lib;libogg_static.lib;winmm.lib;%(AdditionalDependencies) +- $(OutDir) ++ F:\DeLpHi\EncodePointerLib\Release\EncodePointer.lib;celt.lib;opus.lib;silk_common.lib;silk_float.lib;libogg_static.lib;winmm.lib;%(AdditionalDependencies) ++ $(OutDir);D:\SVN\Tools\opus-git\Release;D:\SVN\Tools\libogg-1.3.0\win32\VS2010\Win32\Release ++ UseLinkTimeCodeGeneration ++ 5.0 + + + "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" VERSION +diff --git a/src/opusenc.vcxproj.filters b/src/opusenc.vcxproj.filters +index 0d0fe39..9f2e768 100644 +--- a/src/opusenc.vcxproj.filters ++++ b/src/opusenc.vcxproj.filters +@@ -41,6 +41,9 @@ + + Source Files + ++ ++ Source Files ++ + + + +@@ -79,5 +82,8 @@ + + Header Files + ++ ++ Header Files ++ + + +\ No newline at end of file +diff --git a/src/opusinfo.vcxproj b/src/opusinfo.vcxproj +index 11eee29..538bf0c 100644 +--- a/src/opusinfo.vcxproj ++++ b/src/opusinfo.vcxproj +@@ -166,7 +166,7 @@ + WIN32;NDEBUG;_CONSOLE;HAVE_CONFIG_H;%(PreprocessorDefinitions) + MultiThreaded + Level3 +- ..\..\libogg\include;..\..\opus\include;..\win32;..\include;%(AdditionalIncludeDirectories) ++ ..\..\libogg-1.3.0\include;..\..\opus-git\include;..\win32;..\include;%(AdditionalIncludeDirectories) + true + Speed + +@@ -177,7 +177,7 @@ + true + true + celt.lib;opus.lib;silk_common.lib;silk_float.lib;libogg_static.lib;winmm.lib;%(AdditionalDependencies) +- $(OutDir) ++ $(OutDir);D:\SVN\Tools\opus-git\Release;D:\SVN\Tools\libogg-1.3.0\win32\VS2010\Win32\Release + + + "$(ProjectDir)..\win32\genversion.bat" "$(ProjectDir)..\win32\version.h" VERSION +diff --git a/src/unicode_support.c b/src/unicode_support.c +new file mode 100644 +index 0000000..e0cbbc9 +--- /dev/null ++++ b/src/unicode_support.c +@@ -0,0 +1,148 @@ ++#include "unicode_support.h" ++ ++#include ++#include ++ ++char *utf16_to_utf8(const wchar_t *input) ++{ ++ char *Buffer; ++ int BuffSize = 0, Result = 0; ++ ++ BuffSize = WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL); ++ Buffer = (char*) malloc(sizeof(char) * BuffSize); ++ if(Buffer) ++ { ++ Result = WideCharToMultiByte(CP_UTF8, 0, input, -1, Buffer, BuffSize, NULL, NULL); ++ } ++ ++ return ((Result > 0) && (Result <= BuffSize)) ? Buffer : NULL; ++} ++ ++char *utf16_to_ansi(const wchar_t *input) ++{ ++ char *Buffer; ++ int BuffSize = 0, Result = 0; ++ ++ BuffSize = WideCharToMultiByte(CP_ACP, 0, input, -1, NULL, 0, NULL, NULL); ++ Buffer = (char*) malloc(sizeof(char) * BuffSize); ++ if(Buffer) ++ { ++ Result = WideCharToMultiByte(CP_ACP, 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 = 0, Result = 0; ++ ++ BuffSize = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0); ++ Buffer = (wchar_t*) malloc(sizeof(wchar_t) * BuffSize); ++ if(Buffer) ++ { ++ 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) ++{ ++ int i, nArgs; ++ LPWSTR *szArglist; ++ ++ szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs); ++ ++ if(NULL == szArglist) ++ { ++ fprintf(stderr, "\nFATAL: CommandLineToArgvW failed\n\n"); ++ exit(-1); ++ } ++ ++ *argv = (char**) malloc(sizeof(char*) * nArgs); ++ *argc = nArgs; ++ ++ if(NULL == *argv) ++ { ++ fprintf(stderr, "\nFATAL: Malloc failed\n\n"); ++ exit(-1); ++ } ++ ++ for(i = 0; i < nArgs; i++) ++ { ++ (*argv)[i] = utf16_to_utf8(szArglist[i]); ++ if(NULL == (*argv)[i]) ++ { ++ fprintf(stderr, "\nFATAL: utf16_to_utf8 failed\n\n"); ++ exit(-1); ++ } ++ } ++ ++ LocalFree(szArglist); ++} ++ ++void free_commandline_arguments_utf8(int *argc, char ***argv) ++{ ++ int i = 0; ++ ++ if(*argv != NULL) ++ { ++ for(i = 0; i < *argc; i++) ++ { ++ if((*argv)[i] != NULL) ++ { ++ free((*argv)[i]); ++ (*argv)[i] = NULL; ++ } ++ } ++ free(*argv); ++ *argv = 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; ++} ++ ++int stat_utf8(const char *path_utf8, struct _stat *buf) ++{ ++ int ret = -1; ++ ++ wchar_t *path_utf16 = utf8_to_utf16(path_utf8); ++ if(path_utf16) ++ { ++ ret = _wstat(path_utf16, buf); ++ free(path_utf16); ++ } ++ ++ return ret; ++} ++ ++int unlink_utf8(const char *path_utf8) ++{ ++ int ret = -1; ++ ++ wchar_t *path_utf16 = utf8_to_utf16(path_utf8); ++ if(path_utf16) ++ { ++ ret = _wunlink(path_utf16); ++ free(path_utf16); ++ } ++ ++ return ret; ++} +diff --git a/src/unicode_support.h b/src/unicode_support.h +new file mode 100644 +index 0000000..6775e00 +--- /dev/null ++++ b/src/unicode_support.h +@@ -0,0 +1,16 @@ ++#ifndef UNICODE_SUPPORT_H_INCLUDED ++#define UNICODE_SUPPORT_H_INCLUDED ++ ++#include ++#include ++ ++char *utf16_to_utf8(const wchar_t *input); ++char *utf16_to_ansi(const wchar_t *input); ++wchar_t *utf8_to_utf16(const char *input); ++void init_commandline_arguments_utf8(int *argc, char ***argv); ++void free_commandline_arguments_utf8(int *argc, char ***argv); ++FILE *fopen_utf8(const char *filename_utf8, const char *mode_utf8); ++int stat_utf8(const char *path_utf8, struct _stat *buf); ++int unlink_utf8(const char *path_utf8); ++ ++#endif +\ No newline at end of file