diff options
author | Michael Niedermayer | 2016-05-15 18:33:09 +0200 |
---|---|---|
committer | Michael Niedermayer | 2016-05-15 18:36:53 +0200 |
commit | 7fe81bc4f8ba684626fa08f7bef46da3e8abe373 (patch) | |
tree | fd8c175fbc9b09ddd313bf4b29cb99b42d3e805f /libswresample/rematrix.c | |
parent | 35c23bf67df62d8d6dbfca05e99d6d607c17f7bb (diff) |
swresample/rematrix: Use error diffusion to avoid error in the DC component of the matrix
This fixes the sum of the integer coefficients ending up summing to a value
larger than the value representing unity.
This issue occurs with qN0.dts when converting to stereo
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libswresample/rematrix.c')
-rw-r--r-- | libswresample/rematrix.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/libswresample/rematrix.c b/libswresample/rematrix.c index 932088ffb7..f18c9f67db 100644 --- a/libswresample/rematrix.c +++ b/libswresample/rematrix.c @@ -371,9 +371,15 @@ av_cold int swri_rematrix_init(SwrContext *s){ s->native_one = av_mallocz(sizeof(int)); if (!s->native_matrix || !s->native_one) return AVERROR(ENOMEM); - for (i = 0; i < nb_out; i++) - for (j = 0; j < nb_in; j++) - ((int*)s->native_matrix)[i * nb_in + j] = lrintf(s->matrix[i][j] * 32768); + for (i = 0; i < nb_out; i++) { + double rem = 0; + + for (j = 0; j < nb_in; j++) { + double target = s->matrix[i][j] * 32768 + rem; + ((int*)s->native_matrix)[i * nb_in + j] = lrintf(target); + rem += target - ((int*)s->native_matrix)[i * nb_in + j]; + } + } *((int*)s->native_one) = 32768; s->mix_1_1_f = (mix_1_1_func_type*)copy_s16; s->mix_2_1_f = (mix_2_1_func_type*)sum2_s16; |