[pjsip] Proposed patch for bug #766 (Bad audio quality (possibly in resampling) in Linux)
mailinglists.bram at kuijvenhoven.net
Fri Jan 29 16:16:25 CST 2010
Attached is a proposed patch for bug #766 (Bad audio quality (possibly in resampling) in Linux).
The cause is indeed in the resampling code (third_party/resample/src/resamplesubs.c):
Yend = Ystart + (unsigned)(nx * pFactor);
where pFactor is a double holding the result of 1.0 * rate_out / rate_in, and nx is the size of a source frame (in samples).
Since pFactor holds only a binary floating-point approximation to the sample rate conversion factor (e.g. 1/6) and since the C-style cast (unsigned) performs truncation instead of rounding, the result is that sometimes Yend - Ystart is one sample less than intended, causing the last sample of the output frame to contain garbage (often a zero). Always be careful with floating-point calculations, especially in combination with looping constructs!
The attached patch fixes it by turning the above into proper rounding:
Yend = Ystart + (unsigned)(nx * pFactor + 0.5);
Though the bug does not appear with my compiler (GCC 4.3.2 on Linux) when doing
Yend = Ystart + (unsigned)(nx * 1.0 * dest_rate / source_rate);
this may still cause problems on other platforms since the correct outcome probably only results from the extra precision available in floating point registers (80-bit) compared to doubles (64-bit). Therefore, the patch also makes similar adjustments to code in conference.c and resample_resample.c.
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
More information about the pjsip