[opus] Moving from Speex to Opus (question 2)

Hermann Weber hermie.weber at gmx.de
Thu May 9 23:26:39 PDT 2013


Hello!

The API is really friendly, that is true.
I just did not find sample code for decoding larger amounts of encoded data.

I guess that this is "too easy" and will not work:

void COpusCodec::Decode(unsigned char* encoded, short* decoded, unsigned 
int len)
{
     int max_size=960*6;

     int error;
     dec = opus_decoder_create(48000, 1, &error);//decode to 48kHz mono

     int frame_size=opus_decode(dec, encoded, len, decoded, max_size, 0);
}

The argument "encoded" might be larger amounts of data, so I think I 
have to split it into frames.
For Speex I used the following:

void CSpxCodec::Decode(unsigned char* inbuf, short* outbuf, unsigned int
len)
{

      char cbits[MAX_FRAME_BYTES];
      float output[MAX_FRAME_SIZE];

      unsigned int i=0;
      unsigned int j=0;

      for (i=0; i<(len/62); i++)
      {

          for (j=0;j<62;j++)
          {
              cbits[j] = inbuf[(i*62)+j];
          }

          speex_bits_read_from(&bits, cbits, 62);
          speex_decode(decstate, &bits, output);

          for (j=0;j<160;j++)
          {
              outbuf[j+(i*160)] = output[j];
          }
      }
}

But for Opus I did not find any sample code that would reflect my situation.
Can anybody help?

Thank you.
Hermie





Am 09.05.2013 20:37, schrieb Jean-Marc Valin:
> Look at the examples in the API doc. The Opus API is different from
> Speex, bit it's still pretty simple (probably even simpler than Speex).
>
> 	Jean-Marc
>
> On 09/05/13 02:30 PM, Hermann Weber wrote:
>> Hello!
>>
>> I was using Speex all the time, and I am now moving to Opus.
>>
>> I had encapsulated the decoder a bit, I had the following cpp file:
>>
>> #include "StdAfx.h"
>> #include "spxcodec.h"
>>
>> #define MAX_FRAME_SIZE 2000
>> #define MAX_FRAME_BYTES 2000
>>
>> CSpxCodec::CSpxCodec() : enh(1), rate(8000)
>> {
>> }
>>
>>
>> CSpxCodec::~CSpxCodec()
>> {
>> }
>>
>> void CSpxCodec::Init()
>> {
>>       speex_bits_init(&bits);
>>       decstate = speex_decoder_init(&speex_nb_mode);
>>
>>       speex_decoder_ctl(decstate, SPEEX_SET_SAMPLING_RATE, &rate);
>>       speex_decoder_ctl(decstate, SPEEX_SET_ENH, &enh);
>>
>>       int iFrameSize=0;
>>       speex_decoder_ctl(decstate, SPEEX_GET_FRAME_SIZE, &iFrameSize);
>>
>> }
>>
>> void CSpxCodec::Free()
>> {
>>       speex_bits_destroy(&bits);
>>       speex_decoder_destroy(decstate);
>> }
>>
>> void CSpxCodec::Decode(unsigned char* inbuf, short* outbuf, unsigned int
>> len)
>> {
>>
>>       char cbits[MAX_FRAME_BYTES];
>>       float output[MAX_FRAME_SIZE];
>>
>>       unsigned int i=0;
>>       unsigned int j=0;
>>
>>       for (i=0; i<(len/62); i++)
>>       {
>>
>>           for (j=0;j<62;j++)
>>           {
>>               cbits[j] = inbuf[(i*62)+j];
>>           }
>>
>>           speex_bits_read_from(&bits, cbits, 62);
>>           speex_decode(decstate, &bits, output);
>>
>>           for (j=0;j<160;j++)
>>           {
>>               outbuf[j+(i*160)] = output[j];
>>           }
>>       }
>> }
>> -------------------
>> I would like to ask if I can keep this "wrapper".
>> Please anybody tell me that I can just replace the word "speex" with
>> "opus", and it will work, hehehehehe!
>> Can I keep the 62, 160 part, or will that be different in Opus?
>> I am not asking because I am lazy, I am just scared because Opus look so
>> much different than Speex, and there is no "encoding/decoding for
>> dummies" example as there was in Speex.
>> Could anybody perhaps give me another push in the right direction and
>> tell me how a good starting point for Opus newbies?
>>
>> Thank you so much.
>>
>> Greetings,
>> Hermie
>> _______________________________________________
>> opus mailing list
>> opus at xiph.org
>> http://lists.xiph.org/mailman/listinfo/opus
>>
>



More information about the opus mailing list