Initial support for opus_enc/opus_dec
This commit is contained in:
parent
01b15eb259
commit
cf60e7adec
3 changed files with 268 additions and 1 deletions
|
@ -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
|
||||
|
|
116
src/opus_dec.c
Normal file
116
src/opus_dec.c
Normal file
|
@ -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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#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 <rate (kHz)> <channels> <frame size> "
|
||||
" <bytes per packet> [<VBR rate (kb/s)>] [<packet loss rate>] "
|
||||
"<input> <output>\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<loss ? NULL : data, len, out, frame_size);
|
||||
count++;
|
||||
fwrite(out, sizeof(short), frame_size*channels, fout);
|
||||
}
|
||||
fprintf (stderr, "average bit-rate: %f kb/s\n", bits*rate/(frame_size*(double)count));
|
||||
opus_decoder_destroy(dec);
|
||||
fclose(fin);
|
||||
fclose(fout);
|
||||
free(in);
|
||||
free(out);
|
||||
return 0;
|
||||
}
|
144
src/opus_enc.c
Normal file
144
src/opus_enc.c
Normal file
|
@ -0,0 +1,144 @@
|
|||
/* 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 <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#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 <rate (kHz)> <channels> <frame size> "
|
||||
" <bytes per packet> [<VBR rate (kb/s)>] [<packet loss rate>] "
|
||||
"<input> <output>\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<frame_size*channels;i++)
|
||||
in[i] = 0;
|
||||
stop = 1;
|
||||
}
|
||||
len = opus_encode(enc, in, frame_size, data, bytes_per_packet);
|
||||
if (len <= 0)
|
||||
{
|
||||
fprintf (stderr, "opus_encode() returned %d\n", len);
|
||||
return 1;
|
||||
}
|
||||
bits += len*8;
|
||||
count++;
|
||||
fputc((len>>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;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue