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