FFmpeg
Loading...
Searching...
No Matches
vf_scale.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2007 Bobby Bingham
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21/**
22 * @file
23 * scale video filter
24 */
25
26#include <float.h>
27#include <stdio.h>
28#include <string.h>
29
30#include "avfilter.h"
31#include "filters.h"
32#include "formats.h"
33#include "framesync.h"
34#include "libavutil/pixfmt.h"
35#include "scale_eval.h"
36#include "video.h"
37#include "libavutil/eval.h"
39#include "libavutil/internal.h"
40#include "libavutil/mem.h"
41#include "libavutil/opt.h"
43#include "libavutil/pixdesc.h"
44#include "libswscale/swscale.h"
45
46static const char *const var_names[] = {
47 "in_w", "iw",
48 "in_h", "ih",
49 "out_w", "ow",
50 "out_h", "oh",
51 "a",
52 "sar",
53 "dar",
54 "hsub",
55 "vsub",
56 "ohsub",
57 "ovsub",
58 "n",
59 "t",
60 "ref_w", "rw",
61 "ref_h", "rh",
62 "ref_a",
63 "ref_sar",
64 "ref_dar", "rdar",
65 "ref_hsub",
66 "ref_vsub",
67 "ref_n",
68 "ref_t",
69 "ref_pos",
70 /* Legacy variables for scale2ref */
71 "main_w",
72 "main_h",
73 "main_a",
74 "main_sar",
75 "main_dar", "mdar",
76 "main_hsub",
77 "main_vsub",
78 "main_n",
79 "main_t",
80 "main_pos",
81 NULL
82};
83
120
126
127typedef struct ScaleContext {
128 const AVClass *class;
131
132 /**
133 * New dimensions. Special values are:
134 * 0 = original width/height
135 * -1 = keep original aspect
136 * -N = try to keep aspect but make sure it is divisible by N
137 */
138 int w, h;
139 char *size_str;
140 double param[2]; // sws params
141
142 int hsub, vsub; ///< chroma subsampling
143 int slice_y; ///< top of current output slice
146
147 char *w_expr; ///< width expression string
148 char *h_expr; ///< height expression string
152
154
163
170
174
175 int eval_mode; ///< expression evaluation mode
176
178
180#define IS_SCALE2REF(ctx) ((ctx)->filter == &ff_vf_scale2ref.p)
181
182static int config_props(AVFilterLink *outlink);
183
185{
186 ScaleContext *scale = ctx->priv;
187 unsigned vars_w[VARS_NB] = { 0 }, vars_h[VARS_NB] = { 0 };
188
189 if (!scale->w_pexpr && !scale->h_pexpr)
190 return AVERROR(EINVAL);
191
192 if (scale->w_pexpr)
193 av_expr_count_vars(scale->w_pexpr, vars_w, VARS_NB);
194 if (scale->h_pexpr)
195 av_expr_count_vars(scale->h_pexpr, vars_h, VARS_NB);
196
197 if (vars_w[VAR_OUT_W] || vars_w[VAR_OW]) {
198 av_log(ctx, AV_LOG_ERROR, "Width expression cannot be self-referencing: '%s'.\n", scale->w_expr);
199 return AVERROR(EINVAL);
200 }
201
202 if (vars_h[VAR_OUT_H] || vars_h[VAR_OH]) {
203 av_log(ctx, AV_LOG_ERROR, "Height expression cannot be self-referencing: '%s'.\n", scale->h_expr);
204 return AVERROR(EINVAL);
205 }
206
207 if ((vars_w[VAR_OUT_H] || vars_w[VAR_OH]) &&
208 (vars_h[VAR_OUT_W] || vars_h[VAR_OW])) {
209 av_log(ctx, AV_LOG_WARNING, "Circular references detected for width '%s' and height '%s' - possibly invalid.\n", scale->w_expr, scale->h_expr);
210 }
211
212 if (vars_w[VAR_REF_W] || vars_h[VAR_REF_W] ||
213 vars_w[VAR_RW] || vars_h[VAR_RW] ||
214 vars_w[VAR_REF_H] || vars_h[VAR_REF_H] ||
215 vars_w[VAR_RH] || vars_h[VAR_RH] ||
216 vars_w[VAR_REF_A] || vars_h[VAR_REF_A] ||
217 vars_w[VAR_REF_SAR] || vars_h[VAR_REF_SAR] ||
218 vars_w[VAR_REF_DAR] || vars_h[VAR_REF_DAR] ||
219 vars_w[VAR_RDAR] || vars_h[VAR_RDAR] ||
220 vars_w[VAR_REF_HSUB] || vars_h[VAR_REF_HSUB] ||
221 vars_w[VAR_REF_VSUB] || vars_h[VAR_REF_VSUB] ||
222 vars_w[VAR_REF_N] || vars_h[VAR_REF_N] ||
223 vars_w[VAR_REF_T] || vars_h[VAR_REF_T] ||
224 vars_w[VAR_REF_POS] || vars_h[VAR_REF_POS]) {
225 scale->uses_ref = 1;
226 }
227
228 if (!IS_SCALE2REF(ctx) &&
229 (vars_w[VAR_S2R_MAIN_W] || vars_h[VAR_S2R_MAIN_W] ||
230 vars_w[VAR_S2R_MAIN_H] || vars_h[VAR_S2R_MAIN_H] ||
231 vars_w[VAR_S2R_MAIN_A] || vars_h[VAR_S2R_MAIN_A] ||
232 vars_w[VAR_S2R_MAIN_SAR] || vars_h[VAR_S2R_MAIN_SAR] ||
233 vars_w[VAR_S2R_MAIN_DAR] || vars_h[VAR_S2R_MAIN_DAR] ||
234 vars_w[VAR_S2R_MDAR] || vars_h[VAR_S2R_MDAR] ||
235 vars_w[VAR_S2R_MAIN_HSUB] || vars_h[VAR_S2R_MAIN_HSUB] ||
236 vars_w[VAR_S2R_MAIN_VSUB] || vars_h[VAR_S2R_MAIN_VSUB] ||
237 vars_w[VAR_S2R_MAIN_N] || vars_h[VAR_S2R_MAIN_N] ||
238 vars_w[VAR_S2R_MAIN_T] || vars_h[VAR_S2R_MAIN_T] ||
239 vars_w[VAR_S2R_MAIN_POS] || vars_h[VAR_S2R_MAIN_POS]) ) {
240 av_log(ctx, AV_LOG_ERROR, "Expressions with scale2ref variables are not valid in scale filter.\n");
241 return AVERROR(EINVAL);
242 }
243
244 if (scale->eval_mode == EVAL_MODE_INIT &&
245 (vars_w[VAR_N] || vars_h[VAR_N] ||
246 vars_w[VAR_T] || vars_h[VAR_T] ||
247 vars_w[VAR_S2R_MAIN_N] || vars_h[VAR_S2R_MAIN_N] ||
248 vars_w[VAR_S2R_MAIN_T] || vars_h[VAR_S2R_MAIN_T] ||
249 vars_w[VAR_S2R_MAIN_POS] || vars_h[VAR_S2R_MAIN_POS]) ) {
250 av_log(ctx, AV_LOG_ERROR, "Expressions with frame variables 'n', 't', 'pos' are not valid in init eval_mode.\n");
251 return AVERROR(EINVAL);
252 }
253
254 return 0;
255}
256
257static int scale_parse_expr(AVFilterContext *ctx, char *str_expr, AVExpr **pexpr_ptr, const char *var, const char *args)
258{
259 ScaleContext *scale = ctx->priv;
260 int ret, is_inited = 0;
261 char *old_str_expr = NULL;
262 AVExpr *old_pexpr = NULL;
263
264 if (str_expr) {
265 old_str_expr = av_strdup(str_expr);
266 if (!old_str_expr)
267 return AVERROR(ENOMEM);
268 av_opt_set(scale, var, args, 0);
269 }
270
271 if (*pexpr_ptr) {
272 old_pexpr = *pexpr_ptr;
273 *pexpr_ptr = NULL;
274 is_inited = 1;
275 }
276
277 ret = av_expr_parse(pexpr_ptr, args, var_names,
278 NULL, NULL, NULL, NULL, 0, ctx);
279 if (ret < 0) {
280 av_log(ctx, AV_LOG_ERROR, "Cannot parse expression for %s: '%s'\n", var, args);
281 goto revert;
282 }
283
284 ret = check_exprs(ctx);
285 if (ret < 0)
286 goto revert;
287
288 if (is_inited && (ret = config_props(ctx->outputs[0])) < 0)
289 goto revert;
290
291 av_expr_free(old_pexpr);
292 old_pexpr = NULL;
293 av_freep(&old_str_expr);
294
295 return 0;
296
297revert:
298 av_expr_free(*pexpr_ptr);
299 *pexpr_ptr = NULL;
300 if (old_str_expr) {
301 av_opt_set(scale, var, old_str_expr, 0);
302 av_free(old_str_expr);
303 }
304 if (old_pexpr)
305 *pexpr_ptr = old_pexpr;
306
307 return ret;
308}
309
311{
312 ScaleContext *scale = ctx->priv;
313
314 scale->sws = sws_alloc_context();
315 if (!scale->sws)
316 return AVERROR(ENOMEM);
317
318 // set threads=0, so we can later check whether the user modified it
319 scale->sws->threads = 0;
320
322
323 return 0;
324}
325
326static int do_scale(FFFrameSync *fs);
327
329{
330 ScaleContext *scale = ctx->priv;
331 int ret;
332
333 if (IS_SCALE2REF(ctx))
334 av_log(ctx, AV_LOG_WARNING, "scale2ref is deprecated, use scale=rw:rh instead\n");
335
336 if (scale->size_str && (scale->w_expr || scale->h_expr)) {
338 "Size and width/height expressions cannot be set at the same time.\n");
339 return AVERROR(EINVAL);
340 }
341
342 if (scale->w_expr && !scale->h_expr)
343 FFSWAP(char *, scale->w_expr, scale->size_str);
344
345 if (scale->size_str) {
346 char buf[32];
347 if ((ret = av_parse_video_size(&scale->w, &scale->h, scale->size_str)) < 0) {
349 "Invalid size '%s'\n", scale->size_str);
350 return ret;
351 }
352 snprintf(buf, sizeof(buf)-1, "%d", scale->w);
353 av_opt_set(scale, "w", buf, 0);
354 snprintf(buf, sizeof(buf)-1, "%d", scale->h);
355 av_opt_set(scale, "h", buf, 0);
356 }
357 if (!scale->w_expr)
358 av_opt_set(scale, "w", "iw", 0);
359 if (!scale->h_expr)
360 av_opt_set(scale, "h", "ih", 0);
361
362 ret = scale_parse_expr(ctx, NULL, &scale->w_pexpr, "width", scale->w_expr);
363 if (ret < 0)
364 return ret;
365
366 ret = scale_parse_expr(ctx, NULL, &scale->h_pexpr, "height", scale->h_expr);
367 if (ret < 0)
368 return ret;
369
370 if (scale->in_primaries != -1 && !sws_test_primaries(scale->in_primaries, 0)) {
371 av_log(ctx, AV_LOG_ERROR, "Unsupported input primaries '%s'\n",
372 av_color_primaries_name(scale->in_primaries));
373 return AVERROR(EINVAL);
374 }
375
376 if (scale->out_primaries != -1 && !sws_test_primaries(scale->out_primaries, 1)) {
377 av_log(ctx, AV_LOG_ERROR, "Unsupported output primaries '%s'\n",
378 av_color_primaries_name(scale->out_primaries));
379 return AVERROR(EINVAL);
380 }
381
382 if (scale->in_transfer != -1 && !sws_test_transfer(scale->in_transfer, 0)) {
383 av_log(ctx, AV_LOG_ERROR, "Unsupported input transfer '%s'\n",
384 av_color_transfer_name(scale->in_transfer));
385 return AVERROR(EINVAL);
386 }
387
388 if (scale->out_transfer != -1 && !sws_test_transfer(scale->out_transfer, 1)) {
389 av_log(ctx, AV_LOG_ERROR, "Unsupported output transfer '%s'\n",
390 av_color_transfer_name(scale->out_transfer));
391 return AVERROR(EINVAL);
392 }
393
394 if (scale->in_color_matrix != -1 && !sws_test_colorspace(scale->in_color_matrix, 0)) {
395 av_log(ctx, AV_LOG_ERROR, "Unsupported input color matrix '%s'\n",
396 av_color_space_name(scale->in_color_matrix));
397 return AVERROR(EINVAL);
398 }
399
400 if (scale->out_color_matrix != -1 && !sws_test_colorspace(scale->out_color_matrix, 1)) {
401 av_log(ctx, AV_LOG_ERROR, "Unsupported output color matrix '%s'\n",
402 av_color_space_name(scale->out_color_matrix));
403 return AVERROR(EINVAL);
404 }
405
406 av_log(ctx, AV_LOG_VERBOSE, "w:%s h:%s flags:'%s' interl:%d\n",
407 scale->w_expr, scale->h_expr, (char *)av_x_if_null(scale->flags_str, ""), scale->interlaced);
408
409 if (scale->flags_str && *scale->flags_str) {
410 ret = av_opt_set(scale->sws, "sws_flags", scale->flags_str, 0);
411 if (ret < 0)
412 return ret;
413 }
414
415 for (int i = 0; i < FF_ARRAY_ELEMS(scale->param); i++)
416 if (scale->param[i] != DBL_MAX)
417 scale->sws->scaler_params[i] = scale->param[i];
418
419 scale->sws->src_h_chr_pos = scale->in_h_chr_pos;
420 scale->sws->src_v_chr_pos = scale->in_v_chr_pos;
421 scale->sws->dst_h_chr_pos = scale->out_h_chr_pos;
422 scale->sws->dst_v_chr_pos = scale->out_v_chr_pos;
423
424 // use generic thread-count if the user did not set it explicitly
425 if (!scale->sws->threads)
426 scale->sws->threads = ff_filter_get_nb_threads(ctx);
427
428 if (!IS_SCALE2REF(ctx) && scale->uses_ref) {
429 AVFilterPad pad = {
430 .name = "ref",
431 .type = AVMEDIA_TYPE_VIDEO,
432 };
433 ret = ff_append_inpad(ctx, &pad);
434 if (ret < 0)
435 return ret;
436 }
437
438 return 0;
439}
440
442{
443 ScaleContext *scale = ctx->priv;
444 av_expr_free(scale->w_pexpr);
445 av_expr_free(scale->h_pexpr);
446 scale->w_pexpr = scale->h_pexpr = NULL;
448 sws_free_context(&scale->sws);
449}
450
452 AVFilterFormatsConfig **cfg_in,
453 AVFilterFormatsConfig **cfg_out)
454{
455 const ScaleContext *scale = ctx->priv;
459 int ret;
460
461 desc = NULL;
462 formats = NULL;
463 while ((desc = av_pix_fmt_desc_next(desc))) {
465 if (sws_test_format(pix_fmt, 0)) {
466 if ((ret = ff_add_format(&formats, pix_fmt)) < 0)
467 return ret;
468 }
469 }
470 if ((ret = ff_formats_ref(formats, &cfg_in[0]->formats)) < 0)
471 return ret;
472
473 desc = NULL;
474 formats = NULL;
475 while ((desc = av_pix_fmt_desc_next(desc))) {
478 if ((ret = ff_add_format(&formats, pix_fmt)) < 0)
479 return ret;
480 }
481 }
482 if ((ret = ff_formats_ref(formats, &cfg_out[0]->formats)) < 0)
483 return ret;
484
485 /* accept all supported inputs, even if user overrides their properties */
487 for (int i = 0; i < formats->nb_formats; i++) {
488 if (!sws_test_colorspace(formats->formats[i], 0)) {
489 for (int j = i--; j + 1 < formats->nb_formats; j++)
490 formats->formats[j] = formats->formats[j + 1];
491 formats->nb_formats--;
492 }
493 }
494 if ((ret = ff_formats_ref(formats, &cfg_in[0]->color_spaces)) < 0)
495 return ret;
496
498 &cfg_in[0]->color_ranges)) < 0)
499 return ret;
500
501 /* propagate output properties if overridden */
502 if (scale->out_color_matrix != AVCOL_SPC_UNSPECIFIED) {
503 formats = ff_make_formats_list_singleton(scale->out_color_matrix);
504 } else {
506 for (int i = 0; i < formats->nb_formats; i++) {
507 if (!sws_test_colorspace(formats->formats[i], 1)) {
508 for (int j = i--; j + 1 < formats->nb_formats; j++)
509 formats->formats[j] = formats->formats[j + 1];
510 formats->nb_formats--;
511 }
512 }
513 }
514 if ((ret = ff_formats_ref(formats, &cfg_out[0]->color_spaces)) < 0)
515 return ret;
516
520 if ((ret = ff_formats_ref(formats, &cfg_out[0]->color_ranges)) < 0)
521 return ret;
522
524 &cfg_in[0]->chroma_locations)) < 0)
525 return ret;
526
527 formats = scale->out_chroma_loc != AVCHROMA_LOC_UNSPECIFIED
528 ? ff_make_formats_list_singleton(scale->out_chroma_loc)
530 if ((ret = ff_formats_ref(formats, &cfg_out[0]->chroma_locations)) < 0)
531 return ret;
532
533 if (scale->sws->alpha_blend) {
535 &cfg_in[0]->alpha_modes)) < 0)
536 return ret;
537 }
538
539 return 0;
540}
541
543{
544 ScaleContext *scale = ctx->priv;
545 const char scale2ref = IS_SCALE2REF(ctx);
546 const AVFilterLink *inlink = scale2ref ? ctx->inputs[1] : ctx->inputs[0];
547 const AVFilterLink *outlink = ctx->outputs[0];
549 const AVPixFmtDescriptor *out_desc = av_pix_fmt_desc_get(outlink->format);
550 char *expr;
551 int eval_w, eval_h;
552 int ret;
553 double res;
554 const AVPixFmtDescriptor *main_desc;
555 const AVFilterLink *main_link;
556
557 if (scale2ref) {
558 main_link = ctx->inputs[0];
559 main_desc = av_pix_fmt_desc_get(main_link->format);
560 }
561
562 scale->var_values[VAR_IN_W] = scale->var_values[VAR_IW] = inlink->w;
563 scale->var_values[VAR_IN_H] = scale->var_values[VAR_IH] = inlink->h;
564 scale->var_values[VAR_OUT_W] = scale->var_values[VAR_OW] = NAN;
565 scale->var_values[VAR_OUT_H] = scale->var_values[VAR_OH] = NAN;
566 scale->var_values[VAR_A] = (double) inlink->w / inlink->h;
567 scale->var_values[VAR_SAR] = inlink->sample_aspect_ratio.num ?
568 (double) inlink->sample_aspect_ratio.num / inlink->sample_aspect_ratio.den : 1;
569 scale->var_values[VAR_DAR] = scale->var_values[VAR_A] * scale->var_values[VAR_SAR];
570 scale->var_values[VAR_HSUB] = 1 << desc->log2_chroma_w;
571 scale->var_values[VAR_VSUB] = 1 << desc->log2_chroma_h;
572 scale->var_values[VAR_OHSUB] = 1 << out_desc->log2_chroma_w;
573 scale->var_values[VAR_OVSUB] = 1 << out_desc->log2_chroma_h;
574
575 if (scale2ref) {
576 scale->var_values[VAR_S2R_MAIN_W] = main_link->w;
577 scale->var_values[VAR_S2R_MAIN_H] = main_link->h;
578 scale->var_values[VAR_S2R_MAIN_A] = (double) main_link->w / main_link->h;
579 scale->var_values[VAR_S2R_MAIN_SAR] = main_link->sample_aspect_ratio.num ?
580 (double) main_link->sample_aspect_ratio.num / main_link->sample_aspect_ratio.den : 1;
581 scale->var_values[VAR_S2R_MAIN_DAR] = scale->var_values[VAR_S2R_MDAR] =
582 scale->var_values[VAR_S2R_MAIN_A] * scale->var_values[VAR_S2R_MAIN_SAR];
583 scale->var_values[VAR_S2R_MAIN_HSUB] = 1 << main_desc->log2_chroma_w;
584 scale->var_values[VAR_S2R_MAIN_VSUB] = 1 << main_desc->log2_chroma_h;
585 }
586
587 if (scale->uses_ref) {
588 const AVFilterLink *reflink = ctx->inputs[1];
589 const AVPixFmtDescriptor *ref_desc = av_pix_fmt_desc_get(reflink->format);
590 scale->var_values[VAR_REF_W] = scale->var_values[VAR_RW] = reflink->w;
591 scale->var_values[VAR_REF_H] = scale->var_values[VAR_RH] = reflink->h;
592 scale->var_values[VAR_REF_A] = (double) reflink->w / reflink->h;
593 scale->var_values[VAR_REF_SAR] = reflink->sample_aspect_ratio.num ?
594 (double) reflink->sample_aspect_ratio.num / reflink->sample_aspect_ratio.den : 1;
595 scale->var_values[VAR_REF_DAR] = scale->var_values[VAR_RDAR] =
596 scale->var_values[VAR_REF_A] * scale->var_values[VAR_REF_SAR];
597 scale->var_values[VAR_REF_HSUB] = 1 << ref_desc->log2_chroma_w;
598 scale->var_values[VAR_REF_VSUB] = 1 << ref_desc->log2_chroma_h;
599 }
600
601 res = av_expr_eval(scale->w_pexpr, scale->var_values, NULL);
602 eval_w = scale->var_values[VAR_OUT_W] = scale->var_values[VAR_OW] = (int) res == 0 ? inlink->w : (int) res;
603
604 res = av_expr_eval(scale->h_pexpr, scale->var_values, NULL);
605 if (isnan(res)) {
606 expr = scale->h_expr;
607 ret = AVERROR(EINVAL);
608 goto fail;
609 }
610 eval_h = scale->var_values[VAR_OUT_H] = scale->var_values[VAR_OH] = (int) res == 0 ? inlink->h : (int) res;
611
612 res = av_expr_eval(scale->w_pexpr, scale->var_values, NULL);
613 if (isnan(res)) {
614 expr = scale->w_expr;
615 ret = AVERROR(EINVAL);
616 goto fail;
617 }
618 eval_w = scale->var_values[VAR_OUT_W] = scale->var_values[VAR_OW] = (int) res == 0 ? inlink->w : (int) res;
619
620 scale->w = eval_w;
621 scale->h = eval_h;
622
623 return 0;
624
625fail:
627 "Error when evaluating the expression '%s'.\n", expr);
628 return ret;
629}
630
631static int config_props(AVFilterLink *outlink)
632{
633 AVFilterContext *ctx = outlink->src;
634 AVFilterLink *inlink0 = outlink->src->inputs[0];
635 AVFilterLink *inlink = IS_SCALE2REF(ctx) ?
636 outlink->src->inputs[1] :
637 outlink->src->inputs[0];
638 ScaleContext *scale = ctx->priv;
639 uint8_t *flags_val = NULL;
640 double w_adj = 1.0;
641 int ret;
642
643 if ((ret = scale_eval_dimensions(ctx)) < 0)
644 goto fail;
645
646 outlink->w = scale->w;
647 outlink->h = scale->h;
648
649 if (scale->reset_sar)
650 w_adj = IS_SCALE2REF(ctx) ? scale->var_values[VAR_S2R_MAIN_SAR] :
651 scale->var_values[VAR_SAR];
652
653 ret = ff_scale_adjust_dimensions(inlink, &outlink->w, &outlink->h,
654 scale->force_original_aspect_ratio,
655 scale->force_divisible_by, w_adj);
656
657 if (ret < 0)
658 goto fail;
659
660 if (outlink->w > INT_MAX ||
661 outlink->h > INT_MAX ||
662 (outlink->h * (uint64_t)inlink->w) > INT_MAX ||
663 (outlink->w * (uint64_t)inlink->h) > INT_MAX)
664 av_log(ctx, AV_LOG_ERROR, "Rescaled value for width or height is too big.\n");
665
666 /* TODO: make algorithm configurable */
667
668 if (scale->reset_sar)
669 outlink->sample_aspect_ratio = (AVRational){1, 1};
670 else if (inlink0->sample_aspect_ratio.num){
671 AVRational q = av_div_q((AVRational){inlink0->w, inlink0->h}, (AVRational){outlink->w, outlink->h});
672 outlink->sample_aspect_ratio = av_mul_q(q, inlink0->sample_aspect_ratio);
673 } else
674 outlink->sample_aspect_ratio = inlink0->sample_aspect_ratio;
675
676 av_opt_get(scale->sws, "sws_flags", 0, &flags_val);
677 av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d fmt:%s csp:%s range:%s sar:%d/%d -> w:%d h:%d fmt:%s csp:%s range:%s sar:%d/%d flags:%s\n",
678 inlink ->w, inlink ->h, av_get_pix_fmt_name( inlink->format),
681 outlink->w, outlink->h, av_get_pix_fmt_name(outlink->format),
684 flags_val);
685 av_freep(&flags_val);
686
687 if (inlink->w != outlink->w || inlink->h != outlink->h) {
690 }
691
692 if (scale->in_primaries != scale->out_primaries || scale->in_transfer != scale->out_transfer) {
695 }
696
697 if (!IS_SCALE2REF(ctx)) {
699 ret = ff_framesync_init(&scale->fs, ctx, ctx->nb_inputs);
700 if (ret < 0)
701 return ret;
702 scale->fs.on_event = do_scale;
703 scale->fs.in[0].time_base = ctx->inputs[0]->time_base;
704 scale->fs.in[0].sync = 1;
705 scale->fs.in[0].before = EXT_STOP;
706 scale->fs.in[0].after = EXT_STOP;
707 if (scale->uses_ref) {
708 av_assert0(ctx->nb_inputs == 2);
709 scale->fs.in[1].time_base = ctx->inputs[1]->time_base;
710 scale->fs.in[1].sync = 0;
711 scale->fs.in[1].before = EXT_NULL;
712 scale->fs.in[1].after = EXT_INFINITY;
713 }
714
715 ret = ff_framesync_configure(&scale->fs);
716 if (ret < 0)
717 return ret;
718 }
719
720 return 0;
721
722fail:
723 return ret;
724}
725
726static int config_props_ref(AVFilterLink *outlink)
727{
728 AVFilterLink *inlink = outlink->src->inputs[1];
729 FilterLink *il = ff_filter_link(inlink);
730 FilterLink *ol = ff_filter_link(outlink);
731
732 outlink->w = inlink->w;
733 outlink->h = inlink->h;
734 outlink->sample_aspect_ratio = inlink->sample_aspect_ratio;
735 outlink->time_base = inlink->time_base;
736 ol->frame_rate = il->frame_rate;
737 outlink->colorspace = inlink->colorspace;
738 outlink->color_range = inlink->color_range;
739
740 return 0;
741}
742
743static int request_frame(AVFilterLink *outlink)
744{
745 return ff_request_frame(outlink->src->inputs[0]);
746}
747
748static int request_frame_ref(AVFilterLink *outlink)
749{
750 return ff_request_frame(outlink->src->inputs[1]);
751}
752
753/* Takes over ownership of *frame_in, passes ownership of *frame_out to caller */
754static int scale_frame(AVFilterLink *link, AVFrame **frame_in,
755 AVFrame **frame_out)
756{
757 FilterLink *inl = ff_filter_link(link);
758 AVFilterContext *ctx = link->dst;
759 ScaleContext *scale = ctx->priv;
760 AVFilterLink *outlink = ctx->outputs[0];
761 AVFrame *out, *in = *frame_in;
763 char buf[32];
764 int ret, flags_orig, frame_changed;
765
766 *frame_in = NULL;
767
768 frame_changed = in->width != link->w ||
769 in->height != link->h ||
770 in->format != link->format ||
773 in->colorspace != link->colorspace ||
774 in->color_range != link->color_range;
775
776 if (scale->eval_mode == EVAL_MODE_FRAME || frame_changed) {
777 unsigned vars_w[VARS_NB] = { 0 }, vars_h[VARS_NB] = { 0 };
778
779 av_expr_count_vars(scale->w_pexpr, vars_w, VARS_NB);
780 av_expr_count_vars(scale->h_pexpr, vars_h, VARS_NB);
781
782 if (scale->eval_mode == EVAL_MODE_FRAME &&
783 !frame_changed &&
784 !IS_SCALE2REF(ctx) &&
785 !(vars_w[VAR_N] || vars_w[VAR_T]) &&
786 !(vars_h[VAR_N] || vars_h[VAR_T]) &&
787 scale->w && scale->h)
788 goto scale;
789
790 if (scale->eval_mode == EVAL_MODE_INIT) {
791 snprintf(buf, sizeof(buf) - 1, "%d", scale->w);
792 av_opt_set(scale, "w", buf, 0);
793 snprintf(buf, sizeof(buf) - 1, "%d", scale->h);
794 av_opt_set(scale, "h", buf, 0);
795
796 ret = scale_parse_expr(ctx, NULL, &scale->w_pexpr, "width", scale->w_expr);
797 if (ret < 0)
798 goto err;
799
800 ret = scale_parse_expr(ctx, NULL, &scale->h_pexpr, "height", scale->h_expr);
801 if (ret < 0)
802 goto err;
803 }
804
805 if (IS_SCALE2REF(ctx)) {
806 scale->var_values[VAR_S2R_MAIN_N] = inl->frame_count_out;
807 scale->var_values[VAR_S2R_MAIN_T] = TS2T(in->pts, link->time_base);
808 } else {
809 scale->var_values[VAR_N] = inl->frame_count_out;
810 scale->var_values[VAR_T] = TS2T(in->pts, link->time_base);
811 }
812
813 link->format = in->format;
814 link->w = in->width;
815 link->h = in->height;
816 link->colorspace = in->colorspace;
817 link->color_range = in->color_range;
819
820 if ((ret = config_props(outlink)) < 0)
821 goto err;
822 }
823
824scale:
825 scale->hsub = desc->log2_chroma_w;
826 scale->vsub = desc->log2_chroma_h;
827
828 out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
829 if (!out) {
830 ret = AVERROR(ENOMEM);
831 goto err;
832 }
833
834 if (scale->in_color_matrix != -1)
835 in->colorspace = scale->in_color_matrix;
836 if (scale->in_primaries != -1)
837 in->color_primaries = scale->in_primaries;
838 if (scale->in_transfer != -1)
839 in->color_trc = scale->in_transfer;
840 if (scale->in_range != AVCOL_RANGE_UNSPECIFIED)
841 in->color_range = scale->in_range;
842 if (scale->in_chroma_loc != AVCHROMA_LOC_UNSPECIFIED)
843 in->chroma_location = scale->in_chroma_loc;
844
845 flags_orig = in->flags;
846 if (scale->interlaced > 0)
848 else if (!scale->interlaced)
850
852 out->width = outlink->w;
853 out->height = outlink->h;
854 out->color_range = outlink->color_range;
855 out->colorspace = outlink->colorspace;
856 out->alpha_mode = outlink->alpha_mode;
858 out->chroma_location = outlink->chroma_location;
859 if (scale->out_chroma_loc != AVCHROMA_LOC_UNSPECIFIED)
860 out->chroma_location = scale->out_chroma_loc;
861 if (scale->out_primaries != -1)
862 out->color_primaries = scale->out_primaries;
863 if (scale->out_transfer != -1)
864 out->color_trc = scale->out_transfer;
865
866 if (out->width != in->width || out->height != in->height) {
867 av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data,
869 }
870
871 if (in->color_primaries != out->color_primaries || in->color_trc != out->color_trc) {
872 av_frame_side_data_remove_by_props(&out->side_data, &out->nb_side_data,
874 }
875
876 if (scale->reset_sar) {
877 out->sample_aspect_ratio = outlink->sample_aspect_ratio;
878 } else {
879 av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den,
880 (int64_t)in->sample_aspect_ratio.num * outlink->h * link->w,
881 (int64_t)in->sample_aspect_ratio.den * outlink->w * link->h,
882 INT_MAX);
883 }
884
885 if (sws_is_noop(out, in)) {
886 in->chroma_location = out->chroma_location;
888 in->flags = flags_orig;
889 *frame_out = in;
890 return 0;
891 }
892
893 if (out->format == AV_PIX_FMT_PAL8) {
894 out->format = AV_PIX_FMT_BGR8;
895 avpriv_set_systematic_pal2((uint32_t*) out->data[1], out->format);
896 }
897
898 ret = sws_scale_frame(scale->sws, out, in);
899 av_frame_free(&in);
900 out->flags = flags_orig;
901 out->format = outlink->format; /* undo PAL8 handling */
902 if (ret < 0)
904 *frame_out = out;
905 return ret;
906
907err:
908 av_frame_free(&in);
909 return ret;
910}
911
913{
914 AVFilterContext *ctx = fs->parent;
915 ScaleContext *scale = ctx->priv;
916 AVFilterLink *outlink = ctx->outputs[0];
917 AVFrame *out, *in = NULL, *ref = NULL;
918 int ret = 0, frame_changed;
919
920 ret = ff_framesync_get_frame(fs, 0, &in, 1);
921 if (ret < 0)
922 goto err;
923
924 if (scale->uses_ref) {
925 ret = ff_framesync_get_frame(fs, 1, &ref, 0);
926 if (ret < 0)
927 goto err;
928 }
929
930 if (ref) {
931 AVFilterLink *reflink = ctx->inputs[1];
932 FilterLink *rl = ff_filter_link(reflink);
933
934 frame_changed = ref->width != reflink->w ||
935 ref->height != reflink->h ||
936 ref->format != reflink->format ||
937 ref->sample_aspect_ratio.den != reflink->sample_aspect_ratio.den ||
938 ref->sample_aspect_ratio.num != reflink->sample_aspect_ratio.num ||
939 ref->colorspace != reflink->colorspace ||
940 ref->color_range != reflink->color_range;
941
942 if (frame_changed) {
943 reflink->format = ref->format;
944 reflink->w = ref->width;
945 reflink->h = ref->height;
946 reflink->sample_aspect_ratio.num = ref->sample_aspect_ratio.num;
947 reflink->sample_aspect_ratio.den = ref->sample_aspect_ratio.den;
948 reflink->colorspace = ref->colorspace;
949 reflink->color_range = ref->color_range;
950
951 ret = config_props(outlink);
952 if (ret < 0)
953 goto err;
954 }
955
956 if (scale->eval_mode == EVAL_MODE_FRAME) {
957 scale->var_values[VAR_REF_N] = rl->frame_count_out;
958 scale->var_values[VAR_REF_T] = TS2T(ref->pts, reflink->time_base);
959 }
960 }
961
962 ret = scale_frame(ctx->inputs[0], &in, &out);
963 if (ret < 0)
964 goto err;
965
967 out->pts = av_rescale_q_rnd(fs->pts, fs->time_base, outlink->time_base, AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX);
968 return ff_filter_frame(outlink, out);
969
970err:
971 av_frame_free(&in);
972 return ret;
973}
974
975static int filter_frame(AVFilterLink *link, AVFrame *in)
976{
977 AVFilterContext *ctx = link->dst;
978 AVFilterLink *outlink = ctx->outputs[0];
979 AVFrame *out;
980 int ret;
981
982 ret = scale_frame(link, &in, &out);
983 if (out)
984 return ff_filter_frame(outlink, out);
985
986 return ret;
987}
988
990{
991 FilterLink *l = ff_filter_link(link);
992 ScaleContext *scale = link->dst->priv;
993 AVFilterLink *outlink = link->dst->outputs[1];
994 int frame_changed;
995
996 frame_changed = in->width != link->w ||
997 in->height != link->h ||
998 in->format != link->format ||
1001 in->colorspace != link->colorspace ||
1002 in->color_range != link->color_range;
1003
1004 if (frame_changed) {
1005 link->format = in->format;
1006 link->w = in->width;
1007 link->h = in->height;
1010 link->colorspace = in->colorspace;
1011 link->color_range = in->color_range;
1012
1013 config_props_ref(outlink);
1014 }
1015
1016 if (scale->eval_mode == EVAL_MODE_FRAME) {
1017 scale->var_values[VAR_N] = l->frame_count_out;
1018 scale->var_values[VAR_T] = TS2T(in->pts, link->time_base);
1019 }
1020
1021 return ff_filter_frame(outlink, in);
1022}
1023
1024static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
1025 char *res, int res_len, int flags)
1026{
1027 ScaleContext *scale = ctx->priv;
1028 char *str_expr;
1029 AVExpr **pexpr_ptr;
1030 int ret, w, h;
1031
1032 w = !strcmp(cmd, "width") || !strcmp(cmd, "w");
1033 h = !strcmp(cmd, "height") || !strcmp(cmd, "h");
1034
1035 if (w || h) {
1036 str_expr = w ? scale->w_expr : scale->h_expr;
1037 pexpr_ptr = w ? &scale->w_pexpr : &scale->h_pexpr;
1038
1039 ret = scale_parse_expr(ctx, str_expr, pexpr_ptr, cmd, args);
1040 } else
1041 ret = AVERROR(ENOSYS);
1042
1043 if (ret < 0)
1044 av_log(ctx, AV_LOG_ERROR, "Failed to process command. Continuing with existing parameters.\n");
1045
1046 return ret;
1047}
1048
1050{
1051 ScaleContext *scale = ctx->priv;
1052 return ff_framesync_activate(&scale->fs);
1053}
1054
1055static const AVClass *child_class_iterate(void **iter)
1056{
1057 switch ((uintptr_t) *iter) {
1058 case 0:
1059 *iter = (void*)(uintptr_t) 1;
1060 return sws_get_class();
1061 case 1:
1062 *iter = (void*)(uintptr_t) 2;
1063 return &ff_framesync_class;
1064 }
1065
1066 return NULL;
1067}
1068
1069static void *child_next(void *obj, void *prev)
1070{
1071 ScaleContext *s = obj;
1072 if (!prev)
1073 return s->sws;
1074 if (prev == s->sws)
1075 return &s->fs;
1076 return NULL;
1077}
1078
1079#define OFFSET(x) offsetof(ScaleContext, x)
1080#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
1081#define TFLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
1082
1083static const AVOption scale_options[] = {
1084 { "w", "Output video width", OFFSET(w_expr), AV_OPT_TYPE_STRING, .flags = TFLAGS },
1085 { "width", "Output video width", OFFSET(w_expr), AV_OPT_TYPE_STRING, .flags = TFLAGS },
1086 { "h", "Output video height", OFFSET(h_expr), AV_OPT_TYPE_STRING, .flags = TFLAGS },
1087 { "height","Output video height", OFFSET(h_expr), AV_OPT_TYPE_STRING, .flags = TFLAGS },
1088 { "flags", "Flags to pass to libswscale", OFFSET(flags_str), AV_OPT_TYPE_STRING, { .str = "" }, .flags = FLAGS },
1089 { "interl", "set interlacing", OFFSET(interlaced), AV_OPT_TYPE_BOOL, {.i64 = 0 }, -1, 1, FLAGS },
1090 { "size", "set video size", OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, .flags = FLAGS },
1091 { "s", "set video size", OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, .flags = FLAGS },
1092 { "in_color_matrix", "set input YCbCr type", OFFSET(in_color_matrix), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AVCOL_SPC_NB-1, .flags = FLAGS, .unit = "color" },
1093 { "out_color_matrix", "set output YCbCr type", OFFSET(out_color_matrix), AV_OPT_TYPE_INT, { .i64 = AVCOL_SPC_UNSPECIFIED }, 0, AVCOL_SPC_NB-1, .flags = FLAGS, .unit = "color"},
1094 { "auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, .unit = "color" },
1095 { "bt601", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT470BG}, 0, 0, FLAGS, .unit = "color" },
1096 { "bt470", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT470BG}, 0, 0, FLAGS, .unit = "color" },
1097 { "smpte170m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT470BG}, 0, 0, FLAGS, .unit = "color" },
1098 { "bt470bg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT470BG}, 0, 0, FLAGS, .unit = "color" },
1099 { "bt709", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT709}, 0, 0, FLAGS, .unit = "color" },
1100 { "fcc", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_FCC}, 0, 0, FLAGS, .unit = "color" },
1101 { "smpte240m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_SMPTE240M}, 0, 0, FLAGS, .unit = "color" },
1102 { "bt2020", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT2020_NCL}, 0, 0, FLAGS, .unit = "color" },
1103 { "bt2020nc", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_SPC_BT2020_NCL}, 0, 0, FLAGS, .unit = "color" },
1104 { "in_range", "set input color range", OFFSET( in_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 2, FLAGS, .unit = "range" },
1105 { "out_range", "set output color range", OFFSET(out_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 2, FLAGS, .unit = "range" },
1106 { "auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_UNSPECIFIED }, 0, 0, FLAGS, .unit = "range" },
1107 { "unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_UNSPECIFIED }, 0, 0, FLAGS, .unit = "range" },
1108 { "full", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, .unit = "range" },
1109 { "limited", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG}, 0, 0, FLAGS, .unit = "range" },
1110 { "jpeg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, .unit = "range" },
1111 { "mpeg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG}, 0, 0, FLAGS, .unit = "range" },
1112 { "tv", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_MPEG}, 0, 0, FLAGS, .unit = "range" },
1113 { "pc", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_RANGE_JPEG}, 0, 0, FLAGS, .unit = "range" },
1114 { "in_chroma_loc", "set input chroma sample location", OFFSET(in_chroma_loc), AV_OPT_TYPE_INT, { .i64 = AVCHROMA_LOC_UNSPECIFIED }, 0, AVCHROMA_LOC_NB-1, .flags = FLAGS, .unit = "chroma_loc" },
1115 { "out_chroma_loc", "set output chroma sample location", OFFSET(out_chroma_loc), AV_OPT_TYPE_INT, { .i64 = AVCHROMA_LOC_UNSPECIFIED }, 0, AVCHROMA_LOC_NB-1, .flags = FLAGS, .unit = "chroma_loc" },
1116 {"auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_UNSPECIFIED}, 0, 0, FLAGS, .unit = "chroma_loc"},
1117 {"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_UNSPECIFIED}, 0, 0, FLAGS, .unit = "chroma_loc"},
1118 {"left", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_LEFT}, 0, 0, FLAGS, .unit = "chroma_loc"},
1119 {"center", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_CENTER}, 0, 0, FLAGS, .unit = "chroma_loc"},
1120 {"topleft", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_TOPLEFT}, 0, 0, FLAGS, .unit = "chroma_loc"},
1121 {"top", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_TOP}, 0, 0, FLAGS, .unit = "chroma_loc"},
1122 {"bottomleft", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_BOTTOMLEFT}, 0, 0, FLAGS, .unit = "chroma_loc"},
1123 {"bottom", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCHROMA_LOC_BOTTOM}, 0, 0, FLAGS, .unit = "chroma_loc"},
1124 { "in_primaries", "set input primaries", OFFSET(in_primaries), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AVCOL_PRI_NB-1, .flags = FLAGS, .unit = "primaries" },
1125 { "out_primaries", "set output primaries", OFFSET(out_primaries), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AVCOL_PRI_NB-1, .flags = FLAGS, .unit = "primaries"},
1126 {"auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, .unit = "primaries"},
1127 {"bt709", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT709}, 0, 0, FLAGS, .unit = "primaries"},
1128 {"bt470m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT470M}, 0, 0, FLAGS, .unit = "primaries"},
1129 {"bt470bg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT470BG}, 0, 0, FLAGS, .unit = "primaries"},
1130 {"smpte170m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE170M}, 0, 0, FLAGS, .unit = "primaries"},
1131 {"smpte240m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE240M}, 0, 0, FLAGS, .unit = "primaries"},
1132 {"film", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_FILM}, 0, 0, FLAGS, .unit = "primaries"},
1133 {"bt2020", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_BT2020}, 0, 0, FLAGS, .unit = "primaries"},
1134 {"smpte428", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE428}, 0, 0, FLAGS, .unit = "primaries"},
1135 {"smpte431", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE431}, 0, 0, FLAGS, .unit = "primaries"},
1136 {"smpte432", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_SMPTE432}, 0, 0, FLAGS, .unit = "primaries"},
1137 {"jedec-p22", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_JEDEC_P22}, 0, 0, FLAGS, .unit = "primaries"},
1138 {"ebu3213", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_PRI_EBU3213}, 0, 0, FLAGS, .unit = "primaries"},
1139 { "in_transfer", "set output color transfer", OFFSET(in_transfer), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AVCOL_TRC_NB-1, .flags = FLAGS, .unit = "transfer"},
1140 {"out_transfer", "set output color transfer", OFFSET(out_transfer), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, AVCOL_TRC_NB-1, .flags = FLAGS, .unit = "transfer"},
1141 {"auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64=-1}, 0, 0, FLAGS, .unit = "transfer"},
1142 {"bt709", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT709}, 0, 0, FLAGS, .unit = "transfer"},
1143 {"bt470m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_GAMMA22}, 0, 0, FLAGS, .unit = "transfer"},
1144 {"gamma22", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_GAMMA22}, 0, 0, FLAGS, .unit = "transfer"},
1145 {"bt470bg", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_GAMMA28}, 0, 0, FLAGS, .unit = "transfer"},
1146 {"gamma28", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_GAMMA28}, 0, 0, FLAGS, .unit = "transfer"},
1147 {"smpte170m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE170M}, 0, 0, FLAGS, .unit = "transfer"},
1148 {"smpte240m", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE240M}, 0, 0, FLAGS, .unit = "transfer"},
1149 {"linear", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_LINEAR}, 0, 0, FLAGS, .unit = "transfer"},
1150 {"iec61966-2-1", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_IEC61966_2_1}, 0, 0, FLAGS, .unit = "transfer"},
1151 {"srgb", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_IEC61966_2_1}, 0, 0, FLAGS, .unit = "transfer"},
1152 {"iec61966-2-4", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_IEC61966_2_4}, 0, 0, FLAGS, .unit = "transfer"},
1153 {"xvycc", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_IEC61966_2_4}, 0, 0, FLAGS, .unit = "transfer"},
1154 {"bt1361e", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT1361_ECG}, 0, 0, FLAGS, .unit = "transfer"},
1155 {"bt2020-10", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT2020_10}, 0, 0, FLAGS, .unit = "transfer"},
1156 {"bt2020-12", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_BT2020_12}, 0, 0, FLAGS, .unit = "transfer"},
1157 {"smpte2084", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE2084}, 0, 0, FLAGS, .unit = "transfer"},
1158 {"smpte428", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_SMPTE428}, 0, 0, FLAGS, .unit = "transfer"},
1159 {"arib-std-b67", NULL, 0, AV_OPT_TYPE_CONST, {.i64=AVCOL_TRC_ARIB_STD_B67}, 0, 0, FLAGS, .unit = "transfer"},
1160 { "in_v_chr_pos", "input vertical chroma position in luma grid/256" , OFFSET(in_v_chr_pos), AV_OPT_TYPE_INT, { .i64 = -513}, -513, 512, FLAGS },
1161 { "in_h_chr_pos", "input horizontal chroma position in luma grid/256", OFFSET(in_h_chr_pos), AV_OPT_TYPE_INT, { .i64 = -513}, -513, 512, FLAGS },
1162 { "out_v_chr_pos", "output vertical chroma position in luma grid/256" , OFFSET(out_v_chr_pos), AV_OPT_TYPE_INT, { .i64 = -513}, -513, 512, FLAGS },
1163 { "out_h_chr_pos", "output horizontal chroma position in luma grid/256", OFFSET(out_h_chr_pos), AV_OPT_TYPE_INT, { .i64 = -513}, -513, 512, FLAGS },
1164 { "force_original_aspect_ratio", "decrease or increase w/h if necessary to keep the original AR", OFFSET(force_original_aspect_ratio), AV_OPT_TYPE_INT, { .i64 = 0}, 0, SCALE_FORCE_OAR_NB-1, FLAGS, .unit = "force_oar" },
1165 { "disable", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = SCALE_FORCE_OAR_DISABLE }, 0, 0, FLAGS, .unit = "force_oar" },
1166 { "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = SCALE_FORCE_OAR_DECREASE }, 0, 0, FLAGS, .unit = "force_oar" },
1167 { "increase", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = SCALE_FORCE_OAR_INCREASE }, 0, 0, FLAGS, .unit = "force_oar" },
1168 { "force_divisible_by", "enforce that the output resolution is divisible by a defined integer when force_original_aspect_ratio is used", OFFSET(force_divisible_by), AV_OPT_TYPE_INT, { .i64 = 1}, 1, 256, FLAGS },
1169 { "reset_sar", "reset SAR to 1 and scale to square pixels if scaling proportionally", OFFSET(reset_sar), AV_OPT_TYPE_BOOL, { .i64 = 0}, 0, 1, FLAGS },
1170 { "param0", "Scaler param 0", OFFSET(param[0]), AV_OPT_TYPE_DOUBLE, { .dbl = DBL_MAX }, -DBL_MAX, DBL_MAX, FLAGS },
1171 { "param1", "Scaler param 1", OFFSET(param[1]), AV_OPT_TYPE_DOUBLE, { .dbl = DBL_MAX }, -DBL_MAX, DBL_MAX, FLAGS },
1172 { "eval", "specify when to evaluate expressions", OFFSET(eval_mode), AV_OPT_TYPE_INT, {.i64 = EVAL_MODE_INIT}, 0, EVAL_MODE_NB-1, FLAGS, .unit = "eval" },
1173 { "init", "eval expressions once during initialization", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_INIT}, .flags = FLAGS, .unit = "eval" },
1174 { "frame", "eval expressions during initialization and per-frame", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_FRAME}, .flags = FLAGS, .unit = "eval" },
1175 { NULL }
1176};
1177
1178static const AVClass scale_class = {
1179 .class_name = "scale",
1180 .item_name = av_default_item_name,
1181 .option = scale_options,
1182 .version = LIBAVUTIL_VERSION_INT,
1183 .category = AV_CLASS_CATEGORY_FILTER,
1184 .child_class_iterate = child_class_iterate,
1185 .child_next = child_next,
1186};
1187
1189 {
1190 .name = "default",
1191 .type = AVMEDIA_TYPE_VIDEO,
1192 },
1193};
1194
1196 {
1197 .name = "default",
1198 .type = AVMEDIA_TYPE_VIDEO,
1199 .config_props = config_props,
1200 },
1201};
1202
1204 .p.name = "scale",
1205 .p.description = NULL_IF_CONFIG_SMALL("Scale the input video size and/or convert the image format."),
1206 .p.priv_class = &scale_class,
1208 .preinit = preinit,
1209 .init = init,
1210 .uninit = uninit,
1211 .priv_size = sizeof(ScaleContext),
1215 .activate = activate,
1216 .process_command = process_command,
1217};
1218
1219static const AVClass *scale2ref_child_class_iterate(void **iter)
1220{
1221 const AVClass *c = *iter ? NULL : sws_get_class();
1222 *iter = (void*)(uintptr_t)c;
1223 return c;
1224}
1225
1226static void *scale2ref_child_next(void *obj, void *prev)
1227{
1228 ScaleContext *s = obj;
1229 if (!prev)
1230 return s->sws;
1231 return NULL;
1232}
1233
1234static const AVClass scale2ref_class = {
1235 .class_name = "scale(2ref)",
1236 .item_name = av_default_item_name,
1237 .option = scale_options,
1238 .version = LIBAVUTIL_VERSION_INT,
1239 .category = AV_CLASS_CATEGORY_FILTER,
1240 .child_class_iterate = scale2ref_child_class_iterate,
1241 .child_next = scale2ref_child_next,
1242};
1243
1245 {
1246 .name = "default",
1247 .type = AVMEDIA_TYPE_VIDEO,
1248 .filter_frame = filter_frame,
1249 },
1250 {
1251 .name = "ref",
1252 .type = AVMEDIA_TYPE_VIDEO,
1253 .filter_frame = filter_frame_ref,
1254 },
1255};
1256
1258 {
1259 .name = "default",
1260 .type = AVMEDIA_TYPE_VIDEO,
1261 .config_props = config_props,
1262 .request_frame= request_frame,
1263 },
1264 {
1265 .name = "ref",
1266 .type = AVMEDIA_TYPE_VIDEO,
1267 .config_props = config_props_ref,
1268 .request_frame= request_frame_ref,
1269 },
1270};
1271
1273 .p.name = "scale2ref",
1274 .p.description = NULL_IF_CONFIG_SMALL("Scale the input video size and/or convert the image format to the given reference."),
1275 .p.priv_class = &scale2ref_class,
1276 .preinit = preinit,
1277 .init = init,
1278 .uninit = uninit,
1279 .priv_size = sizeof(ScaleContext),
1283 .process_command = process_command,
1284};
@ VAR_T
Definition aeval.c:53
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition aeval.c:246
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
static int request_frame(AVFilterLink *outlink)
Definition af_aecho.c:272
#define TFLAGS
Definition af_afade.c:66
EvalMode
Definition af_volume.h:39
@ EVAL_MODE_NB
Definition af_volume.h:42
@ EVAL_MODE_FRAME
Definition af_volume.h:41
const FFFilter ff_vf_scale
Definition vf_scale.c:1203
const FFFilter ff_vf_scale2ref
Definition vf_scale.c:1272
static FILE * out
static AVFormatContext * ctx
#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:1073
int ff_append_inpad(AVFilterContext *f, AVFilterPad *p)
Append a new input/output pad to the filter's list of such pads.
Definition avfilter.c:127
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
Definition avfilter.c:486
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition avfilter.c:851
Main libavfilter public API header.
@ VAR_VSUB
Definition boxblur.c:42
@ VARS_NB
Definition boxblur.c:43
@ VAR_HSUB
Definition boxblur.c:41
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define fs(width, name, subs,...)
Definition cbs_vp9.c:200
#define FLAGS
Definition cmdutils.c:596
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static enum AVPixelFormat pix_fmt
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
Definition dolby_e.c:1067
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
Definition eval.c:368
int av_expr_count_vars(AVExpr *e, unsigned *counter, int size)
Track the presence of variables and their number of occurrences in a parsed expression.
Definition eval.c:814
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
@ VAR_IW
Definition f_select.c:147
@ VAR_IH
Definition f_select.c:146
int ff_formats_ref(AVFilterFormats *f, AVFilterFormats **ref)
Add ref as a new reference to formats.
Definition formats.c:776
AVFilterFormats * ff_all_color_spaces(void)
Construct an AVFilterFormats representing all possible color spaces.
Definition formats.c:706
AVFilterFormats * ff_make_formats_list_singleton(int fmt)
Equivalent to ff_make_format_list({const int[]}{ fmt, -1 })
Definition formats.c:605
int ff_add_format(AVFilterFormats **avff, int64_t fmt)
Add fmt to the list of media formats contained in *avff.
Definition formats.c:580
AVFilterFormats * ff_all_color_ranges(void)
Construct an AVFilterFormats representing all possible color ranges.
Definition formats.c:722
AVFilterFormats * ff_all_chroma_locations(void)
Construct an AVFilterFormats representing all possible chroma locations.
Definition formats.c:744
int ff_framesync_configure(FFFrameSync *fs)
Configure a frame sync structure.
Definition framesync.c:137
int ff_framesync_activate(FFFrameSync *fs)
Examine the frames in the filter's input and try to produce output.
Definition framesync.c:352
int ff_framesync_get_frame(FFFrameSync *fs, unsigned in, AVFrame **rframe, unsigned get)
Get the current frame in an input.
Definition framesync.c:269
void ff_framesync_uninit(FFFrameSync *fs)
Free all memory currently allocated.
Definition framesync.c:301
const AVClass ff_framesync_class
Definition framesync.c:54
void ff_framesync_preinit(FFFrameSync *fs)
Pre-initialize a frame sync structure.
Definition framesync.c:78
int ff_framesync_init(FFFrameSync *fs, AVFilterContext *parent, unsigned nb_in)
Initialize a frame sync structure.
Definition framesync.c:86
@ EXT_INFINITY
Extend the frame to infinity.
Definition framesync.h:75
#define fail
Definition test.h:479
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition opt.h:298
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
Definition opt.h:266
@ 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_DYNAMIC_INPUTS
The number of the filter inputs is not determined just by AVFilter.inputs.
Definition avfilter.h:161
#define AVERROR(e)
Definition error.h:45
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition frame.h:702
void av_frame_side_data_remove_by_props(AVFrameSideData ***sd, int *nb_sd, int props)
Remove and free all side data instances that match any of the given side data properties.
Definition side_data.c:124
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition frame.c:599
@ AV_SIDE_DATA_PROP_SIZE_DEPENDENT
Side data depends on the video dimensions.
Definition frame.h:361
@ AV_SIDE_DATA_PROP_COLOR_DEPENDENT
Side data depends on the video color space.
Definition frame.h:368
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition rational.c:80
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition rational.c:35
AVRational av_div_q(AVRational b, AVRational c)
Divide one rational by another.
Definition rational.c:88
int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, enum AVRounding rnd)
Rescale a 64-bit integer by 2 rational numbers with specified rounding.
@ AV_ROUND_PASS_MINMAX
Flag telling rescaling functions to pass INT64_MIN/MAX through unchanged, avoiding special cases for ...
@ AV_ROUND_NEAR_INF
Round to nearest and halfway cases away from zero.
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
Definition avutil.h:311
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
int sws_test_transfer(enum AVColorTransferCharacteristic trc, int output)
Test if a given color transfer function is supported.
Definition format.c:677
int sws_test_colorspace(enum AVColorSpace csp, int output)
Test if a given color space is supported.
Definition format.c:653
int sws_scale_frame(SwsContext *sws, AVFrame *dst, const AVFrame *src)
Scale source data from src and write the output to dst.
Definition swscale.c:1405
int sws_test_primaries(enum AVColorPrimaries prim, int output)
Test if a given set of color primaries is supported.
Definition format.c:670
int sws_is_noop(const AVFrame *dst, const AVFrame *src)
Check if a given conversion is a noop.
Definition format.c:719
SwsContext * sws_alloc_context(void)
Allocate an empty SwsContext and set its fields to default values.
Definition utils.c:1051
void sws_free_context(SwsContext **ctx)
Free the context and everything associated with it, and write NULL to the provided pointer.
Definition utils.c:2374
const AVClass * sws_get_class(void)
Get the AVClass for SwsContext.
Definition options.c:133
int sws_test_format(enum AVPixelFormat format, int output)
Test if a given (software) pixel format is supported by any backend, excluding unstable backends.
Definition format.c:637
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
Definition opt.c:1291
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition opt.c:891
int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt)
Definition imgutils.c:178
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition intra.c:278
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int activate(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
#define TS2T(ts, tb)
Definition filters.h:483
static FilterLink * ff_filter_link(AVFilterLink *link)
Definition filters.h:199
#define FILTER_QUERY_FUNC2(func)
Definition filters.h:241
#define av_cold
Definition attributes.h:117
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:97
const char * desc
Definition libsvtav1.c:83
uint8_t w
Definition llvidencdsp.c:39
@ AV_CLASS_CATEGORY_FILTER
Definition log.h:36
#define FFSWAP(type, a, b)
Definition macros.h:52
#define NAN
Memory handling functions.
static const char * obj
Definition mscl.c:57
uint8_t interlaced
Definition mxfenc.c:2336
var_name
Definition noise.c:46
@ VAR_N
Definition noise.c:47
static const char *const var_names[]
Definition noise.c:30
#define av_strdup(s)
Definition ops_static.c:55
AVOptions.
@ EXT_STOP
Completely stop all streams with this one.
Definition packetsync.h:62
@ EXT_NULL
Ignore this stream and continue processing the other ones.
Definition packetsync.h:67
int av_parse_video_size(int *width_ptr, int *height_ptr, const char *str)
Parse str and put in width_ptr and height_ptr the detected values.
Definition parseutils.c:150
misc parsing utilities
enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
Definition pixdesc.c:3479
const AVPixFmtDescriptor * av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
Iterate over all pixel format descriptors known to libavutil.
Definition pixdesc.c:3467
const char * av_color_space_name(enum AVColorSpace space)
Definition pixdesc.c:3860
const char * av_color_range_name(enum AVColorRange range)
Definition pixdesc.c:3776
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition pixdesc.c:3380
const char * av_color_transfer_name(enum AVColorTransferCharacteristic transfer)
Definition pixdesc.c:3827
const char * av_color_primaries_name(enum AVColorPrimaries primaries)
Definition pixdesc.c:3794
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3460
pixel format definitions
@ AVCHROMA_LOC_TOP
Definition pixfmt.h:807
@ AVCHROMA_LOC_BOTTOM
Definition pixfmt.h:809
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
Definition pixfmt.h:806
@ AVCHROMA_LOC_NB
Not part of ABI.
Definition pixfmt.h:810
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
Definition pixfmt.h:804
@ AVCHROMA_LOC_BOTTOMLEFT
Definition pixfmt.h:808
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
Definition pixfmt.h:805
@ AVCHROMA_LOC_UNSPECIFIED
Definition pixfmt.h:803
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition pixfmt.h:766
@ AVCOL_RANGE_UNSPECIFIED
Definition pixfmt.h:749
@ AVCOL_RANGE_JPEG
Full range content.
Definition pixfmt.h:783
@ AVALPHA_MODE_STRAIGHT
Alpha channel is independent of color values.
Definition pixfmt.h:819
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_BGR8
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
Definition pixfmt.h:90
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition pixfmt.h:84
@ AVCOL_PRI_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
Definition pixfmt.h:649
@ AVCOL_PRI_NB
Not part of ABI.
Definition pixfmt.h:660
@ AVCOL_PRI_FILM
colour filters using Illuminant C
Definition pixfmt.h:652
@ AVCOL_PRI_SMPTE432
SMPTE ST 432-1 (2010) / P3 D65 / Display P3.
Definition pixfmt.h:657
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
Definition pixfmt.h:644
@ AVCOL_PRI_JEDEC_P22
Definition pixfmt.h:659
@ AVCOL_PRI_SMPTE240M
identical to above, also called "SMPTE C" even though it uses D65
Definition pixfmt.h:651
@ AVCOL_PRI_EBU3213
EBU Tech. 3213-E (nothing there) / one of JEDEC P22 group phosphors.
Definition pixfmt.h:658
@ AVCOL_PRI_SMPTE431
SMPTE ST 431-2 (2011) / DCI P3.
Definition pixfmt.h:656
@ AVCOL_PRI_SMPTE428
SMPTE ST 428-1 (CIE 1931 XYZ)
Definition pixfmt.h:654
@ AVCOL_PRI_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
Definition pixfmt.h:650
@ AVCOL_PRI_BT2020
ITU-R BT2020.
Definition pixfmt.h:653
@ AVCOL_PRI_BT470M
also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
Definition pixfmt.h:647
@ AVCOL_TRC_SMPTE170M
also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC
Definition pixfmt.h:679
@ AVCOL_TRC_SMPTE2084
SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems.
Definition pixfmt.h:689
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
Definition pixfmt.h:677
@ AVCOL_TRC_BT1361_ECG
ITU-R BT1361 Extended Colour Gamut.
Definition pixfmt.h:685
@ AVCOL_TRC_SMPTE240M
Definition pixfmt.h:680
@ AVCOL_TRC_IEC61966_2_4
IEC 61966-2-4.
Definition pixfmt.h:684
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
Definition pixfmt.h:681
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
Definition pixfmt.h:678
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
Definition pixfmt.h:693
@ AVCOL_TRC_SMPTE428
SMPTE ST 428-1.
Definition pixfmt.h:691
@ AVCOL_TRC_BT2020_12
ITU-R BT2020 for 12-bit system.
Definition pixfmt.h:688
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
Definition pixfmt.h:686
@ AVCOL_TRC_BT2020_10
ITU-R BT2020 for 10-bit system.
Definition pixfmt.h:687
@ AVCOL_TRC_BT709
also ITU-R BT1361
Definition pixfmt.h:674
@ AVCOL_TRC_NB
Not part of ABI.
Definition pixfmt.h:694
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
Definition pixfmt.h:708
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
Definition pixfmt.h:712
@ AVCOL_SPC_NB
Not part of ABI.
Definition pixfmt.h:726
@ AVCOL_SPC_BT2020_NCL
ITU-R BT2020 non-constant luminance system.
Definition pixfmt.h:717
@ AVCOL_SPC_UNSPECIFIED
Definition pixfmt.h:709
@ AVCOL_SPC_FCC
FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
Definition pixfmt.h:711
@ AVCOL_SPC_SMPTE240M
derived from 170M primaries and D65 white point, 170M is derived from BT470 System M's primaries
Definition pixfmt.h:714
@ VAR_OUT_H
Definition scale_eval.c:47
@ VAR_SAR
Definition scale_eval.c:49
@ VAR_OH
Definition scale_eval.c:47
@ VAR_IN_W
Definition scale_eval.c:44
@ VAR_OW
Definition scale_eval.c:46
@ VAR_OHSUB
Definition scale_eval.c:53
@ VAR_A
Definition scale_eval.c:48
@ VAR_OUT_W
Definition scale_eval.c:46
@ VAR_OVSUB
Definition scale_eval.c:54
@ VAR_IN_H
Definition scale_eval.c:45
@ VAR_DAR
Definition scale_eval.c:50
int ff_scale_adjust_dimensions(AVFilterLink *inlink, int *ret_w, int *ret_h, int force_original_aspect_ratio, int force_divisible_by, double w_adj)
Transform evaluated width and height obtained from ff_scale_eval_dimensions into actual target width ...
Definition scale_eval.c:123
@ SCALE_FORCE_OAR_DISABLE
Definition scale_eval.h:25
@ SCALE_FORCE_OAR_NB
Definition scale_eval.h:28
@ SCALE_FORCE_OAR_INCREASE
Definition scale_eval.h:27
@ SCALE_FORCE_OAR_DECREASE
Definition scale_eval.h:26
formats
Definition signature.h:47
#define FF_ARRAY_ELEMS(a)
static av_cold int preinit(AVBitStreamFilterContext *ctx)
Definition source.c:137
static int config_props(AVBitStreamFilterLink *link)
Definition source.c:181
Describe the class of an AVClass context structure.
Definition log.h:76
Definition eval.c:171
An instance of a filter.
Definition avfilter.h:279
AVFilterLink ** inputs
array of pointers to input links
Definition avfilter.h:287
void * priv
private data for use by the filter
Definition avfilter.h:294
AVFilterLink ** outputs
array of pointers to output links
Definition avfilter.h:291
Lists of formats / etc.
Definition avfilter.h:120
A list of supported formats for one end of a filter link.
Definition formats.h:64
A filter pad used for either input or output.
Definition filters.h:40
This structure describes decoded (raw) audio or video data.
Definition frame.h:479
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition frame.h:581
enum AVChromaLocation chroma_location
Definition frame.h:743
int width
Definition frame.h:551
int height
Definition frame.h:551
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition frame.h:723
enum AVColorPrimaries color_primaries
Definition frame.h:732
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
Definition frame.h:576
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition frame.h:730
enum AVColorSpace colorspace
YUV colorspace type.
Definition frame.h:741
enum AVColorTransferCharacteristic color_trc
Definition frame.h:734
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition frame.h:566
AVOption.
Definition opt.h:428
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition pixdesc.h:80
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition pixdesc.h:89
Rational number (pair of numerator and denominator).
Definition rational.h:58
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
Frame sync structure.
Definition framesync.h:168
int in_h_chr_pos
Definition vf_scale.c:168
int w
New dimensions.
Definition vf_scale.c:138
FFFrameSync fs
Definition vf_scale.c:130
double param[2]
Definition vf_scale.c:140
int eval_mode
expression evaluation mode
Definition vf_scale.c:175
int out_h_chr_pos
Definition vf_scale.c:166
int slice_y
top of current output slice
Definition vf_scale.c:143
int force_original_aspect_ratio
Definition vf_scale.c:171
int out_primaries
Definition vf_scale.c:158
char * flags_str
Definition vf_scale.c:153
int out_color_matrix
Definition vf_scale.c:156
int in_v_chr_pos
Definition vf_scale.c:169
int out_chroma_loc
Definition vf_scale.c:165
AVExpr * w_pexpr
Definition vf_scale.c:149
char * size_str
Definition vf_scale.c:139
char * w_expr
width expression string
Definition vf_scale.c:147
char * h_expr
height expression string
Definition vf_scale.c:148
int in_chroma_loc
Definition vf_scale.c:164
int vsub
chroma subsampling
Definition vf_scale.c:142
int in_primaries
Definition vf_scale.c:157
AVExpr * h_pexpr
Definition vf_scale.c:150
int out_transfer
Definition vf_scale.c:160
int in_color_matrix
Definition vf_scale.c:155
int out_v_chr_pos
Definition vf_scale.c:167
int force_divisible_by
Definition vf_scale.c:172
SwsContext * sws
Definition vf_scale.c:129
double var_values[VARS_NB]
Definition vf_scale.c:151
int in_transfer
Definition vf_scale.c:159
Main external API structure.
Definition swscale.h:227
external API header
#define av_free(p)
#define av_freep(p)
#define av_log(a,...)
static int ref[MAX_W *MAX_W]
@ EVAL_MODE_INIT
Definition vf_fftfilt.c:41
static int do_scale(FFFrameSync *fs)
Definition vf_scale.c:912
@ VAR_S2R_MAIN_SAR
Definition vf_scale.c:111
@ VAR_REF_A
Definition vf_scale.c:100
@ VAR_REF_DAR
Definition vf_scale.c:102
@ VAR_REF_T
Definition vf_scale.c:106
@ VARS_NB
Definition vf_scale.c:118
@ VAR_REF_VSUB
Definition vf_scale.c:104
@ VAR_REF_H
Definition vf_scale.c:99
@ VAR_S2R_MAIN_H
Definition vf_scale.c:109
@ VAR_REF_N
Definition vf_scale.c:105
@ VAR_RW
Definition vf_scale.c:98
@ VAR_S2R_MAIN_W
Definition vf_scale.c:108
@ VAR_S2R_MAIN_N
Definition vf_scale.c:115
@ VAR_RH
Definition vf_scale.c:99
@ VAR_S2R_MAIN_DAR
Definition vf_scale.c:112
@ VAR_REF_HSUB
Definition vf_scale.c:103
@ VAR_S2R_MAIN_POS
Definition vf_scale.c:117
@ VAR_S2R_MAIN_T
Definition vf_scale.c:116
@ VAR_REF_W
Definition vf_scale.c:98
@ VAR_REF_POS
Definition vf_scale.c:107
@ VAR_S2R_MAIN_A
Definition vf_scale.c:110
@ VAR_S2R_MDAR
Definition vf_scale.c:112
@ VAR_S2R_MAIN_VSUB
Definition vf_scale.c:114
@ VAR_REF_SAR
Definition vf_scale.c:101
@ VAR_S2R_MAIN_HSUB
Definition vf_scale.c:113
@ VAR_RDAR
Definition vf_scale.c:102
static void * child_next(void *obj, void *prev)
Definition vf_scale.c:1069
static int config_props(AVFilterLink *outlink)
Definition vf_scale.c:631
static int request_frame_ref(AVFilterLink *outlink)
Definition vf_scale.c:748
static int scale_eval_dimensions(AVFilterContext *ctx)
Definition vf_scale.c:542
static const AVClass scale_class
Definition vf_scale.c:1178
static int filter_frame_ref(AVFilterLink *link, AVFrame *in)
Definition vf_scale.c:989
static const AVFilterPad avfilter_vf_scale_outputs[]
Definition vf_scale.c:1195
static void * scale2ref_child_next(void *obj, void *prev)
Definition vf_scale.c:1226
static int filter_frame(AVFilterLink *link, AVFrame *in)
Definition vf_scale.c:975
static const AVClass * child_class_iterate(void **iter)
Definition vf_scale.c:1055
static const AVClass scale2ref_class
Definition vf_scale.c:1234
static int scale_frame(AVFilterLink *link, AVFrame **frame_in, AVFrame **frame_out)
Definition vf_scale.c:754
static int request_frame(AVFilterLink *outlink)
Definition vf_scale.c:743
static int config_props_ref(AVFilterLink *outlink)
Definition vf_scale.c:726
static int scale_parse_expr(AVFilterContext *ctx, char *str_expr, AVExpr **pexpr_ptr, const char *var, const char *args)
Definition vf_scale.c:257
static const AVFilterPad avfilter_vf_scale2ref_inputs[]
Definition vf_scale.c:1244
static const AVClass * scale2ref_child_class_iterate(void **iter)
Definition vf_scale.c:1219
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
Definition vf_scale.c:451
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
Definition vf_scale.c:1024
static int check_exprs(AVFilterContext *ctx)
Definition vf_scale.c:184
static int activate(AVFilterContext *ctx)
Definition vf_scale.c:1049
static av_cold void uninit(AVFilterContext *ctx)
Definition vf_scale.c:441
static av_cold int preinit(AVFilterContext *ctx)
Definition vf_scale.c:310
#define IS_SCALE2REF(ctx)
Definition vf_scale.c:180
static const AVFilterPad avfilter_vf_scale_inputs[]
Definition vf_scale.c:1188
static const AVOption scale_options[]
Definition vf_scale.c:1083
#define OFFSET(x)
Definition vf_scale.c:1079
static const AVFilterPad avfilter_vf_scale2ref_outputs[]
Definition vf_scale.c:1257
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition video.c:90
static double c[64]