From 1ad884287b8884bb8c20d4ce7502965328a08cc2 Mon Sep 17 00:00:00 2001 From: Chris Moeller Date: Sat, 24 Jan 2015 21:08:25 -0800 Subject: [PATCH] Added G.719 decoding support to BNSF input --- ext_includes/g719.h | 23 +++++++++++++++ ext_libs/Makefile.mingw | 3 ++ ext_libs/ext_libs.vcproj | 24 ++++++++++++++++ ext_libs/ext_libs.vcxproj | 12 +++++++- ext_libs/libg719_decode.def | 6 ++++ ext_libs/libg719_decode.dll | Bin 0 -> 52224 bytes src/Makefile | 3 +- src/coding/Makefile.unix.am | 1 + src/coding/coding.h | 7 ++++- src/coding/g719_decoder.c | 29 +++++++++++++++++++ src/coding/g7221_decoder.c | 1 - src/libvgmstream.vcproj | 8 ++++-- src/libvgmstream.vcxproj | 5 ++-- src/meta/bnsf.c | 43 +++++++++++++++++++++++++++- src/vgmstream.c | 54 ++++++++++++++++++++++++++++++++++++ src/vgmstream.h | 14 ++++++++++ test/Makefile.mingw | 11 +++++--- winamp/Makefile | 11 +++++--- winamp/in_vgmstream.vcproj | 4 +-- 19 files changed, 240 insertions(+), 19 deletions(-) create mode 100755 ext_includes/g719.h create mode 100755 ext_libs/libg719_decode.def create mode 100755 ext_libs/libg719_decode.dll create mode 100644 src/coding/g719_decoder.c diff --git a/ext_includes/g719.h b/ext_includes/g719.h new file mode 100755 index 00000000..993daf23 --- /dev/null +++ b/ext_includes/g719.h @@ -0,0 +1,23 @@ +/* + Interface to reference G.719 decoder +*/ + +#ifndef G719_H +#define G719_H + +/* forward definition for the opaque handle object */ +typedef struct g719_handle_s g719_handle; + +/* return a handle for decoding on successful init, NULL on failure */ +g719_handle * g719_init(int sample_rate); + +/* decode a frame, at code_words, into 16-bit PCM in sample_buffer */ +void g719_decode_frame(g719_handle *handle, void *code_words, void *sample_buffer); + +/* reset the decoder to its initial state */ +void g719_reset(g719_handle *handle); + +/* free resources */ +void g719_free(g719_handle *handle); + +#endif diff --git a/ext_libs/Makefile.mingw b/ext_libs/Makefile.mingw index 7f4912ac..21b8ae3f 100644 --- a/ext_libs/Makefile.mingw +++ b/ext_libs/Makefile.mingw @@ -11,6 +11,9 @@ libmpg123-0.a: libmpg123-0.def libg7221_decode.a: libg7221_decode.def $(DLLTOOL) -d libg7221_decode.def -l libg7221_decode.a +libg719_decode.a: libg719_decode.def + $(DLLTOOL) -d libg719_decode.def -l libg719_decode.a + at3plusdecoder.a: at3plusdecoder.def $(DLLTOOL) -d at3plusdecoder.def -l at3plusdecoder.a diff --git a/ext_libs/ext_libs.vcproj b/ext_libs/ext_libs.vcproj index 6fadc19c..4b33caae 100644 --- a/ext_libs/ext_libs.vcproj +++ b/ext_libs/ext_libs.vcproj @@ -131,6 +131,30 @@ /> + + + + + + + + diff --git a/ext_libs/ext_libs.vcxproj b/ext_libs/ext_libs.vcxproj index 35a035bd..32628179 100644 --- a/ext_libs/ext_libs.vcxproj +++ b/ext_libs/ext_libs.vcxproj @@ -1,4 +1,4 @@ - + @@ -88,6 +88,16 @@ libg7221_decode.lib;libg7221_decode.exp;%(Outputs) + + Building library stub + lib /def:libg719_decode.def /machine:x86 + + libg719_decode.lib;libg719_decode.exp;%(Outputs) + Building library stub + lib /def:libg719_decode.def /machine:x86 + + libg719_decode.lib;libg719_decode.exp;%(Outputs) + diff --git a/ext_libs/libg719_decode.def b/ext_libs/libg719_decode.def new file mode 100755 index 00000000..9d9bdb79 --- /dev/null +++ b/ext_libs/libg719_decode.def @@ -0,0 +1,6 @@ +LIBRARY libg719_decode.dll +EXPORTS + g719_decode_frame @1 + g719_free @2 + g719_init @3 + g719_reset @4 diff --git a/ext_libs/libg719_decode.dll b/ext_libs/libg719_decode.dll new file mode 100755 index 0000000000000000000000000000000000000000..d238a4a9911972ba387c53379e550697f237af77 GIT binary patch literal 52224 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[channel]; + g719_codec_data *data = vgmstream->codec_data; + g719_codec_data *ch_data = &data[channel]; + int i; + + if (0 == vgmstream->samples_into_block) + { + VARDECL(int16_t,code_buffer); + ALLOC(code_buffer, vgmstream->interleave_block_size / 2, int16_t); + vgmstream->ch[channel].streamfile->read(ch->streamfile, (uint8_t*)code_buffer, ch->offset, vgmstream->interleave_block_size); + g719_decode_frame(ch_data->handle, code_buffer, ch_data->buffer); + } + + for (i = 0; i < samples_to_do; i++) + { + outbuf[i*channelspacing] = ch_data->buffer[vgmstream->samples_into_block+i]; + } +} + +#endif diff --git a/src/coding/g7221_decoder.c b/src/coding/g7221_decoder.c index a55e4602..6ca80b03 100644 --- a/src/coding/g7221_decoder.c +++ b/src/coding/g7221_decoder.c @@ -1,7 +1,6 @@ #include "../vgmstream.h" #ifdef VGM_USE_G7221 -#include "g7221.h" #include "coding.h" #include "../util.h" diff --git a/src/libvgmstream.vcproj b/src/libvgmstream.vcproj index 69605944..e5dd110b 100644 --- a/src/libvgmstream.vcproj +++ b/src/libvgmstream.vcproj @@ -41,7 +41,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="../ext_includes" - PreprocessorDefinitions="WIN32;VGM_USE_G7221;USE_ALLOCA;_DEBUG;_LIB;" + PreprocessorDefinitions="WIN32;VGM_USE_G7221;VGM_USE_G719;USE_ALLOCA;_DEBUG;_LIB;" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="3" @@ -103,7 +103,7 @@ + + diff --git a/src/libvgmstream.vcxproj b/src/libvgmstream.vcxproj index ea26110a..991787f5 100644 --- a/src/libvgmstream.vcxproj +++ b/src/libvgmstream.vcxproj @@ -56,7 +56,7 @@ Disabled ../ext_includes;../../qaac/mp4v2/include;../../fdk-aac/libSYS/include;../../fdk-aac/libAACdec/include;%(AdditionalIncludeDirectories) - WIN32;VGM_USE_G7221;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;USE_ALLOCA;_DEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;VGM_USE_G7221;VGM_USE_G719;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;USE_ALLOCA;_DEBUG;_LIB;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebug @@ -70,7 +70,7 @@ ../ext_includes;../../qaac/mp4v2/include;../../fdk-aac/libSYS/include;../../fdk-aac/libAACdec/include;%(AdditionalIncludeDirectories) - WIN32;VGM_USE_G7221;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;USE_ALLOCA;NDEBUG;_LIB;%(PreprocessorDefinitions) + WIN32;VGM_USE_G7221;VGM_USE_G719;VGM_USE_MP4V2;VGM_USE_FDKAAC;VGM_USE_MAIATRAC3PLUS;USE_ALLOCA;NDEBUG;_LIB;%(PreprocessorDefinitions) MultiThreaded @@ -355,6 +355,7 @@ + diff --git a/src/meta/bnsf.c b/src/meta/bnsf.c index de9a59ec..91c020b0 100644 --- a/src/meta/bnsf.c +++ b/src/meta/bnsf.c @@ -15,6 +15,7 @@ VGMSTREAM * init_vgmstream_bnsf(STREAMFILE *streamFile) { uint32_t bnsf_form; enum { form_IS14 = UINT32_C(0x49533134), /* IS14 */ + form_IS22 = UINT32_C(0x49533232), /* IS22 */ }; int channel_count = 0; @@ -32,6 +33,7 @@ VGMSTREAM * init_vgmstream_bnsf(STREAMFILE *streamFile) { int FormatChunkFound = 0; int DataChunkFound = 0; + int RiffSizeExtra = 8; /* check extension, case insensitive */ streamFile->get_name(streamFile,filename,sizeof(filename)); @@ -51,6 +53,11 @@ VGMSTREAM * init_vgmstream_bnsf(STREAMFILE *streamFile) { #ifdef VGM_USE_G7221 case form_IS14: break; +#endif +#ifdef VGM_USE_G719 + case form_IS22: + RiffSizeExtra = 0; + break; #endif default: goto fail; @@ -60,7 +67,7 @@ VGMSTREAM * init_vgmstream_bnsf(STREAMFILE *streamFile) { file_size = get_streamfile_size(streamFile); /* check for tructated RIFF */ - if (file_size < riff_size+8) goto fail; + if (file_size < riff_size+RiffSizeExtra) goto fail; /* read through chunks to verify format and find metadata */ { @@ -128,6 +135,13 @@ VGMSTREAM * init_vgmstream_bnsf(STREAMFILE *streamFile) { break; #endif +#ifdef VGM_USE_G719 + case form_IS22: + coding_type = coding_G719; + sample_count = data_size/block_size*block_samples; + + break; +#endif default: goto fail; } @@ -178,6 +192,33 @@ VGMSTREAM * init_vgmstream_bnsf(STREAMFILE *streamFile) { } #endif +#ifdef VGM_USE_G719 + if (coding_G719 == coding_type) + { + int i; + g719_codec_data *data; + + /* one data structure per channel */ + data = malloc(sizeof(g719_codec_data) * channel_count); + if (!data) + { + goto fail; + } + memset(data,0,sizeof(g719_codec_data) * channel_count); + vgmstream->codec_data = data; + + for (i = 0; i < channel_count; i++) + { + /* Siren 22 == 22khz bandwidth */ + data[i].handle = g719_init(vgmstream->interleave_block_size); + if (!data[i].handle) + { + goto fail; /* close_vgmstream is able to clean up */ + } + } + } +#endif + /* open the file, set up each channel */ { int i; diff --git a/src/vgmstream.c b/src/vgmstream.c index 8bfea849..c33b9cb9 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -465,6 +465,18 @@ void reset_vgmstream(VGMSTREAM * vgmstream) { } #endif +#ifdef VGM_USE_G719 + if (vgmstream->coding_type==coding_G719) { + g719_codec_data *data = vgmstream->codec_data; + int i; + + for (i = 0; i < vgmstream->channels; i++) + { + g719_reset(data[i].handle); + } + } +#endif + #ifdef VGM_USE_MAIATRAC3PLUS if (vgmstream->coding_type==coding_AT3plus) { maiatrac3plus_codec_data *data = vgmstream->codec_data; @@ -664,6 +676,25 @@ void close_vgmstream(VGMSTREAM * vgmstream) { } #endif +#ifdef VGM_USE_G719 + if (vgmstream->coding_type == coding_G719) { + g719_codec_data *data = vgmstream->codec_data; + + if (data) + { + int i; + + for (i = 0; i < vgmstream->channels; i++) + { + g719_free(data[i].handle); + } + free(data); + } + + vgmstream->codec_data = NULL; + } +#endif + #ifdef VGM_USE_MAIATRAC3PLUS if (vgmstream->coding_type == coding_AT3plus) { maiatrac3plus_codec_data *data = vgmstream->codec_data; @@ -978,6 +1009,10 @@ int get_vgmstream_samples_per_frame(VGMSTREAM * vgmstream) { return 32000/50; case coding_G7221: return 16000/50; +#endif +#ifdef VGM_USE_G719 + case coding_G719: + return 48000/50; #endif case coding_LSF: return 54; @@ -1086,6 +1121,9 @@ int get_vgmstream_frame_size(VGMSTREAM * vgmstream) { case coding_G7221C: case coding_G7221: #endif +#ifdef VGM_USE_G719: + case coding_G719: +#endif #ifdef VGM_USE_MAIATRAC3PLUS case coding_AT3plus: #endif @@ -1475,6 +1513,17 @@ void decode_vgmstream(VGMSTREAM * vgmstream, int samples_written, int samples_to } break; #endif +#ifdef VGM_USE_G719 + case coding_G719: + for (chan=0;chanchannels;chan++) { + decode_g719(vgmstream, + buffer+samples_written*vgmstream->channels+chan, + vgmstream->channels, + samples_to_do, + chan); + } + break; +#endif #ifdef VGM_USE_MAIATRAC3PLUS case coding_AT3plus: for (chan=0;chanchannels;chan++) { @@ -1921,6 +1970,11 @@ void describe_vgmstream(VGMSTREAM * vgmstream, char * desc, int length) { snprintf(temp,TEMPSIZE,"ITU G.722.1 annex C (Polycom Siren 14)"); break; #endif +#ifdef VGM_USE_G719 + case coding_G719: + snprintf(temp,TEMPSIZE,"ITU G.719 annex B (Polycom Siren 22)"); + break; +#endif #ifdef VGM_USE_MAIATRAC3PLUS case coding_AT3plus: snprintf(temp,TEMPSIZE,"ATRAC3plus"); diff --git a/src/vgmstream.h b/src/vgmstream.h index 91a47b57..3b4b6c43 100644 --- a/src/vgmstream.h +++ b/src/vgmstream.h @@ -16,6 +16,7 @@ enum { PATH_LIMIT = 32768 }; #define VGM_USE_MPEG /* disabled by default, defined for builds that support it */ //#define VGM_USE_G7221 +//#define VGM_USE_G719 #include "streamfile.h" #include "coding/g72x_state.h" @@ -28,6 +29,9 @@ enum { PATH_LIMIT = 32768 }; #ifdef VGM_USE_G7221 #include "g7221.h" #endif +#ifdef VGM_USE_G719 +#include "g719.h" +#endif #ifdef VGM_USE_MP4V2 #define MP4V2_NO_STDINT_DEFS @@ -125,6 +129,9 @@ typedef enum { coding_G7221, /* G.722.1 (Polycom Siren 7) */ coding_G7221C, /* G.722.1 with Annex C extension (Polycom Siren 14) */ #endif +#ifdef VGM_USE_G719 + coding_G719, +#endif coding_ACM, /* InterPlay ACM */ /* compressed NWA at various levels */ @@ -740,6 +747,13 @@ typedef struct { } g7221_codec_data; #endif +#ifdef VGM_USE_G719 +typedef struct { + sample buffer[960]; + g719_handle *handle; +} g719_codec_data; +#endif + #ifdef VGM_USE_MAIATRAC3PLUS typedef struct { sample *buffer; diff --git a/test/Makefile.mingw b/test/Makefile.mingw index 2a0f3084..22acf9a3 100644 --- a/test/Makefile.mingw +++ b/test/Makefile.mingw @@ -1,6 +1,6 @@ export SHELL = /bin/sh -export CFLAGS=-Wall -O3 -DVGM_USE_G7221 -DVGM_USE_MAIATRAC3PLUS -DVAR_ARRAYS -I../ext_includes -export LDFLAGS=-L../src -L../ext_libs -lvgmstream -lvorbis -lmpg123-0 -lg7221_decode -lat3plusdecoder -lm +export CFLAGS=-Wall -O3 -DVGM_USE_G7221 -DVGM_USE_G719 -DVGM_USE_MAIATRAC3PLUS -DVAR_ARRAYS -I../ext_includes +export LDFLAGS=-L../src -L../ext_libs -lvgmstream -lvorbis -lmpg123-0 -lg7221_decode -lg719_decode -lat3plusdecoder -lm export CC=i586-mingw32msvc-gcc export AR=i586-mingw32msvc-ar export STRIP=i586-mingw32msvc-strip @@ -8,9 +8,9 @@ export STRIP=i586-mingw32msvc-strip #export AR=i686-w64-mingw32-ar #export STRIP=i686-w64-mingw32-strip -.PHONY: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a at3plusdecoder.a +.PHONY: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a at3plusdecoder.a -test.exe: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a at3plusdecoder.a +test.exe: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a at3plusdecoder.a $(CC) $(CFLAGS) "-DVERSION=\"`../version.sh`\"" test.c $(LDFLAGS) -o test.exe $(STRIP) test.exe @@ -26,6 +26,9 @@ libmpg123-0.a: libg7221_decode.a: $(MAKE) -C ../ext_libs -f Makefile.mingw $@ +libg719_decode.a: + $(MAKE) -C ../ext_libs -f Makefile.mingw $@ + at3plusdecoder.a: $(MAKE) -C ../ext_libs -f Makefile.mingw $@ clean: diff --git a/winamp/Makefile b/winamp/Makefile index 389b374f..cca80428 100644 --- a/winamp/Makefile +++ b/winamp/Makefile @@ -1,6 +1,6 @@ export SHELL = /bin/sh -export CFLAGS=-Wall -O3 "-DVGM_USE_G7221" "-DVGM_USE_MAIATRAC3PLUS" "-DWIN32" "-DUSE_ALLOCA" -I../ext_includes -export LDFLAGS=-L../src -L../ext_libs -lvgmstream -lvorbis -lmpg123-0 -lg7221_decode -lat3plusdecoder -lm +export CFLAGS=-Wall -O3 "-DVGM_USE_G7221" "-DVGM_USE_G719" "-DVGM_USE_MAIATRAC3PLUS" "-DWIN32" "-DUSE_ALLOCA" -I../ext_includes +export LDFLAGS=-L../src -L../ext_libs -lvgmstream -lvorbis -lmpg123-0 -lg7221_decode -lg719_decode -lat3plusdecoder -lm export CC=i586-mingw32msvc-gcc export AR=i586-mingw32msvc-ar export STRIP=i586-mingw32msvc-strip @@ -11,9 +11,9 @@ export WINDRES=i586-mingw32msvc-windres #export STRIP=i686-w64-mingw32-strip #export WINDRES=i686-w64-mingw32-windres -.PHONY: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a at3plusdecoder.a +.PHONY: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a at3plusdecoder.a -in_vgmstream.dll: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a in_vgmstream.c resource.o +in_vgmstream.dll: libvgmstream.a libvorbis.a libmpg123-0.a libg7221_decode.a libg719_decode.a in_vgmstream.c resource.o $(CC) -shared -static-libgcc $(CFLAGS) "-DVERSION=\"`../version.sh`\"" in_vgmstream.c resource.o $(LDFLAGS) -o in_vgmstream.dll $(STRIP) in_vgmstream.dll @@ -32,6 +32,9 @@ libmpg123-0.a: libg7221_decode.a: $(MAKE) -C ../ext_libs -f Makefile.mingw $@ +libg719_decode.a: + $(MAKE) -C ../ext_libs -f Makefile.mingw $@ + at3plusdecoder.a: $(MAKE) -C ../ext_libs -f Makefile.mingw $@ diff --git a/winamp/in_vgmstream.vcproj b/winamp/in_vgmstream.vcproj index ebe14568..498eafbd 100644 --- a/winamp/in_vgmstream.vcproj +++ b/winamp/in_vgmstream.vcproj @@ -61,7 +61,7 @@ />