From patchwork Sun Feb 10 19:47:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mark Thompson X-Patchwork-Id: 12033 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 9732744665E for ; Sun, 10 Feb 2019 21:47:27 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 85EB668A927; Sun, 10 Feb 2019 21:47:27 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f67.google.com (mail-wm1-f67.google.com [209.85.128.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6A55168A845 for ; Sun, 10 Feb 2019 21:47:23 +0200 (EET) Received: by mail-wm1-f67.google.com with SMTP id v26so12910137wmh.3 for ; Sun, 10 Feb 2019 11:47:23 -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=a2lU1oOzAyQLRUfNZTPJqhM3GBpUTrIAKza09KlVNQ8=; b=YhjAEK5fFFadH31iFX3k6y9HQR5QxyX3onamI8/grCoVZaNPgjNL3HTIdvVlR8tJrm cO6C4J8r4pJznzyhPjQh44uw3s00DIrMPSZOvSPLMryOIKuPRIE2nNWXHspXJ9orVd2x gxlCVlVw5cMkSFyYyiYG8W/2qSgfO+3fvc9VHBUDcP2bP4dHouYfvx2rpYdBSyz8upyr yGhbHXRI848FXW31eXiq80lD5pvV5R8MvbLAzylJ0eZyhyTbUR65VDAjV8RgkOkVTkLq v5DJ2HM4g2DJoa32x6+mEvvJnNrLBDu2ubdzvzyYjUKOeEndzEXN/kGM+DxCR6MDOvAI /Nxw== 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=a2lU1oOzAyQLRUfNZTPJqhM3GBpUTrIAKza09KlVNQ8=; b=AMA04zrcnhkajm4rXt9z1ksHaId/2zll6tpPoSnKyBzUixTFFYvlOzEBOogo8Q2+RV lZUPzthbgFFqIC098RQtVKy/dIioOnO6wuCuyoDadLmboemckkzL9hfz7o73kwfFNctp jd93p+ImvwMkTLOuExh0hkVFtWDzZCSXjShsZe4AnNv9/byJzRM2OQcXgleRvxpIqwBF AlS9oZJX3gpQy5cxwwqXtiEWGv5XgrKJ/bHZRWc7ujLoS2iCzOVbN5Ud02HwsRt8Bg2u YeSjsprGnUzF1vSTyUDdLxK4T4QZXwjSePswh4Wg0o0Wh2ydT1et43Yxy7InVQjOKxrA dMmQ== X-Gm-Message-State: AHQUAuYDmH+M4gb+k0tnXEheJOoJYgvz36zMwMhx/A+9h0tIzdlMjQFf BVLPYR46qegqNI3ITFAWHdQ/Zqq/IgHk+Q== X-Google-Smtp-Source: AHgI3IZTFp926KHNLiimW7Fw/usH7Lgiy1cdVCBBMVMRmnuLC76UfIhH2CW8TRELD8dMOCAk/quJKA== X-Received: by 2002:a1c:6c01:: with SMTP id h1mr6486602wmc.113.1549828042684; Sun, 10 Feb 2019 11:47:22 -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 u15sm24059889wrm.63.2019.02.10.11.47.21 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 10 Feb 2019 11:47:21 -0800 (PST) From: Mark Thompson To: ffmpeg-devel@ffmpeg.org Date: Sun, 10 Feb 2019 19:47:05 +0000 Message-Id: <20190210194705.3598-12-sw@jkqxz.net> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20190210194705.3598-1-sw@jkqxz.net> References: <20190210194705.3598-1-sw@jkqxz.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 12/12] vaapi_encode: Support limiting slice size 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" --- doc/encoders.texi | 4 +++ libavcodec/vaapi_encode.c | 57 ++++++++++++++++++++++++++++++++++++--- libavcodec/vaapi_encode.h | 9 ++++++- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/doc/encoders.texi b/doc/encoders.texi index 39b8fc1d37..21b6d147fe 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -2855,6 +2855,10 @@ the stream, and requires driver support. The minimum interval between frames must not be smaller than this, and there may be problems if the maximum interval is more than a small multiple of it. +@item max_slice_bytes +Set the maximum number of bytes allowed in a single slice. Requires driver +support. Not limited by default. + @end table Each encoder also has its own specific options: diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index df8f65e431..44d04ca6a9 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -316,14 +316,14 @@ static int vaapi_encode_issue(AVCodecContext *avctx, if (pic->nb_slices == 0) pic->nb_slices = ctx->nb_slices; if (pic->nb_slices > 0) { - int rounding; - pic->slices = av_mallocz_array(pic->nb_slices, sizeof(*pic->slices)); if (!pic->slices) { err = AVERROR(ENOMEM); goto fail; } - + } + if (pic->nb_slices > 0 && ctx->max_slice_bytes == 0) { + int rounding; for (i = 0; i < pic->nb_slices; i++) pic->slices[i].row_size = ctx->slice_size; @@ -435,6 +435,31 @@ static int vaapi_encode_issue(AVCodecContext *avctx, } #endif +#if VA_CHECK_VERSION(1, 0, 0) + if (ctx->max_slice_bytes > 0) { + struct { + VAEncMiscParameterBuffer misc; + VAEncMiscParameterMaxSliceSize slice; + } param = { + .misc = { + .type = VAEncMiscParameterTypeMaxSliceSize, + }, + .slice = { + // VAAPI wants this value in bits. + .max_slice_size = 8 * ctx->max_slice_bytes, + }, + }; + + err = vaapi_encode_make_param_buffer(avctx, pic, + VAEncMiscParameterBufferType, + (char*)¶m, sizeof(param)); + if (err < 0) + goto fail; + } +#else + av_assert0(ctx->max_slice_bytes == 0); +#endif + vas = vaBeginPicture(ctx->hwctx->display, ctx->va_context, pic->input_surface); if (vas != VA_STATUS_SUCCESS) { @@ -1812,7 +1837,7 @@ static av_cold int vaapi_encode_init_slice_structure(AVCodecContext *avctx) ctx->slice_block_cols = (avctx->width + ctx->slice_block_width - 1) / ctx->slice_block_width; - if (avctx->slices <= 1) { + if (avctx->slices <= 1 && ctx->max_slice_bytes == 0) { ctx->nb_slices = 1; ctx->slice_size = ctx->slice_block_rows; return 0; @@ -1836,6 +1861,30 @@ static av_cold int vaapi_encode_init_slice_structure(AVCodecContext *avctx) return AVERROR(EINVAL); } + if (ctx->max_slice_bytes > 0) { +#if VA_CHECK_VERSION(1, 0, 0) + if (slice_structure & VA_ENC_SLICE_STRUCTURE_MAX_SLICE_SIZE) { + av_log(avctx, AV_LOG_VERBOSE, "Encoding pictures using " + "at most %d bytes per slice.\n", + ctx->max_slice_bytes); + // In this mode we supply only a single slice structure and + // no packed headers - the driver generates the headers for + // each slice itself. + ctx->nb_slices = 1; + ctx->desired_packed_headers &= ~VA_ENC_PACKED_HEADER_SLICE; + return 0; + } else { + av_log(avctx, AV_LOG_ERROR, "Driver does not support " + "encoding pictures with a slice size limit.\n"); + return AVERROR(EINVAL); + } +#else + av_log(avctx, AV_LOG_ERROR, "Slice size limiting is " + "not supported with this VAAPI version.\n"); + return AVERROR(EINVAL); +#endif + } + // For fixed-size slices currently we only support whole rows, making // rectangular slices. This could be extended to arbitrary runs of // blocks, but since slices tend to be a conformance requirement and diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index 860b67dbe2..ddc947edbe 100644 --- a/libavcodec/vaapi_encode.h +++ b/libavcodec/vaapi_encode.h @@ -191,6 +191,9 @@ typedef struct VAAPIEncodeContext { // framerate. AVRational vfr_max_fps; + // Requested maximum slice size in bytes. Ignored if zero. + unsigned int max_slice_bytes; + // Desired packed headers. unsigned int desired_packed_headers; @@ -441,7 +444,11 @@ int ff_vaapi_encode_close(AVCodecContext *avctx); { "b_depth", \ "Maximum B-frame reference depth", \ OFFSET(common.desired_b_depth), AV_OPT_TYPE_INT, \ - { .i64 = 1 }, 1, INT_MAX, FLAGS } + { .i64 = 1 }, 1, INT_MAX, FLAGS }, \ + { "max_slice_bytes", \ + "Maximum number of bytes allowed in a single slice", \ + OFFSET(common.max_slice_bytes), AV_OPT_TYPE_INT, \ + { .i64 = 0 }, 0, INT_MAX, FLAGS } #define VAAPI_ENCODE_RC_MODE(name, desc) \ { #name, desc, 0, AV_OPT_TYPE_CONST, { .i64 = RC_MODE_ ## name }, \