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,