mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-19 05:17:04 +00:00
avcodec/kbdwin: Support arbitrary sized windows
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
94d44dbe21
commit
cf00f60bab
@ -19,20 +19,23 @@
|
|||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "libavutil/mathematics.h"
|
#include "libavutil/mathematics.h"
|
||||||
#include "libavutil/attributes.h"
|
#include "libavutil/attributes.h"
|
||||||
|
#include "libavutil/mem.h"
|
||||||
#include "kbdwin.h"
|
#include "kbdwin.h"
|
||||||
|
|
||||||
av_cold static void kbd_window_init(float *float_window, int *int_window, float alpha, int n)
|
av_cold static int kbd_window_init(float *float_window, int *int_window, float alpha, int n)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
double sum = 0.0, tmp;
|
double sum = 0.0, tmp;
|
||||||
double scale = 0.0;
|
double scale = 0.0;
|
||||||
double temp[FF_KBD_WINDOW_MAX / 2 + 1];
|
double temp_small[FF_KBD_WINDOW_MAX / 2 + 1];
|
||||||
|
double *temp= n<=FF_KBD_WINDOW_MAX ? temp_small : av_malloc((n/2+1) * sizeof(*temp));
|
||||||
double alpha2 = 4 * (alpha * M_PI / n) * (alpha * M_PI / n);
|
double alpha2 = 4 * (alpha * M_PI / n) * (alpha * M_PI / n);
|
||||||
|
|
||||||
av_assert0(n <= FF_KBD_WINDOW_MAX);
|
if (!temp)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
|
||||||
for (i = 0; i <= n / 2; i++) {
|
for (i = 0; i <= n / 2; i++) {
|
||||||
tmp = i * (n - i) * alpha2;
|
tmp = alpha2 * i * (n - i);
|
||||||
temp[i] = av_bessel_i0(sqrt(tmp));
|
temp[i] = av_bessel_i0(sqrt(tmp));
|
||||||
scale += temp[i] * (1 + (i && i<n/2));
|
scale += temp[i] * (1 + (i && i<n/2));
|
||||||
}
|
}
|
||||||
@ -48,14 +51,17 @@ av_cold static void kbd_window_init(float *float_window, int *int_window, float
|
|||||||
if (float_window) float_window[i] = sqrt(sum * scale);
|
if (float_window) float_window[i] = sqrt(sum * scale);
|
||||||
else int_window[i] = lrint(2147483647 * sqrt(sum * scale));
|
else int_window[i] = lrint(2147483647 * sqrt(sum * scale));
|
||||||
}
|
}
|
||||||
|
if (temp != temp_small)
|
||||||
|
av_free(temp);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
av_cold void ff_kbd_window_init(float *window, float alpha, int n)
|
av_cold int ff_kbd_window_init(float *window, float alpha, int n)
|
||||||
{
|
{
|
||||||
kbd_window_init(window, NULL, alpha, n);
|
return kbd_window_init(window, NULL, alpha, n);
|
||||||
}
|
}
|
||||||
|
|
||||||
av_cold void ff_kbd_window_init_fixed(int32_t *window, float alpha, int n)
|
av_cold int ff_kbd_window_init_fixed(int32_t *window, float alpha, int n)
|
||||||
{
|
{
|
||||||
kbd_window_init(NULL, window, alpha, n);
|
return kbd_window_init(NULL, window, alpha, n);
|
||||||
}
|
}
|
||||||
|
@ -30,9 +30,11 @@
|
|||||||
* Generate a Kaiser-Bessel Derived Window.
|
* Generate a Kaiser-Bessel Derived Window.
|
||||||
* @param window pointer to half window
|
* @param window pointer to half window
|
||||||
* @param alpha determines window shape
|
* @param alpha determines window shape
|
||||||
* @param n size of half window, max FF_KBD_WINDOW_MAX
|
* @param n size of half window
|
||||||
|
*
|
||||||
|
* @return if n is larger than FF_KBD_WINDOW_MAX then AVERROR(ENOMEM) is possible
|
||||||
*/
|
*/
|
||||||
void ff_kbd_window_init(float *window, float alpha, int n);
|
int ff_kbd_window_init(float *window, float alpha, int n);
|
||||||
void ff_kbd_window_init_fixed(int32_t *window, float alpha, int n);
|
int ff_kbd_window_init_fixed(int32_t *window, float alpha, int n);
|
||||||
|
|
||||||
#endif /* AVCODEC_KBDWIN_H */
|
#endif /* AVCODEC_KBDWIN_H */
|
||||||
|
Loading…
Reference in New Issue
Block a user