47 #define ZIMG_ALIGNMENT 32
137 if (
s->size_str && (
s->w_expr ||
s->h_expr)) {
139 "Size and width/height expressions cannot be set at the same time.\n");
143 if (
s->w_expr && !
s->h_expr)
144 FFSWAP(
char *,
s->w_expr,
s->size_str);
150 "Invalid size '%s'\n",
s->size_str);
153 snprintf(buf,
sizeof(buf)-1,
"%d",
s->w);
155 snprintf(buf,
sizeof(buf)-1,
"%d",
s->h);
206 double var_values[
VARS_NB], res;
209 int factor_w, factor_h;
217 (
double)
inlink->sample_aspect_ratio.num /
inlink->sample_aspect_ratio.den : 1;
273 if (
s->force_original_aspect_ratio) {
277 if (
s->force_original_aspect_ratio == 1) {
286 if (
w > INT_MAX ||
h > INT_MAX ||
301 if (
inlink->sample_aspect_ratio.num){
308 inlink->sample_aspect_ratio.num,
inlink->sample_aspect_ratio.den,
315 "Error when evaluating the expression '%s'.\n"
316 "Maybe the expression for out_w:'%s' or for out_h:'%s' is self-referencing.\n",
317 expr,
s->w_expr,
s->h_expr);
324 int err_code = zimg_get_last_error(err_msg,
sizeof(err_msg));
333 switch (chroma_location) {
336 return ZIMG_CHROMA_LEFT;
338 return ZIMG_CHROMA_CENTER;
340 return ZIMG_CHROMA_TOP_LEFT;
342 return ZIMG_CHROMA_TOP;
344 return ZIMG_CHROMA_BOTTOM_LEFT;
346 return ZIMG_CHROMA_BOTTOM;
348 return ZIMG_CHROMA_LEFT;
353 switch (colorspace) {
355 return ZIMG_MATRIX_RGB;
357 return ZIMG_MATRIX_709;
359 return ZIMG_MATRIX_UNSPECIFIED;
361 return ZIMG_MATRIX_FCC;
363 return ZIMG_MATRIX_470BG;
365 return ZIMG_MATRIX_170M;
367 return ZIMG_MATRIX_240M;
369 return ZIMG_MATRIX_YCGCO;
371 return ZIMG_MATRIX_2020_NCL;
373 return ZIMG_MATRIX_2020_CL;
375 return ZIMG_MATRIX_CHROMATICITY_DERIVED_NCL;
377 return ZIMG_MATRIX_CHROMATICITY_DERIVED_CL;
379 return ZIMG_MATRIX_ICTCP;
381 return ZIMG_MATRIX_UNSPECIFIED;
388 return ZIMG_TRANSFER_UNSPECIFIED;
390 return ZIMG_TRANSFER_709;
392 return ZIMG_TRANSFER_470_M;
394 return ZIMG_TRANSFER_470_BG;
396 return ZIMG_TRANSFER_601;
398 return ZIMG_TRANSFER_240M;
400 return ZIMG_TRANSFER_LINEAR;
402 return ZIMG_TRANSFER_LOG_100;
404 return ZIMG_TRANSFER_LOG_316;
406 return ZIMG_TRANSFER_IEC_61966_2_4;
408 return ZIMG_TRANSFER_2020_10;
410 return ZIMG_TRANSFER_2020_12;
412 return ZIMG_TRANSFER_ST2084;
414 return ZIMG_TRANSFER_ARIB_B67;
416 return ZIMG_TRANSFER_IEC_61966_2_1;
418 return ZIMG_TRANSFER_UNSPECIFIED;
425 return ZIMG_PRIMARIES_UNSPECIFIED;
427 return ZIMG_PRIMARIES_709;
429 return ZIMG_PRIMARIES_470_M;
431 return ZIMG_PRIMARIES_470_BG;
433 return ZIMG_PRIMARIES_170M;
435 return ZIMG_PRIMARIES_240M;
437 return ZIMG_PRIMARIES_FILM;
439 return ZIMG_PRIMARIES_2020;
441 return ZIMG_PRIMARIES_ST428;
443 return ZIMG_PRIMARIES_ST431_2;
445 return ZIMG_PRIMARIES_ST432_1;
447 return ZIMG_PRIMARIES_EBU3213_E;
449 return ZIMG_PRIMARIES_UNSPECIFIED;
457 return ZIMG_RANGE_LIMITED;
459 return ZIMG_RANGE_FULL;
461 return ZIMG_RANGE_LIMITED;
465 int colorspace,
int primaries,
int transfer,
int range,
int location)
481 static int graph_build(zimg_filter_graph **graph, zimg_graph_builder_params *params,
482 zimg_image_format *src_format, zimg_image_format *dst_format,
483 void **
tmp,
size_t *tmp_size)
488 zimg_filter_graph_free(*graph);
489 *graph = zimg_filter_graph_build(src_format, dst_format, params);
493 ret = zimg_filter_graph_get_tmp_size(*graph, &
size);
497 if (
size > *tmp_size) {
515 for (plane = 0; plane < 3; plane++) {
516 int p =
desc->comp[plane].plane;
523 aligned->format = (*frame)->format;
524 aligned->width = (*frame)->width;
525 aligned->height = (*frame)->height;
553 zimg_image_buffer_const src_buf = { ZIMG_API_VERSION };
554 zimg_image_buffer dst_buf = { ZIMG_API_VERSION };
568 out->width = outlink->
w;
569 out->height = outlink->
h;
574 ||
s->in_colorspace !=
in->colorspace
575 ||
s->in_trc !=
in->color_trc
576 ||
s->in_primaries !=
in->color_primaries
577 ||
s->in_range !=
in->color_range
578 ||
s->out_colorspace !=
out->colorspace
579 ||
s->out_trc !=
out->color_trc
580 ||
s->out_primaries !=
out->color_primaries
581 ||
s->out_range !=
out->color_range
582 ||
s->in_chromal !=
in->chroma_location
583 ||
s->out_chromal !=
out->chroma_location) {
584 snprintf(buf,
sizeof(buf)-1,
"%d", outlink->
w);
586 snprintf(buf,
sizeof(buf)-1,
"%d", outlink->
h);
590 link->dst->inputs[0]->w =
in->width;
591 link->dst->inputs[0]->h =
in->height;
596 zimg_image_format_default(&
s->src_format, ZIMG_API_VERSION);
597 zimg_image_format_default(&
s->dst_format, ZIMG_API_VERSION);
598 zimg_graph_builder_params_default(&
s->params, ZIMG_API_VERSION);
600 s->params.dither_type =
s->dither;
601 s->params.cpu_type = ZIMG_CPU_AUTO;
602 s->params.resample_filter =
s->filter;
603 s->params.resample_filter_uv =
s->filter;
604 s->params.nominal_peak_luminance =
s->nominal_peak_luminance;
605 s->params.allow_approximate_gamma =
s->approximate_gamma;
606 s->params.filter_param_a =
s->params.filter_param_a_uv =
s->param_a;
607 s->params.filter_param_b =
s->params.filter_param_b_uv =
s->param_b;
610 s->primaries_in,
s->trc_in,
s->range_in,
s->chromal_in);
612 s->primaries,
s->trc,
s->range,
s->chromal);
614 if (
s->colorspace != -1)
615 out->colorspace = (
int)
s->dst_format.matrix_coefficients;
617 if (
s->primaries != -1)
618 out->color_primaries = (
int)
s->dst_format.color_primaries;
621 out->color_range = (
int)
s->dst_format.pixel_range + 1;
624 out->color_trc = (
int)
s->dst_format.transfer_characteristics;
626 if (
s->chromal != -1)
627 out->chroma_location = (
int)
s->dst_format.chroma_location - 1;
630 &
s->tmp, &
s->tmp_size);
634 s->in_colorspace =
in->colorspace;
635 s->in_trc =
in->color_trc;
636 s->in_primaries =
in->color_primaries;
637 s->in_range =
in->color_range;
638 s->out_colorspace =
out->colorspace;
639 s->out_trc =
out->color_trc;
640 s->out_primaries =
out->color_primaries;
641 s->out_range =
out->color_range;
644 zimg_image_format_default(&
s->alpha_src_format, ZIMG_API_VERSION);
645 zimg_image_format_default(&
s->alpha_dst_format, ZIMG_API_VERSION);
646 zimg_graph_builder_params_default(&
s->alpha_params, ZIMG_API_VERSION);
648 s->alpha_params.dither_type =
s->dither;
649 s->alpha_params.cpu_type = ZIMG_CPU_AUTO;
650 s->alpha_params.resample_filter =
s->filter;
652 s->alpha_src_format.width =
in->width;
653 s->alpha_src_format.height =
in->height;
654 s->alpha_src_format.depth =
desc->comp[0].depth;
655 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;
656 s->alpha_src_format.color_family = ZIMG_COLOR_GREY;
658 s->alpha_dst_format.width =
out->width;
659 s->alpha_dst_format.height =
out->height;
660 s->alpha_dst_format.depth = odesc->
comp[0].
depth;
662 s->alpha_dst_format.color_family = ZIMG_COLOR_GREY;
664 zimg_filter_graph_free(
s->alpha_graph);
665 s->alpha_graph = zimg_filter_graph_build(&
s->alpha_src_format, &
s->alpha_dst_format, &
s->alpha_params);
666 if (!
s->alpha_graph) {
673 if (
s->colorspace != -1)
674 out->colorspace = (
int)
s->dst_format.matrix_coefficients;
676 if (
s->primaries != -1)
677 out->color_primaries = (
int)
s->dst_format.color_primaries;
680 out->color_range = (
int)
s->dst_format.pixel_range;
683 out->color_trc = (
int)
s->dst_format.transfer_characteristics;
685 av_reduce(&
out->sample_aspect_ratio.num, &
out->sample_aspect_ratio.den,
686 (int64_t)
in->sample_aspect_ratio.num * outlink->
h *
link->w,
687 (int64_t)
in->sample_aspect_ratio.den * outlink->
w *
link->h,
690 for (plane = 0; plane < 3; plane++) {
691 int p =
desc->comp[plane].plane;
692 src_buf.plane[plane].data =
in->data[p];
693 src_buf.plane[plane].stride =
in->linesize[p];
694 src_buf.plane[plane].mask = -1;
697 dst_buf.plane[plane].data =
out->data[p];
698 dst_buf.plane[plane].stride =
out->linesize[p];
699 dst_buf.plane[plane].mask = -1;
702 ret = zimg_filter_graph_process(
s->graph, &src_buf, &dst_buf,
s->tmp, 0, 0, 0, 0);
709 src_buf.plane[0].data =
in->data[3];
710 src_buf.plane[0].stride =
in->linesize[3];
711 src_buf.plane[0].mask = -1;
713 dst_buf.plane[0].data =
out->data[3];
714 dst_buf.plane[0].stride =
out->linesize[3];
715 dst_buf.plane[0].mask = -1;
717 ret = zimg_filter_graph_process(
s->alpha_graph, &src_buf, &dst_buf,
s->tmp, 0, 0, 0, 0);
726 for (y = 0; y <
out->height; y++) {
727 for (x = 0; x <
out->width; x++) {
733 for (y = 0; y < outlink->
h; y++)
734 memset(
out->data[3] + y *
out->linesize[3], 0xff, outlink->
w);
752 zimg_filter_graph_free(
s->graph);
753 zimg_filter_graph_free(
s->alpha_graph);
759 char *res,
int res_len,
int flags)
764 if ( !strcmp(cmd,
"width") || !strcmp(cmd,
"w")
765 || !strcmp(cmd,
"height") || !strcmp(cmd,
"h")) {
782 #define OFFSET(x) offsetof(ZScaleContext, x)
783 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
784 #define TFLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_RUNTIME_PARAM
798 {
"error_diffusion", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_DITHER_ERROR_DIFFUSION}, 0, 0,
FLAGS,
"dither" },
820 {
"unspecified", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_PRIMARIES_UNSPECIFIED}, 0, 0,
FLAGS,
"primaries" },
857 {
"iec61966-2-4", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_IEC_61966_2_4},0, 0,
FLAGS,
"transfer" },
858 {
"iec61966-2-1", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_TRANSFER_IEC_61966_2_1},0, 0,
FLAGS,
"transfer" },
879 {
"chroma-derived-nc",0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_MATRIX_CHROMATICITY_DERIVED_NCL}, 0, 0,
FLAGS,
"matrix" },
880 {
"chroma-derived-c", 0, 0,
AV_OPT_TYPE_CONST, {.i64 = ZIMG_MATRIX_CHROMATICITY_DERIVED_CL}, 0, 0,
FLAGS,
"matrix" },
885 {
"primariesin",
"set input color primaries",
OFFSET(primaries_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS,
"primaries" },
887 {
"transferin",
"set input transfer characteristic",
OFFSET(trc_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS,
"transfer" },
889 {
"matrixin",
"set input colorspace matrix",
OFFSET(colorspace_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX,
FLAGS,
"matrix" },
891 {
"chromal",
"set output chroma location",
OFFSET(chromal),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS,
"chroma" },
892 {
"c",
"set output chroma location",
OFFSET(chromal),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS,
"chroma" },
900 {
"chromalin",
"set input chroma location",
OFFSET(chromal_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS,
"chroma" },
901 {
"cin",
"set input chroma location",
OFFSET(chromal_in),
AV_OPT_TYPE_INT, {.i64 = -1}, -1, ZIMG_CHROMA_BOTTOM,
FLAGS,
"chroma" },
904 {
"param_a",
"parameter A, which is parameter \"b\" for bicubic, "
936 .priv_class = &zscale_class,