宝是什么生肖| 海绵宝宝是什么生物| 肾结石少吃什么食物| 用你的手解我的锁是什么歌| 非营运车辆是什么意思| 吃什么补维生素b| 肩膀的肌肉叫什么| 擦是什么意思| 石蜡是什么东西| 足字旁的字和什么有关| 肚脐眼周围是什么器官| 脍炙人口什么意思| 怕吹空调是什么原因| 诺氟沙星胶囊治什么病| 七夕送老婆什么| 口臭口苦什么原因引起的| 上午九点多是什么时辰| 女人尿多是什么原因| 什么颜色显皮肤白| 指南针什么时候发明的| 均码是什么码| 肾结石不处理有什么后果| 弘字五行属什么| 爬虫是什么| 低压48有什么危险| 胃炎吃什么中药| 皮下出血小红点是什么原因造成的| 减肥最好的办法是什么| 磨豆浆是什么意思| 鼻子经常出血是什么原因| 硬结灶是什么意思| 五劳七伤什么生肖| samedelman是什么牌子| 血糖高什么不能吃| 胎儿缺氧是什么原因造成的| 宝宝病毒感染吃什么药效果好| rh是什么意思| 空调出风小没劲什么原因| 立秋抓秋膘吃什么| 碱性磷酸酶是什么意思| 胰腺炎为什么血糖高| 8月28号是什么星座| 谢霆锋什么学历| 马步鱼为什么是甜的| 他达拉非是什么药| lpp什么意思| 特首是什么意思| 小宝贝是什么意思| 天赦日是什么意思| 重庆什么时候解放的| 12月3日什么星座| 吃什么能补头发| 打嗝放屁多是什么原因| 婴儿拉奶瓣是什么原因| 什么是cosplay| 川崎病是什么病| 鸡枞菌生长在什么地方| 总爱放屁是什么原因| 医疗美容需要什么资质| 非文念什么| 鸡爪煲汤放什么材料| d是什么元素| 背上长毛是什么原因引起的| 鲽鱼是什么鱼| 嘴唇为什么会干| 乾隆为什么不喜欢雍正| 风湿吃什么药好| 学子是什么意思| 剧情是什么意思| 什么盐好| 幽门螺旋杆菌阳性是什么意思| 糖尿病2型是什么意思| 不甚感激是什么意思| 毛孔粗大做什么医美| 么么什么意思| 头疼想吐是什么原因引起的| 蚂蝗长什么样| 梦见买床是什么意思| 坐月子吃什么| 官星是什么意思| mac是什么牌子口红| 宫颈口大是什么原因| 芹菜榨汁有什么功效| 大便干结是什么原因| 什么十分什么| 马齿苋煮水喝有什么功效| 静脉曲张吃什么药| 梅花是什么颜色的| 鸭梨是什么颜色| 精子有点黄是什么原因| 死马当活马医是什么意思| 华佗是什么生肖| 江西简称是什么| 喝豆腐脑有什么好处和坏处| 桥本氏甲状腺炎吃什么药| 女性失眠吃什么药最好| 林冲为什么叫豹子头| 脉是什么意思| 尿液细菌高是什么原因| 人生最重要的是什么| 狼来了的寓意是什么| 维生素b吃什么| 痨病是什么病| 舌头口腔溃疡是什么原因引起的| 五步蛇又叫什么蛇| 血糖高适合吃什么零食| 卡波姆是什么| 什么时候喝牛奶效果最佳| 补骨脂是什么东西| 除体内湿热最好的中成药是什么| 提前来大姨妈是什么原因| 韭菜吃多了有什么坏处| 喝茶心慌的人什么体质| 养肝吃什么食物| 痛风什么药止痛最快| 舌苔是什么东西| 化疗后吃什么补白细胞| 超市是什么意思| 77年的蛇是什么命| 甲申日五行属什么| 发瘟是什么意思| 特异性生长因子指什么| 智字五行属什么| 多喝柠檬水有什么好处| 什么油锯好| oversize风格什么意思| 形影不离是什么意思| 烫伤后擦什么药好得快| 卵巢囊肿是什么引起的| 4月11号是什么星座| 测怀孕什么时候最准| 白无常叫什么名字| 优对什么| 什么是痤疮图片| 斑鸠吃什么| 气山读什么| 什么的知了| 美如天仙是什么生肖| 家里养什么花最好| 张国立老婆叫什么名字| 2023年什么年| 破财消灾什么意思| 憋气2分钟算什么水平| 无极调光是什么意思| 胃疼吃什么药最好| 高危妊娠是什么意思啊| 6.14是什么星座| 泡沫尿是什么原因| 茉莉花茶有什么作用| 用牛奶敷脸有什么好处和坏处| 泌尿外科看什么病| 平均血小板体积偏高是什么意思| 主观意识是什么意思| 为什么会得干眼症| 货号是什么| 端午节干什么| 非农业户口是什么意思| 矫正度数是什么意思| 诗韵是什么意思| 月经血量少是什么原因| 什么的寒风| e是什么| 晟是什么字| 什么叫冷暴力| 空窗期是什么意思| 玉米什么季节成熟| 亚麻籽有什么功效| 撑台脚是什么意思| 什么样的房子不能住人脑筋急转弯| 坐怀不乱是什么意思| 六月十五是什么星座| 孩子血铅高有什么症状| 脸基尼是什么意思| 小狗吃什么| 什么好像什么| 肝不好吃什么中成药| 脸颊两边长斑是什么原因| ctp是什么| 白细胞2加号什么意思| 为什么一紧张就拉肚子| 出汗有盐霜是什么原因| 下巴长硬包是什么原因| 有什么不能说| 情形是什么意思| 达泊西汀是什么药| 右下腹疼是什么原因| 网络用语是什么意思| 小钢炮是什么意思| 出汗多是什么病| 巨蟹女和什么座最配对| 梦见女尸是什么预兆| 封闭针是什么| 治未病是什么意思| 主播是什么意思| 死精是什么原因造成的| 生肖猴和什么生肖相冲| human是什么意思| 补办结婚证需要什么手续| 猪肚和什么煲汤最好| 2006年是什么命| 冰片是什么| 神经性皮炎用什么药膏| 早些泄挂什么科| 6d是什么意思| 刘强东属什么生肖| bosch是什么牌子| 懿读什么| 病人化疗期间吃什么好| 一个万一个足念什么| 四联用药是些什么药| 苁蓉有什么功效| 什么是再生纤维素纤维| 关节炎用什么药| 为什么要打胰岛素| 补肾吃什么东西效果最好| 单人旁的字有什么| 什么是光合作用| 朋友圈提到了我是什么意思| 人生百味下一句是什么| 贫血吃什么食物好| 聚乙烯醇是什么材料| 汉武帝属什么生肖| 树冠是指什么| glenfiddich是什么酒| 蜂窝数据什么意思| 汉卿是什么意思| 男性做彩超要检查什么| 中医讲肾主什么| 5月份出生的是什么星座| 六月初六什么日子| 辅警和协警有什么区别| 习字五行属什么| 女性做结扎手术对身体有什么危害| 蜘蛛痣是什么| 花青素有什么作用| 小登科是什么意思| 沙茶酱做什么菜最好吃| 夜尿频繁是什么原因| 涅盘什么意思| span是什么意思| 胎儿靠什么吸收营养| 胃息肉是什么症状| 鲁迅真名叫什么| 猫发出咕噜咕噜的声音是什么意思| 胆脂瘤是什么病| 思前想后是什么意思| 线下是什么意思| 14时是什么时辰| 离婚需要带什么证件| 鱼完念什么| 慢性病是什么意思| 出现幻觉幻听是什么心理疾病| 什么是变异性哮喘| 6月18日是什么星座| 3月2日是什么星座| 什么叫直男| 属猴与什么属相最配| lym是什么意思| 蚕豆病是什么病| 灵芝孢子粉有什么功效| 剑兰什么时候开花| 眼帘是什么意思| 海豹是什么动物| 什么欲滴| 百度

交通:15日起道路施工 鞍山道西康路等路将限速


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

Line Branch Exec Source
1 /*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19 #include "libavutil/opt.h"
20 #include "libavutil/pixdesc.h"
21 #include "avfilter.h"
22 #include "filters.h"
23 #include "video.h"
24
25 typedef struct ColorizeContext {
26 const AVClass *class;
27
28 float hue;
29 float saturation;
30 float lightness;
31 float mix;
32
33 int depth;
34 int c[3];
35 int planewidth[4];
36 int planeheight[4];
37
38 int (*do_plane_slice[2])(AVFilterContext *s, void *arg,
39 int jobnr, int nb_jobs);
40 } ColorizeContext;
41
42 static inline float lerpf(float v0, float v1, float f)
43 {
44 return v0 + (v1 - v0) * f;
45 }
46
47 static int colorizey_slice8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
48 {
49 ColorizeContext *s = ctx->priv;
50 AVFrame *frame = arg;
51 const int width = s->planewidth[0];
52 const int height = s->planeheight[0];
53 const int slice_start = (height * jobnr) / nb_jobs;
54 const int slice_end = (height * (jobnr + 1)) / nb_jobs;
55 const ptrdiff_t ylinesize = frame->linesize[0];
56 uint8_t *yptr = frame->data[0] + slice_start * ylinesize;
57 const int yv = s->c[0];
58 const float mix = s->mix;
59
60 for (int y = slice_start; y < slice_end; y++) {
61 for (int x = 0; x < width; x++)
62 yptr[x] = lerpf(yv, yptr[x], mix);
63
64 yptr += ylinesize;
65 }
66
67 return 0;
68 }
69
70 static int colorizey_slice16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
71 {
72 ColorizeContext *s = ctx->priv;
73 AVFrame *frame = arg;
74 const int width = s->planewidth[0];
75 const int height = s->planeheight[0];
76 const int slice_start = (height * jobnr) / nb_jobs;
77 const int slice_end = (height * (jobnr + 1)) / nb_jobs;
78 const ptrdiff_t ylinesize = frame->linesize[0] / 2;
79 uint16_t *yptr = (uint16_t *)frame->data[0] + slice_start * ylinesize;
80 const int yv = s->c[0];
81 const float mix = s->mix;
82
83 for (int y = slice_start; y < slice_end; y++) {
84 for (int x = 0; x < width; x++)
85 yptr[x] = lerpf(yv, yptr[x], mix);
86
87 yptr += ylinesize;
88 }
89
90 return 0;
91 }
92
93 static int colorize_slice8(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
94 {
95 ColorizeContext *s = ctx->priv;
96 AVFrame *frame = arg;
97 const int width = s->planewidth[1];
98 const int height = s->planeheight[1];
99 const int slice_start = (height * jobnr) / nb_jobs;
100 const int slice_end = (height * (jobnr + 1)) / nb_jobs;
101 const ptrdiff_t ulinesize = frame->linesize[1];
102 const ptrdiff_t vlinesize = frame->linesize[2];
103 uint8_t *uptr = frame->data[1] + slice_start * ulinesize;
104 uint8_t *vptr = frame->data[2] + slice_start * vlinesize;
105 const int u = s->c[1];
106 const int v = s->c[2];
107
108 for (int y = slice_start; y < slice_end; y++) {
109 for (int x = 0; x < width; x++) {
110 uptr[x] = u;
111 vptr[x] = v;
112 }
113
114 uptr += ulinesize;
115 vptr += vlinesize;
116 }
117
118 return 0;
119 }
120
121 static int colorize_slice16(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
122 {
123 ColorizeContext *s = ctx->priv;
124 AVFrame *frame = arg;
125 const int width = s->planewidth[1];
126 const int height = s->planeheight[1];
127 const int slice_start = (height * jobnr) / nb_jobs;
128 const int slice_end = (height * (jobnr + 1)) / nb_jobs;
129 const ptrdiff_t ulinesize = frame->linesize[1] / 2;
130 const ptrdiff_t vlinesize = frame->linesize[2] / 2;
131 uint16_t *uptr = (uint16_t *)frame->data[1] + slice_start * ulinesize;
132 uint16_t *vptr = (uint16_t *)frame->data[2] + slice_start * vlinesize;
133 const int u = s->c[1];
134 const int v = s->c[2];
135
136 for (int y = slice_start; y < slice_end; y++) {
137 for (int x = 0; x < width; x++) {
138 uptr[x] = u;
139 vptr[x] = v;
140 }
141
142 uptr += ulinesize;
143 vptr += vlinesize;
144 }
145
146 return 0;
147 }
148
149 static int do_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
150 {
151 ColorizeContext *s = ctx->priv;
152
153 s->do_plane_slice[0](ctx, arg, jobnr, nb_jobs);
154 s->do_plane_slice[1](ctx, arg, jobnr, nb_jobs);
155
156 return 0;
157 }
158
159 static float hue2rgb(float p, float q, float t)
160 {
161 if (t < 0.f) t += 1.f;
162 if (t > 1.f) t -= 1.f;
163 if (t < 1.f/6.f) return p + (q - p) * 6.f * t;
164 if (t < 1.f/2.f) return q;
165 if (t < 2.f/3.f) return p + (q - p) * (2.f/3.f - t) * 6.f;
166
167 return p;
168 }
169
170 static void hsl2rgb(float h, float s, float l, float *r, float *g, float *b)
171 {
172 h /= 360.f;
173
174 if (s == 0.f) {
175 *r = *g = *b = l;
176 } else {
177 const float q = l < 0.5f ? l * (1.f + s) : l + s - l * s;
178 const float p = 2.f * l - q;
179
180 *r = hue2rgb(p, q, h + 1.f / 3.f);
181 *g = hue2rgb(p, q, h);
182 *b = hue2rgb(p, q, h - 1.f / 3.f);
183 }
184 }
185
186 static void rgb2yuv(float r, float g, float b, int *y, int *u, int *v, int depth)
187 {
188 *y = ((0.21260*219.0/255.0) * r + (0.71520*219.0/255.0) * g +
189 (0.07220*219.0/255.0) * b) * ((1 << depth) - 1);
190 *u = (-(0.11457*224.0/255.0) * r - (0.38543*224.0/255.0) * g +
191 (0.50000*224.0/255.0) * b + 0.5) * ((1 << depth) - 1);
192 *v = ((0.50000*224.0/255.0) * r - (0.45415*224.0/255.0) * g -
193 (0.04585*224.0/255.0) * b + 0.5) * ((1 << depth) - 1);
194 }
195
196 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
197 {
198 AVFilterContext *ctx = inlink->dst;
199 ColorizeContext *s = ctx->priv;
200 float c[3];
201
202 hsl2rgb(s->hue, s->saturation, s->lightness, &c[0], &c[1], &c[2]);
203 rgb2yuv(c[0], c[1], c[2], &s->c[0], &s->c[1], &s->c[2], s->depth);
204
205 ff_filter_execute(ctx, do_slice, frame, NULL,
206 FFMIN(s->planeheight[1], ff_filter_get_nb_threads(ctx)));
207
208 return ff_filter_frame(ctx->outputs[0], frame);
209 }
210
211 static const enum AVPixelFormat pixel_fmts[] = {
212 AV_PIX_FMT_YUV410P, AV_PIX_FMT_YUV411P,
213 AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P,
214 AV_PIX_FMT_YUV440P, AV_PIX_FMT_YUV444P,
215 AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P,
216 AV_PIX_FMT_YUVJ440P, AV_PIX_FMT_YUVJ444P,
217 AV_PIX_FMT_YUVJ411P,
218 AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
219 AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
220 AV_PIX_FMT_YUV440P10,
221 AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV420P12,
222 AV_PIX_FMT_YUV440P12,
223 AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV420P14,
224 AV_PIX_FMT_YUV420P16, AV_PIX_FMT_YUV422P16, AV_PIX_FMT_YUV444P16,
225 AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
226 AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUVA444P10, AV_PIX_FMT_YUVA444P12, AV_PIX_FMT_YUVA444P16,
227 AV_PIX_FMT_YUVA422P9, AV_PIX_FMT_YUVA422P10, AV_PIX_FMT_YUVA422P12, AV_PIX_FMT_YUVA422P16,
228 AV_PIX_FMT_YUVA420P9, AV_PIX_FMT_YUVA420P10, AV_PIX_FMT_YUVA420P16,
229 AV_PIX_FMT_NONE
230 };
231
232 static av_cold int config_input(AVFilterLink *inlink)
233 {
234 AVFilterContext *ctx = inlink->dst;
235 ColorizeContext *s = ctx->priv;
236 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format);
237 int depth;
238
239 s->depth = depth = desc->comp[0].depth;
240
241 s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
242 s->planewidth[0] = s->planewidth[3] = inlink->w;
243 s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
244 s->planeheight[0] = s->planeheight[3] = inlink->h;
245
246 s->do_plane_slice[0] = depth <= 8 ? colorizey_slice8 : colorizey_slice16;
247 s->do_plane_slice[1] = depth <= 8 ? colorize_slice8 : colorize_slice16;
248
249 return 0;
250 }
251
252 static const AVFilterPad colorize_inputs[] = {
253 {
254 .name = "default",
255 .type = AVMEDIA_TYPE_VIDEO,
256 .flags = AVFILTERPAD_FLAG_NEEDS_WRITABLE,
257 .filter_frame = filter_frame,
258 .config_props = config_input,
259 },
260 };
261
262 #define OFFSET(x) offsetof(ColorizeContext, x)
263 #define VF AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
264
265 static const AVOption colorize_options[] = {
266 { "hue", "set the hue", OFFSET(hue), AV_OPT_TYPE_FLOAT, {.dbl=0}, 0, 360, VF },
267 { "saturation", "set the saturation", OFFSET(saturation), AV_OPT_TYPE_FLOAT, {.dbl=0.5},0, 1, VF },
268 { "lightness", "set the lightness", OFFSET(lightness), AV_OPT_TYPE_FLOAT, {.dbl=0.5},0, 1, VF },
269 { "mix", "set the mix of source lightness", OFFSET(mix), AV_OPT_TYPE_FLOAT, {.dbl=1}, 0, 1, VF },
270 { NULL }
271 };
272
273 AVFILTER_DEFINE_CLASS(colorize);
274
275 const FFFilter ff_vf_colorize = {
276 .p.name = "colorize",
277 .p.description = NULL_IF_CONFIG_SMALL("Overlay a solid color on the video stream."),
278 .p.priv_class = &colorize_class,
279 .p.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
280 .priv_size = sizeof(ColorizeContext),
281 FILTER_INPUTS(colorize_inputs),
282 FILTER_OUTPUTS(ff_video_default_filterpad),
283 FILTER_PIXFMTS_ARRAY(pixel_fmts),
284 .process_command = ff_filter_process_command,
285 };
286

心肌缺血吃什么中成药 拔完牙不能吃什么 浑浑噩噩是什么意思 鳀鱼是什么鱼 例行检查是什么意思
为什么小孩子有白头发 油价什么时候下调 左肾积水有什么症状 交叉感染是什么意思 什么是碱性磷酸酶高怎么回事
鹿晗是什么星座 白细胞偏低是什么意思 自相矛盾的道理是什么 亚型是什么意思 慢性胃炎吃什么药好
ipl是什么意思 小孩为什么会细菌感染 风麻疹是什么引起的 惜字如金是什么意思 心衰做什么检查能确诊
条状血流信号是什么意思inbungee.com 吃什么药通气放屁最快hcv7jop9ns9r.cn 吃什么抗衰老hcv8jop8ns7r.cn 鼻涕倒流吃什么药hcv9jop0ns9r.cn 梦见喝水是什么意思hcv8jop8ns3r.cn
什么虎不吃人hcv7jop6ns9r.cn 滞纳金是什么意思hcv9jop5ns4r.cn 受精卵着床失败有什么症状gangsutong.com 肚脐眼周围是什么器官hcv9jop2ns1r.cn 鸡肚是什么部位hcv8jop0ns8r.cn
望尘莫及是什么意思hcv7jop5ns6r.cn 眼睛干涩用什么药效果好huizhijixie.com 酌情处理是什么意思hcv7jop7ns0r.cn 炸薯条用什么粉hcv9jop7ns9r.cn 香干是什么hcv9jop4ns7r.cn
广谱是什么意思hcv9jop2ns2r.cn 胎监不过关是什么原因hcv8jop0ns2r.cn 黄精和什么泡水喝最好hcv8jop7ns4r.cn 酒后大量出虚汗什么原因hcv8jop0ns0r.cn 不甚感激是什么意思hcv7jop9ns9r.cn
百度