static void dec_process(MSFilter *f){ DecState *s=(DecState*)f->data; mblk_t *inputMessage, *outputMessage; struct BV16_Bit_Stream bs; while((inputMessage=ms_queue_get(f->inputs[0]))!=NULL){ while(inputMessage->b_rptr<inputMessage->b_wptr) { outputMessage = allocb(SIGNAL_FRAME_SIZE,0); mblk_meta_copy(inputMessage, outputMessage); BV16_BitUnPack((UWord8*)inputMessage->b_rptr, &bs); BV16_Decode(&bs, &s->state, (short*)(outputMessage->b_wptr)); outputMessage->b_wptr+=SIGNAL_FRAME_SIZE; inputMessage->b_rptr+=BITSTREAM_FRAME_SIZE; ms_queue_put(f->outputs[0],outputMessage); if (s->plc) ms_concealer_inc_sample_time(s->concealer,f->ticker->time, 5, 1); } freemsg(inputMessage); } // called every 10 ms if (s->plc && ms_concealer_context_is_concealement_required(s->concealer, f->ticker->time)) { int ms_concealed; // need to conceal 10 ms for (ms_concealed=0; ms_concealed<s->packet_ms_size; ms_concealed+=5){ outputMessage = allocb(SIGNAL_FRAME_SIZE,0); BV16_PLC(&s->state,(short*)outputMessage->b_wptr); outputMessage->b_wptr+=SIGNAL_FRAME_SIZE; mblk_set_plc_flag(outputMessage, 1); ms_queue_put(f->outputs[0],outputMessage); } ms_concealer_inc_sample_time(s->concealer,f->ticker->time,10, 0); } }
JNIEXPORT jint JNICALL Java_org_sipdroid_codecs_BV16_decode (JNIEnv *env, jobject obj, jbyteArray encoded, jshortArray lin, jint size) { unsigned int lin_pos = 0; jbyte i; if (!codec_open) return 0; // __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, // "**** BEGIN DECODE ******** decoding frame size: %d lin_pos %d last i: %d\n", size, lin_pos, i); for (i=0; i<size; i=i+BITSTREAM_SIZE) { // __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, // "**** I DECODE ****** decoding frame size: %d lin_pos %d last i: %d\n", size, lin_pos, i); env->GetByteArrayRegion(encoded, i+RTP_HDR_SIZE, BITSTREAM_SIZE,dec_buffer); BV16_BitUnPack((UWord8 *)dec_buffer, (struct BV16_Bit_Stream*)dec_bs ); BV16_Decode((struct BV16_Bit_Stream*) dec_bs,(struct BV16_Decoder_State*) dec_state, (Word16 *) dec_output_buffer); env->SetShortArrayRegion(lin, lin_pos, size,dec_output_buffer); lin_pos = lin_pos + size; } // __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, // "decoding frame size: %d lin_pos %d last i: %d\n", size, lin_pos, i); return (jint)lin_pos; }
int main(int argc, char **argv) { FILE *fi, *fo, *fbdi=NULL; int enc=1; int nread, i; short x[FRSZ]; struct BV16_Bit_Stream bs; struct BV16_Encoder_State cs; struct BV16_Decoder_State ds; #if !G192BITSTREAM UWord8 PackedStream[10]; #endif int next_bad_frame=-1; fprintf(stderr,"/***************************************************************************/\n"); fprintf(stderr,"/* BroadVoice(R)16, Copyright (c) 2000-12, Broadcom Corporation. */\n"); fprintf(stderr,"/* All Rights Reserved. */\n"); fprintf(stderr,"/* */\n"); fprintf(stderr,"/* This software is provided under the GNU Lesser General Public License, */\n"); fprintf(stderr,"/* version 2.1, as published by the Free Software Foundation (\"LGPL\"). */\n"); fprintf(stderr,"/* This program is distributed in the hope that it will be useful, but */\n"); fprintf(stderr,"/* WITHOUT ANY SUPPORT OR WARRANTY; without even the implied warranty of */\n"); fprintf(stderr,"/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the LGPL for */\n"); fprintf(stderr,"/* more details. A copy of the LGPL is available at */\n"); fprintf(stderr,"/* http://www.broadcom.com/licenses/LGPLv2.1.php, */\n"); fprintf(stderr,"/* or by writing to the Free Software Foundation, Inc., */\n"); fprintf(stderr,"/* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */\n"); fprintf(stderr,"/***************************************************************************/\n"); if ((argc!=4)&&(argc!=5)) usage(argv[0]); if (!strcmp(argv[1],"enc")) enc=1; else if (!strcmp(argv[1],"dec")) enc=0; else usage(argv[0]); if (!(fi=fopen(argv[2],"rb"))) { fprintf(stderr,"error: can't read %s\n", argv[2]); exit(2); } if (!(fo=fopen(argv[3],"wb"))) { fprintf(stderr,"error: can't write to %s\n", argv[3]); exit(3); } if (argc==5) { if (!(fbdi=fopen(argv[4],"rb"))) { fprintf(stderr,"error: can't read %s\n", argv[4]); exit(3); } } if (!strcmp(argv[1],"enc")) { Reset_BV16_Encoder(&cs); } else { Reset_BV16_Decoder(&ds); } if (enc){ #if G192BITSTREAM fprintf(stderr," BroadVoice16 Floating-Point Encoder V1.2 with ITU-T G.192\n"); #else fprintf(stderr," BroadVoice16 Floating-Point Encoder V1.2 with packed bit-stream\n"); #endif fprintf(stderr," Input speech file : %s\n",argv[2]); fprintf(stderr," Output bit-stream file: %s\n",argv[3]); } else{ #if G192BITSTREAM fprintf(stderr," BroadVoice16 Floating-Point Decoder V1.2 with ITU-T G.192\n"); #else fprintf(stderr," BroadVoice16 Floating-Point Decoder V1.2 with packed bit-stream\n"); #endif fprintf(stderr," Input bit-stream file : %s\n",argv[2]); fprintf(stderr," Output speech file : %s\n",argv[3]); } /* START THE MAIN FRAME LOOP */ frame=0; /* read for the 1st bad frame */ if (fbdi!=NULL) fscanf(fbdi,"%d", &next_bad_frame); while (1) { /* FRAME COUNTER */ frame++; /* READ IN ONE SPEECH FRAME */ if (enc==1) { nread=fread(x, sizeof(short), FRSZ, fi); if (nread<=0) goto End; for (i=nread;i<FRSZ;i++) x[i] = 0; } else { #if G192BITSTREAM nread = bv16_fread_g192bitstrm(&bs, fi); #else nread = fread( PackedStream, sizeof(UWord8), 10, fi); BV16_BitUnPack ( PackedStream, &bs ); #endif if (nread<=0) goto End; if (frame==next_bad_frame) { fscanf(fbdi,"%d", &next_bad_frame); bfi = 1; } } /* G.BRCM CODING */ if (enc==1) { BV16_Encode(&bs, &cs, x); #if G192BITSTREAM bv16_fwrite_g192bitstrm(&bs,fo); #else BV16_BitPack( PackedStream, &bs ); fwrite(PackedStream, sizeof(UWord8), 10, fo); #endif } else { if (!bfi) BV16_Decode(&bs, &ds, x); else { BV16_PLC(&ds,x); } fwrite(x, sizeof(short), FRSZ, fo); } if (((frame/100)*100)==frame) fprintf(stderr, "\r %d %d-sample frames processed.", frame, FRSZ); bfi = 0; } /* END OF FRAME LOOP */ End: ; frame--; fprintf(stderr, "\r %d 40-sample frames processed.\n", frame); fclose(fi); fclose(fo); if (fbdi!=NULL) fclose(fbdi); fprintf(stderr, "\n\n"); return 0; }