From patchwork Wed Aug 29 10:38:44 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 10172 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:12c4:0:0:0:0:0 with SMTP id 65-v6csp548002jap; Wed, 29 Aug 2018 03:39:24 -0700 (PDT) X-Google-Smtp-Source: ANB0VdZC0gIeXeza9PWZ+jooY//xehOVE33i/w+dVGrQ8jkfI0AID8RKM02/NTUxdotfLVr48uTy X-Received: by 2002:a1c:1ad6:: with SMTP id a205-v6mr1365237wma.91.1535539164723; Wed, 29 Aug 2018 03:39:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535539164; cv=none; d=google.com; s=arc-20160816; b=mTl0apm/eo+f2VJuVQUpWUOEQxQN6OmI/39jk8k3BmSkBY9X/RufKxUafmMWqx0yfS /ccnXmsAL55pTLHys1PTSsPxkjY0Gkn//x3nCu3bNVkstnHXSSq4vQxfLHdZg+9cgaEY U0hqO/er+leIB4c4e9EGZPf8GWRZqaMS/ZfA7KeOW7HqaGrkug/rddo9bX3ryr4RzFYy ErrSg9q246ljisyeA7FdWDxLfx4lnZznjBby5QGnxnFKg4GKVF21QzS2Adzdc8JoIDV8 aEsFX6fIyGC++sG7YLMW0peHYQGiZC2SRY7EStkIV6ynJpyDDJQFNKpakrKM/Y2BqU41 wx7g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=SGOciHIWIGYiDJPJ5eLUBubaagvdLczWon0g1OniHUo=; b=kRvuGT5BbOMIWSFFHUfAtNmx/AsRaU2+hd5ZMLgKAFsNH1qb3YROCM6JJG8GR+35t6 e7GMn9d/ZMsWWaXmDUS7U8hEbfTw/WxR1HML2V+y6lf7rm3VErNr4fm8xzuF5qT58uBt RqpNKu0QvDART2x6VtOlvLGOg2jpv1ERFrk+5GSPzV6oRYPwo4veIkChDp9CmiXmEc/Z ye6CS7ar/NZx8CR8Ci/en0quFJKC4xcqmTtxZFakV1XahcB1I1AcFxQ97aIceX/1j+E5 VzndxsuvKTw6Be6z9vknO8iLSJ5Xn3TV4Aioyyg4H2j9v0PBJwMEk/xpgzi/CvfvhnrH 8sAw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=uxgik5ft; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j27-v6si3184159wre.165.2018.08.29.03.39.24; Wed, 29 Aug 2018 03:39:24 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=uxgik5ft; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 761D5689F4C; Wed, 29 Aug 2018 13:39:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f172.google.com (mail-pf1-f172.google.com [209.85.210.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 85E63689F37 for ; Wed, 29 Aug 2018 13:39:07 +0300 (EEST) Received: by mail-pf1-f172.google.com with SMTP id k19-v6so2098229pfi.1 for ; Wed, 29 Aug 2018 03:39:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=BnhB6k3IsfcdgkLTgl1ZTQiSohBGFNbe8YZov6fWFlY=; b=uxgik5ftsjZiyF/68Qnpw/w44Lh7Rx381QHptRqwwyY7vg2f4oE747iC3MfyHR+yuZ 6ipS2qSKScOO6XpyRC3IP1REEK4V0EAh3RNx+qHqH0oB03S444XuF71Cvfxr1ZrfeCrp HjYsQNU1MhTqMyHV4B5WMK4a79/zIMWdm88IQRhWE0zEiDWjR7GAkTJl225NtkNvSq6R Y8sUoxDVAjendbzwYOxxEWuZJFbgSPgfa0J0rbjxWezANrgE8jWjjW1k3xgqA6A/Nb8O qqyBzmxDkstRX8sgdJ1+WU6I5S/j3zJQ4ppG9mGELTu+C8tK54EX+v/lRYdARRQUG9j0 5S0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=BnhB6k3IsfcdgkLTgl1ZTQiSohBGFNbe8YZov6fWFlY=; b=hsUCAI0wxWP7tZ/Hb/oCrnLZY5dNuAK8o54l7Pop29VAf4WkFye6LT7bZ8Fmd8+nAf iVaHNzicg14HEfcSK6ysM12kp4tQhSrHSZFXf64VcqfLOng4JqdNFUcHQyfgVjx8JfK1 JKLDkAkokrG8RDf0LVIFKFrfWHKcdl6JlV+U8LGVqfRy2K0iB2a05JxGG4TdckQeKoI8 nMeZHmh5s3CLCabcFO5GP9mNcGiT6D98m+ufkCdRPBz5y5E05a3F7W4Pzgz/5rrSeiFI MjBAZVTgoN6nD2Yt87j5KaJBq76mXrxYNZlirc0y2wBbSmUim5eGXfrmA9+pb4+2D4ov q29A== X-Gm-Message-State: APzg51AwsGpJ48l0GRmDda1zO9334phW1ZMHRL5sAgNjrLaf23NRIQRx hvZsHwhVE1BjLY81A2m8F+t1hkW+2Dc= X-Received: by 2002:a65:5144:: with SMTP id g4-v6mr5064070pgq.21.1535539149902; Wed, 29 Aug 2018 03:39:09 -0700 (PDT) Received: from localhost.localdomain ([47.90.47.25]) by smtp.gmail.com with ESMTPSA id b1-v6sm9895286pgi.91.2018.08.29.03.39.08 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Aug 2018 03:39:08 -0700 (PDT) From: Jun Zhao To: ffmpeg-devel@ffmpeg.org Date: Wed, 29 Aug 2018 18:38:44 +0800 Message-Id: <1535539124-16338-4-git-send-email-mypopydev@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1535539124-16338-1-git-send-email-mypopydev@gmail.com> References: <1535539124-16338-1-git-send-email-mypopydev@gmail.com> Subject: [FFmpeg-devel] [PATCH V7 3/3] lavc/vaapi_encode_h265: respect "slices" option in h265 vaapi encoder 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 Cc: "Wang, Yi A" , Jun Zhao , Jun Zhao MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Enable multi-slice support in HEVC/H.265 vaapi encoder. Signed-off-by: Wang, Yi A Signed-off-by: Jun Zhao --- libavcodec/vaapi_encode_h265.c | 41 ++++++++++++++++++++++++++++++++++----- 1 files changed, 35 insertions(+), 6 deletions(-) diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c index 8f191ef..e6ee352 100644 --- a/libavcodec/vaapi_encode_h265.c +++ b/libavcodec/vaapi_encode_h265.c @@ -615,9 +615,11 @@ static int vaapi_encode_h265_init_sequence_params(AVCodecContext *avctx) static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, VAAPIEncodePicture *pic) { + VAAPIEncodeContext *ctx = avctx->priv_data; VAAPIEncodeH265Context *priv = avctx->priv_data; VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params; int i; + int slices; if (pic->type == PICTURE_TYPE_IDR) { av_assert0(pic->display_order == pic->encode_order); @@ -792,7 +794,17 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, av_assert0(0 && "invalid picture type"); } - pic->nb_slices = 1; + slices = 1; + if (ctx->max_slices) { + if (avctx->slices <= FFMIN(ctx->max_slices, priv->ctu_height)) { + slices = FFMAX(avctx->slices, slices); + } else { + av_log(avctx, AV_LOG_ERROR, "The max slices number per frame " + "cannot more than %d.\n", FFMIN(ctx->max_slices, priv->ctu_height)); + return AVERROR(EINVAL); + } + } + pic->nb_slices = slices; return 0; } @@ -809,6 +821,7 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx, VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params; VAEncSliceParameterBufferHEVC *vslice = slice->codec_slice_params; int i; + int base, mod; sh->nal_unit_header = (H265RawNALUnitHeader) { .nal_unit_type = priv->slice_nal_unit, @@ -818,9 +831,14 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx, sh->slice_pic_parameter_set_id = pps->pps_pic_parameter_set_id; - // Currently we only support one slice per frame. - sh->first_slice_segment_in_pic_flag = 1; - sh->slice_segment_address = 0; + base = priv->ctu_height / pic->nb_slices; + mod = priv->ctu_height % pic->nb_slices; + sh->first_slice_segment_in_pic_flag = !!(slice->index == 0); + if (slice->index < mod) + sh->slice_segment_address = slice->index * priv->ctu_width * (base + 1); + else + sh->slice_segment_address = mod * priv->ctu_width * (base + 1) + + (slice->index - mod) * priv->ctu_width * base; sh->slice_type = priv->slice_type; @@ -910,7 +928,6 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx, *vslice = (VAEncSliceParameterBufferHEVC) { .slice_segment_address = sh->slice_segment_address, - .num_ctu_in_slice = priv->ctu_width * priv->ctu_height, .slice_type = sh->slice_type, .slice_pic_parameter_set_id = sh->slice_pic_parameter_set_id, @@ -931,7 +948,6 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx, .slice_tc_offset_div2 = sh->slice_tc_offset_div2, .slice_fields.bits = { - .last_slice_of_pic_flag = 1, .dependent_slice_segment_flag = sh->dependent_slice_segment_flag, .colour_plane_id = sh->colour_plane_id, .slice_temporal_mvp_enabled_flag = @@ -950,6 +966,13 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx, }, }; + if (slice->index < mod) + vslice->num_ctu_in_slice = priv->ctu_width * (base + 1); + else + vslice->num_ctu_in_slice = priv->ctu_width * base; + if (slice->index == pic->nb_slices - 1) + vslice->slice_fields.bits.last_slice_of_pic_flag = 1; + for (i = 0; i < FF_ARRAY_ELEMS(vslice->ref_pic_list0); i++) { vslice->ref_pic_list0[i].picture_id = VA_INVALID_ID; vslice->ref_pic_list0[i].flags = VA_PICTURE_HEVC_INVALID; @@ -1022,6 +1045,12 @@ static av_cold int vaapi_encode_h265_configure(AVCodecContext *avctx) av_assert0(0 && "Invalid RC mode."); } + if (!ctx->max_slices && avctx->slices > 0) { + av_log(avctx, AV_LOG_ERROR, "The encode slice option is not " + "supported with the driver.\n"); + return AVERROR(ENOSYS); + } + return 0; }