frontend/audio.c | 11 +++++- frontend/faad.sln | 16 ++++---- frontend/main.c | 89 ++++++++++++++++++++++++++++++++--------- frontend/unicode_support.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++ frontend/unicode_support.h | 21 ++++++++++ include/neaacdec.h | 6 +-- libfaad/common.h | 4 +- libfaad/decoder.c | 6 +-- libfaad/lt_predict.c | 2 +- libfaad/output.c | 36 ++++++++--------- 10 files changed, 233 insertions(+), 56 deletions(-) diff --git a/frontend/audio.c b/frontend/audio.c index 9ab7a2a..20f92a2 100644 --- a/frontend/audio.c +++ b/frontend/audio.c @@ -39,11 +39,14 @@ #include #include "audio.h" +#include "unicode_support.h" audio_file *open_audio_file(char *infile, int samplerate, int channels, int outputFormat, int fileType, long channelMask) { + wchar_t *fileNameW; + audio_file *aufile = malloc(sizeof(audio_file)); aufile->outputFormat = outputFormat; @@ -80,7 +83,13 @@ audio_file *open_audio_file(char *infile, int samplerate, int channels, aufile->toStdio = 1; } else { aufile->toStdio = 0; - aufile->sndfile = fopen(infile, "wb"); + aufile->sndfile = NULL; + fileNameW = utf8_to_utf16(infile); + if(fileNameW) + { + aufile->sndfile = _wfopen(fileNameW, L"wb"); + free(fileNameW); + } } if (aufile->sndfile == NULL) diff --git a/frontend/faad.sln b/frontend/faad.sln index a47200b..ddbea6d 100644 --- a/frontend/faad.sln +++ b/frontend/faad.sln @@ -1,15 +1,13 @@  -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "faad", "faad.vcproj", "{2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}" - ProjectSection(ProjectDependencies) = postProject - {F470BB4A-7675-4D6A-B310-41F33AC6F987} = {F470BB4A-7675-4D6A-B310-41F33AC6F987} - {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114} = {BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114} - EndProjectSection +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "faad", "faad.vcxproj", "{2BD8CBB3-DFC9-4A6A-9B7A-07ED749BED58}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "..\libfaad\libfaad.vcproj", "{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libfaad", "..\libfaad\libfaad.vcxproj", "{BC3EFE27-9015-4C9C-AD3C-72B3B7ED2114}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mp4ff", "..\common\mp4ff\mp4ff.vcproj", "{F470BB4A-7675-4D6A-B310-41F33AC6F987}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mp4ff", "..\common\mp4ff\mp4ff.vcxproj", "{F470BB4A-7675-4D6A-B310-41F33AC6F987}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/frontend/main.c b/frontend/main.c index f943d9d..e4294d0 100644 --- a/frontend/main.c +++ b/frontend/main.c @@ -44,11 +44,13 @@ #include #include #include +#include #include #include #include "audio.h" +#include "unicode_support.h" #ifndef min #define min(a,b) ( (a) < (b) ? (a) : (b) ) @@ -71,6 +73,8 @@ static void faad_fprintf(FILE *stream, const char *fmt, ...) vfprintf(stream, fmt, ap); va_end(ap); + + fflush(stream); } } @@ -450,7 +454,7 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std NeAACDecFrameInfo frameInfo; NeAACDecConfigurationPtr config; - char percents[200]; + char percents[300]; int percent, old_percent = -1; int bread, fileread; int header_type = 0; @@ -463,11 +467,19 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std aac_buffer b; + wchar_t *fileNameW; + memset(&b, 0, sizeof(aac_buffer)); if (adts_out) { - adtsFile = fopen(adts_fn, "wb"); + adtsFile = NULL; + fileNameW = utf8_to_utf16(adts_fn); + if(fileNameW) + { + adtsFile = _wfopen(fileNameW, L"wb"); + free(fileNameW); + } if (adtsFile == NULL) { faad_fprintf(stderr, "Error opening file: %s\n", adts_fn); @@ -477,20 +489,26 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std if (0 == strcmp(aacfile, "-")) { - b.infile = stdin; + b.infile = stdin; #ifdef _WIN32 setmode(fileno(stdin), O_BINARY); #endif - - } else + } + else { - b.infile = fopen(aacfile, "rb"); - if (b.infile == NULL) - { - /* unable to open file */ - faad_fprintf(stderr, "Error opening file: %s\n", aacfile); - return 1; - } + b.infile = NULL; + fileNameW = utf8_to_utf16(aacfile); + if(fileNameW) + { + b.infile = _wfopen(fileNameW, L"rb"); + free(fileNameW); + } + if (b.infile == NULL) + { + /* unable to open file */ + faad_fprintf(stderr, "Error opening file: %s\n", aacfile); + return 1; + } } retval = fseek(b.infile, 0, SEEK_END); @@ -715,7 +733,7 @@ static int decodeAACfile(char *aacfile, char *sndfile, char *adts_fn, int to_std if (percent > old_percent) { old_percent = percent; - sprintf(percents, "%d%% decoding %s.", percent, aacfile); + _snprintf_s(percents, 300, _TRUNCATE, "[%d%%] decoding %s.", percent, aacfile); faad_fprintf(stderr, "%s\r", percents); #ifdef _WIN32 SetConsoleTitle(percents); @@ -817,7 +835,7 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std unsigned char *buffer; int buffer_size; - char percents[200]; + char percents[300]; int percent, old_percent = -1; int first_time = 1; @@ -828,6 +846,7 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std unsigned int framesize; unsigned long timescale; + wchar_t *fileNameW; /* initialise the callback structure */ mp4ff_callback_t *mp4cb = malloc(sizeof(mp4ff_callback_t)); @@ -837,7 +856,14 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std return 1; } - mp4File = fopen(mp4file, "rb"); + mp4File = NULL; + fileNameW = utf8_to_utf16(mp4file); + if(fileNameW) + { + mp4File = _wfopen(fileNameW, L"rb"); + free(fileNameW); + } + mp4cb->read = read_callback; mp4cb->seek = seek_callback; mp4cb->user_data = mp4File; @@ -854,7 +880,13 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std if (adts_out) { - adtsFile = fopen(adts_fn, "wb"); + adtsFile = NULL; + fileNameW = utf8_to_utf16(adts_fn); + if(fileNameW) + { + adtsFile = _wfopen(fileNameW, L"wb"); + free(fileNameW); + } if (adtsFile == NULL) { faad_fprintf(stderr, "Error opening file: %s\n", adts_fn); @@ -1060,7 +1092,7 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std if (percent > old_percent) { old_percent = percent; - sprintf(percents, "%d%% decoding %s.", percent, mp4file); + _snprintf_s(percents, 300, _TRUNCATE, "[%d%%] decoding %s.", percent, mp4file); faad_fprintf(stderr, "%s\r", percents); #ifdef _WIN32 SetConsoleTitle(percents); @@ -1098,7 +1130,7 @@ static int decodeMP4file(char *mp4file, char *sndfile, char *adts_fn, int to_std return frameInfo.error; } -int main(int argc, char *argv[]) +int faad_main(int argc, char *argv[]) { int result; int infoOnly = 0; @@ -1122,6 +1154,7 @@ int main(int argc, char *argv[]) unsigned char header[8]; float length = 0; FILE *hMP4File; + wchar_t *fileNameW; /* System dependant types */ #ifdef _WIN32 @@ -1352,7 +1385,13 @@ int main(int argc, char *argv[]) } else { mp4file = 0; - hMP4File = fopen(aacFileName, "rb"); + hMP4File = NULL; + fileNameW = utf8_to_utf16(aacFileName); + if(fileNameW) + { + hMP4File = _wfopen(fileNameW, L"rb"); + free(fileNameW); + } if (!hMP4File) { faad_fprintf(stderr, "Error opening file: %s\n", aacFileName); @@ -1415,3 +1454,15 @@ int main(int argc, char *argv[]) return 0; } + +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 = faad_main(argc, argv_utf8); + free_commandline_arguments_utf8(argc, &argv_utf8); + + return result; +} diff --git a/frontend/unicode_support.c b/frontend/unicode_support.c new file mode 100644 index 0000000..21ecd5c --- /dev/null +++ b/frontend/unicode_support.c @@ -0,0 +1,98 @@ +#include "unicode_support.h" + +#include +#include + +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/frontend/unicode_support.h b/frontend/unicode_support.h new file mode 100644 index 0000000..cc13fd9 --- /dev/null +++ b/frontend/unicode_support.h @@ -0,0 +1,21 @@ +#ifndef UNICODE_SUPPORT_H_INCLUDED +#define UNICODE_SUPPORT_H_INCLUDED + +#include +#include +#include + +#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/include/neaacdec.h b/include/neaacdec.h index 610a00b..7904175 100644 --- a/include/neaacdec.h +++ b/include/neaacdec.h @@ -202,7 +202,7 @@ typedef struct NeAACDecFrameInfo unsigned char ps; } NeAACDecFrameInfo; -char NEAACDECAPI *NeAACDecGetErrorMessage(unsigned char errcode); +char* NEAACDECAPI NeAACDecGetErrorMessage(unsigned char errcode); unsigned long NEAACDECAPI NeAACDecGetCapabilities(void); @@ -235,12 +235,12 @@ void NEAACDECAPI NeAACDecPostSeekReset(NeAACDecHandle hDecoder, long frame); void NEAACDECAPI NeAACDecClose(NeAACDecHandle hDecoder); -void NEAACDECAPI *NeAACDecDecode(NeAACDecHandle hDecoder, +void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size); -void NEAACDECAPI *NeAACDecDecode2(NeAACDecHandle hDecoder, +void* NEAACDECAPI NeAACDecDecode2(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, diff --git a/libfaad/common.h b/libfaad/common.h index 897a0f0..74f4a56 100644 --- a/libfaad/common.h +++ b/libfaad/common.h @@ -316,7 +316,7 @@ char *strchr(), *strrchr(); #if defined(_WIN32) && !defined(_WIN64) && !defined(__MINGW32__) #ifndef HAVE_LRINTF #define HAS_LRINTF - static INLINE int lrintf(float f) + static INLINE int FAAD_lrintf(float f) { int i; __asm @@ -332,7 +332,7 @@ char *strchr(), *strrchr(); #ifndef HAVE_LRINTF #define HAS_LRINTF // from http://www.stereopsis.com/FPU.html - static INLINE int lrintf(float f) + static INLINE int FAAD_lrintf(float f) { int i; __asm__ __volatile__ ( diff --git a/libfaad/decoder.c b/libfaad/decoder.c index 42bbc84..67feb9d 100644 --- a/libfaad/decoder.c +++ b/libfaad/decoder.c @@ -64,7 +64,7 @@ static void create_channel_config(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *hInfo); -char NEAACDECAPI *NeAACDecGetErrorMessage(unsigned char errcode) +char* NEAACDECAPI NeAACDecGetErrorMessage(unsigned char errcode) { if (errcode >= NUM_ERROR_MESSAGES) return NULL; @@ -790,7 +790,7 @@ static void create_channel_config(NeAACDecStruct *hDecoder, NeAACDecFrameInfo *h } } -void NEAACDECAPI *NeAACDecDecode(NeAACDecHandle hpDecoder, +void* NEAACDECAPI NeAACDecDecode(NeAACDecHandle hpDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size) @@ -799,7 +799,7 @@ void NEAACDECAPI *NeAACDecDecode(NeAACDecHandle hpDecoder, return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, NULL, 0); } -void NEAACDECAPI *NeAACDecDecode2(NeAACDecHandle hpDecoder, +void* NEAACDECAPI NeAACDecDecode2(NeAACDecHandle hpDecoder, NeAACDecFrameInfo *hInfo, unsigned char *buffer, unsigned long buffer_size, diff --git a/libfaad/lt_predict.c b/libfaad/lt_predict.c index 2be18ae..aa02fb0 100644 --- a/libfaad/lt_predict.c +++ b/libfaad/lt_predict.c @@ -166,7 +166,7 @@ static INLINE int16_t real_to_int16(real_t sig_in) return -32768; } - return lrintf(sig_in); + return FAAD_lrintf(sig_in); } #endif diff --git a/libfaad/output.c b/libfaad/output.c index 4245627..1aeb747 100644 --- a/libfaad/output.c +++ b/libfaad/output.c @@ -103,7 +103,7 @@ static void to_PCM_16bit(NeAACDecStruct *hDecoder, real_t **input, CLIP(inp, 32767.0f, -32768.0f); - (*sample_buffer)[i] = (int16_t)lrintf(inp); + (*sample_buffer)[i] = (int16_t)FAAD_lrintf(inp); } break; case CONV(2,0): @@ -116,8 +116,8 @@ static void to_PCM_16bit(NeAACDecStruct *hDecoder, real_t **input, CLIP(inp0, 32767.0f, -32768.0f); - (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp0); + (*sample_buffer)[(i*2)+0] = (int16_t)FAAD_lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int16_t)FAAD_lrintf(inp0); } } else { ch = hDecoder->internal_channel[0]; @@ -130,8 +130,8 @@ static void to_PCM_16bit(NeAACDecStruct *hDecoder, real_t **input, CLIP(inp0, 32767.0f, -32768.0f); CLIP(inp1, 32767.0f, -32768.0f); - (*sample_buffer)[(i*2)+0] = (int16_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int16_t)lrintf(inp1); + (*sample_buffer)[(i*2)+0] = (int16_t)FAAD_lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int16_t)FAAD_lrintf(inp1); } } break; @@ -144,7 +144,7 @@ static void to_PCM_16bit(NeAACDecStruct *hDecoder, real_t **input, CLIP(inp, 32767.0f, -32768.0f); - (*sample_buffer)[(i*channels)+ch] = (int16_t)lrintf(inp); + (*sample_buffer)[(i*channels)+ch] = (int16_t)FAAD_lrintf(inp); } } break; @@ -169,7 +169,7 @@ static void to_PCM_24bit(NeAACDecStruct *hDecoder, real_t **input, inp *= 256.0f; CLIP(inp, 8388607.0f, -8388608.0f); - (*sample_buffer)[i] = (int32_t)lrintf(inp); + (*sample_buffer)[i] = (int32_t)FAAD_lrintf(inp); } break; case CONV(2,0): @@ -183,8 +183,8 @@ static void to_PCM_24bit(NeAACDecStruct *hDecoder, real_t **input, inp0 *= 256.0f; CLIP(inp0, 8388607.0f, -8388608.0f); - (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp0); + (*sample_buffer)[(i*2)+0] = (int32_t)FAAD_lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int32_t)FAAD_lrintf(inp0); } } else { ch = hDecoder->internal_channel[0]; @@ -199,8 +199,8 @@ static void to_PCM_24bit(NeAACDecStruct *hDecoder, real_t **input, CLIP(inp0, 8388607.0f, -8388608.0f); CLIP(inp1, 8388607.0f, -8388608.0f); - (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); + (*sample_buffer)[(i*2)+0] = (int32_t)FAAD_lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int32_t)FAAD_lrintf(inp1); } } break; @@ -214,7 +214,7 @@ static void to_PCM_24bit(NeAACDecStruct *hDecoder, real_t **input, inp *= 256.0f; CLIP(inp, 8388607.0f, -8388608.0f); - (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); + (*sample_buffer)[(i*channels)+ch] = (int32_t)FAAD_lrintf(inp); } } break; @@ -239,7 +239,7 @@ static void to_PCM_32bit(NeAACDecStruct *hDecoder, real_t **input, inp *= 65536.0f; CLIP(inp, 2147483647.0f, -2147483648.0f); - (*sample_buffer)[i] = (int32_t)lrintf(inp); + (*sample_buffer)[i] = (int32_t)FAAD_lrintf(inp); } break; case CONV(2,0): @@ -253,8 +253,8 @@ static void to_PCM_32bit(NeAACDecStruct *hDecoder, real_t **input, inp0 *= 65536.0f; CLIP(inp0, 2147483647.0f, -2147483648.0f); - (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp0); + (*sample_buffer)[(i*2)+0] = (int32_t)FAAD_lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int32_t)FAAD_lrintf(inp0); } } else { ch = hDecoder->internal_channel[0]; @@ -269,8 +269,8 @@ static void to_PCM_32bit(NeAACDecStruct *hDecoder, real_t **input, CLIP(inp0, 2147483647.0f, -2147483648.0f); CLIP(inp1, 2147483647.0f, -2147483648.0f); - (*sample_buffer)[(i*2)+0] = (int32_t)lrintf(inp0); - (*sample_buffer)[(i*2)+1] = (int32_t)lrintf(inp1); + (*sample_buffer)[(i*2)+0] = (int32_t)FAAD_lrintf(inp0); + (*sample_buffer)[(i*2)+1] = (int32_t)FAAD_lrintf(inp1); } } break; @@ -284,7 +284,7 @@ static void to_PCM_32bit(NeAACDecStruct *hDecoder, real_t **input, inp *= 65536.0f; CLIP(inp, 2147483647.0f, -2147483648.0f); - (*sample_buffer)[(i*channels)+ch] = (int32_t)lrintf(inp); + (*sample_buffer)[(i*channels)+ch] = (int32_t)FAAD_lrintf(inp); } } break;