FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libswresample
swresample_internal.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at)
3
*
4
* This file is part of libswresample
5
*
6
* libswresample is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* libswresample is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with libswresample; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#ifndef SWR_INTERNAL_H
22
#define SWR_INTERNAL_H
23
24
#include "
swresample.h
"
25
#include "
libavutil/channel_layout.h
"
26
#include "config.h"
27
28
#define SWR_CH_MAX 32
29
30
#define SQRT3_2 1.22474487139158904909
/* sqrt(3/2) */
31
32
#define NS_TAPS 20
33
34
#if ARCH_X86_64
35
typedef
int64_t
integer
;
36
#else
37
typedef
int
integer
;
38
#endif
39
40
typedef
void
(
mix_1_1_func_type
)(
void
*
out
,
const
void
*
in
,
void
*coeffp,
integer
index
,
integer
len
);
41
typedef
void
(
mix_2_1_func_type
)(
void
*
out
,
const
void
*in1,
const
void
*in2,
void
*coeffp,
integer
index1,
integer
index2,
integer
len
);
42
43
typedef
void
(
mix_any_func_type
)(
uint8_t
**
out
,
const
uint8_t
**in1,
void
*coeffp,
integer
len
);
44
45
typedef
struct
AudioData
{
46
uint8_t
*
ch
[
SWR_CH_MAX
];
///< samples buffer per channel
47
uint8_t
*
data
;
///< samples buffer
48
int
ch_count
;
///< number of channels
49
int
bps
;
///< bytes per sample
50
int
count
;
///< number of samples
51
int
planar
;
///< 1 if planar audio, 0 otherwise
52
enum
AVSampleFormat
fmt
;
///< sample format
53
}
AudioData
;
54
55
struct
DitherContext
{
56
int
method
;
57
int
noise_pos
;
58
float
scale
;
59
float
noise_scale
;
///< Noise scale
60
int
ns_taps
;
///< Noise shaping dither taps
61
float
ns_scale
;
///< Noise shaping dither scale
62
float
ns_scale_1
;
///< Noise shaping dither scale^-1
63
int
ns_pos
;
///< Noise shaping dither position
64
float
ns_coeffs
[
NS_TAPS
];
///< Noise shaping filter coefficients
65
float
ns_errors
[
SWR_CH_MAX
][2*
NS_TAPS
];
66
AudioData
noise
;
///< noise used for dithering
67
AudioData
temp
;
///< temporary storage when writing into the input buffer isn't possible
68
int
output_sample_bits
;
///< the number of used output bits, needed to scale dither correctly
69
};
70
71
typedef
struct
ResampleContext
* (* resample_init_func)(
struct
ResampleContext
*
c
,
int
out_rate,
int
in_rate,
int
filter_size,
int
phase_shift
,
int
linear
,
72
double
cutoff,
enum
AVSampleFormat
format
,
enum
SwrFilterType
filter_type
,
int
kaiser_beta
,
double
precision,
int
cheby);
73
typedef
void
(*
resample_free_func
)(
struct
ResampleContext
**
c
);
74
typedef
int (*
multiple_resample_func
)(
struct
ResampleContext
*
c
,
AudioData
*dst,
int
dst_size,
AudioData
*
src
,
int
src_size,
int
*consumed);
75
typedef
int (*
resample_flush_func
)(
struct
SwrContext
*
c
);
76
typedef
int (*
set_compensation_func
)(
struct
ResampleContext
*
c
,
int
sample_delta,
int
compensation_distance
);
77
typedef
int64_t (*
get_delay_func
)(
struct
SwrContext
*
s
, int64_t base);
78
typedef
int (*
invert_initial_buffer_func
)(
struct
ResampleContext
*
c
,
AudioData
*dst,
const
AudioData
*
src
,
int
src_size,
int
*dst_idx,
int
*dst_count);
79
80
struct
Resampler
{
81
resample_init_func
init
;
82
resample_free_func
free
;
83
multiple_resample_func
multiple_resample
;
84
resample_flush_func
flush
;
85
set_compensation_func
set_compensation
;
86
get_delay_func
get_delay
;
87
invert_initial_buffer_func
invert_initial_buffer
;
88
};
89
90
extern
struct
Resampler
const
swri_resampler
;
91
extern
struct
Resampler
const
swri_soxr_resampler
;
92
93
struct
SwrContext
{
94
const
AVClass
*
av_class
;
///< AVClass used for AVOption and av_log()
95
int
log_level_offset
;
///< logging level offset
96
void
*
log_ctx
;
///< parent logging context
97
enum
AVSampleFormat
in_sample_fmt
;
///< input sample format
98
enum
AVSampleFormat
int_sample_fmt
;
///< internal sample format (AV_SAMPLE_FMT_FLTP or AV_SAMPLE_FMT_S16P)
99
enum
AVSampleFormat
out_sample_fmt
;
///< output sample format
100
int64_t
in_ch_layout
;
///< input channel layout
101
int64_t
out_ch_layout
;
///< output channel layout
102
int
in_sample_rate
;
///< input sample rate
103
int
out_sample_rate
;
///< output sample rate
104
int
flags
;
///< miscellaneous flags such as SWR_FLAG_RESAMPLE
105
float
slev
;
///< surround mixing level
106
float
clev
;
///< center mixing level
107
float
lfe_mix_level
;
///< LFE mixing level
108
float
rematrix_volume
;
///< rematrixing volume coefficient
109
float
rematrix_maxval
;
///< maximum value for rematrixing output
110
int
matrix_encoding
;
/**< matrixed stereo encoding */
111
const
int
*
channel_map
;
///< channel index (or -1 if muted channel) map
112
int
used_ch_count
;
///< number of used input channels (mapped channel count if channel_map, otherwise in.ch_count)
113
int
engine
;
114
115
struct
DitherContext
dither
;
116
117
int
filter_size
;
/**< length of each FIR filter in the resampling filterbank relative to the cutoff frequency */
118
int
phase_shift
;
/**< log2 of the number of entries in the resampling polyphase filterbank */
119
int
linear_interp
;
/**< if 1 then the resampling FIR filter will be linearly interpolated */
120
double
cutoff
;
/**< resampling cutoff frequency (swr: 6dB point; soxr: 0dB point). 1.0 corresponds to half the output sample rate */
121
int
filter_type
;
/**< swr resampling filter type */
122
int
kaiser_beta
;
/**< swr beta value for Kaiser window (only applicable if filter_type == AV_FILTER_TYPE_KAISER) */
123
double
precision
;
/**< soxr resampling precision (in bits) */
124
int
cheby
;
/**< soxr: if 1 then passband rolloff will be none (Chebyshev) & irrational ratio approximation precision will be higher */
125
126
float
min_compensation
;
///< swr minimum below which no compensation will happen
127
float
min_hard_compensation
;
///< swr minimum below which no silence inject / sample drop will happen
128
float
soft_compensation_duration
;
///< swr duration over which soft compensation is applied
129
float
max_soft_compensation
;
///< swr maximum soft compensation in seconds over soft_compensation_duration
130
float
async
;
///< swr simple 1 parameter async, similar to ffmpegs -async
131
int64_t
firstpts_in_samples
;
///< swr first pts in samples
132
133
int
resample_first
;
///< 1 if resampling must come first, 0 if rematrixing
134
int
rematrix
;
///< flag to indicate if rematrixing is needed (basically if input and output layouts mismatch)
135
int
rematrix_custom
;
///< flag to indicate that a custom matrix has been defined
136
137
AudioData
in
;
///< input audio data
138
AudioData
postin
;
///< post-input audio data: used for rematrix/resample
139
AudioData
midbuf
;
///< intermediate audio data (postin/preout)
140
AudioData
preout
;
///< pre-output audio data: used for rematrix/resample
141
AudioData
out
;
///< converted output audio data
142
AudioData
in_buffer
;
///< cached audio data (convert and resample purpose)
143
AudioData
silence
;
///< temporary with silence
144
AudioData
drop_temp
;
///< temporary used to discard output
145
int
in_buffer_index
;
///< cached buffer position
146
int
in_buffer_count
;
///< cached buffer length
147
int
resample_in_constraint
;
///< 1 if the input end was reach before the output end, 0 otherwise
148
int
flushed
;
///< 1 if data is to be flushed and no further input is expected
149
int64_t
outpts
;
///< output PTS
150
int64_t
firstpts
;
///< first PTS
151
int
drop_output
;
///< number of output samples to drop
152
153
struct
AudioConvert
*
in_convert
;
///< input conversion context
154
struct
AudioConvert
*
out_convert
;
///< output conversion context
155
struct
AudioConvert
*
full_convert
;
///< full conversion context (single conversion for input and output)
156
struct
ResampleContext
*
resample
;
///< resampling context
157
struct
Resampler
const *
resampler
;
///< resampler virtual function table
158
159
float
matrix
[
SWR_CH_MAX
][
SWR_CH_MAX
];
///< floating point rematrixing coefficients
160
uint8_t
*
native_matrix
;
161
uint8_t
*
native_one
;
162
uint8_t
*
native_simd_one
;
163
uint8_t
*
native_simd_matrix
;
164
int32_t
matrix32
[
SWR_CH_MAX
][
SWR_CH_MAX
];
///< 17.15 fixed point rematrixing coefficients
165
uint8_t
matrix_ch
[
SWR_CH_MAX
][
SWR_CH_MAX
+1];
///< Lists of input channels per output channel that have non zero rematrixing coefficients
166
mix_1_1_func_type
*
mix_1_1_f
;
167
mix_1_1_func_type
*
mix_1_1_simd
;
168
169
mix_2_1_func_type
*
mix_2_1_f
;
170
mix_2_1_func_type
*
mix_2_1_simd
;
171
172
mix_any_func_type
*
mix_any_f
;
173
174
/* TODO: callbacks for ASM optimizations */
175
};
176
177
int
swri_realloc_audio
(
AudioData
*
a
,
int
count
);
178
179
void
swri_noise_shaping_int16
(
SwrContext
*s,
AudioData
*dsts,
const
AudioData
*srcs,
const
AudioData
*noises,
int
count
);
180
void
swri_noise_shaping_int32
(
SwrContext
*s,
AudioData
*dsts,
const
AudioData
*srcs,
const
AudioData
*noises,
int
count
);
181
void
swri_noise_shaping_float
(
SwrContext
*s,
AudioData
*dsts,
const
AudioData
*srcs,
const
AudioData
*noises,
int
count
);
182
void
swri_noise_shaping_double
(
SwrContext
*s,
AudioData
*dsts,
const
AudioData
*srcs,
const
AudioData
*noises,
int
count
);
183
184
int
swri_rematrix_init
(
SwrContext
*s);
185
void
swri_rematrix_free
(
SwrContext
*s);
186
int
swri_rematrix
(
SwrContext
*s,
AudioData
*
out
,
AudioData
*
in
,
int
len
,
int
mustcopy);
187
int
swri_rematrix_init_x86
(
struct
SwrContext
*s);
188
189
void
swri_get_dither
(
SwrContext
*s,
void
*dst,
int
len
,
unsigned
seed
,
enum
AVSampleFormat
noise_fmt);
190
int
swri_dither_init
(
SwrContext
*s,
enum
AVSampleFormat
out_fmt,
enum
AVSampleFormat
in_fmt);
191
192
void
swri_audio_convert_init_aarch64
(
struct
AudioConvert
*ac,
193
enum
AVSampleFormat
out_fmt,
194
enum
AVSampleFormat
in_fmt,
195
int
channels);
196
void
swri_audio_convert_init_arm
(
struct
AudioConvert
*ac,
197
enum
AVSampleFormat
out_fmt,
198
enum
AVSampleFormat
in_fmt,
199
int
channels);
200
void
swri_audio_convert_init_x86
(
struct
AudioConvert
*ac,
201
enum
AVSampleFormat
out_fmt,
202
enum
AVSampleFormat
in_fmt,
203
int
channels);
204
205
#endif
Generated on Sun Mar 8 2015 02:35:15 for FFmpeg by
1.8.2