[opus] Empty buffer on encoder write byte

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


Hi,

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

Uncompressed audio recording works fine with
http://theamazingaudioengine.com/

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,
sizeof(opus_int16));
            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
length:payloadLength];
                [_socket sendData:audioData toHost:RTC_SERVER_HOST
port:RTC_MEDIA_SERVER_PORT withTimeout:PACKET_TIMEOUT tag:AUDIO_DATA_TAG];

                free(pcmInput);
                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
entenc.c:172

    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
enc_API.c:466

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

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

    frame #8: 0x000e63be RTCClient`-[JAOpusEncoder
encodeWithPCMInput:frameSize:outputBlock:](self=0x1fd2ffa0,
_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
library.

Any ideas on what I'm doing wrong?

Thanks.
-------------- 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