73 const int nb_blocks =
s->nb_blocks;
75 uint8_t *used =
s->used;
78 for (
int x = 0; x <
s->planewidth[0];) {
81 if (used[rand] == 0) {
86 map[rand *
s->block_w] = x;
88 width =
FFMIN(
s->block_w,
s->planewidth[0] - rand *
s->block_w);
89 map[x] = rand *
s->block_w;
95 map[rand *
s->block_w +
i] =
map[rand *
s->block_w] +
i;
111 const int nb_blocks =
s->nb_blocks;
113 uint8_t *used =
s->used;
116 for (
int y = 0; y <
s->planeheight[0];) {
119 if (used[rand] == 0) {
124 map[rand *
s->block_h] = y;
126 height =
FFMIN(
s->block_h,
s->planeheight[0] - rand *
s->block_h);
127 map[y] = rand *
s->block_h;
133 map[rand *
s->block_h +
i] =
map[rand *
s->block_h] +
i;
149 const int nb_blocks =
s->nb_blocks;
150 int nb_blocks_w =
s->planewidth[0] /
s->block_w;
152 uint8_t *used =
s->used;
155 for (
int i = 0;
i < nb_blocks;) {
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;
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];
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];
197#define SHUFFLE_HORIZONTAL(name, type) \
198static int shuffle_horizontal## name(AVFilterContext *ctx, void *arg, \
199 int jobnr, int nb_jobs) \
201 ShufflePixelsContext *s = ctx->priv; \
202 ThreadData *td = arg; \
203 AVFrame *in = td->in; \
204 AVFrame *out = td->out; \
206 for (int p = 0; p < s->nb_planes; p++) { \
207 const int slice_start = ff_slice_pos(s->planeheight[p], jobnr, nb_jobs); \
208 const int slice_end = ff_slice_pos(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; \
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]]; \
219 dst += out->linesize[p] / sizeof(type); \
220 src += in->linesize[p] / sizeof(type); \
230#define SHUFFLE_VERTICAL(name, type) \
231static int shuffle_vertical## name(AVFilterContext *ctx, void *arg, \
232 int jobnr, int nb_jobs) \
234 ShufflePixelsContext *s = ctx->priv; \
235 ThreadData *td = arg; \
236 AVFrame *in = td->in; \
237 AVFrame *out = td->out; \
239 for (int p = 0; p < s->nb_planes; p++) { \
240 const int slice_start = ff_slice_pos(s->planeheight[p], jobnr, nb_jobs); \
241 const int slice_end = ff_slice_pos(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; \
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]); \
249 memcpy(dst, src, s->linesize[p]); \
250 dst += out->linesize[p] / sizeof(type); \
260#define SHUFFLE_BLOCK(name, type) \
261static int shuffle_block## name(AVFilterContext *ctx, void *arg, \
262 int jobnr, int nb_jobs) \
264 ShufflePixelsContext *s = ctx->priv; \
265 ThreadData *td = arg; \
266 AVFrame *in = td->in; \
267 AVFrame *out = td->out; \
269 for (int p = 0; p < s->nb_planes; p++) { \
270 const int slice_start = ff_slice_pos(s->planeheight[p], jobnr, nb_jobs); \
271 const int slice_end = ff_slice_pos(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]; \
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]; \
281 dst[x] = src[xmap + ymap * in->linesize[p] / sizeof(type)]; \
284 dst += out->linesize[p] / sizeof(type); \
285 map += s->planewidth[p]; \
311 s->depth =
desc->comp[0].depth;
317 s->planewidth[0] =
s->planewidth[3] = inlink->
w;
320 s->planeheight[0] =
s->planeheight[3] = inlink->
h;
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;
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;
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);
404#define OFFSET(x) offsetof(ShufflePixelsContext, x)
405#define FLAGS (AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM)
444 .p.name =
"shufflepixels",
446 .p.priv_class = &shufflepixels_class,
const FFFilter ff_vf_shufflepixels
static AVFormatContext * ctx
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Main libavfilter public API header.
#define i(width, name, range_min, range_max)
common internal and external API header
#define AV_CEIL_RSHIFT(a, b)
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT64
Underlying C type is int64_t.
@ AV_OPT_TYPE_INT
Underlying C type is int.
#define AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
Some filters support a generic "enable" expression option that can be used to enable or disable a fil...
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
int av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width)
Fill plane linesizes for an image with pixel format pix_fmt and width width.
const VDPAUPixFmtMap * map
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int config_output(AVBitStreamFilterLink *outlink)
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
#define FILTER_PIXFMTS_ARRAY(array)
#define AVFILTER_DEFINE_CLASS(fname)
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_GBRAP12
#define AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP12
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
#define AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY14
#define AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P10
Describe the class of an AVClass context structure.
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * dst
dest filter
int format
agreed upon media format
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
Context structure for the Lagged Fibonacci PRNG.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
int(* shuffle_pixels)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Used for passing data between threads.
static void make_block_map(AVFilterContext *ctx)
static void make_horizontal_map(AVFilterContext *ctx)
static const AVFilterPad shufflepixels_inputs[]
static const AVFilterPad shufflepixels_outputs[]
static const AVOption shufflepixels_options[]
static int filter_frame(AVFilterLink *inlink, AVFrame *in)
#define SHUFFLE_BLOCK(name, type)
static av_cold void uninit(AVFilterContext *ctx)
static void make_vertical_map(AVFilterContext *ctx)
#define SHUFFLE_VERTICAL(name, type)
#define SHUFFLE_HORIZONTAL(name, type)
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.