32 #define HISTOGRAM_SLOTS 12000 33 #define BUTTER_ORDER 2 48 { 0.01184742123123, -0.04631092400086, 0.06584226961238,
49 -0.02165588522478, -0.05656260778952, 0.08607493592760,
50 -0.03375544339786, -0.04216579932754, 0.06416711490648,
51 -0.03444708260844, 0.00697275872241 },
52 { 1.00000000000000, -5.24727318348167, 10.60821585192244,
53 -8.74127665810413, -1.33906071371683, 8.07972882096606,
54 -5.46179918950847, 0.54318070652536, 0.87450969224280,
55 -0.34656083539754, 0.03034796843589 },
56 { 0.99653501465135, -1.99307002930271, 0.99653501465135 },
57 { 1.00000000000000, -1.99305802314321, 0.99308203546221 },
61 { 0.00268568524529, -0.00852379426080, 0.00852704191347,
62 0.00146116310295, -0.00950855828762, 0.00625449515499,
63 0.00116183868722, -0.00362461417136, 0.00203961000134,
64 -0.00050664587933, 0.00004327455427 },
65 { 1.00000000000000, -5.57512782763045, 12.44291056065794,
66 -12.87462799681221, 3.08554846961576, 6.62493459880692,
67 -7.07662766313248, 2.51175542736441, 0.06731510802735,
68 -0.24567753819213, 0.03961404162376 },
69 { 0.99622916581118, -1.99245833162236, 0.99622916581118 },
70 { 1.00000000000000, -1.99244411238133, 0.99247255086339 },
74 { 0.00639682359450, -0.02556437970955, 0.04230854400938,
75 -0.03722462201267, 0.01718514827295, 0.00610592243009,
76 -0.03065965747365, 0.04345745003539, -0.03298592681309,
77 0.01320937236809, -0.00220304127757 },
78 { 1.00000000000000, -6.14814623523425, 15.80002457141566,
79 -20.78487587686937, 11.98848552310315, 3.36462015062606,
80 -10.22419868359470, 6.65599702146473, -1.67141861110485,
81 -0.05417956536718, 0.07374767867406 },
82 { 0.99538268958706, -1.99076537917413, 0.99538268958706 },
83 { 1.00000000000000, -1.99074405950505, 0.99078669884321 },
87 { 0.00553120584305, -0.02112620545016, 0.03549076243117,
88 -0.03362498312306, 0.01425867248183, 0.01344686928787,
89 -0.03392770787836, 0.03464136459530, -0.02039116051549,
90 0.00667420794705, -0.00093763762995 },
91 { 1.00000000000000, -6.14581710839925, 16.04785903675838,
92 -22.19089131407749, 15.24756471580286, -0.52001440400238,
93 -8.00488641699940, 6.60916094768855, -2.37856022810923,
94 0.33106947986101, 0.00459820832036 },
95 { 0.99480702681278, -1.98961405362557, 0.99480702681278 },
96 { 1.00000000000000, -1.98958708647324, 0.98964102077790 },
100 { 0.00528778718259, -0.01893240907245, 0.03185982561867,
101 -0.02926260297838, 0.00715743034072, 0.01985743355827,
102 -0.03222614850941, 0.02565681978192, -0.01210662313473,
103 0.00325436284541, -0.00044173593001 },
104 { 1.00000000000000, -6.24932108456288, 17.42344320538476,
105 -27.86819709054896, 26.79087344681326,-13.43711081485123,
106 -0.66023612948173, 6.03658091814935, -4.24926577030310,
107 1.40829268709186, -0.19480852628112 },
108 { 0.99406737810867, -1.98813475621734, 0.99406737810867 },
109 { 1.00000000000000, -1.98809955990514, 0.98816995252954 },
113 { 0.00588138296683, -0.01613559730421, 0.02184798954216,
114 -0.01742490405317, 0.00464635643780, 0.01117772513205,
115 -0.02123865824368, 0.01959354413350, -0.01079720643523,
116 0.00352183686289, -0.00063124341421 },
117 { 1.00000000000000, -5.97808823642008, 16.21362507964068,
118 -25.72923730652599, 25.40470663139513,-14.66166287771134,
119 2.81597484359752, 2.51447125969733, -2.23575306985286,
120 0.75788151036791, -0.10078025199029 },
121 { 0.99308203517541, -1.98616407035082, 0.99308203517541 },
122 { 1.00000000000000, -1.98611621154089, 0.98621192916075 },
126 { 0.02667482047416, -0.11377479336097, 0.23063167910965,
127 -0.30726477945593, 0.33188520686529, -0.33862680249063,
128 0.31807161531340, -0.23730796929880, 0.12273894790371,
129 -0.03840017967282, 0.00549673387936 },
130 { 1.00000000000000, -6.31836451657302, 18.31351310801799,
131 -31.88210014815921, 36.53792146976740,-28.23393036467559,
132 14.24725258227189, -4.04670980012854, 0.18865757280515,
133 0.25420333563908, -0.06012333531065 },
134 { 0.99247255046129, -1.98494510092259, 0.99247255046129 },
135 { 1.00000000000000, -1.98488843762335, 0.98500176422183 },
139 { 0.02613056568174, -0.08128786488109, 0.14937282347325,
140 -0.21695711675126, 0.25010286673402, -0.23162283619278,
141 0.17424041833052, -0.10299599216680, 0.04258696481981,
142 -0.00977952936493, 0.00105325558889 },
143 { 1.00000000000000, -5.73625477092119, 16.15249794355035,
144 -29.68654912464508, 39.55706155674083,-39.82524556246253,
145 30.50605345013009,-17.43051772821245, 7.05154573908017,
146 -1.80783839720514, 0.22127840210813 },
147 { 0.98964101933472, -1.97928203866944, 0.98964101933472 },
148 { 1.00000000000000, -1.97917472731009, 0.97938935002880 },
152 { 0.03144914734085, -0.06151729206963, 0.08066788708145,
153 -0.09737939921516, 0.08943210803999, -0.06989984672010,
154 0.04926972841044, -0.03161257848451, 0.01456837493506,
155 -0.00316015108496, 0.00132807215875 },
156 { 1.00000000000000, -4.87377313090032, 12.03922160140209,
157 -20.10151118381395, 25.10388534415171,-24.29065560815903,
158 18.27158469090663,-10.45249552560593, 4.30319491872003,
159 -1.13716992070185, 0.14510733527035 },
160 { 0.98816995007392, -1.97633990014784, 0.98816995007392 },
161 { 1.00000000000000, -1.97619994516973, 0.97647985512594 },
165 { 0.03857599435200, -0.02160367184185, -0.00123395316851,
166 -0.00009291677959, -0.01655260341619, 0.02161526843274,
167 -0.02074045215285, 0.00594298065125, 0.00306428023191,
168 0.00012025322027, 0.00288463683916 },
169 { 1.00000000000000, -3.84664617118067, 7.81501653005538,
170 -11.34170355132042, 13.05504219327545,-12.28759895145294,
171 9.48293806319790, -5.87257861775999, 2.75465861874613,
172 -0.86984376593551, 0.13919314567432 },
173 { 0.98621192462708, -1.97242384925416, 0.98621192462708 },
174 { 1.00000000000000, -1.97223372919527, 0.97261396931306 },
178 { 0.05418656406430, -0.02911007808948, -0.00848709379851,
179 -0.00851165645469, -0.00834990904936, 0.02245293253339,
180 -0.02596338512915, 0.01624864962975, -0.00240879051584,
181 0.00674613682247, -0.00187763777362 },
182 { 1.00000000000000, -3.47845948550071, 6.36317777566148,
183 -8.54751527471874, 9.47693607801280, -8.81498681370155,
184 6.85401540936998, -4.39470996079559, 2.19611684890774,
185 -0.75104302451432, 0.13149317958808 },
186 { 0.98500175787242, -1.97000351574484, 0.98500175787242 },
187 { 1.00000000000000, -1.96977855582618, 0.97022847566350 },
191 { 0.08717879977844, -0.01000374016172, -0.06265852122368,
192 -0.01119328800950, -0.00114279372960, 0.02081333954769,
193 -0.01603261863207, 0.01936763028546, 0.00760044736442,
194 -0.00303979112271, -0.00075088605788 },
195 { 1.00000000000000, -2.62816311472146, 3.53734535817992,
196 -3.81003448678921, 3.91291636730132, -3.53518605896288,
197 2.71356866157873, -1.86723311846592, 1.12075382367659,
198 -0.48574086886890, 0.11330544663849 },
199 { 0.98252400815195, -1.96504801630391, 0.98252400815195 },
200 { 1.00000000000000, -1.96474258269041, 0.96535344991740 },
204 { 0.15457299681924, -0.09331049056315, -0.06247880153653,
205 0.02163541888798, -0.05588393329856, 0.04781476674921,
206 0.00222312597743, 0.03174092540049, -0.01390589421898,
207 0.00651420667831, -0.00881362733839 },
208 { 1.00000000000000, -2.37898834973084, 2.84868151156327,
209 -2.64577170229825, 2.23697657451713, -1.67148153367602,
210 1.00595954808547, -0.45953458054983, 0.16378164858596,
211 -0.05032077717131, 0.02347897407020 },
212 { 0.97938932735214, -1.95877865470428, 0.97938932735214 },
213 { 1.00000000000000, -1.95835380975398, 0.95920349965459 },
217 { 0.30296907319327, -0.22613988682123, -0.08587323730772,
218 0.03282930172664, -0.00915702933434, -0.02364141202522,
219 -0.00584456039913, 0.06276101321749, -0.00000828086748,
220 0.00205861885564, -0.02950134983287 },
221 { 1.00000000000000, -1.61273165137247, 1.07977492259970,
222 -0.25656257754070, -0.16276719120440, -0.22638893773906,
223 0.39120800788284, -0.22138138954925, 0.04500235387352,
224 0.02005851806501, 0.00302439095741 },
225 { 0.97531843204928, -1.95063686409857, 0.97531843204928 },
226 { 1.00000000000000, -1.95002759149878, 0.95124613669835 },
230 { 0.33642304856132, -0.25572241425570, -0.11828570177555,
231 0.11921148675203, -0.07834489609479, -0.00469977914380,
232 -0.00589500224440, 0.05724228140351, 0.00832043980773,
233 -0.01635381384540, -0.01760176568150 },
234 { 1.00000000000000, -1.49858979367799, 0.87350271418188,
235 0.12205022308084, -0.80774944671438, 0.47854794562326,
236 -0.12453458140019, -0.04067510197014, 0.08333755284107,
237 -0.04237348025746, 0.02977207319925 },
238 { 0.97316523498161, -1.94633046996323, 0.97316523498161 },
239 { 1.00000000000000, -1.94561023566527, 0.94705070426118 },
243 { 0.38524531015142, -0.27682212062067, -0.09980181488805,
244 0.09951486755646, -0.08934020156622, -0.00322369330199,
245 -0.00110329090689, 0.03784509844682, 0.01683906213303,
246 -0.01147039862572, -0.01941767987192 },
247 { 1.00000000000000, -1.29708918404534, 0.90399339674203,
248 -0.29613799017877, -0.42326645916207, 0.37934887402200,
249 -0.37919795944938, 0.23410283284785, -0.03892971758879,
250 0.00403009552351, 0.03640166626278 },
251 { 0.96535326815829, -1.93070653631658, 0.96535326815829 },
252 { 1.00000000000000, -1.92950577983524, 0.93190729279793 },
256 { 0.44915256608450, -0.14351757464547, -0.22784394429749,
257 -0.01419140100551, 0.04078262797139, -0.12398163381748,
258 0.04097565135648, 0.10478503600251, -0.01863887810927,
259 -0.03193428438915, 0.00541907748707 },
260 { 1.00000000000000, -0.62820619233671, 0.29661783706366,
261 -0.37256372942400, 0.00213767857124, -0.42029820170918,
262 0.22199650564824, 0.00613424350682, 0.06747620744683,
263 0.05784820375801, 0.03222754072173 },
264 { 0.96454515552826, -1.92909031105652, 0.96454515552826 },
265 { 1.00000000000000, -1.92783286977036, 0.93034775234268 },
269 { 0.56619470757641, -0.75464456939302, 0.16242137742230,
270 0.16744243493672, -0.18901604199609, 0.30931782841830,
271 -0.27562961986224, 0.00647310677246, 0.08647503780351,
272 -0.03788984554840, -0.00588215443421 },
273 { 1.00000000000000, -1.04800335126349, 0.29156311971249,
274 -0.26806001042947, 0.00819999645858, 0.45054734505008,
275 -0.33032403314006, 0.06739368333110, -0.04784254229033,
276 0.01639907836189, 0.01807364323573 },
277 { 0.96009142950541, -1.92018285901082, 0.96009142950541 },
278 { 1.00000000000000, -1.91858953033784, 0.92177618768381 },
282 { 0.58100494960553, -0.53174909058578, -0.14289799034253,
283 0.17520704835522, 0.02377945217615, 0.15558449135573,
284 -0.25344790059353, 0.01628462406333, 0.06920467763959,
285 -0.03721611395801, -0.00749618797172 },
286 { 1.00000000000000, -0.51035327095184, -0.31863563325245,
287 -0.20256413484477, 0.14728154134330, 0.38952639978999,
288 -0.23313271880868, -0.05246019024463, -0.02505961724053,
289 0.02442357316099, 0.01818801111503 },
290 { 0.95856916599601, -1.91713833199203, 0.95856916599601 },
291 { 1.00000000000000, -1.91542108074780, 0.91885558323625 },
295 { 0.53648789255105, -0.42163034350696, -0.00275953611929,
296 0.04267842219415, -0.10214864179676, 0.14590772289388,
297 -0.02459864859345, -0.11202315195388, -0.04060034127000,
298 0.04788665548180, -0.02217936801134 },
299 { 1.00000000000000, -0.25049871956020, -0.43193942311114,
300 -0.03424681017675, -0.04678328784242, 0.26408300200955,
301 0.15113130533216, -0.17556493366449, -0.18823009262115,
302 0.05477720428674, 0.04704409688120 },
303 { 0.94597685600279, -1.89195371200558, 0.94597685600279 },
304 { 1.00000000000000, -1.88903307939452, 0.89487434461664 },
316 float yule_hist_a[256];
317 float yule_hist_b[256];
318 float butter_hist_a[256];
319 float butter_hist_b[256];
377 while (nb_samples--) {
378 if (samples[0] > peak)
380 else if (-samples[0] > peak)
383 if (samples[1] > peak)
385 else if (-samples[1] > peak)
391 *peak_p =
FFMAX(peak, *peak_p);
401 int count = nb_samples;
405 sum += samples[0] * samples[0] + samples[1] * samples[1];
409 return 10 * log10 (sum / nb_samples) + 90.0 - 3.0;
416 float *
samples,
int nb_samples)
431 for (j = -4; j < 0; ++j)
432 if (
fabs(hist_a[i + j]) > 1e-10 ||
fabs(hist_b[i + j]) > 1e-10)
440 while (nb_samples--) {
441 left = (hist_b[
i ] = samples[0]) * coeff_b[0];
442 right = (hist_b[i + 1] = samples[1]) * coeff_b[0];
443 left += hist_b[i - 2] * coeff_b[1] - hist_a[i - 2] * coeff_a[1];
444 right += hist_b[i - 1] * coeff_b[1] - hist_a[i - 1] * coeff_a[1];
445 left += hist_b[i - 4] * coeff_b[2] - hist_a[i - 4] * coeff_a[2];
446 right += hist_b[i - 3] * coeff_b[2] - hist_a[i - 3] * coeff_a[2];
447 samples[0] = hist_a[
i ] = (float) left;
448 samples[1] = hist_a[i + 1] = (float) right;
451 if ((i += 2) == 256) {
452 memcpy(hist_a, hist_a + 252,
sizeof(*hist_a) * 4);
453 memcpy(hist_b, hist_b + 252,
sizeof(*hist_b) * 4);
465 float *dst,
int nb_samples)
480 for (j = -20; j < 0; ++j)
481 if (
fabs(hist_a[i + j]) > 1e-10 ||
fabs(hist_b[i + j]) > 1e-10)
489 while (nb_samples--) {
490 left = (hist_b[
i] = src[0]) * coeff_b[0];
491 right = (hist_b[i + 1] = src[1]) * coeff_b[0];
492 left += hist_b[i - 2] * coeff_b[ 1] - hist_a[i - 2] * coeff_a[1 ];
493 right += hist_b[i - 1] * coeff_b[ 1] - hist_a[i - 1] * coeff_a[1 ];
494 left += hist_b[i - 4] * coeff_b[ 2] - hist_a[i - 4] * coeff_a[2 ];
495 right += hist_b[i - 3] * coeff_b[ 2] - hist_a[i - 3] * coeff_a[2 ];
496 left += hist_b[i - 6] * coeff_b[ 3] - hist_a[i - 6] * coeff_a[3 ];
497 right += hist_b[i - 5] * coeff_b[ 3] - hist_a[i - 5] * coeff_a[3 ];
498 left += hist_b[i - 8] * coeff_b[ 4] - hist_a[i - 8] * coeff_a[4 ];
499 right += hist_b[i - 7] * coeff_b[ 4] - hist_a[i - 7] * coeff_a[4 ];
500 left += hist_b[i - 10] * coeff_b[ 5] - hist_a[i - 10] * coeff_a[5 ];
501 right += hist_b[i - 9] * coeff_b[ 5] - hist_a[i - 9] * coeff_a[5 ];
502 left += hist_b[i - 12] * coeff_b[ 6] - hist_a[i - 12] * coeff_a[6 ];
503 right += hist_b[i - 11] * coeff_b[ 6] - hist_a[i - 11] * coeff_a[6 ];
504 left += hist_b[i - 14] * coeff_b[ 7] - hist_a[i - 14] * coeff_a[7 ];
505 right += hist_b[i - 13] * coeff_b[ 7] - hist_a[i - 13] * coeff_a[7 ];
506 left += hist_b[i - 16] * coeff_b[ 8] - hist_a[i - 16] * coeff_a[8 ];
507 right += hist_b[i - 15] * coeff_b[ 8] - hist_a[i - 15] * coeff_a[8 ];
508 left += hist_b[i - 18] * coeff_b[ 9] - hist_a[i - 18] * coeff_a[9 ];
509 right += hist_b[i - 17] * coeff_b[ 9] - hist_a[i - 17] * coeff_a[9 ];
510 left += hist_b[i - 20] * coeff_b[10] - hist_a[i - 20] * coeff_a[10];
511 right += hist_b[i - 19] * coeff_b[10] - hist_a[i - 19] * coeff_a[10];
512 dst[0] = hist_a[
i ] = (float)left;
513 dst[1] = hist_a[i + 1] = (float)right;
517 if ((i += 2) == 256) {
518 memcpy(hist_a, hist_a + 236,
sizeof(*hist_a) * 20);
519 memcpy(hist_b, hist_b + 236,
sizeof(*hist_b) * 20);
533 uint32_t loud_count = 0, total_windows = 0;
538 total_windows += histogram [i];
541 if ((loud_count += histogram [i]) * 20 >= total_windows)
544 gain = (float)(64.54 - i / 100.0);
566 (
float *)out->
data[0],
608 .
name =
"replaygain",
613 .
inputs = replaygain_inputs,
This structure describes decoded (raw) audio or video data.
static void butter_filter_stereo_samples(ReplayGainContext *s, float *samples, int nb_samples)
Main libavfilter public API header.
int max_samples
Maximum number of samples to filter at once.
uint32_t histogram[HISTOGRAM_SLOTS]
#define FF_ARRAY_ELEMS(a)
#define AV_CH_LAYOUT_STEREO
static __device__ float floor(float a)
const char * name
Pad name.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
double BYule[YULE_ORDER+1]
A filter pad used for either input or output.
A link between two filters.
static float calc_replaygain(uint32_t *histogram)
int min_samples
Minimum number of samples to filter at once.
int sample_rate
samples per second
AVFrame * ff_get_audio_buffer(AVFilterLink *link, int nb_samples)
Request an audio samples buffer with a specific set of permissions.
static __device__ float fabs(float a)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
void * priv
private data for use by the filter
simple assert() macros that are a bit more flexible than ISO C assert().
const double * butter_coeff_b
const double * butter_coeff_a
audio channel layout utility functions
int partial_buf_size
Size of the partial buffer to allocate.
const double * yule_coeff_b
static const AVFilterPad outputs[]
A list of supported channel layouts.
const double * yule_coeff_a
static const AVFilterPad replaygain_inputs[]
#define AV_LOG_INFO
Standard information.
AVFilter ff_af_replaygain
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2]...the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so...,+,-,+,-,+,+,-,+,-,+,...hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32-hcoeff[1]-hcoeff[2]-...a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2}an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||.........intra?||||:Block01:yes no||||:Block02:.................||||:Block03::y DC::ref index:||||:Block04::cb DC::motion x:||||.........:cr DC::motion y:||||.................|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------------------------------|||Y subbands||Cb subbands||Cr subbands||||------||------||------|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||------||------||------||||------||------||------|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||------||------||------||||------||------||------|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||------||------||------||||------||------||------|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------------------------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction------------|\Dequantization-------------------\||Reference frames|\IDWT|--------------|Motion\|||Frame 0||Frame 1||Compensation.OBMC v-------|--------------|--------------.\------> Frame n output Frame Frame<----------------------------------/|...|-------------------Range Coder:============Binary Range Coder:-------------------The implemented range coder is an adapted version based upon"Range encoding: an algorithm for removing redundancy from a digitised message."by G.N.N.Martin.The symbols encoded by the Snow range coder are bits(0|1).The associated probabilities are not fix but change depending on the symbol mix seen so far.bit seen|new state---------+-----------------------------------------------0|256-state_transition_table[256-old_state];1|state_transition_table[old_state];state_transition_table={0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:-------------------------FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1.the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
static void calc_stereo_peak(const float *samples, int nb_samples, float *peak_p)
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several inputs
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
double AYule[YULE_ORDER+1]
static int config_input(AVFilterLink *inlink)
static av_cold void uninit(AVFilterContext *ctx)
const char * name
Filter name.
AVFilterLink ** outputs
array of pointers to output links
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
double BButter[BUTTER_ORDER+1]
static void yule_filter_stereo_samples(ReplayGainContext *s, const float *src, float *dst, int nb_samples)
AVFilterContext * dst
dest filter
Filter the word “frame” indicates either a video frame or a group of audio samples
static const AVFilterPad replaygain_outputs[]
double AButter[BUTTER_ORDER+1]
static const ReplayGainFreqInfo freqinfos[]
static double calc_stereo_rms(const float *samples, int nb_samples)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
static int query_formats(AVFilterContext *ctx)
int nb_samples
number of audio samples (per channel) described by this frame
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel layout