21#include "config_components.h"
63#define OFFSET(x) offsetof(XMedianContext, x)
64#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
65#define TFLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_RUNTIME_PARAM
102 s->nb_inputs =
s->radius * 2 + 1;
104 if (
s->nb_inputs & 1)
105 s->index =
s->radius * 2.f *
s->percentile;
107 s->index =
av_clip(
s->radius * 2.f *
s->percentile, 1,
s->nb_inputs - 1);
108 s->frames =
av_calloc(
s->nb_inputs,
sizeof(*
s->frames));
121 int left = *(
const uint8_t *)p1;
122 int right = *(
const uint8_t *)p2;
128 int left = *(
const uint16_t *)p1;
129 int right = *(
const uint16_t *)p2;
133#define MEDIAN_SLICE(name, type, comparei) \
134static int median_frames ## name(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) \
136 XMedianContext *s = ctx->priv; \
137 ThreadData *td = arg; \
138 AVFrame **in = td->in; \
139 AVFrame *out = td->out; \
140 const int nb_inputs = s->nb_inputs; \
141 uint8_t **srcf = s->data + jobnr * nb_inputs; \
142 int *linesize = s->linesize + jobnr * nb_inputs; \
143 const int radius = s->radius; \
144 const int index = s->index; \
147 for (int p = 0; p < s->nb_planes; p++) { \
148 const int slice_start = ff_slice_pos(s->height[p], jobnr, nb_jobs); \
149 const int slice_end = ff_slice_pos(s->height[p], jobnr + 1, nb_jobs); \
150 const int width = s->width[p]; \
151 type *dst = (type *)(out->data[p] + slice_start * out->linesize[p]); \
152 ptrdiff_t dst_linesize = out->linesize[p] / sizeof(type); \
154 if (!((1 << p) & s->planes)) { \
155 av_image_copy_plane((uint8_t *)dst, out->linesize[p], \
156 in[radius]->data[p] + slice_start * in[radius]->linesize[p], \
157 in[radius]->linesize[p], \
158 s->linesizes[p], slice_end - slice_start); \
162 for (int i = 0; i < nb_inputs; i++) \
163 linesize[i] = in[i]->linesize[p]; \
165 for (int i = 0; i < nb_inputs; i++) \
166 srcf[i] = in[i]->data[p] + slice_start * linesize[i]; \
168 for (int y = slice_start; y < slice_end; y++) { \
169 for (int x = 0; x < width; x++) { \
170 for (int i = 0; i < nb_inputs; i++) { \
171 const type *src = (const type *)srcf[i]; \
172 values[i] = src[x]; \
175 AV_QSORT(values, nb_inputs, type, comparei); \
177 dst[x] = values[index]; \
179 dst[x] = (values[index] + values[index - 1]) >> 1; \
182 dst += dst_linesize; \
183 for (int i = 0; i < nb_inputs; i++) \
184 srcf[i] += linesize[i]; \
196 if (
s->nb_inputs & 1)
197 s->index =
s->radius * 2.f *
s->percentile;
199 s->index =
av_clip(
s->radius * 2.f *
s->percentile, 1,
s->nb_inputs - 1);
214 for (
i = 0;
i <
s->nb_inputs;
i++) {
219 if (
ctx->is_disabled) {
228 if (!
ctx->is_disabled) {
232 FFMIN(
s->height[1],
s->nb_threads));
252 for (
int i = 1;
i <
s->nb_inputs &&
s->xmedian;
i++) {
263 s->depth =
s->desc->comp[0].depth;
264 s->max = (1 <<
s->depth) - 1;
268 s->median_frames = median_frames8;
270 s->median_frames = median_frames16;
276 s->width[0] =
s->width[3] = inlink->
w;
278 s->height[0] =
s->height[3] = inlink->
h;
280 s->data =
av_calloc(
s->nb_threads *
s->nb_inputs,
sizeof(*
s->data));
284 s->linesize =
av_calloc(
s->nb_threads *
s->nb_inputs,
sizeof(*
s->linesize));
303 for (
i = 0;
i <
s->nb_inputs;
i++) {
324 for (
int i = 0;
i <
s->nb_frames &&
s->frames && !
s->xmedian;
i++)
345#if CONFIG_XMEDIAN_FILTER
353 s->radius =
s->nb_inputs / 2;
355 for (
int i = 0;
i <
s->nb_inputs;
i++) {
370static const AVOption xmedian_options[] = {
382 .p.priv_class = &xmedian_class,
388 .preinit = xmedian_framesync_preinit,
389 .init = xmedian_init,
397#if CONFIG_TMEDIAN_FILTER
408 if (
s->nb_frames <
s->nb_inputs) {
409 s->frames[
s->nb_frames] = in;
411 if (
s->nb_frames <
s->nb_inputs)
415 memmove(&
s->frames[0], &
s->frames[1],
sizeof(*
s->frames) * (
s->nb_inputs - 1));
416 s->frames[
s->nb_inputs - 1] = in;
419 if (
ctx->is_disabled) {
429 out->pts =
s->frames[0]->pts;
434 FFMIN(
s->height[1],
s->nb_threads));
439static const AVOption tmedian_options[] = {
450 .filter_frame = tmedian_filter_frame,
459 .p.priv_class = &tmedian_class,
static const AVFilterPad outputs[]
const FFFilter ff_vf_tmedian
const FFFilter ff_vf_xmedian
static AVFormatContext * ctx
int ff_append_inpad_free_name(AVFilterContext *f, AVFilterPad *p)
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.
char * av_asprintf(const char *fmt,...)
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
#define i(width, name, range_min, range_max)
#define fs(width, name, subs,...)
#define AV_CEIL_RSHIFT(a, b)
int(* init)(AVBSFContext *ctx)
static av_always_inline int process_frame(AVTextFormatContext *tfc, InputFile *ifile, AVFrame *frame, const AVPacket *pkt, int *packet_new)
int ff_framesync_configure(FFFrameSync *fs)
Configure a frame sync structure.
int ff_framesync_activate(FFFrameSync *fs)
Examine the frames in the filter's input and try to produce output.
int ff_framesync_get_frame(FFFrameSync *fs, unsigned in, AVFrame **rframe, unsigned get)
Get the current frame in an input.
void ff_framesync_uninit(FFFrameSync *fs)
Free all memory currently allocated.
int ff_framesync_init(FFFrameSync *fs, AVFilterContext *parent, unsigned nb_in)
Initialize a frame sync structure.
#define FRAMESYNC_DEFINE_CLASS(name, context, field)
@ EXT_INFINITY
Extend the frame to infinity.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_FLOAT
Underlying C type is float.
#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...
#define AVFILTER_FLAG_DYNAMIC_INPUTS
The number of the filter inputs is not determined just by AVFilter.inputs.
#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.
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
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.
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)
#define FILTER_PIXFMTS_ARRAY(array)
static FilterLink * ff_filter_link(AVFilterLink *link)
#define AVFILTER_DEFINE_CLASS(fname)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static const struct @257111027162314367033347246032313251342043035002 planes[]
#define FFDIFFSIGN(x, y)
Comparator.
void * av_calloc(size_t nmemb, size_t size)
Memory handling functions.
@ EXT_STOP
Completely stop all streams with this one.
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
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
AVFilterContext * dst
dest filter
int format
agreed upon media format
A filter pad used for either input or output.
enum AVMediaType type
AVFilterPad type.
const char * name
Pad name.
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...
Rational number (pair of numerator and denominator).
enum FFFrameSyncExtMode after
Extrapolation mode for timestamps after the last frame.
enum FFFrameSyncExtMode before
Extrapolation mode for timestamps before the first frame.
AVRational time_base
Time base for the incoming frames.
unsigned sync
Synchronization level: frames on input at the highest sync level will generate output frame events.
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.
const AVPixFmtDescriptor * desc
int(* median_frames)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static enum AVPixelFormat pixel_fmts[]
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.