* [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics
@ 2023-05-22 23:35 Michael Niedermayer
2023-05-22 23:35 ` [FFmpeg-devel] [PATCH 2/6] avfilter/asrc_sinc: Use av_bessel_i0() Michael Niedermayer
` (5 more replies)
0 siblings, 6 replies; 7+ messages in thread
From: Michael Niedermayer @ 2023-05-22 23:35 UTC (permalink / raw)
To: FFmpeg development discussions and patches
0th order modified bessel function of the first kind are used in multiple
places, lets avoid having 3+ different implementations
I picked this one as its accurate and quite fast, it can be replaced if
a better one is found
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
doc/APIchanges | 3 ++
libavutil/mathematics.c | 104 ++++++++++++++++++++++++++++++++++++++
libavutil/mathematics.h | 4 ++
libswresample/resample.c | 106 +--------------------------------------
4 files changed, 112 insertions(+), 105 deletions(-)
diff --git a/doc/APIchanges b/doc/APIchanges
index 130955ef02..b256df9c54 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -2,6 +2,9 @@ The last version increases of all libraries were on 2023-02-09
API changes, most recent first:
+2023-xx-xx - xxxxxxxxxx - lavu 58.x.100 - mathematics.h
+ Add av_bessel_i0()
+
2023-05-xx - xxxxxxxxxx - lavu 58.8.100 - frame.h
Add av_frame_replace().
diff --git a/libavutil/mathematics.c b/libavutil/mathematics.c
index b878317d63..61aeb7c029 100644
--- a/libavutil/mathematics.c
+++ b/libavutil/mathematics.c
@@ -213,3 +213,107 @@ int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t i
return av_sat_add64(av_rescale_q(old + 1, inc_tb, ts_tb), ts - old_ts);
}
}
+
+static inline double eval_poly(const double *coeff, int size, double x) {
+ double sum = coeff[size-1];
+ int i;
+ for (i = size-2; i >= 0; --i) {
+ sum *= x;
+ sum += coeff[i];
+ }
+ return sum;
+}
+
+/**
+ * 0th order modified bessel function of the first kind.
+ * Algorithm taken from the Boost project, source:
+ * https://searchcode.com/codesearch/view/14918379/
+ * Use, modification and distribution are subject to the
+ * Boost Software License, Version 1.0 (see notice below).
+ * Boost Software License - Version 1.0 - August 17th, 2003
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+ */
+
+double av_bessel_i0(double x) {
+// Modified Bessel function of the first kind of order zero
+// minimax rational approximations on intervals, see
+// Blair and Edwards, Chalk River Report AECL-4928, 1974
+ static const double p1[] = {
+ -2.2335582639474375249e+15,
+ -5.5050369673018427753e+14,
+ -3.2940087627407749166e+13,
+ -8.4925101247114157499e+11,
+ -1.1912746104985237192e+10,
+ -1.0313066708737980747e+08,
+ -5.9545626019847898221e+05,
+ -2.4125195876041896775e+03,
+ -7.0935347449210549190e+00,
+ -1.5453977791786851041e-02,
+ -2.5172644670688975051e-05,
+ -3.0517226450451067446e-08,
+ -2.6843448573468483278e-11,
+ -1.5982226675653184646e-14,
+ -5.2487866627945699800e-18,
+ };
+ static const double q1[] = {
+ -2.2335582639474375245e+15,
+ 7.8858692566751002988e+12,
+ -1.2207067397808979846e+10,
+ 1.0377081058062166144e+07,
+ -4.8527560179962773045e+03,
+ 1.0,
+ };
+ static const double p2[] = {
+ -2.2210262233306573296e-04,
+ 1.3067392038106924055e-02,
+ -4.4700805721174453923e-01,
+ 5.5674518371240761397e+00,
+ -2.3517945679239481621e+01,
+ 3.1611322818701131207e+01,
+ -9.6090021968656180000e+00,
+ };
+ static const double q2[] = {
+ -5.5194330231005480228e-04,
+ 3.2547697594819615062e-02,
+ -1.1151759188741312645e+00,
+ 1.3982595353892851542e+01,
+ -6.0228002066743340583e+01,
+ 8.5539563258012929600e+01,
+ -3.1446690275135491500e+01,
+ 1.0,
+ };
+ double y, r, factor;
+ if (x == 0)
+ return 1.0;
+ x = fabs(x);
+ if (x <= 15) {
+ y = x * x;
+ return eval_poly(p1, FF_ARRAY_ELEMS(p1), y) / eval_poly(q1, FF_ARRAY_ELEMS(q1), y);
+ }
+ else {
+ y = 1 / x - 1.0 / 15;
+ r = eval_poly(p2, FF_ARRAY_ELEMS(p2), y) / eval_poly(q2, FF_ARRAY_ELEMS(q2), y);
+ factor = exp(x) / sqrt(x);
+ return factor * r;
+ }
+}
diff --git a/libavutil/mathematics.h b/libavutil/mathematics.h
index 3e7b52eed6..e213bab68c 100644
--- a/libavutil/mathematics.h
+++ b/libavutil/mathematics.h
@@ -288,6 +288,10 @@ int64_t av_rescale_delta(AVRational in_tb, int64_t in_ts, AVRational fs_tb, int
*/
int64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc);
+/**
+ * 0th order modified bessel function of the first kind.
+ */
+double av_bessel_i0(double x);
/**
* @}
diff --git a/libswresample/resample.c b/libswresample/resample.c
index 8f9efc3f21..bd54a7002f 100644
--- a/libswresample/resample.c
+++ b/libswresample/resample.c
@@ -30,110 +30,6 @@
#include "libavutil/cpu.h"
#include "resample.h"
-static inline double eval_poly(const double *coeff, int size, double x) {
- double sum = coeff[size-1];
- int i;
- for (i = size-2; i >= 0; --i) {
- sum *= x;
- sum += coeff[i];
- }
- return sum;
-}
-
-/**
- * 0th order modified bessel function of the first kind.
- * Algorithm taken from the Boost project, source:
- * https://searchcode.com/codesearch/view/14918379/
- * Use, modification and distribution are subject to the
- * Boost Software License, Version 1.0 (see notice below).
- * Boost Software License - Version 1.0 - August 17th, 2003
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
- */
-
-static double bessel(double x) {
-// Modified Bessel function of the first kind of order zero
-// minimax rational approximations on intervals, see
-// Blair and Edwards, Chalk River Report AECL-4928, 1974
- static const double p1[] = {
- -2.2335582639474375249e+15,
- -5.5050369673018427753e+14,
- -3.2940087627407749166e+13,
- -8.4925101247114157499e+11,
- -1.1912746104985237192e+10,
- -1.0313066708737980747e+08,
- -5.9545626019847898221e+05,
- -2.4125195876041896775e+03,
- -7.0935347449210549190e+00,
- -1.5453977791786851041e-02,
- -2.5172644670688975051e-05,
- -3.0517226450451067446e-08,
- -2.6843448573468483278e-11,
- -1.5982226675653184646e-14,
- -5.2487866627945699800e-18,
- };
- static const double q1[] = {
- -2.2335582639474375245e+15,
- 7.8858692566751002988e+12,
- -1.2207067397808979846e+10,
- 1.0377081058062166144e+07,
- -4.8527560179962773045e+03,
- 1.0,
- };
- static const double p2[] = {
- -2.2210262233306573296e-04,
- 1.3067392038106924055e-02,
- -4.4700805721174453923e-01,
- 5.5674518371240761397e+00,
- -2.3517945679239481621e+01,
- 3.1611322818701131207e+01,
- -9.6090021968656180000e+00,
- };
- static const double q2[] = {
- -5.5194330231005480228e-04,
- 3.2547697594819615062e-02,
- -1.1151759188741312645e+00,
- 1.3982595353892851542e+01,
- -6.0228002066743340583e+01,
- 8.5539563258012929600e+01,
- -3.1446690275135491500e+01,
- 1.0,
- };
- double y, r, factor;
- if (x == 0)
- return 1.0;
- x = fabs(x);
- if (x <= 15) {
- y = x * x;
- return eval_poly(p1, FF_ARRAY_ELEMS(p1), y) / eval_poly(q1, FF_ARRAY_ELEMS(q1), y);
- }
- else {
- y = 1 / x - 1.0 / 15;
- r = eval_poly(p2, FF_ARRAY_ELEMS(p2), y) / eval_poly(q2, FF_ARRAY_ELEMS(q2), y);
- factor = exp(x) / sqrt(x);
- return factor * r;
- }
-}
-
/**
* builds a polyphase filterbank.
* @param factor resampling factor
@@ -189,7 +85,7 @@ static int build_filter(ResampleContext *c, void *filter, double factor, int tap
break;
case SWR_FILTER_TYPE_KAISER:
w = 2.0*x / (factor*tap_count*M_PI);
- y *= bessel(kaiser_beta*sqrt(FFMAX(1-w*w, 0)));
+ y *= av_bessel_i0(kaiser_beta*sqrt(FFMAX(1-w*w, 0)));
break;
default:
av_assert0(0);
--
2.17.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* [FFmpeg-devel] [PATCH 2/6] avfilter/asrc_sinc: Use av_bessel_i0()
2023-05-22 23:35 [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics Michael Niedermayer
@ 2023-05-22 23:35 ` Michael Niedermayer
2023-05-22 23:35 ` [FFmpeg-devel] [PATCH 3/6] avfilter/window_func: " Michael Niedermayer
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Michael Niedermayer @ 2023-05-22 23:35 UTC (permalink / raw)
To: FFmpeg development discussions and patches
The new function is much more precise
For default beta it is slightly slower, but its speed is already at the
worst case in that comparison
while the replaced function becomes much slower for larger beta
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
libavfilter/asrc_sinc.c | 21 ++-------------------
1 file changed, 2 insertions(+), 19 deletions(-)
diff --git a/libavfilter/asrc_sinc.c b/libavfilter/asrc_sinc.c
index 258f7a139e..ba22f69889 100644
--- a/libavfilter/asrc_sinc.c
+++ b/libavfilter/asrc_sinc.c
@@ -91,43 +91,26 @@ static int query_formats(AVFilterContext *ctx)
return ff_set_common_samplerates_from_list(ctx, sample_rates);
}
-static float bessel_I_0(float x)
-{
- float term = 1, sum = 1, last_sum, x2 = x / 2;
- int i = 1;
-
- do {
- float y = x2 / i++;
-
- last_sum = sum;
- sum += term *= y * y;
- } while (sum != last_sum);
-
- return sum;
-}
-
static float *make_lpf(int num_taps, float Fc, float beta, float rho,
float scale, int dc_norm)
{
int i, m = num_taps - 1;
float *h = av_calloc(num_taps, sizeof(*h)), sum = 0;
- float mult = scale / bessel_I_0(beta), mult1 = 1.f / (.5f * m + rho);
+ float mult = scale / av_bessel_i0(beta), mult1 = 1.f / (.5f * m + rho);
if (!h)
return NULL;
av_assert0(Fc >= 0 && Fc <= 1);
-
for (i = 0; i <= m / 2; i++) {
float z = i - .5f * m, x = z * M_PI, y = z * mult1;
h[i] = x ? sinf(Fc * x) / x : Fc;
- sum += h[i] *= bessel_I_0(beta * sqrtf(1.f - y * y)) * mult;
+ sum += h[i] *= av_bessel_i0(beta * sqrtf(1.f - y * y)) * mult;
if (m - i != i) {
h[m - i] = h[i];
sum += h[i];
}
}
-
for (i = 0; dc_norm && i < num_taps; i++)
h[i] *= scale / sum;
--
2.17.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* [FFmpeg-devel] [PATCH 3/6] avfilter/window_func: Use av_bessel_i0()
2023-05-22 23:35 [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics Michael Niedermayer
2023-05-22 23:35 ` [FFmpeg-devel] [PATCH 2/6] avfilter/asrc_sinc: Use av_bessel_i0() Michael Niedermayer
@ 2023-05-22 23:35 ` Michael Niedermayer
2023-05-22 23:35 ` [FFmpeg-devel] [PATCH 4/6] avcodec/kbdwin: " Michael Niedermayer
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Michael Niedermayer @ 2023-05-22 23:35 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Old code needed about 6 times as long as new with defaults in afftfilt
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
libavfilter/window_func.h | 20 +++++---------------
1 file changed, 5 insertions(+), 15 deletions(-)
diff --git a/libavfilter/window_func.h b/libavfilter/window_func.h
index 02b5def9dd..13236d8593 100644
--- a/libavfilter/window_func.h
+++ b/libavfilter/window_func.h
@@ -25,6 +25,7 @@
#include <math.h>
#include "libavutil/avassert.h"
#include "libavutil/common.h"
+#include "libavutil/timer.h"
enum WindowFunc { WFUNC_RECT, WFUNC_HANNING, WFUNC_HAMMING, WFUNC_BLACKMAN,
WFUNC_BARTLETT, WFUNC_WELCH, WFUNC_FLATTOP,
@@ -59,19 +60,6 @@ enum WindowFunc { WFUNC_RECT, WFUNC_HANNING, WFUNC_HAMMING, WFUNC_BLACKMAN,
{ "bohman", "Bohman", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_BOHMAN}, 0, 0, flag, "win_func" }, \
{ "kaiser", "Kaiser", 0, AV_OPT_TYPE_CONST, {.i64=WFUNC_KAISER}, 0, 0, flag, "win_func" }
-static inline double get_i0(double x)
-{
- double y = 1.0, prev = 1.0, i = 1.0;
-
- while (fabs(prev) > 1e-20) {
- double summand = prev * x * x / (4 * i * i);
- y += summand;
- prev = summand;
- i++;
- }
-
- return y;
-}
static inline void generate_window_func(float *lut, int N, int win_func,
float *overlap)
@@ -232,13 +220,15 @@ static inline void generate_window_func(float *lut, int N, int win_func,
*overlap = 0.75;
break;
case WFUNC_KAISER:
+ {
+ double scale = 1.0 / av_bessel_i0(12.);
for (n = 0; n < N; n++) {
double x = 2.0 / (double)(N - 1);
-
- lut[n] = get_i0(12. * sqrt(1. - SQR(n * x - 1.))) / get_i0(12.);
+ lut[n] = av_bessel_i0(12. * sqrt(1. - SQR(n * x - 1.))) * scale;
}
*overlap = 0.75;
break;
+ }
default:
av_assert0(0);
}
--
2.17.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* [FFmpeg-devel] [PATCH 4/6] avcodec/kbdwin: Use av_bessel_i0()
2023-05-22 23:35 [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics Michael Niedermayer
2023-05-22 23:35 ` [FFmpeg-devel] [PATCH 2/6] avfilter/asrc_sinc: Use av_bessel_i0() Michael Niedermayer
2023-05-22 23:35 ` [FFmpeg-devel] [PATCH 3/6] avfilter/window_func: " Michael Niedermayer
@ 2023-05-22 23:35 ` Michael Niedermayer
2023-05-22 23:36 ` [FFmpeg-devel] [PATCH 5/6] avcodec/kbdwin: Avoid computing bessel values twice Michael Niedermayer
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Michael Niedermayer @ 2023-05-22 23:35 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Old code used about 7 times as many cpu cycles as new
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
libavcodec/kbdwin.c | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/libavcodec/kbdwin.c b/libavcodec/kbdwin.c
index bf32aeb317..5dff334250 100644
--- a/libavcodec/kbdwin.c
+++ b/libavcodec/kbdwin.c
@@ -21,8 +21,6 @@
#include "libavutil/attributes.h"
#include "kbdwin.h"
-#define BESSEL_I0_ITER 50 // default: 50 iterations of Bessel I0 approximation
-
av_cold void ff_kbd_window_init(float *window, float alpha, int n)
{
int i, j;
@@ -34,9 +32,7 @@ av_cold void ff_kbd_window_init(float *window, float alpha, int n)
for (i = 0; i < n; i++) {
tmp = i * (n - i) * alpha2;
- bessel = 1.0;
- for (j = BESSEL_I0_ITER; j > 0; j--)
- bessel = bessel * tmp / (j * j) + 1;
+ bessel = av_bessel_i0(sqrt(tmp) * 2);
sum += bessel;
local_window[i] = sum;
}
--
2.17.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* [FFmpeg-devel] [PATCH 5/6] avcodec/kbdwin: Avoid computing bessel values twice
2023-05-22 23:35 [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics Michael Niedermayer
` (2 preceding siblings ...)
2023-05-22 23:35 ` [FFmpeg-devel] [PATCH 4/6] avcodec/kbdwin: " Michael Niedermayer
@ 2023-05-22 23:36 ` Michael Niedermayer
2023-05-22 23:36 ` [FFmpeg-devel] [PATCH 6/6] avcodec/kbdwin: Remove low precision intermediate in ff_kbd_window_init_fixed() Michael Niedermayer
2023-05-28 21:15 ` [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics Michael Niedermayer
5 siblings, 0 replies; 7+ messages in thread
From: Michael Niedermayer @ 2023-05-22 23:36 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Also reduce neeeded temporary storage by half
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
libavcodec/kbdwin.c | 28 +++++++++++++++++-----------
1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/libavcodec/kbdwin.c b/libavcodec/kbdwin.c
index 5dff334250..e2f6491124 100644
--- a/libavcodec/kbdwin.c
+++ b/libavcodec/kbdwin.c
@@ -23,23 +23,29 @@
av_cold void ff_kbd_window_init(float *window, float alpha, int n)
{
- int i, j;
- double sum = 0.0, bessel, tmp;
- double local_window[FF_KBD_WINDOW_MAX];
- double alpha2 = (alpha * M_PI / n) * (alpha * M_PI / n);
+ int i;
+ double sum = 0.0, tmp;
+ double scale = 0.0;
+ double temp[FF_KBD_WINDOW_MAX / 2 + 1];
+ double alpha2 = 4 * (alpha * M_PI / n) * (alpha * M_PI / n);
av_assert0(n <= FF_KBD_WINDOW_MAX);
- for (i = 0; i < n; i++) {
+ for (i = 0; i <= n / 2; i++) {
tmp = i * (n - i) * alpha2;
- bessel = av_bessel_i0(sqrt(tmp) * 2);
- sum += bessel;
- local_window[i] = sum;
+ temp[i] = av_bessel_i0(sqrt(tmp));
+ scale += temp[i] * (1 + (i && i<n/2));
}
+ scale = 1.0/(scale + 1);
- sum++;
- for (i = 0; i < n; i++)
- window[i] = sqrt(local_window[i] / sum);
+ for (i = 0; i <= n / 2; i++) {
+ sum += temp[i];
+ window[i] = sqrt(sum * scale);
+ }
+ for (; i < n; i++) {
+ sum += temp[n - i];
+ window[i] = sqrt(sum * scale);
+ }
}
av_cold void ff_kbd_window_init_fixed(int32_t *window, float alpha, int n)
--
2.17.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* [FFmpeg-devel] [PATCH 6/6] avcodec/kbdwin: Remove low precision intermediate in ff_kbd_window_init_fixed()
2023-05-22 23:35 [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics Michael Niedermayer
` (3 preceding siblings ...)
2023-05-22 23:36 ` [FFmpeg-devel] [PATCH 5/6] avcodec/kbdwin: Avoid computing bessel values twice Michael Niedermayer
@ 2023-05-22 23:36 ` Michael Niedermayer
2023-05-28 21:15 ` [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics Michael Niedermayer
5 siblings, 0 replies; 7+ messages in thread
From: Michael Niedermayer @ 2023-05-22 23:36 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Previously floats where scaled up to 32bit int, but floats do not
have 32bits in their mantisse so a quarter of the bits where nonsense.
It seems no fate test is affected by this change, which is interresting
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
libavcodec/kbdwin.c | 20 +++++++++++---------
1 file changed, 11 insertions(+), 9 deletions(-)
diff --git a/libavcodec/kbdwin.c b/libavcodec/kbdwin.c
index e2f6491124..163f9d5251 100644
--- a/libavcodec/kbdwin.c
+++ b/libavcodec/kbdwin.c
@@ -21,7 +21,7 @@
#include "libavutil/attributes.h"
#include "kbdwin.h"
-av_cold void ff_kbd_window_init(float *window, float alpha, int n)
+av_cold static void kbd_window_init(float *float_window, int *int_window, float alpha, int n)
{
int i;
double sum = 0.0, tmp;
@@ -40,20 +40,22 @@ av_cold void ff_kbd_window_init(float *window, float alpha, int n)
for (i = 0; i <= n / 2; i++) {
sum += temp[i];
- window[i] = sqrt(sum * scale);
+ if (float_window) float_window[i] = sqrt(sum * scale);
+ else int_window[i] = lrint(2147483647 * sqrt(sum * scale));
}
for (; i < n; i++) {
sum += temp[n - i];
- window[i] = sqrt(sum * scale);
+ if (float_window) float_window[i] = sqrt(sum * scale);
+ else int_window[i] = lrint(2147483647 * sqrt(sum * scale));
}
}
-av_cold void ff_kbd_window_init_fixed(int32_t *window, float alpha, int n)
+av_cold void ff_kbd_window_init(float *window, float alpha, int n)
{
- int i;
- float local_window[FF_KBD_WINDOW_MAX];
+ kbd_window_init(window, NULL, alpha, n);
+}
- ff_kbd_window_init(local_window, alpha, n);
- for (i = 0; i < n; i++)
- window[i] = (int)floor(2147483647.0 * local_window[i] + 0.5);
+av_cold void ff_kbd_window_init_fixed(int32_t *window, float alpha, int n)
+{
+ kbd_window_init(NULL, window, alpha, n);
}
--
2.17.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics
2023-05-22 23:35 [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics Michael Niedermayer
` (4 preceding siblings ...)
2023-05-22 23:36 ` [FFmpeg-devel] [PATCH 6/6] avcodec/kbdwin: Remove low precision intermediate in ff_kbd_window_init_fixed() Michael Niedermayer
@ 2023-05-28 21:15 ` Michael Niedermayer
5 siblings, 0 replies; 7+ messages in thread
From: Michael Niedermayer @ 2023-05-28 21:15 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 908 bytes --]
On Tue, May 23, 2023 at 01:35:56AM +0200, Michael Niedermayer wrote:
> 0th order modified bessel function of the first kind are used in multiple
> places, lets avoid having 3+ different implementations
> I picked this one as its accurate and quite fast, it can be replaced if
> a better one is found
>
> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
> ---
> doc/APIchanges | 3 ++
> libavutil/mathematics.c | 104 ++++++++++++++++++++++++++++++++++++++
> libavutil/mathematics.h | 4 ++
> libswresample/resample.c | 106 +--------------------------------------
> 4 files changed, 112 insertions(+), 105 deletions(-)
will retest this patchset on arm/mips/mingw32/64/x86-32/64 linux and if it passes apply
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Avoid a single point of failure, be that a person or equipment.
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-05-28 21:15 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-22 23:35 [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics Michael Niedermayer
2023-05-22 23:35 ` [FFmpeg-devel] [PATCH 2/6] avfilter/asrc_sinc: Use av_bessel_i0() Michael Niedermayer
2023-05-22 23:35 ` [FFmpeg-devel] [PATCH 3/6] avfilter/window_func: " Michael Niedermayer
2023-05-22 23:35 ` [FFmpeg-devel] [PATCH 4/6] avcodec/kbdwin: " Michael Niedermayer
2023-05-22 23:36 ` [FFmpeg-devel] [PATCH 5/6] avcodec/kbdwin: Avoid computing bessel values twice Michael Niedermayer
2023-05-22 23:36 ` [FFmpeg-devel] [PATCH 6/6] avcodec/kbdwin: Remove low precision intermediate in ff_kbd_window_init_fixed() Michael Niedermayer
2023-05-28 21:15 ` [FFmpeg-devel] [PATCH 1/6] Move bessel_i0() from swresample/resample to avutil/mathematics Michael Niedermayer
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git