From patchwork Mon Jul 30 11:42:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 9841 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp3778523jad; Mon, 30 Jul 2018 04:43:10 -0700 (PDT) X-Google-Smtp-Source: AAOMgpfTn07A6flGlOcqih0O1yncdCSgIWIVRfW/p5FwjnuukjN5jRJo4l5um1scy4BmRkbspXeh X-Received: by 2002:a5d:6a92:: with SMTP id s18-v6mr1062220wru.44.1532950990046; Mon, 30 Jul 2018 04:43:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532950990; cv=none; d=google.com; s=arc-20160816; b=CXgpmXaO9dlZWRUsNMC/hDYqzdkwHIM+pBLM/BIB0o6doJVq9HmEqniR+L5GfjbAC0 lBODgordvJJK31+iyV/PhSpub+vpSZu+inJIlGaC1hSYUmpGO/gIC7vwrEvh2t+pz4Q6 Rytm/fnY1qZrKy6dMcrPtb+S/AgXHB4CKPh3qU/RNSnbyodk7F86Cgyk8LWZZ01iX65x SzJ3F86pSYhZSTWoy/LkLDF70+vbOrWE4vNJyx7EmKJ+DN+BzHUzSu9EfiqsFtfn5DrK Ag8FTbiHTtSZZgOOpDTWQKRDIr3UKYYmdeC3iQtB687T/WCdmKxMz7c5Y//tUDfRcQ3q e2zw== 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=2aMku8v+yC39StBEmgV21BvsBGuTHD+OFuugFYeoMlI=; b=Et/FLZygAAWRgeYXgaYVFg0Wv3dCLKn/5wOO5hGvH1/m5qvI+tYqh1sc6lo8i0bbTT FI+2z4Kgix2BGGiwshxGbixaPlrds0kL5eFM9j/iOiPd9x8pSjPNI0CqRXW5pfgLUh+n AYMfVGgRs/WeBdx7x0Ajzn0w33H/3EoKUHPFXIQM5C2grAXbPQ6Kw8qpaEmzBnXwDJlP BysVzagFsbxOxPoL4OSC8bQUGTpP/lF3ygDNMUteBIKxr8yKLUkA0RBCc6ZJpJGriYMK DOa1FK05aG4Z/w/6dlKf0mla/1Sc/X4ks4DuShwl01Cnd1rbNhFtLgz6xsJgzRCZBZ4t vefQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=oHRhfPRt; 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 z5-v6si10523111wmb.62.2018.07.30.04.43.09; Mon, 30 Jul 2018 04:43:10 -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=oHRhfPRt; 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 1A6C868A462; Mon, 30 Jul 2018 14:42:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f181.google.com (mail-pf1-f181.google.com [209.85.210.181]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6A34068A452 for ; Mon, 30 Jul 2018 14:42:39 +0300 (EEST) Received: by mail-pf1-f181.google.com with SMTP id u24-v6so4416022pfn.13 for ; Mon, 30 Jul 2018 04:42:56 -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=Empbds2wQz1YlsltAQoIPA30xaqawjbelSqd1jR8O74=; b=oHRhfPRtJt017+FtdcCdU2MLw07Yxu/ZJMIiC0Rhoyf5rbW3ERGrLkcyTnSbsGUMTF qrqvOPUu78fkPvvQ6MWxUYjRVjk/gdSIe2d+2AAVe6Km25tfPQBGQ0vP8uKZq6Ijvlsd rJ97rfIFhDT1opS/ApiWMjhU0P2OsTpfl52G/rr7tVlyXDY538/1ph4kCeZeqcOUVYZ5 xsct+0mDXTHg30I6ckG+sX8awoU8hyMXUkCcAOsl82F37XeDjHnSvWUYAfneCggCnuSD sB1P7oNPM4QK/1Soe64LGZ7oSvI7JlhginuwRVSfsVQh8vqIHWDpqBX0THcbxRDx3gnk qkjQ== 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=Empbds2wQz1YlsltAQoIPA30xaqawjbelSqd1jR8O74=; b=bVnuF8HnglhFfnOeSOUnUBgX3Zb6ns1msbSfUTOyBwqX1g+TAEEB6GhGSzjPRLRTJP bsy0zQeNSTnZfIQCThZvpGLnRKKTmdItsjqvCjr15wqgYdtpqnZWF8x0c3Lu46ttmc93 WyoL54hbQ5MAcPnbIXM99+X7+7RJhttvsRshtmm+3rPGoVNiGUDwZ83v85gyrp3RDYKl YDSbSdV5Df7VOPxyyRLkL4Q6uESoRGn8qFnYe7F3nDB3dfA6R4vSyyoaxRGJ5O8dgxPZ 576LTRLQiiYLZRaDeD70b3tjV+sy1L6VjgjkkGgo8LHsloeOonXyg4Ur+T2WvwgdrT/m amSw== X-Gm-Message-State: AOUpUlEpxy9pvRoR5a3A0YpTWNhCjwrY5bkxd/HecHTqb4XV0RNhmwh7 hF5g/HWdaqsXVZU83SVrOiI4z1C4 X-Received: by 2002:a63:9311:: with SMTP id b17-v6mr16118458pge.261.1532950974546; Mon, 30 Jul 2018 04:42:54 -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.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 30 Jul 2018 04:42:54 -0700 (PDT) From: Jun Zhao To: ffmpeg-devel@ffmpeg.org Date: Mon, 30 Jul 2018 19:42:39 +0800 Message-Id: <1532950960-7640-3-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 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 | 31 +++++++++++++++++++++++++------ 1 files changed, 25 insertions(+), 6 deletions(-) diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c index 905c507..70c89e8 100644 --- a/libavcodec/vaapi_encode_h264.c +++ b/libavcodec/vaapi_encode_h264.c @@ -581,6 +581,7 @@ static int vaapi_encode_h264_init_picture_params(AVCodecContext *avctx, H264RawSPS *sps = &priv->sps; VAEncPictureParameterBufferH264 *vpic = pic->codec_picture_params; int i; + int slices; memset(&priv->current_access_unit, 0, sizeof(priv->current_access_unit)); @@ -690,7 +691,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_INVALIDDATA; + } + } + pic->nb_slices = slices; return 0; } @@ -716,8 +727,7 @@ 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; + sh->first_mb_in_slice = !!slice->index; sh->slice_type = priv->slice_type; sh->pic_parameter_set_id = pps->pic_parameter_set_id; @@ -738,14 +748,19 @@ static int vaapi_encode_h264_init_slice_params(AVCodecContext *avctx, sh->slice_qp_delta = priv->fixed_qp_idr - (pps->pic_init_qp_minus26 + 26); - vslice->macroblock_address = sh->first_mb_in_slice; - vslice->num_macroblocks = priv->mb_width * priv->mb_height; + vslice->macroblock_address = slice->index * priv->mb_width * (priv->mb_height / pic->nb_slices); + if (slice->index == pic->nb_slices - 1) { + vslice->num_macroblocks = priv->mb_width * priv->mb_height + - slice->index * priv->mb_width * (priv->mb_height / pic->nb_slices); + priv->idr_pic_count++; + } else + vslice->num_macroblocks = priv->mb_width * (priv->mb_height / pic->nb_slices); 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; @@ -855,6 +870,10 @@ static av_cold int vaapi_encode_h264_configure(AVCodecContext *avctx) } } + 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; }