63#define OFFSET(x) offsetof(VarBlurContext, x)
64#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
98#define COMPUTE_SAT(type, stype, depth) \
99static void compute_sat##depth(const uint8_t *ssrc, \
105 const type *src = (const type *)ssrc; \
106 stype *dst = (stype *)dstp; \
108 linesize /= (depth / 8); \
109 dst_linesize /= sizeof(stype); \
110 dst += dst_linesize; \
112 for (int y = 0; y < h; y++) { \
115 for (int x = 1; x < w; x++) { \
117 dst[x] = sum + dst[x - dst_linesize]; \
121 dst += dst_linesize; \
133static float lerpf(
float v0,
float v1,
float f)
135 return v0 + (v1 - v0) *
f;
138#define BLUR_PLANE(type, stype, bits) \
139static int blur_plane##bits(AVFilterContext *ctx, \
142 const uint8_t *rrptr, \
143 int rrptr_linesize, \
145 const uint8_t *pptr, \
147 int slice_start, int slice_end) \
149 VarBlurContext *s = ctx->priv; \
150 const int ddepth = (bits == 32) ? 1 : s->depth; \
151 const int dst_linesize = ddst_linesize / (bits / 8); \
152 const int ptr_linesize = pptr_linesize / sizeof(stype); \
153 const int rptr_linesize = rrptr_linesize / (bits / 8); \
154 const type *rptr = ((const type *)rrptr) + slice_start * rptr_linesize; \
155 type *dst = ((type *)ddst) + slice_start * dst_linesize; \
156 const stype *ptr = (stype *)pptr; \
157 const float minr = 2.f * s->min_radius + 1.f; \
158 const float maxr = 2.f * s->max_radius + 1.f; \
159 const float scaler = (maxr - minr) / ((1 << ddepth) - 1); \
161 for (int y = slice_start; y < slice_end; y++) { \
162 for (int x = 0; x < w; x++) { \
163 const float radiusf = minr + (FFMAX(0.f, 2 * rptr[x] + 1 - minr)) * scaler; \
164 const int radius = floorf(radiusf); \
165 const float factor = radiusf - radius; \
166 const int nradius = radius + 1; \
167 const int l = FFMIN(radius, x); \
168 const int r = FFMIN(radius, w - x - 1); \
169 const int t = FFMIN(radius, y); \
170 const int b = FFMIN(radius, h - y - 1); \
171 const int nl = FFMIN(nradius, x); \
172 const int nr = FFMIN(nradius, w - x - 1); \
173 const int nt = FFMIN(nradius, y); \
174 const int nb = FFMIN(nradius, h - y - 1); \
175 stype tl = ptr[(y - t) * ptr_linesize + x - l]; \
176 stype tr = ptr[(y - t) * ptr_linesize + x + r]; \
177 stype bl = ptr[(y + b) * ptr_linesize + x - l]; \
178 stype br = ptr[(y + b) * ptr_linesize + x + r]; \
179 stype ntl = ptr[(y - nt) * ptr_linesize + x - nl]; \
180 stype ntr = ptr[(y - nt) * ptr_linesize + x + nr]; \
181 stype nbl = ptr[(y + nb) * ptr_linesize + x - nl]; \
182 stype nbr = ptr[(y + nb) * ptr_linesize + x + nr]; \
183 stype div = (l + r) * (t + b); \
184 stype ndiv = (nl + nr) * (nt + nb); \
185 stype p0 = (br + tl - bl - tr) / div; \
186 stype n0 = (nbr + ntl - nbl - ntr) / ndiv; \
189 dst[x] = lerpf(p0, n0, factor); \
191 dst[x] = av_clip_uintp2_c(lrintf( \
192 lerpf(p0, n0, factor)), \
196 rptr += rptr_linesize; \
197 dst += dst_linesize; \
208 int jobnr,
int nb_jobs)
216 for (
int plane = 0; plane <
s->nb_planes; plane++) {
217 const int height =
s->planeheight[plane];
220 const int width =
s->planewidth[plane];
221 const int linesize = in->
linesize[plane];
222 const int dst_linesize =
out->linesize[plane];
223 const uint8_t *rptr = radius->
data[plane];
224 const int rptr_linesize = radius->
linesize[plane];
225 uint8_t *ptr =
s->sat[plane];
226 const int ptr_linesize =
s->sat_linesize[plane];
227 const uint8_t *
src = in->
data[plane];
228 uint8_t *
dst =
out->data[plane];
230 if (!(
s->planes & (1 << plane))) {
236 width * ((
s->depth + 7) / 8),
241 s->blur_plane(
ctx,
dst, dst_linesize,
269 for (
int plane = 0; plane <
s->nb_planes; plane++) {
270 const int height =
s->planeheight[plane];
271 const int width =
s->planewidth[plane];
272 const int linesize = in->
linesize[plane];
273 uint8_t *ptr =
s->sat[plane];
274 const int ptr_linesize =
s->sat_linesize[plane];
275 const uint8_t *
src = in->
data[plane];
277 if (!(
s->planes & (1 << plane)))
307 if (
s->max_radius <=
s->min_radius)
308 s->max_radius =
s->min_radius + 1;
329 if (inlink->
w != radiuslink->
w || inlink->
h != radiuslink->
h) {
331 "(size %dx%d) do not match the corresponding "
332 "second input link %s parameters (size %dx%d)\n",
333 ctx->input_pads[0].name, inlink->
w, inlink->
h,
334 ctx->input_pads[1].name, radiuslink->
w, radiuslink->
h);
338 outlink->
w = inlink->
w;
339 outlink->
h = inlink->
h;
344 s->depth =
desc->comp[0].depth;
345 s->blur_plane =
s->depth <= 8 ? blur_plane8 :
s->depth <= 16 ? blur_plane16 : blur_plane32;
346 s->compute_sat =
s->depth <= 8 ? compute_sat8 :
s->depth <= 16 ? compute_sat16 : compute_sat32;
349 s->planewidth[0] =
s->planewidth[3] = outlink->
w;
351 s->planeheight[0] =
s->planeheight[3] = outlink->
h;
355 for (
int p = 0; p <
s->nb_planes; p++) {
356 s->sat_linesize[p] = (outlink->
w + 1) * (4 + 4 * (
s->depth > 8));
357 s->sat[p] =
av_calloc(
s->sat_linesize[p], outlink->
h + 1);
377 for (
int p = 0; p < 4; p++)
403 .p.priv_class = &varblur_class,
408 .
preinit = varblur_framesync_preinit,
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
const FFFilter ff_vf_varblur
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 fs(width, name, subs,...)
#define AV_CEIL_RSHIFT(a, b)
int ff_framesync_configure(FFFrameSync *fs)
Configure a frame sync structure.
int ff_framesync_dualinput_get(FFFrameSync *fs, AVFrame **f0, AVFrame **f1)
int ff_framesync_activate(FFFrameSync *fs)
Examine the frames in the filter's input and try to produce output.
int ff_framesync_init_dualinput(FFFrameSync *fs, AVFilterContext *parent)
Initialize a frame sync structure for dualinput.
void ff_framesync_uninit(FFFrameSync *fs)
Free all memory currently allocated.
#define FRAMESYNC_DEFINE_CLASS(name, context, field)
@ AV_OPT_TYPE_INT
Underlying C type is int.
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
#define AVFILTER_FLAG_SUPPORT_TIMELINE_INTERNAL
Same as AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC, except that the filter will have its filter_frame() c...
int av_frame_is_writable(AVFrame *frame)
Check if the frame data is writable.
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.
void av_image_copy_plane(uint8_t *dst, int dst_linesize, const uint8_t *src, int src_linesize, int bytewidth, int height)
Copy image plane from src to dst.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int activate(AVBitStreamFilterContext *ctx)
static int config_output(AVBitStreamFilterLink *outlink)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
static int ff_slice_pos(int total, int jobnr, int nb_jobs)
Compute the boundary index for a slice when work of size total is split into nb_jobs slices.
#define FILTER_PIXFMTS_ARRAY(array)
static FilterLink * ff_filter_link(AVFilterLink *link)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static enum AVPixelFormat pix_fmts[]
static const struct @257111027162314367033347246032313251342043035002 planes[]
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
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_GBRPF32
#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_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_GBRAPF32
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P10
static av_cold int preinit(AVBitStreamFilterContext *ctx)
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
AVRational time_base
Define the time base used by the PTS of the frames/samples which will pass through this link.
AVRational sample_aspect_ratio
agreed upon sample aspect ratio
int format
agreed upon media format
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Link properties exposed to filter code, but not external callers.
AVRational frame_rate
Frame rate of the stream on the link, or 1/0 if unknown or variable.
Used for passing data between threads.
int(* blur_plane)(AVFilterContext *ctx, uint8_t *ddst, int ddst_linesize, const uint8_t *rrptr, int rrptr_linesize, int w, int h, const uint8_t *pptr, int pptr_linesize, int slice_start, int slice_end)
void(* compute_sat)(const uint8_t *ssrc, int linesize, int w, int h, uint8_t *dstp, int dst_linesize)
static AVFormatContext * ctx
static int varblur_frame(FFFrameSync *fs)
static int blur_planes(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
#define COMPUTE_SAT(type, stype, depth)
static const AVOption varblur_options[]
static int blur_frame(AVFilterContext *ctx, AVFrame *in, AVFrame *radius)
#define BLUR_PLANE(type, stype, bits)
static float lerpf(float v0, float v1, float f)
static const AVFilterPad varblur_outputs[]
static int activate(AVFilterContext *ctx)
static const AVFilterPad varblur_inputs[]
static av_cold void uninit(AVFilterContext *ctx)
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.
static int slice_start(SliceContext *sc, VVCContext *s, VVCFrameContext *fc, const CodedBitstreamUnit *unit, const int is_first_slice)