From patchwork Thu Mar 5 00:25:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 18031 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 DD23444AFCE for ; Thu, 5 Mar 2020 02:34:09 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B760668B1D0; Thu, 5 Mar 2020 02:34:09 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 755F36880FD for ; Thu, 5 Mar 2020 02:34:03 +0200 (EET) Received: by mail-wr1-f68.google.com with SMTP id n7so4854973wrt.11 for ; Wed, 04 Mar 2020 16:34:03 -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:mime-version :content-transfer-encoding; bh=T3tctoHOju/XLxNIxES+rIzkByNqA46ZR0YDm4AyChg=; b=QpkfZm1hXbuKBXBwSwR5mLvI4u78Dhvl3wKXBzQQaf5qQPDJeEAdyNfOHiSrXKFllL yh2FuZeAqZnYErDpUWv0jisJjeX9GMsEFxajbL291X3RcMARrAxltqraxLckSEdm3cS4 8ThuLfw/wD8mwWDQlsbfRULLSahnP4Iz7Fzr5EouFHVmxTMJnATcU/N0eskYGBhHLohs QQAgszucx7BXdmUVBjDf+n1wA10Ca8aHtDukJUlkOnLBkq1Tub2kF0in6Ok17bMq2uoV YhN560xevgnxuWN9AIoUlrxJJdDWj4tOOVRmn4dRIxsLaGEUHPT2cAPRrShNmeW5Faxq bZww== 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:mime-version :content-transfer-encoding; bh=T3tctoHOju/XLxNIxES+rIzkByNqA46ZR0YDm4AyChg=; b=PUXVLEDpWPrYDcHbADWzTi4aa0j/h5FKudylA1YzInav7BvKRTbXag9ywBQGWTpgww 2vrqp4Qso//bBSZY5YRfbvY+c1j+z7Lk6mim5jH2Rrr53ROq8rHTl+zK0ymN/+nd5wUH BvpDGUlBfDvopp/p+cAP44/1ZM3gXweN0fy/JeI9GQOruwChlX3s5Jq5SZWvfdH6/AbL BRk6vi15j74AMKFpy0m14wRS5P8yiLtXCs/waLgOrQLbq1kKUlQ/NgMdsAOrO1XVGvA8 XlcVcS+zhFYA9jjRfv2+aS4kbOTxcz4422GYiefPQKTwuYnCKP8J468YGhWonCGTAG6/ WArw== X-Gm-Message-State: ANhLgQ0TqTnV52ARJfOtwPfPqpOIPJ0Hyrt7q0upXpydUui5v8J89MHy 5IDNO6hTzgfFa+ZU1Urhwl/cooaxZZk= X-Google-Smtp-Source: ADFU+vsaEDPf385LQNGrkW9CaODPNOmvIK4gI9Ar7h5s7DVcasEg0+XXVa6ly2RjctkiQjP3/1rQgA== X-Received: by 2002:a5d:4389:: with SMTP id i9mr5847650wrq.90.1583367935856; Wed, 04 Mar 2020 16:25:35 -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 k65sm7106943wmf.1.2020.03.04.16.25.34 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2020 16:25:35 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Thu, 5 Mar 2020 00:25:25 +0000 Message-Id: <20200305002528.11418-1-sw@jkqxz.net> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/4] vaapi_encode: Move block size calculation after entrypoint selection 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 block size can be dependent on the profile and entrypoint selected. It defaults to 16x16, with codecs able to override this choice with their own function. --- libavcodec/vaapi_encode.c | 14 ++++++++++++++ libavcodec/vaapi_encode.h | 6 ++++++ libavcodec/vaapi_encode_h265.c | 32 ++++++++++++++++++++++++++------ libavcodec/vaapi_encode_mjpeg.c | 16 +++++++++++++--- libavcodec/vaapi_encode_mpeg2.c | 3 --- libavcodec/vaapi_encode_vp8.c | 3 --- libavcodec/vaapi_encode_vp9.c | 14 ++++++++++---- 7 files changed, 69 insertions(+), 19 deletions(-) diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index 8ff720e395..93bbed4539 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -1840,6 +1840,8 @@ static av_cold int vaapi_encode_init_slice_structure(AVCodecContext *avctx) return 0; } + av_assert0(ctx->slice_block_height > 0 && ctx->slice_block_width > 0); + ctx->slice_block_rows = (avctx->height + ctx->slice_block_height - 1) / ctx->slice_block_height; ctx->slice_block_cols = (avctx->width + ctx->slice_block_width - 1) / @@ -2237,6 +2239,18 @@ av_cold int ff_vaapi_encode_init(AVCodecContext *avctx) if (err < 0) goto fail; + if (ctx->codec->block_size) { + ctx->codec->block_size(avctx); + } else { + // Assume 16x16 blocks. + ctx->surface_width = FFALIGN(avctx->width, 16); + ctx->surface_height = FFALIGN(avctx->height, 16); + if (ctx->codec->flags & FLAG_SLICE_CONTROL) { + ctx->slice_block_width = 16; + ctx->slice_block_height = 16; + } + } + err = vaapi_encode_init_rate_control(avctx); if (err < 0) goto fail; diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index b9a3defd72..583be9c845 100644 --- a/libavcodec/vaapi_encode.h +++ b/libavcodec/vaapi_encode.h @@ -355,6 +355,12 @@ typedef struct VAAPIEncodeType { // factor depending on RC mode. int default_quality; + // Determine block sizes for surface alignment and slices. This may + // need to query the profile and entrypoint, which will be available + // when this function is called. If not set, assume that all blocks + // are 16x16 and that surfaces should be aligned to match this. + void (*block_size)(AVCodecContext *avctx); + // Perform any extra codec-specific configuration after the // codec context is initialised (set up the private data and // add any necessary global parameters). diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c index 538862a9d5..9a78dfb4f7 100644 --- a/libavcodec/vaapi_encode_h265.c +++ b/libavcodec/vaapi_encode_h265.c @@ -55,6 +55,10 @@ typedef struct VAAPIEncodeH265Picture { typedef struct VAAPIEncodeH265Context { VAAPIEncodeContext common; + // Encoder features. + uint32_t ctu_size; + uint32_t min_cb_size; + // User options. int qp; int aud; @@ -1062,6 +1066,27 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx, return 0; } +static av_cold void vaapi_encode_h265_block_size(AVCodecContext *avctx) +{ + VAAPIEncodeContext *ctx = avctx->priv_data; + VAAPIEncodeH265Context *priv = avctx->priv_data; + + if (!priv->ctu_size) { + priv->ctu_size = 32; + priv->min_cb_size = 16; + } + av_log(avctx, AV_LOG_VERBOSE, "Using CTU size %dx%d, " + "min CB size %dx%d.\n", priv->ctu_size, priv->ctu_size, + priv->min_cb_size, priv->min_cb_size); + + ctx->surface_width = FFALIGN(avctx->width, priv->min_cb_size); + ctx->surface_height = FFALIGN(avctx->height, priv->min_cb_size); + + ctx->slice_block_width = ctx->slice_block_height = priv->ctu_size; + + return; +} + static av_cold int vaapi_encode_h265_configure(AVCodecContext *avctx) { VAAPIEncodeContext *ctx = avctx->priv_data; @@ -1127,6 +1152,7 @@ static const VAAPIEncodeType vaapi_encode_type_h265 = { .default_quality = 25, + .block_size = &vaapi_encode_h265_block_size, .configure = &vaapi_encode_h265_configure, .picture_priv_data_size = sizeof(VAAPIEncodeH265Picture), @@ -1172,12 +1198,6 @@ static av_cold int vaapi_encode_h265_init(AVCodecContext *avctx) VA_ENC_PACKED_HEADER_SLICE | // Slice headers. VA_ENC_PACKED_HEADER_MISC; // SEI - ctx->surface_width = FFALIGN(avctx->width, 16); - ctx->surface_height = FFALIGN(avctx->height, 16); - - // CTU size is currently hard-coded to 32. - ctx->slice_block_width = ctx->slice_block_height = 32; - if (priv->qp > 0) ctx->explicit_qp = priv->qp; diff --git a/libavcodec/vaapi_encode_mjpeg.c b/libavcodec/vaapi_encode_mjpeg.c index bd029cc903..0d992d6f44 100644 --- a/libavcodec/vaapi_encode_mjpeg.c +++ b/libavcodec/vaapi_encode_mjpeg.c @@ -434,6 +434,18 @@ static int vaapi_encode_mjpeg_init_slice_params(AVCodecContext *avctx, return 0; } +static av_cold void vaapi_encode_mjpeg_block_size(AVCodecContext *avctx) +{ + VAAPIEncodeContext *ctx = avctx->priv_data; + const AVPixFmtDescriptor *desc; + + desc = av_pix_fmt_desc_get(ctx->input_frames->sw_format); + av_assert0(desc); + + ctx->surface_width = FFALIGN(avctx->width, 8 << desc->log2_chroma_w); + ctx->surface_height = FFALIGN(avctx->height, 8 << desc->log2_chroma_h); +} + static av_cold int vaapi_encode_mjpeg_configure(AVCodecContext *avctx) { VAAPIEncodeContext *ctx = avctx->priv_data; @@ -483,6 +495,7 @@ static const VAAPIEncodeType vaapi_encode_type_mjpeg = { .flags = FLAG_CONSTANT_QUALITY_ONLY | FLAG_INTRA_ONLY, + .block_size = &vaapi_encode_mjpeg_block_size, .configure = &vaapi_encode_mjpeg_configure, .default_quality = 80, @@ -509,9 +522,6 @@ static av_cold int vaapi_encode_mjpeg_init(AVCodecContext *avctx) ctx->desired_packed_headers = VA_ENC_PACKED_HEADER_RAW_DATA; - ctx->surface_width = FFALIGN(avctx->width, 8); - ctx->surface_height = FFALIGN(avctx->height, 8); - return ff_vaapi_encode_init(avctx); } diff --git a/libavcodec/vaapi_encode_mpeg2.c b/libavcodec/vaapi_encode_mpeg2.c index bac9ea1fa6..442321b55c 100644 --- a/libavcodec/vaapi_encode_mpeg2.c +++ b/libavcodec/vaapi_encode_mpeg2.c @@ -623,9 +623,6 @@ static av_cold int vaapi_encode_mpeg2_init(AVCodecContext *avctx) ctx->desired_packed_headers = VA_ENC_PACKED_HEADER_SEQUENCE | VA_ENC_PACKED_HEADER_PICTURE; - ctx->surface_width = FFALIGN(avctx->width, 16); - ctx->surface_height = FFALIGN(avctx->height, 16); - return ff_vaapi_encode_init(avctx); } diff --git a/libavcodec/vaapi_encode_vp8.c b/libavcodec/vaapi_encode_vp8.c index 6e7bf9d106..93d8b57316 100644 --- a/libavcodec/vaapi_encode_vp8.c +++ b/libavcodec/vaapi_encode_vp8.c @@ -210,9 +210,6 @@ static av_cold int vaapi_encode_vp8_init(AVCodecContext *avctx) // adding them anyway. ctx->desired_packed_headers = 0; - ctx->surface_width = FFALIGN(avctx->width, 16); - ctx->surface_height = FFALIGN(avctx->height, 16); - return ff_vaapi_encode_init(avctx); } diff --git a/libavcodec/vaapi_encode_vp9.c b/libavcodec/vaapi_encode_vp9.c index d7f415d704..19093bfa71 100644 --- a/libavcodec/vaapi_encode_vp9.c +++ b/libavcodec/vaapi_encode_vp9.c @@ -176,6 +176,15 @@ static int vaapi_encode_vp9_init_picture_params(AVCodecContext *avctx, return 0; } +static av_cold void vaapi_encode_vp9_block_size(AVCodecContext *avctx) +{ + VAAPIEncodeContext *ctx = avctx->priv_data; + + // Surfaces must be aligned to 64x64 superblock boundaries. + ctx->surface_width = FFALIGN(avctx->width, 64); + ctx->surface_height = FFALIGN(avctx->height, 64); +} + static av_cold int vaapi_encode_vp9_configure(AVCodecContext *avctx) { VAAPIEncodeContext *ctx = avctx->priv_data; @@ -223,6 +232,7 @@ static const VAAPIEncodeType vaapi_encode_type_vp9 = { .picture_priv_data_size = sizeof(VAAPIEncodeVP9Picture), + .block_size = &vaapi_encode_vp9_block_size, .configure = &vaapi_encode_vp9_configure, .sequence_params_size = sizeof(VAEncSequenceParameterBufferVP9), @@ -243,10 +253,6 @@ static av_cold int vaapi_encode_vp9_init(AVCodecContext *avctx) // can write its own headers and there is no metadata to include. ctx->desired_packed_headers = 0; - // Surfaces must be aligned to superblock boundaries. - ctx->surface_width = FFALIGN(avctx->width, 64); - ctx->surface_height = FFALIGN(avctx->height, 64); - return ff_vaapi_encode_init(avctx); } From patchwork Thu Mar 5 00:25:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 18037 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 A95BB44AA1D for ; Thu, 5 Mar 2020 02:50:50 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 846F368B13A; Thu, 5 Mar 2020 02:50:50 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E358E6891FF for ; Thu, 5 Mar 2020 02:50:43 +0200 (EET) Received: by mail-wr1-f52.google.com with SMTP id v11so2957057wrm.9 for ; Wed, 04 Mar 2020 16:50:43 -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=S2PSjxxywOU98f4yHfbnavUNwwmVHoMZHgxBbiXBwIE=; b=HqZVci6CB2HJdWhrehg6DoaVMLr7lRObosi/INDB/tnFzUI9GRLVNiaFqL+A3z9W5b p2/JofBlpwJJyzjrTzu40oy8TFjhnGUNZlxSl/hmufNBYgJTFoOPwhO7rRQnIFuIOQjx N6LICiA7nh8mXbYNYBtCMFXjRx68a6E+TbX9tQyw5e9vno20WWIGANxw5/mclfybpuhZ ioPVxUFIr0Plg+uS4tx3Yv+l+BQrBghdcs9zji/grOiUhlE6u3NoH9D3wg2tK0fbxte3 CnEW79gnAjB1ZROU960DCkjfTVOoRBP0wovGcjJlwBSEKvM+3ipPYXuXDxY5OdfmDDGd qoHg== 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=S2PSjxxywOU98f4yHfbnavUNwwmVHoMZHgxBbiXBwIE=; b=dIzyl6rnHSKz9BzgtxcEwNZEkHGyMqWWtEjMyyhU/Ctwl26KGTd3FJXu163CwF87Sq aWzZb1z5qKemcBya1ynaL9fql5P+uIKqzBeklOdpnaPEiCVGIb8nYa1h5fATNPCviVMN DFPVzFPsFNtdlXvdS1l6gKDCcS3dycRMz9ot+3jA5kqaZJJAds99f6uWY+J1fuqSozDY x4IlofCpmojsUvnl0wF2nRod/Iin0rSl0qU0Ifp7jj4iXD1AC5720KAUuKK7Wcm+BEuT H5S0gBAJPq2CkZ3Kyq2C6hiR98ra0Ox/QjAMNHke3VoVVC34H7Amyrv5fUJ5dVp03FUL YBwA== X-Gm-Message-State: ANhLgQ0Mr9Qoz4erBg3TKc0D0sQUc0kH3cK50j0mhArYaf7KpqMuwu8o HExu93XhagX4bL4L6q3KyVwdo7ZGdUI= X-Google-Smtp-Source: ADFU+vuv1rpDKj1wV44KBD2pZ96eRhAG1FVJLwGLYtgW0BXHsxG5zJYOHKtZvrPJR4s8+/MVe1a0ug== X-Received: by 2002:a5d:608e:: with SMTP id w14mr6973349wrt.201.1583367936622; Wed, 04 Mar 2020 16:25:36 -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 k65sm7106943wmf.1.2020.03.04.16.25.35 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2020 16:25:36 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Thu, 5 Mar 2020 00:25:26 +0000 Message-Id: <20200305002528.11418-2-sw@jkqxz.net> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200305002528.11418-1-sw@jkqxz.net> References: <20200305002528.11418-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/4] vaapi_encode_h265: Explicitly set all profile constraint flags 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" max_14bit_constraint_flag should be set if the bit depth is not greater than 14 (currently always true). one_picture_only_flag should not be set because we don't support the still picture profiles. --- libavcodec/vaapi_encode_h265.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c index 9a78dfb4f7..dcc22eb610 100644 --- a/libavcodec/vaapi_encode_h265.c +++ b/libavcodec/vaapi_encode_h265.c @@ -330,6 +330,7 @@ static int vaapi_encode_h265_init_sequence_params(AVCodecContext *avctx) ptl->general_non_packed_constraint_flag = 1; ptl->general_frame_only_constraint_flag = 1; + ptl->general_max_14bit_constraint_flag = bit_depth <= 14; ptl->general_max_12bit_constraint_flag = bit_depth <= 12; ptl->general_max_10bit_constraint_flag = bit_depth <= 10; ptl->general_max_8bit_constraint_flag = bit_depth == 8; @@ -339,6 +340,7 @@ static int vaapi_encode_h265_init_sequence_params(AVCodecContext *avctx) ptl->general_max_monochrome_constraint_flag = chroma_format == 0; ptl->general_intra_constraint_flag = ctx->gop_size == 1; + ptl->general_one_picture_only_constraint_flag = 0; ptl->general_lower_bit_rate_constraint_flag = 1; From patchwork Thu Mar 5 00:25:27 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 18029 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 8CAE1449D98 for ; Thu, 5 Mar 2020 02:25:45 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6848568B1E2; Thu, 5 Mar 2020 02:25:45 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8329F68AE27 for ; Thu, 5 Mar 2020 02:25:38 +0200 (EET) Received: by mail-wr1-f49.google.com with SMTP id v11so2904679wrm.9 for ; Wed, 04 Mar 2020 16:25:38 -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=IW60GcYuZdkdZkqACJoOyISgkvdCpBia2qfSy5RFFYg=; b=UEf+kYuwOPN2e/HmQvgOJz+oi9emmCdNXT4056DL8rSZU3ZxEFSn111LaC+9YvCSV4 k9ksotGV/TMDqwf/vJKNCm0gk38XXJWIJC3diZgKmEOZIHLvy2LKPR8hwUH6z2fTke3n Rc/5weFMSqu3KjANdx3Jv0b6V+s5IqKrBpCuo3wBvOwX2EpYk8q8SIyOtRZrVUzcb7J2 lgUMZNDB/jjqcMklBc7AphTs7/u80ii6/Zqd0zrG4wTkmzxoRo6QTqEsHq/I7pczQSe9 5Yq3cx0eKcqi9IQHsdsYsSOE96NiMZItfYD94pXmiJtXw0wkpbsIAcWjeyrw7fm8mULx /XGQ== 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=IW60GcYuZdkdZkqACJoOyISgkvdCpBia2qfSy5RFFYg=; b=nPLUaNdzGIrAbPlSG0Yyix3n7i1RkQ3CDDq78pBKpMCETzQuUgzgFW+zRK/yga/bjH aOzzOKArifCHaLTBciMKWUpD74v0mIxezcP4+kJhocp/c60hNzEOJkW25Bq0m9qPUSdT 6dGL4BseZK6lcHHTvPd1kiFE0+LCmpjSe4qXL73fG9ekiqJ179vpwNbNUQCq7//xHQFr RJ4FX51WSYtjVEIbF1eJ7eqALZxckwW1Fvnc+Ta5l7fYEXhvOh9tcTvLyBR+Nv+mK1wz U22dyvmjBmq0HhpOCPL3H7kZTuw1XAlNIthAOciIv+tun9yvrnAy1tkrijffB0M+yOtW 2AGg== X-Gm-Message-State: ANhLgQ3dFYLNORDGjw04uRq1rF3fzHt2XPp8muG20aB6fUm8Xz0pjeDP YRl9VF6EPrBly3UnKSZO1ND5NwHE5Vs= X-Google-Smtp-Source: ADFU+vs6rqRQGugEEYG4oc4cU7fg4HqWJKGkD7NEYEXNbj5FigTE0p/pgGAcnmiHqgoJWriVAB5FPw== X-Received: by 2002:adf:fdc2:: with SMTP id i2mr6948516wrs.166.1583367937579; Wed, 04 Mar 2020 16:25:37 -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 k65sm7106943wmf.1.2020.03.04.16.25.36 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2020 16:25:36 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Thu, 5 Mar 2020 00:25:27 +0000 Message-Id: <20200305002528.11418-3-sw@jkqxz.net> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200305002528.11418-1-sw@jkqxz.net> References: <20200305002528.11418-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/4] vaapi_encode_h265: Query encoding block sizes and features 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" --- Requires . That isn't upstream, so this will need to wait for that and then get at least a fix to the version numbering before applying. libavcodec/vaapi_encode_h265.c | 91 +++++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 17 deletions(-) diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c index dcc22eb610..59d150f503 100644 --- a/libavcodec/vaapi_encode_h265.c +++ b/libavcodec/vaapi_encode_h265.c @@ -56,6 +56,7 @@ typedef struct VAAPIEncodeH265Context { VAAPIEncodeContext common; // Encoder features. + uint32_t va_features; uint32_t ctu_size; uint32_t min_cb_size; @@ -440,23 +441,54 @@ static int vaapi_encode_h265_init_sequence_params(AVCodecContext *avctx) vps->vps_max_latency_increase_plus1[i]; } - // These have to come from the capabilities of the encoder. We have no - // way to query them, so just hardcode parameters which work on the Intel - // driver. - // CTB size from 8x8 to 32x32. - sps->log2_min_luma_coding_block_size_minus3 = 0; - sps->log2_diff_max_min_luma_coding_block_size = 2; - // Transform size from 4x4 to 32x32. - sps->log2_min_luma_transform_block_size_minus2 = 0; - sps->log2_diff_max_min_luma_transform_block_size = 3; - // Full transform hierarchy allowed (2-5). - sps->max_transform_hierarchy_depth_inter = 3; - sps->max_transform_hierarchy_depth_intra = 3; - // AMP works. - sps->amp_enabled_flag = 1; - // SAO and temporal MVP do not work. - sps->sample_adaptive_offset_enabled_flag = 0; - sps->sps_temporal_mvp_enabled_flag = 0; +#if VA_CHECK_VERSION(1, 7, 0) + if (priv->va_features) { + VAConfigAttribValEncHEVCFeatures features = { .value = priv->va_features }; + + sps->log2_min_luma_coding_block_size_minus3 = + ff_ctz(priv->min_cb_size) - 3; + sps->log2_diff_max_min_luma_coding_block_size = + ff_ctz(priv->ctu_size) - ff_ctz(priv->min_cb_size); + + sps->log2_min_luma_transform_block_size_minus2 = + features.bits.log2_min_luma_transform_block_size_minus2; + sps->log2_diff_max_min_luma_transform_block_size = + features.bits.log2_max_luma_transform_block_size_minus2 - + features.bits.log2_min_luma_transform_block_size_minus2; + + sps->max_transform_hierarchy_depth_inter = + features.bits.max_transform_hierarchy_depth_inter; + sps->max_transform_hierarchy_depth_intra = + features.bits.max_transform_hierarchy_depth_intra; + + sps->amp_enabled_flag = + features.bits.amp_supported; + sps->sample_adaptive_offset_enabled_flag = + features.bits.sao_supported; + sps->sps_temporal_mvp_enabled_flag = + features.bits.temporal_mvp_supported; + } else +#endif + { + // These values come from the capabilities of the first encoder + // implementation in the i965 driver on Intel Skylake. They may + // fail badly with other platforms or drivers. + // CTB size from 8x8 to 32x32. + sps->log2_min_luma_coding_block_size_minus3 = 0; + sps->log2_diff_max_min_luma_coding_block_size = 2; + // Transform size from 4x4 to 32x32. + sps->log2_min_luma_transform_block_size_minus2 = 0; + sps->log2_diff_max_min_luma_transform_block_size = 3; + // Full transform hierarchy allowed (2-5). + sps->max_transform_hierarchy_depth_inter = 3; + sps->max_transform_hierarchy_depth_intra = 3; + // AMP works. + sps->amp_enabled_flag = 1; + // SAO and temporal MVP do not work. + sps->sample_adaptive_offset_enabled_flag = 0; + sps->sps_temporal_mvp_enabled_flag = 0; + } + sps->pcm_enabled_flag = 0; @@ -1073,6 +1105,31 @@ static av_cold void vaapi_encode_h265_block_size(AVCodecContext *avctx) VAAPIEncodeContext *ctx = avctx->priv_data; VAAPIEncodeH265Context *priv = avctx->priv_data; +#if VA_CHECK_VERSION(1, 7, 0) + { + VAConfigAttrib attr = { VAConfigAttribEncHEVCFeatures }; + VAConfigAttribValEncHEVCFeatures features; + VAStatus vas; + + vas = vaGetConfigAttributes(ctx->hwctx->display, ctx->va_profile, + ctx->va_entrypoint, &attr, 1); + if (vas != VA_STATUS_SUCCESS) { + av_log(avctx, AV_LOG_WARNING, "Failed to query encoder " + "features, using guessed defaults.\n"); + } else if (attr.value == VA_ATTRIB_NOT_SUPPORTED) { + av_log(avctx, AV_LOG_WARNING, "Driver does not advertise " + "encoder features, using guessed defaults.\n"); + } else { + features.value = priv->va_features = attr.value; + + priv->ctu_size = + 1 << features.bits.log2_max_coding_tree_block_size_minus3 + 3; + priv->min_cb_size = + 1 << features.bits.log2_min_luma_coding_block_size_minus3 + 3; + } + } +#endif + if (!priv->ctu_size) { priv->ctu_size = 32; priv->min_cb_size = 16; From patchwork Thu Mar 5 00:25:28 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 18030 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 4BCE9449D98 for ; Thu, 5 Mar 2020 02:25:46 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3B24A68B419; Thu, 5 Mar 2020 02:25:46 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7578068B1E2 for ; Thu, 5 Mar 2020 02:25:39 +0200 (EET) Received: by mail-wr1-f46.google.com with SMTP id q8so4868556wrm.4 for ; Wed, 04 Mar 2020 16:25:39 -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=OtxNb4+j93YbXM+/IuucH6YbIEdIDgT0nwrVzeYBKmg=; b=ARu5YzOvBOay2POPKHmk4//sgSLTH5J/aIUEPwRj1XkPUsBrq2Ons7VCUZgRvEFSvw 8wenozWkrQEwr687+mRxCShgM7mxI+qofm0sPLlDSqt62CgQmN4MXirNowvUNkGg+WbC Gz2DsmL82+SiOWvBuqBP46F4tZnS6j7bp9KVZOcdnWJw7DJsIwuHs81jw7q3H/fH/Kah wjxKAV7IZkSjKvO0qUc1ndTxOuwdhJKXmnNk+ZsQjTAW5/pCMGLcVWDEkBlKBs3qmg1J fQOkzoZMHZ97XjVe/DZpyvTvUqm9MoxPocEAQ4ctzG+xuZ6HONCJEWVypGFpqjR9i01o RKgg== 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=OtxNb4+j93YbXM+/IuucH6YbIEdIDgT0nwrVzeYBKmg=; b=UD+Z+Zru5ntHhHaz98eNYQFFJEDCobeQjDW3yUMcLeuHHN1l41g28Vz6R71EEE/dQJ 5apLF0EiPFwE9jT8Io8VXqx8fCYrdKFmB7X9RAUzLY0WCC+VewINZiZBJGX4W4yc7DdY OTer52+kHuwBc0EFgDstWYpImvZdfGL3zyWfsspWwnwRlD4P7LKWHbzpeJ7k2p+WQkF6 0iiOAQ9Oys7SbZMXMtNuPNzc5OfOlmhSXKQ6+pvvON0078cLTp+oi8q+uyII00L46Wxi QFWunO0ww4C3PYoUP9VI8s9jzL07WJuscKS7XhuYMy+LwweimO+IkC872KxNGdO7Cx1a rz6w== X-Gm-Message-State: ANhLgQ29IUQuXs87a+rOKAsnM1B7f6oaGHirj2ta4fq7m7DoeRKEcwli gzy0OAaNiy4DVawkp+gdVEj22jVcFvI= X-Google-Smtp-Source: ADFU+vvXiFKxvdAkp4PWmhpKxeQpNWOUkf0XT5+s/0m90W3jYgAqsPJBKZsohUZnrJZdnTZOEFFjYw== X-Received: by 2002:a5d:6948:: with SMTP id r8mr4152402wrw.73.1583367938721; Wed, 04 Mar 2020 16:25:38 -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 k65sm7106943wmf.1.2020.03.04.16.25.37 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Mar 2020 16:25:37 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Thu, 5 Mar 2020 00:25:28 +0000 Message-Id: <20200305002528.11418-4-sw@jkqxz.net> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20200305002528.11418-1-sw@jkqxz.net> References: <20200305002528.11418-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/4] vaapi_encode_h265: Enable 4:2:2 support 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" --- With , intra-only 4:2:2 encode works on Ice Lake with something like: -vf 'format=yuyv422,hwupload' -c:v hevc_vaapi -g 1 out.mp4 There is still something wrong with inter frames. libavcodec/vaapi_encode_h265.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c index 59d150f503..79e3c70602 100644 --- a/libavcodec/vaapi_encode_h265.c +++ b/libavcodec/vaapi_encode_h265.c @@ -1197,6 +1197,10 @@ static const VAAPIEncodeProfile vaapi_encode_h265_profiles[] = { #if VA_CHECK_VERSION(0, 37, 0) { FF_PROFILE_HEVC_MAIN_10, 10, 3, 1, 1, VAProfileHEVCMain10 }, { FF_PROFILE_HEVC_REXT, 10, 3, 1, 1, VAProfileHEVCMain10 }, +#endif +#if VA_CHECK_VERSION(1, 2, 0) + { FF_PROFILE_HEVC_REXT, 8, 3, 1, 0, VAProfileHEVCMain422_10 }, + { FF_PROFILE_HEVC_REXT, 10, 3, 1, 0, VAProfileHEVCMain422_10 }, #endif { FF_PROFILE_UNKNOWN } };