59#define OFFSET(x) offsetof(ShearContext, x)
60#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
79 if (!strcmp(
s->fillcolor_str,
"none"))
80 s->fillcolor_enable = 0;
82 s->fillcolor_enable = 1;
115#define NN(type, name) \
116static int filter_slice_nn##name(AVFilterContext *ctx, void *arg, int jobnr, \
119 ThreadData *td = arg; \
120 AVFrame *in = td->in; \
121 AVFrame *out = td->out; \
122 ShearContext *s = ctx->priv; \
123 const float shx = s->shx; \
124 const float shy = s->shy; \
126 for (int p = 0; p < s->nb_planes; p++) { \
127 const int hsub = (p == 1 || p == 2) ? s->hsub: 1; \
128 const int vsub = (p == 1 || p == 2) ? s->vsub: 1; \
129 const int width = s->planewidth[p]; \
130 const int height = s->planeheight[p]; \
131 const int wx = vsub * shx * height * 0.5f / hsub; \
132 const int wy = hsub * shy * width * 0.5f / vsub; \
133 const int slice_start = ff_slice_pos(height, jobnr, nb_jobs); \
134 const int slice_end = ff_slice_pos(height, jobnr + 1, nb_jobs); \
135 const int src_linesize = in->linesize[p] / sizeof(type); \
136 const int dst_linesize = out->linesize[p] / sizeof(type); \
137 const type *src = (const type *)in->data[p]; \
138 type *dst = (type *)out->data[p] + slice_start * dst_linesize; \
140 for (int y = slice_start; y < slice_end; y++) { \
141 for (int x = 0; x < width; x++) { \
142 int sx = x + vsub * shx * y / hsub - wx; \
143 int sy = y + hsub * shy * x / vsub - wy; \
145 if (sx >= 0 && sx < width - 1 && \
146 sy >= 0 && sy < height - 1) { \
147 dst[x] = src[sy * src_linesize + sx]; \
151 dst += dst_linesize; \
161#define BL(type, name) \
162static int filter_slice_bl##name(AVFilterContext *ctx, void *arg, int jobnr, \
165 ThreadData *td = arg; \
166 AVFrame *in = td->in; \
167 AVFrame *out = td->out; \
168 ShearContext *s = ctx->priv; \
169 const int depth = s->depth; \
170 const float shx = s->shx; \
171 const float shy = s->shy; \
173 for (int p = 0; p < s->nb_planes; p++) { \
174 const int hsub = (p == 1 || p == 2) ? s->hsub: 1; \
175 const int vsub = (p == 1 || p == 2) ? s->vsub: 1; \
176 const int width = s->planewidth[p]; \
177 const int height = s->planeheight[p]; \
178 const float wx = vsub * shx * height * 0.5f / hsub; \
179 const float wy = hsub * shy * width * 0.5f / vsub; \
180 const int slice_start = ff_slice_pos(height, jobnr, nb_jobs); \
181 const int slice_end = ff_slice_pos(height, jobnr + 1, nb_jobs); \
182 const int src_linesize = in->linesize[p] / sizeof(type); \
183 const int dst_linesize = out->linesize[p] / sizeof(type); \
184 const type *src = (const type *)in->data[p]; \
185 type *dst = (type *)out->data[p] + slice_start * dst_linesize; \
187 for (int y = slice_start; y < slice_end; y++) { \
188 for (int x = 0; x < width; x++) { \
189 const float sx = x + vsub * shx * y / hsub - wx; \
190 const float sy = y + hsub * shy * x / vsub - wy; \
192 if (sx >= 0 && sx < width - 1 && \
193 sy >= 0 && sy < height - 1) { \
195 int ax = floorf(sx); \
196 int ay = floorf(sy); \
197 float du = sx - ax; \
198 float dv = sy - ay; \
199 int bx = FFMIN(ax + 1, width - 1); \
200 int by = FFMIN(ay + 1, height - 1); \
202 sum += (1.f - du) * (1.f - dv) * src[ay * src_linesize + ax];\
203 sum += ( du) * (1.f - dv) * src[ay * src_linesize + bx];\
204 sum += (1.f - du) * ( dv) * src[by * src_linesize + ax];\
205 sum += ( du) * ( dv) * src[by * src_linesize + bx];\
206 dst[x] = av_clip_uintp2_c(lrintf(sum), depth); \
210 dst += dst_linesize; \
236 if (
s->fillcolor_enable)
238 0, 0, outlink->
w, outlink->
h);
256 s->depth =
desc->comp[0].depth;
257 s->hsub = 1 <<
desc->log2_chroma_w;
258 s->vsub = 1 <<
desc->log2_chroma_h;
260 s->planewidth[0] =
s->planewidth[3] =
ctx->inputs[0]->w;
262 s->planeheight[0] =
s->planeheight[3] =
ctx->inputs[0]->h;
271 s->filter_slice[0] =
s->depth <= 8 ? filter_slice_nn8 : filter_slice_nn16;
272 s->filter_slice[1] =
s->depth <= 8 ? filter_slice_bl8 : filter_slice_bl16;
318 .p.priv_class = &shear_class,
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
const FFFilter ff_vf_shear
static AVFormatContext * ctx
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_filter_process_command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
Generic processing of user supplied commands that are set in the same way as the filter options.
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 flags(name, subs,...)
#define AV_CEIL_RSHIFT(a, b)
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
void ff_draw_color(FFDrawContext *draw, FFDrawColor *color, const uint8_t rgba[4])
Prepare a color.
void ff_fill_rectangle(FFDrawContext *draw, FFDrawColor *color, uint8_t *dst[], int dst_linesize[], int dst_x, int dst_y, int w, int h)
Fill a rectangle with an uniform color.
int ff_draw_init_from_link(FFDrawContext *draw, const AVFilterLink *link, unsigned flags)
Init a draw context, taking the format, colorspace and range from the given filter link.
int(* init)(AVBSFContext *ctx)
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
@ AV_OPT_TYPE_STRING
Underlying C type is a uint8_t* that is either NULL or points to a C string allocated with the av_mal...
#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...
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.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int config_output(AVBitStreamFilterLink *outlink)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
#define FILTER_PIXFMTS_ARRAY(array)
#define AVFILTER_DEFINE_CLASS(fname)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
int av_parse_color(uint8_t *rgba_color, const char *color_string, int slen, void *log_ctx)
Put the RGBA values that correspond to color_string in rgba_color.
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_YUV420P16
#define AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV440P12
#define AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUV420P14
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
@ 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_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
#define AV_PIX_FMT_YUVA422P12
#define AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY14
#define AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV440P10
#define AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_YUVA444P12
#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 * src
source 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.
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
uint8_t fillcolor[4]
color expressed either in YUVA or RGBA colorspace for the padding area
int(* filter_slice[2])(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
Used for passing data between threads.
static int process_command(AVFilterContext *ctx, const char *cmd, const char *arg, char *res, int res_len, int flags)
static const AVOption shear_options[]
static int config_output(AVFilterLink *outlink)
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.