From patchwork Mon Jul 30 11:42:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 9842 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp3782993jad; Mon, 30 Jul 2018 04:48:33 -0700 (PDT) X-Google-Smtp-Source: AAOMgpdwC5tnfOUAxQPIUFvp1IkCuzC6Z/Mv5IHbIORjyCodahVreLYTONsA1z0SNnoKHHJ2xY5i X-Received: by 2002:adf:d24a:: with SMTP id o10-v6mr15243114wri.229.1532951313389; Mon, 30 Jul 2018 04:48:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532951313; cv=none; d=google.com; s=arc-20160816; b=B+luaiWm5epM3R53Ae+Yp0FTYOW11aIyXdRkxAjBCh+x+f2cbSO0Le/Ad6SLPcDASv NDRuv/Pf4rm0g97KBsWICqz+O6gdkorcXSkCBUGCi9kj1H0xVlVSqk1bsAkYOkL/nGRs NM0XPobOXTH5c2GCY8kS6dbXsTa7i0K9/Cr8Il+3b0xyRERYoQoLiX8g2VLFzSoGzq47 5qo74aiOgZTSdWxbrIY5yCmC+3IL/pdePrIR2hDHo8eUgjQWwiJYxBhJgiQ7byENU/1z 4mMyKPvQgmndcdLamaL32XTxynw3WzN/EfNw77u+uBF/LdwrJKlcfKum6elKMea6xn3p JpRg== 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=ejiUGbEjVWq2yOQT1hZMga9nOYCfRd7uOv1Ps0iaYqY=; b=rVtVFBmLWn1zn+U1g2zxj7I7AA0XStO0v2LHp5GMBApqcijeecEgy9HiARdL3bcQE7 zxaw4ceBi11bgqd6GUvi7U4caxPzbyyQTmcDQfN0tuoh6yJfzQjpqe5T0E00jhrMbMFD d8ZB+FHIG3H9MKsKiZt7/H9tEyAZ7W3mAu2WcSXCAK7eoBhPY+aNKE/f3em3PO0IebPe foCkszO8s4hKghDi5fSfSNRN4cd3ifYuKPKUMqSlXzhoWkfccg0HsWMXtgjtLEZMRCye z7iyRkXqkAS6mWmNFfpFV7cfOjHKQ7V6HmIoxzjo1FHc9gTQFztA+1DolOY7XC0EgOkJ uZ2A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Z3R2150S; 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 a84-v6si258501wme.146.2018.07.30.04.48.33; Mon, 30 Jul 2018 04:48:33 -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=Z3R2150S; 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 1D7F468A44F; Mon, 30 Jul 2018 14:48:15 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg1-f180.google.com (mail-pg1-f180.google.com [209.85.215.180]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8A78768A37B for ; Mon, 30 Jul 2018 14:48:08 +0300 (EEST) Received: by mail-pg1-f180.google.com with SMTP id y5-v6so7133311pgv.1 for ; Mon, 30 Jul 2018 04:48:25 -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=KXzUEuO8ywyzCYdzOLtPLPrhNKdpBVMFN7gdQr1IWbA=; b=Z3R2150SJzzPuFEKBm2G07/T9uNxSEU4ErjHwvLGd4RqN6DtNaGjWP3wh6MRhqp96u eqxtBHVM8CGYJA3u7nM+aWhLsCM+PULBszTzQfmCG+PHNXUqajS9swsflet3lGD5wGOY YaXzBrifRshKOKCRvvCyILdrH2ZabN4t2uP8ydJAU0+N0qDIqVwvqwxl/MZO435MCUEg X+PGQq+xIZuijWq9PEb3ljRe6DY2xdRHNYAQ6TDmoBh4ZSAdiYGFndcx5YDzqYAJqFPV iYmXLq0Am92H6nk0YL0yZ5u2LeKaI+o9OmOdAINHIpQR3xXJZmmTkNDp99iPtlfgJUM0 O7lw== 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=KXzUEuO8ywyzCYdzOLtPLPrhNKdpBVMFN7gdQr1IWbA=; b=r0hTn9C2sKzag1MCcMSLag5xd34/xuIjjgbl36FEhPsnreGSv1dvbFwVLEbArT21c+ 8ThBC1LZ1/yLpIyvx94GTzHXD4msAdzvQzu1sAHPuSlXgJRRPOHiJa0GXSakX96uWbQb fLB234WVGSgyhiXONDq5JuLkIlyZ2m5KSC63n0HHPY9vgvGRwczZHuP6H7TClpkIBgT6 /HIESmdwcS96uTVR2ZgpiS7bvm5N57ndxnnFgGAlgmXCJ/IIRiInVdRzq52OQQ2V0tuG dafRqqe14Gp/8etjRn+ehr5quLvwBxEpVAkoX/GK5yo5yhpD8ohxlajwG/glYGWyGRFN d5vQ== X-Gm-Message-State: AOUpUlF3EJFJDC3pm2NIz17XVZGwHsTOhSiDT1vliTdbKVAXvfNqIYQi 3v+ACNZEppuCXIPQZNLHHj3VKt748FI= X-Received: by 2002:a63:4450:: with SMTP id t16-v6mr16098023pgk.102.1532950977865; Mon, 30 Jul 2018 04:42:57 -0700 (PDT) Received: from localhost.localdomain ([47.90.47.25]) by smtp.gmail.com with ESMTPSA id r81-v6sm21426132pfa.18.2018.07.30.04.42.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 30 Jul 2018 04:42:57 -0700 (PDT) From: Jun Zhao To: ffmpeg-devel@ffmpeg.org Date: Mon, 30 Jul 2018 19:42:40 +0800 Message-Id: <1532950960-7640-4-git-send-email-mypopydev@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1532950960-7640-1-git-send-email-mypopydev@gmail.com> References: <1532950960-7640-1-git-send-email-mypopydev@gmail.com> Subject: [FFmpeg-devel] [PATCH 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 | 30 ++++++++++++++++++++++++------ 1 files changed, 24 insertions(+), 6 deletions(-) diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c index bbba2b8..cfdbeae 100644 --- a/libavcodec/vaapi_encode_h265.c +++ b/libavcodec/vaapi_encode_h265.c @@ -618,6 +618,7 @@ static int vaapi_encode_h265_init_picture_params(AVCodecContext *avctx, VAAPIEncodeH265Options *opt = ctx->codec_options; VAEncPictureParameterBufferHEVC *vpic = pic->codec_picture_params; int i; + int slices; if (pic->type == PICTURE_TYPE_IDR) { av_assert0(pic->display_order == pic->encode_order); @@ -788,7 +789,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_INVALIDDATA; + } + } + pic->nb_slices = slices; return 0; } @@ -814,9 +825,8 @@ 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; + sh->first_slice_segment_in_pic_flag = !!(slice->index == 0); + sh->slice_segment_address = slice->index * priv->ctu_width * (priv->ctu_height / pic->nb_slices); sh->slice_type = priv->slice_type; @@ -906,7 +916,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, @@ -927,7 +936,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 = @@ -945,6 +953,12 @@ static int vaapi_encode_h265_init_slice_params(AVCodecContext *avctx, .collocated_from_l0_flag = sh->collocated_from_l0_flag, }, }; + if (slice->index == pic->nb_slices - 1) { + vslice->num_ctu_in_slice = priv->ctu_width * priv->ctu_height + - slice->index * priv->ctu_width * (priv->ctu_height / pic->nb_slices); + vslice->slice_fields.bits.last_slice_of_pic_flag = 1; + } else + vslice->num_ctu_in_slice = priv->ctu_width * (priv->ctu_height / pic->nb_slices); for (i = 0; i < FF_ARRAY_ELEMS(vslice->ref_pic_list0); i++) { vslice->ref_pic_list0[i].picture_id = VA_INVALID_ID; @@ -1019,6 +1033,10 @@ 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_WARNING, "The encode slice option is not " + "supported with the driver.\n"); + return 0; }