97年属什么今年多大| 吃亚麻籽有什么好处| 什么是鼻息肉| 鼻窦炎用什么药| 循序渐进什么意思| 肌无力吃什么药最好| 纳豆是什么东西| 胃窦在胃的什么位置| 舌头麻木吃什么药| 什么的童话| 手机壳什么材质的好| 什么水果可以美白| 张杰属什么生肖| 尿液发红是什么原因| 疱疹吃什么药好得快| mol是什么意思| 乳糖醇是什么| 低级别上皮内瘤变是什么意思| 见龙在田什么意思| 肾动脉彩超主要查什么| 偏执是什么意思| 乘胜追击什么意思| 馋肉是身体里缺什么| 11月6日什么星座| emoji什么意思| 眼睛有眼屎是什么原因| 梦见打群架是什么意思| who医学上是什么意思| 豆粕是什么东西| 硫黄和硫磺有什么区别| 奎宁是什么药| 刚愎自用代表什么生肖| 吃避孕药有什么危害| 气促是什么意思| 口若悬河是指什么生肖| 本科是什么意思| ppi下降意味着什么| 月经不调吃什么药调理| 冲代表什么生肖| 人工念什么字| 左眼跳什么右眼跳什么| 什么思而行| 脾胃虚弱吃什么蔬菜| 静脉炎的症状是什么| 皮肤起水泡发痒是什么病| 妇科千金片主要治什么| 荷尔蒙爆发是什么意思| 什么情况下要打破伤风针| 吃火龙果对身体有什么好处| 风湿有什么症状表现| 女生吃木瓜有什么好处| 幡然醒悟是什么意思| 总胆红素是什么| 人潮涌动是什么意思| 咕咚是什么| 5月6号是什么星座| 拉绿色大便是什么原因| 脖子上长扁平疣是什么原因| 酸角是什么| 无力感什么意思| 外阴皮肤痒是什么原因| 结婚需要什么| 肾积水是什么病严重吗| 慢性子宫颈炎是什么意思| 什么是荷尔蒙| 音调是什么| 罄竹难书什么意思| 脚冰冰凉是什么原因| 24是什么生肖| 什么排球好| k9是什么意思| rbc是什么意思| 双侧基底节区腔隙灶是什么意思| 什么本本| hpv是什么病毒| 吃什么可以增强记忆力| 福寿螺有什么寄生虫| 乳酪和奶酪有什么区别| 2019年属什么生肖| 怀孕两个月有什么症状| 玉对人身体健康有什么好处| 为什么打呼噜| 肺气肿用什么药| mild是什么意思| 叶仙是什么植物| 什么病不能吃松花粉| 吃什么最减肥| 怀孕的脉搏和正常脉搏有什么区别| 孕晚期吃什么水果好| 彩超低回声是什么意思| 全是什么意思| 幼小衔接是什么意思| dvf是什么档次的牌子| 月经量少吃什么药调理| 薤是什么菜图片| 肾小球滤过率偏高说明什么| 农历3月是什么星座| 广东有什么城市| 直接胆红素偏高是什么原因| 上海副市长什么级别| 实则是什么意思| 退而求其次什么意思| 睡醒后嘴巴苦什么原因| 砷对人体有什么危害| 黑曜石适合什么人戴| 34属什么| 什么味道| 为什么会有同性恋| 2.4号是什么星座| 什么病会传染人| 儿童说话晚去医院挂什么科| 无春年是什么意思| 精液发黄是什么原因| 化疗和靶向有什么区别| 米白色是什么颜色| 一什么草坪| 关节疼挂什么科| 身心合一是什么意思| 什么人不能吃皮蛋| 女命七杀代表什么| 嗓子咽口水疼吃什么药| 什么是象限| 尿少尿黄是什么原因引起的| 酒鬼酒是什么香型| 乙肝两对半阴性是什么意思| 黑绿色大便是什么原因| 蟾蜍是什么动物| 紫癜有什么危害| 高密度脂蛋白胆固醇低是什么意思| 打三个喷嚏代表什么| 白手起家是什么生肖| 水肿是什么意思| 排骨炖什么汤好喝| 马标志的车是什么牌子| 黑木耳不能和什么一起吃| 浸洗是什么意思| 医院的特需门诊是什么意思| 指示是什么意思| b族维生素什么人不能吃| 试管都有什么方案| 补充蛋白质吃什么最好| tmt是什么意思| 入党有什么用| 排卵是什么意思啊| 补钙吃什么食物最好最快中老年| 乳房看什么科| 情人和小三的区别是什么| 虫可念什么| 辛辣是什么意思| konka是什么牌子| 乳房痒是什么原因| 老实人为什么总被欺负| 荨麻疹能吃什么食物| 属龙的守护神是什么菩萨| 经期吃什么缓解痛经| 巴旦木和杏仁有什么区别| 九月份有什么节日| 碧血是什么意思| 灰指甲挂什么科| 便秘吃什么药效果最好| 渣滓是什么意思| 鼻窦炎吃什么抗生素| 三七粉做面膜有什么功效| ccs是什么意思| 散佚是什么意思| 灰色是什么颜色| 近亲是什么意思| 1972年属什么生肖| 狐仙一般找什么人上身| 斗志昂扬是什么意思| 什么时候种大白菜| 取痣用什么方法最好| 慰安妇是什么意思| 2月8日什么星座| 梦见买车是什么意思| 死精吃什么能调理成活精| 昵称是什么| 中国的国树是什么树| 什么面玲珑| 心理素质是什么意思| 海带什么人不能吃| 蝾螈是什么动物| 春秋是一部什么体史书| 相见不如怀念是什么意思| 白发吃什么维生素| 闲的蛋疼是什么意思| 引流是什么意思| 呼吸道感染一般用什么消炎药| 葡萄糖阴性什么意思| 腹胀吃什么药最有效| 吃茶叶蛋有什么好处和坏处| 肺结节挂什么科| 双鱼座的幸运色是什么颜色| 营养过剩会导致什么| 素女是什么意思| 壁虎吃什么| 人中白是什么| 149是什么意思| 星期三左眼皮跳是什么预兆| 早晨8点是什么时辰| 子痫前期是什么意思| 麟字五行属什么| 黄金变黑是什么原因| 相得益彰意思是什么| 女流之辈是什么意思| 孕妇吃什么补钙| 艾地苯醌片治什么病| 吃什么头发能变黑| 表挂在客厅什么位置好| 白化病是什么能活多久| 薛之谦为什么离婚| 脸上长闭口是什么原因导致的| 舌头上有溃疡是什么原因| 眼肿是什么原因| 什么菜养胃| 飞机选座位什么位置好| 麻木是什么原因引起的| 什么什么不已| 丹参有什么作用| 蓝精灵是什么| 类风湿因子高说明什么| 梦见仙鹤是什么意思| 猫为什么要绝育| 喝什么水解酒| 趣味是什么意思| 猪肝和什么菜搭配吃好| 一月十号是什么星座| 翟读什么| 最毒的蛇是什么蛇| 卵是什么意思| 梦见建房子是什么预兆| 上海月薪三万什么水平| 难以入睡是什么原因引起的| 什么狗最贵| 青少年额头长痘痘是什么原因| 蛊惑什么意思| 浇去掉三点水读什么| 中老年吃什么钙片比较好| 所谓是什么意思| 粉尘螨过敏是什么意思| 梦见把蛇打死了是什么意思| 什么牌子的麦克风好用| 老年人嘴唇发紫是什么原因| 为什么手会麻| 喉咙有白点是什么原因| 吃一个海参相当于吃了什么| 一什么马| 念力是什么意思| 奄奄一息的息是什么意思| 一心向阳下一句是什么| 什么是肇事逃逸| 粉刺长什么样图片| 白头发缺什么微量元素| 肾动脉彩超主要查什么| 右耳烫代表什么预兆| 52年属什么生肖| 嘴里发苦是什么原因| 吃什么可以降血脂| 肾结石去医院挂什么科| 尿常规3个加号什么意思| 什么克土| 金融办是什么单位| 颇有是什么意思| 女人更年期有什么症状| 百度

教育部下发通知:2017年重点高校定向招收六万余


Directory: ../../../ffmpeg/
File: src/libavfilter/vf_monochrome.c
Date: 2025-08-05 11:35:17
Exec Total Coverage
Lines: 0 125 0.0%
Functions: 0 8 0.0%
Branches: 0 24 0.0%

Line Branch Exec Source
1 /*
2 * Copyright (c) 2021 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/opt.h"
24 #include "libavutil/pixdesc.h"
25 #include "avfilter.h"
26 #include "filters.h"
27 #include "video.h"
28
29 typedef struct MonochromeContext {
30 const AVClass *class;
31
32 float b, r;
33 float size;
34 float high;
35
36 int depth;
37 int subw, subh;
38
39 int (*do_slice)(AVFilterContext *s, void *arg,
40 int jobnr, int nb_jobs);
41 int (*clear_uv)(AVFilterContext *s, void *arg,
42 int jobnr, int nb_jobs);
43 } MonochromeContext;
44
45 static float envelope(const float x)
46 {
47 const float beta = 0.6f;
48
49 if (x < beta) {
50 const float tmp = fabsf(x / beta - 1.f);
51
52 return 1.f - tmp * tmp;
53 } else {
54 const float tmp = (1.f - x) / (1.f - beta);
55
56 return tmp * tmp * (3.f - 2.f * tmp);
57 }
58 }
59
60 static float filter(float b, float r, float u, float v, float size)
61 {
62 return expf(-av_clipf(((b - u) * (b - u) +
63 (r - v) * (r - v)) *
64 size, 0.f, 1.f));
65 }
66
67 #define PROCESS() \
68 const int cx = x >> subw; \
69 float y = yptr[x] * imax; \
70 float u = uptr[cx] * imax - .5f; \
71 float v = vptr[cx] * imax - .5f; \
72 float tt, t, ny; \
73 \
74 ny = filter(b, r, u, v, size); \
75 tt = envelope(y); \
76 t = tt + (1.f - tt) * ihigh; \
77 ny = (1.f - t) * y + t * ny * y;
78
79 static int monochrome_slice8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
80 {
81 MonochromeContext *s = ctx->priv;
82 AVFrame *frame = arg;
83 const int depth = s->depth;
84 const int subw = s->subw;
85 const int subh = s->subh;
86 const float max = (1 << depth) - 1;
87 const float imax = 1.f / max;
88 const int width = frame->width;
89 const int height = frame->height;
90 const int slice_start = (height * jobnr) / nb_jobs;
91 const int slice_end = (height * (jobnr + 1)) / nb_jobs;
92 const ptrdiff_t ylinesize = frame->linesize[0];
93 const ptrdiff_t ulinesize = frame->linesize[1];
94 const ptrdiff_t vlinesize = frame->linesize[2];
95 uint8_t *yptr = frame->data[0] + slice_start * ylinesize;
96 const float ihigh = 1.f - s->high;
97 const float size = 1.f / s->size;
98 const float b = s->b * .5f;
99 const float r = s->r * .5f;
100
101 for (int y = slice_start; y < slice_end; y++) {
102 const int cy = y >> subh;
103 uint8_t *uptr = frame->data[1] + cy * ulinesize;
104 uint8_t *vptr = frame->data[2] + cy * vlinesize;
105
106 for (int x = 0; x < width; x++) {
107 PROCESS()
108
109 yptr[x] = av_clip_uint8(lrintf(ny * max));
110 }
111
112 yptr += ylinesize;
113 }
114
115 return 0;
116 }
117
118 static int monochrome_slice16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
119 {
120 MonochromeContext *s = ctx->priv;
121 AVFrame *frame = arg;
122 const int depth = s->depth;
123 const int subw = s->subw;
124 const int subh = s->subh;
125 const float max = (1 << depth) - 1;
126 const float imax = 1.f / max;
127 const int width = frame->width;
128 const int height = frame->height;
129 const int slice_start = (height * jobnr) / nb_jobs;
130 const int slice_end = (height * (jobnr + 1)) / nb_jobs;
131 const ptrdiff_t ylinesize = frame->linesize[0] / 2;
132 const ptrdiff_t ulinesize = frame->linesize[1] / 2;
133 const ptrdiff_t vlinesize = frame->linesize[2] / 2;
134 uint16_t *yptr = (uint16_t *)frame->data[0] + slice_start * ylinesize;
135 const float ihigh = 1.f - s->high;
136 const float size = 1.f / s->size;
137 const float b = s->b * .5f;
138 const float r = s->r * .5f;
139
140 for (int y = slice_start; y < slice_end; y++) {
141 const int cy = y >> subh;
142 uint16_t *uptr = (uint16_t *)frame->data[1] + cy * ulinesize;
143 uint16_t *vptr = (uint16_t *)frame->data[2] + cy * vlinesize;
144
145 for (int x = 0; x < width; x++) {
146 PROCESS()
147
148 yptr[x] = av_clip_uintp2_c(lrintf(ny * max), depth);
149 }
150
151 yptr += ylinesize;
152 }
153
154 return 0;
155 }
156
157 static int clear_slice8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
158 {
159 MonochromeContext *s = ctx->priv;
160 AVFrame *frame = arg;
161 const int depth = s->depth;
162 const int half = 1 << (depth - 1);
163 const int subw = s->subw;
164 const int subh = s->subh;
165 const int width = AV_CEIL_RSHIFT(frame->width, subw);
166 const int height = AV_CEIL_RSHIFT(frame->height, subh);
167 const int slice_start = (height * jobnr) / nb_jobs;
168 const int slice_end = (height * (jobnr + 1)) / nb_jobs;
169 const ptrdiff_t ulinesize = frame->linesize[1];
170 const ptrdiff_t vlinesize = frame->linesize[2];
171
172 for (int y = slice_start; y < slice_end; y++) {
173 uint8_t *uptr = frame->data[1] + y * ulinesize;
174 uint8_t *vptr = frame->data[2] + y * vlinesize;
175
176 memset(uptr, half, width);
177 memset(vptr, half, width);
178 }
179
180 return 0;
181 }
182
183 static int clear_slice16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
184 {
185 MonochromeContext *s = ctx->priv;
186 AVFrame *frame = arg;
187 const int depth = s->depth;
188 const int half = 1 << (depth - 1);
189 const int subw = s->subw;
190 const int subh = s->subh;
191 const int width = AV_CEIL_RSHIFT(frame->width, subw);
192 const int height = AV_CEIL_RSHIFT(frame->height, subh);
193 const int slice_start = (height * jobnr) / nb_jobs;
194 const int slice_end = (height * (jobnr + 1)) / nb_jobs;
195 const ptrdiff_t ulinesize = frame->linesize[1] / 2;
196 const ptrdiff_t vlinesize = frame->linesize[2] / 2;
197
198 for (int y = slice_start; y < slice_end; y++) {
199 uint16_t *uptr = (uint16_t *)frame->data[1] + y * ulinesize;
200 uint16_t *vptr = (uint16_t *)frame->data[2] + y * vlinesize;
201
202 for (int x = 0; x < width; x++) {
203 uptr[x] = half;
204 vptr[x] = half;
205 }
206 }
207
208 return 0;
209 }
210
211 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
212 {
213 AVFilterContext *ctx = inlink->dst;
214 MonochromeContext *s = ctx->priv;
215
216 ff_filter_execute(ctx, s->do_slice, frame, NULL,
217 FFMIN(frame->height, ff_filter_get_nb_threads(ctx)));
218 ff_filter_execute(ctx, s->clear_uv, frame, NULL,
219 FFMIN(frame->height >> s->subh, ff_filter_get_nb_threads(ctx)));
220
221 return ff_filter_frame(ctx->outputs[0], frame);
222 }
223
224 static const enum AVPixelFormat pixel_fmts[] = {
225 AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
226 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
227 AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
228 AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P,
229 AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P,
230 AV_PIX_FMT_YUVJ411P,
231 AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
232 AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
233 AV_PIX_FMT_YUV440P10,
234 AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12,
235 AV_PIX_FMT_YUV440P12,
236 AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
237 AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
238 AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
239 AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
240 AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
241 AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
242 AV_PIX_FMT_NONE
243 };
244
245 static av_cold int config_input(AVFilterLink *inlink)
246 {
247 AVFilterContext *ctx = inlink->dst;
248 MonochromeContext *s = ctx->priv;
249 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
250
251 s->depth = desc->comp[0].depth;
252 s->do_slice = s->depth <= 8 ? monochrome_slice8 : monochrome_slice16;
253 s->clear_uv = s->depth <= 8 ? clear_slice8 : clear_slice16;
254 s->subw = desc->log2_chroma_w;
255 s->subh = desc->log2_chroma_h;
256
257 return 0;
258 }
259
260 static const AVFilterPad monochrome_inputs[] = {
261 {
262 .name = "default",
263 .type = AVMEDIA_TYPE_VIDEO,
264 .flags = AVFILTERPAD_FLAG_NEEDS_WRITABLE,
265 .filter_frame = filter_frame,
266 .config_props = config_input,
267 },
268 };
269
270 #define OFFSET(x) offsetof(MonochromeContext, x)
271 #define VF AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
272
273 static const AVOption monochrome_options[] = {
274 { "cb", "set the chroma blue spot", OFFSET(b), AV_OPT_TYPE_FLOAT, {.dbl=0},-1, 1, VF },
275 { "cr", "set the chroma red spot", OFFSET(r), AV_OPT_TYPE_FLOAT, {.dbl=0},-1, 1, VF },
276 { "size", "set the color filter size", OFFSET(size), AV_OPT_TYPE_FLOAT, {.dbl=1},.1,10, VF },
277 { "high", "set the highlights strength", OFFSET(high), AV_OPT_TYPE_FLOAT, {.dbl=0}, 0, 1, VF },
278 { NULL }
279 };
280
281 AVFILTER_DEFINE_CLASS(monochrome);
282
283 const FFFilter ff_vf_monochrome = {
284 .p.name = "monochrome",
285 .p.description = NULL_IF_CONFIG_SMALL("Convert video to gray using custom color filter."),
286 .p.priv_class = &monochrome_class,
287 .p.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
288 .priv_size = sizeof(MonochromeContext),
289 FILTER_INPUTS(monochrome_inputs),
290 FILTER_OUTPUTS(ff_video_default_filterpad),
291 FILTER_PIXFMTS_ARRAY(pixel_fmts),
292 .process_command = ff_filter_process_command,
293 };
294

目不暇接的意思是什么 刺猬是什么动物 锄禾是什么意思 与其让你在我怀中枯萎是什么歌 陶土色大便是什么颜色
阵容是什么意思 毛囊炎长什么样 口腔溃疡是什么原因 吃完饭恶心是什么原因 为什么吃饱了就犯困
脂溢性脱发用什么洗发水 扁桃体长什么样子 什么充电宝可以带上飞机 环状肉芽肿是什么皮肤病 金牛男喜欢什么类型的女生
务实什么意思 秋葵与什么菜相克 什么的小火车 喝什么能减肥 动物园里面有什么动物
开除党籍有什么后果hcv8jop1ns2r.cn 麻黄是什么hcv8jop9ns0r.cn 脑浆是什么颜色hcv9jop4ns6r.cn 血小板低是什么原因引起的zsyouku.com 剩女什么意思hcv9jop1ns3r.cn
女生的胸长什么样子hcv7jop9ns8r.cn 弼马温是什么意思hcv9jop2ns8r.cn 先考是什么意思hcv8jop4ns7r.cn 怀疑甲亢需要做什么检查hcv8jop1ns8r.cn 体脂是什么hcv9jop8ns3r.cn
为什么会得口腔溃疡luyiluode.com 白佛言是什么意思hcv8jop6ns4r.cn 慢性咽炎吃什么hcv9jop5ns8r.cn 女生吃什么补气血imcecn.com 女性缓解疲劳吃什么好hcv8jop7ns2r.cn
菠萝蜜不能和什么一起吃hcv9jop0ns1r.cn 去年属什么生肖hcv8jop4ns9r.cn 老放屁吃什么药xjhesheng.com 藏红花什么时候喝最好hcv7jop5ns0r.cn 吃避孕药为什么要吃维生素chcv9jop1ns7r.cn
百度