Home | History | Annotate | Download | only in libspeex

Lines Matching refs:st

65 #define SUBMODE(x) st->submodes[st->submodeID]->x
116 EncState *st;
121 st = (EncState*)speex_alloc(sizeof(EncState));
122 if (!st)
125 st->stack = NULL;
127 st->stack = (char*)speex_alloc_scratch(NB_ENC_STACK);
130 st->mode=m;
132 st->frameSize = mode->frameSize;
133 st->nbSubframes=mode->frameSize/mode->subframeSize;
134 st->subframeSize=mode->subframeSize;
135 st->windowSize = st->frameSize+st->subframeSize;
136 st->lpcSize = mode->lpcSize;
137 st->gamma1=mode->gamma1;
138 st->gamma2=mode->gamma2;
139 st->min_pitch=mode->pitchStart;
140 st->max_pitch=mode->pitchEnd;
141 st->lpc_floor = mode->lpc_floor;
143 st->submodes=mode->submodes;
144 st->submodeID=st->submodeSelect=mode->defaultSubmode;
145 st->bounded_pitch = 1;
147 st->encode_submode = 1;
150 st->psy = vorbis_psy_init(8000, 256);
151 st->curve = (float*)speex_alloc(128*sizeof(float));
152 st->old_curve = (float*)speex_alloc(128*sizeof(float));
153 st->psy_window = (float*)speex_alloc(256*sizeof(float));
156 st->cumul_gain = 1024;
159 st->winBuf = (spx_word16_t*)speex_alloc((st->windowSize-st->frameSize)*sizeof(spx_word16_t));
161 st->excBuf = (spx_word16_t*)speex_alloc((mode->frameSize+mode->pitchEnd+2)*sizeof(spx_word16_t));
162 st->exc = st->excBuf + mode->pitchEnd + 2;
163 st->swBuf = (spx_word16_t*)speex_alloc((mode->frameSize+mode->pitchEnd+2)*sizeof(spx_word16_t));
164 st->sw = st->swBuf + mode->pitchEnd + 2;
166 st->window= lpc_window;
169 st->lagWindow = lag_window;
171 st->old_lsp = (spx_lsp_t*)speex_alloc((st->lpcSize)*sizeof(spx_lsp_t));
172 st->old_qlsp = (spx_lsp_t*)speex_alloc((st->lpcSize)*sizeof(spx_lsp_t));
173 st->first = 1;
174 for (i=0;i<st->lpcSize;i++)
175 st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), st->lpcSize+1);
177 st->mem_sp = (spx_mem_t*)speex_alloc((st->lpcSize)*sizeof(spx_mem_t));
178 st->mem_sw = (spx_mem_t*)speex_alloc((st->lpcSize)*sizeof(spx_mem_t));
179 st->mem_sw_whole = (spx_mem_t*)speex_alloc((st->lpcSize)*sizeof(spx_mem_t));
180 st->mem_exc = (spx_mem_t*)speex_alloc((st->lpcSize)*sizeof(spx_mem_t));
181 st->mem_exc2 = (spx_mem_t*)speex_alloc((st->lpcSize)*sizeof(spx_mem_t));
183 st->pi_gain = (spx_word32_t*)speex_alloc((st->nbSubframes)*sizeof(spx_word32_t));
184 st->innov_rms_save = NULL;
186 st->pitch = (int*)speex_alloc((st->nbSubframes)*sizeof(int));
189 st->vbr = (VBRState*)speex_alloc(sizeof(VBRState));
190 vbr_init(st->vbr);
191 st->vbr_quality = 8;
192 st->vbr_enabled = 0;
193 st->vbr_max = 0;
194 st->vad_enabled = 0;
195 st->dtx_enabled = 0;
196 st->dtx_count=0;
197 st->abr_enabled = 0;
198 st->abr_drift = 0;
199 st->abr_drift2 = 0;
202 st->plc_tuning = 2;
203 st->complexity=2;
204 st->sampling_rate=8000;
205 st->isWideband = 0;
206 st->highpass_enabled = 1;
209 VALGRIND_MAKE_READABLE(st, NB_ENC_STACK);
211 return st;
216 EncState *st=(EncState *)state;
219 speex_free_scratch(st->stack);
222 speex_free (st->winBuf);
223 speex_free (st->excBuf);
224 speex_free (st->old_qlsp);
225 speex_free (st->swBuf);
227 speex_free (st->old_lsp);
228 speex_free (st->mem_sp);
229 speex_free (st->mem_sw);
230 speex_free (st->mem_sw_whole);
231 speex_free (st->mem_exc);
232 speex_free (st->mem_exc2);
233 speex_free (st->pi_gain);
234 speex_free (st->pitch);
237 vbr_destroy(st->vbr);
238 speex_free (st->vbr);
242 vorbis_psy_destroy(st->psy);
243 speex_free (st->curve);
244 speex_free (st->old_curve);
245 speex_free (st->psy_window);
249 speex_free(st);
254 EncState *st;
281 st=(EncState *)state;
282 stack=st->stack;
284 ALLOC(lpc, st->lpcSize, spx_coef_t);
285 ALLOC(bw_lpc1, st->lpcSize, spx_coef_t);
286 ALLOC(bw_lpc2, st->lpcSize, spx_coef_t);
287 ALLOC(lsp, st->lpcSize, spx_lsp_t);
288 ALLOC(qlsp, st->lpcSize, spx_lsp_t);
289 ALLOC(interp_lsp, st->lpcSize, spx_lsp_t);
290 ALLOC(interp_qlsp, st->lpcSize, spx_lsp_t);
291 ALLOC(interp_lpc, st->lpcSize, spx_coef_t);
292 ALLOC(interp_qlpc, st->lpcSize, spx_coef_t);
295 SPEEX_MOVE(st->excBuf, st->excBuf+st->frameSize, st->max_pitch+2);
296 SPEEX_MOVE(st->swBuf, st->swBuf+st->frameSize, st->max_pitch+2);
298 if (st->highpass_enabled)
299 highpass(in, in, st->frameSize, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_INPUT, st->mem_hp);
304 ALLOC(w_sig, st->windowSize, spx_word16_t);
305 ALLOC(autocorr, st->lpcSize+1, spx_word16_t);
307 for (i=0;i<st->windowSize-st->frameSize;i++)
308 w_sig[i] = EXTRACT16(SHR32(MULT16_16(st->winBuf[i],st->window[i]),SIG_SHIFT));
309 for (;i<st->windowSize;i++)
310 w_sig[i] = EXTRACT16(SHR32(MULT16_16(in[i-st->windowSize+st->frameSize],st->window[i]),SIG_SHIFT));
312 _spx_autocorr(w_sig, autocorr, st->lpcSize+1, st->windowSize);
313 autocorr[0] = ADD16(autocorr[0],MULT16_16_Q15(autocorr[0],st->lpc_floor)); /* Noise floor in auto-correlation domain */
316 for (i=0;i<st->lpcSize+1;i++)
317 autocorr[i] = MULT16_16_Q14(autocorr[i],st->lagWindow[i]);
320 _spx_lpc(lpc, autocorr, st->lpcSize);
322 roots=lpc_to_lsp (lpc, st->lpcSize, lsp, 10, LSP_DELTA1, stack);
324 if (roots!=st->lpcSize)
327 for (i=0;i<st->lpcSize;i++)
329 lsp[i]=st->old_lsp[i];
339 int diff = st->windowSize-st->frameSize;
340 if (st->first)
341 for (i=0;i<st->lpcSize;i++)
344 lsp_interpolate(st->old_lsp, lsp, interp_lsp, st->lpcSize, st->nbSubframes, st->nbSubframes<<1);
346 lsp_enforce_margin(interp_lsp, st->lpcSize, LSP_MARGIN);
349 lsp_to_lpc(interp_lsp, interp_lpc, st->lpcSize,stack);
353 if (!st->submodes[st->submodeID] || (st->complexity>2 && SUBMODE(have_subframe_gain)<3) || SUBMODE(forced_pitch_gain) || SUBMODE(lbr_pitch) != -1
355 || st->vbr_enabled || st->vad_enabled
362 bw_lpc(st->gamma1, interp_lpc, bw_lpc1, st->lpcSize);
363 bw_lpc(st->gamma2, interp_lpc, bw_lpc2, st->lpcSize);
365 SPEEX_COPY(st->sw, st->winBuf, diff);
366 SPEEX_COPY(st->sw+diff, in, st->frameSize-diff);
367 filter_mem16(st->sw, bw_lpc1, bw_lpc2, st->sw, st->frameSize, st->lpcSize, st->mem_sw_whole, stack);
369 open_loop_nbest_pitch(st->sw, st->min_pitch, st->max_pitch, st->frameSize,
398 SPEEX_COPY(st->exc, st->winBuf, diff);
399 SPEEX_COPY(st->exc+diff, in, st->frameSize-diff);
400 fir_mem16(st->exc, interp_lpc, st->exc, st->frameSize, st->lpcSize, st->mem_exc, stack);
404 spx_word16_t g = compute_rms16(st->exc, st->frameSize);
405 if (st->submodeID!=1 && ol_pitch>0)
414 SPEEX_MOVE(st->psy_window, st->psy_window+st->frameSize, 256-st->frameSize);
415 SPEEX_COPY(&st->psy_window[256-st->frameSize], in, st->frameSize);
416 compute_curve(st->psy, st->psy_window, st->curve);
417 /*print_vec(st->curve, 128, "curve");*/
418 if (st->first)
419 SPEEX_COPY(st->old_curve, st->curve, 128);
424 if (st->vbr && (st->vbr_enabled||st->vad_enabled))
427 for (i=0;i<st->lpcSize;i++)
428 lsp_dist += (st->old_lsp[i] - lsp[i])*(st->old_lsp[i] - lsp[i]);
431 if (st->abr_enabled)
434 if (st->abr_drift2 * st->abr_drift > 0)
437 qual_change = -.00001*st->abr_drift/(1+st->abr_count);
443 st->vbr_quality += qual_change;
444 if (st->vbr_quality>10)
445 st->vbr_quality=10;
446 if (st->vbr_quality<0)
447 st->vbr_quality=0;
450 st->relative_quality = vbr_analysis(st->vbr, in, st->frameSize, ol_pitch, GAIN_SCALING_1*ol_pitch_coef);
452 /* delta_qual*=.1*(3+st->vbr_quality);*/
453 if (st->vbr_enabled)
463 v1=(int)floor(st->vbr_quality);
467 thresh = (st->vbr_quality-v1)*vbr_nb_thresh[mode][v1+1] + (1+v1-st->vbr_quality)*vbr_nb_thresh[mode][v1];
468 if (st->relative_quality > thresh &&
469 st->relative_quality-thresh<min_diff)
472 min_diff = st->relative_quality-thresh;
479 if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
482 st->dtx_count=1;
485 st->dtx_count++;
488 st->dtx_count=0;
492 if (st->vbr_max>0)
496 if (rate > st->vbr_max)
498 rate = st->vbr_max;
503 if (st->abr_enabled)
507 st->abr_drift+=(bitrate-st->abr_enabled);
508 st->abr_drift2 = .95*st->abr_drift2 + .05*(bitrate-st->abr_enabled);
509 st->abr_count += 1.0;
515 if (st->relative_quality<2)
517 if (st->dtx_count==0 || lsp_dist>.05 || !st->dtx_enabled || st->dtx_count>20)
519 st->dtx_count=1;
523 st->dtx_count++;
526 st->dtx_count = 0;
527 mode=st->submodeSelect;
530 st->submodeID=mode;
533 st->relative_quality = -1;
537 if (st->encode_submode)
543 speex_bits_pack(bits, st->submodeID, NB_SUBMODE_BITS);
548 if (st->submodes[st->submodeID] == NULL)
550 for (i=0;i<st->frameSize;i++)
551 st->exc[i]=st->sw[i]=VERY_SMALL;
553 for (i=0;i<st->lpcSize;i++)
554 st->mem_sw[i]=0;
555 st->first=1;
556 st->bounded_pitch = 1;
558 SPEEX_COPY(st->winBuf, in+2*st->frameSize-st->windowSize, st->windowSize-st->frameSize);
561 for (i=0;i<st->lpcSize;i++)
562 st->mem_sp[i] = 0;
568 if (st->first)
570 for (i=0;i<st->lpcSize;i++)
571 st->old_lsp[i] = lsp[i];
577 SUBMODE(lsp_quant)(lsp, qlsp, st->lpcSize, bits);
579 for (i=0;i<st->lpcSize;i++)
586 speex_bits_pack(bits, ol_pitch-st->min_pitch, 7);
631 if (st->first)
633 for (i=0;i<st->lpcSize;i++)
634 st->old_qlsp[i] = qlsp[i];
638 ALLOC(target, st->subframeSize, spx_word16_t);
639 ALLOC(innov, st->subframeSize, spx_sig_t);
640 ALLOC(exc32, st->subframeSize, spx_word32_t);
641 ALLOC(ringing, st->subframeSize, spx_word16_t);
642 ALLOC(syn_resp, st->subframeSize, spx_word16_t);
643 ALLOC(real_exc, st->subframeSize, spx_word16_t);
644 ALLOC(mem, st->lpcSize, spx_mem_t);
647 for (sub=0;sub<st->nbSubframes;sub++)
653 int response_bound = st->subframeSize;
656 offset = st->subframeSize*sub;
658 exc=st->exc+offset;
660 sw=st->sw+offset;
663 lsp_interpolate(st->old_lsp, lsp, interp_lsp, st->lpcSize, sub, st->nbSubframes);
664 lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, st->lpcSize, sub, st->nbSubframes);
667 lsp_enforce_margin(interp_lsp, st->lpcSize, LSP_MARGIN);
668 lsp_enforce_margin(interp_qlsp, st->lpcSize, LSP_MARGIN);
671 lsp_to_lpc(interp_lsp, interp_lpc, st->lpcSize,stack);
673 lsp_to_lpc(interp_qlsp, interp_qlpc, st->lpcSize, stack);
678 for (i=0;i<st->lpcSize;i+=2)
680 /*pi_g += -st->interp_qlpc[i] + st->interp_qlpc[i+1];*/
683 st->pi_gain[sub] = pi_g;
689 float fact = ((float)sub+1.0f)/st->nbSubframes;
691 curr_curve[i] = (1.0f-fact)*st->old_curve[i] + fact*st->curve[i];
692 curve_to_lpc(st->psy, curr_curve, bw_lpc1, bw_lpc2, 10);
696 bw_lpc(st->gamma1, interp_lpc, bw_lpc1, st->lpcSize);
697 if (st->gamma2>=0)
698 bw_lpc(st->gamma2, interp_lpc, bw_lpc2, st->lpcSize);
701 for (i=0;i<st->lpcSize;i++)
704 /*print_vec(st->bw_lpc1, 10, "bw_lpc");*/
708 speex_assert(st->windowSize-st->frameSize == st->subframeSize);
711 for (i=0;i<st->subframeSize;i++)
712 real_exc[i] = sw[i] = st->winBuf[i];
714 for (i=0;i<st->subframeSize;i++)
715 real_exc[i] = sw[i] = in[i+((sub-1)*st->subframeSize)];
717 fir_mem16(real_exc, interp_qlpc, real_exc, st->subframeSize, st->lpcSize, st->mem_exc2, stack);
719 if (st->complexity==0)
721 compute_impulse_response(interp_qlpc, bw_lpc1, bw_lpc2, syn_resp, response_bound, st->lpcSize, stack);
722 for (i=response_bound;i<st->subframeSize;i++)
726 for (i=0;i<st->lpcSize;i++)
727 mem[i]=SHL32(st->mem_sp[i],1);
728 for (i=0;i<st->subframeSize;i++)
731 iir_mem16(ringing, interp_qlpc, ringing, response_bound, st->lpcSize, mem, stack);
732 for (i=0;i<st->lpcSize;i++)
733 mem[i]=SHL32(st->mem_sw[i],1);
734 filter_mem16(ringing, st->bw_lpc1, st->bw_lpc2, ringing, response_bound, st->lpcSize, mem, stack);
735 SPEEX_MEMSET(&ringing[response_bound], 0, st->subframeSize-response_bound);
737 iir_mem16(ringing, interp_qlpc, ringing, st->subframeSize, st->lpcSize, mem, stack);
738 for (i=0;i<st->lpcSize;i++)
739 mem[i]=SHL32(st->mem_sw[i],1);
740 filter_mem16(ringing, bw_lpc1, bw_lpc2, ringing, st->subframeSize, st->lpcSize, mem, stack);
744 for (i=0;i<st->lpcSize;i++)
745 mem[i]=st->mem_sw[i];
746 filter_mem16(sw, bw_lpc1, bw_lpc2, sw, st->subframeSize, st->lpcSize, mem, stack);
748 if (st->complexity==0)
749 for (i=0;i<st->lpcSize;i++)
750 st->mem_sw[i]=mem[i];
753 for (i=0;i<st->subframeSize;i++)
757 SPEEX_MEMSET(exc, 0, st->subframeSize);
771 if (ol_pitch < st->min_pitch+margin-1)
772 ol_pitch=st->min_pitch+margin-1;
773 if (ol_pitch > st->max_pitch-margin)
774 ol_pitch=st->max_pitch-margin;
781 pit_min = st->min_pitch;
782 pit_max = st->max_pitch;
786 if (st->bounded_pitch && pit_max>offset)
792 st->lpcSize, st->subframeSize, bits, stack,
793 exc, syn_resp, st->complexity, 0, st->plc_tuning, &st->cumul_gain);
795 st->pitch[sub]=pitch;
798 SPEEX_MEMSET(innov, 0, st->subframeSize);
801 for (i=0;i<st->subframeSize;i++)
804 ener = SHL32(EXTEND32(compute_rms16(real_exc, st->subframeSize)),SIG_SHIFT);
839 signal_div(target, target, ener, st->subframeSize);
846 SUBMODE(innovation_params), st->lpcSize, st->subframeSize,
847 innov, syn_resp, bits, stack, st->complexity, SUBMODE(double_codebook));
850 signal_mul(innov, innov, ener, st->subframeSize);
852 for (i=0;i<st->subframeSize;i++)
859 ALLOC(innov2, st->subframeSize, spx_sig_t);
860 SPEEX_MEMSET(innov2, 0, st->subframeSize);
861 for (i=0;i<st->subframeSize;i++)
864 SUBMODE(innovation_params), st->lpcSize, st->subframeSize,
865 innov2, syn_resp, bits, stack, st->complexity, 0);
866 signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), st->subframeSize);
867 for (i=0;i<st->subframeSize;i++)
871 for (i=0;i<st->subframeSize;i++)
873 if (st->innov_rms_save)
875 st->innov_rms_save[sub] = compute_rms(innov, st->subframeSize);
880 iir_mem16(exc, interp_qlpc, sw, st->subframeSize, st->lpcSize, st->mem_sp, stack);
883 if (st->complexity!=0)
884 filter_mem16(sw, bw_lpc1, bw_lpc2, sw, st->subframeSize, st->lpcSize, st->mem_sw, stack);
889 if (st->submodeID>=1)
891 for (i=0;i<st->lpcSize;i++)
892 st->old_lsp[i] = lsp[i];
893 for (i=0;i<st->lpcSize;i++)
894 st->old_qlsp[i] = qlsp[i];
898 if (st->submodeID>=1)
899 SPEEX_COPY(st->old_curve, st->curve, 128);
902 if (st->submodeID==1)
905 if (st->dtx_count)
913 st->first = 0;
914 SPEEX_COPY(st->winBuf, in+2*st->frameSize-st->windowSize, st->windowSize-st->frameSize);
916 if (SUBMODE(innovation_quant) == noise_codebook_quant || st->submodeID==0)
917 st->bounded_pitch = 1;
919 st->bounded_pitch = 0;
926 DecState *st;
931 st = (DecState *)speex_alloc(sizeof(DecState));
932 if (!st)
935 st->stack = NULL;
937 st->stack = (char*)speex_alloc_scratch(NB_DEC_STACK);
940 st->mode=m;
943 st->encode_submode = 1;
945 st->first=1;
947 st->frameSize = mode->frameSize;
948 st->nbSubframes=mode->frameSize/mode->subframeSize;
949 st->subframeSize=mode->subframeSize;
950 st->lpcSize = mode->lpcSize;
951 st->min_pitch=mode->pitchStart;
952 st->max_pitch=mode->pitchEnd;
954 st->submodes=mode->submodes;
955 st->submodeID=mode->defaultSubmode;
957 st->lpc_enh_enabled=1;
959 st->excBuf = (spx_word16_t*)speex_alloc((st->frameSize + 2*st->max_pitch + st->subframeSize + 12)*sizeof(spx_word16_t));
960 st->exc = st->excBuf + 2*st->max_pitch + st->subframeSize + 6;
961 SPEEX_MEMSET(st->excBuf, 0, st->frameSize + st->max_pitch);
963 st->interp_qlpc = (spx_coef_t*)speex_alloc(st->lpcSize*sizeof(spx_coef_t));
964 st->old_qlsp = (spx_lsp_t*)speex_alloc(st->lpcSize*sizeof(spx_lsp_t));
965 st->mem_sp = (spx_mem_t*)speex_alloc(st->lpcSize*sizeof(spx_mem_t));
966 st->pi_gain = (spx_word32_t*)speex_alloc((st->nbSubframes)*sizeof(spx_word32_t));
967 st->last_pitch = 40;
968 st->count_lost=0;
969 st->pitch_gain_buf[0] = st->pitch_gain_buf[1] = st->pitch_gain_buf[2] = 0;
970 st->pitch_gain_buf_idx = 0;
971 st->seed = 1000;
973 st->sampling_rate=8000;
974 st->last_ol_gain = 0;
976 st->user_callback.func = &speex_default_user_handler;
977 st->user_callback.data = NULL;
979 st->speex_callbacks[i].func = NULL;
981 st->voc_m1=st->voc_m2=st->voc_mean=0;
982 st->voc_offset=0;
983 st->dtx_enabled=0;
984 st->isWideband = 0;
985 st->highpass_enabled = 1;
988 VALGRIND_MAKE_READABLE(st, NB_DEC_STACK);
990 return st;
995 DecState *st;
996 st=(DecState*)state;
999 speex_free_scratch(st->stack);
1002 speex_free (st->excBuf);
1003 speex_free (st->interp_qlpc);
1004 speex_free (st->old_qlsp);
1005 speex_free (st->mem_sp);
1006 speex_free (st->pi_gain);
1020 static void nb_decode_lost(DecState *st, spx_word16_t *out, char *stack)
1030 if (st->count_lost<10)
1031 fact = attenuation[st->count_lost];
1035 gain_med = median3(st->pitch_gain_buf[0], st->pitch_gain_buf[1], st->pitch_gain_buf[2]);
1036 if (gain_med < st->last_pitch_gain)
1037 st->last_pitch_gain = gain_med;
1040 pitch_gain = st->last_pitch_gain;
1045 pitch_gain = GAIN_SCALING_1*st->last_pitch_gain;
1051 innov_gain = compute_rms16(st->exc, st->frameSize);
1054 SPEEX_MOVE(st->excBuf, st->excBuf+st->frameSize, 2*st->max_pitch + st->subframeSize + 12);
1057 pitch_val = st->last_pitch + SHR32((spx_int32_t)speex_rand(1+st->count_lost, &st->seed),SIG_SHIFT);
1058 if (pitch_val > st->max_pitch)
1059 pitch_val = st->max_pitch;
1060 if (pitch_val < st->min_pitch)
1061 pitch_val = st->min_pitch;
1062 for (i=0;i<st->frameSize;i++)
1064 st->exc[i]= MULT16_16_Q15(pitch_gain, (st->exc[i-pitch_val]+VERY_SMALL)) +
1065 speex_rand(noise_gain, &st->seed);
1068 bw_lpc(QCONST16(.98,15), st->interp_qlpc, st->interp_qlpc, st->lpcSize);
1069 iir_mem16(&st->exc[-st->subframeSize], st->interp_qlpc, out, st->frameSize,
1070 st->lpcSize, st->mem_sp, stack);
1071 highpass(out, out, st->frameSize, HIGHPASS_NARROWBAND|HIGHPASS_OUTPUT, st->mem_hp);
1073 st->first = 0;
1074 st->count_lost++;
1075 st->pitch_gain_buf[st->pitch_gain_buf_idx++] = PSHR16(pitch_gain,9);
1076 if (st->pitch_gain_buf_idx > 2) /* rollover */
1077 st->pitch_gain_buf_idx = 0;
1085 DecState *st;
1106 st=(DecState*)state;
1107 stack=st->stack;
1110 if (!bits && st->dtx_enabled)
1112 st->submodeID=0;
1118 nb_decode_lost(st, out, stack);
1122 if (st->encode_submode)
1178 int ret = speex_inband_handler(bits, st->speex_callbacks, state);
1183 int ret = st->user_callback.func(bits, state, st->user_callback.data);
1195 st->submodeID = m;
1201 SPEEX_MOVE(st->excBuf, st->excBuf+st->frameSize, 2*st->max_pitch + st->subframeSize + 12);
1204 if (st->submodes[st->submodeID] == NULL)
1207 ALLOC(lpc, st->lpcSize, spx_coef_t);
1208 bw_lpc(QCONST16(0.93f,15), st->interp_qlpc, lpc, st->lpcSize);
1212 innov_gain = compute_rms16(st->exc, st->frameSize);
1213 for (i=0;i<st->frameSize;i++)
1214 st->exc[i]=speex_rand(innov_gain, &st->seed);
1218 st->first=1;
1221 iir_mem16(st->exc, lpc, out, st->frameSize, st->lpcSize, st->mem_sp, stack);
1223 st->count_lost=0;
1227 ALLOC(qlsp, st->lpcSize, spx_lsp_t);
1230 SUBMODE(lsp_unquant)(qlsp, st->lpcSize, bits);
1233 if (st->count_lost)
1237 for (i=0;i<st->lpcSize;i++)
1238 lsp_dist = ADD32(lsp_dist, EXTEND32(ABS(st->old_qlsp[i] - qlsp[i])));
1244 for (i=0;i<st->lpcSize;i++)
1245 st->mem_sp[i] = MULT16_32_Q15(fact,st->mem_sp[i]);
1250 if (st->first || st->count_lost)
1252 for (i=0;i<st->lpcSize;i++)
1253 st->old_qlsp[i] = qlsp[i];
1259 ol_pitch = st->min_pitch+speex_bits_unpack_unsigned(bits, 7);
1281 ALLOC(ak, st->lpcSize, spx_coef_t);
1282 ALLOC(innov, st->subframeSize, spx_sig_t);
1283 ALLOC(exc32, st->subframeSize, spx_word32_t);
1285 if (st->submodeID==1)
1291 st->dtx_enabled=1;
1293 st->dtx_enabled=0;
1295 if (st->submodeID>1)
1296 st->dtx_enabled=0;
1299 for (sub=0;sub<st->nbSubframes;sub++)
1308 offset = st->subframeSize*sub;
1310 exc=st->exc+offset;
1313 if (st->innov_save)
1314 innov_save = st->innov_save+offset;
1318 SPEEX_MEMSET(exc, 0, st->subframeSize);
1332 if (ol_pitch < st->min_pitch+margin-1)
1333 ol_pitch=st->min_pitch+margin-1;
1334 if (ol_pitch > st->max_pitch-margin)
1335 ol_pitch=st->max_pitch-margin;
1340 if (pit_min < st->min_pitch)
1341 pit_min = st->min_pitch;
1343 if (pit_max > st->max_pitch)
1344 pit_max = st->max_pitch;
1349 pit_min = st->min_pitch;
1350 pit_max = st->max_pitch;
1356 st->subframeSize, &pitch, &pitch_gain[0], bits, stack,
1357 st->count_lost, offset, st->last_pitch_gain, 0);
1362 sanitize_values32(exc32, NEG32(QCONST32(32000,SIG_SHIFT-1)), QCONST32(32000,SIG_SHIFT-1), st->subframeSize);
1382 SPEEX_MEMSET(innov, 0, st->subframeSize);
1400 SUBMODE(innovation_unquant)(innov, SUBMODE(innovation_params), st->subframeSize, bits, stack, &st->seed);
1403 signal_mul(innov, innov, ener, st->subframeSize);
1410 ALLOC(innov2, st->subframeSize, spx_sig_t);
1411 SPEEX_MEMSET(innov2, 0, st->subframeSize);
1412 SUBMODE(innovation_unquant)(innov2, SUBMODE(innovation_params), st->subframeSize, bits, stack, &st->seed);
1413 signal_mul(innov2, innov2, MULT16_32_Q15(QCONST16(0.454545f,15),ener), st->subframeSize);
1414 for (i=0;i<st->subframeSize;i++)
1418 for (i=0;i<st->subframeSize;i++)
1423 for (i=0;i<st->subframeSize;i++)
1429 if (st->submodeID==1)
1438 SPEEX_MEMSET(exc, 0, st->subframeSize);
1439 while (st->voc_offset<st->subframeSize)
1441 /* exc[st->voc_offset]= g*sqrt(2*ol_pitch)*ol_gain;
1443 if (st->voc_offset>=0)
1444 exc[st->voc_offset]=MULT16_16(spx_sqrt(MULT16_16_16(2,ol_pitch)),EXTRACT16(PSHR32(MULT16_16(g,PSHR32(ol_gain,SIG_SHIFT)),6)));
1445 st->voc_offset+=ol_pitch;
1447 st->voc_offset -= st->subframeSize;
1449 for (i=0;i<st->subframeSize;i++)
1452 exc[i]= ADD16(ADD16(MULT16_16_Q15(QCONST16(.7f,15),exc[i]) , MULT16_16_Q15(QCONST16(.3f,15),st->voc_m1)),
1454 MULT16_16_Q15(MULT16_16_16(QCONST16(.15f,9),g),EXTRACT16(PSHR32(st->voc_m2,SIG_SHIFT)))
1456 st->voc_m1 = exci;
1457 st->voc_m2=innov[i];
1458 st->voc_mean = EXTRACT16(PSHR32(ADD32(MULT16_16(QCONST16(.8f,15),st->voc_mean), MULT16_16(QCONST16(.2f,15),exc[i])), 15));
1459 exc[i]-=st->voc_mean;
1466 ALLOC(interp_qlsp, st->lpcSize, spx_lsp_t);
1468 if (st->lpc_enh_enabled && SUBMODE(comb_gain)>0 && !st->count_lost)
1470 multicomb(st->exc-st->subframeSize, out, st->interp_qlpc, st->lpcSize, 2*st->subframeSize, best_pitch, 40, SUBMODE(comb_gain), stack);
1471 multicomb(st->exc+st->subframeSize, out+2*st->subframeSize, st->interp_qlpc, st->lpcSize, 2*st
1473 SPEEX_COPY(out, &st->exc[-st->subframeSize], st->frameSize);
1477 if (st->count_lost)
1482 exc_ener = compute_rms16 (st->exc, st->frameSize);
1493 for (i=0;i<st->frameSize;i++)
1495 st->exc[i] = MULT16_16_Q14(gain, st->exc[i]);
1496 out[i]=st->exc[i-st->subframeSize];
1501 for (sub=0;sub<st->nbSubframes;sub++)
1507 offset = st->subframeSize*sub;
1511 exc=st->exc+offset;
1514 lsp_interpolate(st->old_qlsp, qlsp, interp_qlsp, st->lpcSize, sub, st->nbSubframes);
1517 lsp_enforce_margin(interp_qlsp, st->lpcSize, LSP_MARGIN);
1520 lsp_to_lpc(interp_qlsp, ak, st->lpcSize, stack);
1525 for (i=0;i<st->lpcSize;i+=2)
1527 /*pi_g += -st->interp_qlpc[i] + st->interp_qlpc[i+1];*/
1530 st->pi_gain[sub] = pi_g;
1533 iir_mem16(sp, st->interp_qlpc, sp, st->subframeSize, st->lpcSize,
1534 st->mem_sp, stack);
1536 for (i=0;i<st->lpcSize;i++)
1537 st->interp_qlpc[i] = ak[i];
1541 if (st->highpass_enabled)
1542 highpass(out, out, st->frameSize, (st->isWideband?HIGHPASS_WIDEBAND:HIGHPASS_NARROWBAND)|HIGHPASS_OUTPUT, st->mem_hp);
1543 /*for (i=0;i<st->frameSize;i++)
1544 printf ("%d\n", (int)st->frame[i]);*/
1547 st->level = 1+PSHR32(ol_gain,SIG_SHIFT);
1548 st->max_level = MAX16(MULT16_16_Q15(QCONST16(.99f,15), st->max_level), st->level);
1549 st->min_level = MIN16(ADD16(1,MULT16_16_Q14(QCONST16(1.01f,14), st->min_level)), st->level);
1550 if (st->max_level < st->min_level+1)
1551 st->max_level = st->min_level+1;
1552 /*printf ("%f %f %f %d\n", og, st->min_level, st->max_level, update);*/
1555 for (i=0;i<st->lpcSize;i++)
1556 st->old_qlsp[i] = qlsp[i];
1559 st->first = 0;
1560 st->count_lost=0;
1561 st->last_pitch = best_pitch;
1563 st->last_pitch_gain = PSHR16(pitch_average,2);
1565 st->last_pitch_gain = .25*pitch_average;
1567 st->pitch_gain_buf[st->pitch_gain_buf_idx++] = st->last_pitch_gain;
1568 if (st->pitch_gain_buf_idx > 2) /* rollover */
1569 st->pitch_gain_buf_idx = 0;
1571 st->last_ol_gain = ol_gain;
1578 EncState *st;
1579 st=(EncState*)state;
1583 (*(spx_int32_t*)ptr) = st->frameSize;
1587 st->submodeSelect = st->submodeID = (*(spx_int32_t*)ptr);
1591 (*(spx_int32_t*)ptr) = st->submodeID;
1595 st->vbr_enabled = (*(spx_int32_t*)ptr);
1598 (*(spx_int32_t*)ptr) = st->vbr_enabled;
1601 st->vad_enabled = (*(spx_int32_t*)ptr);
1604 (*(spx_int32_t*)ptr) = st->vad_enabled;
1607 st->dtx_enabled = (*(spx_int32_t*)ptr);
1610 (*(spx_int32_t*)ptr) = st->dtx_enabled;
1613 st->abr_enabled = (*(spx_int32_t*)ptr);
1614 st->vbr_enabled = st->abr_enabled!=0;
1615 if (st->vbr_enabled)
1623 speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
1624 speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
1632 speex_encoder_ctl(st, SPEEX_SET_VBR_QUALITY, &vbr_qual);
1633 st->abr_count=0;
1634 st->abr_drift=0;
1635 st->abr_drift2=0;
1640 (*(spx_int32_t*)ptr) = st->abr_enabled;
1645 st->vbr_quality = (*(float*)ptr);
1648 (*(float*)ptr) = st->vbr_quality;
1658 st->submodeSelect = st->submodeID = ((const SpeexNBMode*)(st->mode->mode))->quality_map[quality];
1662 st->complexity = (*(spx_int32_t*)ptr);
1663 if (st->complexity<0)
1664 st->complexity=0;
1667 (*(spx_int32_t*)ptr) = st->complexity;
1676 speex_encoder_ctl(st, SPEEX_SET_QUALITY, &i);
1677 speex_encoder_ctl(st, SPEEX_GET_BITRATE, &rate);
1685 if (st->submodes[st->submodeID])
1686 (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/st->frameSize;
1688 (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/st->frameSize;
1691 st->sampling_rate = (*(spx_int32_t*)ptr);
1694 (*(spx_int32_t*)ptr)=st->sampling_rate;
1699 st->bounded_pitch = 1;
1700 st->first = 1;
1701 for (i=0;i<st->lpcSize;i++)
1702 st->old_lsp[i]= DIV32(MULT16_16(QCONST16(3.1415927f, LSP_SHIFT), i+1), st->lpcSize+1);
1703 for (i=0;i<st->lpcSize;i++)
1704 st->mem_sw[i]=st->mem_sw_whole[i]=st->mem_sp[i]=st->mem_exc[i]=0;
1705 for (i=0;i<st->frameSize+st->max_pitch+1;i++)
1706 st->excBuf[i]=st->swBuf[i]=0;
1707 for (i=0;i<st->windowSize-st->frameSize;i++)
1708 st->winBuf[i]=0;
1712 st->encode_submode = (*(spx_int32_t*)ptr);
1715 (*(spx_int32_t*)ptr) = st->encode_submode;
1718 (*(spx_int32_t*)ptr)=(st->windowSize-st->frameSize);
1721 st->plc_tuning = (*(spx_int32_t*)ptr);
1722 if (st->plc_tuning>100)
1723 st->plc_tuning=100;
1726 (*(spx_int32_t*)ptr)=(st->plc_tuning);
1730 st->vbr_max = (*(spx_int32_t*)ptr);
1733 (*(spx_int32_t*)ptr) = st->vbr_max;
1737 st->highpass_enabled = (*(spx_int32_t*)ptr);
1740 (*(spx_int32_t*)ptr) = st->highpass_enabled;
1748 for (i=0;i<st->nbSubframes;i++)
1749 g[i]=st->pi_gain[i];
1755 for (i=0;i<st->nbSubframes;i++)
1756 ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*st->subframeSize, st->subframeSize);
1761 (*(float*)ptr)=st->relative_quality;
1765 st->innov_rms_save = (spx_word16_t*)ptr;
1768 st->isWideband = *((spx_int32_t*)ptr);
1771 *((char**)ptr) = st->stack;
1782 DecState *st;
1783 st=(DecState*)state;
1788 st->submodeID = (*(spx_int32_t*)ptr);
1792 (*(spx_int32_t*)ptr) = st->submodeID;
1795 st->lpc_enh_enabled = *((spx_int32_t*)ptr);
1798 *((spx_int32_t*)ptr) = st->lpc_enh_enabled;
1801 (*(spx_int32_t*)ptr) = st->frameSize;
1804 if (st->submodes[st->submodeID])
1805 (*(spx_int32_t*)ptr) = st->sampling_rate*SUBMODE(bits_per_frame)/st->frameSize;
1807 (*(spx_int32_t*)ptr) = st->sampling_rate*(NB_SUBMODE_BITS+1)/st->frameSize;
1810 st->sampling_rate = (*(spx_int32_t*)ptr);
1813 (*(spx_int32_t*)ptr)=st->sampling_rate;
1818 st->speex_callbacks[c->callback_id].func=c->func;
1819 st->speex_callbacks[c->callback_id].data=c->data;
1820 st->speex_callbacks[c->callback_id].callback_id=c->callback_id;
1826 st->user_callback.func=c->func;
1827 st->user_callback.data=c->data;
1828 st->user_callback.callback_id=c->callback_id;
1834 for (i=0;i<st->lpcSize;i++)
1835 st->mem_sp[i]=0;
1836 for (i=0;i<st->frameSize + st->max_pitch + 1;i++)
1837 st->excBuf[i]=0;
1841 st->encode_submode = (*(spx_int32_t*)ptr);
1844 (*(spx_int32_t*)ptr) = st->encode_submode;
1847 (*(spx_int32_t*)ptr)=st->subframeSize;
1850 st->highpass_enabled = (*(spx_int32_t*)ptr);
1853 (*(spx_int32_t*)ptr) = st->highpass_enabled;
1860 ret = log(st->level/st->min_level)/log(st->max_level/st->min_level);
1866 /*printf ("%f %f %f %f\n", st->level, st->min_level, st->max_level, ret);*/
1875 for (i=0;i<st->nbSubframes;i++)
1876 g[i]=st->pi_gain[i];
1882 for (i=0;i<st->nbSubframes;i++)
1883 ((spx_word16_t*)ptr)[i] = compute_rms16(st->exc+i*st->subframeSize, st->subframeSize);
1887 *((spx_int32_t*)ptr) = st->dtx_enabled;
1890 st->innov_save = (spx_word16_t*)ptr;
1893 st->isWideband = *((spx_int32_t*)ptr);
1896 *((char**)ptr) = st->stack;