diff --git a/README b/README index 709bd5e3c397ecd4c403c45ad0a17481888d3588..33ee0d5f1d55689761c104d7abd3bbe98658af38 100644 --- a/README +++ b/README @@ -8,7 +8,7 @@ To compile: % make To test the encoder: -% testcelt [-mono|-stereo] <rate> input.sw output.sw +% testcelt <rate> <channels> <frame size> <overlap> <bytes per packet> input.sw output.sw where input.sw is a 16-bit (machine endian) audio file sampled at 44.1 kHz or 48 kHz. The output file is already decompressed. diff --git a/configure.ac b/configure.ac index fc7724dc26cb71a0f9fe0f77de132f1eb11e6869..04c2736e4d8b0e3fb6126a9b66c57ab1be1e4bbf 100644 --- a/configure.ac +++ b/configure.ac @@ -7,7 +7,7 @@ AM_CONFIG_HEADER([config.h]) CELT_MAJOR_VERSION=0 CELT_MINOR_VERSION=2 CELT_MICRO_VERSION=0 -CELT_EXTRA_VERSION=-git +CELT_EXTRA_VERSION= CELT_VERSION=$CELT_MAJOR_VERSION.$CELT_MINOR_VERSION.$CELT_MICRO_VERSION$CELT_EXTRA_VERSION CELT_LT_CURRENT=0 diff --git a/libcelt/celt_header.h b/libcelt/celt_header.h index fd152d017cdff20fb333afc19daff7e3c6a3d47b..e267e22f59d4c7b0197110dac421681c257fb444 100644 --- a/libcelt/celt_header.h +++ b/libcelt/celt_header.h @@ -47,15 +47,16 @@ typedef struct { char codec_version[20]; /**< Version used (as string) */ celt_int32_t version_id; /**< Version id (negative for until stream is frozen) */ celt_int32_t header_size; /**< Size of this header */ - celt_int32_t mode; /**< Mode used for encoding (to be removed) */ celt_int32_t sample_rate; /**< Sampling rate of the original audio */ celt_int32_t nb_channels; /**< Number of channels */ + celt_int32_t frame_size; /**< Samples per frame (per channel) */ + celt_int32_t overlap; /**< Overlapping samples (per channel) */ celt_int32_t bytes_per_packet; /**< Number of bytes per compressed packet (0 if unknown) */ celt_int32_t extra_headers; /**< Number of additional headers that follow this header */ } CELTHeader; /** Creates a basic header struct */ -void celt_header_init(CELTHeader *header, celt_int32_t rate, celt_int32_t nb_channels, const CELTMode *m); +void celt_header_init(CELTHeader *header, const CELTMode *m); int celt_header_to_packet(const CELTHeader *header, unsigned char *packet, celt_uint32_t size); diff --git a/libcelt/header.c b/libcelt/header.c index 6fab1d13403a3f8cb3c76fe8549c764be98d8a84..6e024086dab1126683d61f56f0304b7d35dfc227 100644 --- a/libcelt/header.c +++ b/libcelt/header.c @@ -35,6 +35,7 @@ #include "celt_header.h" #include "os_support.h" +#include "modes.h" /*typedef struct { char codec_id[8]; @@ -61,16 +62,17 @@ _le_32 (celt_uint32_t i) return ret; } -void celt_header_init(CELTHeader *header, celt_int32_t rate, celt_int32_t nb_channels, const CELTMode *m) +void celt_header_init(CELTHeader *header, const CELTMode *m) { CELT_COPY(header->codec_id, "CELT ", 8); CELT_COPY(header->codec_version, "experimental ", 20); - header->version_id = 0x80000000; + header->version_id = 0x80000001; header->header_size = 56; - header->mode = 0; - header->sample_rate = rate; - header->nb_channels = nb_channels; + header->sample_rate = m->Fs; + header->nb_channels = m->nbChannels; + header->frame_size = m->mdctSize; + header->overlap = m->overlap; header->bytes_per_packet = -1; header->extra_headers = 0; } @@ -91,9 +93,10 @@ int celt_header_to_packet(const CELTHeader *header, unsigned char *packet, celt_ h = (celt_int32_t*)(packet+28); *h++ = _le_32 (header->version_id); *h++ = _le_32 (header->header_size); - *h++ = _le_32 (header->mode); *h++ = _le_32 (header->sample_rate); *h++ = _le_32 (header->nb_channels); + *h++ = _le_32 (header->frame_size); + *h++ = _le_32 (header->overlap); *h++ = _le_32 (header->bytes_per_packet); *h++ = _le_32 (header->extra_headers); diff --git a/tools/celtdec.c b/tools/celtdec.c index 95c999ea154b1bb3752426d3c313ae386fc6d367..039bc2d0f9560d80b67f68c3924d5ef95cdf9182 100644 --- a/tools/celtdec.c +++ b/tools/celtdec.c @@ -286,41 +286,33 @@ void version_short() printf ("Copyright (C) 2008 Jean-Marc Valin\n"); } -static CELTDecoder *process_header(ogg_packet *op, celt_int32_t enh_enabled, celt_int32_t *frame_size, int *granule_frame_size, celt_int32_t *rate, int *nframes, int forceMode, int *channels, int *extra_headers, int quiet) +static CELTDecoder *process_header(ogg_packet *op, celt_int32_t enh_enabled, celt_int32_t *frame_size, int *granule_frame_size, celt_int32_t *rate, int *nframes, int forceMode, int *channels, int *extra_headers, int quiet, CELTMode **mode) { CELTDecoder *st; - const CELTMode *mode; CELTHeader header; - int modeID; celt_header_from_packet((char*)op->packet, op->bytes, &header); - - if (header.mode==0) - { - mode = celt_mono; - *channels = 1; - } else if (header.mode==1) + + if (header.nb_channels>2 || header.nb_channels<1) { - mode = celt_stereo; - *channels = 2; - } else { - fprintf (stderr, "Invalid mode: %d\n", header.mode); + fprintf (stderr, "Unsupported number of channels: %d\n", header.nb_channels); return NULL; } + *mode = celt_mode_create(header.sample_rate, header.nb_channels, header.frame_size, header.overlap, NULL); + *channels = header.nb_channels; - st = celt_decoder_create(mode); + st = celt_decoder_create(*mode); if (!st) { fprintf (stderr, "Decoder initialization failed.\n"); return NULL; } - celt_mode_info(mode, CELT_GET_FRAME_SIZE, frame_size); + celt_mode_info(*mode, CELT_GET_FRAME_SIZE, frame_size); *granule_frame_size = *frame_size; if (!*rate) *rate = header.sample_rate; - /* Adjust rate if --force-* options are used */ *nframes = 1; @@ -350,6 +342,7 @@ int main(int argc, char **argv) short output[MAX_FRAME_SIZE]; int frame_size=0, granule_frame_size=0; void *st=NULL; + CELTMode *mode=NULL; unsigned char bits[1000]; int packet_count=0; int stream_init = 0; @@ -537,7 +530,7 @@ int main(int argc, char **argv) /*If first packet, process as CELT header*/ if (packet_count==0) { - st = process_header(&op, enh_enabled, &frame_size, &granule_frame_size, &rate, &nframes, forceMode, &channels, &extra_headers, quiet); + st = process_header(&op, enh_enabled, &frame_size, &granule_frame_size, &rate, &nframes, forceMode, &channels, &extra_headers, quiet, &mode); if (!st) exit(1); //FIXME: Do that properly @@ -660,9 +653,10 @@ int main(int argc, char **argv) } if (st) - celt_decoder_destroy(st); - else { + celt_decoder_destroy(st); + celt_mode_destroy(mode); + } else { fprintf (stderr, "This doesn't look like a CELT file\n"); } if (stream_init) diff --git a/tools/celtenc.c b/tools/celtenc.c index 15898aa92ec12ef97ddf53e68212cd3c511efadc..9b7240b9a70ee28cc8acd6f64ac5e1d1f6fab7d9 100644 --- a/tools/celtenc.c +++ b/tools/celtenc.c @@ -241,7 +241,7 @@ int main(int argc, char **argv) celt_int32_t frame_size; int quiet=0; int nbBytes; - const CELTMode *mode=celt_mono; + CELTMode *mode; void *st; unsigned char bits[MAX_FRAME_BYTES]; int with_skeleton = 0; @@ -432,7 +432,6 @@ int main(int argc, char **argv) if (chan == 1) { - mode = celt_mono; if (bitrate < 0) bitrate = 64; if (bitrate < 40) @@ -442,7 +441,6 @@ int main(int argc, char **argv) } else if (chan == 2) { - mode = celt_stereo; if (bitrate < 0) bitrate = 128; if (bitrate < 64) @@ -453,17 +451,16 @@ int main(int argc, char **argv) fprintf (stderr, "Only mono and stereo are supported\n"); return 1; } + mode = celt_mode_create(rate, chan, 256, 128, NULL); + if (!mode) + return 1; celt_mode_info(mode, CELT_GET_FRAME_SIZE, &frame_size); bytes_per_packet = (bitrate*1000*frame_size/rate+4)/8; - celt_header_init(&header, rate, 1, mode); + celt_header_init(&header, mode); header.nb_channels = chan; - if (chan == 1) - header.mode = 0; - else if (chan == 2) - header.mode = 1; - + { char *st_string="mono"; if (chan==2) @@ -663,6 +660,7 @@ int main(int argc, char **argv) } celt_encoder_destroy(st); + celt_mode_destroy(mode); ogg_stream_clear(&os); if (close_in)