Home | History | Annotate | Download | only in libspeex

Lines Matching refs:st

332 static int resampler_basic_direct_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len)
334 const int N = st->filt_len;
336 int last_sample = st->last_sample[channel_index];
337 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
338 const spx_word16_t *sinc_table = st->sinc_table;
339 const int out_stride = st->out_stride;
340 const int int_advance = st->int_advance;
341 const int frac_advance = st->frac_advance;
342 const spx_uint32_t den_rate = st->den_rate;
375 st->last_sample[channel_index] = last_sample;
376 st->samp_frac_num[channel_index] = samp_frac_num;
383 static int resampler_basic_direct_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len)
385 const int N = st->filt_len;
387 int last_sample = st->last_sample[channel_index];
388 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
389 const spx_word16_t *sinc_table = st->sinc_table;
390 const int out_stride = st->out_stride;
391 const int int_advance = st->int_advance;
392 const int frac_advance = st->frac_advance;
393 const spx_uint32_t den_rate = st->den_rate;
426 st->last_sample[channel_index] = last_sample;
427 st
432 static int resampler_basic_interpolate_single(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len)
434 const int N = st->filt_len;
436 int last_sample = st->last_sample[channel_index];
437 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
438 const int out_stride = st->out_stride;
439 const int int_advance = st->int_advance;
440 const int frac_advance = st->frac_advance;
441 const spx_uint32_t den_rate = st->den_rate;
449 const int offset = samp_frac_num*st->oversample/st->den_rate;
451 const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate);
453 const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate;
463 accum[0] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-2]);
464 accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]);
465 accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]);
466 accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]);
474 sum = interpolate_product_single(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp);
487 st->last_sample[channel_index] = last_sample;
488 st->samp_frac_num[channel_index] = samp_frac_num;
495 static int resampler_basic_interpolate_double(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_word16_t *in, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len)
497 const int N = st->filt_len;
499 int last_sample = st->last_sample[channel_index];
500 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
501 const int out_stride = st->out_stride;
502 const int int_advance = st->int_advance;
503 const int frac_advance = st->frac_advance;
504 const spx_uint32_t den_rate = st->den_rate;
512 const int offset = samp_frac_num*st->oversample/st->den_rate;
514 const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate);
516 const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate;
526 accum[0] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-2]);
527 accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]);
528 accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]);
529 accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]);
536 sum = interpolate_product_double(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp);
549 st->last_sample[channel_index] = last_sample;
550 st->samp_frac_num[channel_index] = samp_frac_num;
555 static void update_filter(SpeexResamplerState *st)
559 old_length = st->filt_len;
560 st->oversample = quality_map[st->quality].oversample;
561 st->filt_len = quality_map[st->quality].base_length;
563 if (st->num_rate > st->den_rate)
566 st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate;
568 st->filt_len = st->filt_len*st->num_rate / st->den_rate;
570 st->filt_len &= (~0x3);
571 if (2*st->den_rate < st->num_rate)
572 st->oversample >>= 1;
573 if (4*st->den_rate < st->num_rate)
574 st->oversample >>= 1;
575 if (8*st->den_rate < st->num_rate)
576 st->oversample >>= 1;
577 if (16*st->den_rate < st->num_rate)
578 st->oversample >>= 1;
579 if (st->oversample < 1)
580 st->oversample = 1;
583 st->cutoff = quality_map[st->quality].upsample_bandwidth;
590 if (st->den_rate <= st->oversample)
594 if (!st->sinc_table)
595 st->sinc_table = (spx_word16_t *)speex_alloc(st->filt_len*st->den_rate*sizeof(spx_word16_t));
596 else if (st->sinc_table_length < st->filt_len*st->den_rate)
598 st->sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,st->filt_len*st->den_rate*sizeof(spx_word16_t));
599 st->sinc_table_length = st->filt_len*st->den_rate;
601 for (i=0;i<st->den_rate;i++)
604 for (j=0;j<st->filt_len;j++)
606 st->sinc_table[i*st->filt_len+j] = sinc(st->cutoff,((j-(spx_int32_t)st->filt_len/2+1)-((float)i)/st->den_rate), st->filt_len, quality_map[st->quality].window_func);
610 st->resampler_ptr = resampler_basic_direct_single;
612 if (st->quality>8)
613 st->resampler_ptr = resampler_basic_direct_double;
615 st->resampler_ptr = resampler_basic_direct_single;
620 if (!st->sinc_table)
621 st->sinc_table = (spx_word16_t *)speex_alloc((st->filt_len*st->oversample+8)*sizeof(spx_word16_t));
622 else if (st->sinc_table_length < st->filt_len*st->oversample+8)
624 st->sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,(st->filt_len*st->oversample+8)*sizeof(spx_word16_t));
625 st->sinc_table_length = st->filt_len*st->oversample+8;
627 for (i=-4;i<(spx_int32_t)(st->oversample*st->filt_len+4);i++)
628 st->sinc_table[i+4] = sinc(st->cutoff,(i/(float)st->oversample - st->filt_len/2), st->filt_len, quality_map[st->quality].window_func);
630 st->resampler_ptr = resampler_basic_interpolate_single;
632 if (st->quality>8)
633 st->resampler_ptr = resampler_basic_interpolate_double;
635 st->resampler_ptr = resampler_basic_interpolate_single;
639 st->int_advance = st->num_rate/st->den_rate;
640 st->frac_advance = st->num_rate%st->den_rate;
646 if (!st->mem)
649 st->mem_alloc_size = st->filt_len-1 + st->buffer_size;
650 st->mem = (spx_word16_t*)speex_alloc(st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t));
651 for (i=0;i<st->nb_channels*st->mem_alloc_size;i++)
652 st->mem[i] = 0;
654 } else if (!st->started)
657 st->mem_alloc_size = st->filt_len-1 + st->buffer_size;
658 st->mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t));
659 for (i=0;i<st->nb_channels*st->mem_alloc_size;i++)
660 st->mem[i] = 0;
662 } else if (st->filt_len > old_length)
667 int old_alloc_size = st->mem_alloc_size;
668 if ((st->filt_len-1 + st->buffer_size) > st->mem_alloc_size)
670 st->mem_alloc_size = st->filt_len-1 + st->buffer_size;
671 st->mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t));
673 for (i=st->nb_channels-1;i>=0;i--)
677 /*if (st->magic_samples[i])*/
682 olen = old_length + 2*st->magic_samples[i];
683 for (j=old_length-2+st->magic_samples[i];j>=0;j--)
684 st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]] = st->mem[i*old_alloc_size+j];
685 for (j=0;j<st->magic_samples[i];j++)
686 st->mem[i*st->mem_alloc_size+j] = 0;
687 st->magic_samples[i] = 0;
689 if (st->filt_len > olen)
694 st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = st->mem[i*st->mem_alloc_size+(olen-2-j)];
696 for (;j<st->filt_len-1;j++)
697 st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = 0;
699 st->last_sample[i] += (st->filt_len - olen)/2;
702 st->magic_samples[i] = (olen - st->filt_len)/2;
703 for (j=0;j<st->filt_len-1+st->magic_samples[i];j++)
704 st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]];
707 } else if (st->filt_len < old_length)
712 for (i=0;i<st->nb_channels;i++)
715 spx_uint32_t old_magic = st->magic_samples[i];
716 st->magic_samples[i] = (old_length - st->filt_len)/2;
719 for (j=0;j<st->filt_len-1+st->magic_samples[i]+old_magic;j++)
720 st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]];
721 st->magic_samples[i] += old_magic;
735 SpeexResamplerState *st;
742 st = (SpeexResamplerState *)speex_alloc(sizeof(SpeexResamplerState));
743 st->initialised = 0;
744 st->started = 0;
745 st->in_rate = 0;
746 st->out_rate = 0;
747 st->num_rate = 0;
748 st->den_rate = 0;
749 st->quality = -1;
750 st->sinc_table_length = 0;
751 st->mem_alloc_size = 0;
752 st->filt_len = 0;
753 st->mem = 0;
754 st->resampler_ptr = 0;
756 st->cutoff = 1.f;
757 st->nb_channels = nb_channels;
758 st->in_stride = 1;
759 st->out_stride = 1;
762 st->buffer_size = 160;
764 st->buffer_size = 160;
768 st->last_sample = (spx_int32_t*)speex_alloc(nb_channels*sizeof(int));
769 st->magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(int));
770 st->samp_frac_num = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(int));
773 st->last_sample[i] = 0;
774 st->magic_samples[i] = 0;
775 st->samp_frac_num[i] = 0;
778 speex_resampler_set_quality(st, quality);
779 speex_resampler_set_rate_frac(st, ratio_num, ratio_den, in_rate, out_rate);
782 update_filter(st);
784 st->initialised = 1;
788 return st;
791 EXPORT void speex_resampler_destroy(SpeexResamplerState *st)
793 speex_free(st->mem);
794 speex_free(st->sinc_table);
795 speex_free(st->last_sample);
796 speex_free(st->magic_samples);
797 speex_free(st->samp_frac_num);
798 speex_free(st);
801 static int speex_resampler_process_native(SpeexResamplerState *st, spx_uint32_t channel_index, spx_uint32_t *in_len, spx_word16_t *out, spx_uint32_t *out_len)
804 const int N = st->filt_len;
806 spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
809 st->started = 1;
812 out_sample = st->resampler_ptr(st, channel_index, mem, in_len, out, out_len);
814 if (st->last_sample[channel_index] < (spx_int32_t)*in_len)
815 *in_len = st->last_sample[channel_index];
817 st->last_sample[channel_index] -= *in_len;
827 static int speex_resampler_magic(SpeexResamplerState *st, spx_uint32_t channel_index, spx_word16_t **out, spx_uint32_t out_len) {
828 spx_uint32_t tmp_in_len = st->magic_samples[channel_index];
829 spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
830 const int N = st->filt_len;
832 speex_resampler_process_native(st, channel_index, &tmp_in_len, *out, &out_len);
834 st->magic_samples[channel_index] -= tmp_in_len;
837 if (st->magic_samples[channel_index])
840 for (i=0;i<st->magic_samples[channel_index];i++)
843 *out += out_len*st->out_stride;
848 EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len)
850 EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len)
856 spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size;
857 const int filt_offs = st->filt_len - 1;
858 const spx_uint32_t xlen = st->mem_alloc_size - filt_offs;
859 const int istride = st->in_stride;
861 if (st->magic_samples[channel_index])
862 st, channel_index, &out, olen);
863 if (! st->magic_samples[channel_index]) {
875 speex_resampler_process_native(st, channel_index, &ichunk, out, &ochunk);
878 out += ochunk * st->out_stride;
889 EXPORT int speex_resampler_process_float(SpeexResamplerState *st, spx_uint32_t channel_index, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len)
891 EXPORT int speex_resampler_process_int(SpeexResamplerState *st, spx_uint32_t channel_index, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len)
895 const int istride_save = st->in_stride;
896 const int ostride_save = st->out_stride;
899 spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size;
900 const spx_uint32_t xlen = st->mem_alloc_size - (st->filt_len - 1);
910 st->out_stride = 1;
918 if (st->magic_samples[channel_index]) {
919 omagic = speex_resampler_magic(st, channel_index, &y, ochunk);
923 if (! st->magic_samples[channel_index]) {
927 x[j+st->filt_len-1]=WORD2INT(in[j*istride_save]);
929 x[j+st->filt_len-1]=in[j*istride_save];
933 x[j+st->filt_len-1]=0;
936 speex_resampler_process_native(st, channel_index, &ichunk, y, &ochunk);
955 st->out_stride = ostride_save;
962 EXPORT int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len)
967 istride_save = st->in_stride;
968 ostride_save = st->out_stride;
969 st->in_stride = st->out_stride = st->nb_channels;
970 for (i=0;i<st->nb_channels;i++)
974 speex_resampler_process_float(st, i, in+i, in_len, out+i, out_len);
976 speex_resampler_process_float(st, i, NULL, in_len, out+i, out_len);
978 st->in_stride = istride_save;
979 st->out_stride = ostride_save;
983 EXPORT int speex_resampler_process_interleaved_int(SpeexResamplerState *st, const spx_int16_t *in, spx_uint32_t *in_len, spx_int16_t *out, spx_uint32_t *out_len)
988 istride_save = st->in_stride;
989 ostride_save = st->out_stride;
990 st->in_stride = st->out_stride = st->nb_channels;
991 for (i=0;i<st->nb_channels;i++)
995 speex_resampler_process_int(st, i, in+i, in_len, out+i, out_len);
997 speex_resampler_process_int(st, i, NULL, in_len, out+i, out_len);
999 st->in_stride = istride_save;
1000 st->out_stride = ostride_save;
1004 EXPORT int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate)
1006 return speex_resampler_set_rate_frac(st, in_rate, out_rate, in_rate, out_rate);
1009 EXPORT void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate)
1011 *in_rate = st->in_rate;
1012 *out_rate = st->out_rate;
1015 EXPORT int speex_resampler_set_rate_frac(SpeexResamplerState *st, spx_uint32_t ratio_num, spx_uint32_t ratio_den, spx_uint32_t in_rate, spx_uint32_t out_rate)
1020 if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den)
1023 old_den = st->den_rate;
1024 st->in_rate = in_rate;
1025 st->out_rate = out_rate;
1026 st->num_rate = ratio_num;
1027 st->den_rate = ratio_den;
1029 for (fact=2;fact<=IMIN(st->num_rate, st->den_rate);fact++)
1031 while ((st->num_rate % fact == 0) && (st->den_rate % fact == 0))
1033 st->num_rate /= fact;
1034 st->den_rate /= fact;
1040 for (i=0;i<st->nb_channels;i++)
1042 st->samp_frac_num[i]=st->samp_frac_num[i]*st->den_rate/old_den;
1044 if (st->samp_frac_num[i] >= st->den_rate)
1045 st->samp_frac_num[i] = st->den_rate-1;
1049 if (st->initialised)
1050 update_filter(st);
1054 EXPORT void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den)
1056 *ratio_num = st->num_rate;
1057 *ratio_den = st->den_rate;
1060 EXPORT int speex_resampler_set_quality(SpeexResamplerState *st, int quality)
1064 if (st->quality == quality)
1066 st->quality = quality;
1067 if (st->initialised)
1068 update_filter(st);
1072 EXPORT void speex_resampler_get_quality(SpeexResamplerState *st, int *quality)
1074 *quality = st->quality;
1077 EXPORT void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride)
1079 st->in_stride = stride;
1082 EXPORT void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride)
1084 *stride = st->in_stride;
1087 EXPORT void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride)
1089 st->out_stride = stride;
1092 EXPORT void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride)
1094 *stride = st->out_stride;
1097 EXPORT int speex_resampler_get_input_latency(SpeexResamplerState *st)
1099 return st->filt_len / 2;
1102 EXPORT int speex_resampler_get_output_latency(SpeexResamplerState *st)
1104 return ((st->filt_len / 2) * st->den_rate + (st->num_rate >> 1)) / st->num_rate;
1107 EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st)
1110 for (i=0;i<st->nb_channels;i++)
1111 st->last_sample[i] = st->filt_len/2;
1115 EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st)
1118 for (i=0;i<st->nb_channels*(st->filt_len-1);i++)
1119 st->mem[i] = 0;