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;
376 st->last_sample[channel_index] = last_sample;
377 st->samp_frac_num[channel_index] = samp_frac_num;
384 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)
386 const int N = st->filt_len;
388 int last_sample = st->last_sample[channel_index];
389 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
390 const spx_word16_t *sinc_table = st->sinc_table;
391 const int out_stride = st->out_stride;
392 const int int_advance = st->int_advance;
393 const int frac_advance = st->frac_advance;
394 const spx_uint32_t den_rate = st->den_rate;
427 st->last_sample[channel_index] = last_sample;
428 st->samp_frac_num[channel_index] = samp_frac_num;
433 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)
435 const int N = st->filt_len;
437 int last_sample = st->last_sample[channel_index];
438 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
439 const int out_stride = st->out_stride;
440 const int int_advance = st->int_advance;
441 const int frac_advance = st->frac_advance;
442 const spx_uint32_t den_rate = st->den_rate;
450 const int offset = samp_frac_num*st->oversample/st->den_rate;
452 const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate);
454 const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate;
464 accum[0] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-2]);
465 accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]);
466 accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]);
467 accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]);
475 sum = interpolate_product_single(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp);
488 st->last_sample[channel_index] = last_sample;
489 st->samp_frac_num[channel_index] = samp_frac_num;
496 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)
498 const int N = st->filt_len;
500 int last_sample = st->last_sample[channel_index];
501 spx_uint32_t samp_frac_num = st->samp_frac_num[channel_index];
502 const int out_stride = st->out_stride;
503 const int int_advance = st->int_advance;
504 const int frac_advance = st->frac_advance;
505 const spx_uint32_t den_rate = st->den_rate;
513 const int offset = samp_frac_num*st->oversample/st->den_rate;
515 const spx_word16_t frac = PDIV32(SHL32((samp_frac_num*st->oversample) % st->den_rate,15),st->den_rate);
517 const spx_word16_t frac = ((float)((samp_frac_num*st->oversample) % st->den_rate))/st->den_rate;
527 accum[0] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-2]);
528 accum[1] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset-1]);
529 accum[2] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset]);
530 accum[3] += MULT16_16(curr_in,st->sinc_table[4+(j+1)*st->oversample-offset+1]);
537 sum = interpolate_product_double(iptr, st->sinc_table + st->oversample + 4 - offset - 2, N, st->oversample, interp);
550 st->last_sample[channel_index] = last_sample;
551 st->samp_frac_num[channel_index] = samp_frac_num;
556 static void update_filter(SpeexResamplerState *st)
560 old_length = st->filt_len;
561 st->oversample = quality_map[st->quality].oversample;
562 st->filt_len = quality_map[st->quality].base_length;
564 if (st->num_rate > st->den_rate)
567 st->cutoff = quality_map[st->quality].downsample_bandwidth * st->den_rate / st->num_rate;
569 st->filt_len = st->filt_len*st->num_rate / st->den_rate;
571 st->filt_len &= (~0x3);
572 if (2*st->den_rate < st->num_rate)
573 st->oversample >>= 1;
574 if (4*st->den_rate < st->num_rate)
575 st->oversample >>= 1;
576 if (8*st->den_rate < st->num_rate)
577 st->oversample >>= 1;
578 if (16*st->den_rate < st->num_rate)
579 st->oversample >>= 1;
580 if (st->oversample < 1)
581 st->oversample = 1;
584 st->cutoff = quality_map[st->quality].upsample_bandwidth;
591 if (st->den_rate <= st->oversample)
595 if (!st->sinc_table)
596 st->sinc_table = (spx_word16_t *)speex_alloc(st->filt_len*st->den_rate*sizeof(spx_word16_t));
597 else if (st->sinc_table_length < st->filt_len*st->den_rate)
599 st->sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,st->filt_len*st->den_rate*sizeof(spx_word16_t));
600 st->sinc_table_length = st->filt_len*st->den_rate;
602 for (i=0;i<st->den_rate;i++)
605 for (j=0;j<st->filt_len;j++)
607 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);
611 st->resampler_ptr = resampler_basic_direct_single;
613 if (st->quality>8)
614 st->resampler_ptr = resampler_basic_direct_double;
616 st->resampler_ptr = resampler_basic_direct_single;
621 if (!st->sinc_table)
622 st->sinc_table = (spx_word16_t *)speex_alloc((st->filt_len*st->oversample+8)*sizeof(spx_word16_t));
623 else if (st->sinc_table_length < st->filt_len*st->oversample+8)
625 st->sinc_table = (spx_word16_t *)speex_realloc(st->sinc_table,(st->filt_len*st->oversample+8)*sizeof(spx_word16_t));
626 st->sinc_table_length = st->filt_len*st->oversample+8;
628 for (i=-4;i<(spx_int32_t)(st->oversample*st->filt_len+4);i++)
629 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);
631 st->resampler_ptr = resampler_basic_interpolate_single;
633 if (st->quality>8)
634 st->resampler_ptr = resampler_basic_interpolate_double;
636 st->resampler_ptr = resampler_basic_interpolate_single;
640 st->int_advance = st->num_rate/st->den_rate;
641 st->frac_advance = st->num_rate%st->den_rate;
647 if (!st->mem)
650 st->mem_alloc_size = st->filt_len-1 + st->buffer_size;
651 st->mem = (spx_word16_t*)speex_alloc(st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t));
652 for (i=0;i<st->nb_channels*st->mem_alloc_size;i++)
653 st->mem[i] = 0;
655 } else if (!st->started)
658 st->mem_alloc_size = st->filt_len-1 + st->buffer_size;
659 st->mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t));
660 for (i=0;i<st->nb_channels*st->mem_alloc_size;i++)
661 st->mem[i] = 0;
663 } else if (st->filt_len > old_length)
668 int old_alloc_size = st->mem_alloc_size;
669 if ((st->filt_len-1 + st->buffer_size) > st->mem_alloc_size)
671 st->mem_alloc_size = st->filt_len-1 + st->buffer_size;
672 st->mem = (spx_word16_t*)speex_realloc(st->mem, st->nb_channels*st->mem_alloc_size * sizeof(spx_word16_t));
674 for (i=st->nb_channels-1;i>=0;i--)
678 /*if (st->magic_samples[i])*/
683 olen = old_length + 2*st->magic_samples[i];
684 for (j=old_length-2+st->magic_samples[i];j>=0;j--)
685 st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]] = st->mem[i*old_alloc_size+j];
686 for (j=0;j<st->magic_samples[i];j++)
687 st->mem[i*st->mem_alloc_size+j] = 0;
688 st->magic_samples[i] = 0;
690 if (st->filt_len > olen)
695 st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = st->mem[i*st->mem_alloc_size+(olen-2-j)];
697 for (;j<st->filt_len-1;j++)
698 st->mem[i*st->mem_alloc_size+(st->filt_len-2-j)] = 0;
700 st->last_sample[i] += (st->filt_len - olen)/2;
703 st->magic_samples[i] = (olen - st->filt_len)/2;
704 for (j=0;j<st->filt_len-1+st->magic_samples[i];j++)
705 st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]];
708 } else if (st->filt_len < old_length)
713 for (i=0;i<st->nb_channels;i++)
716 spx_uint32_t old_magic = st->magic_samples[i];
717 st->magic_samples[i] = (old_length - st->filt_len)/2;
720 for (j=0;j<st->filt_len-1+st->magic_samples[i]+old_magic;j++)
721 st->mem[i*st->mem_alloc_size+j] = st->mem[i*st->mem_alloc_size+j+st->magic_samples[i]];
722 st->magic_samples[i] += old_magic;
736 SpeexResamplerState *st;
743 st = (SpeexResamplerState *)speex_alloc(sizeof(SpeexResamplerState));
744 st->initialised = 0;
745 st->started = 0;
746 st->in_rate = 0;
747 st->out_rate = 0;
748 st->num_rate = 0;
749 st->den_rate = 0;
750 st->quality = -1;
751 st->sinc_table_length = 0;
752 st->mem_alloc_size = 0;
753 st->filt_len = 0;
754 st->mem = 0;
755 st->resampler_ptr = 0;
757 st->cutoff = 1.f;
758 st->nb_channels = nb_channels;
759 st->in_stride = 1;
760 st->out_stride = 1;
763 st->buffer_size = 160;
765 st->buffer_size = 160;
769 st->last_sample = (spx_int32_t*)speex_alloc(nb_channels*sizeof(int));
770 st->magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(int));
771 st->samp_frac_num = (spx_uint32_t*)speex_alloc(nb_channels*sizeof(int));
774 st->last_sample[i] = 0;
775 st->magic_samples[i] = 0;
776 st->samp_frac_num[i] = 0;
779 speex_resampler_set_quality(st, quality);
780 speex_resampler_set_rate_frac(st, ratio_num, ratio_den, in_rate, out_rate);
783 update_filter(st);
785 st->initialised = 1;
789 return st;
792 EXPORT void speex_resampler_destroy(SpeexResamplerState *st)
794 speex_free(st->mem);
795 speex_free(st->sinc_table);
796 speex_free(st->last_sample);
797 speex_free(st->magic_samples);
798 speex_free(st->samp_frac_num);
799 speex_free(st);
802 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)
805 const int N = st->filt_len;
807 spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
810 st->started = 1;
813 out_sample = st->resampler_ptr(st, channel_index, mem, in_len, out, out_len);
815 if (st->last_sample[channel_index] < (spx_int32_t)*in_len)
816 *in_len = st->last_sample[channel_index];
818 st->last_sample[channel_index] -= *in_len;
828 static int speex_resampler_magic(SpeexResamplerState *st, spx_uint32_t channel_index, spx_word16_t **out, spx_uint32_t out_len) {
829 spx_uint32_t tmp_in_len = st->magic_samples[channel_index];
830 spx_word16_t *mem = st->mem + channel_index * st->mem_alloc_size;
831 const int N = st->filt_len;
833 speex_resampler_process_native(st, channel_index, &tmp_in_len, *out, &out_len);
835 st->magic_samples[channel_index] -= tmp_in_len;
838 if (st->magic_samples[channel_index])
841 for (i=0;i<st->magic_samples[channel_index];i++)
844 *out += out_len*st->out_stride;
849 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)
851 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)
857 spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size;
858 const int filt_offs = st->filt_len - 1;
859 const spx_uint32_t xlen = st->mem_alloc_size - filt_offs;
860 const int istride = st->in_stride;
862 if (st->magic_samples[channel_index])
863 olen -= speex_resampler_magic(st, channel_index, &out, olen);
864 if (! st->magic_samples[channel_index]) {
876 speex_resampler_process_native(st, channel_index, &ichunk, out, &ochunk);
879 out += ochunk * st->out_stride;
890 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)
892 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)
896 const int istride_save = st->in_stride;
897 const int ostride_save = st->out_stride;
900 spx_word16_t *x = st->mem + channel_index * st->mem_alloc_size;
901 const spx_uint32_t xlen = st->mem_alloc_size - (st->filt_len - 1);
911 st->out_stride = 1;
919 if (st->magic_samples[channel_index]) {
920 omagic = speex_resampler_magic(st, channel_index, &y, ochunk);
924 if (! st->magic_samples[channel_index]) {
928 x[j+st->filt_len-1]=WORD2INT(in[j*istride_save]);
930 x[j+st->filt_len-1]=in[j*istride_save];
934 x[j+st->filt_len-1]=0;
937 speex_resampler_process_native(st, channel_index, &ichunk, y, &ochunk);
956 st->out_stride = ostride_save;
963 EXPORT int speex_resampler_process_interleaved_float(SpeexResamplerState *st, const float *in, spx_uint32_t *in_len, float *out, spx_uint32_t *out_len)
968 istride_save = st->in_stride;
969 ostride_save = st->out_stride;
970 st->in_stride = st->out_stride = st->nb_channels;
971 for (i=0;i<st->nb_channels;i++)
975 speex_resampler_process_float(st, i, in+i, in_len, out+i, out_len);
977 speex_resampler_process_float(st, i, NULL, in_len, out+i, out_len);
979 st->in_stride = istride_save;
980 st->out_stride = ostride_save;
984 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)
989 istride_save = st->in_stride;
990 ostride_save = st->out_stride;
991 st->in_stride = st->out_stride = st->nb_channels;
992 for (i=0;i<st->nb_channels;i++)
996 speex_resampler_process_int(st, i, in+i, in_len, out+i, out_len);
998 speex_resampler_process_int(st, i, NULL, in_len, out+i, out_len);
1000 st->in_stride = istride_save;
1001 st->out_stride = ostride_save;
1005 EXPORT int speex_resampler_set_rate(SpeexResamplerState *st, spx_uint32_t in_rate, spx_uint32_t out_rate)
1007 return speex_resampler_set_rate_frac(st, in_rate, out_rate, in_rate, out_rate);
1010 EXPORT void speex_resampler_get_rate(SpeexResamplerState *st, spx_uint32_t *in_rate, spx_uint32_t *out_rate)
1012 *in_rate = st->in_rate;
1013 *out_rate = st->out_rate;
1016 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)
1021 if (st->in_rate == in_rate && st->out_rate == out_rate && st->num_rate == ratio_num && st->den_rate == ratio_den)
1024 old_den = st->den_rate;
1025 st->in_rate = in_rate;
1026 st->out_rate = out_rate;
1027 st->num_rate = ratio_num;
1028 st->den_rate = ratio_den;
1030 for (fact=2;fact<=IMIN(st->num_rate, st->den_rate);fact++)
1032 while ((st->num_rate % fact == 0) && (st->den_rate % fact == 0))
1034 st->num_rate /= fact;
1035 st->den_rate /= fact;
1041 for (i=0;i<st->nb_channels;i++)
1043 st->samp_frac_num[i]=st->samp_frac_num[i]*st->den_rate/old_den;
1045 if (st->samp_frac_num[i] >= st->den_rate)
1046 st->samp_frac_num[i] = st->den_rate-1;
1050 if (st->initialised)
1051 update_filter(st);
1055 EXPORT void speex_resampler_get_ratio(SpeexResamplerState *st, spx_uint32_t *ratio_num, spx_uint32_t *ratio_den)
1057 *ratio_num = st->num_rate;
1058 *ratio_den = st->den_rate;
1061 EXPORT int speex_resampler_set_quality(SpeexResamplerState *st, int quality)
1065 if (st->quality == quality)
1067 st->quality = quality;
1068 if (st->initialised)
1069 update_filter(st);
1073 EXPORT void speex_resampler_get_quality(SpeexResamplerState *st, int *quality)
1075 *quality = st->quality;
1078 EXPORT void speex_resampler_set_input_stride(SpeexResamplerState *st, spx_uint32_t stride)
1080 st->in_stride = stride;
1083 EXPORT void speex_resampler_get_input_stride(SpeexResamplerState *st, spx_uint32_t *stride)
1085 *stride = st->in_stride;
1088 EXPORT void speex_resampler_set_output_stride(SpeexResamplerState *st, spx_uint32_t stride)
1090 st->out_stride = stride;
1093 EXPORT void speex_resampler_get_output_stride(SpeexResamplerState *st, spx_uint32_t *stride)
1095 *stride = st->out_stride;
1098 EXPORT int speex_resampler_get_input_latency(SpeexResamplerState *st)
1100 return st->filt_len / 2;
1103 EXPORT int speex_resampler_get_output_latency(SpeexResamplerState *st)
1105 return ((st->filt_len / 2) * st->den_rate + (st->num_rate >> 1)) / st->num_rate;
1108 EXPORT int speex_resampler_skip_zeros(SpeexResamplerState *st)
1111 for (i=0;i<st->nb_channels;i++)
1112 st->last_sample[i] = st->filt_len/2;
1116 EXPORT int speex_resampler_reset_mem(SpeexResamplerState *st)
1119 for (i=0;i<st->nb_channels*(st->filt_len-1);i++)
1120 st->mem[i] = 0;