From patchwork Wed Aug 29 10:38:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 10171 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:12c4:0:0:0:0:0 with SMTP id 65-v6csp547908jap; Wed, 29 Aug 2018 03:39:16 -0700 (PDT) X-Google-Smtp-Source: ANB0VdZLYh0KDLQF1qB7ZBjBwJZHeSGxE9DuI5lnsc2RC0cFls2msI4zm63XFTepX3FgByg/bk5k X-Received: by 2002:a5d:68c9:: with SMTP id p9-v6mr3886198wrw.108.1535539156637; Wed, 29 Aug 2018 03:39:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1535539156; cv=none; d=google.com; s=arc-20160816; b=WwHDSg/P+Buo9rK9NhG5H5I1BQ4vGX8gXXPXh1Fo0iT4r/WG27CyInHmDFyrOS1VeR zf2Vwj4nSNO9fXTXzm42dYkFIYKAhPz6cXReiqR7uWTgGQLVZDq4aDPawZITRNvouMVb HfzbYP2OkJoaxKzaFae9m35U6hAYd9tj7auBlRdDe0JKxCIYZaQEJRlKECI/lvZ3PGge cMp3hSwyYAeX4BNHJT6sV8v6IzoUPDYiOo4f8I2h2xHf7ntj+PnFyuZRMa5mqOdnJl4u 00BfCdGERVV1U0LjhDaz1VsuO2/vQXQzFuwtgafNP7t4NtVb/FBBP9mrvZWe/bdiwjin oWcQ== 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=ZlkOAWVJ39K+9ujXQSs0B/cFdpfM/XpiWARPkHlFqcA=; b=xzkY0nqHrMZuG8uOpoh79VsfqdybgO/UHe/3Urx4m/+ZK46zO5cU3RqKGxASXGkDo2 1REPGpGltVXoGAWNtS9siMVbm2xr7YEtsZ13n8AqrK4sR7fgwcWIiJx2kWQUulzHBAbV JM2mpQb2feTZ5WMwkL09UEs0gPxU1RXqlg2uWejH2VFcTr05hCiwEiTwaMCtl4xr5PXJ pbgIo3YNj6gjiMeQen3EFTNsiDHlRtCnQjEkC/mj/1/hL6ASuB0UWOZJO38QHcGTCZud lZlPTsFzu+gpjXweZFWgkBh4hJyvrlbvXRpV+kfluouOjwyAOmS/WcsixF05xm3iv6RL +4lQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=lAWR7tPL; 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 k9-v6si2935354wri.24.2018.08.29.03.39.16; Wed, 29 Aug 2018 03:39:16 -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=lAWR7tPL; 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 D99B4689F45; Wed, 29 Aug 2018 13:39:08 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9933C689F34 for ; Wed, 29 Aug 2018 13:39:01 +0300 (EEST) Received: by mail-pl1-f182.google.com with SMTP id g23-v6so2103267plq.9 for ; Wed, 29 Aug 2018 03:39:05 -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=BtsWCFhHboLtZacvlFoLuQN2o2SYDVU8WXAcgShw7cg=; b=lAWR7tPLhLJMp2SnVxXCkNb9BhAvTbYPQQQ0yfEcMOPfjc8+YaFNG8B9j2s+6uX846 /As3hxtXdNL0L3uG9TOf4nxz193RLRyTPISB+4G/SkSvjJz3LqA4TRNJNNEzIBlixTl5 3JsFubi+QIqmMuGQXie7fasm7kqyJ04tXH9hxTDt8FtLr35fAVvNUHsaivbxDlbNnqdf /Q/z1Nvnba2RWcGGdYT/hCO/XLfqBULfd2SZNYYpO7iKoVMt7ujppDpzPc+FZPx+R3/B 60j8Y7OvhfB+7BhKMhzpaIjD083Ohix2sW0sXxxklpOTOhri9yQLhfcYwgA+dTtqrkKG VdjA== 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=BtsWCFhHboLtZacvlFoLuQN2o2SYDVU8WXAcgShw7cg=; b=FcY0yDLv7SUU7k9kJw5dw0JNKr4k101cakN70G2OGsCrw3OUwP2zdPkHu4N1iVyWnW 5PE8gQYdqSSVgQ6IRf9trecs78qe9Aj7JMNP3NGyKAaf1Tmn+dii5FWfhfTjP2XMsYLp Z3qU08xGogrnDn7FCWRFJcszjZbVi3pdANL8qZVwDXtRqZh5QQLk22sMJOH/LngMBqOG JCEZH7Jn9ivVKNPMzSmpTVB9B1Utj7dnHLI3Pm3M/xEJCy/6z5zXDgEK60kgmKaRTTzn Ox8O1+9OP2aThu7wRuZUwoC4O3NXXrAFoQk6Wac7SU16jDO0tGeajkzOb5Z/GNBBA+Fr 4Xqw== X-Gm-Message-State: APzg51CGrZkjabdBSpaCRU7LZqwA0nH+9fOEYxKGuY9TpCAh0ObCrHkd Jd5Nr4AFSD5ocaeNIu4bqyPILX2XlgI= X-Received: by 2002:a17:902:528a:: with SMTP id a10-v6mr5327381pli.199.1535539144014; Wed, 29 Aug 2018 03:39:04 -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.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 29 Aug 2018 03:39:03 -0700 (PDT) From: Jun Zhao To: ffmpeg-devel@ffmpeg.org Date: Wed, 29 Aug 2018 18:38:43 +0800 Message-Id: <1535539124-16338-3-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 2/3] lavc/vaapi_encode_h264: respect "slices" option in h264 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 AVC/H.264 vaapi encoder. Signed-off-by: Wang, Yi A Signed-off-by: Jun Zhao --- libavcodec/vaapi_encode_h264.c | 39 ++++++++++++++++++++++++++++++++++----- 1 files changed, 34 insertions(+), 5 deletions(-) diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c index b65c994..36028fb 100644 --- a/libavcodec/vaapi_encode_h264.c +++ b/libavcodec/vaapi_encode_h264.c @@ -585,6 +585,7 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx, H264RawSPS *sps = &priv->raw_sps; VAEncPictureParameterBufferH264 *vpic = pic->codec_picture_params; int i; + int slices; memset(&priv->current_access_unit, 0, sizeof(priv->current_access_unit)); @@ -700,7 +701,17 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx, vpic->pic_fields.bits.idr_pic_flag = (pic->type == PICTURE_TYPE_IDR); vpic->pic_fields.bits.reference_pic_flag = (pic->type != PICTURE_TYPE_B); - pic->nb_slices = 1; + slices = 1; + if (ctx->max_slices) { + if (avctx->slices <= FFMIN(ctx->max_slices, priv->mb_height)) { + slices = FFMAX(avctx->slices, slices); + } else { + av_log(avctx, AV_LOG_ERROR, "The max slices number per frame " + "cannot be more than %d.\n", FFMIN(ctx->max_slices, priv->mb_height)); + return AVERROR(EINVAL); + } + } + pic->nb_slices = slices; return 0; } @@ -716,6 +727,7 @@ static int vaapi_encode_h264_init_slice_params(AVCodecContext *avctx, VAEncPictureParameterBufferH264 *vpic = pic->codec_picture_params; VAEncSliceParameterBufferH264 *vslice = slice->codec_slice_params; int i; + int base, mod; if (pic->type == PICTURE_TYPE_IDR) { sh->nal_unit_header.nal_unit_type = H264_NAL_IDR_SLICE; @@ -725,8 +737,13 @@ static int vaapi_encode_h264_init_slice_params(AVCodecContext *avctx, sh->nal_unit_header.nal_ref_idc = pic->type != PICTURE_TYPE_B; } - // Only one slice per frame. - sh->first_mb_in_slice = 0; + base = priv->mb_height / pic->nb_slices; + mod = priv->mb_height % pic->nb_slices; + if (slice->index < mod) + sh->first_mb_in_slice = slice->index * priv->mb_width * (base + 1); + else + sh->first_mb_in_slice = mod * priv->mb_width * (base + 1) + + (slice->index - mod) * priv->mb_width * base; sh->slice_type = priv->slice_type; sh->pic_parameter_set_id = pps->pic_parameter_set_id; @@ -748,13 +765,19 @@ static int vaapi_encode_h264_init_slice_params(AVCodecContext *avctx, vslice->macroblock_address = sh->first_mb_in_slice; - vslice->num_macroblocks = priv->mb_width * priv->mb_height; + if (slice->index < mod) + vslice->num_macroblocks = priv->mb_width * (base + 1); + else + vslice->num_macroblocks = priv->mb_width * base; + sh->slice_type = priv->slice_type; + if (slice->index == pic->nb_slices - 1) + priv->idr_pic_count++; vslice->macroblock_info = VA_INVALID_ID; vslice->slice_type = sh->slice_type % 5; vslice->pic_parameter_set_id = sh->pic_parameter_set_id; - vslice->idr_pic_id = sh->idr_pic_id; + vslice->idr_pic_id = priv->idr_pic_count; vslice->pic_order_cnt_lsb = sh->pic_order_cnt_lsb; @@ -863,6 +886,12 @@ static av_cold int vaapi_encode_h264_configure(AVCodecContext *avctx) } } + 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; }