From c97b258c628ae6bd0e8e6229a8f398c980dfae77 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Fri, 28 Jan 2011 23:07:32 -0500 Subject: [PATCH] celt_encoder_create() now defaults to Opus standard mode The old constructor is renamed celt_encoder_create_custom(). Same for the decoder. --- libcelt/celt.c | 34 ++++++++++++++++++++++++++++++---- libcelt/celt.h | 30 ++++++++++++++++++++++++++---- libcelt/modes.c | 12 +++++++++--- libcelt/testcelt.c | 4 ++-- tests/tandem-test.c | 17 ++++++++++++++--- tools/celtdec.c | 2 +- tools/celtenc.c | 2 +- 7 files changed, 83 insertions(+), 18 deletions(-) diff --git a/libcelt/celt.c b/libcelt/celt.c index b8283845..66bf4018 100644 --- a/libcelt/celt.c +++ b/libcelt/celt.c @@ -127,14 +127,27 @@ int celt_encoder_get_size(const CELTMode *mode, int channels) return size; } -CELTEncoder *celt_encoder_create(const CELTMode *mode, int channels, int *error) +CELTEncoder *celt_encoder_create(int channels, int *error) { + CELTMode *mode = celt_mode_create(48000, 960, NULL); return celt_encoder_init( + (CELTEncoder *)celt_alloc(celt_encoder_get_size(mode, channels)), + channels, error); +} + +CELTEncoder *celt_encoder_create_custom(const CELTMode *mode, int channels, int *error) +{ + return celt_encoder_init_custom( (CELTEncoder *)celt_alloc(celt_encoder_get_size(mode, channels)), mode, channels, error); } -CELTEncoder *celt_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels, int *error) +CELTEncoder *celt_encoder_init(CELTEncoder *st, int channels, int *error) +{ + return celt_encoder_init_custom(st, celt_mode_create(48000, 960, NULL), channels, error); +} + +CELTEncoder *celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int channels, int *error) { if (channels < 0 || channels > 2) { @@ -1672,14 +1685,27 @@ int celt_decoder_get_size(const CELTMode *mode, int channels) return size; } -CELTDecoder *celt_decoder_create(const CELTMode *mode, int channels, int *error) +CELTDecoder *celt_decoder_create(int channels, int *error) { + const CELTMode *mode = celt_mode_create(48000, 960, NULL); return celt_decoder_init( + (CELTDecoder *)celt_alloc(celt_decoder_get_size(mode, channels)), + channels, error); +} + +CELTDecoder *celt_decoder_create_custom(const CELTMode *mode, int channels, int *error) +{ + return celt_decoder_init_custom( (CELTDecoder *)celt_alloc(celt_decoder_get_size(mode, channels)), mode, channels, error); } -CELTDecoder *celt_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels, int *error) +CELTDecoder *celt_decoder_init(CELTDecoder *st, int channels, int *error) +{ + return celt_decoder_init_custom(st, celt_mode_create(48000, 960, NULL), channels, error); +} + +CELTDecoder *celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int channels, int *error) { if (channels < 0 || channels > 2) { diff --git a/libcelt/celt.h b/libcelt/celt.h index fddef5aa..a8270d31 100644 --- a/libcelt/celt.h +++ b/libcelt/celt.h @@ -163,6 +163,14 @@ EXPORT int celt_encoder_get_size(const CELTMode *mode, int channels); /** Creates a new encoder state. Each stream needs its own encoder state (can't be shared across simultaneous streams). + @param channels Number of channels + @param error Returns an error code + @return Newly created encoder state. +*/ +EXPORT CELTEncoder *celt_encoder_create(int channels, int *error); + +/** Creates a new encoder state. Each stream needs its own encoder + state (can't be shared across simultaneous streams). @param mode Contains all the information about the characteristics of * the stream (must be the same characteristics as used for the * decoder) @@ -170,9 +178,11 @@ EXPORT int celt_encoder_get_size(const CELTMode *mode, int channels); @param error Returns an error code @return Newly created encoder state. */ -EXPORT CELTEncoder *celt_encoder_create(const CELTMode *mode, int channels, int *error); +EXPORT CELTEncoder *celt_encoder_create_custom(const CELTMode *mode, int channels, int *error); -EXPORT CELTEncoder *celt_encoder_init(CELTEncoder *st, const CELTMode *mode, int channels, int *error); +EXPORT CELTEncoder *celt_encoder_init(CELTEncoder *st, int channels, int *error); + +EXPORT CELTEncoder *celt_encoder_init_custom(CELTEncoder *st, const CELTMode *mode, int channels, int *error); /** Destroys a an encoder state. @param st Encoder state to be destroyed @@ -235,9 +245,21 @@ EXPORT int celt_decoder_get_size(const CELTMode *mode, int channels); @param error Returns an error code @return Newly created decoder state. */ -EXPORT CELTDecoder *celt_decoder_create(const CELTMode *mode, int channels, int *error); +EXPORT CELTDecoder *celt_decoder_create(int channels, int *error); -EXPORT CELTDecoder *celt_decoder_init(CELTDecoder *st, const CELTMode *mode, int channels, int *error); +/** Creates a new decoder state. Each stream needs its own decoder state (can't + be shared across simultaneous streams). + @param mode Contains all the information about the characteristics of the + stream (must be the same characteristics as used for the encoder) + @param channels Number of channels + @param error Returns an error code + @return Newly created decoder state. + */ +EXPORT CELTDecoder *celt_decoder_create_custom(const CELTMode *mode, int channels, int *error); + +EXPORT CELTDecoder *celt_decoder_init(CELTDecoder *st, int channels, int *error); + +EXPORT CELTDecoder *celt_decoder_init_custom(CELTDecoder *st, const CELTMode *mode, int channels, int *error); /** Destroys a a decoder state. @param st Decoder state to be destroyed diff --git a/libcelt/modes.c b/libcelt/modes.c index 35985b66..3f59284b 100644 --- a/libcelt/modes.c +++ b/libcelt/modes.c @@ -278,10 +278,16 @@ CELTMode *celt_mode_create(celt_int32 Fs, int frame_size, int *error) for (i=0;iFs && - frame_size == static_mode_list[i]->shortMdctSize*static_mode_list[i]->nbShortMdcts) + int j; + for (j=0;j<4;j++) { - return (CELTMode*)static_mode_list[i]; + if (Fs == static_mode_list[i]->Fs && + (frame_size<shortMdctSize*static_mode_list[i]->nbShortMdcts) + { + if (error) + *error = CELT_OK; + return (CELTMode*)static_mode_list[i]; + } } } #ifndef CUSTOM_MODES diff --git a/libcelt/testcelt.c b/libcelt/testcelt.c index d14272f6..4c45868c 100644 --- a/libcelt/testcelt.c +++ b/libcelt/testcelt.c @@ -107,13 +107,13 @@ int main(int argc, char *argv[]) return 1; } - enc = celt_encoder_create(mode, channels, &err); + enc = celt_encoder_create_custom(mode, channels, &err); if (err != 0) { fprintf(stderr, "Failed to create the encoder: %s\n", celt_strerror(err)); return 1; } - dec = celt_decoder_create(mode, channels, &err); + dec = celt_decoder_create_custom(mode, channels, &err); if (err != 0) { fprintf(stderr, "Failed to create the decoder: %s\n", celt_strerror(err)); diff --git a/tests/tandem-test.c b/tests/tandem-test.c index e1f21baf..e45f8f2c 100644 --- a/tests/tandem-test.c +++ b/tests/tandem-test.c @@ -85,12 +85,12 @@ int async_tandem(int rate, int frame_size, int channels, int bitrate_min, exit(1); } - dec = celt_decoder_create(mode, channels, &error); + dec = celt_decoder_create_custom(mode, channels, &error); if (error){ fprintf(stderr, "Error: celt_decoder_create returned %s\n", celt_strerror(error)); exit(1); } - enc = celt_encoder_create(mode, channels, &error); + enc = celt_encoder_create_custom(mode, channels, &error); if (error){ fprintf(stderr, "Error: celt_encoder_create returned %s\n", celt_strerror(error)); exit(1); @@ -167,7 +167,11 @@ int async_tandem(int rate, int frame_size, int channels, int bitrate_min, int main(int argc, char *argv[]) { +#ifdef CUSTOM_MODES int sizes[8]={960,480,240,120,512,256,128,64}; +#else + int sizes[4]={960,480,240,120}; +#endif unsigned int seed; int ch, n; @@ -184,6 +188,7 @@ int main(int argc, char *argv[]) srand(seed); printf("CELT codec tests. Random seed: %u (%.4X)\n", seed, rand() % 65536); +#ifdef CUSTOM_MODES for (n = 0; n < 8; n++) { for (ch = 1; ch <= 2; ch++) { async_tandem(48000, sizes[n], ch, 12000 * ch, 128000 * ch); @@ -192,6 +197,12 @@ int main(int argc, char *argv[]) async_tandem(16000, sizes[n], ch, 12000 * ch, 64000 * ch); } } - +#else + for (n = 0; n < 4; n++) { + for (ch = 1; ch <= 2; ch++) { + async_tandem(48000, sizes[n], ch, 12000 * ch, 128000 * ch); + } + } +#endif return 0; } diff --git a/tools/celtdec.c b/tools/celtdec.c index 23e1e1e3..c26fa686 100644 --- a/tools/celtdec.c +++ b/tools/celtdec.c @@ -315,7 +315,7 @@ static CELTDecoder *process_header(ogg_packet *op, celt_int32 enh_enabled, celt_ *channels = header.nb_channels; *overlap=header.overlap; - st = celt_decoder_create(*mode, header.nb_channels, NULL); + st = celt_decoder_create_custom(*mode, header.nb_channels, NULL); if (!st) { fprintf (stderr, "Decoder initialization failed.\n"); diff --git a/tools/celtenc.c b/tools/celtenc.c index 65d93116..458fe6fa 100644 --- a/tools/celtenc.c +++ b/tools/celtenc.c @@ -525,7 +525,7 @@ int main(int argc, char **argv) } /*Initialize CELT encoder*/ - st = celt_encoder_create(mode, chan, NULL); + st = celt_encoder_create_custom(mode, chan, NULL); if (!with_cbr) {