From patchwork Sun Dec 30 18:45:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 11590 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 6D56A44D01F for ; Sun, 30 Dec 2018 20:45:28 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2A96668A830; Sun, 30 Dec 2018 20:45:25 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f47.google.com (mail-wr1-f47.google.com [209.85.221.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 41EE168A812 for ; Sun, 30 Dec 2018 20:45:17 +0200 (EET) Received: by mail-wr1-f47.google.com with SMTP id z5so25072463wrt.11 for ; Sun, 30 Dec 2018 10:45:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=jkqxz-net.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=+2/Iohbpc3j09J7veNImFXHsDh7Vf0G2EQwl1fLdgF0=; b=0XyjzBxYenXwfnKoyeExOQWVDEhyzDuibcfrNhBmhW51yMqu25gqRfJChW7v/rY2D3 yW6xGfAxemYIDbC++O9ccpMll2q4E+diCjzvsywsQeFaARbbR+x+VK5V/9O9Wg6bCsQ2 O/LCmfKT7BaShZMpnbtSHbd9hxxUcqy+K883LBhmby9aQnSs5SkgmU9IJ2qkk14Cpa7c 7+fidra5LTPY0zFQAJpgPaUpnF0NAakg58FO6hDv35uEC7+rAXQKiaCFPmbCSqrd7LfY xfZTlkEiz6ECXdNk+kAssPFjzp2KGxgQLCT1tcw3VhPYWX6UctpGYo4dbOGMy1/QNNHG +kyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+2/Iohbpc3j09J7veNImFXHsDh7Vf0G2EQwl1fLdgF0=; b=aM6XuNDngXXb8esV9NuzviuMXZJMN1Wj3rxXoXUOAkyLjXhNQWShgvIpLkdP0bU+P5 1zVLNICN7NpnUhTyBGse5wNoJJavhnHhwKKqTij+rIhG0anHfnudpNeRVe0zYDDOLoz/ Bk8Odkj0HTuAvVvI1ePVGmi3n+resiCTeBtvwa6E0tAjeT+3GgWTtMhabIbMR+7MGNXz +9GxXRaZfmZMAAk51Sz0no8vqo/rUIrvaE+nzXvxFzK8AoGemUQRnyK3uSX4zjaWI5uF aA9M4RQ6eFJPyfruaOvprsfaEo6vlHh9UTayHrz7W5Etjuw3ZRt6rmS85MgUyXM776bC HYsQ== X-Gm-Message-State: AJcUukc210EkcsCbPyJT+g0/JqCvQ/3Rn1KGpGHfP6nQJKNtqMvxsF8Q X9v6EMI6Dr/+1wIhQuR86SiWxj94x/E= X-Google-Smtp-Source: ALg8bN6wutz89PGQx3tPnFt5S+xztuvQtIQON9RSs07cJB6PqXVV08w49O38ZkRPg8yfJZUoCuNwMQ== X-Received: by 2002:adf:de91:: with SMTP id w17mr33259115wrl.320.1546195523780; Sun, 30 Dec 2018 10:45:23 -0800 (PST) Received: from rywe.jkqxz.net (cpc91242-cmbg18-2-0-cust650.5-4.cable.virginm.net. [82.8.130.139]) by smtp.gmail.com with ESMTPSA id j8sm84985136wmd.0.2018.12.30.10.45.22 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 30 Dec 2018 10:45:23 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 30 Dec 2018 18:45:18 +0000 Message-Id: <20181230184518.4774-2-sw@jkqxz.net> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181230184518.4774-1-sw@jkqxz.net> References: <20181230184518.4774-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] vf_scale_vaapi: Add options to configure output colour properties X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The "out_color_matrix" and "out_range" properties match the same options in vf_scale; the others attempt to follow the same pattern. --- libavfilter/vf_scale_vaapi.c | 70 ++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/libavfilter/vf_scale_vaapi.c b/libavfilter/vf_scale_vaapi.c index b56217c56d..24d72ed82a 100644 --- a/libavfilter/vf_scale_vaapi.c +++ b/libavfilter/vf_scale_vaapi.c @@ -39,6 +39,17 @@ typedef struct ScaleVAAPIContext { char *w_expr; // width expression string char *h_expr; // height expression string + + char *colour_primaries_string; + char *colour_transfer_string; + char *colour_matrix_string; + int colour_range; + char *chroma_location_string; + + enum AVColorPrimaries colour_primaries; + enum AVColorTransferCharacteristic colour_transfer; + enum AVColorSpace colour_matrix; + enum AVChromaLocation chroma_location; } ScaleVAAPIContext; static const char *scale_vaapi_mode_name(int mode) @@ -116,6 +127,17 @@ static int scale_vaapi_filter_frame(AVFilterLink *inlink, AVFrame *input_frame) if (err < 0) goto fail; + if (ctx->colour_primaries != AVCOL_PRI_UNSPECIFIED) + output_frame->color_primaries = ctx->colour_primaries; + if (ctx->colour_transfer != AVCOL_TRC_UNSPECIFIED) + output_frame->color_trc = ctx->colour_transfer; + if (ctx->colour_matrix != AVCOL_SPC_UNSPECIFIED) + output_frame->colorspace = ctx->colour_matrix; + if (ctx->colour_range != AVCOL_RANGE_UNSPECIFIED) + output_frame->color_range = ctx->colour_range; + if (ctx->chroma_location != AVCHROMA_LOC_UNSPECIFIED) + output_frame->chroma_location = ctx->chroma_location; + output_surface = (VASurfaceID)(uintptr_t)output_frame->data[3]; av_log(avctx, AV_LOG_DEBUG, "Using surface %#x for scale output.\n", output_surface); @@ -183,6 +205,24 @@ static av_cold int scale_vaapi_init(AVFilterContext *avctx) vpp_ctx->output_format = AV_PIX_FMT_NONE; } +#define STRING_OPTION(var_name, func_name, default_value) do { \ + if (ctx->var_name ## _string) { \ + int var = av_ ## func_name ## _from_name(ctx->var_name ## _string); \ + if (var < 0) { \ + av_log(avctx, AV_LOG_ERROR, "Invalid %s.\n", #var_name); \ + return AVERROR(EINVAL); \ + } \ + ctx->var_name = var; \ + } else { \ + ctx->var_name = default_value; \ + } \ + } while (0) + + STRING_OPTION(colour_primaries, color_primaries, AVCOL_PRI_UNSPECIFIED); + STRING_OPTION(colour_transfer, color_transfer, AVCOL_TRC_UNSPECIFIED); + STRING_OPTION(colour_matrix, color_space, AVCOL_SPC_UNSPECIFIED); + STRING_OPTION(chroma_location, chroma_location, AVCHROMA_LOC_UNSPECIFIED); + return 0; } @@ -206,6 +246,36 @@ static const AVOption scale_vaapi_options[] = { 0, AV_OPT_TYPE_CONST, { .i64 = VA_FILTER_SCALING_HQ }, 0, 0, FLAGS, "mode" }, { "nl_anamorphic", "Use nolinear anamorphic scaling algorithm", 0, AV_OPT_TYPE_CONST, { .i64 = VA_FILTER_SCALING_NL_ANAMORPHIC }, 0, 0, FLAGS, "mode" }, + + // These colour properties match the ones of the same name in vf_scale. + { "out_color_matrix", "Output colour matrix coefficient set", + OFFSET(colour_matrix_string), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS }, + { "out_range", "Output colour range", + OFFSET(colour_range), AV_OPT_TYPE_INT, { .i64 = AVCOL_RANGE_UNSPECIFIED }, + AVCOL_RANGE_UNSPECIFIED, AVCOL_RANGE_JPEG, FLAGS, "range" }, + { "full", "Full range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, + { "limited", "Limited range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, + { "jpeg", "Full range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, + { "mpeg", "Limited range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, + { "tv", "Limited range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_MPEG }, 0, 0, FLAGS, "range" }, + { "pc", "Full range", + 0, AV_OPT_TYPE_CONST, { .i64 = AVCOL_RANGE_JPEG }, 0, 0, FLAGS, "range" }, + // These colour properties are new here. + { "out_color_primaries", "Output colour primaries", + OFFSET(colour_primaries_string), AV_OPT_TYPE_STRING, + { .str = NULL }, .flags = FLAGS }, + { "out_color_transfer", "Output colour transfer characteristics", + OFFSET(colour_transfer_string), AV_OPT_TYPE_STRING, + { .str = NULL }, .flags = FLAGS }, + { "out_chroma_location", "Output chroma sample location", + OFFSET(chroma_location_string), AV_OPT_TYPE_STRING, + { .str = NULL }, .flags = FLAGS }, + { NULL }, };