diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2016-05-15 18:33:09 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2016-06-05 02:40:30 +0200 |
commit | f6586db165da1007e347bfa2822d0e183dd841a5 (patch) | |
tree | e2eb42849941249000412f74dfcfd0b2b0628536 | |
parent | 7c43c48fda09cd734ad1e28ef2b8f0a2e197d4e0 (diff) | |
download | ffmpeg-f6586db165da1007e347bfa2822d0e183dd841a5.tar.gz |
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>
(cherry picked from commit 7fe81bc4f8ba684626fa08f7bef46da3e8abe373)
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-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; |