47#define ZIMG_ALIGNMENT 64
48#define MIN_TILESIZE 64
139 zimg_image_format_default(&
s->src_format, ZIMG_API_VERSION);
140 zimg_image_format_default(&
s->dst_format, ZIMG_API_VERSION);
141 zimg_image_format_default(&
s->src_format_tmp, ZIMG_API_VERSION);
142 zimg_image_format_default(&
s->dst_format_tmp, ZIMG_API_VERSION);
144 zimg_graph_builder_params_default(&
s->params, ZIMG_API_VERSION);
145 zimg_graph_builder_params_default(&
s->params_tmp, ZIMG_API_VERSION);
147 if (
s->size_str && (
s->w_expr ||
s->h_expr)) {
149 "Size and width/height expressions cannot be set at the same time.\n");
153 if (
s->w_expr && !
s->h_expr)
154 FFSWAP(
char *,
s->w_expr,
s->size_str);
160 "Invalid size '%s'\n",
s->size_str);
163 snprintf(buf,
sizeof(buf)-1,
"%d",
s->w);
165 snprintf(buf,
sizeof(buf)-1,
"%d",
s->h);
222 formats =
s->colorspace != ZIMG_MATRIX_UNSPECIFIED &&
s->colorspace > 0
252 s->out_slice_start[0] = 0;
253 for (
int i = 1;
i <
s->nb_threads;
i++) {
257 s->out_slice_end[
s->nb_threads - 1] = out_h;
259 for (
int i = 0;
i <
s->nb_threads;
i++) {
260 s->in_slice_start[
i] =
s->out_slice_start[
i] * in_h / (
double)out_h;
261 s->in_slice_end[
i] =
s->out_slice_end[
i] * in_h / (
double)out_h;
273 double var_values[
VARS_NB], res;
300 if (!(res >= INT32_MIN && res <= INT32_MAX)) {
311 if (!(res >= INT32_MIN && res <= INT32_MAX)) {
349 if (
s->force_original_aspect_ratio) {
353 if (
s->force_original_aspect_ratio == 1) {
362 if (
w > INT_MAX ||
h > INT_MAX ||
363 (
h * inlink->
w) > INT_MAX ||
364 (
w * inlink->
h) > INT_MAX)
377 av_log(
ctx,
AV_LOG_DEBUG,
"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\n",
388 "Error when evaluating the expression '%s'.\n"
389 "Maybe the expression for out_w:'%s' or for out_h:'%s' is self-referencing.\n",
390 expr,
s->w_expr,
s->h_expr);
397 int err_code = zimg_get_last_error(err_msg,
sizeof(err_msg));
406 switch (chroma_location) {
409 return ZIMG_CHROMA_LEFT;
411 return ZIMG_CHROMA_CENTER;
413 return ZIMG_CHROMA_TOP_LEFT;
415 return ZIMG_CHROMA_TOP;
417 return ZIMG_CHROMA_BOTTOM_LEFT;
419 return ZIMG_CHROMA_BOTTOM;
421 return ZIMG_CHROMA_LEFT;
426 switch (colorspace) {
428 return ZIMG_MATRIX_RGB;
430 return ZIMG_MATRIX_709;
432 return ZIMG_MATRIX_UNSPECIFIED;
434 return ZIMG_MATRIX_FCC;
436 return ZIMG_MATRIX_470BG;
438 return ZIMG_MATRIX_170M;
440 return ZIMG_MATRIX_240M;
442 return ZIMG_MATRIX_YCGCO;
444 return ZIMG_MATRIX_2020_NCL;
446 return ZIMG_MATRIX_2020_CL;
448 return ZIMG_MATRIX_CHROMATICITY_DERIVED_NCL;
450 return ZIMG_MATRIX_CHROMATICITY_DERIVED_CL;
452 return ZIMG_MATRIX_ICTCP;
454 return ZIMG_MATRIX_UNSPECIFIED;
461 return ZIMG_TRANSFER_UNSPECIFIED;
463 return ZIMG_TRANSFER_709;
465 return ZIMG_TRANSFER_470_M;
467 return ZIMG_TRANSFER_470_BG;
469 return ZIMG_TRANSFER_601;
471 return ZIMG_TRANSFER_240M;
473 return ZIMG_TRANSFER_LINEAR;
475 return ZIMG_TRANSFER_LOG_100;
477 return ZIMG_TRANSFER_LOG_316;
479 return ZIMG_TRANSFER_IEC_61966_2_4;
481 return ZIMG_TRANSFER_2020_10;
483 return ZIMG_TRANSFER_2020_12;
485 return ZIMG_TRANSFER_ST2084;
487 return ZIMG_TRANSFER_ARIB_B67;
489 return ZIMG_TRANSFER_IEC_61966_2_1;
491 return ZIMG_TRANSFER_UNSPECIFIED;
498 return ZIMG_PRIMARIES_UNSPECIFIED;
500 return ZIMG_PRIMARIES_709;
502 return ZIMG_PRIMARIES_470_M;
504 return ZIMG_PRIMARIES_470_BG;
506 return ZIMG_PRIMARIES_170M;
508 return ZIMG_PRIMARIES_240M;
510 return ZIMG_PRIMARIES_FILM;
512 return ZIMG_PRIMARIES_2020;
514 return ZIMG_PRIMARIES_ST428;
516 return ZIMG_PRIMARIES_ST431_2;
518 return ZIMG_PRIMARIES_ST432_1;
520 return ZIMG_PRIMARIES_EBU3213_E;
522 return ZIMG_PRIMARIES_UNSPECIFIED;
530 return ZIMG_RANGE_LIMITED;
532 return ZIMG_RANGE_FULL;
534 return ZIMG_RANGE_LIMITED;
540 case ZIMG_RANGE_LIMITED:
542 case ZIMG_RANGE_FULL:
551 return ((img_fmt0->chroma_location != img_fmt1->chroma_location) ||
552#
if ZIMG_API_VERSION >= 0x204
553 (img_fmt0->alpha != img_fmt1->alpha) ||
555 (img_fmt0->color_family != img_fmt1->color_family) ||
556 (img_fmt0->color_primaries != img_fmt1->color_primaries) ||
557 (img_fmt0->depth != img_fmt1->depth) ||
558 (img_fmt0->field_parity != img_fmt1->field_parity) ||
559 (img_fmt0->height != img_fmt1->height) ||
560 (img_fmt0->matrix_coefficients != img_fmt1->matrix_coefficients) ||
561 (img_fmt0->pixel_range != img_fmt1->pixel_range) ||
562 (img_fmt0->pixel_type != img_fmt1->pixel_type) ||
563 (img_fmt0->subsample_h != img_fmt1->subsample_h) ||
564 (img_fmt0->subsample_w != img_fmt1->subsample_w) ||
565 (img_fmt0->transfer_characteristics != img_fmt1->transfer_characteristics) ||
566 (img_fmt0->width != img_fmt1->width));
574 int ret = (parm0->allow_approximate_gamma != parm1->allow_approximate_gamma) ||
575 (parm0->dither_type != parm1->dither_type) ||
576 (parm0->resample_filter != parm1->resample_filter) ||
577 (parm0->resample_filter_uv != parm1->resample_filter_uv);
579 if ((isnan(parm0->nominal_peak_luminance) == 0) || (isnan(parm1->nominal_peak_luminance) == 0))
580 ret = ret || (parm0->nominal_peak_luminance != parm1->nominal_peak_luminance);
581 if ((isnan(parm0->filter_param_a) == 0) || (isnan(parm1->filter_param_a) == 0))
582 ret = ret || (parm0->filter_param_a != parm1->filter_param_a);
583 if ((isnan(parm0->filter_param_a_uv) == 0) || (isnan(parm1->filter_param_a_uv) == 0))
584 ret = ret || (parm0->filter_param_a_uv != parm1->filter_param_a_uv);
585 if ((isnan(parm0->filter_param_b) == 0) || (isnan(parm1->filter_param_b) == 0))
586 ret = ret || (parm0->filter_param_b != parm1->filter_param_b);
587 if ((isnan(parm0->filter_param_b_uv) == 0) || (isnan(parm1->filter_param_b_uv) == 0))
588 ret = ret || (parm0->filter_param_b_uv != parm1->filter_param_b_uv);
602 : (
desc->comp[0].depth > 8 ? ZIMG_PIXEL_WORD : ZIMG_PIXEL_BYTE);
604 : (
desc->nb_components > 1 ? ZIMG_COLOR_YUV : ZIMG_COLOR_GREY);
620 zimg_image_format src_format;
621 zimg_image_format dst_format;
622 const double in_slice_start =
s->in_slice_start[job_nr];
623 const double in_slice_end =
s->in_slice_end[job_nr];
624 const int out_slice_start =
s->out_slice_start[job_nr];
625 const int out_slice_end =
s->out_slice_end[job_nr];
627 src_format =
s->src_format;
628 dst_format =
s->dst_format;
632 src_format.active_region.width = in->
width;
633 src_format.active_region.height = in_slice_end - in_slice_start;
634 src_format.active_region.left = 0;
635 src_format.active_region.top = in_slice_start;
637 dst_format.width =
out->width;
638 dst_format.height = out_slice_end - out_slice_start;
640 if (
s->graph[job_nr]) {
641 zimg_filter_graph_free(
s->graph[job_nr]);
643 s->graph[job_nr] = zimg_filter_graph_build(&src_format, &dst_format, &
s->params);
644 if (!
s->graph[job_nr])
647 ret = zimg_filter_graph_get_tmp_size(
s->graph[job_nr], &
size);
666 int ret = 0, plane,
planes;
670 for (plane = 0; plane <
planes; plane++) {
671 int p =
desc->comp[plane].plane;
696 if (
s->primaries != -1)
697 frame->color_primaries = (int)
s->dst_format.color_primaries;
700 frame->color_trc = (int)
s->dst_format.transfer_characteristics;
702 if (
s->chromal != -1)
703 frame->chroma_location = (int)
s->dst_format.chroma_location + 1;
713 zimg_image_buffer_const src_buf = { ZIMG_API_VERSION };
714 zimg_image_buffer dst_buf = { ZIMG_API_VERSION };
715 const int out_slice_start =
s->out_slice_start[job_nr];
728 for (
int i = 0;
i < 4;
i++) {
734 src_buf.plane[
i].data = td->
in->
data[p];
736 src_buf.plane[
i].mask = -1;
741 dst_buf.plane[
i].data = td->
out->
data[p] + td->
out->
linesize[p] * (out_slice_start >> vsamp);
743 dst_buf.plane[
i].mask = -1;
746 if (!
s->graph[job_nr])
748 ret = zimg_filter_graph_process(
s->graph[job_nr], &src_buf, &dst_buf,
765 int ret = 0, changed = 0;
772 (link->
w != outlink->
w) ||
773 (link->
h != outlink->
h) ||
777 (
s->src_format.chroma_location !=
s->dst_format.chroma_location) ||
778 (
s->src_format.color_family !=
s->dst_format.color_family) ||
779 (
s->src_format.color_primaries !=
s->dst_format.color_primaries) ||
780 (
s->src_format.depth !=
s->dst_format.depth) ||
781 (
s->src_format.matrix_coefficients !=
s->dst_format.matrix_coefficients) ||
782 (
s->src_format.field_parity !=
s->dst_format.field_parity) ||
783 (
s->src_format.pixel_range !=
s->dst_format.pixel_range) ||
784 (
s->src_format.pixel_type !=
s->dst_format.pixel_type) ||
785 (
s->src_format.transfer_characteristics !=
s->dst_format.transfer_characteristics)
802 snprintf(buf,
sizeof(buf)-1,
"%d", outlink->
w);
804 snprintf(buf,
sizeof(buf)-1,
"%d", outlink->
h);
816 zimg_image_format_default(&
s->src_format, ZIMG_API_VERSION);
817 zimg_image_format_default(&
s->dst_format, ZIMG_API_VERSION);
818 zimg_graph_builder_params_default(&
s->params, ZIMG_API_VERSION);
821 s->primaries,
s->trc,
s->range,
s->chromal);
824 s->primaries_in,
s->trc_in,
s->range_in,
826 s->dst_format.chroma_location :
s->chromal_in);
829 s->params.dither_type =
s->dither;
830 s->params.cpu_type = ZIMG_CPU_AUTO_64B;
831 s->params.resample_filter =
s->filter;
832 s->params.resample_filter_uv =
s->filter;
833 s->params.nominal_peak_luminance =
s->nominal_peak_luminance;
834 s->params.allow_approximate_gamma =
s->approximate_gamma;
835 s->params.filter_param_a =
s->params.filter_param_a_uv =
s->param_a;
836 s->params.filter_param_b =
s->params.filter_param_b_uv =
s->param_b;
839 av_reduce(&
out->sample_aspect_ratio.num, &
out->sample_aspect_ratio.den,
855 memset(
s->jobs_ret, 0,
s->nb_threads *
sizeof(*
s->jobs_ret));
857 for (
int i = 0; ret >= 0 &&
i <
s->nb_threads;
i++)
858 if (
s->jobs_ret[
i] < 0)
859 ret =
s->jobs_ret[
i];
866 s->src_format_tmp =
s->src_format;
867 s->dst_format_tmp =
s->dst_format;
868 s->params_tmp =
s->params;
873 const uint16_t h_one = 0x3C00;
874 for (y = 0; y <
out->height; y++) {
875 const ptrdiff_t row = y *
out->linesize[3];
877 for (x = 0; x <
out->width; x++) {
881 for (x = 0; x <
out->width; x++) {
886 }
else if (
s->dst_format.depth == 8) {
887 for (y = 0; y < outlink->
h; y++)
888 memset(
out->data[3] + y *
out->linesize[3], 0xff, outlink->
w);
890 const uint16_t
max = (1 <<
s->dst_format.depth) - 1;
891 for (y = 0; y < outlink->
h; y++) {
892 const ptrdiff_t row = y *
out->linesize[3];
893 for (x = 0; x <
out->width; x++)
919 for (
int i = 0;
i <
s->nb_threads;
i++) {
922 zimg_filter_graph_free(
s->graph[
i]);
929 char *res,
int res_len,
int flags)
934 if ( !strcmp(cmd,
"width") || !strcmp(cmd,
"w")
935 || !strcmp(cmd,
"height") || !strcmp(cmd,
"h")) {
952#define OFFSET(x) offsetof(ZScaleContext, x)
953#define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
954#define TFLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
968 {
"error_diffusion", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_DITHER_ERROR_DIFFUSION}, 0, 0,
FLAGS, .unit =
"dither" },
991 {
"unspecified", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_UNSPECIFIED}, 0, 0,
FLAGS, .unit =
"primaries" },
995 {
"unknown", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_UNSPECIFIED}, 0, 0,
FLAGS, .unit =
"primaries" },
1000 {
"smpte240m", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_240M}, 0, 0,
FLAGS, .unit =
"primaries" },
1003 {
"smpte428", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_ST428}, 0, 0,
FLAGS, .unit =
"primaries" },
1004 {
"smpte431", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_ST431_2}, 0, 0,
FLAGS, .unit =
"primaries" },
1005 {
"smpte432", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_ST432_1}, 0, 0,
FLAGS, .unit =
"primaries" },
1006 {
"jedec-p22", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_EBU3213_E}, 0, 0,
FLAGS, .unit =
"primaries" },
1007 {
"ebu3213", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_EBU3213_E}, 0, 0,
FLAGS, .unit =
"primaries" },
1008 {
"transfer",
"set transfer characteristic",
OFFSET(trc),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS, .unit =
"transfer" },
1012 {
"unspecified", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_UNSPECIFIED}, 0, 0,
FLAGS, .unit =
"transfer" },
1017 {
"unknown", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_UNSPECIFIED}, 0, 0,
FLAGS, .unit =
"transfer" },
1026 {
"bt2020-10", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_2020_10}, 0, 0,
FLAGS, .unit =
"transfer" },
1027 {
"bt2020-12", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_2020_12}, 0, 0,
FLAGS, .unit =
"transfer" },
1028 {
"smpte2084", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_ST2084}, 0, 0,
FLAGS, .unit =
"transfer" },
1029 {
"iec61966-2-4", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_IEC_61966_2_4},0, 0,
FLAGS, .unit =
"transfer" },
1030 {
"iec61966-2-1", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_IEC_61966_2_1},0, 0,
FLAGS, .unit =
"transfer" },
1031 {
"arib-std-b67", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_ARIB_B67}, 0, 0,
FLAGS, .unit =
"transfer" },
1032 {
"matrix",
"set colorspace matrix",
OFFSET(colorspace),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS, .unit =
"matrix" },
1036 {
"unspecified", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_MATRIX_UNSPECIFIED}, 0, 0,
FLAGS, .unit =
"matrix" },
1051 {
"chroma-derived-nc",0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_MATRIX_CHROMATICITY_DERIVED_NCL}, 0, 0,
FLAGS, .unit =
"matrix" },
1052 {
"chroma-derived-c", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_MATRIX_CHROMATICITY_DERIVED_CL}, 0, 0,
FLAGS, .unit =
"matrix" },
1054 {
"in_range",
"set input color range",
OFFSET(range_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_RANGE_FULL,
FLAGS, .unit =
"range" },
1055 {
"rangein",
"set input color range",
OFFSET(range_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_RANGE_FULL,
FLAGS, .unit =
"range" },
1056 {
"rin",
"set input color range",
OFFSET(range_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_RANGE_FULL,
FLAGS, .unit =
"range" },
1057 {
"primariesin",
"set input color primaries",
OFFSET(primaries_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS, .unit =
"primaries" },
1058 {
"pin",
"set input color primaries",
OFFSET(primaries_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS, .unit =
"primaries" },
1059 {
"transferin",
"set input transfer characteristic",
OFFSET(trc_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS, .unit =
"transfer" },
1060 {
"tin",
"set input transfer characteristic",
OFFSET(trc_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS, .unit =
"transfer" },
1061 {
"matrixin",
"set input colorspace matrix",
OFFSET(colorspace_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS, .unit =
"matrix" },
1062 {
"min",
"set input colorspace matrix",
OFFSET(colorspace_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS, .unit =
"matrix" },
1063 {
"chromal",
"set output chroma location",
OFFSET(chromal),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS, .unit =
"chroma" },
1064 {
"c",
"set output chroma location",
OFFSET(chromal),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS, .unit =
"chroma" },
1070 {
"bottomleft",0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_CHROMA_BOTTOM_LEFT}, 0, 0,
FLAGS, .unit =
"chroma" },
1072 {
"chromalin",
"set input chroma location",
OFFSET(chromal_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS, .unit =
"chroma" },
1073 {
"cin",
"set input chroma location",
OFFSET(chromal_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS, .unit =
"chroma" },
1076 {
"param_a",
"parameter A, which is parameter \"b\" for bicubic, "
1103 .p.priv_class = &zscale_class,
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
static const char *const format[]
const FFFilter ff_vf_zscale
static AVFormatContext * ctx
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
int ff_filter_execute(AVFilterContext *ctx, avfilter_action_func *func, void *arg, int *ret, int nb_jobs)
int ff_filter_get_nb_threads(AVFilterContext *ctx)
Get number of threads for current filter instance.
Main libavfilter public API header.
#define flags(name, subs,...)
#define i(width, name, range_min, range_max)
static const double approximate_gamma[AVCOL_TRC_NB]
static const AVColorPrimariesDesc color_primaries[AVCOL_PRI_NB]
static __device__ float trunc(float a)
static int aligned(int val)
static int filter_frame(DBEDecodeContext *s, AVFrame *frame)
int(* init)(AVBSFContext *ctx)
int av_expr_parse_and_eval(double *d, const char *s, const char *const *const_names, const double *const_values, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), void *opaque, int log_offset, void *log_ctx)
Parse and evaluate an expression.
simple arithmetic expression evaluator
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
@ AV_OPT_TYPE_INT
Underlying C type is int.
@ AV_OPT_TYPE_DOUBLE
Underlying C type is double.
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
@ 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...
#define AVFILTER_FLAG_SLICE_THREADS
The filter supports multithreading by splitting frames into multiple parts and processing them concur...
#define AVERROR_EXTERNAL
Generic error in an external library.
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.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
Copy only "metadata" fields from src to dst.
int av_frame_copy(AVFrame *dst, const AVFrame *src)
Copy the frame data from src to dst.
@ AV_SIDE_DATA_PROP_SIZE_DEPENDENT
Side data depends on the video dimensions.
@ AV_SIDE_DATA_PROP_COLOR_DEPENDENT
Side data depends on the video color space.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVRational av_mul_q(AVRational b, AVRational c)
Multiply two rationals.
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
static av_always_inline uint32_t av_float2int(float f)
Reinterpret a float as a 32-bit integer.
static av_cold void uninit(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
#define FILTER_OUTPUTS(array)
#define AVFILTER_DEFINE_CLASS(fname)
#define FILTER_QUERY_FUNC2(func)
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static const struct @257111027162314367033347246032313251342043035002 planes[]
#define FFSWAP(type, a, b)
Memory handling functions.
static int slice_end(AVCodecContext *avctx, AVFrame *pict, int *got_output)
Handle slice ends.
static const char *const var_names[]
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.
int av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt)
const char * av_color_space_name(enum AVColorSpace space)
const char * av_color_range_name(enum AVColorRange range)
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.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
#define AV_PIX_FMT_FLAG_ALPHA
The pixel format has an alpha channel.
#define AV_PIX_FMT_FLAG_RGB
The pixel format contains RGB-like data (as opposed to YUV/grayscale).
#define AV_PIX_FMT_FLAG_FLOAT
The pixel format contains IEEE-754 floating point values.
#define AV_PIX_FMT_GBRAP12
#define AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_GBRPF32
#define AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P9
AVChromaLocation
Location of chroma samples.
@ AVCHROMA_LOC_TOPLEFT
ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2.
@ AVCHROMA_LOC_LEFT
MPEG-2/4 4:2:0, H.264 default for 4:2:0.
@ AVCHROMA_LOC_BOTTOMLEFT
@ AVCHROMA_LOC_CENTER
MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0.
@ AVCHROMA_LOC_UNSPECIFIED
#define AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_GRAYF16
#define AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_YUV422P9
AVColorRange
Visual content value range.
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
@ AVCOL_RANGE_UNSPECIFIED
@ AVCOL_RANGE_JPEG
Full range content.
#define AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUVA420P10
@ AVALPHA_MODE_PREMULTIPLIED
Alpha channel is multiplied into color values.
#define AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_GBRAP14
#define AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_GBRAPF16
#define AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_GRAYF32
#define AV_PIX_FMT_YUV420P14
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
#define AV_PIX_FMT_YUVA422P12
#define AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GBRPF16
#define AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_GBRAP10
AVColorPrimaries
Chromaticity coordinates of the source primaries.
@ AVCOL_PRI_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM
@ AVCOL_PRI_FILM
colour filters using Illuminant C
@ AVCOL_PRI_SMPTE432
SMPTE ST 432-1 (2010) / P3 D65 / Display P3.
@ AVCOL_PRI_BT709
also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B
@ AVCOL_PRI_SMPTE240M
identical to above, also called "SMPTE C" even though it uses D65
@ AVCOL_PRI_SMPTE431
SMPTE ST 431-2 (2011) / DCI P3.
@ AVCOL_PRI_SMPTE428
SMPTE ST 428-1 (CIE 1931 XYZ)
@ AVCOL_PRI_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC
@ AVCOL_PRI_BT2020
ITU-R BT2020.
@ AVCOL_PRI_BT470M
also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
AVColorTransferCharacteristic
Color Transfer Characteristic.
@ AVCOL_TRC_SMPTE170M
also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC
@ AVCOL_TRC_SMPTE2084
SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems.
@ AVCOL_TRC_GAMMA22
also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
@ AVCOL_TRC_LOG
"Logarithmic transfer characteristic (100:1 range)"
@ AVCOL_TRC_IEC61966_2_4
IEC 61966-2-4.
@ AVCOL_TRC_LINEAR
"Linear transfer characteristics"
@ AVCOL_TRC_GAMMA28
also ITU-R BT470BG
@ AVCOL_TRC_ARIB_STD_B67
ARIB STD-B67, known as "Hybrid log-gamma".
@ AVCOL_TRC_LOG_SQRT
"Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)"
@ AVCOL_TRC_BT2020_12
ITU-R BT2020 for 12-bit system.
@ AVCOL_TRC_IEC61966_2_1
IEC 61966-2-1 (sRGB or sYCC)
@ AVCOL_TRC_BT2020_10
ITU-R BT2020 for 10-bit system.
@ AVCOL_TRC_BT709
also ITU-R BT1361
#define AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_GBRAPF32
#define AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P10
AVColorSpace
YUV colorspace type.
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B
@ AVCOL_SPC_BT470BG
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
@ AVCOL_SPC_CHROMA_DERIVED_CL
Chromaticity-derived constant luminance system.
@ AVCOL_SPC_BT2020_CL
ITU-R BT2020 constant luminance system.
@ AVCOL_SPC_RGB
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1
@ AVCOL_SPC_BT2020_NCL
ITU-R BT2020 non-constant luminance system.
@ AVCOL_SPC_SMPTE170M
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
@ AVCOL_SPC_FCC
FCC Title 47 Code of Federal Regulations 73.682 (a)(20)
@ AVCOL_SPC_CHROMA_DERIVED_NCL
Chromaticity-derived non-constant luminance system.
@ AVCOL_SPC_SMPTE240M
derived from 170M primaries and D65 white point, 170M is derived from BT470 System M's primaries
@ AVCOL_SPC_YCGCO
used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16
@ AVCOL_SPC_ICTCP
ITU-R BT.2100-0, ICtCp.
static int config_props(AVBitStreamFilterLink *link)
Describe the class of an AVClass context structure.
int plane
Which of the 4 planes contains the component.
int step
Number of elements between 2 horizontally consecutive pixels.
int depth
Number of bits in the component.
AVFilterLink ** inputs
array of pointers to input links
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * src
source filter
enum AVChromaLocation chroma_location
Agreed upon chroma sample location, for video with subsampled chroma.
AVRational sample_aspect_ratio
agreed upon sample aspect ratio
enum AVColorSpace colorspace
For non-YUV links, these are respectively set to fallback values (as appropriate for that colorspace)...
AVFilterContext * dst
dest filter
int format
agreed upon media format
enum AVColorRange color_range
agreed upon YUV color range
A filter pad used for either input or output.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
enum AVChromaLocation chroma_location
enum AVColorPrimaries color_primaries
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
enum AVColorRange color_range
MPEG vs JPEG YUV range.
enum AVColorSpace colorspace
YUV colorspace type.
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
enum AVColorTransferCharacteristic color_trc
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames,...
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
uint8_t log2_chroma_w
Amount to shift the luma width right to find the chroma width.
uint64_t flags
Combination of AV_PIX_FMT_FLAG_... flags.
uint8_t log2_chroma_h
Amount to shift the luma height right to find the chroma height.
Rational number (pair of numerator and denominator).
Used for passing data between threads.
const AVPixFmtDescriptor * desc
const AVPixFmtDescriptor * odesc
double nominal_peak_luminance
double in_slice_end[MAX_THREADS]
zimg_image_format src_format_tmp
zimg_graph_builder_params params
int force_original_aspect_ratio
zimg_filter_graph * graph[MAX_THREADS]
double in_slice_start[MAX_THREADS]
zimg_image_format dst_format
int out_slice_start[MAX_THREADS]
char * w_expr
width expression string
zimg_graph_builder_params params_tmp
zimg_image_format dst_format_tmp
int jobs_ret[MAX_THREADS]
zimg_image_format src_format
char * h_expr
height expression string
int out_slice_end[MAX_THREADS]
void(* filter)(uint8_t *src, ptrdiff_t stride, int qscale)
static enum AVPixelFormat pixel_fmts[]
static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
static const uint16_t dither[8][8]
static int config_props(AVFilterLink *outlink)
static int print_zimg_error(AVFilterContext *ctx)
static int convert_trc(enum AVColorTransferCharacteristic color_trc)
static int convert_range(enum AVColorRange color_range)
static int filter_frame(AVFilterLink *link, AVFrame *in)
static int filter_slice(AVFilterContext *ctx, void *data, int job_nr, int n_jobs)
static void slice_params(ZScaleContext *s, int out_h, int in_h)
static void format_init(zimg_image_format *format, AVFrame *frame, const AVPixFmtDescriptor *desc, int colorspace, int primaries, int transfer, int range, int location)
static int convert_primaries(enum AVColorPrimaries color_primaries)
static int compare_zimg_image_formats(zimg_image_format *img_fmt0, zimg_image_format *img_fmt1)
static int graphs_build(AVFrame *in, AVFrame *out, const AVPixFmtDescriptor *desc, const AVPixFmtDescriptor *out_desc, AVFilterContext *ctx, int job_nr, int n_jobs)
static int convert_matrix(enum AVColorSpace colorspace)
static int query_formats(const AVFilterContext *ctx, AVFilterFormatsConfig **cfg_in, AVFilterFormatsConfig **cfg_out)
static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, char *res, int res_len, int flags)
static int realign_frame(AVFilterLink *link, const AVPixFmtDescriptor *desc, AVFrame **frame)
static av_cold void uninit(AVFilterContext *ctx)
static int convert_chroma_location(enum AVChromaLocation chroma_location)
static const AVFilterPad avfilter_vf_zscale_outputs[]
static const AVOption zscale_options[]
static int compare_zimg_graph_builder_params(zimg_graph_builder_params *parm0, zimg_graph_builder_params *parm1)
static void update_output_color_information(ZScaleContext *s, AVFrame *frame)
static enum AVColorRange convert_range_from_zimg(enum zimg_pixel_range_e color_range)
static const AVFilterPad avfilter_vf_zscale_inputs[]
AVFrame * ff_default_get_video_buffer2(AVFilterLink *link, int w, int h, int align)