|
|
@@ -175,10 +175,6 @@ void av_build_filter(FELEM *filter, double factor, int tap_count, int phase_coun |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Initializes an audio resampler. |
|
|
|
* Note, if either rate is not an integer then simply scale both rates up so they are. |
|
|
|
*/ |
|
|
|
AVResampleContext *av_resample_init(int out_rate, int in_rate, int filter_size, int phase_shift, int linear, double cutoff){ |
|
|
|
AVResampleContext *c= av_mallocz(sizeof(AVResampleContext)); |
|
|
|
double factor= FFMIN(out_rate * cutoff / in_rate, 1.0); |
|
|
@@ -206,33 +202,12 @@ void av_resample_close(AVResampleContext *c){ |
|
|
|
av_freep(&c); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Compensates samplerate/timestamp drift. The compensation is done by changing |
|
|
|
* the resampler parameters, so no audible clicks or similar distortions occur |
|
|
|
* @param compensation_distance distance in output samples over which the compensation should be performed |
|
|
|
* @param sample_delta number of output samples which should be output less |
|
|
|
* |
|
|
|
* example: av_resample_compensate(c, 10, 500) |
|
|
|
* here instead of 510 samples only 500 samples would be output |
|
|
|
* |
|
|
|
* note, due to rounding the actual compensation might be slightly different, |
|
|
|
* especially if the compensation_distance is large and the in_rate used during init is small |
|
|
|
*/ |
|
|
|
void av_resample_compensate(AVResampleContext *c, int sample_delta, int compensation_distance){ |
|
|
|
// sample_delta += (c->ideal_dst_incr - c->dst_incr)*(int64_t)c->compensation_distance / c->ideal_dst_incr; |
|
|
|
c->compensation_distance= compensation_distance; |
|
|
|
c->dst_incr = c->ideal_dst_incr - c->ideal_dst_incr * (int64_t)sample_delta / compensation_distance; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* resamples. |
|
|
|
* @param src an array of unconsumed samples |
|
|
|
* @param consumed the number of samples of src which have been consumed are returned here |
|
|
|
* @param src_size the number of unconsumed samples available |
|
|
|
* @param dst_size the amount of space in samples available in dst |
|
|
|
* @param update_ctx If this is 0 then the context will not be modified, that way several channels can be resampled with the same context. |
|
|
|
* @return the number of samples written in dst or -1 if an error occurred |
|
|
|
*/ |
|
|
|
int av_resample(AVResampleContext *c, short *dst, short *src, int *consumed, int src_size, int dst_size, int update_ctx){ |
|
|
|
int dst_index, i; |
|
|
|
int index= c->index; |
|
|
|