Coverage Report

Created: 2024-09-06 07:53

/src/ffmpeg/libavcodec/opus/enc_utils.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Opus encoder
3
 * Copyright (c) 2017 Rostislav Pehlivanov <atomnuker@gmail.com>
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21
22
#ifndef AVCODEC_OPUS_ENC_UTILS_H
23
#define AVCODEC_OPUS_ENC_UTILS_H
24
25
#include <math.h>
26
#include <string.h>
27
28
#include "opus.h"
29
30
typedef struct FFBesselFilter {
31
    float a[3];
32
    float b[2];
33
    float x[3];
34
    float y[3];
35
} FFBesselFilter;
36
37
/* Fills the coefficients, returns 1 if filter will be unstable */
38
static inline int bessel_reinit(FFBesselFilter *s, float n, float f0, float fs,
39
                                int highpass)
40
0
{
41
0
    int unstable;
42
0
    float c, cfreq, w0, k1, k2;
43
44
0
    if (!highpass) {
45
0
        c = (1.0f/sqrtf(sqrtf(pow(2.0f, 1.0f/n) - 3.0f/4.0f) - 0.5f))/sqrtf(3.0f);
46
0
        cfreq = c*f0/fs;
47
0
        unstable = (cfreq <= 0.0f || cfreq >= 1.0f/4.0f);
48
0
    } else {
49
0
        c = sqrtf(3.0f)*sqrtf(sqrtf(pow(2.0f, 1.0f/n) - 3.0f/4.0f) - 0.5f);
50
0
        cfreq = 0.5f - c*f0/fs;
51
0
        unstable = (cfreq <= 3.0f/8.0f || cfreq >= 1.0f/2.0f);
52
0
    }
53
54
0
    w0 = tanf(M_PI*cfreq);
55
0
    k1 = 3.0f * w0;
56
0
    k2 = 3.0f * w0;
57
58
0
    s->a[0] = k2/(1.0f + k1 + k2);
59
0
    s->a[1] = 2.0f * s->a[0];
60
0
    s->a[2] = s->a[0];
61
0
    s->b[0] = 2.0f * s->a[0] * (1.0f/k2 - 1.0f);
62
0
    s->b[1] = 1.0f - (s->a[0] + s->a[1] + s->a[2] + s->b[0]);
63
64
0
    if (highpass) {
65
0
        s->a[1] *= -1;
66
0
        s->b[0] *= -1;
67
0
    }
68
69
0
    return unstable;
70
0
}
Unexecuted instantiation: enc.c:bessel_reinit
Unexecuted instantiation: enc_psy.c:bessel_reinit
71
72
static inline int bessel_init(FFBesselFilter *s, float n, float f0, float fs,
73
                              int highpass)
74
0
{
75
0
    memset(s, 0, sizeof(FFBesselFilter));
76
0
    return bessel_reinit(s, n, f0, fs, highpass);
77
0
}
Unexecuted instantiation: enc.c:bessel_init
Unexecuted instantiation: enc_psy.c:bessel_init
78
79
static inline float bessel_filter(FFBesselFilter *s, float x)
80
0
{
81
0
    s->x[2] = s->x[1];
82
0
    s->x[1] = s->x[0];
83
0
    s->x[0] = x;
84
0
    s->y[2] = s->y[1];
85
0
    s->y[1] = s->y[0];
86
0
    s->y[0] = s->a[0]*s->x[0] + s->a[1]*s->x[1] + s->a[2]*s->x[2] + s->b[0]*s->y[1] + s->b[1]*s->y[2];
87
0
    return s->y[0];
88
0
}
Unexecuted instantiation: enc.c:bessel_filter
Unexecuted instantiation: enc_psy.c:bessel_filter
89
90
#endif /* AVCODEC_OPUS_ENC_UTILS_H */