陶土色大便是什么颜色| 痛风吃什么水果最好| 早晨8点是什么时辰| 尿路感染吃什么药最好| 正军级是什么级别| 什么时候锻炼身体最佳时间| 孩子结膜炎用什么眼药水| 梦见鱼是什么预兆| 冬天怕冷夏天怕热是什么原因| 虾青素有什么作用| 平躺头晕是什么原因| 三聚磷酸钠是什么东西| 胎儿缺氧是什么原因造成的| 男生下体痒是什么原因| 花都有什么花| 医是什么结构的字| 起伏跌宕什么意思| 脸痒痒用什么方法可以缓解| 海参是补什么| 母亲吃什么退婴儿黄疸| 隶属什么意思| 猪脚炖什么| 睡觉磨牙是什么原因| 什么叫前列腺钙化| 尿频尿急尿不尽吃什么药最快见效| 什么的旅行| 皮肤有白点是什么原因| 7点是什么时辰| 妈咪是什么意思| 肚脐眼左边疼是什么原因| 闭经有什么症状| 血常规能查出什么病| 为什么眼睛会痛| 宝宝手心热是什么原因| 丝状疣是什么原因长出来的| 西红柿和什么不能一起吃| 嗜是什么意思| 猪沙肝是什么部位| 肆意是什么意思| 日间病房是什么意思| 卿本佳人什么意思| 床咚是什么意思啊| 维生素b是什么| 平均血小板体积偏高是什么原因| 水化是什么意思| 10月16日什么星座| b型钠尿肽是什么意思| rf医学上是什么意思| 上海立秋吃什么| 血糖高早餐吃什么好| 身份证号后四位代表什么| 现在最好的避孕方法是什么| 男人吃香菜有什么好处| 心慌吃点什么药| 易建联为什么不打nba| 高血压挂什么科| 为什么会咳嗽| 甲状腺肿物是什么意思| trab抗体偏高代表什么| 拔牙后吃什么消炎药最好| 国药准字号是什么意思| 将军是指什么生肖| 检查血脂挂什么科| 凛冽是什么意思| 血小板压积是什么意思| 眼睛有眼屎用什么眼药水| 手机充电口叫什么| ssr是什么意思| 登对是什么意思| 真菌孢子阳性什么意思| 为什么总是放屁很频繁| 什么门比较好| 情人和小三的区别是什么| 九二共识是什么意思| 破气是什么意思| 神经性呕吐是什么症状| 肿瘤最怕什么| 膝关节疼痛挂什么科| 穆字五行属什么| 不以为然的意思是什么| 贤惠是什么意思| 肺部挂什么科| 久字五行属什么| 野猫吃什么| 做酸菜鱼用什么鱼| 笑点低是什么意思| 早上起床咳嗽是什么原因| 胼胝体是什么意思| 温开水冲服是什么意思| 血压低吃什么补得快| 砖红色是什么颜色| 冬至有什么禁忌| 金福是什么生肖| 12月27日是什么星座| 氧化钠是什么| 什么佛面| 帝王蟹什么季节吃最好| 为什么会连续两天遗精| 太极贵人是什么意思| 两女 一杯是什么| 螳螂是什么生肖| 五味杂粮什么意思| 阳痿早泄是什么意思| 什么是遗精| 泼皮是什么意思| 痛风能吃什么菜谱大全| 烧心什么感觉| m和s是什么意思| 去迪拜打工需要什么条件| 什么原因导致性功能减退| 彩超无回声是什么意思| 阳痿什么症状| 牙松动了还疼用什么方法处理最好| 失眠吃什么中药调理效果快| 硝是什么东西| 中专是什么学历| 什么植物最老实| 属虎的适合什么职业| 违和是什么意思| 孕妇梦见坟墓是什么预兆| 靖国神社是什么| 淫羊藿治什么病| 古力娜扎全名叫什么| 肌肤是什么意思| 什么叫息肉| 多愁善感的动物是什么生肖| 生的反义词是什么| 女同学过生日送什么礼物比较好| 别见怪是什么意思| ch4是什么气体| 屁多屁臭是什么原因| md是什么材质| 潜叶蝇打什么药效果好| 车前草的作用是什么| 为什么会得淋巴肿瘤| 腹腔肠系膜淋巴结是什么病| 什么食物含钙量最高| 经常生病是什么原因| izzue是什么牌子| 为什么肚子总是胀胀的| 粉色五行属什么| 清明节在什么时候| 亲子鉴定去医院挂什么科| 住院需要带什么东西| 红萝卜和胡萝卜有什么区别| 妇科检查bv阳性是什么意思| 流鼻血什么原因| 什么病会传染| 吃完饭恶心想吐是什么原因| 熬夜 吃什么| 空调买什么牌子的好| 苦瓜有什么营养| sd是什么意思| 大泽土是什么生肖| 日照香炉生紫烟的香炉是什么意思| 年轻人血压高是什么原因引起的| 甲基蓝治疗什么鱼病| 全麻对身体有什么危害| 晨尿茶色是什么原因| 乙肝有抗体是显示什么结果| 梦见找对象是什么意思| 四月18号是什么星座的| 癫疯是什么原因引起| 心结是什么意思| 小便尿不出来是什么原因| 你好是什么意思| 号什么意思| 切除子宫有什么危害| 哥们是什么意思| 乳腺回声不均匀是什么意思| 神经节是什么| 脚底出汗什么原因| 小便尿血是什么原因| 光子是什么| 狗是什么偏旁| 眼角疼是什么原因| 双子座是什么星座| 手不释卷的释是什么意思| 家里为什么有蟑螂| 月经不能吃什么水果| com代表什么意思| 什么的公鸡| 什么是值机| 吃山竹有什么好处和坏处| 解酒的酶是什么酶| 伏天是什么时候| 子女宫是什么意思| 梦见自己手机丢了是什么意思| 汤姆猫是什么品种| 苹能组什么词| 静脉炎吃什么药| 感冒有痰吃什么药| 祎是什么意思| 前瞻是什么意思| 胃体息肉是什么意思| 串词是什么| 左眼皮老是跳是什么原因| 列席是什么意思| 就诊是什么意思| mickey是什么牌子| 上海居住证积分有什么用| 脖子里面有结节是什么病| poa是什么意思| 为什么会得肿瘤| 吃什么能缓解孕吐| 什么情况需要打狂犬疫苗| 系统性红斑狼疮挂什么科| 公主病是什么意思| 吃南瓜有什么好处| 惊恐症是什么病| 反胃是什么原因引起的| 发量多的女生适合什么发型| kid是什么意思| 肝内囊性灶什么意思| 罚的部首是什么| 空气炸锅可以做什么| 口甘读什么| 刷牙出血是什么原因| 晨尿有泡沫是什么原因| 小腿发凉是什么原因造成的| 羡字五行属什么| 惊奇地什么| 肚子疼喝什么药| 手抖是什么病的症状| 甲功三项能查出什么病| 三点水的字大多与什么有关| 喉咙有痰吐出来有血是什么原因| 七夕节的含义是什么| 生化妊娠是什么原因导致的| 瓒字取名有什么寓意| 肉卷炒什么菜好吃| 化作风化作雨是什么歌| 司命星君掌管什么| 秀才相当于现在的什么学历| 挑灯夜战是什么意思| 什么叫增值税| 什么人会得胆囊炎| 当伴郎有什么讲究| 作壁上观是什么生肖| 10月3号是什么星座| 海蓝之谜适合什么年龄| 七月十六是什么星座| 做梦抓鱼什么意思周公解梦| 煮花生放什么调料好吃| cc是什么单位| 拘挛是什么意思| 电话停机是什么意思| 女孩子学什么专业| 梦见金项链是什么意思| 补钙吃什么好| 为什么睡觉会流口水| 十月二十六是什么星座| 肉苁蓉有什么功能| 猪与什么属相相冲| 汽车点火线圈坏了有什么症状| 两个水念什么| 吃什么减肥最好最快| 解压密码是什么| 儿童肠系膜淋巴结炎吃什么药| 下巴发黑是什么原因| 丙氨酸氨基转移酶高是什么原因| 血沉高说明什么问题| 明五行属什么| 二月四号是什么星座| 百度


Directory: ../../../ffmpeg/
File: src/libavfilter/vf_shufflepixels.c
Date: 2025-08-04 00:43:16
Exec Total Coverage
Lines: 0 157 0.0%
Functions: 0 12 0.0%
Branches: 0 102 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/avassert.h"
22 #include "libavutil/common.h"
23 #include "libavutil/internal.h"
24 #include "libavutil/imgutils.h"
25 #include "libavutil/lfg.h"
26 #include "libavutil/mem.h"
27 #include "libavutil/opt.h"
28 #include "libavutil/pixdesc.h"
29 #include "libavutil/random_seed.h"
30
31 #include "avfilter.h"
32 #include "filters.h"
33 #include "video.h"
34
35 typedef struct ShufflePixelsContext {
36 const AVClass *class;
37
38 int block_w, block_h;
39 int mode;
40 int direction;
41 int64_t seed;
42
43 int depth;
44 int nb_planes;
45 int linesize[4];
46 int planewidth[4];
47 int planeheight[4];
48
49 int nb_blocks;
50
51 uint8_t *used;
52 int32_t *map;
53
54 AVLFG c;
55
56 int (*shuffle_pixels)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
57 } ShufflePixelsContext;
58
59 static const enum AVPixelFormat pix_fmts[] = {
60 AV_PIX_FMT_GRAY8, AV_PIX_FMT_GRAY9, AV_PIX_FMT_GRAY10, AV_PIX_FMT_GRAY14, AV_PIX_FMT_GRAY16,
61 AV_PIX_FMT_YUV444P, AV_PIX_FMT_YUVA444P,
62 AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRAP10,
63 AV_PIX_FMT_GBRP12, AV_PIX_FMT_GBRAP12, AV_PIX_FMT_GBRP14, AV_PIX_FMT_GBRP16,
64 AV_PIX_FMT_GBRAP16, AV_PIX_FMT_GBRAP,
65 AV_PIX_FMT_YUV444P9, AV_PIX_FMT_YUVA444P9, AV_PIX_FMT_YUV444P10, AV_PIX_FMT_YUVA444P10,
66 AV_PIX_FMT_YUV444P12, AV_PIX_FMT_YUV444P14, AV_PIX_FMT_YUV444P16, AV_PIX_FMT_YUVA444P16,
67 AV_PIX_FMT_NONE
68 };
69
70 static void make_horizontal_map(AVFilterContext *ctx)
71 {
72 ShufflePixelsContext *s = ctx->priv;
73 const int nb_blocks = s->nb_blocks;
74 AVLFG *c = &s->c;
75 uint8_t *used = s->used;
76 int32_t *map = s->map;
77
78 for (int x = 0; x < s->planewidth[0];) {
79 int rand = av_lfg_get(c) % nb_blocks;
80
81 if (used[rand] == 0) {
82 int width;
83
84 if (s->direction) {
85 width = FFMIN(s->block_w, s->planewidth[0] - x);
86 map[rand * s->block_w] = x;
87 } else {
88 width = FFMIN(s->block_w, s->planewidth[0] - rand * s->block_w);
89 map[x] = rand * s->block_w;
90 }
91 used[rand] = 1;
92
93 if (s->direction) {
94 for (int i = 1; i < width; i++) {
95 map[rand * s->block_w + i] = map[rand * s->block_w] + i;
96 }
97 } else {
98 for (int i = 1; i < width; i++) {
99 map[x + i] = map[x] + i;
100 }
101 }
102
103 x += width;
104 }
105 }
106 }
107
108 static void make_vertical_map(AVFilterContext *ctx)
109 {
110 ShufflePixelsContext *s = ctx->priv;
111 const int nb_blocks = s->nb_blocks;
112 AVLFG *c = &s->c;
113 uint8_t *used = s->used;
114 int32_t *map = s->map;
115
116 for (int y = 0; y < s->planeheight[0];) {
117 int rand = av_lfg_get(c) % nb_blocks;
118
119 if (used[rand] == 0) {
120 int height;
121
122 if (s->direction) {
123 height = FFMIN(s->block_h, s->planeheight[0] - y);
124 map[rand * s->block_h] = y;
125 } else {
126 height = FFMIN(s->block_h, s->planeheight[0] - rand * s->block_h);
127 map[y] = rand * s->block_h;
128 }
129 used[rand] = 1;
130
131 if (s->direction) {
132 for (int i = 1; i < height; i++) {
133 map[rand * s->block_h + i] = map[rand * s->block_h] + i;
134 }
135 } else {
136 for (int i = 1; i < height; i++) {
137 map[y + i] = map[y] + i;
138 }
139 }
140
141 y += height;
142 }
143 }
144 }
145
146 static void make_block_map(AVFilterContext *ctx)
147 {
148 ShufflePixelsContext *s = ctx->priv;
149 const int nb_blocks = s->nb_blocks;
150 int nb_blocks_w = s->planewidth[0] / s->block_w;
151 AVLFG *c = &s->c;
152 uint8_t *used = s->used;
153 int32_t *map = s->map;
154
155 for (int i = 0; i < nb_blocks;) {
156 int rand = av_lfg_get(c) % nb_blocks;
157
158 if (used[rand] == 0) {
159 int yin = i / nb_blocks_w;
160 int xin = i % nb_blocks_w;
161 int in = yin * s->block_h * s->planewidth[0] + xin * s->block_w;
162 int yout = rand / nb_blocks_w;
163 int xout = rand % nb_blocks_w;
164 int out = yout * s->block_h * s->planewidth[0] + xout * s->block_w;
165
166 if (s->direction) {
167 map[out] = in;
168 } else {
169 map[in] = out;
170 }
171 used[rand] = 1;
172
173 if (s->direction) {
174 for (int y = 0; y < s->block_h; y++) {
175 for (int x = 0; x < s->block_w; x++) {
176 map[out + y * s->planewidth[0] + x] = map[out] + x + y * s->planewidth[0];
177 }
178 }
179 } else {
180 for (int y = 0; y < s->block_h; y++) {
181 for (int x = 0; x < s->block_w; x++) {
182 map[in + y * s->planewidth[0] + x] = map[in] + x + y * s->planewidth[0];
183 }
184 }
185 }
186
187 i++;
188 }
189 }
190 }
191
192 typedef struct ThreadData {
193 AVFrame *in, *out;
194 } ThreadData;
195
196
197 #define SHUFFLE_HORIZONTAL(name, type) \
198 static int shuffle_horizontal## name(AVFilterContext *ctx, void *arg, \
199 int jobnr, int nb_jobs) \
200 { \
201 ShufflePixelsContext *s = ctx->priv; \
202 ThreadData *td = arg; \
203 AVFrame *in = td->in; \
204 AVFrame *out = td->out; \
205 \
206 for (int p = 0; p < s->nb_planes; p++) { \
207 const int slice_start = (s->planeheight[p] * jobnr) / nb_jobs; \
208 const int slice_end = (s->planeheight[p] * (jobnr+1)) / nb_jobs; \
209 type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]); \
210 const type *src = (const type *)(in->data[p] + \
211 slice_start * in->linesize[p]); \
212 const int32_t *map = s->map; \
213 \
214 for (int y = slice_start; y < slice_end; y++) { \
215 for (int x = 0; x < s->planewidth[p]; x++) { \
216 dst[x] = src[map[x]]; \
217 } \
218 \
219 dst += out->linesize[p] / sizeof(type); \
220 src += in->linesize[p] / sizeof(type); \
221 } \
222 } \
223 \
224 return 0; \
225 }
226
227 SHUFFLE_HORIZONTAL(8, uint8_t)
228 SHUFFLE_HORIZONTAL(16, uint16_t)
229
230 #define SHUFFLE_VERTICAL(name, type) \
231 static int shuffle_vertical## name(AVFilterContext *ctx, void *arg, \
232 int jobnr, int nb_jobs) \
233 { \
234 ShufflePixelsContext *s = ctx->priv; \
235 ThreadData *td = arg; \
236 AVFrame *in = td->in; \
237 AVFrame *out = td->out; \
238 \
239 for (int p = 0; p < s->nb_planes; p++) { \
240 const int slice_start = (s->planeheight[p] * jobnr) / nb_jobs; \
241 const int slice_end = (s->planeheight[p] * (jobnr+1)) / nb_jobs; \
242 type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]); \
243 const int32_t *map = s->map; \
244 \
245 for (int y = slice_start; y < slice_end; y++) { \
246 const type *src = (const type *)(in->data[p] + \
247 map[y] * in->linesize[p]); \
248 \
249 memcpy(dst, src, s->linesize[p]); \
250 dst += out->linesize[p] / sizeof(type); \
251 } \
252 } \
253 \
254 return 0; \
255 }
256
257 SHUFFLE_VERTICAL(8, uint8_t)
258 SHUFFLE_VERTICAL(16, uint16_t)
259
260 #define SHUFFLE_BLOCK(name, type) \
261 static int shuffle_block## name(AVFilterContext *ctx, void *arg, \
262 int jobnr, int nb_jobs) \
263 { \
264 ShufflePixelsContext *s = ctx->priv; \
265 ThreadData *td = arg; \
266 AVFrame *in = td->in; \
267 AVFrame *out = td->out; \
268 \
269 for (int p = 0; p < s->nb_planes; p++) { \
270 const int slice_start = (s->planeheight[p] * jobnr) / nb_jobs; \
271 const int slice_end = (s->planeheight[p] * (jobnr+1)) / nb_jobs; \
272 type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]); \
273 const type *src = (const type *)in->data[p]; \
274 const int32_t *map = s->map + slice_start * s->planewidth[p]; \
275 \
276 for (int y = slice_start; y < slice_end; y++) { \
277 for (int x = 0; x < s->planewidth[p]; x++) { \
278 int ymap = map[x] / s->planewidth[p]; \
279 int xmap = map[x] % s->planewidth[p]; \
280 \
281 dst[x] = src[xmap + ymap * in->linesize[p] / sizeof(type)]; \
282 } \
283 \
284 dst += out->linesize[p] / sizeof(type); \
285 map += s->planewidth[p]; \
286 } \
287 } \
288 \
289 return 0; \
290 }
291
292 SHUFFLE_BLOCK(8, uint8_t)
293 SHUFFLE_BLOCK(16, uint16_t)
294
295 static int config_output(AVFilterLink *outlink)
296 {
297 AVFilterContext *ctx = outlink->src;
298 ShufflePixelsContext *s = ctx->priv;
299 AVFilterLink *inlink = ctx->inputs[0];
300 const AVPixFmtDescriptor *desc;
301 int ret;
302
303 if (s->seed == -1)
304 s->seed = av_get_random_seed();
305 av_lfg_init(&s->c, s->seed);
306
307 desc = av_pix_fmt_desc_get(outlink->format);
308 if (!desc)
309 return AVERROR_BUG;
310 s->nb_planes = av_pix_fmt_count_planes(outlink->format);
311 s->depth = desc->comp[0].depth;
312
313 if ((ret = av_image_fill_linesizes(s->linesize, inlink->format, inlink->w)) < 0)
314 return ret;
315
316 s->planewidth[1] = s->planewidth[2] = AV_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w);
317 s->planewidth[0] = s->planewidth[3] = inlink->w;
318
319 s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h);
320 s->planeheight[0] = s->planeheight[3] = inlink->h;
321
322 s->map = av_calloc(inlink->w * inlink->h, sizeof(*s->map));
323 if (!s->map)
324 return AVERROR(ENOMEM);
325
326 switch (s->mode) {
327 case 0:
328 s->shuffle_pixels = s->depth <= 8 ? shuffle_horizontal8 : shuffle_horizontal16;
329 s->nb_blocks = (s->planewidth[0] + s->block_w - 1) / s->block_w;
330 break;
331 case 1:
332 s->shuffle_pixels = s->depth <= 8 ? shuffle_vertical8 : shuffle_vertical16;
333 s->nb_blocks = (s->planeheight[0] + s->block_h - 1) / s->block_h;
334 break;
335 case 2:
336 s->shuffle_pixels = s->depth <= 8 ? shuffle_block8 : shuffle_block16;
337 s->nb_blocks = (s->planeheight[0] / s->block_h) *
338 (s->planewidth[0] / s->block_w);
339 break;
340 default:
341 av_assert0(0);
342 }
343
344 s->used = av_calloc(s->nb_blocks, sizeof(*s->used));
345 if (!s->used)
346 return AVERROR(ENOMEM);
347
348 switch (s->mode) {
349 case 0:
350 make_horizontal_map(ctx);
351 break;
352 case 1:
353 make_vertical_map(ctx);
354 break;
355 case 2:
356 make_block_map(ctx);
357 break;
358 default:
359 av_assert0(0);
360 }
361
362 return 0;
363 }
364
365 static int filter_frame(AVFilterLink *inlink, AVFrame *in)
366 {
367 AVFilterContext *ctx = inlink->dst;
368 ShufflePixelsContext *s = ctx->priv;
369 AVFrame *out = ff_get_video_buffer(ctx->outputs[0], in->width, in->height);
370 ThreadData td;
371 int ret;
372
373 if (!out) {
374 ret = AVERROR(ENOMEM);
375 goto fail;
376 }
377
378 ret = av_frame_copy_props(out, in);
379 if (ret < 0) {
380 av_frame_free(&out);
381 goto fail;
382 }
383
384 td.out = out;
385 td.in = in;
386 ff_filter_execute(ctx, s->shuffle_pixels, &td, NULL,
387 FFMIN(s->planeheight[1], ff_filter_get_nb_threads(ctx)));
388
389 av_frame_free(&in);
390 return ff_filter_frame(ctx->outputs[0], out);
391 fail:
392 av_frame_free(&in);
393 return ret;
394 }
395
396 static av_cold void uninit(AVFilterContext *ctx)
397 {
398 ShufflePixelsContext *s = ctx->priv;
399
400 av_freep(&s->map);
401 av_freep(&s->used);
402 }
403
404 #define OFFSET(x) offsetof(ShufflePixelsContext, x)
405 #define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
406 static const AVOption shufflepixels_options[] = {
407 { "direction", "set shuffle direction", OFFSET(direction), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, .unit = "dir" },
408 { "d", "set shuffle direction", OFFSET(direction), AV_OPT_TYPE_INT, {.i64=0}, 0, 1, FLAGS, .unit = "dir" },
409 { "forward", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, .unit = "dir" },
410 { "inverse", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, .unit = "dir" },
411 { "mode", "set shuffle mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, .unit = "mode" },
412 { "m", "set shuffle mode", OFFSET(mode), AV_OPT_TYPE_INT, {.i64=0}, 0, 2, FLAGS, .unit = "mode" },
413 { "horizontal", 0, 0, AV_OPT_TYPE_CONST, {.i64=0}, 0, 0, FLAGS, .unit = "mode" },
414 { "vertical", 0, 0, AV_OPT_TYPE_CONST, {.i64=1}, 0, 0, FLAGS, .unit = "mode" },
415 { "block", 0, 0, AV_OPT_TYPE_CONST, {.i64=2}, 0, 0, FLAGS, .unit = "mode" },
416 { "width", "set block width", OFFSET(block_w), AV_OPT_TYPE_INT, {.i64=10}, 1, 8000, FLAGS },
417 { "w", "set block width", OFFSET(block_w), AV_OPT_TYPE_INT, {.i64=10}, 1, 8000, FLAGS },
418 { "height", "set block height", OFFSET(block_h), AV_OPT_TYPE_INT, {.i64=10}, 1, 8000, FLAGS },
419 { "h", "set block height", OFFSET(block_h), AV_OPT_TYPE_INT, {.i64=10}, 1, 8000, FLAGS },
420 { "seed", "set random seed", OFFSET(seed), AV_OPT_TYPE_INT64, {.i64=-1}, -1, UINT_MAX, FLAGS },
421 { "s", "set random seed", OFFSET(seed), AV_OPT_TYPE_INT64, {.i64=-1}, -1, UINT_MAX, FLAGS },
422 { NULL },
423 };
424
425 AVFILTER_DEFINE_CLASS(shufflepixels);
426
427 static const AVFilterPad shufflepixels_inputs[] = {
428 {
429 .name = "default",
430 .type = AVMEDIA_TYPE_VIDEO,
431 .filter_frame = filter_frame,
432 },
433 };
434
435 static const AVFilterPad shufflepixels_outputs[] = {
436 {
437 .name = "default",
438 .type = AVMEDIA_TYPE_VIDEO,
439 .config_props = config_output,
440 },
441 };
442
443 const FFFilter ff_vf_shufflepixels = {
444 .p.name = "shufflepixels",
445 .p.description = NULL_IF_CONFIG_SMALL("Shuffle video pixels."),
446 .p.priv_class = &shufflepixels_class,
447 .p.flags = AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC | AVFILTER_FLAG_SLICE_THREADS,
448 .priv_size = sizeof(ShufflePixelsContext),
449 .uninit = uninit,
450 FILTER_INPUTS(shufflepixels_inputs),
451 FILTER_OUTPUTS(shufflepixels_outputs),
452 FILTER_PIXFMTS_ARRAY(pix_fmts),
453 };
454

kawasaki是什么牌子 黑豆有什么功效 烧裆是什么原因 眼睑是什么位置图片 温暖的近义词是什么
瞳孔扩散意味着什么 河堤是什么意思 丝状疣是什么 迷你什么意思 本科一批和本科二批有什么区别
医院查过敏源挂什么科 肺肿了是什么病严重吗 外阴白斑擦什么药 番薯是什么 hpa是什么单位
什么是保守治疗 此生不换什么意思 阴阳和合是什么意思 hpv是什么症状 毒唯什么意思
汗为什么是咸的hcv8jop4ns4r.cn 县长什么级别干部hcv8jop8ns4r.cn 一什么公园onlinewuye.com 什么样的操场hcv9jop1ns6r.cn 行号是什么1949doufunao.com
tac是什么hcv8jop5ns8r.cn 病人打白蛋白意味着什么hcv9jop1ns7r.cn 吼不住是什么意思hcv7jop9ns5r.cn 2009年五行属什么hcv7jop6ns8r.cn 防冻液红色和绿色有什么区别zsyouku.com
秀才相当于现在的什么学历yanzhenzixun.com cd什么意思hcv8jop2ns0r.cn 应接不暇的暇是什么意思chuanglingweilai.com minute是什么意思hcv9jop5ns4r.cn 乌龟下蛋预示着什么hcv8jop5ns5r.cn
办理出院手续都需要什么hcv8jop7ns0r.cn 江诗丹顿属于什么档次gangsutong.com 扁桃体2度是什么意思hcv8jop5ns0r.cn 自汗恶风是什么意思hcv9jop0ns7r.cn hrv是什么hcv8jop5ns8r.cn
百度