[opus] Empty buffer on encoder write byte

Jesse Armand armand.jesse at gmail.com
Sun May 26 23:38:01 PDT 2013


I've been trying to encode a live audio input from the microphone on iOS
device using opus.

Uncompressed audio recording works fine with

Then, when I tried to do encoding, I'm stuck at figuring out why the buffer
is empty:

static int ec_write_byte(ec_enc *_this,unsigned _value){
  if(_this->offs+_this->end_offs>=_this->storage)return -1;
  _this->buf[_this->offs++]=(unsigned char)_value;
  return 0;

_this->buf is pointing to 1 byte unsigned char, which is basically has no
data in it, and it throws a bad access exception, at this function.

I set the max data bytes for output payload to 2048, application mode as
VoIP, and complexity to 5.

The following is a snippet in ObjC where I did the encoding:

    self.inputReceiver = [AEBlockAudioReceiver
audioReceiverWithBlock:^(void *source, const AudioTimeStamp *time, UInt32
frames, AudioBufferList *bufferList) {

        UInt32 numberOfBuffers = bufferList->mNumberBuffers;

        for (int bufferIndex = 0; bufferIndex < numberOfBuffers ;
++bufferIndex) {
            AudioBuffer audioBuffer = bufferList->mBuffers[bufferIndex];

            int frameSize = (samplingRate/1000) * sampleDuration; //
sampling rate is 8000, sample duration is 20ms
            size_t count = frameSize*channels / sizeof(opus_int16);
            __block opus_int16 *pcmInput = calloc(count,
            memcpy(pcmInput, audioBuffer.mData, count * sizeof(opus_int16));

            [_encoder encodeWithPCMInput:pcmInput frameSize:frameSize
outputBlock:^(unsigned char *payloadOutput, opus_int32 payloadLength) {
                // Send the audio data through UDP socket.

                NSData *audioData = [NSData dataWithBytes:payloadOutput
                [_socket sendData:audioData toHost:RTC_SERVER_HOST

                pcmInput = NULL;

The following is the backtrace:

* thread #6: tid = 0x231f, 0x00180506
RTCClient`ec_enc_carry_out(_this=0x04232238, _c=61) + 42 at entenc.c:62,
stop reason = EXC_BAD_ACCESS (code=1, address=0x1)

    frame #0: 0x00180506 RTCClient`ec_enc_carry_out(_this=0x04232238,
_c=61) + 42 at entenc.c:62

    frame #1: 0x0018070a RTCClient`ec_enc_icdf [inlined]
ec_enc_normalize(_this=0x04232238) + 24 at entenc.c:104

    frame #2: 0x001806f2 RTCClient`ec_enc_icdf(_this=0x04232238) + 62 at

    frame #3: 0x001880c0 RTCClient`silk_encode_indices(psEncC=0x0422c1c0,
psRangeEnc=0x04232238) + 232 at encode_indices.c:85

    frame #4: 0x00192fee RTCClient`silk_encode_frame_FLP(psEnc=0x04239bb4,
pnBytesOut=0x000027d8, psRangeEnc=0x04232238, condCoding=69435308) + 1886
at encode_frame_FLP.c:196

    frame #5: 0x00187de8 RTCClient`silk_Encode(encState=0x001f000b,
encControl=0xffd2ffe2, samplesIn=0xffc4ffce, nSamplesIn=-5570589) + 2792 at

    frame #6: 0x0019a1ce RTCClient`opus_encode_float(st=0x04234000,
pcm=0x3b6c0000, frame_size=985923584, data=0x04232018) + 3922 at

    frame #7: 0x0019abd2 RTCClient`opus_encode() + 74 at opus_encoder.c:1306

    frame #8: 0x000e63be RTCClient`-[JAOpusEncoder
_cmd=0x0019d131, pcmInput=0x21024870, frameSize=160,
outputBlock=0x04232898) + 386 at JAOpusEncoder.m:98

JAOpusEncoder is an ObjC class that encodes the PCM input using opus

Any ideas on what I'm doing wrong?

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.xiph.org/pipermail/opus/attachments/20130527/9c049e19/attachment.htm 

More information about the opus mailing list