FFmpeg
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 "formats.h"
32 #include "internal.h"
33 #include "scale_eval.h"
34 #include "video.h"
35 #include "libavutil/avstring.h"
36 #include "libavutil/eval.h"
37 #include "libavutil/internal.h"
38 #include "libavutil/mathematics.h"
39 #include "libavutil/opt.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/pixdesc.h"
42 #include "libavutil/imgutils.h"
43 #include "libswscale/swscale.h"
44 
45 static const char *const var_names[] = {
46  "in_w", "iw",
47  "in_h", "ih",
48  "out_w", "ow",
49  "out_h", "oh",
50  "a",
51  "sar",
52  "dar",
53  "hsub",
54  "vsub",
55  "ohsub",
56  "ovsub",
57  "n",
58  "t",
59 #if FF_API_FRAME_PKT
60  "pos",
61 #endif
62  "main_w",
63  "main_h",
64  "main_a",
65  "main_sar",
66  "main_dar", "mdar",
67  "main_hsub",
68  "main_vsub",
69  "main_n",
70  "main_t",
71  "main_pos",
72  NULL
73 };
74 
75 enum var_name {
89 #if FF_API_FRAME_PKT
90  VAR_POS,
91 #endif
103 };
104 
105 enum EvalMode {
109 };
110 
111 typedef struct ScaleContext {
112  const AVClass *class;
113  struct SwsContext *sws; ///< software scaler context
114  struct SwsContext *isws[2]; ///< software scaler context for interlaced material
115  // context used for forwarding options to sws
117 
118  /**
119  * New dimensions. Special values are:
120  * 0 = original width/height
121  * -1 = keep original aspect
122  * -N = try to keep aspect but make sure it is divisible by N
123  */
124  int w, h;
125  char *size_str;
126  double param[2]; // sws params
127 
128  int hsub, vsub; ///< chroma subsampling
129  int slice_y; ///< top of current output slice
130  int input_is_pal; ///< set to 1 if the input format is paletted
131  int output_is_pal; ///< set to 1 if the output format is paletted
133 
134  char *w_expr; ///< width expression string
135  char *h_expr; ///< height expression string
139 
140  char *flags_str;
141 
144 
145  int in_range;
147 
152 
155 
156  int eval_mode; ///< expression evaluation mode
157 
158 } ScaleContext;
159 
161 
162 static int config_props(AVFilterLink *outlink);
163 
165 {
166  ScaleContext *scale = ctx->priv;
167  unsigned vars_w[VARS_NB] = { 0 }, vars_h[VARS_NB] = { 0 };
168 
169  if (!scale->w_pexpr && !scale->h_pexpr)
170  return AVERROR(EINVAL);
171 
172  if (scale->w_pexpr)
173  av_expr_count_vars(scale->w_pexpr, vars_w, VARS_NB);
174  if (scale->h_pexpr)
175  av_expr_count_vars(scale->h_pexpr, vars_h, VARS_NB);
176 
177  if (vars_w[VAR_OUT_W] || vars_w[VAR_OW]) {
178  av_log(ctx, AV_LOG_ERROR, "Width expression cannot be self-referencing: '%s'.\n", scale->w_expr);
179  return AVERROR(EINVAL);
180  }
181 
182  if (vars_h[VAR_OUT_H] || vars_h[VAR_OH]) {
183  av_log(ctx, AV_LOG_ERROR, "Height expression cannot be self-referencing: '%s'.\n", scale->h_expr);
184  return AVERROR(EINVAL);
185  }
186 
187  if ((vars_w[VAR_OUT_H] || vars_w[VAR_OH]) &&
188  (vars_h[VAR_OUT_W] || vars_h[VAR_OW])) {
189  av_log(ctx, AV_LOG_WARNING, "Circular references detected for width '%s' and height '%s' - possibly invalid.\n", scale->w_expr, scale->h_expr);
190  }
191 
192  if (ctx->filter != &ff_vf_scale2ref &&
193  (vars_w[VAR_S2R_MAIN_W] || vars_h[VAR_S2R_MAIN_W] ||
194  vars_w[VAR_S2R_MAIN_H] || vars_h[VAR_S2R_MAIN_H] ||
195  vars_w[VAR_S2R_MAIN_A] || vars_h[VAR_S2R_MAIN_A] ||
196  vars_w[VAR_S2R_MAIN_SAR] || vars_h[VAR_S2R_MAIN_SAR] ||
197  vars_w[VAR_S2R_MAIN_DAR] || vars_h[VAR_S2R_MAIN_DAR] ||
198  vars_w[VAR_S2R_MDAR] || vars_h[VAR_S2R_MDAR] ||
199  vars_w[VAR_S2R_MAIN_HSUB] || vars_h[VAR_S2R_MAIN_HSUB] ||
200  vars_w[VAR_S2R_MAIN_VSUB] || vars_h[VAR_S2R_MAIN_VSUB] ||
201  vars_w[VAR_S2R_MAIN_N] || vars_h[VAR_S2R_MAIN_N] ||
202  vars_w[VAR_S2R_MAIN_T] || vars_h[VAR_S2R_MAIN_T] ||
203  vars_w[VAR_S2R_MAIN_POS] || vars_h[VAR_S2R_MAIN_POS]) ) {
204  av_log(ctx, AV_LOG_ERROR, "Expressions with scale2ref variables are not valid in scale filter.\n");
205  return AVERROR(EINVAL);
206  }
207 
208  if (scale->eval_mode == EVAL_MODE_INIT &&
209  (vars_w[VAR_N] || vars_h[VAR_N] ||
210  vars_w[VAR_T] || vars_h[VAR_T] ||
212  vars_w[VAR_POS] || vars_h[VAR_POS] ||
213 #endif
214  vars_w[VAR_S2R_MAIN_N] || vars_h[VAR_S2R_MAIN_N] ||
215  vars_w[VAR_S2R_MAIN_T] || vars_h[VAR_S2R_MAIN_T] ||
216  vars_w[VAR_S2R_MAIN_POS] || vars_h[VAR_S2R_MAIN_POS]) ) {
217  av_log(ctx, AV_LOG_ERROR, "Expressions with frame variables 'n', 't', 'pos' are not valid in init eval_mode.\n");
218  return AVERROR(EINVAL);
219  }
220 
221  return 0;
222 }
223 
224 static int scale_parse_expr(AVFilterContext *ctx, char *str_expr, AVExpr **pexpr_ptr, const char *var, const char *args)
225 {
226  ScaleContext *scale = ctx->priv;
227  int ret, is_inited = 0;
228  char *old_str_expr = NULL;
229  AVExpr *old_pexpr = NULL;
230 
231  if (str_expr) {
232  old_str_expr = av_strdup(str_expr);
233  if (!old_str_expr)
234  return AVERROR(ENOMEM);
235  av_opt_set(scale, var, args, 0);
236  }
237 
238  if (*pexpr_ptr) {
239  old_pexpr = *pexpr_ptr;
240  *pexpr_ptr = NULL;
241  is_inited = 1;
242  }
243 
244  ret = av_expr_parse(pexpr_ptr, args, var_names,
245  NULL, NULL, NULL, NULL, 0, ctx);
246  if (ret < 0) {
247  av_log(ctx, AV_LOG_ERROR, "Cannot parse expression for %s: '%s'\n", var, args);
248  goto revert;
249  }
250 
251  ret = check_exprs(ctx);
252  if (ret < 0)
253  goto revert;
254 
255  if (is_inited && (ret = config_props(ctx->outputs[0])) < 0)
256  goto revert;
257 
258  av_expr_free(old_pexpr);
259  old_pexpr = NULL;
260  av_freep(&old_str_expr);
261 
262  return 0;
263 
264 revert:
265  av_expr_free(*pexpr_ptr);
266  *pexpr_ptr = NULL;
267  if (old_str_expr) {
268  av_opt_set(scale, var, old_str_expr, 0);
269  av_free(old_str_expr);
270  }
271  if (old_pexpr)
272  *pexpr_ptr = old_pexpr;
273 
274  return ret;
275 }
276 
278 {
279  ScaleContext *scale = ctx->priv;
280  int ret;
281 
282  scale->sws_opts = sws_alloc_context();
283  if (!scale->sws_opts)
284  return AVERROR(ENOMEM);
285 
286  // set threads=0, so we can later check whether the user modified it
287  ret = av_opt_set_int(scale->sws_opts, "threads", 0, 0);
288  if (ret < 0)
289  return ret;
290 
291  return 0;
292 }
293 
294 static const int sws_colorspaces[] = {
303  -1
304 };
305 
307 {
308  ScaleContext *scale = ctx->priv;
309  int64_t threads;
310  int ret;
311 
312  if (scale->size_str && (scale->w_expr || scale->h_expr)) {
314  "Size and width/height expressions cannot be set at the same time.\n");
315  return AVERROR(EINVAL);
316  }
317 
318  if (scale->w_expr && !scale->h_expr)
319  FFSWAP(char *, scale->w_expr, scale->size_str);
320 
321  if (scale->size_str) {
322  char buf[32];
323  if ((ret = av_parse_video_size(&scale->w, &scale->h, scale->size_str)) < 0) {
325  "Invalid size '%s'\n", scale->size_str);
326  return ret;
327  }
328  snprintf(buf, sizeof(buf)-1, "%d", scale->w);
329  av_opt_set(scale, "w", buf, 0);
330  snprintf(buf, sizeof(buf)-1, "%d", scale->h);
331  av_opt_set(scale, "h", buf, 0);
332  }
333  if (!scale->w_expr)
334  av_opt_set(scale, "w", "iw", 0);
335  if (!scale->h_expr)
336  av_opt_set(scale, "h", "ih", 0);
337 
338  ret = scale_parse_expr(ctx, NULL, &scale->w_pexpr, "width", scale->w_expr);
339  if (ret < 0)
340  return ret;
341 
342  ret = scale_parse_expr(ctx, NULL, &scale->h_pexpr, "height", scale->h_expr);
343  if (ret < 0)
344  return ret;
345 
346  if (scale->in_color_matrix != -1 &&
347  !ff_fmt_is_in(scale->in_color_matrix, sws_colorspaces)) {
348  av_log(ctx, AV_LOG_ERROR, "Unsupported input color matrix '%s'\n",
349  av_color_space_name(scale->in_color_matrix));
350  return AVERROR(EINVAL);
351  }
352 
353  if (!ff_fmt_is_in(scale->out_color_matrix, sws_colorspaces)) {
354  av_log(ctx, AV_LOG_ERROR, "Unsupported output color matrix '%s'\n",
355  av_color_space_name(scale->out_color_matrix));
356  return AVERROR(EINVAL);
357  }
358 
359  av_log(ctx, AV_LOG_VERBOSE, "w:%s h:%s flags:'%s' interl:%d\n",
360  scale->w_expr, scale->h_expr, (char *)av_x_if_null(scale->flags_str, ""), scale->interlaced);
361 
362  if (scale->flags_str && *scale->flags_str) {
363  ret = av_opt_set(scale->sws_opts, "sws_flags", scale->flags_str, 0);
364  if (ret < 0)
365  return ret;
366  }
367 
368  for (int i = 0; i < FF_ARRAY_ELEMS(scale->param); i++)
369  if (scale->param[i] != DBL_MAX) {
370  ret = av_opt_set_double(scale->sws_opts, i ? "param1" : "param0",
371  scale->param[i], 0);
372  if (ret < 0)
373  return ret;
374  }
375 
376  // use generic thread-count if the user did not set it explicitly
377  ret = av_opt_get_int(scale->sws_opts, "threads", 0, &threads);
378  if (ret < 0)
379  return ret;
380  if (!threads)
381  av_opt_set_int(scale->sws_opts, "threads", ff_filter_get_nb_threads(ctx), 0);
382 
383  return 0;
384 }
385 
387 {
388  ScaleContext *scale = ctx->priv;
389  av_expr_free(scale->w_pexpr);
390  av_expr_free(scale->h_pexpr);
391  scale->w_pexpr = scale->h_pexpr = NULL;
392  sws_freeContext(scale->sws_opts);
393  sws_freeContext(scale->sws);
394  sws_freeContext(scale->isws[0]);
395  sws_freeContext(scale->isws[1]);
396  scale->sws = NULL;
397 }
398 
400 {
401  ScaleContext *scale = ctx->priv;
403  const AVPixFmtDescriptor *desc;
404  enum AVPixelFormat pix_fmt;
405  int ret;
406 
407  desc = NULL;
408  formats = NULL;
409  while ((desc = av_pix_fmt_desc_next(desc))) {
413  && (ret = ff_add_format(&formats, pix_fmt)) < 0) {
414  return ret;
415  }
416  }
417  if ((ret = ff_formats_ref(formats, &ctx->inputs[0]->outcfg.formats)) < 0)
418  return ret;
419 
420  desc = NULL;
421  formats = NULL;
422  while ((desc = av_pix_fmt_desc_next(desc))) {
426  && (ret = ff_add_format(&formats, pix_fmt)) < 0) {
427  return ret;
428  }
429  }
430  if ((ret = ff_formats_ref(formats, &ctx->outputs[0]->incfg.formats)) < 0)
431  return ret;
432 
433  /* accept all supported inputs, even if user overrides their properties */
435  &ctx->inputs[0]->outcfg.color_spaces)) < 0)
436  return ret;
437 
439  &ctx->inputs[0]->outcfg.color_ranges)) < 0)
440  return ret;
441 
442  /* propagate output properties if overridden */
443  formats = scale->out_color_matrix != AVCOL_SPC_UNSPECIFIED
444  ? ff_make_formats_list_singleton(scale->out_color_matrix)
446  if ((ret = ff_formats_ref(formats, &ctx->outputs[0]->incfg.color_spaces)) < 0)
447  return ret;
448 
449  formats = scale->out_range != AVCOL_RANGE_UNSPECIFIED
452  if ((ret = ff_formats_ref(formats, &ctx->outputs[0]->incfg.color_ranges)) < 0)
453  return ret;
454 
455  return 0;
456 }
457 
459 {
460  ScaleContext *scale = ctx->priv;
461  const char scale2ref = ctx->filter == &ff_vf_scale2ref;
462  const AVFilterLink *inlink = scale2ref ? ctx->inputs[1] : ctx->inputs[0];
463  const AVFilterLink *outlink = ctx->outputs[0];
465  const AVPixFmtDescriptor *out_desc = av_pix_fmt_desc_get(outlink->format);
466  char *expr;
467  int eval_w, eval_h;
468  int ret;
469  double res;
470  const AVPixFmtDescriptor *main_desc;
471  const AVFilterLink *main_link;
472 
473  if (scale2ref) {
474  main_link = ctx->inputs[0];
475  main_desc = av_pix_fmt_desc_get(main_link->format);
476  }
477 
478  scale->var_values[VAR_IN_W] = scale->var_values[VAR_IW] = inlink->w;
479  scale->var_values[VAR_IN_H] = scale->var_values[VAR_IH] = inlink->h;
480  scale->var_values[VAR_OUT_W] = scale->var_values[VAR_OW] = NAN;
481  scale->var_values[VAR_OUT_H] = scale->var_values[VAR_OH] = NAN;
482  scale->var_values[VAR_A] = (double) inlink->w / inlink->h;
483  scale->var_values[VAR_SAR] = inlink->sample_aspect_ratio.num ?
484  (double) inlink->sample_aspect_ratio.num / inlink->sample_aspect_ratio.den : 1;
485  scale->var_values[VAR_DAR] = scale->var_values[VAR_A] * scale->var_values[VAR_SAR];
486  scale->var_values[VAR_HSUB] = 1 << desc->log2_chroma_w;
487  scale->var_values[VAR_VSUB] = 1 << desc->log2_chroma_h;
488  scale->var_values[VAR_OHSUB] = 1 << out_desc->log2_chroma_w;
489  scale->var_values[VAR_OVSUB] = 1 << out_desc->log2_chroma_h;
490 
491  if (scale2ref) {
492  scale->var_values[VAR_S2R_MAIN_W] = main_link->w;
493  scale->var_values[VAR_S2R_MAIN_H] = main_link->h;
494  scale->var_values[VAR_S2R_MAIN_A] = (double) main_link->w / main_link->h;
495  scale->var_values[VAR_S2R_MAIN_SAR] = main_link->sample_aspect_ratio.num ?
496  (double) main_link->sample_aspect_ratio.num / main_link->sample_aspect_ratio.den : 1;
497  scale->var_values[VAR_S2R_MAIN_DAR] = scale->var_values[VAR_S2R_MDAR] =
498  scale->var_values[VAR_S2R_MAIN_A] * scale->var_values[VAR_S2R_MAIN_SAR];
499  scale->var_values[VAR_S2R_MAIN_HSUB] = 1 << main_desc->log2_chroma_w;
500  scale->var_values[VAR_S2R_MAIN_VSUB] = 1 << main_desc->log2_chroma_h;
501  }
502 
503  res = av_expr_eval(scale->w_pexpr, scale->var_values, NULL);
504  eval_w = scale->var_values[VAR_OUT_W] = scale->var_values[VAR_OW] = (int) res == 0 ? inlink->w : (int) res;
505 
506  res = av_expr_eval(scale->h_pexpr, scale->var_values, NULL);
507  if (isnan(res)) {
508  expr = scale->h_expr;
509  ret = AVERROR(EINVAL);
510  goto fail;
511  }
512  eval_h = scale->var_values[VAR_OUT_H] = scale->var_values[VAR_OH] = (int) res == 0 ? inlink->h : (int) res;
513 
514  res = av_expr_eval(scale->w_pexpr, scale->var_values, NULL);
515  if (isnan(res)) {
516  expr = scale->w_expr;
517  ret = AVERROR(EINVAL);
518  goto fail;
519  }
520  eval_w = scale->var_values[VAR_OUT_W] = scale->var_values[VAR_OW] = (int) res == 0 ? inlink->w : (int) res;
521 
522  scale->w = eval_w;
523  scale->h = eval_h;
524 
525  return 0;
526 
527 fail:
529  "Error when evaluating the expression '%s'.\n", expr);
530  return ret;
531 }
532 
533 static int config_props(AVFilterLink *outlink)
534 {
535  AVFilterContext *ctx = outlink->src;
536  AVFilterLink *inlink0 = outlink->src->inputs[0];
537  AVFilterLink *inlink = ctx->filter == &ff_vf_scale2ref ?
538  outlink->src->inputs[1] :
539  outlink->src->inputs[0];
540  enum AVPixelFormat outfmt = outlink->format;
542  const AVPixFmtDescriptor *outdesc = av_pix_fmt_desc_get(outfmt);
543  ScaleContext *scale = ctx->priv;
544  uint8_t *flags_val = NULL;
545  int in_range, in_colorspace;
546  int ret;
547 
548  if ((ret = scale_eval_dimensions(ctx)) < 0)
549  goto fail;
550 
551  outlink->w = scale->w;
552  outlink->h = scale->h;
553 
554  ret = ff_scale_adjust_dimensions(inlink, &outlink->w, &outlink->h,
555  scale->force_original_aspect_ratio,
556  scale->force_divisible_by);
557 
558  if (ret < 0)
559  goto fail;
560 
561  if (outlink->w > INT_MAX ||
562  outlink->h > INT_MAX ||
563  (outlink->h * inlink->w) > INT_MAX ||
564  (outlink->w * inlink->h) > INT_MAX)
565  av_log(ctx, AV_LOG_ERROR, "Rescaled value for width or height is too big.\n");
566 
567  /* TODO: make algorithm configurable */
568 
569  scale->input_is_pal = desc->flags & AV_PIX_FMT_FLAG_PAL;
570  if (outfmt == AV_PIX_FMT_PAL8) outfmt = AV_PIX_FMT_BGR8;
571  scale->output_is_pal = av_pix_fmt_desc_get(outfmt)->flags & AV_PIX_FMT_FLAG_PAL;
572 
573  in_range = scale->in_range;
574  if (in_range == AVCOL_RANGE_UNSPECIFIED)
575  in_range = inlink0->color_range;
576 
577  in_colorspace = scale->in_color_matrix;
578  if (in_colorspace == -1 /* auto */)
579  in_colorspace = inlink0->colorspace;
580 
581  if (scale->sws)
582  sws_freeContext(scale->sws);
583  if (scale->isws[0])
584  sws_freeContext(scale->isws[0]);
585  if (scale->isws[1])
586  sws_freeContext(scale->isws[1]);
587  scale->isws[0] = scale->isws[1] = scale->sws = NULL;
588  if (inlink0->w == outlink->w &&
589  inlink0->h == outlink->h &&
590  in_range == outlink->color_range &&
591  in_colorspace == outlink->colorspace &&
592  inlink0->format == outlink->format)
593  ;
594  else {
595  struct SwsContext **swscs[3] = {&scale->sws, &scale->isws[0], &scale->isws[1]};
596  int i;
597 
598  for (i = 0; i < 3; i++) {
599  int in_v_chr_pos = scale->in_v_chr_pos, out_v_chr_pos = scale->out_v_chr_pos;
600  int in_full, out_full, brightness, contrast, saturation;
601  const int *inv_table, *table;
602  struct SwsContext *const s = sws_alloc_context();
603  if (!s)
604  return AVERROR(ENOMEM);
605  *swscs[i] = s;
606 
607  ret = av_opt_copy(s, scale->sws_opts);
608  if (ret < 0)
609  return ret;
610 
611  av_opt_set_int(s, "srcw", inlink0 ->w, 0);
612  av_opt_set_int(s, "srch", inlink0 ->h >> !!i, 0);
613  av_opt_set_int(s, "src_format", inlink0->format, 0);
614  av_opt_set_int(s, "dstw", outlink->w, 0);
615  av_opt_set_int(s, "dsth", outlink->h >> !!i, 0);
616  av_opt_set_int(s, "dst_format", outfmt, 0);
617  if (in_range != AVCOL_RANGE_UNSPECIFIED)
618  av_opt_set_int(s, "src_range",
619  in_range == AVCOL_RANGE_JPEG, 0);
620  if (outlink->color_range != AVCOL_RANGE_UNSPECIFIED)
621  av_opt_set_int(s, "dst_range",
622  outlink->color_range == AVCOL_RANGE_JPEG, 0);
623 
624  /* Override chroma location default settings to have the correct
625  * chroma positions. MPEG chroma positions are used by convention.
626  * Note that this works for both MPEG-1/JPEG and MPEG-2/4 chroma
627  * locations, since they share a vertical alignment */
628  if (desc->log2_chroma_h == 1 && scale->in_v_chr_pos == -513) {
629  in_v_chr_pos = (i == 0) ? 128 : (i == 1) ? 64 : 192;
630  }
631 
632  if (outdesc->log2_chroma_h == 1 && scale->out_v_chr_pos == -513) {
633  out_v_chr_pos = (i == 0) ? 128 : (i == 1) ? 64 : 192;
634  }
635 
636  av_opt_set_int(s, "src_h_chr_pos", scale->in_h_chr_pos, 0);
637  av_opt_set_int(s, "src_v_chr_pos", in_v_chr_pos, 0);
638  av_opt_set_int(s, "dst_h_chr_pos", scale->out_h_chr_pos, 0);
639  av_opt_set_int(s, "dst_v_chr_pos", out_v_chr_pos, 0);
640 
641  if ((ret = sws_init_context(s, NULL, NULL)) < 0)
642  return ret;
643 
644  sws_getColorspaceDetails(s, (int **)&inv_table, &in_full,
645  (int **)&table, &out_full,
647 
648  if (scale->in_color_matrix == -1 /* auto */)
649  inv_table = sws_getCoefficients(inlink0->colorspace);
650  else if (scale->in_color_matrix != AVCOL_SPC_UNSPECIFIED)
651  inv_table = sws_getCoefficients(scale->in_color_matrix);
652  if (outlink->colorspace != AVCOL_SPC_UNSPECIFIED)
654  else if (scale->in_color_matrix != AVCOL_SPC_UNSPECIFIED)
655  table = inv_table;
656 
657  sws_setColorspaceDetails(s, inv_table, in_full,
658  table, out_full,
660 
661  if (!scale->interlaced)
662  break;
663  }
664  }
665 
666  if (inlink0->sample_aspect_ratio.num){
667  outlink->sample_aspect_ratio = av_mul_q((AVRational){outlink->h * inlink0->w, outlink->w * inlink0->h}, inlink0->sample_aspect_ratio);
668  } else
669  outlink->sample_aspect_ratio = inlink0->sample_aspect_ratio;
670 
671  if (scale->sws)
672  av_opt_get(scale->sws, "sws_flags", 0, &flags_val);
673 
674  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",
675  inlink ->w, inlink ->h, av_get_pix_fmt_name( inlink->format),
676  av_color_space_name(inlink->colorspace), av_color_range_name(inlink->color_range),
677  inlink->sample_aspect_ratio.num, inlink->sample_aspect_ratio.den,
678  outlink->w, outlink->h, av_get_pix_fmt_name(outlink->format),
680  outlink->sample_aspect_ratio.num, outlink->sample_aspect_ratio.den,
681  flags_val);
682  av_freep(&flags_val);
683 
684  return 0;
685 
686 fail:
687  return ret;
688 }
689 
690 static int config_props_ref(AVFilterLink *outlink)
691 {
692  AVFilterLink *inlink = outlink->src->inputs[1];
693 
694  outlink->w = inlink->w;
695  outlink->h = inlink->h;
696  outlink->sample_aspect_ratio = inlink->sample_aspect_ratio;
697  outlink->time_base = inlink->time_base;
698  outlink->frame_rate = inlink->frame_rate;
699  outlink->colorspace = inlink->colorspace;
700  outlink->color_range = inlink->color_range;
701 
702  return 0;
703 }
704 
705 static int request_frame(AVFilterLink *outlink)
706 {
707  return ff_request_frame(outlink->src->inputs[0]);
708 }
709 
710 static int request_frame_ref(AVFilterLink *outlink)
711 {
712  return ff_request_frame(outlink->src->inputs[1]);
713 }
714 
715 static void frame_offset(AVFrame *frame, int dir, int is_pal)
716 {
717  for (int i = 0; i < 4 && frame->data[i]; i++) {
718  if (i == 1 && is_pal)
719  break;
720  frame->data[i] += frame->linesize[i] * dir;
721  }
722 }
723 
725  int field)
726 {
727  int orig_h_src = src->height;
728  int orig_h_dst = dst->height;
729  int ret;
730 
731  // offset the data pointers for the bottom field
732  if (field) {
733  frame_offset(src, 1, scale->input_is_pal);
734  frame_offset(dst, 1, scale->output_is_pal);
735  }
736 
737  // take every second line
738  for (int i = 0; i < 4; i++) {
739  src->linesize[i] *= 2;
740  dst->linesize[i] *= 2;
741  }
742  src->height /= 2;
743  dst->height /= 2;
744 
745  ret = sws_scale_frame(scale->isws[field], dst, src);
746  if (ret < 0)
747  return ret;
748 
749  // undo the changes we made above
750  for (int i = 0; i < 4; i++) {
751  src->linesize[i] /= 2;
752  dst->linesize[i] /= 2;
753  }
754  src->height = orig_h_src;
755  dst->height = orig_h_dst;
756 
757  if (field) {
758  frame_offset(src, -1, scale->input_is_pal);
759  frame_offset(dst, -1, scale->output_is_pal);
760  }
761 
762  return 0;
763 }
764 
765 static int scale_frame(AVFilterLink *link, AVFrame *in, AVFrame **frame_out)
766 {
767  AVFilterContext *ctx = link->dst;
768  ScaleContext *scale = ctx->priv;
769  AVFilterLink *outlink = ctx->outputs[0];
770  AVFrame *out;
772  char buf[32];
773  int ret;
774  int frame_changed;
775 
776  *frame_out = NULL;
777  if (in->colorspace == AVCOL_SPC_YCGCO)
778  av_log(link->dst, AV_LOG_WARNING, "Detected unsupported YCgCo colorspace.\n");
779 
780  frame_changed = in->width != link->w ||
781  in->height != link->h ||
782  in->format != link->format ||
785  in->colorspace != link->colorspace ||
786  in->color_range != link->color_range;
787 
788  if (scale->eval_mode == EVAL_MODE_FRAME || frame_changed) {
789  unsigned vars_w[VARS_NB] = { 0 }, vars_h[VARS_NB] = { 0 };
790 
791  av_expr_count_vars(scale->w_pexpr, vars_w, VARS_NB);
792  av_expr_count_vars(scale->h_pexpr, vars_h, VARS_NB);
793 
794  if (scale->eval_mode == EVAL_MODE_FRAME &&
795  !frame_changed &&
796  ctx->filter != &ff_vf_scale2ref &&
797  !(vars_w[VAR_N] || vars_w[VAR_T]
799  || vars_w[VAR_POS]
800 #endif
801  ) &&
802  !(vars_h[VAR_N] || vars_h[VAR_T]
804  || vars_h[VAR_POS]
805 #endif
806  ) &&
807  scale->w && scale->h)
808  goto scale;
809 
810  if (scale->eval_mode == EVAL_MODE_INIT) {
811  snprintf(buf, sizeof(buf) - 1, "%d", scale->w);
812  av_opt_set(scale, "w", buf, 0);
813  snprintf(buf, sizeof(buf) - 1, "%d", scale->h);
814  av_opt_set(scale, "h", buf, 0);
815 
816  ret = scale_parse_expr(ctx, NULL, &scale->w_pexpr, "width", scale->w_expr);
817  if (ret < 0)
818  return ret;
819 
820  ret = scale_parse_expr(ctx, NULL, &scale->h_pexpr, "height", scale->h_expr);
821  if (ret < 0)
822  return ret;
823  }
824 
825  if (ctx->filter == &ff_vf_scale2ref) {
826  scale->var_values[VAR_S2R_MAIN_N] = link->frame_count_out;
827  scale->var_values[VAR_S2R_MAIN_T] = TS2T(in->pts, link->time_base);
828 #if FF_API_FRAME_PKT
830  scale->var_values[VAR_S2R_MAIN_POS] = in->pkt_pos == -1 ? NAN : in->pkt_pos;
832 #endif
833  } else {
834  scale->var_values[VAR_N] = link->frame_count_out;
835  scale->var_values[VAR_T] = TS2T(in->pts, link->time_base);
836 #if FF_API_FRAME_PKT
838  scale->var_values[VAR_POS] = in->pkt_pos == -1 ? NAN : in->pkt_pos;
840 #endif
841  }
842 
843  link->dst->inputs[0]->format = in->format;
844  link->dst->inputs[0]->w = in->width;
845  link->dst->inputs[0]->h = in->height;
846  link->dst->inputs[0]->colorspace = in->colorspace;
847  link->dst->inputs[0]->color_range = in->color_range;
848 
849  link->dst->inputs[0]->sample_aspect_ratio.den = in->sample_aspect_ratio.den;
850  link->dst->inputs[0]->sample_aspect_ratio.num = in->sample_aspect_ratio.num;
851 
852  if ((ret = config_props(outlink)) < 0)
853  return ret;
854  }
855 
856 scale:
857  if (!scale->sws) {
858  *frame_out = in;
859  return 0;
860  }
861 
862  scale->hsub = desc->log2_chroma_w;
863  scale->vsub = desc->log2_chroma_h;
864 
865  out = ff_get_video_buffer(outlink, outlink->w, outlink->h);
866  if (!out) {
867  av_frame_free(&in);
868  return AVERROR(ENOMEM);
869  }
870  *frame_out = out;
871 
873  out->width = outlink->w;
874  out->height = outlink->h;
875  out->color_range = outlink->color_range;
876  out->colorspace = outlink->colorspace;
877 
878  if (scale->output_is_pal)
879  avpriv_set_systematic_pal2((uint32_t*)out->data[1], outlink->format == AV_PIX_FMT_PAL8 ? AV_PIX_FMT_BGR8 : outlink->format);
880 
881  av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den,
882  (int64_t)in->sample_aspect_ratio.num * outlink->h * link->w,
883  (int64_t)in->sample_aspect_ratio.den * outlink->w * link->h,
884  INT_MAX);
885 
886  if (scale->interlaced>0 || (scale->interlaced<0 &&
887  (in->flags & AV_FRAME_FLAG_INTERLACED))) {
888  ret = scale_field(scale, out, in, 0);
889  if (ret >= 0)
890  ret = scale_field(scale, out, in, 1);
891  } else {
892  ret = sws_scale_frame(scale->sws, out, in);
893  }
894 
895  av_frame_free(&in);
896  if (ret < 0)
897  av_frame_free(frame_out);
898  return ret;
899 }
900 
902 {
903  AVFilterContext *ctx = link->dst;
904  AVFilterLink *outlink = ctx->outputs[0];
905  AVFrame *out;
906  int ret;
907 
908  ret = scale_frame(link, in, &out);
909  if (out)
910  return ff_filter_frame(outlink, out);
911 
912  return ret;
913 }
914 
916 {
917  ScaleContext *scale = link->dst->priv;
918  AVFilterLink *outlink = link->dst->outputs[1];
919  int frame_changed;
920 
921  frame_changed = in->width != link->w ||
922  in->height != link->h ||
923  in->format != link->format ||
926  in->colorspace != link->colorspace ||
927  in->color_range != link->color_range;
928 
929  if (frame_changed) {
930  link->format = in->format;
931  link->w = in->width;
932  link->h = in->height;
935  link->colorspace = in->colorspace;
937 
938  config_props_ref(outlink);
939  }
940 
941  if (scale->eval_mode == EVAL_MODE_FRAME) {
942  scale->var_values[VAR_N] = link->frame_count_out;
943  scale->var_values[VAR_T] = TS2T(in->pts, link->time_base);
944 #if FF_API_FRAME_PKT
946  scale->var_values[VAR_POS] = in->pkt_pos == -1 ? NAN : in->pkt_pos;
948 #endif
949  }
950 
951  return ff_filter_frame(outlink, in);
952 }
953 
954 static int process_command(AVFilterContext *ctx, const char *cmd, const char *args,
955  char *res, int res_len, int flags)
956 {
957  ScaleContext *scale = ctx->priv;
958  char *str_expr;
959  AVExpr **pexpr_ptr;
960  int ret, w, h;
961 
962  w = !strcmp(cmd, "width") || !strcmp(cmd, "w");
963  h = !strcmp(cmd, "height") || !strcmp(cmd, "h");
964 
965  if (w || h) {
966  str_expr = w ? scale->w_expr : scale->h_expr;
967  pexpr_ptr = w ? &scale->w_pexpr : &scale->h_pexpr;
968 
969  ret = scale_parse_expr(ctx, str_expr, pexpr_ptr, cmd, args);
970  } else
971  ret = AVERROR(ENOSYS);
972 
973  if (ret < 0)
974  av_log(ctx, AV_LOG_ERROR, "Failed to process command. Continuing with existing parameters.\n");
975 
976  return ret;
977 }
978 
979 static const AVClass *child_class_iterate(void **iter)
980 {
981  const AVClass *c = *iter ? NULL : sws_get_class();
982  *iter = (void*)(uintptr_t)c;
983  return c;
984 }
985 
986 static void *child_next(void *obj, void *prev)
987 {
988  ScaleContext *s = obj;
989  if (!prev)
990  return s->sws_opts;
991  return NULL;
992 }
993 
994 #define OFFSET(x) offsetof(ScaleContext, x)
995 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
996 #define TFLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
997 
998 static const AVOption scale_options[] = {
999  { "w", "Output video width", OFFSET(w_expr), AV_OPT_TYPE_STRING, .flags = TFLAGS },
1000  { "width", "Output video width", OFFSET(w_expr), AV_OPT_TYPE_STRING, .flags = TFLAGS },
1001  { "h", "Output video height", OFFSET(h_expr), AV_OPT_TYPE_STRING, .flags = TFLAGS },
1002  { "height","Output video height", OFFSET(h_expr), AV_OPT_TYPE_STRING, .flags = TFLAGS },
1003  { "flags", "Flags to pass to libswscale", OFFSET(flags_str), AV_OPT_TYPE_STRING, { .str = "" }, .flags = FLAGS },
1004  { "interl", "set interlacing", OFFSET(interlaced), AV_OPT_TYPE_BOOL, {.i64 = 0 }, -1, 1, FLAGS },
1005  { "size", "set video size", OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, FLAGS },
1006  { "s", "set video size", OFFSET(size_str), AV_OPT_TYPE_STRING, {.str = NULL}, 0, FLAGS },
1007  { "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" },
1008  { "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"},
1009  { "auto", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, 0, 0, FLAGS, .unit = "color" },
1010  { "bt601", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT470BG }, 0, 0, FLAGS, .unit = "color" },
1011  { "bt470", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT470BG }, 0, 0, FLAGS, .unit = "color" },
1012  { "smpte170m", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT470BG }, 0, 0, FLAGS, .unit = "color" },
1013  { "bt709", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT709 }, 0, 0, FLAGS, .unit = "color" },
1014  { "fcc", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_FCC }, 0, 0, FLAGS, .unit = "color" },
1015  { "smpte240m", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_SMPTE240M }, 0, 0, FLAGS, .unit = "color" },
1016  { "bt2020", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_SPC_BT2020_NCL }, 0, 0, FLAGS, .unit = "color" },
1017  { "in_range", "set input color range", OFFSET( in_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 2, FLAGS, .unit = "range" },
1018  { "out_range", "set output color range", OFFSET(out_range), AV_OPT_TYPE_INT, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 2, FLAGS, .unit = "range" },
1019  { "auto", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 0, FLAGS, .unit = "range" },
1020  { "unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_UNSPECIFIED }, 0, 0, FLAGS, .unit = "range" },
1021  { "full", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_JPEG}, 0, 0, FLAGS, .unit = "range" },
1022  { "limited",NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_MPEG}, 0, 0, FLAGS, .unit = "range" },
1023  { "jpeg", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_JPEG}, 0, 0, FLAGS, .unit = "range" },
1024  { "mpeg", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_MPEG}, 0, 0, FLAGS, .unit = "range" },
1025  { "tv", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_MPEG}, 0, 0, FLAGS, .unit = "range" },
1026  { "pc", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_RANGE_JPEG}, 0, 0, FLAGS, .unit = "range" },
1027  { "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 },
1028  { "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 },
1029  { "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 },
1030  { "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 },
1031  { "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, 2, FLAGS, .unit = "force_oar" },
1032  { "disable", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 0 }, 0, 0, FLAGS, .unit = "force_oar" },
1033  { "decrease", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1 }, 0, 0, FLAGS, .unit = "force_oar" },
1034  { "increase", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2 }, 0, 0, FLAGS, .unit = "force_oar" },
1035  { "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 },
1036  { "param0", "Scaler param 0", OFFSET(param[0]), AV_OPT_TYPE_DOUBLE, { .dbl = DBL_MAX }, -DBL_MAX, DBL_MAX, FLAGS },
1037  { "param1", "Scaler param 1", OFFSET(param[1]), AV_OPT_TYPE_DOUBLE, { .dbl = DBL_MAX }, -DBL_MAX, DBL_MAX, FLAGS },
1038  { "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" },
1039  { "init", "eval expressions once during initialization", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_INIT}, .flags = FLAGS, .unit = "eval" },
1040  { "frame", "eval expressions during initialization and per-frame", 0, AV_OPT_TYPE_CONST, {.i64=EVAL_MODE_FRAME}, .flags = FLAGS, .unit = "eval" },
1041  { NULL }
1042 };
1043 
1044 static const AVClass scale_class = {
1045  .class_name = "scale(2ref)",
1046  .item_name = av_default_item_name,
1047  .option = scale_options,
1048  .version = LIBAVUTIL_VERSION_INT,
1049  .category = AV_CLASS_CATEGORY_FILTER,
1050  .child_class_iterate = child_class_iterate,
1052 };
1053 
1055  {
1056  .name = "default",
1057  .type = AVMEDIA_TYPE_VIDEO,
1058  .filter_frame = filter_frame,
1059  },
1060 };
1061 
1063  {
1064  .name = "default",
1065  .type = AVMEDIA_TYPE_VIDEO,
1066  .config_props = config_props,
1067  },
1068 };
1069 
1071  .name = "scale",
1072  .description = NULL_IF_CONFIG_SMALL("Scale the input video size and/or convert the image format."),
1073  .preinit = preinit,
1074  .init = init,
1075  .uninit = uninit,
1076  .priv_size = sizeof(ScaleContext),
1077  .priv_class = &scale_class,
1081  .process_command = process_command,
1082 };
1083 
1085  {
1086  .name = "default",
1087  .type = AVMEDIA_TYPE_VIDEO,
1088  .filter_frame = filter_frame,
1089  },
1090  {
1091  .name = "ref",
1092  .type = AVMEDIA_TYPE_VIDEO,
1093  .filter_frame = filter_frame_ref,
1094  },
1095 };
1096 
1098  {
1099  .name = "default",
1100  .type = AVMEDIA_TYPE_VIDEO,
1101  .config_props = config_props,
1102  .request_frame= request_frame,
1103  },
1104  {
1105  .name = "ref",
1106  .type = AVMEDIA_TYPE_VIDEO,
1107  .config_props = config_props_ref,
1108  .request_frame= request_frame_ref,
1109  },
1110 };
1111 
1113  .name = "scale2ref",
1114  .description = NULL_IF_CONFIG_SMALL("Scale the input video size and/or convert the image format to the given reference."),
1115  .preinit = preinit,
1116  .init = init,
1117  .uninit = uninit,
1118  .priv_size = sizeof(ScaleContext),
1119  .priv_class = &scale_class,
1123  .process_command = process_command,
1124 };
filter_frame_ref
static int filter_frame_ref(AVFilterLink *link, AVFrame *in)
Definition: vf_scale.c:915
ScaleContext::param
double param[2]
Definition: vf_scale.c:126
VAR_S2R_MAIN_SAR
@ VAR_S2R_MAIN_SAR
Definition: vf_scale.c:95
formats
formats
Definition: signature.h:48
ff_get_video_buffer
AVFrame * ff_get_video_buffer(AVFilterLink *link, int w, int h)
Request a picture buffer with a specific set of permissions.
Definition: video.c:112
VAR_S2R_MAIN_A
@ VAR_S2R_MAIN_A
Definition: vf_scale.c:94
VAR_HSUB
@ VAR_HSUB
Definition: vf_scale.c:83
FF_ENABLE_DEPRECATION_WARNINGS
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:73
config_props_ref
static int config_props_ref(AVFilterLink *outlink)
Definition: vf_scale.c:690
SwsContext::saturation
int saturation
Definition: swscale_internal.h:454
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
AVFrame::color_range
enum AVColorRange color_range
MPEG vs JPEG YUV range.
Definition: frame.h:623
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
TFLAGS
#define TFLAGS
Definition: vf_scale.c:996
ScaleContext::sws_opts
struct SwsContext * sws_opts
Definition: vf_scale.c:116
check_exprs
static int check_exprs(AVFilterContext *ctx)
Definition: vf_scale.c:164
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
var_name
var_name
Definition: noise.c:46
ScaleContext::input_is_pal
int input_is_pal
set to 1 if the input format is paletted
Definition: vf_scale.c:130
ff_make_format_list
AVFilterFormats * ff_make_format_list(const int *fmts)
Create a list of supported formats.
Definition: formats.c:435
out
FILE * out
Definition: movenc.c:54
sws_isSupportedOutput
#define sws_isSupportedOutput(x)
ScaleContext
Definition: vf_scale.c:111
ff_filter_frame
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition: avfilter.c:1018
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2962
query_formats
static int query_formats(AVFilterContext *ctx)
Definition: vf_scale.c:399
ScaleContext::force_divisible_by
int force_divisible_by
Definition: vf_scale.c:154
avfilter_vf_scale2ref_outputs
static const AVFilterPad avfilter_vf_scale2ref_outputs[]
Definition: vf_scale.c:1097
FLAGS
#define FLAGS
Definition: vf_scale.c:995
int64_t
long long int64_t
Definition: coverity.c:34
ScaleContext::flags_str
char * flags_str
Definition: vf_scale.c:140
inlink
The exact code depends on how similar the blocks are and how related they are to the and needs to apply these operations to the correct inlink or outlink if there are several Macros are available to factor that when no extra processing is inlink
Definition: filter_design.txt:212
av_frame_free
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:130
AVFrame::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: frame.h:634
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:344
pixdesc.h
AVFrame::pts
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:456
AVFrame::width
int width
Definition: frame.h:416
w
uint8_t w
Definition: llviddspenc.c:38
AVCOL_RANGE_JPEG
@ AVCOL_RANGE_JPEG
Full range content.
Definition: pixfmt.h:683
VAR_A
@ VAR_A
Definition: vf_scale.c:80
request_frame_ref
static int request_frame_ref(AVFilterLink *outlink)
Definition: vf_scale.c:710
av_opt_set_double
int av_opt_set_double(void *obj, const char *name, double val, int search_flags)
Definition: opt.c:794
AVOption
AVOption.
Definition: opt.h:346
AVCOL_SPC_NB
@ AVCOL_SPC_NB
Not part of ABI.
Definition: pixfmt.h:626
scale_parse_expr
static int scale_parse_expr(AVFilterContext *ctx, char *str_expr, AVExpr **pexpr_ptr, const char *var, const char *args)
Definition: vf_scale.c:224
FILTER_QUERY_FUNC
#define FILTER_QUERY_FUNC(func)
Definition: internal.h:159
table
static const uint16_t table[]
Definition: prosumer.c:205
request_frame
static int request_frame(AVFilterLink *outlink)
Definition: vf_scale.c:705
av_pix_fmt_desc_next
const AVPixFmtDescriptor * av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev)
Iterate over all pixel format descriptors known to libavutil.
Definition: pixdesc.c:2969
ff_request_frame
int ff_request_frame(AVFilterLink *link)
Request an input frame from the filter at the other end of the link.
Definition: avfilter.c:462
VAR_S2R_MAIN_HSUB
@ VAR_S2R_MAIN_HSUB
Definition: vf_scale.c:97
ScaleContext::var_values
double var_values[VARS_NB]
Definition: vf_scale.c:138
ScaleContext::out_range
int out_range
Definition: vf_scale.c:146
VAR_S2R_MDAR
@ VAR_S2R_MDAR
Definition: vf_scale.c:96
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:196
AVCOL_SPC_RGB
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
Definition: pixfmt.h:610
float.h
EVAL_MODE_FRAME
@ EVAL_MODE_FRAME
Definition: vf_scale.c:107
VAR_S2R_MAIN_H
@ VAR_S2R_MAIN_H
Definition: vf_scale.c:93
mathematics.h
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:616
AVFilter::name
const char * name
Filter name.
Definition: avfilter.h:170
ScaleContext::in_h_chr_pos
int in_h_chr_pos
Definition: vf_scale.c:150
VAR_OUT_H
@ VAR_OUT_H
Definition: vf_scale.c:79
video.h
ff_make_formats_list_singleton
AVFilterFormats * ff_make_formats_list_singleton(int fmt)
Equivalent to ff_make_format_list({const int[]}{ fmt, -1 })
Definition: formats.c:529
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:365
AVFilterFormats
A list of supported formats for one end of a filter link.
Definition: formats.h:64
formats.h
av_expr_parse
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:711
VAR_S2R_MAIN_POS
@ VAR_S2R_MAIN_POS
Definition: vf_scale.c:101
AVCOL_SPC_BT470BG
@ 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:615
av_color_space_name
const char * av_color_space_name(enum AVColorSpace space)
Definition: pixdesc.c:3338
VAR_DAR
@ VAR_DAR
Definition: vf_scale.c:82
avfilter_vf_scale_inputs
static const AVFilterPad avfilter_vf_scale_inputs[]
Definition: vf_scale.c:1054
fail
#define fail()
Definition: checkasm.h:179
VARS_NB
@ VARS_NB
Definition: vf_scale.c:102
frame_offset
static void frame_offset(AVFrame *frame, int dir, int is_pal)
Definition: vf_scale.c:715
ScaleContext::isws
struct SwsContext * isws[2]
software scaler context for interlaced material
Definition: vf_scale.c:114
ScaleContext::eval_mode
int eval_mode
expression evaluation mode
Definition: vf_scale.c:156
VAR_IN_H
@ VAR_IN_H
Definition: vf_scale.c:77
EVAL_MODE_NB
@ EVAL_MODE_NB
Definition: vf_scale.c:108
sws_get_class
const AVClass * sws_get_class(void)
Get the AVClass for swsContext.
Definition: options.c:97
av_opt_set
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:738
av_reduce
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
av_expr_free
void av_expr_free(AVExpr *e)
Free a parsed expression previously created with av_expr_parse().
Definition: eval.c:359
AVRational::num
int num
Numerator.
Definition: rational.h:59
OFFSET
#define OFFSET(x)
Definition: vf_scale.c:994
preinit
static av_cold int preinit(AVFilterContext *ctx)
Definition: vf_scale.c:277
AVFilterPad
A filter pad used for either input or output.
Definition: internal.h:33
AV_PIX_FMT_BGR8
@ AV_PIX_FMT_BGR8
packed RGB 3:3:2, 8bpp, (msb)2B 3G 3R(lsb)
Definition: pixfmt.h:90
TS2T
#define TS2T(ts, tb)
Definition: internal.h:259
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen.c:29
av_cold
#define av_cold
Definition: attributes.h:90
ScaleContext::sws
struct SwsContext * sws
software scaler context
Definition: vf_scale.c:113
s
#define s(width, name)
Definition: cbs_vp9.c:198
VAR_OH
@ VAR_OH
Definition: vf_scale.c:79
VAR_S2R_MAIN_W
@ VAR_S2R_MAIN_W
Definition: vf_scale.c:92
SwsContext::brightness
int brightness
Definition: swscale_internal.h:454
scale_frame
static int scale_frame(AVFilterLink *link, AVFrame *in, AVFrame **frame_out)
Definition: vf_scale.c:765
ScaleContext::slice_y
int slice_y
top of current output slice
Definition: vf_scale.c:129
AVCOL_SPC_SMPTE170M
@ AVCOL_SPC_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
Definition: pixfmt.h:616
pix_fmt
static enum AVPixelFormat pix_fmt
Definition: demux_decode.c:41
AV_OPT_TYPE_DOUBLE
@ AV_OPT_TYPE_DOUBLE
Definition: opt.h:237
av_expr_count_vars
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:783
ff_formats_ref
int ff_formats_ref(AVFilterFormats *f, AVFilterFormats **ref)
Add *ref as a new reference to formats.
Definition: formats.c:678
init
static av_cold int init(AVFilterContext *ctx)
Definition: vf_scale.c:306
VAR_OVSUB
@ VAR_OVSUB
Definition: vf_scale.c:86
ctx
AVFormatContext * ctx
Definition: movenc.c:48
process_command
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
Definition: vf_scale.c:954
av_expr_eval
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
Evaluate a previously parsed expression.
Definition: eval.c:793
AVExpr
Definition: eval.c:159
field
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this field
Definition: writing_filters.txt:78
AVPixFmtDescriptor::log2_chroma_w
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
Definition: pixdesc.h:80
SwsContext::contrast
int contrast
Definition: swscale_internal.h:454
ScaleContext::w_pexpr
AVExpr * w_pexpr
Definition: vf_scale.c:136
avpriv_set_systematic_pal2
int avpriv_set_systematic_pal2(uint32_t pal[256], enum AVPixelFormat pix_fmt)
Definition: imgutils.c:178
NAN
#define NAN
Definition: mathematics.h:115
FILTER_INPUTS
#define FILTER_INPUTS(array)
Definition: internal.h:182
link
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a link
Definition: filter_design.txt:23
frame
static AVFrame * frame
Definition: demux_decode.c:54
ScaleContext::out_h_chr_pos
int out_h_chr_pos
Definition: vf_scale.c:148
av_color_range_name
const char * av_color_range_name(enum AVColorRange range)
Definition: pixdesc.c:3278
scale_field
static int scale_field(ScaleContext *scale, AVFrame *dst, AVFrame *src, int field)
Definition: vf_scale.c:724
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
NULL
#define NULL
Definition: coverity.c:32
ScaleContext::out_v_chr_pos
int out_v_chr_pos
Definition: vf_scale.c:149
av_frame_copy_props
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
Definition: frame.c:679
VAR_POS
@ VAR_POS
Definition: noise.c:55
VAR_T
@ VAR_T
Definition: vf_scale.c:88
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
isnan
#define isnan(x)
Definition: libm.h:340
ScaleContext::in_range
int in_range
Definition: vf_scale.c:145
AVFilterContext::inputs
AVFilterLink ** inputs
array of pointers to input links
Definition: avfilter.h:415
VAR_IN_W
@ VAR_IN_W
Definition: vf_scale.c:76
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
ff_add_format
int ff_add_format(AVFilterFormats **avff, int64_t fmt)
Add fmt to the list of media formats contained in *avff.
Definition: formats.c:504
parseutils.h
sws_alloc_context
struct SwsContext * sws_alloc_context(void)
Allocate an empty SwsContext.
Definition: utils.c:1180
ff_fmt_is_in
int ff_fmt_is_in(int fmt, const int *fmts)
Tell if an integer is contained in the provided -1-terminated list of integers.
Definition: formats.c:406
ScaleContext::h_pexpr
AVExpr * h_pexpr
Definition: vf_scale.c:137
double
double
Definition: af_crystalizer.c:131
AVCOL_SPC_YCGCO
@ AVCOL_SPC_YCGCO
used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
Definition: pixfmt.h:618
av_opt_get_int
int av_opt_get_int(void *obj, const char *name, int search_flags, int64_t *out_val)
Definition: opt.c:1203
sws_setColorspaceDetails
int sws_setColorspaceDetails(struct SwsContext *c, const int inv_table[4], int srcRange, const int table[4], int dstRange, int brightness, int contrast, int saturation)
Definition: utils.c:1001
AVPixFmtDescriptor::flags
uint64_t flags
Combination of AV_PIX_FMT_FLAG_...
Definition: pixdesc.h:94
ff_vf_scale2ref
const AVFilter ff_vf_scale2ref
Definition: vf_scale.c:160
AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_UNSPECIFIED
Definition: pixfmt.h:649
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
ScaleContext::out_color_matrix
int out_color_matrix
Definition: vf_scale.c:143
av_opt_set_int
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
Definition: opt.c:789
AV_CLASS_CATEGORY_FILTER
@ AV_CLASS_CATEGORY_FILTER
Definition: log.h:36
VAR_IW
@ VAR_IW
Definition: vf_scale.c:76
av_opt_copy
int av_opt_copy(void *dst, const void *src)
Copy options from src object into dest object.
Definition: opt.c:2105
eval.h
VAR_IH
@ VAR_IH
Definition: vf_scale.c:77
scale
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition: vvc_intra.c:291
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:106
AVClass::child_next
void *(* child_next)(void *obj, void *prev)
Return next AVOptions-enabled child or NULL.
Definition: log.h:131
child_class_iterate
static const AVClass * child_class_iterate(void **iter)
Definition: vf_scale.c:979
ScaleContext::w
int w
New dimensions.
Definition: vf_scale.c:124
AVFrame::time_base
AVRational time_base
Time base for the timestamps in this frame.
Definition: frame.h:471
AVFrame::pkt_pos
attribute_deprecated int64_t pkt_pos
reordered pos from the last AVPacket that has been input into the decoder
Definition: frame.h:654
AVFrame::format
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Definition: frame.h:431
scale_eval.h
FF_API_FRAME_PKT
#define FF_API_FRAME_PKT
Definition: version.h:109
ScaleContext::hsub
int hsub
Definition: vf_scale.c:128
VAR_OUT_W
@ VAR_OUT_W
Definition: vf_scale.c:78
ff_all_color_ranges
AVFilterFormats * ff_all_color_ranges(void)
Construct an AVFilterFormats representing all possible color ranges.
Definition: formats.c:646
av_pix_fmt_desc_get_id
enum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc)
Definition: pixdesc.c:2981
filter_frame
static int filter_frame(AVFilterLink *link, AVFrame *in)
Definition: vf_scale.c:901
av_parse_video_size
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
sws_isSupportedInput
#define sws_isSupportedInput(x)
internal.h
AVCOL_SPC_SMPTE240M
@ AVCOL_SPC_SMPTE240M
derived from 170M primaries and D65 white point, 170M is derived from BT470 System M's primaries
Definition: pixfmt.h:617
ScaleContext::vsub
int vsub
chroma subsampling
Definition: vf_scale.c:128
sws_scale_frame
int sws_scale_frame(struct SwsContext *c, AVFrame *dst, const AVFrame *src)
Scale source data from src and write the output to dst.
Definition: swscale.c:1184
config_props
static int config_props(AVFilterLink *outlink)
Definition: vf_scale.c:533
interlaced
uint8_t interlaced
Definition: mxfenc.c:2263
ScaleContext::output_is_pal
int output_is_pal
set to 1 if the output format is paletted
Definition: vf_scale.c:131
VAR_SAR
@ VAR_SAR
Definition: vf_scale.c:81
sws_isSupportedEndiannessConversion
int sws_isSupportedEndiannessConversion(enum AVPixelFormat pix_fmt)
Definition: utils.c:341
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:255
AVCOL_SPC_BT2020_NCL
@ AVCOL_SPC_BT2020_NCL
ITU-R BT2020 non-constant luminance system.
Definition: pixfmt.h:620
VAR_S2R_MAIN_N
@ VAR_S2R_MAIN_N
Definition: vf_scale.c:99
internal.h
ff_filter_get_nb_threads
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Definition: avfilter.c:825
EvalMode
EvalMode
Definition: af_volume.h:39
AVFilterPad::name
const char * name
Pad name.
Definition: internal.h:39
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:612
ScaleContext::h_expr
char * h_expr
height expression string
Definition: vf_scale.c:135
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:603
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:666
avfilter_vf_scale_outputs
static const AVFilterPad avfilter_vf_scale_outputs[]
Definition: vf_scale.c:1062
AVFilter
Filter definition.
Definition: avfilter.h:166
AV_PIX_FMT_PAL8
@ AV_PIX_FMT_PAL8
8 bits with AV_PIX_FMT_RGB32 palette
Definition: pixfmt.h:84
ret
ret
Definition: filter_design.txt:187
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:71
ScaleContext::in_color_matrix
int in_color_matrix
Definition: vf_scale.c:142
child_next
static void * child_next(void *obj, void *prev)
Definition: vf_scale.c:986
AVFrame::sample_aspect_ratio
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
Definition: frame.h:451
sws_getColorspaceDetails
int sws_getColorspaceDetails(struct SwsContext *c, int **inv_table, int *srcRange, int **table, int *dstRange, int *brightness, int *contrast, int *saturation)
Definition: utils.c:1156
ff_scale_adjust_dimensions
int ff_scale_adjust_dimensions(AVFilterLink *inlink, int *ret_w, int *ret_h, int force_original_aspect_ratio, int force_divisible_by)
Transform evaluated width and height obtained from ff_scale_eval_dimensions into actual target width ...
Definition: scale_eval.c:113
sws_init_context
av_warn_unused_result int sws_init_context(struct SwsContext *sws_context, SwsFilter *srcFilter, SwsFilter *dstFilter)
Initialize the swscaler context sws_context.
Definition: utils.c:2036
VAR_S2R_MAIN_T
@ VAR_S2R_MAIN_T
Definition: vf_scale.c:100
scale_eval_dimensions
static int scale_eval_dimensions(AVFilterContext *ctx)
Definition: vf_scale.c:458
var_names
static const char *const var_names[]
Definition: vf_scale.c:45
AVFrame::height
int height
Definition: frame.h:416
VAR_S2R_MAIN_DAR
@ VAR_S2R_MAIN_DAR
Definition: vf_scale.c:96
scale_options
static const AVOption scale_options[]
Definition: vf_scale.c:998
sws_freeContext
void sws_freeContext(struct SwsContext *swsContext)
Free the swscaler context swsContext.
Definition: utils.c:2425
AVRational::den
int den
Denominator.
Definition: rational.h:60
AVCOL_SPC_FCC
@ AVCOL_SPC_FCC
FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
Definition: pixfmt.h:614
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:235
avfilter.h
uninit
static av_cold void uninit(AVFilterContext *ctx)
Definition: vf_scale.c:386
ScaleContext::force_original_aspect_ratio
int force_original_aspect_ratio
Definition: vf_scale.c:153
avfilter_vf_scale2ref_inputs
static const AVFilterPad avfilter_vf_scale2ref_inputs[]
Definition: vf_scale.c:1084
av_mul_q
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
Definition: rational.c:80
AVFilterContext
An instance of a filter.
Definition: avfilter.h:407
VAR_OW
@ VAR_OW
Definition: vf_scale.c:78
FF_DISABLE_DEPRECATION_WARNINGS
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:72
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:270
desc
const char * desc
Definition: libsvtav1.c:75
VAR_VSUB
@ VAR_VSUB
Definition: vf_scale.c:84
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
sws_getCoefficients
const int * sws_getCoefficients(int colorspace)
Return a pointer to yuv<->rgb coefficients for the given colorspace suitable for sws_setColorspaceDet...
Definition: yuv2rgb.c:62
sws_colorspaces
static const int sws_colorspaces[]
Definition: vf_scale.c:294
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
ScaleContext::interlaced
int interlaced
Definition: vf_scale.c:132
av_free
#define av_free(p)
Definition: tableprint_vlc.h:33
VAR_N
@ VAR_N
Definition: vf_scale.c:87
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:251
FILTER_OUTPUTS
#define FILTER_OUTPUTS(array)
Definition: internal.h:183
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
scale_class
static const AVClass scale_class
Definition: vf_scale.c:1044
ScaleContext::w_expr
char * w_expr
width expression string
Definition: vf_scale.c:134
EVAL_MODE_INIT
@ EVAL_MODE_INIT
Definition: vf_scale.c:106
imgutils.h
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:482
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:389
av_opt_get
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
Definition: opt.c:1145
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
h
h
Definition: vp9dsp_template.c:2038
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:239
VAR_OHSUB
@ VAR_OHSUB
Definition: vf_scale.c:85
AVCOL_SPC_BT709
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
Definition: pixfmt.h:611
int
int
Definition: ffmpeg_filter.c:409
SwsContext
Definition: swscale_internal.h:299
AV_PIX_FMT_FLAG_PAL
#define AV_PIX_FMT_FLAG_PAL
Pixel format has a palette in data[1], values are indexes in this palette.
Definition: pixdesc.h:120
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition: opt.h:244
ff_vf_scale
const AVFilter ff_vf_scale
Definition: vf_scale.c:1070
snprintf
#define snprintf
Definition: snprintf.h:34
ScaleContext::size_str
char * size_str
Definition: vf_scale.c:125
VAR_S2R_MAIN_VSUB
@ VAR_S2R_MAIN_VSUB
Definition: vf_scale.c:98
AVPixFmtDescriptor::log2_chroma_h
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Definition: pixdesc.h:89
swscale.h
ScaleContext::h
int h
Definition: vf_scale.c:124
av_x_if_null
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
Definition: avutil.h:312
av_get_pix_fmt_name
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:2882
ScaleContext::in_v_chr_pos
int in_v_chr_pos
Definition: vf_scale.c:151
SwsContext::param
double param[2]
Input parameters for scaling algorithms that need them.
Definition: swscale_internal.h:342