static int enc_set_br(MSFilter *f, void *arg){ SpeexEncState *s=(SpeexEncState*)f->data; ms_filter_lock(f); s->maxbitrate=((int*)arg)[0]; if (s->state) apply_max_bitrate(s); ms_filter_unlock(f); return 0; }
static void ms_opus_enc_preprocess(MSFilter *f) { int error; OpusEncData *d = (OpusEncData *)f->data; /* create the encoder */ d->state = opus_encoder_create(d->samplerate, d->channels, d->application, &error); if (error != OPUS_OK) { ms_error("Opus encoder creation failed: %s", opus_strerror(error)); return; } /* set complexity to 0 for single processor arm devices */ #if defined(__arm__) || defined(_M_ARM) if (ms_factory_get_cpu_count(f->factory)==1){ opus_encoder_ctl(d->state, OPUS_SET_COMPLEXITY(0)); }else{ opus_encoder_ctl(d->state, OPUS_SET_COMPLEXITY(5)); } #endif error = opus_encoder_ctl(d->state, OPUS_SET_PACKET_LOSS_PERC(10)); if (error != OPUS_OK) { ms_error("Could not set default loss percentage to opus encoder: %s", opus_strerror(error)); } /* set the encoder parameters: VBR, IN_BAND_FEC, DTX and bitrate settings */ ms_opus_enc_set_vbr(f); ms_opus_enc_set_inbandfec(f); ms_opus_enc_set_dtx(f); /* if decoder prefers mono signal, force encoder to output mono signal */ if (d->stereo == 0) { error = opus_encoder_ctl(d->state, OPUS_SET_FORCE_CHANNELS(1)); if (error != OPUS_OK) { ms_error("could not force mono channel to opus encoder: %s", opus_strerror(error)); } if (d->channels == 2) ms_message("Opus encoder configured to encode mono despite it is feed with stereo."); }else if (d->channels == 2){ ms_message("Opus encoder configured to encode stereo."); } ms_filter_lock(f); // set bitrate wasn't call, compute it with the default network bitrate (36000) if (d->bitrate==-1) { compute_max_bitrate(d, 0); } apply_max_bitrate(d); ms_filter_unlock(f); }
static int ms_opus_enc_set_bitrate(MSFilter *f, void *arg) { OpusEncData *d = (OpusEncData *)f->data; int ptimeStepValue = 0; int ptimeStepSign = 1; int ptimeTarget = d->ptime; int bitrate = *((int *)arg); // the argument is the network bitrate requested /* this function also manage the ptime, check if we are increasing or decreasing the bitrate in order to possibly decrease or increase ptime */ if (d->bitrate>0 && d->ptime>0) { /* at first call to set_bitrate(bitrate is initialised at -1), do not modify ptime, neither if it wasn't initialised too */ if (bitrate > d->max_network_bitrate ) { ptimeStepSign = -1; } /* if the change requested is higher than the expected modification gained by changing ptime, do it */ /* target ptime is 20 more or less than current one, but in range [20,120] */ ptimeTarget = d->ptime+ptimeStepSign*20; if (ptimeTarget<20) { ptimeTarget = 20; } if (ptimeTarget>120) { ptimeTarget = 120; } // ABS(difference of current and requested bitrate) ABS(current network bandwidth overhead - new ptime target overhead) if ( (d->max_network_bitrate - bitrate)*ptimeStepSign > (((40*8*1000)/d->ptime - (40*8*1000)/ptimeTarget) * ptimeStepSign)) { ptimeStepValue = 20; } } d->max_network_bitrate = bitrate; ms_message("opus setbitrate to %d",d->max_network_bitrate); if (d->bitrate>0 && d->ptime>0) { /*don't apply bitrate before prepocess*/ ms_filter_lock(f); compute_max_bitrate(d, ptimeStepValue*ptimeStepSign); apply_max_bitrate(d); ms_filter_unlock(f); } return 0; }
static void ms_opus_enc_preprocess(MSFilter *f) { int error; OpusEncData *d = (OpusEncData *)f->data; /* create the encoder */ d->state = opus_encoder_create(d->samplerate, d->channels, d->application, &error); if (error != OPUS_OK) { ms_error("Opus encoder creation failed: %s", opus_strerror(error)); return; } /* set complexity to 0 for arm devices */ #ifdef __arm__ opus_encoder_ctl(d->state, OPUS_SET_COMPLEXITY(0)); #endif error = opus_encoder_ctl(d->state, OPUS_SET_PACKET_LOSS_PERC(10)); if (error != OPUS_OK) { ms_error("Could not set default loss percentage to opus encoder: %s", opus_strerror(error)); } /* set the encoder parameters: VBR, IN_BAND_FEC, DTX and bitrate settings */ ms_opus_enc_set_vbr(f); ms_opus_enc_set_inbandfec(f); ms_opus_enc_set_dtx(f); /* if decoder prefers mono signal, force encoder to output mono signal */ if (d->stereo == 0) { error = opus_encoder_ctl(d->state, OPUS_SET_FORCE_CHANNELS(1)); if (error != OPUS_OK) { ms_error("could not force mono channel to opus encoder: %s", opus_strerror(error)); } } ms_filter_lock(f); if (d->ptime==-1) { // set ptime wasn't call, set default:20ms d->ptime = 20; } if (d->bitrate==-1) { // set bitrate wasn't call, compute it with the default network bitrate (36000) compute_max_bitrate(d, 0); } apply_max_bitrate(d); ms_filter_unlock(f); }
static void enc_preprocess(MSFilter *f){ SpeexEncState *s=(SpeexEncState*)f->data; const SpeexMode *mode=NULL; int _mode=0; switch(s->rate){ case 8000: _mode = SPEEX_MODEID_NB; /* rate = 8000Hz */ break; case 16000: _mode = SPEEX_MODEID_WB; /* rate = 16000Hz */ break; /* should be supported in the future */ case 32000: _mode = SPEEX_MODEID_UWB; /* rate = 32000Hz */ break; default: ms_error("Unsupported rate for speex encoder (back to default rate=8000)."); s->rate=8000; } /* warning: speex_lib_get_mode() is not available on speex<1.1.12 */ mode = speex_lib_get_mode(_mode); if (mode==NULL) return; s->state=speex_encoder_init(mode); if (s->vbr==1) { if (speex_encoder_ctl(s->state,SPEEX_SET_VBR,&s->vbr)!=0){ ms_error("Could not set vbr mode to speex encoder."); } /* implicit VAD */ speex_encoder_ctl (s->state, SPEEX_SET_DTX, &s->vbr); } else if (s->vbr==2) { int vad=1; /* VAD */ speex_encoder_ctl (s->state, SPEEX_SET_VAD, &vad); speex_encoder_ctl (s->state, SPEEX_SET_DTX, &vad); } else if (s->cng==1) { speex_encoder_ctl (s->state, SPEEX_SET_VAD, &s->cng); } if (s->rate==8000){ //+------+---------------+-------------+ //| mode | Speex quality | bit-rate | //+------+---------------+-------------+ //| 1 | 0 | 2.15 kbit/s | //| 2 | 2 | 5.95 kbit/s | //| 3 | 3 or 4 | 8.00 kbit/s | //| 4 | 5 or 6 | 11.0 kbit/s | //| 5 | 7 or 8 | 15.0 kbit/s | //| 6 | 9 | 18.2 kbit/s | //| 7 | 10 | 24.6 kbit/s | //| 8 | 1 | 3.95 kbit/s | //+------+---------------+-------------+ if (s->mode<=0 || s->mode>8) s->mode = 3; /* default mode */ if (s->mode==1) s->bitrate = 2150; else if (s->mode==2) s->bitrate = 5950; else if (s->mode==3) s->bitrate = 8000; else if (s->mode==4) s->bitrate = 11000; else if (s->mode==5) s->bitrate = 15000; else if (s->mode==6) s->bitrate = 18200; else if (s->mode==7) s->bitrate = 24600; else if (s->mode==8) s->bitrate = 3950; if (s->bitrate!=-1){ if (speex_encoder_ctl(s->state,SPEEX_SET_BITRATE,&s->bitrate)!=0){ ms_error("Could not set bitrate %i to speex encoder.",s->bitrate); } } } else if (s->rate==16000 || s->rate==32000){ //+------+---------------+-------------------+------------------------+ //| mode | Speex quality | wideband bit-rate | ultra wideband | //| | | | bit-rate | //+------+---------------+-------------------+------------------------+ //| 0 | 0 | 3.95 kbit/s | 5.75 kbit/s | //| 1 | 1 | 5.75 kbit/s | 7.55 kbit/s | //| 2 | 2 | 7.75 kbit/s | 9.55 kbit/s | //| 3 | 3 | 9.80 kbit/s | 11.6 kbit/s | //| 4 | 4 | 12.8 kbit/s | 14.6 kbit/s | //| 5 | 5 | 16.8 kbit/s | 18.6 kbit/s | //| 6 | 6 | 20.6 kbit/s | 22.4 kbit/s | //| 7 | 7 | 23.8 kbit/s | 25.6 kbit/s | //| 8 | 8 | 27.8 kbit/s | 29.6 kbit/s | //| 9 | 9 | 34.2 kbit/s | 36.0 kbit/s | //| 10 | 10 | 42.2 kbit/s | 44.0 kbit/s | //+------+---------------+-------------------+------------------------+ int q=0; if (s->mode<0 || s->mode>10) s->mode = 8; /* default mode */ q=s->mode; if (speex_encoder_ctl(s->state,SPEEX_SET_QUALITY,&q)!=0){ ms_error("Could not set quality %i to speex encoder.",q); } } apply_max_bitrate(s); speex_mode_query(mode,SPEEX_MODE_FRAME_SIZE,&s->frame_size); }
static void ms_opus_enc_preprocess(MSFilter *f) { int error; int opusComplexity = -1; const char *env = NULL; OpusEncData *d = (OpusEncData *)f->data; /* create the encoder */ d->state = opus_encoder_create(d->samplerate, d->channels, d->application, &error); if (error != OPUS_OK) { ms_error("Opus encoder creation failed: %s", opus_strerror(error)); return; } #ifndef MS2_WINDOWS_UNIVERSAL env = getenv("MS2_OPUS_COMPLEXITY"); #endif if (env != NULL) { opusComplexity = atoi(env); if (opusComplexity < -1) opusComplexity = -1; /*our default value*/ if (opusComplexity > 10) opusComplexity = 10; } if (opusComplexity == -1){ #if defined(__arm__) || defined(_M_ARM) int cpucount = ms_factory_get_cpu_count(f->factory); if (cpucount == 1){ opusComplexity = 0; /* set complexity to 0 for single processor arm devices */ }else if (cpucount == 2) { opusComplexity = 5; } #endif } if (opusComplexity != -1){ ms_message("Set Opus complexity to %d", opusComplexity); opus_encoder_ctl(d->state, OPUS_SET_COMPLEXITY(opusComplexity)); } /*otherwise we let opus with its default value, which is 9*/ error = opus_encoder_ctl(d->state, OPUS_SET_PACKET_LOSS_PERC(10)); if (error != OPUS_OK) { ms_error("Could not set default loss percentage to opus encoder: %s", opus_strerror(error)); } /* set the encoder parameters: VBR, IN_BAND_FEC, DTX and bitrate settings */ ms_opus_enc_set_vbr(f); ms_opus_enc_set_inbandfec(f); ms_opus_enc_set_dtx(f); /* if decoder prefers mono signal, force encoder to output mono signal */ if (d->stereo == 0) { error = opus_encoder_ctl(d->state, OPUS_SET_FORCE_CHANNELS(1)); if (error != OPUS_OK) { ms_error("could not force mono channel to opus encoder: %s", opus_strerror(error)); } if (d->channels == 2) ms_message("Opus encoder configured to encode mono despite it is feed with stereo."); }else if (d->channels == 2){ ms_message("Opus encoder configured to encode stereo."); } ms_filter_lock(f); // set bitrate wasn't call, compute it with the default network bitrate (36000) if (d->bitrate==-1) { compute_max_bitrate(d, 0); } apply_max_bitrate(d); ms_filter_unlock(f); }