FFmpeg
Loading...
Searching...
No Matches
vf_addroi.c
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19#include "libavutil/avassert.h"
20#include "libavutil/eval.h"
21#include "libavutil/opt.h"
22#include "avfilter.h"
23#include "filters.h"
24#include "video.h"
25
26enum {
27 X, Y, W, H,
29};
30static const char addroi_param_names[] = {
31 'x', 'y', 'w', 'h',
32};
33
34enum {
38};
39static const char *const addroi_var_names[] = {
40 "iw",
41 "ih",
42 NULL,
43};
44
56
58{
59 AVFilterContext *avctx = inlink->dst;
60 AddROIContext *ctx = avctx->priv;
61 int i;
62 double vars[NB_VARS];
63 double val;
64
65 vars[VAR_IW] = inlink->w;
66 vars[VAR_IH] = inlink->h;
67
68 for (i = 0; i < NB_PARAMS; i++) {
69 int max_value;
70 switch (i) {
71 case X: max_value = inlink->w; break;
72 case Y: max_value = inlink->h; break;
73 case W: max_value = inlink->w - ctx->region[X]; break;
74 case H: max_value = inlink->h - ctx->region[Y]; break;
75 }
76
77 val = av_expr_eval(ctx->region_expr[i], vars, NULL);
78 if (val < 0.0) {
79 av_log(avctx, AV_LOG_WARNING, "Calculated value %g for %c is "
80 "less than zero - using zero instead.\n", val,
82 val = 0.0;
83 } else if (val > max_value) {
84 av_log(avctx, AV_LOG_WARNING, "Calculated value %g for %c is "
85 "greater than maximum allowed value %d - "
86 "using %d instead.\n", val, addroi_param_names[i],
87 max_value, max_value);
88 val = max_value;
89 }
90 ctx->region[i] = val;
91 }
92
93 return 0;
94}
95
97{
98 AVFilterContext *avctx = inlink->dst;
99 AVFilterLink *outlink = avctx->outputs[0];
100 AddROIContext *ctx = avctx->priv;
102 AVFrameSideData *sd;
103 int err;
104
105 if (ctx->clear) {
107 sd = NULL;
108 } else {
110 }
111 if (sd) {
112 const AVRegionOfInterest *old_roi;
113 uint32_t old_roi_size;
114 AVBufferRef *roi_ref;
115 int nb_roi, i;
116
117 old_roi = (const AVRegionOfInterest*)sd->data;
118 old_roi_size = old_roi->self_size;
119 av_assert0(old_roi_size && sd->size % old_roi_size == 0);
120 nb_roi = sd->size / old_roi_size + 1;
121
122 roi_ref = av_buffer_alloc(sizeof(*roi) * nb_roi);
123 if (!roi_ref) {
124 err = AVERROR(ENOMEM);
125 goto fail;
126 }
127 roi = (AVRegionOfInterest*)roi_ref->data;
128
129 for (i = 0; i < nb_roi - 1; i++) {
130 old_roi = (const AVRegionOfInterest*)
131 (sd->data + old_roi_size * i);
132
133 roi[i] = (AVRegionOfInterest) {
134 .self_size = sizeof(*roi),
135 .top = old_roi->top,
136 .bottom = old_roi->bottom,
137 .left = old_roi->left,
138 .right = old_roi->right,
139 .qoffset = old_roi->qoffset,
140 };
141 }
142
143 roi[nb_roi - 1] = (AVRegionOfInterest) {
144 .self_size = sizeof(*roi),
145 .top = ctx->region[Y],
146 .bottom = ctx->region[Y] + ctx->region[H],
147 .left = ctx->region[X],
148 .right = ctx->region[X] + ctx->region[W],
149 .qoffset = ctx->qoffset,
150 };
151
153
156 roi_ref);
157 if (!sd) {
158 av_buffer_unref(&roi_ref);
159 err = AVERROR(ENOMEM);
160 goto fail;
161 }
162
163 } else {
165 sizeof(AVRegionOfInterest));
166 if (!sd) {
167 err = AVERROR(ENOMEM);
168 goto fail;
169 }
170 roi = (AVRegionOfInterest*)sd->data;
171 *roi = (AVRegionOfInterest) {
172 .self_size = sizeof(*roi),
173 .top = ctx->region[Y],
174 .bottom = ctx->region[Y] + ctx->region[H],
175 .left = ctx->region[X],
176 .right = ctx->region[X] + ctx->region[W],
177 .qoffset = ctx->qoffset,
178 };
179 }
180
181 return ff_filter_frame(outlink, frame);
182
183fail:
185 return err;
186}
187
189{
190 AddROIContext *ctx = avctx->priv;
191 int i, err;
192
193 for (i = 0; i < NB_PARAMS; i++) {
194 err = av_expr_parse(&ctx->region_expr[i], ctx->region_str[i],
196 0, avctx);
197 if (err < 0) {
199 "Error parsing %c expression '%s'.\n",
200 addroi_param_names[i], ctx->region_str[i]);
201 return err;
202 }
203 }
204
205 return 0;
206}
207
209{
210 AddROIContext *ctx = avctx->priv;
211 int i;
212
213 for (i = 0; i < NB_PARAMS; i++) {
214 av_expr_free(ctx->region_expr[i]);
215 ctx->region_expr[i] = NULL;
216 }
217}
218
219#define OFFSET(x) offsetof(AddROIContext, x)
220#define FLAGS AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM
221static const AVOption addroi_options[] = {
222 { "x", "Region distance from left edge of frame.",
223 OFFSET(region_str[X]), AV_OPT_TYPE_STRING, { .str = "0" }, .flags = FLAGS },
224 { "y", "Region distance from top edge of frame.",
225 OFFSET(region_str[Y]), AV_OPT_TYPE_STRING, { .str = "0" }, .flags = FLAGS },
226 { "w", "Region width.",
227 OFFSET(region_str[W]), AV_OPT_TYPE_STRING, { .str = "0" }, .flags = FLAGS },
228 { "h", "Region height.",
229 OFFSET(region_str[H]), AV_OPT_TYPE_STRING, { .str = "0" }, .flags = FLAGS },
230
231 { "qoffset", "Quantisation offset to apply in the region.",
232 OFFSET(qoffset), AV_OPT_TYPE_RATIONAL, { .dbl = -0.1 }, -1, +1, FLAGS },
233
234 { "clear", "Remove any existing regions of interest before adding the new one.",
235 OFFSET(clear), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS },
236
237 { NULL }
238};
239
241
242static const AVFilterPad addroi_inputs[] = {
243 {
244 .name = "default",
245 .type = AVMEDIA_TYPE_VIDEO,
246 .config_props = addroi_config_input,
247 .filter_frame = addroi_filter_frame,
248 },
249};
250
252 .p.name = "addroi",
253 .p.description = NULL_IF_CONFIG_SMALL("Add region of interest to frame."),
254 .p.priv_class = &addroi_class,
256
257 .init = addroi_init,
258 .uninit = addroi_uninit,
259
260 .priv_size = sizeof(AddROIContext),
261
264};
static double val(void *priv, double ch)
Definition aeval.c:77
const FFFilter ff_vf_addroi
Definition vf_addroi.c:251
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition avfilter.c:1068
Main libavfilter public API header.
#define Y
Definition boxblur.h:37
static const uint8_t vars[2][12]
Definition camellia.c:183
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define FLAGS
Definition cmdutils.c:598
#define NULL
Definition coverity.c:32
static AVFrame * frame
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
Definition eval.c:368
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
Definition eval.c:824
int av_expr_parse(AVExpr **expr, const char *s, const char *const *const_names, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), int log_offset, void *log_ctx)
Parse an expression.
Definition eval.c:735
simple arithmetic expression evaluator
#define X
Definition f_ebur128.c:157
@ VAR_IW
Definition f_select.c:147
@ VAR_IH
Definition f_select.c:146
#define fail
Definition test.h:479
@ AV_OPT_TYPE_RATIONAL
Underlying C type is AVRational.
Definition opt.h:279
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition opt.h:326
@ 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...
Definition opt.h:275
#define AVFILTER_FLAG_METADATA_ONLY
The filter is a "metadata" filter - it does not modify the frame data in any way.
Definition avfilter.h:182
void av_buffer_unref(AVBufferRef **buf)
Free a given reference and automatically free the buffer if there are no more references to it.
Definition buffer.c:139
AVBufferRef * av_buffer_alloc(size_t size)
Allocate an AVBuffer of the given size using av_malloc().
Definition buffer.c:77
#define AVERROR(e)
Definition error.h:45
AVFrameSideData * av_frame_get_side_data(const AVFrame *frame, enum AVFrameSideDataType type)
Definition frame.c:659
void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type)
Remove and free all side data instances of the given type.
Definition frame.c:725
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrameSideData * av_frame_new_side_data(AVFrame *frame, enum AVFrameSideDataType type, size_t size)
Add a new side data to a frame.
Definition frame.c:647
AVFrameSideData * av_frame_new_side_data_from_buf(AVFrame *frame, enum AVFrameSideDataType type, AVBufferRef *buf)
Add a new side data to a frame from an existing AVBufferRef.
Definition frame.c:638
@ AV_FRAME_DATA_REGIONS_OF_INTEREST
Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of array element is ...
Definition frame.h:165
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define W(a, i, v)
Definition jpegls.h:119
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
#define AVFILTER_DEFINE_CLASS(fname)
Definition filters.h:478
#define av_cold
Definition attributes.h:117
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
AVOptions.
#define H
Definition pixlet.c:39
A reference to a data buffer.
Definition buffer.h:82
uint8_t * data
The data buffer.
Definition buffer.h:90
Describe the class of an AVClass context structure.
Definition log.h:76
Definition eval.c:171
An instance of a filter.
Definition avfilter.h:273
void * priv
private data for use by the filter
Definition avfilter.h:288
AVFilterLink ** outputs
array of pointers to output links
Definition avfilter.h:285
A filter pad used for either input or output.
Definition filters.h:40
Structure to hold side data for an AVFrame.
Definition frame.h:327
size_t size
Definition frame.h:330
uint8_t * data
Definition frame.h:329
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
AVOption.
Definition opt.h:428
Rational number (pair of numerator and denominator).
Definition rational.h:58
Structure describing a single Region Of Interest.
Definition frame.h:398
uint32_t self_size
Must be set to the size of this data structure (that is, sizeof(AVRegionOfInterest)).
Definition frame.h:403
AVRational qoffset
Quantisation offset.
Definition frame.h:440
int top
Distance in pixels from the top edge of the frame to the top and bottom edges and from the left edge ...
Definition frame.h:413
char * region_str[NB_PARAMS]
Definition vf_addroi.c:48
AVExpr * region_expr[NB_PARAMS]
Definition vf_addroi.c:49
AVRational qoffset
Definition vf_addroi.c:52
int region[NB_PARAMS]
Definition vf_addroi.c:51
#define av_log(a,...)
static AVFormatContext * ctx
Definition movenc.c:49
static const char addroi_param_names[]
Definition vf_addroi.c:30
static const char *const addroi_var_names[]
Definition vf_addroi.c:39
static av_cold void addroi_uninit(AVFilterContext *avctx)
Definition vf_addroi.c:208
static const AVFilterPad addroi_inputs[]
Definition vf_addroi.c:242
@ NB_VARS
Definition vf_addroi.c:37
static int addroi_config_input(AVFilterLink *inlink)
Definition vf_addroi.c:57
@ NB_PARAMS
Definition vf_addroi.c:28
static av_cold int addroi_init(AVFilterContext *avctx)
Definition vf_addroi.c:188
static const AVOption addroi_options[]
Definition vf_addroi.c:221
#define OFFSET(x)
Definition vf_addroi.c:219
static int addroi_filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition vf_addroi.c:96
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.
Definition video.c:37