diff options
Diffstat (limited to 'src/opusencoder.cc')
-rw-r--r-- | src/opusencoder.cc | 70 |
1 files changed, 16 insertions, 54 deletions
diff --git a/src/opusencoder.cc b/src/opusencoder.cc index 77ea0d1..b5c343a 100644 --- a/src/opusencoder.cc +++ b/src/opusencoder.cc @@ -27,98 +27,62 @@ #include "opusencoder.h" #include <string.h> -#include <opus/opus.h> #include <stdio.h> -#include "samplecache.h" - #define OPUS_BITRATE 64000 -struct opus_encoder_private_t { - OpusEncoder *ce; - SampleCache *cache; -}; - OpusEncoder::OpusEncoder() + : cache(5760 * 10) { - prv = new struct opus_encoder_private_t; - - prv->cache = new SampleCache(5760 * 10); - int error = 0; - - samplerate_t srate = opus_samplerate(); - - prv->ce = - opus_encoder_create(srate, 1/*channels()*/, OPUS_APPLICATION_AUDIO, &error); - if(!prv->ce || error != OPUS_OK) { - printf("srate: %d, ch: %d, Error: %d\n", srate, 1/*channels()*/, error); - //throw InitException(); + encoder = + opus_encoder_create(48000, 1, OPUS_APPLICATION_AUDIO, &error); + if(!encoder || error != OPUS_OK) { + printf("opus_encoder_create: %d\n", error); } // 500 to 512000 - opus_encoder_ctl(prv->ce, OPUS_SET_BITRATE(OPUS_BITRATE/*bitrate()*/)); + opus_encoder_ctl(encoder, OPUS_SET_BITRATE(OPUS_BITRATE)); // [0-10] with 10 representing the highest complexity. - opus_encoder_ctl(prv->ce, OPUS_SET_COMPLEXITY(10)); - - /* - printf("Encoder(fs: %d, ch: %d, bitrate: %d)\n", srate, channels(), - bitrate()); - */ + opus_encoder_ctl(encoder, OPUS_SET_COMPLEXITY(10)); } OpusEncoder::~OpusEncoder() { - if(prv) { - if(prv->ce) opus_encoder_destroy(prv->ce); - if(prv->cache) delete prv->cache; - delete prv; - } + if(encoder) opus_encoder_destroy(encoder); } unsigned int OpusEncoder::framesize() { - return opus_samplerate() / 1000 * OPUS_FRAME_SIZE; // 10ms audio data -} - -samplerate_t OpusEncoder::opus_samplerate() -{ - return 48000; + return 48000 / 1000 * OPUS_FRAME_SIZE; // 10ms audio data } framelist_t OpusEncoder::encode(const char *pcm, size_t size) { framelist_t list; - // printf("PCM size: %d\n", size); - - samplerate_t srate = opus_samplerate(); - - if(prv->ce == NULL) { + if(encoder == NULL) { //throw InitException(); - printf("prv->ce == NULL\n"); + printf("encoder == NULL\n"); } - size_t bytes_per_packet = ((OPUS_BITRATE/*bitrate()*/ *framesize())/srate+4)/8; + size_t bytes_per_packet = ((OPUS_BITRATE *framesize())/48000+4)/8; - prv->cache->addSamples((short*)pcm, size / sizeof(short)); + cache.addSamples((short*)pcm, size / sizeof(short)); //size_t p = 0; opus_int16 *samples = new opus_int16[framesize()]; - while(prv->cache->cacheSize() >= framesize()) { - size_t sz = prv->cache->getSamples(samples, framesize()); + while(cache.cacheSize() >= framesize()) { + size_t sz = cache.getSamples(samples, framesize()); Frame *frame = new Frame(bytes_per_packet); - int n = opus_encode(prv->ce, samples, sz / 1/*channels()*//*sizeof(short)*/, + int n = opus_encode(encoder, samples, sz / 1, (unsigned char *)frame->data, (opus_int32)frame->size); - //printf("Compressed to %d\n", n); - if(n < 0) { printf("n < 0\n"); - //throw EncodingException(); } frame->size = n; @@ -127,7 +91,5 @@ framelist_t OpusEncoder::encode(const char *pcm, size_t size) } delete[] samples; - //printf("%d frames in list\n", list.size()); - return list; } |