diff --git a/libavfilter/vf_scale.c b/libavfilter/vf_scale.c index fb8e6a2b76..b45035907b 100644 --- a/libavfilter/vf_scale.c +++ b/libavfilter/vf_scale.c @@ -799,18 +799,6 @@ scale: out->width = outlink->w; out->height = outlink->h; - // Sanity checks: - // 1. If the output is RGB, set the matrix coefficients to RGB. - // 2. If the output is not RGB and we've got the RGB/XYZ (identity) - // matrix configured, unset the matrix. - // In theory these should be in swscale itself as the AVFrame - // based API gets in, so that not every swscale API user has - // to go through duplicating such sanity checks. - if (av_pix_fmt_desc_get(out->format)->flags & AV_PIX_FMT_FLAG_RGB) - out->colorspace = AVCOL_SPC_RGB; - else if (out->colorspace == AVCOL_SPC_RGB) - out->colorspace = AVCOL_SPC_UNSPECIFIED; - if (scale->output_is_pal) avpriv_set_systematic_pal2((uint32_t*)out->data[1], outlink->format == AV_PIX_FMT_PAL8 ? AV_PIX_FMT_BGR8 : outlink->format); @@ -857,8 +845,22 @@ scale: brightness, contrast, saturation); out->color_range = out_full ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; + if (scale->out_color_matrix != AVCOL_SPC_UNSPECIFIED) + out->colorspace = scale->out_color_matrix; } + // Sanity checks: + // 1. If the output is RGB, set the matrix coefficients to RGB. + // 2. If the output is not RGB and we've got the RGB/XYZ (identity) + // matrix configured, unset the matrix. + // In theory these should be in swscale itself as the AVFrame + // based API gets in, so that not every swscale API user has + // to go through duplicating such sanity checks. + if (av_pix_fmt_desc_get(out->format)->flags & AV_PIX_FMT_FLAG_RGB) + out->colorspace = AVCOL_SPC_RGB; + else if (out->colorspace == AVCOL_SPC_RGB) + out->colorspace = AVCOL_SPC_UNSPECIFIED; + av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den, (int64_t)in->sample_aspect_ratio.num * outlink->h * link->w, (int64_t)in->sample_aspect_ratio.den * outlink->w * link->h,