47 #define ZIMG_ALIGNMENT 32
135 if (
s->size_str && (
s->w_expr ||
s->h_expr)) {
137 "Size and width/height expressions cannot be set at the same time.\n");
141 if (
s->w_expr && !
s->h_expr)
142 FFSWAP(
char *,
s->w_expr,
s->size_str);
148 "Invalid size '%s'\n",
s->size_str);
151 snprintf(buf,
sizeof(buf)-1,
"%d",
s->w);
153 snprintf(buf,
sizeof(buf)-1,
"%d",
s->h);
204 double var_values[
VARS_NB], res;
207 int factor_w, factor_h;
215 (
double)
inlink->sample_aspect_ratio.num /
inlink->sample_aspect_ratio.den : 1;
271 if (
s->force_original_aspect_ratio) {
275 if (
s->force_original_aspect_ratio == 1) {
284 if (
w > INT_MAX ||
h > INT_MAX ||
299 if (
inlink->sample_aspect_ratio.num){
306 inlink->sample_aspect_ratio.num,
inlink->sample_aspect_ratio.den,
313 "Error when evaluating the expression '%s'.\n"
314 "Maybe the expression for out_w:'%s' or for out_h:'%s' is self-referencing.\n",
315 expr,
s->w_expr,
s->h_expr);
322 int err_code = zimg_get_last_error(err_msg,
sizeof(err_msg));
331 switch (chroma_location) {
334 return ZIMG_CHROMA_LEFT;
336 return ZIMG_CHROMA_CENTER;
338 return ZIMG_CHROMA_TOP_LEFT;
340 return ZIMG_CHROMA_TOP;
342 return ZIMG_CHROMA_BOTTOM_LEFT;
344 return ZIMG_CHROMA_BOTTOM;
346 return ZIMG_CHROMA_LEFT;
351 switch (colorspace) {
353 return ZIMG_MATRIX_RGB;
355 return ZIMG_MATRIX_709;
357 return ZIMG_MATRIX_UNSPECIFIED;
359 return ZIMG_MATRIX_FCC;
361 return ZIMG_MATRIX_470BG;
363 return ZIMG_MATRIX_170M;
365 return ZIMG_MATRIX_240M;
367 return ZIMG_MATRIX_YCGCO;
369 return ZIMG_MATRIX_2020_NCL;
371 return ZIMG_MATRIX_2020_CL;
373 return ZIMG_MATRIX_CHROMATICITY_DERIVED_NCL;
375 return ZIMG_MATRIX_CHROMATICITY_DERIVED_CL;
377 return ZIMG_MATRIX_ICTCP;
379 return ZIMG_MATRIX_UNSPECIFIED;
386 return ZIMG_TRANSFER_UNSPECIFIED;
388 return ZIMG_TRANSFER_709;
390 return ZIMG_TRANSFER_470_M;
392 return ZIMG_TRANSFER_470_BG;
394 return ZIMG_TRANSFER_601;
396 return ZIMG_TRANSFER_240M;
398 return ZIMG_TRANSFER_LINEAR;
400 return ZIMG_TRANSFER_LOG_100;
402 return ZIMG_TRANSFER_LOG_316;
404 return ZIMG_TRANSFER_IEC_61966_2_4;
406 return ZIMG_TRANSFER_2020_10;
408 return ZIMG_TRANSFER_2020_12;
410 return ZIMG_TRANSFER_ST2084;
412 return ZIMG_TRANSFER_ARIB_B67;
414 return ZIMG_TRANSFER_IEC_61966_2_1;
416 return ZIMG_TRANSFER_UNSPECIFIED;
423 return ZIMG_PRIMARIES_UNSPECIFIED;
425 return ZIMG_PRIMARIES_709;
427 return ZIMG_PRIMARIES_470_M;
429 return ZIMG_PRIMARIES_470_BG;
431 return ZIMG_PRIMARIES_170M;
433 return ZIMG_PRIMARIES_240M;
435 return ZIMG_PRIMARIES_FILM;
437 return ZIMG_PRIMARIES_2020;
439 return ZIMG_PRIMARIES_ST428;
441 return ZIMG_PRIMARIES_ST431_2;
443 return ZIMG_PRIMARIES_ST432_1;
445 return ZIMG_PRIMARIES_EBU3213_E;
447 return ZIMG_PRIMARIES_UNSPECIFIED;
455 return ZIMG_RANGE_LIMITED;
457 return ZIMG_RANGE_FULL;
459 return ZIMG_RANGE_LIMITED;
463 int colorspace,
int primaries,
int transfer,
int range,
int location)
479 static int graph_build(zimg_filter_graph **graph, zimg_graph_builder_params *params,
480 zimg_image_format *src_format, zimg_image_format *dst_format,
481 void **
tmp,
size_t *tmp_size)
486 zimg_filter_graph_free(*graph);
487 *graph = zimg_filter_graph_build(src_format, dst_format, params);
491 ret = zimg_filter_graph_get_tmp_size(*graph, &
size);
495 if (
size > *tmp_size) {
513 for (plane = 0; plane < 3; plane++) {
514 int p =
desc->comp[plane].plane;
521 aligned->format = (*frame)->format;
522 aligned->width = (*frame)->width;
523 aligned->height = (*frame)->height;
551 zimg_image_buffer_const src_buf = { ZIMG_API_VERSION };
552 zimg_image_buffer dst_buf = { ZIMG_API_VERSION };
566 out->width = outlink->
w;
567 out->height = outlink->
h;
572 ||
s->in_colorspace !=
in->colorspace
573 ||
s->in_trc !=
in->color_trc
574 ||
s->in_primaries !=
in->color_primaries
575 ||
s->in_range !=
in->color_range
576 ||
s->out_colorspace !=
out->colorspace
577 ||
s->out_trc !=
out->color_trc
578 ||
s->out_primaries !=
out->color_primaries
579 ||
s->out_range !=
out->color_range
580 ||
s->in_chromal !=
in->chroma_location
581 ||
s->out_chromal !=
out->chroma_location) {
582 snprintf(buf,
sizeof(buf)-1,
"%d", outlink->
w);
584 snprintf(buf,
sizeof(buf)-1,
"%d", outlink->
h);
588 link->dst->inputs[0]->w =
in->width;
589 link->dst->inputs[0]->h =
in->height;
594 zimg_image_format_default(&
s->src_format, ZIMG_API_VERSION);
595 zimg_image_format_default(&
s->dst_format, ZIMG_API_VERSION);
596 zimg_graph_builder_params_default(&
s->params, ZIMG_API_VERSION);
598 s->params.dither_type =
s->dither;
599 s->params.cpu_type = ZIMG_CPU_AUTO;
600 s->params.resample_filter =
s->filter;
601 s->params.resample_filter_uv =
s->filter;
602 s->params.nominal_peak_luminance =
s->nominal_peak_luminance;
603 s->params.allow_approximate_gamma =
s->approximate_gamma;
606 s->primaries_in,
s->trc_in,
s->range_in,
s->chromal_in);
608 s->primaries,
s->trc,
s->range,
s->chromal);
610 if (
s->colorspace != -1)
611 out->colorspace = (
int)
s->dst_format.matrix_coefficients;
613 if (
s->primaries != -1)
614 out->color_primaries = (
int)
s->dst_format.color_primaries;
617 out->color_range = (
int)
s->dst_format.pixel_range + 1;
620 out->color_trc = (
int)
s->dst_format.transfer_characteristics;
622 if (
s->chromal != -1)
623 out->chroma_location = (
int)
s->dst_format.chroma_location - 1;
626 &
s->tmp, &
s->tmp_size);
630 s->in_colorspace =
in->colorspace;
631 s->in_trc =
in->color_trc;
632 s->in_primaries =
in->color_primaries;
633 s->in_range =
in->color_range;
634 s->out_colorspace =
out->colorspace;
635 s->out_trc =
out->color_trc;
636 s->out_primaries =
out->color_primaries;
637 s->out_range =
out->color_range;
640 zimg_image_format_default(&
s->alpha_src_format, ZIMG_API_VERSION);
641 zimg_image_format_default(&
s->alpha_dst_format, ZIMG_API_VERSION);
642 zimg_graph_builder_params_default(&
s->alpha_params, ZIMG_API_VERSION);
644 s->alpha_params.dither_type =
s->dither;
645 s->alpha_params.cpu_type = ZIMG_CPU_AUTO;
646 s->alpha_params.resample_filter =
s->filter;
648 s->alpha_src_format.width =
in->width;
649 s->alpha_src_format.height =
in->height;
650 s->alpha_src_format.depth =
desc->comp[0].depth;
651 s->alpha_src_format.pixel_type = (
desc->flags &
AV_PIX_FMT_FLAG_FLOAT) ? ZIMG_PIXEL_FLOAT :
desc->comp[0].depth > 8 ? ZIMG_PIXEL_WORD : ZIMG_PIXEL_BYTE;
652 s->alpha_src_format.color_family = ZIMG_COLOR_GREY;
654 s->alpha_dst_format.width =
out->width;
655 s->alpha_dst_format.height =
out->height;
656 s->alpha_dst_format.depth = odesc->
comp[0].
depth;
658 s->alpha_dst_format.color_family = ZIMG_COLOR_GREY;
660 zimg_filter_graph_free(
s->alpha_graph);
661 s->alpha_graph = zimg_filter_graph_build(&
s->alpha_src_format, &
s->alpha_dst_format, &
s->alpha_params);
662 if (!
s->alpha_graph) {
669 if (
s->colorspace != -1)
670 out->colorspace = (
int)
s->dst_format.matrix_coefficients;
672 if (
s->primaries != -1)
673 out->color_primaries = (
int)
s->dst_format.color_primaries;
676 out->color_range = (
int)
s->dst_format.pixel_range;
679 out->color_trc = (
int)
s->dst_format.transfer_characteristics;
681 av_reduce(&
out->sample_aspect_ratio.num, &
out->sample_aspect_ratio.den,
682 (int64_t)
in->sample_aspect_ratio.num * outlink->
h *
link->w,
683 (int64_t)
in->sample_aspect_ratio.den * outlink->
w *
link->h,
686 for (plane = 0; plane < 3; plane++) {
687 int p =
desc->comp[plane].plane;
688 src_buf.plane[plane].data =
in->data[p];
689 src_buf.plane[plane].stride =
in->linesize[p];
690 src_buf.plane[plane].mask = -1;
693 dst_buf.plane[plane].data =
out->data[p];
694 dst_buf.plane[plane].stride =
out->linesize[p];
695 dst_buf.plane[plane].mask = -1;
698 ret = zimg_filter_graph_process(
s->graph, &src_buf, &dst_buf,
s->tmp, 0, 0, 0, 0);
705 src_buf.plane[0].data =
in->data[3];
706 src_buf.plane[0].stride =
in->linesize[3];
707 src_buf.plane[0].mask = -1;
709 dst_buf.plane[0].data =
out->data[3];
710 dst_buf.plane[0].stride =
out->linesize[3];
711 dst_buf.plane[0].mask = -1;
713 ret = zimg_filter_graph_process(
s->alpha_graph, &src_buf, &dst_buf,
s->tmp, 0, 0, 0, 0);
722 for (y = 0; y <
out->height; y++) {
723 for (x = 0; x <
out->width; x++) {
729 for (y = 0; y < outlink->
h; y++)
730 memset(
out->data[3] + y *
out->linesize[3], 0xff, outlink->
w);
748 zimg_filter_graph_free(
s->graph);
749 zimg_filter_graph_free(
s->alpha_graph);
755 char *res,
int res_len,
int flags)
760 if ( !strcmp(cmd,
"width") || !strcmp(cmd,
"w")
761 || !strcmp(cmd,
"height") || !strcmp(cmd,
"h")) {
778 #define OFFSET(x) offsetof(ZScaleContext, x)
779 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
780 #define TFLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
794 {
"error_diffusion", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_DITHER_ERROR_DIFFUSION}, 0, 0,
FLAGS,
"dither" },
816 {
"unspecified", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_UNSPECIFIED}, 0, 0,
FLAGS,
"primaries" },
853 {
"iec61966-2-4", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_IEC_61966_2_4},0, 0,
FLAGS,
"transfer" },
854 {
"iec61966-2-1", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_IEC_61966_2_1},0, 0,
FLAGS,
"transfer" },
875 {
"chroma-derived-nc",0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_MATRIX_CHROMATICITY_DERIVED_NCL}, 0, 0,
FLAGS,
"matrix" },
876 {
"chroma-derived-c", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_MATRIX_CHROMATICITY_DERIVED_CL}, 0, 0,
FLAGS,
"matrix" },
881 {
"primariesin",
"set input color primaries",
OFFSET(primaries_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS,
"primaries" },
883 {
"transferin",
"set input transfer characteristic",
OFFSET(trc_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS,
"transfer" },
885 {
"matrixin",
"set input colorspace matrix",
OFFSET(colorspace_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS,
"matrix" },
887 {
"chromal",
"set output chroma location",
OFFSET(chromal),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS,
"chroma" },
888 {
"c",
"set output chroma location",
OFFSET(chromal),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS,
"chroma" },
896 {
"chromalin",
"set input chroma location",
OFFSET(chromal_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS,
"chroma" },
897 {
"cin",
"set input chroma location",
OFFSET(chromal_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS,
"chroma" },
929 .priv_class = &zscale_class,