Lines Matching refs:st
333 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)
335 const int N = st->filt_len;
337 int last_sample = st->last_sample[channel_index];
338 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
339 const spx_word16_t *sinc_table = st->sinc_table;
340 const int out_stride = st->out_stride;
341 const int int_advance = st->int_advance;
342 const int frac_advance = st->frac_advance;
343 const spx_uint32_t den_rate = st->den_rate;
383 st->last_sample[channel_index] = last_sample;
384 st->samp_frac_num[channel_index] = samp_frac_num;
391 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)
393 const int N = st->filt_len;
395 int last_sample = st->last_sample[channel_index];
396 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
397 const spx_word16_t *sinc_table = st->sinc_table;
398 const int out_stride = st->out_stride;
399 const int int_advance = st->int_advance;
400 const int frac_advance = st->frac_advance;
401 const spx_uint32_t den_rate = st->den_rate;
434 st->last_sample[channel_index] = last_sample;
435 st->samp_frac_num[channel_index] = samp_frac_num;
440 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)
442 const int N = st->filt_len;
444 int last_sample = st->last_sample[channel_index];
445 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
446 const int out_stride = st->out_stride;
447 const int int_advance = st->int_advance;
448 const int frac_advance = st->frac_advance;
449 const spx_uint32_t den_rate = st->den_rate;
456 const int offset = samp_frac_num*st->oversample/st->den_rate;
458 const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate);
460 const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate;
471 accum[0] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-2]);
472 accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]);
473 accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]);
474 accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]);
482 sum = interpolate_product_single(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp);
495 st->last_sample[channel_index] = last_sample;
496 st->samp_frac_num[channel_index] = samp_frac_num;
503 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)
505 const int N = st->filt_len;
507 int last_sample = st->last_sample[channel_index];
508 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
509 const int out_stride = st->out_stride;
510 const int int_advance = st->int_advance;
511 const int frac_advance = st->frac_advance;
512 const spx_uint32_t den_rate = st->den_rate;
519 const int offset = samp_frac_num*st->oversample/st->den_rate;
521 const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate);
523 const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate;
534 accum[0] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-2]);
535 accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]);
536 accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]);
537 accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]);
544 sum = interpolate_product_double(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp);
557 st->last_sample[channel_index] = last_sample;
558 st->samp_frac_num[channel_index] = samp_frac_num;
567 static int resampler_basic_zero(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)
570 int last_sample = st->last_sample[channel_index];
571 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
572 const int out_stride = st->out_stride;
573 const int int_advance = st->int_advance;
574 const int frac_advance = st->frac_advance;
575 const spx_uint32_t den_rate = st->den_rate;
590 st->last_sample[channel_index] = last_sample;
591 st->samp_frac_num[channel_index] = samp_frac_num;
607 static int update_filter(SpeexResamplerState *st)
609 spx_uint32_t old_length = st->filt_len;
610 spx_uint32_t old_alloc_size = st->mem_alloc_size;
615 st->int_advance = st->num_rate/st->den_rate;
616 st->frac_advance = st->num_rate%st->den_rate;
617 st->oversample = quality_map[st->quality].oversample;
618 st->filt_len = quality_map[st->quality].base_length;
620 if (st->num_rate > st->den_rate)
623 st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate;
624 if (multiply_frac(&st->filt_len,st->filt_len,st->num_rate,st->den_rate) != RESAMPLER_ERR_SUCCESS)
627 st->filt_len = ((st->filt_len-1)&(~0x7))+8;
628 if (2*st->den_rate < st->num_rate)
629 st->oversample >>= 1;
630 if (4*st->den_rate < st->num_rate)
631 st->oversample >>= 1;
632 if (8*st->den_rate < st->num_rate)
633 st->oversample >>= 1;
634 if (16*st->den_rate < st->num_rate)
635 st->oversample >>= 1;
636 if (st->oversample < 1)
637 st->oversample = 1;
640 st->cutoff = quality_map[st->quality].upsample_bandwidth;
645 if (INT_MAX/sizeof(spx_word16_t)/st->den_rate < st->filt_len)
649 use_direct = st->filt_len*st->den_rate <= st->filt_len*st->oversample+8
650 && INT_MAX/sizeof(spx_word16_t)/st->den_rate >= st->filt_len;
654 min_sinc_table_length = st->filt_len*st->den_rate;
656 if ((INT_MAX/sizeof(spx_word16_t)-8)/st->oversample < st->filt_len)
659 min_sinc_table_length = st->filt_len*st->oversample+8;
661 if (st->sinc_table_length < min_sinc_table_length)
663 spx_word16_t *sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,min_sinc_table_length*sizeof(spx_word16_t));
667 st->sinc_table = sinc_table;
668 st->sinc_table_length = min_sinc_table_length;
673 for (i=0;i<st->den_rate;i++)
676 for (j=0;j<st->filt_len;j++)
678 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);
682 st->resampler_ptr = resampler_basic_direct_single;
684 if (st->quality>8)
685 st->resampler_ptr = resampler_basic_direct_double;
687 st->resampler_ptr = resampler_basic_direct_single;
692 for (i=-4;i<(spx_int32_t)(st->oversample*st->filt_len+4);i++)
693 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);
695 st->resampler_ptr = resampler_basic_interpolate_single;
697 if (st->quality>8)
698 st->resampler_ptr = resampler_basic_interpolate_double;
700 st->resampler_ptr = resampler_basic_interpolate_single;
711 min_alloc_size = st->filt_len-1 + st->buffer_size;
712 if (min_alloc_size > st->mem_alloc_size)
715 if (INT_MAX/sizeof(spx_word16_t)/st->nb_channels < min_alloc_size)
717 else if (!(mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*min_alloc_size * sizeof(*mem))))
720 st->mem = mem;
721 st->mem_alloc_size = min_alloc_size;
723 if (!st->started)
726 for (i=0;i<st->nb_channels*st->mem_alloc_size;i++)
727 st->mem[i] = 0;
729 } else if (st->filt_len > old_length)
734 for (i=st->nb_channels;i--;)
738 /*if (st->magic_samples[i])*/
743 olen = old_length + 2*st->magic_samples[i];
744 for (j=old_length-1+st->magic_samples[i];j--;)
745 st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]] = st->mem[i*old_alloc_size+j];
746 for (j=0;j<st->magic_samples[i];j++)
747 st->mem[i*st->mem_alloc_size+j] = 0;
748 st->magic_samples[i] = 0;
750 if (st->filt_len > olen)
755 st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = st->mem[i*st->mem_alloc_size+(olen-2-j)];
757 for (;j<st->filt_len-1;j++)
758 st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = 0;
760 st->last_sample[i] += (st->filt_len - olen)/2;
763 st->magic_samples[i] = (olen - st->filt_len)/2;
764 for (j=0;j<st->filt_len-1+st->magic_samples[i];j++)
765 st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]];
768 } else if (st->filt_len < old_length)
773 for (i=0;i<st->nb_channels;i++)
776 spx_uint32_t old_magic = st->magic_samples[i];
777 st->magic_samples[i] = (old_length - st->filt_len)/2;
780 for (j=0;j<st->filt_len-1+st->magic_samples[i]+old_magic;j++)
781 st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]];
782 st->magic_samples[i] += old_magic;
788 st->resampler_ptr = resampler_basic_zero;
789 /* st->mem may still contain consumed input samples for the filter.
792 st->filt_len = old_length;
803 SpeexResamplerState *st;
812 st = (SpeexResamplerState *)speex_alloc(sizeof(SpeexResamplerState));
813 if (!st)
819 st->initialised = 0;
820 st->started = 0;
821 st->in_rate = 0;
822 st->out_rate = 0;
823 st->num_rate = 0;
824 st->den_rate = 0;
825 st->quality = -1;
826 st->sinc_table_length = 0;
827 st->mem_alloc_size = 0;
828 st->filt_len = 0;
829 st->mem = 0;
830 st->resampler_ptr = 0;
832 st->cutoff = 1.f;
833 st->nb_channels = nb_channels;
834 st->in_stride = 1;
835 st->out_stride = 1;
837 st->buffer_size = 160;
840 if (!(st->last_sample = (spx_int32_t*)speex_alloc(nb_channels*sizeof(spx_int32_t))))
842 if (!(st->magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(spx_uint32_t))))
844 if (!(st->samp_frac_num = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(spx_uint32_t))))
847 speex_resampler_set_quality(st, quality);
848 speex_resampler_set_rate_frac(st, ratio_num, ratio_den, in_rate, out_rate);
850 filter_err = update_filter(st);
853 st->initialised = 1;
855 speex_resampler_destroy(st);
856 st = NULL;
861 return st;
866 speex_resampler_destroy(st);
870 EXPORT void speex_resampler_destroy(SpeexResamplerState *st)
872 speex_free(st->mem);
873 speex_free(st->sinc_table);
874 speex_free(st->last_sample);
875 speex_free(st->magic_samples);
876 speex_free(st->samp_frac_num);
877 speex_free(st);
880 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)
883 const int N = st->filt_len;
885 spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
888 st->started = 1;
891 out_sample = st->resampler_ptr(st, channel_index, mem, in_len, out, out_len);
893 if (st->last_sample[channel_index] < (spx_int32_t)*in_len)
894 *in_len = st->last_sample[channel_index];
896 st->last_sample[channel_index] -= *in_len;
906 static int speex_resampler_magic(SpeexResamplerState *st, spx_uint32_t channel_index, spx_word16_t **out, spx_uint32_t out_len) {
907 spx_uint32_t tmp_in_len = st->magic_samples[channel_index];
908 spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
909 const int N = st->filt_len;
911 speex_resampler_process_native(st, channel_index, &tmp_in_len, *out, &out_len);
913 st->magic_samples[channel_index] -= tmp_in_len;
916 if (st->magic_samples[channel_index])
919 for (i=0;i<st->magic_samples[channel_index];i++)
922 *out += out_len*st->out_stride;
927 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)
929 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)
935 spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size;
936 const int filt_offs = st->filt_len - 1;
937 const spx_uint32_t xlen = st->mem_alloc_size - filt_offs;
938 const int istride = st->in_stride;
940 if (st->magic_samples[channel_index])
941 olen -= speex_resampler_magic(st, channel_index, &out, olen);
942 if (! st->magic_samples[channel_index]) {
954 speex_resampler_process_native(st, channel_index, &ichunk, out, &ochunk);
957 out += ochunk * st->out_stride;
964 return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS;
968 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)
970 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)
974 const int istride_save = st->in_stride;
975 const int ostride_save = st->out_stride;
978 spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size;
979 const spx_uint32_t xlen = st->mem_alloc_size - (st->filt_len - 1);
988 st->out_stride = 1;
996 if (st->magic_samples[channel_index]) {
997 omagic = speex_resampler_magic(st, channel_index, &y, ochunk);
1001 if (! st->magic_samples[channel_index]) {
1005 x[j+st->filt_len-1]=WORD2INT(in[j*istride_save]);
1007 x[j+st->filt_len-1]=in[j*istride_save];
1011 x[j+st->filt_len-1]=0;
1014 speex_resampler_process_native(st, channel_index, &ichunk, y, &ochunk);
1033 st->out_stride = ostride_save;
1037 return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS;
1040 EXPORT int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len)
1046 istride_save = st->in_stride;
1047 ostride_save = st->out_stride;
1048 st->in_stride = st->out_stride = st->nb_channels;
1049 for (i=0;i<st->nb_channels;i++)
1054 speex_resampler_process_float(st, i, in+i, in_len, out+i, out_len);
1056 speex_resampler_process_float(st, i, NULL, in_len, out+i, out_len);
1058 st->in_stride = istride_save;
1059 st->out_stride = ostride_save;
1060 return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS;
1063 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)
1069 istride_save = st->in_stride;
1070 ostride_save = st->out_stride;
1071 st->in_stride = st->out_stride = st->nb_channels;
1072 for (i=0;i<st->nb_channels;i++)
1077 speex_resampler_process_int(st, i, in+i, in_len, out+i, out_len);
1079 speex_resampler_process_int(st, i, NULL, in_len, out+i, out_len);
1081 st->in_stride = istride_save;
1082 st->out_stride = ostride_save;
1083 return st->resampler_ptr == resampler_basic_zero ? RESAMPLER_ERR_ALLOC_FAILED : RESAMPLER_ERR_SUCCESS;
1086 EXPORT int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate)
1088 return speex_resampler_set_rate_frac(st, in_rate, out_rate, in_rate, out_rate);
1091 EXPORT void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate)
1093 *in_rate = st->in_rate;
1094 *out_rate = st->out_rate;
1109 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)
1118 if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den)
1121 old_den = st->den_rate;
1122 st->in_rate = in_rate;
1123 st->out_rate = out_rate;
1124 st->num_rate = ratio_num;
1125 st->den_rate = ratio_den;
1127 fact = compute_gcd(st->num_rate, st->den_rate);
1129 st->num_rate /= fact;
1130 st->den_rate /= fact;
1134 for (i=0;i<st->nb_channels;i++)
1136 if (multiply_frac(&st->samp_frac_num[i],st->samp_frac_num[i],st->den_rate,old_den) != RESAMPLER_ERR_SUCCESS)
1139 if (st->samp_frac_num[i] >= st->den_rate)
1140 st->samp_frac_num[i] = st->den_rate-1;
1144 if (st->initialised)
1145 return update_filter(st);
1149 EXPORT void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den)
1151 *ratio_num = st->num_rate;
1152 *ratio_den = st->den_rate;
1155 EXPORT int speex_resampler_set_quality(SpeexResamplerState *st, int quality)
1159 if (st->quality == quality)
1161 st->quality = quality;
1162 if (st->initialised)
1163 return update_filter(st);
1167 EXPORT void speex_resampler_get_quality(SpeexResamplerState *st, int *quality)
1169 *quality = st->quality;
1172 EXPORT void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride)
1174 st->in_stride = stride;
1177 EXPORT void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride)
1179 *stride = st->in_stride;
1182 EXPORT void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride)
1184 st->out_stride = stride;
1187 EXPORT void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride)
1189 *stride = st->out_stride;
1192 EXPORT int speex_resampler_get_input_latency(SpeexResamplerState *st)
1194 return st->filt_len / 2;
1197 EXPORT int speex_resampler_get_output_latency(SpeexResamplerState *st)
1199 return ((st->filt_len / 2) * st->den_rate + (st->num_rate >> 1)) / st->num_rate;
1202 EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st)
1205 for (i=0;i<st->nb_channels;i++)
1206 st->last_sample[i] = st->filt_len/2;
1210 EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st)
1213 for (i=0;i<st->nb_channels;i++)
1215 st->last_sample[i] = 0;
1216 st->magic_samples[i] = 0;
1217 st->samp_frac_num[i] = 0;
1219 for (i=0;i<st->nb_channels*st->mem_alloc_size;i++)
1220 st->mem[i] = 0;