diff options
Diffstat (limited to 'Src/aacdec-mft/NSVAACDecoder.cpp')
-rw-r--r-- | Src/aacdec-mft/NSVAACDecoder.cpp | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/Src/aacdec-mft/NSVAACDecoder.cpp b/Src/aacdec-mft/NSVAACDecoder.cpp new file mode 100644 index 00000000..4fd067e8 --- /dev/null +++ b/Src/aacdec-mft/NSVAACDecoder.cpp @@ -0,0 +1,121 @@ +#include "NSVAACDecoder.h" + +#include <assert.h> +#include "api.h" +#include "../nsv/nsvlib.h" +#include "api.h" +#include "../nsv/nsvlib.h" +#include "../nsv/dec_if.h" +#include <string.h> +#include <bfc/platform/export.h> +#include "NSVAACDecoder.h" +#include <bfc/error.h> +#ifndef MIN +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#endif + +NSVAACDecoder *NSVAACDecoder::CreateDecoder() +{ + NSVAACDecoder *decoder=0; + WASABI_API_MEMMGR->New(&decoder); + if (!decoder) + { + return 0; + } + decoder->Initialize(); + return decoder; +} + +NSVAACDecoder::NSVAACDecoder() +{ + source_position=0; + out_left=0; + in_position=0; +} + +NSVAACDecoder::~NSVAACDecoder() +{ + +} + +void NSVAACDecoder::Initialize() +{ + decoder.Open(); +} + +void NSVAACDecoder::flush() +{ + decoder.Flush(); +} + +// returns -1 on error, 0 on success (done with data in 'in'), 1 on success +// but to pass 'in' again next time around. +int NSVAACDecoder::decode(void *in, int in_len, void *out, int *out_len, unsigned int out_fmt[8]) +{ + HRESULT hr; + size_t local_out_len = *out_len; + if (SUCCEEDED(decoder.Decode(out, &local_out_len, 16, false, 1.0))) { + *out_len = (int)local_out_len; + if (local_out_len) { + uint32_t local_sample_rate, local_channels; + if (SUCCEEDED(decoder.GetOutputProperties(&local_sample_rate, &local_channels))) { + + out_fmt[0] = NSV_MAKETYPE('P', 'C', 'M', ' '); + out_fmt[1] = local_sample_rate; + out_fmt[2] = local_channels; + out_fmt[3] = 16; + } + return 1; + } + } + + hr = decoder.Feed(in, in_len); + if (FAILED(hr)) { + hr=hr; + } + + + local_out_len = *out_len; + if (SUCCEEDED(decoder.Decode(out, &local_out_len, 16, false, 1.0))) { + *out_len = (int)local_out_len; + if (local_out_len) { + uint32_t local_sample_rate, local_channels; + if (SUCCEEDED(decoder.GetOutputProperties(&local_sample_rate, &local_channels))) { + + out_fmt[0] = NSV_MAKETYPE('P', 'C', 'M', ' '); + out_fmt[1] = local_sample_rate; + out_fmt[2] = local_channels; + out_fmt[3] = 16; + } + } + } else { + *out_len = 0; + } + return 0; +} + + + +IAudioDecoder *NSVDecoder::CreateAudioDecoder(FOURCC format, IAudioOutput **output) +{ + switch (format) + { + case NSV_MAKETYPE('A', 'A', 'C', ' ') : + case NSV_MAKETYPE('A', 'A', 'C', 'P'): + case NSV_MAKETYPE('A', 'P', 'L', ' '): + { + NSVAACDecoder *dec = NSVAACDecoder::CreateDecoder(); + return dec; + } + + default: + return 0; + } +} + + +#define CBCLASS NSVDecoder +START_DISPATCH; +CB(SVC_NSVFACTORY_CREATEAUDIODECODER, CreateAudioDecoder) +END_DISPATCH; +#undef CBCLASS |