-------Original Message------- From: Eid Date: 10/09/05 14:07:44 To: speex-dev@xiph.org Subject: problem in encoder/decoder hi all, I'm developing an app to broadcast voice over web. i tried to use speex and download ver 1.04 documentation and use it to develop encoding and decoding but after decoding voice is damaged i attach my encode/decode function. BOOL EncodeSpeex(CVoiceMsg *pMsg) { SpeexBits bits; void* enc_state; // Initialize. speex_bits_init(&bits); enc_state = speex_encoder_init(&speex_nb_mode); int frame_size = 0; // get frame size. speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&frame_size); int nbBytes = 0; //unsigned char *input_frame,*encodedstr; unsigned char *encodedstr; float* input_frame;//approx of frame size input_frame = new float[frame_size]; encodedstr = new unsigned char[MAX_FRAME_BYTES]; ZeroMemory(input_frame,frame_size); ZeroMemory(encodedstr,MAX_FRAME_BYTES); int pos = 0; unsigned char*result; result = new unsigned char[pMsg->m_nBufferSize]; ZeroMemory(result,pMsg->m_nBufferSize); int encoded_bytes =0; int complexity=4; int bitrate =3; speex_encoder_ctl(enc_state, SPEEX_SET_COMPLEXITY, &complexity); //speex_encoder_ctl(enc_state, SPEEX_SET_SAMPLING_RATE, &rate); speex_encoder_ctl(enc_state, SPEEX_SET_BITRATE, &bitrate); int tmp=1; // speex_encoder_ctl(enc_state, SPEEX_SET_VAD, &tmp); while(pos<pMsg->m_nBufferSize && encoded_bytes<pMsg->m_nBufferSize) { if((pMsg->m_nBufferSize-pos)>frame_size) { CopyMemory(input_frame,pMsg->m_pBuffer+pos,frame_size); pos += frame_size; } else { CopyMemory(input_frame,pMsg->m_pBuffer+pos,pMsg->m_nBufferSize-pos); pos+=(pMsg->m_nBufferSize-pos); } //encode input frame speex_bits_reset(&bits); speex_encode(enc_state,input_frame,&bits); nbBytes = speex_bits_write(&bits,(char*)encodedstr,MAX_FRAME_BYTES); unsigned char lenbytes[1]; lenbytes[0]=nbBytes; CopyMemory(result+encoded_bytes ,lenbytes,1); encoded_bytes++; CopyMemory(result+encoded_bytes ,encodedstr,nbBytes); encoded_bytes+= nbBytes; } // save again to message buffer if(pMsg->m_pBuffer != NULL) { delete pMsg->m_pBuffer; pMsg->m_pBuffer = NULL; } pMsg->m_pBuffer = new UCHAR[encoded_bytes]; CopyMemory(pMsg->m_pBuffer,result,encoded_bytes); pMsg->m_nBufferSize = encoded_bytes; // destroy and free resources... speex_bits_destroy(&bits); speex_encoder_destroy(enc_state); delete[] result; delete[] input_frame ; delete[] encodedstr; result = NULL; input_frame = NULL; encodedstr = NULL; return TRUE; } where pMsg->m_pBuffer is an UCHAR buffer containing recorded speech. and at the end of encode it contains the encoded bytes. BOOL DecodeSpeex(CVoiceMsg *pMsg) { SpeexBits bits; void* dec_state; // Initialize. speex_bits_init(&bits); dec_state = speex_decoder_init(&speex_nb_mode); int frame_size = 0; // get frame size. speex_decoder_ctl(dec_state,SPEEX_GET_FRAME_SIZE,&frame_size); int nbBytes = 0; unsigned char *input_frame; short *output_frame; input_frame = new unsigned char[frame_size]; int enh = 1; speex_decoder_ctl(dec_state,SPEEX_SET_ENH,&enh); unsigned char*result; int scale=25; int size= max(pMsg->m_nBufferSize*scale frame_size*scale*(pMsg->m_nBufferSize/frame_size)) + frame_size*scale; result = new unsigned char[size]; ZeroMemory(result,size); output_frame = new short[frame_size]; ZeroMemory(output_frame,frame_size); float* out_float; out_float = new float[frame_size]; ZeroMemory(out_float,frame_size); int encoded_bytes =0; int pos=0; while(pos<pMsg->m_nBufferSize && encoded_bytes<size) { nbBytes = pMsg->m_pBuffer[pos]; if(nbBytes>frame_size) nbBytes = frame_size; if((pMsg->m_nBufferSize-pos)<nbBytes) nbBytes = pMsg->m_nBufferSize-pos; pos++;// skip lenght byte. CopyMemory(input_frame,pMsg->m_pBuffer+pos,nbBytes); //encode input frame. speex_bits_read_from(&bits,(char*)input_frame,nbBytes); speex_decode(dec_state,&bits,out_float); //speex_decode_int(dec_state,&bits,output_frame); //output_frame =(short*) out_float; for(int i=0;i<frame_size;i++) output_frame[i] = out_float[i]; pos += nbBytes; CopyMemory(result+encoded_bytes,output_frame,frame_size); encoded_bytes+= frame_size; } speex_bits_destroy(&bits); speex_decoder_destroy(dec_state); // save again to message buffer if(pMsg->m_pBuffer != NULL) { delete pMsg->m_pBuffer; pMsg->m_pBuffer = NULL; } pMsg->m_pBuffer = new UCHAR[encoded_bytes]; CopyMemory(pMsg->m_pBuffer,result,encoded_bytes); pMsg->m_nBufferSize = encoded_bytes; pMsg->m_nSampleSize = pMsg->m_nBufferSize / 2;//wfx2.nBlockAlign; delete[] result; delete[] output_frame ; delete[] input_frame; result = NULL; input_frame = NULL; output_frame = NULL; return TRUE; }