diff --git a/src/Makefile.am b/src/Makefile.am index 1eb239a1..567c321f 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,6 +8,13 @@ noinst_HEADERS = opus_decoder.h opus_encoder.h pkginclude_HEADERS = opus.h -noinst_PROGRAMS = test_opus +noinst_PROGRAMS = test_opus opus_enc opus_dec + test_opus_SOURCES = test_opus.c $(top_srcdir)/silk/test/SKP_debug.c test_opus_LDADD = libietfcodec.la $(top_builddir)/celt/libcelt/libcelt0.la $(top_builddir)/silk/libSKP_SILK_SDK.la + +opus_enc_SOURCES = opus_enc.c $(top_srcdir)/silk/test/SKP_debug.c +opus_enc_LDADD = libietfcodec.la $(top_builddir)/celt/libcelt/libcelt0.la $(top_builddir)/silk/libSKP_SILK_SDK.la + +opus_dec_SOURCES = opus_dec.c $(top_srcdir)/silk/test/SKP_debug.c +opus_dec_LDADD = libietfcodec.la $(top_builddir)/celt/libcelt/libcelt0.la $(top_builddir)/silk/libSKP_SILK_SDK.la diff --git a/src/opus_dec.c b/src/opus_dec.c new file mode 100644 index 00000000..9bf8476d --- /dev/null +++ b/src/opus_dec.c @@ -0,0 +1,116 @@ +/* Copyright (c) 2007-2008 CSIRO + Copyright (c) 2007-2009 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 +#include +#include +#include +#include "opus.h" + + +#define MAX_PACKET 1275 + +int main(int argc, char *argv[]) +{ + int err; + char *inFile, *outFile; + FILE *fin, *fout; + OpusDecoder *dec; + int len; + int frame_size, channels; + int bytes_per_packet; + unsigned char data[MAX_PACKET]; + int rate; + int loss = 0; + int count = 0; + int stop=0; + int vbr=0; + int tot_read=0; + short *in, *out; + int mode=MODE_HYBRID; + double bits=0; + if (argc != 6 && argc != 7) + { + fprintf (stderr, "Usage: test_opus " + " [] [] " + " \n"); + return 1; + } + + rate = atoi(argv[1]); + channels = atoi(argv[2]); + frame_size = atoi(argv[3]); + + if (argc >= 7) + loss = atoi(argv[4]); + + inFile = argv[argc-2]; + fin = fopen(inFile, "rb"); + if (!fin) + { + fprintf (stderr, "Could not open input file %s\n", argv[argc-2]); + return 1; + } + outFile = argv[argc-1]; + fout = fopen(outFile, "wb+"); + if (!fout) + { + fprintf (stderr, "Could not open output file %s\n", argv[argc-1]); + return 1; + } + + dec = opus_decoder_create(rate, channels); + + out = (short*)malloc(frame_size*channels*sizeof(short)); + while (!stop) + { + len = ((fgetc(fin)<<8)&0xFF00) | (fgetc(fin)&0xFF); + if (feof(fin) || len>MAX_PACKET) + break; + bits += len*8; + err = fread(data, 1, len, fin); + opus_decode(dec, rand()%100 +#include +#include +#include +#include "opus.h" + + +#define MAX_PACKET 1024 + +int main(int argc, char *argv[]) +{ + int err; + char *inFile, *outFile; + FILE *fin, *fout; + OpusEncoder *enc; + int len; + int frame_size, channels; + int bytes_per_packet; + unsigned char data[MAX_PACKET]; + int rate; + int count = 0; + int stop=0; + int vbr=0; + int tot_read=0, tot_written=0; + short *in, *out; + int mode=MODE_HYBRID; + double bits=0; + if (argc != 9 && argc != 8 && argc != 7) + { + fprintf (stderr, "Usage: test_opus " + " [] [] " + " \n"); + return 1; + } + + rate = atoi(argv[1]); + channels = atoi(argv[2]); + frame_size = atoi(argv[3]); + + bytes_per_packet = atoi(argv[4]); + + if (argc >= 8) + vbr = atoi(argv[5]); + + if (bytes_per_packet < 0 || bytes_per_packet > MAX_PACKET) + { + fprintf (stderr, "bytes per packet must be between 0 and %d\n", + MAX_PACKET); + return 1; + } + + inFile = argv[argc-2]; + fin = fopen(inFile, "rb"); + if (!fin) + { + fprintf (stderr, "Could not open input file %s\n", argv[argc-2]); + return 1; + } + outFile = argv[argc-1]; + fout = fopen(outFile, "wb+"); + if (!fout) + { + fprintf (stderr, "Could not open output file %s\n", argv[argc-1]); + return 1; + } + + enc = opus_encoder_create(rate, channels); + + mode = MODE_HYBRID; + opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(BANDWIDTH_FULLBAND)); + opus_encoder_ctl(enc, OPUS_SET_MODE(mode)); + + if (vbr) + opus_encoder_ctl(enc, OPUS_SET_VBR_RATE(vbr)); + + in = (short*)malloc(frame_size*channels*sizeof(short)); + while (!stop) + { + int write_samples; + err = fread(in, sizeof(short), frame_size*channels, fin); + tot_read += err; + if (err < frame_size*channels) + { + int i; + for (i=err;i>8)&0xFF, fout); + fputc((len)&0xFF, fout); + fwrite(data, 1, len, fout); + } + fprintf (stderr, "average bit-rate: %f kb/s\n", bits*rate/(frame_size*(double)count)); + opus_encoder_destroy(enc); + fclose(fin); + fclose(fout); + free(in); + free(out); + return 0; +}