什么是原研药| 硒片什么牌子好| 产后第一次来月经是什么颜色| 脂肪酶是什么| 肾彩超能查出什么| 奶油奶酪可以做什么| 斑秃是什么原因引起的| 北斗星代表什么生肖| 皮肤癣是什么原因造成的| 肺结核咳血是什么程度| 2008年属鼠是什么命| 甲状腺功能减退是什么原因引起的| 海马有什么功效作用| 吃什么可以偷偷流产| 礼佛是什么意思| 左边脸长痘痘是什么原因| 三七粉有什么用处| 中华田园犬为什么禁养| 麻木是什么原因引起的| 枕头发黄是什么原因| 经常自言自语是什么原因| 小燕子吃什么食物| 水猴子长什么样子| 异国他乡的意思是什么| 什么才叫幸福| kumpoo是什么牌子| hg是什么单位| 蒲公英是什么样子| 高密度脂蛋白胆固醇低是什么意思| 光天化日什么意思| 梦到刷牙什么意思| u型枕有什么作用| 喉咙疼吃什么| 肠胃不好可以吃什么水果| 心慌挂什么科| 沉甸甸的爱是什么意思| 玮是什么意思| 吃百家饭是什么意思| 肛门跳动是什么原因| 浅是什么意思| 坐飞机需要带什么证件| 1103是什么星座| 冠状沟有白色分泌物是什么原因| siri什么意思| 标间是什么意思| 心脏增大吃什么药| 正法是什么意思| 咳嗽有痰吃什么药| 牙龈发炎肿痛吃什么药| 怀孕甲减对孩子有什么影响| 嗓子疼看什么科室| 夜盲症是什么| 牛栏坑肉桂属于什么茶| 吃什么补脑增强记忆力| 尿路感染吃什么中成药| 大力念什么| 穿孔是什么意思| 一个壳一个心念什么| 腰间盘突出用什么药好| 心脏供血不足吃什么| 爱的反义词是什么| 黑马什么意思| 额头老出汗是什么原因| 魂牵梦萦的意思是什么| 观音成道日是什么意思| 双眸是什么意思| 浅表性胃炎伴糜烂用什么药| 胃热口干口苦口臭吃什么药好| 口干是什么原因引起的怎么治疗| 壤土适合种植什么植物| 误区是什么意思| 336是什么意思| 减肥为什么要多喝水| 鼻甲肥大吃什么药最好| 女为什么字| 抽动症是什么原因引起的| 带状疱疹是什么原因引起| 叶酸起什么作用| 浊气是什么| 柠檬酸是什么东西| 绞丝旁奇念什么| 飞机为什么不能说一路顺风| 牙疼有什么办法| 肝脏在人体的什么位置| 眼神迷离是什么意思| 身上起火疖子什么原因| 感冒有痰吃什么药| 心脏造影是什么意思| 东厂是什么意思| 金刚石是由什么构成的| 伤官是什么| 脚气挂什么科室| 大枣和红枣有什么区别| 7.6什么星座| 一生辛苦不得财是什么生肖| 腺样体肥大挂什么科| 月半是什么意思| 几成是什么意思| 七个月宝宝能吃什么水果| 负罪感是什么意思| 霸屏是什么意思| 老人经常便秘有什么好办法| 十二月九号是什么星座| 便秘吃什么可以调理| 七月11日是什么星座| 走路出汗多是什么原因| 燕窝什么人不适合吃| 宝宝拉肚子吃什么药| 腺样体增生是什么意思| 脸为什么容易红| 炝锅是什么意思| 绿萝叶子发黄是什么原因| 小兔子吃什么食物| 天外飞仙是什么意思| 血糖高吃什么最好| save是什么意思| 格调是什么意思| 便秘吃什么有用| 手脚心出汗是什么原因| 苡字取名寓意是什么| 琉璃和玻璃有什么区别| 诺如病毒吃什么药好得快一点| 负罪感什么意思| 结婚长明灯有什么讲究| 穿小鞋什么意思| 玫瑰花的花语是什么| 长颈鹿的脖子像什么| 头发多剪什么发型好看| 吃什么东西对肺好| 尺码m是什么意思| 脑白质变性是什么意思| 仙人掌有什么作用| ks是什么意思| 湫是什么意思| 阴茎是什么意思| 绿豆什么时候成熟| 阴道吹气是什么原因| 正山小种属于什么茶| 抑郁状态和抑郁症有什么区别| 纵隔淋巴结转移是什么意思| 5到7点是什么时辰| 鼠肚鸡肠是什么生肖| 什么球不能踢脑筋急转弯| 猪狗不如是什么生肖| 大便多是什么原因| 90年属什么| 1.30是什么星座| 拆台是什么意思| 和尚化缘的碗叫什么| 今年为什么这么热| 郑州机场叫什么名字| 湿气重什么原因| 甲状腺肿是什么意思| 为什么天天晚上做梦| 脾虚湿热吃什么药| 子衿什么意思| 身份证最后四位数代表什么| 梅毒滴度是什么意思| 3月16是什么星座| abo是什么意思| 干戈是什么意思| 情人节送什么给女孩子| 小沈阳属什么生肖| 阴唇萎缩是什么原因| 血沉是检查什么的| 阿莫西林不能和什么一起吃| 狗下崽前有什么征兆| 送命题是什么意思| 马刺是什么| 气短吃什么药立马见效| 不孕不育做什么检查| 长期咳白痰是什么原因| 51是什么意思| 出马什么意思| 什么的走路| 榆字五行属什么| 梦见插秧是什么意思| 想留不能留才最寂寞是什么歌| 电磁炉用什么锅最好| 把你的心我的心串一串是什么歌| 时乖命蹇是什么意思| 硅油是什么| 加拿大用什么货币| 起伏跌宕什么意思| 梦见玫瑰花是什么预兆| 阳光照耀是什么意思| 毫无违和感什么意思| 1967年出生属什么| 含量是什么意思| 950是什么金| 777是什么意思| 眉心长痘是什么原因| 孕妇低血压什么补最快| 乙肝五项25阳性是什么意思| 心脑血管疾病吃什么药| 吃什么补免疫力最快| 史无前例是什么意思| 今天天气适合穿什么衣服| 儿童登机需要什么证件| 小孩几天不大便是什么原因怎么办| 干眼症是什么原因引起的| 龟头炎用什么软膏| cool什么意思中文| 高汤是什么意思| 弓箭是什么时候发明的| 三八线是什么意思| 大姨妈不来是什么原因造成的| 头疗是什么| 舌头无苔是什么原因| 沉香是什么| 罗衣是什么意思| 当我们谈论爱情时我们在谈论什么| 87年五行属什么| 贱货是什么意思| 2月12日什么星座| 保险费率是什么| 动容什么意思| 米面是什么| 白毫银针是什么茶| 身上瘙痒是什么原因| 湿气太重了吃什么药| 空调开什么模式最凉快| 专项变应原筛查是什么| 四月十八日是什么日子| 酸枣仁配什么治疗失眠| 贫血四项是指什么检查| 三月八号什么星座| 什么是假性近视眼| 加湿器用什么水| 八婆什么意思| cnb是什么意思| affairs是什么意思| 西红柿可以做什么菜| 杆鱼是什么鱼| 看乳房挂什么科| 崖柏手串有什么功效| 关节痛去医院挂什么科| 眼睛吹风就流泪是什么原因| 早起胃疼是什么原因导致的| 手腕比喻什么| 阿昔洛韦乳膏治什么病| 口腔异味是什么原因引起的| 口腔溃疡喝什么饮料| 吃善存片有什么好处| 凡士林是什么| 眉头长痘痘是因为什么原因引起的| 56年属什么| 基围虾为什么叫基围虾| 什么是穿刺手术| 海鲜都有什么| 4月13日是什么星座| sid是什么意思| 天涯是什么意思| 伪骨科是什么| 靓字五行属什么| 肺结核有什么症状| 梦见好多狗是什么预兆| 理疗师是做什么的| 吃什么水果补血| 补气血喝什么口服液好| 这叫什么| 36d什么意思| 清洁度三度什么意思| 什么食物好消化| 百度

地下城与勇士(dnf) V17.0.28.0 最新版本完整客户端


Directory: ../../../ffmpeg/
File: src/libavfilter/vf_dblur.c
Date: 2025-08-04 00:43:16
Exec Total Coverage
Lines: 0 138 0.0%
Functions: 0 6 0.0%
Branches: 0 64 0.0%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2020 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 "libavutil/imgutils.h"
22 #include "libavutil/mem.h"
23 #include "libavutil/opt.h"
24 #include "libavutil/pixdesc.h"
25 #include "avfilter.h"
26 #include "filters.h"
27 #include "video.h"
28
29 typedef struct DBlurContext {
30 const AVClass *class;
31
32 float angle;
33 float radius;
34 int planes;
35
36 float b0, b1, q, c, R3;
37
38 int depth;
39 int planewidth[4];
40 int planeheight[4];
41 float *buffer;
42 int nb_planes;
43 } DBlurContext;
44
45 #define OFFSET(x) offsetof(DBlurContext, x)
46 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
47
48 static const AVOption dblur_options[] = {
49 { "angle", "set angle", OFFSET(angle), AV_OPT_TYPE_FLOAT, {.dbl=45}, 0.0, 360, FLAGS },
50 { "radius", "set radius", OFFSET(radius), AV_OPT_TYPE_FLOAT, {.dbl=5}, 0, 8192, FLAGS },
51 { "planes", "set planes to filter", OFFSET(planes), AV_OPT_TYPE_INT, {.i64=0xF}, 0, 0xF, FLAGS },
52 { NULL }
53 };
54
55 AVFILTER_DEFINE_CLASS(dblur);
56
57 #define f(n, m) (dst[(n) * width + (m)])
58
59 static int filter_horizontally(AVFilterContext *ctx, int width, int height)
60 {
61 DBlurContext *s = ctx->priv;
62 const float b0 = s->b0;
63 const float b1 = s->b1;
64 const float q = s->q;
65 const float c = s->c;
66 float *dst = s->buffer;
67 float g;
68
69 if (s->R3 > 0) {
70 for (int y = 1; y < height; y++) {
71 g = q * f(y, 0) + c * f(y, 0);
72 for (int x = 0; x < width; x++) {
73 f(y, x) = b0 * f(y, x) + b1 * f(y - 1, x) + g;
74 g = q * f(y, x) + c * f(y - 1, x);
75 }
76 }
77
78 for (int y = height - 2; y >= 0; y--) {
79 g = q * f(y, width - 1) + c * f(y, width - 1);
80 for (int x = width - 1; x >= 0; x--) {
81 f(y, x) = b0 * f(y, x) + b1 * f(y + 1, x) + g;
82 g = q * f(y, x) + c * f(y + 1, x);
83 }
84 }
85 } else {
86 for (int y = 1; y < height; y++) {
87 g = q * f(y, width - 1) + c * f(y, width - 1);
88 for (int x = width - 1; x >= 0; x--) {
89 f(y, x) = b0 * f(y, x) + b1 * f(y - 1, x) + g;
90 g = q * f(y, x) + c * f(y - 1, x);
91 }
92 }
93
94 for (int y = height - 2; y >= 0; y--) {
95 g = q * f(y, 0) + c * f(y, 0);
96 for (int x = 0; x < width; x++) {
97 f(y, x) = b0 * f(y, x) + b1 * f(y + 1, x) + g;
98 g = q * f(y, x) + c * f(y + 1, x);
99 }
100 }
101 }
102
103 return 0;
104 }
105
106 static void diriir2d(AVFilterContext *ctx, int plane)
107 {
108 DBlurContext *s = ctx->priv;
109 const int width = s->planewidth[plane];
110 const int height = s->planeheight[plane];
111
112 filter_horizontally(ctx, width, height);
113 }
114
115 static const enum AVPixelFormat pix_fmts[] = {
116 AV_PIX_FMT_YUVA444P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUV440P,
117 AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUVJ440P,
118 AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUV420P,
119 AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ420P,
120 AV_PIX_FMT_YUVJ411P, AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV410P,
121 AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
122 AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
123 AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV440P12,
124 AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
125 AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
126 AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA444P9,
127 AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA444P10,
128 AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA444P12,
129 AV_PIX_FMT_YUVA420P16, AV_PIX_FMT_YUVA422P16, AV_PIX_FMT_YUVA444P16,
130 AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10,
131 AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
132 AV_PIX_FMT_GBRAP, AV_PIX_FMT_GBRAP10, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRAP16,
133 AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY12, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
134 AV_PIX_FMT_GRAYF32, AV_PIX_FMT_GBRPF32, AV_PIX_FMT_GBRAPF32,
135 AV_PIX_FMT_NONE
136 };
137
138 static av_cold void uninit(AVFilterContext *ctx)
139 {
140 DBlurContext *s = ctx->priv;
141
142 av_freep(&s->buffer);
143 }
144
145 static int config_input(AVFilterLink *inlink)
146 {
147 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
148 DBlurContext *s = inlink->dst->priv;
149
150 uninit(inlink->dst);
151
152 s->depth = desc->comp[0].depth;
153 s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
154 s->planewidth[0] = s->planewidth[3] = inlink->w;
155 s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
156 s->planeheight[0] = s->planeheight[3] = inlink->h;
157
158 s->nb_planes = av_pix_fmt_count_planes(inlink->format);
159
160 s->buffer = av_malloc_array(FFALIGN(inlink->w, 16), FFALIGN(inlink->h, 16) * sizeof(*s->buffer));
161 if (!s->buffer)
162 return AVERROR(ENOMEM);
163
164 return 0;
165 }
166
167 static void set_params(DBlurContext *s, float angle, float r)
168 {
169 float mu, nu, R1, R2, w1, w2;
170 float a0, a1, a2, a3;
171
172 angle = angle * M_PI / 180.f;
173
174 mu = cosf(angle);
175 nu = sinf(angle);
176 R1 = (mu * r) * (mu * r);
177 R2 = (nu * r) * (nu * r);
178 s->R3 = mu * nu * r * r;
179 w1 = sqrtf(0.25f + R1);
180 w2 = sqrtf(0.25f + R2);
181 a0 = (w1 + 0.5f) * (w2 + 0.5f) - fabsf(s->R3);
182 a1 = 0.5f + w2 - a0;
183 a2 = 0.5f + w1 - a0;
184 a3 = a0 - w1 - w2;
185 s->b0 = 1.f / a0;
186 s->b1 = -a2 / a0;
187 s->q = -a1 / a0;
188 s->c = -a3 / a0;
189 }
190
191 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
192 {
193 AVFilterContext *ctx = inlink->dst;
194 DBlurContext *s = ctx->priv;
195 AVFilterLink *outlink = ctx->outputs[0];
196 AVFrame *out;
197 int plane;
198
199 set_params(s, s->angle, s->radius);
200
201 if (av_frame_is_writable(in)) {
202 out = in;
203 } else {
204 out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
205 if (!out) {
206 av_frame_free(&in);
207 return AVERROR(ENOMEM);
208 }
209 av_frame_copy_props(out, in);
210 }
211
212 for (plane = 0; plane < s->nb_planes; plane++) {
213 const int height = s->planeheight[plane];
214 const int width = s->planewidth[plane];
215 float *bptr = s->buffer;
216 const uint8_t *src = in->data[plane];
217 const uint16_t *src16 = (const uint16_t *)in->data[plane];
218 const float *src32 = (const float *)in->data[plane];
219 uint8_t *dst = out->data[plane];
220 uint16_t *dst16 = (uint16_t *)out->data[plane];
221 float *dst32 = (float *)out->data[plane];
222 int y, x;
223
224 if (!(s->planes & (1 << plane))) {
225 if (out != in)
226 av_image_copy_plane(out->data[plane], out->linesize[plane],
227 in->data[plane], in->linesize[plane],
228 width * ((s->depth + 7) / 8), height);
229 continue;
230 }
231
232 if (s->depth == 8) {
233 for (y = 0; y < height; y++) {
234 for (x = 0; x < width; x++) {
235 bptr[x] = src[x];
236 }
237 bptr += width;
238 src += in->linesize[plane];
239 }
240 } else if (s->depth <= 16) {
241 for (y = 0; y < height; y++) {
242 for (x = 0; x < width; x++) {
243 bptr[x] = src16[x];
244 }
245 bptr += width;
246 src16 += in->linesize[plane] / 2;
247 }
248 } else {
249 for (y = 0; y < height; y++) {
250 for (x = 0; x < width; x++) {
251 memcpy(bptr, src32, width * sizeof(float));
252 }
253 bptr += width;
254 src32 += in->linesize[plane] / 4;
255 }
256 }
257
258 diriir2d(ctx, plane);
259
260 bptr = s->buffer;
261 if (s->depth == 8) {
262 for (y = 0; y < height; y++) {
263 for (x = 0; x < width; x++) {
264 dst[x] = av_clip_uint8(lrintf(bptr[x]));
265 }
266 bptr += width;
267 dst += out->linesize[plane];
268 }
269 } else if (s->depth <= 16) {
270 for (y = 0; y < height; y++) {
271 for (x = 0; x < width; x++) {
272 dst16[x] = av_clip_uintp2_c(lrintf(bptr[x]), s->depth);
273 }
274 bptr += width;
275 dst16 += out->linesize[plane] / 2;
276 }
277 } else {
278 for (y = 0; y < height; y++) {
279 for (x = 0; x < width; x++) {
280 memcpy(dst32, bptr, width * sizeof(float));
281 }
282 bptr += width;
283 dst32 += out->linesize[plane] / 4;
284 }
285 }
286 }
287
288 if (out != in)
289 av_frame_free(&in);
290 return ff_filter_frame(outlink, out);
291 }
292
293 static const AVFilterPad dblur_inputs[] = {
294 {
295 .name = "default",
296 .type = AVMEDIA_TYPE_VIDEO,
297 .config_props = config_input,
298 .filter_frame = filter_frame,
299 },
300 };
301
302 const FFFilter ff_vf_dblur = {
303 .p.name = "dblur",
304 .p.description = NULL_IF_CONFIG_SMALL("Apply Directional Blur filter."),
305 .p.priv_class = &dblur_class,
306 .p.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC,
307 .priv_size = sizeof(DBlurContext),
308 .uninit = uninit,
309 FILTER_INPUTS(dblur_inputs),
310 FILTER_OUTPUTS(ff_video_default_filterpad),
311 FILTER_PIXFMTS_ARRAY(pix_fmts),
312 .process_command = ff_filter_process_command,
313 };
314

苯三酚注射有什么用 腰疼是什么原因引起的女性 三月二十六是什么星座 ambush是什么牌子 天珠是什么做的
花名是什么意思 舌苔发白是什么病的前兆 怀孕40天有什么症状 腹泻呕吐是什么原因 栀子泡水喝有什么功效
诺如病毒吃什么药好得快一点 cot什么意思 反应性增生是什么意思 前列腺吃什么药 pp和ppsu有什么区别
王羲之兰亭序是什么字体 骏五行属什么 香波是什么 一什么牌子 早上8点是什么时辰
梦见骆驼是什么意思hcv9jop0ns9r.cn 瓶颈期是什么意思xinjiangjialails.com 梦见腿断了是什么意思jinxinzhichuang.com dbm是什么单位hcv8jop0ns9r.cn 扒皮鱼是什么鱼jasonfriends.com
囊性结节是什么xscnpatent.com 做雾化起什么作用hcv9jop2ns3r.cn 四肢百骸是什么意思zsyouku.com 印鉴是什么意思xjhesheng.com 肚脐眼下面是什么部位hcv8jop8ns6r.cn
瘢痕是什么意思hcv8jop2ns0r.cn 胡子变白是什么原因hcv8jop9ns7r.cn 拔完智齿吃什么食物好hcv8jop1ns4r.cn 胸闷是什么原因造成的hcv8jop9ns9r.cn 马克华菲是什么档次hcv8jop3ns5r.cn
座驾是什么意思fenrenren.com 高血糖吃什么降得快jasonfriends.com 15度穿什么衣服合适hcv8jop6ns6r.cn 不字五行属什么hcv9jop2ns8r.cn 中午12点是什么时辰hcv8jop5ns6r.cn
百度