女人阳虚吃什么药效果最好| 罗马棉是什么面料| 婵字五行属什么| 去香港需要准备什么| 肛门瘙痒涂什么药膏| 本来无一物何处惹尘埃什么意思| 阴阳脸是什么意思| 过敏性荨麻疹吃什么药| 十指不沾阳春水是什么意思| 结婚50年是什么婚| 省公安厅副厅长是什么级别| haglofs是什么牌子| 厘清是什么意思| 胃部检查除了胃镜还有什么方法| 投诉医生打什么电话| 养字五行属什么| 脸色暗沉发黑是什么原因| 突然肚子疼是什么原因| 胸椎退变是什么意思| 出差什么意思| 2.22是什么星座| 肺五行属什么| 经常玩手机有什么危害| 屏风是什么| 长期喝豆浆有什么好处和坏处| 紫色加绿色是什么颜色| 吸入物变应原筛查是什么| 女性肾虚吃什么药| 50公斤发什么物流便宜| 想长胖喝什么奶粉好| 什么是外阴白斑| 什么减肥最好最快| fgr医学上是什么意思| 为什么心脏会突然刺痛| 男人阳萎吃什么药最好| 元宵节送什么| 唾液分泌过多是什么原因| 过敏忌口不能吃什么| 脾的作用是什么| 教学相长是什么意思| 心里烦躁是什么原因| 仪仗队是什么意思| 切糕为什么这么贵| 自我意识是什么意思| 头疼什么原因| 10月30日是什么星座| 梦见丧尸是什么预兆| 13朵玫瑰代表什么意思| 巨蟹座有什么特点| 缺钾吃什么食物补得最快| 坐小月子可以吃什么水果| 固体玉米糖浆是什么| 为什么老是掉头发| 种植牙是什么| 心脏积液吃什么药最好| minute什么意思| 黑科技是什么| 贵州有什么美食| 祎字五行属什么| peter是什么意思| 双向情感障碍吃什么药| 令人发指是什么意思| 炸腮有什么症状| 旁风草长什么样| 梦见猫咪会有什么预兆| 银杏叶子像什么| 盆腔积液有什么症状有哪些| 什么的金边| 吃亚麻籽有什么好处| 吃什么可以缓解痛经| 湖蓝色是什么颜色| smile是什么牌子| 多囊什么意思| 什么都不做| 冷血动物是什么意思| 胃胀是什么感觉| 学痞是什么意思| 墙内开花墙外香是什么意思| 藏毛窦是什么病| champion什么意思| 过敏性鼻炎吃什么水果好| 牛鬼蛇神指什么生肖| 情人节送什么花| 皮肤黑的人穿什么颜色的衣服好看| 蚂蝗长什么样| 在水一方什么意思| 遇人不淑是什么意思| 天蝎男喜欢什么样的女生| 高定是什么意思| 儿童支气管炎吃什么药| 六六大顺是什么生肖| 白起为什么被赐死| ldlc是什么意思| 体检去医院挂什么科| 走南闯北是什么生肖| 芥末是什么植物| 狗怀孕有什么症状| 什么时候开始暑伏| 三七粉不适合什么人吃| 肝火旺盛吃什么药效果最好| 关羽字什么| 吃护肝片有什么副作用| 过敏性荨麻疹吃什么药| 救人一命胜造七级浮屠是什么意思| 黑茶色是什么颜色| 喷昔洛韦乳膏治什么| 臆想什么意思| 血小板低吃什么补得快| 夏枯草长什么样| 肝内胆管结石有什么症状表现| 低压高是什么意思| 印度尼西亚是什么人种| superman什么意思| 空调扇的冰晶是什么| 流星雨是什么意思| 不可亵玩焉的亵是什么意思| 平起平坐是什么动物| 云吞面是什么面| 颈椎反曲是什么意思| 雪茄为什么不过肺| 秋天有什么水果| 青鱼用什么饵料好钓| 日代表什么生肖| 明目退翳是什么意思| 大修基金什么时候缴纳| 又吐又拉是什么原因| 好马不吃回头草什么意思| 手背有痣代表什么意思| 吃什么药不能献血| 嚼槟榔为什么上瘾| 颠是什么意思| 文心什么字| 茄子和什么相克| 甘草配什么泡水喝最好| 11月1号是什么星座| p波增宽是什么意思| 查询电话号码拨打什么| 什么的藤| 咳嗽买什么药| 小孩睡觉流口水是什么原因| 老玻璃是什么意思| 小儿积食吃什么药最好| 急性湿疹用什么药膏| hold住是什么意思| 益生菌和益生元有什么区别| 劲旅是什么意思| 云南在古代叫什么| 法令纹上的痣代表什么| 最高人民法院院长什么级别| 中筋面粉适合做什么| dha中文叫什么| 什么七什么八| 60是什么意思| 呼吸内科主要看什么病| 糖抗原125高什么意思| 棒子面是什么| 雪燕有什么功效| 2012年属什么生肖| 站桩对身体有什么好处和功效| 脱臼是什么感觉| 醉酒第二天吃什么才能缓解难受| 八髎区疼是什么原因| 改进什么| 大理寺是什么机构| 怹是什么意思| 润是什么生肖| 无故流鼻血是什么原因| 六月初九是什么日子| 广字五行属什么| 急救物品五定是什么| 玉兰花什么季节开| 夺命大乌苏是什么意思| 六月初六是什么日子| 代发是什么意思| 喝黄芪水有什么好处| 幼儿贫血吃什么补血最快| 猪肝有什么功效与作用| 74年属虎是什么命| 嘴唇下面长痘痘是什么原因| 终极是什么| 招商是什么工作| 什么颜色加什么颜色等于什么颜色| 为什么说尽量不戴脚链| 均为是什么意思| 数词是什么意思| 积食内热吃什么药| 卷腹是什么| 中国国菜是什么菜| 幽门螺杆菌是什么病| 什么醒酒最快| 刻薄什么意思| 翡翠是什么意思| 启字五行属什么| 藕断丝连是什么意思| 后脑勺长白头发是什么原因| 杏仁是什么| 农历3月3是什么节日| 肝火旺吃什么中成药| 晚霞是什么意思| 绿豆和什么一起煮好| 驱动精灵是干什么用的| 乘晕宁又叫什么| 头疼吃什么好| 牛建读什么| nm是什么意思| 厨房墙砖什么颜色好看| 千里马比喻什么样的人| 西洋参有什么作用和功效| 六月二十六是什么星座| 今年43岁属什么生肖| 腱鞘炎是什么病| 抄送和密送是什么意思| 高血糖不能吃什么| 胡萝卜不能和什么食物一起吃| 一什么声音| 尿为什么是黄色的| 胃病喝什么茶养胃| 割包为什么很多人后悔| 海带和什么菜搭配好吃| 男生做爱什么感觉| 小便无力是什么原因| 吃冬瓜有什么好处| k1什么意思| 淼字五行属什么| 9号来的月经什么时候是排卵期| 蒙奇奇是什么动物| 一根葱十分钟什么意思| 嘴下面起痘是什么原因| 晚上失眠是什么原因| 隆字五行属什么| mixblu是什么牌子| 念五行属什么| 伤口愈合为什么会痒| gdp是什么| 坐骨神经痛挂什么科| 同房什么感觉| 腋下大量出汗是什么原因| 部队政委是什么级别| 蜻蜓吃什么| 发改委主任什么级别| 12月出生的是什么星座| 大便干燥拉不出来是什么原因| 狗拉稀吃什么药| 卤蛋吃多了有什么危害| 西米是什么东西做的| 做ct需要注意什么| 鸭肚是鸭的什么部位| 为什么广州叫羊城| 伤寒是什么意思| 贝兄念什么| 胸腔里面像岔气了的疼是什么原因| 什么的松树| 画画可以画什么| 血沉50说明什么原因| 什么时候不容易怀孕| 梦见自己给自己剪头发是什么意思| 鼻梁痛什么原因引起的| 7月16是什么星座| 唐僧被封为什么佛| 口腔溃疡吃什么水果| 水晶为什么要消磁| 检查肝脏挂什么科| 香槟是什么酒| 月经量少要吃什么调理| 百度

宅霸联机平台(宅霸游戏联机平台下载) V3.6.6官方版


Directory: ../../../ffmpeg/
File: src/libavfilter/af_anlmdn.c
Date: 2025-08-04 00:43:16
Exec Total Coverage
Lines: 0 160 0.0%
Functions: 0 11 0.0%
Branches: 0 68 0.0%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2019 Paul B Mahol
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg 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 * FFmpeg 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 FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include <float.h>
22
23 #include "libavutil/avassert.h"
24 #include "libavutil/opt.h"
25 #include "avfilter.h"
26 #include "audio.h"
27 #include "filters.h"
28
29 #include "af_anlmdndsp.h"
30
31 #define WEIGHT_LUT_NBITS 20
32 #define WEIGHT_LUT_SIZE (1<<WEIGHT_LUT_NBITS)
33
34 typedef struct AudioNLMeansContext {
35 const AVClass *class;
36
37 float a;
38 int64_t pd;
39 int64_t rd;
40 float m;
41 int om;
42
43 float pdiff_lut_scale;
44 float weight_lut[WEIGHT_LUT_SIZE];
45
46 int K;
47 int S;
48 int N;
49 int H;
50
51 AVFrame *in;
52 AVFrame *cache;
53 AVFrame *window;
54
55 AudioNLMDNDSPContext dsp;
56 } AudioNLMeansContext;
57
58 enum OutModes {
59 IN_MODE,
60 OUT_MODE,
61 NOISE_MODE,
62 NB_MODES
63 };
64
65 #define OFFSET(x) offsetof(AudioNLMeansContext, x)
66 #define AFT AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
67
68 static const AVOption anlmdn_options[] = {
69 { "strength", "set denoising strength", OFFSET(a), AV_OPT_TYPE_FLOAT, {.dbl=0.00001},0.00001, 10000, AFT },
70 { "s", "set denoising strength", OFFSET(a), AV_OPT_TYPE_FLOAT, {.dbl=0.00001},0.00001, 10000, AFT },
71 { "patch", "set patch duration", OFFSET(pd), AV_OPT_TYPE_DURATION, {.i64=2000}, 1000, 100000, AFT },
72 { "p", "set patch duration", OFFSET(pd), AV_OPT_TYPE_DURATION, {.i64=2000}, 1000, 100000, AFT },
73 { "research", "set research duration", OFFSET(rd), AV_OPT_TYPE_DURATION, {.i64=6000}, 2000, 300000, AFT },
74 { "r", "set research duration", OFFSET(rd), AV_OPT_TYPE_DURATION, {.i64=6000}, 2000, 300000, AFT },
75 { "output", "set output mode", OFFSET(om), AV_OPT_TYPE_INT, {.i64=OUT_MODE}, 0, NB_MODES-1, AFT, .unit = "mode" },
76 { "o", "set output mode", OFFSET(om), AV_OPT_TYPE_INT, {.i64=OUT_MODE}, 0, NB_MODES-1, AFT, .unit = "mode" },
77 { "i", "input", 0, AV_OPT_TYPE_CONST, {.i64=IN_MODE}, 0, 0, AFT, .unit = "mode" },
78 { "o", "output", 0, AV_OPT_TYPE_CONST, {.i64=OUT_MODE}, 0, 0, AFT, .unit = "mode" },
79 { "n", "noise", 0, AV_OPT_TYPE_CONST, {.i64=NOISE_MODE},0, 0, AFT, .unit = "mode" },
80 { "smooth", "set smooth factor", OFFSET(m), AV_OPT_TYPE_FLOAT, {.dbl=11.}, 1, 1000, AFT },
81 { "m", "set smooth factor", OFFSET(m), AV_OPT_TYPE_FLOAT, {.dbl=11.}, 1, 1000, AFT },
82 { NULL }
83 };
84
85 AVFILTER_DEFINE_CLASS(anlmdn);
86
87 static inline float sqrdiff(float x, float y)
88 {
89 const float diff = x - y;
90
91 return diff * diff;
92 }
93
94 static float compute_distance_ssd_c(const float *f1, const float *f2, ptrdiff_t K)
95 {
96 float distance = 0.;
97
98 for (int k = -K; k <= K; k++)
99 distance += sqrdiff(f1[k], f2[k]);
100
101 return distance;
102 }
103
104 static void compute_cache_c(float *cache, const float *f,
105 ptrdiff_t S, ptrdiff_t K,
106 ptrdiff_t i, ptrdiff_t jj)
107 {
108 int v = 0;
109
110 for (int j = jj; j < jj + S; j++, v++)
111 cache[v] += -sqrdiff(f[i - K - 1], f[j - K - 1]) + sqrdiff(f[i + K], f[j + K]);
112 }
113
114 void ff_anlmdn_init(AudioNLMDNDSPContext *dsp)
115 {
116 dsp->compute_distance_ssd = compute_distance_ssd_c;
117 dsp->compute_cache = compute_cache_c;
118
119 #if ARCH_X86
120 ff_anlmdn_init_x86(dsp);
121 #endif
122 }
123
124 static int config_filter(AVFilterContext *ctx)
125 {
126 AudioNLMeansContext *s = ctx->priv;
127 AVFilterLink *outlink = ctx->outputs[0];
128 int newK, newS, newH, newN;
129
130 newK = av_rescale(s->pd, outlink->sample_rate, AV_TIME_BASE);
131 newS = av_rescale(s->rd, outlink->sample_rate, AV_TIME_BASE);
132
133 newH = newK * 2 + 1;
134 newN = newH + (newK + newS) * 2;
135
136 av_log(ctx, AV_LOG_DEBUG, "K:%d S:%d H:%d N:%d\n", newK, newS, newH, newN);
137
138 if (!s->cache || s->cache->nb_samples < newS * 2) {
139 AVFrame *new_cache = ff_get_audio_buffer(outlink, newS * 2);
140 if (new_cache) {
141 if (s->cache)
142 av_samples_copy(new_cache->extended_data, s->cache->extended_data, 0, 0,
143 s->cache->nb_samples, new_cache->ch_layout.nb_channels, new_cache->format);
144 av_frame_free(&s->cache);
145 s->cache = new_cache;
146 } else {
147 return AVERROR(ENOMEM);
148 }
149 }
150 if (!s->cache)
151 return AVERROR(ENOMEM);
152
153 if (!s->window || s->window->nb_samples < newN) {
154 AVFrame *new_window = ff_get_audio_buffer(outlink, newN);
155 if (new_window) {
156 if (s->window)
157 av_samples_copy(new_window->extended_data, s->window->extended_data, 0, 0,
158 s->window->nb_samples, new_window->ch_layout.nb_channels, new_window->format);
159 av_frame_free(&s->window);
160 s->window = new_window;
161 } else {
162 return AVERROR(ENOMEM);
163 }
164 }
165 if (!s->window)
166 return AVERROR(ENOMEM);
167
168 s->pdiff_lut_scale = 1.f / s->m * WEIGHT_LUT_SIZE;
169 for (int i = 0; i < WEIGHT_LUT_SIZE; i++) {
170 float w = -i / s->pdiff_lut_scale;
171
172 s->weight_lut[i] = expf(w);
173 }
174
175 s->K = newK;
176 s->S = newS;
177 s->H = newH;
178 s->N = newN;
179
180 return 0;
181 }
182
183 static int config_output(AVFilterLink *outlink)
184 {
185 AVFilterContext *ctx = outlink->src;
186 AudioNLMeansContext *s = ctx->priv;
187 int ret;
188
189 ret = config_filter(ctx);
190 if (ret < 0)
191 return ret;
192
193 ff_anlmdn_init(&s->dsp);
194
195 return 0;
196 }
197
198 static int filter_channel(AVFilterContext *ctx, void *arg, int ch, int nb_jobs)
199 {
200 AudioNLMeansContext *s = ctx->priv;
201 AVFrame *out = arg;
202 const int S = s->S;
203 const int K = s->K;
204 const int N = s->N;
205 const int H = s->H;
206 const int om = s->om;
207 const float *f = (const float *)(s->window->extended_data[ch]) + K;
208 float *cache = (float *)s->cache->extended_data[ch];
209 const float sw = (65536.f / (4 * K + 2)) / sqrtf(s->a);
210 float *dst = (float *)out->extended_data[ch];
211 const float *const weight_lut = s->weight_lut;
212 const float pdiff_lut_scale = s->pdiff_lut_scale;
213 const float smooth = fminf(s->m, WEIGHT_LUT_SIZE / pdiff_lut_scale);
214 const int offset = N - H;
215 float *src = (float *)s->window->extended_data[ch];
216 const AVFrame *const in = s->in;
217
218 memmove(src, &src[H], offset * sizeof(float));
219 memcpy(&src[offset], in->extended_data[ch], in->nb_samples * sizeof(float));
220 memset(&src[offset + in->nb_samples], 0, (H - in->nb_samples) * sizeof(float));
221
222 for (int i = S; i < H + S; i++) {
223 float P = 0.f, Q = 0.f;
224 int v = 0;
225
226 if (i == S) {
227 for (int j = i - S; j <= i + S; j++) {
228 if (i == j)
229 continue;
230 cache[v++] = s->dsp.compute_distance_ssd(f + i, f + j, K);
231 }
232 } else {
233 s->dsp.compute_cache(cache, f, S, K, i, i - S);
234 s->dsp.compute_cache(cache + S, f, S, K, i, i + 1);
235 }
236
237 for (int j = 0; j < 2 * S && !ctx->is_disabled; j++) {
238 float distance = cache[j];
239 unsigned weight_lut_idx;
240 float w;
241
242 if (distance < 0.f)
243 cache[j] = distance = 0.f;
244 w = distance * sw;
245 if (w >= smooth)
246 continue;
247 weight_lut_idx = w * pdiff_lut_scale;
248 av_assert2(weight_lut_idx < WEIGHT_LUT_SIZE);
249 w = weight_lut[weight_lut_idx];
250 P += w * f[i - S + j + (j >= S)];
251 Q += w;
252 }
253
254 P += f[i];
255 Q += 1.f;
256
257 switch (om) {
258 case IN_MODE: dst[i - S] = f[i]; break;
259 case OUT_MODE: dst[i - S] = P / Q; break;
260 case NOISE_MODE: dst[i - S] = f[i] - (P / Q); break;
261 }
262 }
263
264 return 0;
265 }
266
267 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
268 {
269 AVFilterContext *ctx = inlink->dst;
270 AVFilterLink *outlink = ctx->outputs[0];
271 AudioNLMeansContext *s = ctx->priv;
272 AVFrame *out;
273
274 if (av_frame_is_writable(in)) {
275 out = in;
276 } else {
277 out = ff_get_audio_buffer(outlink, in->nb_samples);
278 if (!out) {
279 av_frame_free(&in);
280 return AVERROR(ENOMEM);
281 }
282
283 out->pts = in->pts;
284 }
285
286 s->in = in;
287 ff_filter_execute(ctx, filter_channel, out, NULL, inlink->ch_layout.nb_channels);
288
289 if (out != in)
290 av_frame_free(&in);
291 return ff_filter_frame(outlink, out);
292 }
293
294 static int activate(AVFilterContext *ctx)
295 {
296 AVFilterLink *inlink = ctx->inputs[0];
297 AVFilterLink *outlink = ctx->outputs[0];
298 AudioNLMeansContext *s = ctx->priv;
299 AVFrame *in = NULL;
300 int ret = 0, status;
301 int64_t pts;
302
303 FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
304
305 ret = ff_inlink_consume_samples(inlink, s->H, s->H, &in);
306 if (ret < 0)
307 return ret;
308
309 if (ret > 0) {
310 return filter_frame(inlink, in);
311 } else if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
312 ff_outlink_set_status(outlink, status, pts);
313 return 0;
314 } else {
315 if (ff_inlink_queued_samples(inlink) >= s->H) {
316 ff_filter_set_ready(ctx, 10);
317 } else if (ff_outlink_frame_wanted(outlink)) {
318 ff_inlink_request_frame(inlink);
319 }
320 return 0;
321 }
322 }
323
324 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
325 char *res, int res_len, int flags)
326 {
327 int ret;
328
329 ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags);
330 if (ret < 0)
331 return ret;
332
333 return config_filter(ctx);
334 }
335
336 static av_cold void uninit(AVFilterContext *ctx)
337 {
338 AudioNLMeansContext *s = ctx->priv;
339
340 av_frame_free(&s->cache);
341 av_frame_free(&s->window);
342 }
343
344 static const AVFilterPad outputs[] = {
345 {
346 .name = "default",
347 .type = AVMEDIA_TYPE_AUDIO,
348 .config_props = config_output,
349 },
350 };
351
352 const FFFilter ff_af_anlmdn = {
353 .p.name = "anlmdn",
354 .p.description = NULL_IF_CONFIG_SMALL("Reduce broadband noise from stream using Non-Local Means."),
355 .p.priv_class = &anlmdn_class,
356 .p.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL |
357 AVFILTER_FLAG_SLICE_THREADS,
358 .priv_size = sizeof(AudioNLMeansContext),
359 .activate = activate,
360 .uninit = uninit,
361 FILTER_INPUTS(ff_audio_default_filterpad),
362 FILTER_OUTPUTS(outputs),
363 FILTER_SINGLE_SAMPLEFMT(AV_SAMPLE_FMT_FLTP),
364 .process_command = process_command,
365 };
366

来是什么生肖 骨折吃什么 侵犯是什么意思 化学性肝损伤是什么意思 手腕疼是什么原因
种植牙是什么意思 骨赘是什么意思 双肺斑索是什么意思 什么叫肺部纤维灶 嗓子痒咳嗽是什么原因
阑尾炎挂什么科室 肚脐眼有什么用 大什么什么针 8月26日什么星座 毛毛虫吃什么食物
阴阳互补什么意思 五花肉炒什么好吃 梦见种菜是什么意思 拉肚子适合吃什么 sch是什么意思
申的五行属什么hcv8jop0ns0r.cn 88年五行属什么hcv8jop3ns3r.cn 羊肉馅饺子放什么菜hcv9jop2ns9r.cn 始祖鸟是什么鸟hcv9jop5ns9r.cn 坊字五行属什么jasonfriends.com
体育精神是什么hcv8jop2ns9r.cn 花指什么生肖hcv8jop1ns8r.cn 什么血型会导致不孕sanhestory.com 手麻木是什么引起的hcv9jop6ns8r.cn 久站腿肿是什么原因引起的xjhesheng.com
浙江大学什么专业最好luyiluode.com 常规血检能查出什么hcv8jop7ns0r.cn 什么肉是碱性的hcv9jop5ns2r.cn 猪狗不如是什么生肖hcv8jop3ns1r.cn 脾脏结节一般是什么病hcv7jop9ns1r.cn
肺部增殖灶是什么意思hcv8jop6ns4r.cn 六味地黄丸起什么作用hcv8jop1ns6r.cn 孕妇喝什么补羊水最快hcv7jop5ns2r.cn 吃的多拉的少是什么原因hcv8jop2ns6r.cn 炖乌鸡汤放什么配料hcv9jop4ns3r.cn
百度