[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