diff options
author | Jean-Marc Valin <jean-marc.valin@octasic.com> | 2010-06-30 23:03:35 +0400 |
---|---|---|
committer | Jean-Marc Valin <jean-marc.valin@octasic.com> | 2010-06-30 23:03:35 +0400 |
commit | 04584eac3178e3f68dc5f0b07cfc4a1ec3cd2406 (patch) | |
tree | b5bb9fed75407f9b354e9600e40f802e93baa4ae /src | |
parent | 8bb076bbf3c9e564b0a6d343f0e975ddbb3785c7 (diff) |
Decoder structure
Diffstat (limited to 'src')
-rw-r--r-- | src/hybrid.h | 11 | ||||
-rw-r--r-- | src/hybrid_decoder.c | 88 | ||||
-rw-r--r-- | src/hybrid_decoder.h | 46 | ||||
-rw-r--r-- | src/hybrid_encoder.c | 2 | ||||
-rw-r--r-- | src/test_hybrid.c | 7 |
5 files changed, 149 insertions, 5 deletions
diff --git a/src/hybrid.h b/src/hybrid.h index 37d7f020..ae03293b 100644 --- a/src/hybrid.h +++ b/src/hybrid.h @@ -30,10 +30,19 @@ */ typedef struct HybridEncoder HybridEncoder; +typedef struct HybridDecoder HybridDecoder; HybridEncoder *hybrid_encoder_create(); -int hybrid_encode(HybridEncoder *st, short *pcm, int frame_size, +int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size, unsigned char *data, int bytes_per_packet); void hybrid_encoder_destroy(HybridEncoder *st); + + +HybridDecoder *hybrid_decoder_create(); +int hybrid_decode(HybridDecoder *st, const unsigned char *data, int len, + short *pcm, int frame_size); + +void hybrid_decoder_destroy(HybridDecoder *st); + diff --git a/src/hybrid_decoder.c b/src/hybrid_decoder.c new file mode 100644 index 00000000..2617faf4 --- /dev/null +++ b/src/hybrid_decoder.c @@ -0,0 +1,88 @@ +/* Copyright (c) 2010 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include "hybrid_decoder.h" +#include "celt/libcelt/entdec.h" + + +HybridDecoder *hybrid_decoder_create() +{ + HybridDecoder *st; + + st = malloc(sizeof(HybridDecoder)); + + /* FIXME: Initialize SILK encoder here */ + st->silk_dec = NULL; + + /* We should not have to create a CELT mode for each encoder state */ + st->celt_mode = celt_mode_create(48000, 960, NULL); + /* Initialize CELT encoder */ + st->celt_dec = celt_decoder_create(st->celt_mode, 1, NULL); + + return st; + +} +int hybrid_decode(HybridDecoder *st, const unsigned char *data, + int len, short *pcm, int frame_size) +{ + int celt_ret; + ec_dec dec; + ec_byte_buffer buf; + + ec_byte_readinit(&buf,(unsigned char*)data,len); + ec_dec_init(&dec,&buf); + + /* FIXME: Call SILK encoder for the low band */ + + /* This should be adjusted based on the SILK bandwidth */ + celt_decoder_ctl(st->celt_dec, CELT_SET_START_BAND(13)); + + /* Encode high band with CELT */ + celt_ret = celt_decode_with_ec(st->celt_dec, data, len, pcm, NULL, frame_size, &dec); + + return celt_ret; + +} + +void hybrid_decoder_destroy(HybridDecoder *st) +{ + /* FIXME: Destroy SILK encoder state */ + + celt_decoder_destroy(st->celt_dec); + celt_mode_destroy(st->celt_mode); + + free(st); +} diff --git a/src/hybrid_decoder.h b/src/hybrid_decoder.h new file mode 100644 index 00000000..85a7b21e --- /dev/null +++ b/src/hybrid_decoder.h @@ -0,0 +1,46 @@ +/* Copyright (c) 2010 Xiph.Org Foundation + Written by Jean-Marc Valin */ +/* + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + - Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + - Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + - Neither the name of the Xiph.org Foundation nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR + CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +#ifndef HYBRID_DECODER_H +#define HYBRID_DECODER_H + +#include "celt/libcelt/celt.h" +#include "hybrid.h" + +struct HybridDecoder { + CELTMode *celt_mode; + CELTDecoder *celt_dec; + void *silk_dec; +}; + + +#endif /* HYBRID_DECODER_H */ + diff --git a/src/hybrid_encoder.c b/src/hybrid_encoder.c index e68baa73..778a2af3 100644 --- a/src/hybrid_encoder.c +++ b/src/hybrid_encoder.c @@ -55,7 +55,7 @@ HybridEncoder *hybrid_encoder_create() return st; } -int hybrid_encode(HybridEncoder *st, short *pcm, int frame_size, +int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size, unsigned char *data, int bytes_per_packet) { int celt_ret; diff --git a/src/test_hybrid.c b/src/test_hybrid.c index f49ea766..440c65d8 100644 --- a/src/test_hybrid.c +++ b/src/test_hybrid.c @@ -49,6 +49,7 @@ int main(int argc, char *argv[]) char *inFile, *outFile; FILE *fin, *fout; HybridEncoder *enc; + HybridDecoder *dec; int len; int frame_size, channels; int bytes_per_packet; @@ -93,7 +94,7 @@ int main(int argc, char *argv[]) } enc = hybrid_encoder_create(); - /*dec = hybrid_decoder_create();*/ + dec = hybrid_decoder_create(); in = (short*)malloc(frame_size*channels*sizeof(short)); out = (short*)malloc(frame_size*channels*sizeof(short)); @@ -109,14 +110,14 @@ int main(int argc, char *argv[]) return 1; } /* This is for simulating bit errors */ - /*hybrid_decode(dec, data, len, out, frame_size);*/ + hybrid_decode(dec, data, len, out, frame_size); count++; fwrite(out+skip, sizeof(short), (frame_size-skip)*channels, fout); skip = 0; } hybrid_encoder_destroy(enc); - /*hybrid_decoder_destroy(dec);*/ + hybrid_decoder_destroy(dec); fclose(fin); fclose(fout); free(in); |