From patchwork Wed Nov 8 08:20:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 5997 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.161.90 with SMTP id m26csp448790jah; Wed, 8 Nov 2017 00:20:44 -0800 (PST) X-Google-Smtp-Source: ABhQp+SdxzbRCrzPHB87xy/td2pTL0tFdMSmfv8d2jg65T2qnWSRajF7AImEek79R9isUIqaKuof X-Received: by 10.28.24.70 with SMTP id 67mr1236508wmy.7.1510129244779; Wed, 08 Nov 2017 00:20:44 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1510129244; cv=none; d=google.com; s=arc-20160816; b=eMziu4y7BM0yUQGbOLi1tAXTwt4hjUypIcFgFBZsUk1TQFaz3LpvjTiLfGkzcD4Fcu 5AlJTfUvR174U9rHDL2beXOL8E5AXxlK/a4VwlsQkh14/uE5XvQorBfWrqP4iNsAZq5J JP/FyRFMiB7PIemZ9NpcyaoOgpvdbK+hQ5t0RTt12fXcxyWtDqCGBGV/dYLZVs9J1w9Z jarbVSKfi5mJ6gbfi31X8be0wt7C9h1QMHW4NvxYiKpv/QhlrLMKSCj9JsiuUilCNbkl vHVQ9ANSEoudN5chWAL46sP8/2PUZAoIWe0StHiIaXod9Fzj9Ybbdm+jOl3U7sOljf2X heDQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:subject :content-language:mime-version:user-agent:date:message-id:from:to :dkim-signature:delivered-to:arc-authentication-results; bh=HI76WToIig+7kRFAWWgJ3eLJn5Y2qm5UF2mdJ1C7OEU=; b=F3rJSrRsZH7PbwazqSfaoSx/Mg6VDbs0WO/WPX7eEbz8dYc72jqA8eoqhCcjXZtbqn Cm85KDnVw37qkrW4780roVzBAuvejGNGs6gDiirpKI5G/22Zl6tcXeuDNLV4EOdwmt9v 2V2LqwwO449Wltce2/uY5muCEOQExKCYYsjzHwINEA5e+Zt0eNAiXAOWlbgA/kdXs2En Si9Ln6s/bE1FhX9EWfP9OgUY9X2EuHTq/pjV/tK0mCVJJ45Oc939c7SRLShqRueK0nzf KAU1wCSlcsSkQF1H8Eg+7QL5sOMnQEj+oxjW5k2NLXUCt6JYYzlkVxHnJeo/FtGzKoDw 4Z6A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=S+mhzepx; 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=NONE 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 x23si2910205wma.79.2017.11.08.00.20.43; Wed, 08 Nov 2017 00:20:44 -0800 (PST) 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=S+mhzepx; 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=NONE 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 22E9D689AFD; Wed, 8 Nov 2017 10:20:29 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl0-f53.google.com (mail-pl0-f53.google.com [209.85.160.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BBA766883B4 for ; Wed, 8 Nov 2017 10:20:21 +0200 (EET) Received: by mail-pl0-f53.google.com with SMTP id 63so826932pld.13 for ; Wed, 08 Nov 2017 00:20:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version :content-language; bh=W6D77+PXOhgd8qpTtF+pig2IMKtQQTu8eL8AiV65WGY=; b=S+mhzepxSuJ2WoKkfxfngxP2CuWv4DskRrBM9QXRSX1dcBfrRL0E3DnV1hUfjx3H3K 1lm8w3dxPW5mD/pF56Psab32BuQgNBnH4OtVfPOGOIbOw50gzUuEPwuoAwm14+UwrVFr 4viReGuEqorRxSGGReveW1MgShyI0Ly+VhsX0sCOG4EmGji11LupGw1qDTSpdBWOdh25 A+fgEDcYjyGmOtZHsK7H/egiEUewffOb2RVx8Gi+HWDyNFZSzM6DMnkf4a5BBzgF5UKH rhYv9p0420XR3Q5RZYp0YsWiUVAv9bcdNpfMoiq7C9yqpe6FNBuj1BjaT2f2AXrqNlkZ UnoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-language; bh=W6D77+PXOhgd8qpTtF+pig2IMKtQQTu8eL8AiV65WGY=; b=VJdiBSjWgyrbc8dezJZaZSG7TCcOAmmIqwAlr6o04rfwRJJhcca34OUIJjlnMA2R3H dbvvhJ1pjPwB/xZxlH+2adlqonfx5nHHpGGyCh0ayWDLVJIjy06pAFq9tfSDKzQ6poeL 4glxvOFtjw4otxIRwpL7j5EsHJXBf50++tEtMJO1amsw57PX5wWSWv23C8d1/+jPIG4r KCVPM/xFTqz4w2QLJWS4FACww/OXcU5CIQ06wqmbsskFJOqE4oU29Bjeh8JLVDrFRizs r3o6cFoxxRlH0Z37jNo+/TBuZfNqfUkk+tW9VdfVdLd+qWSZwPKjK+hczu38QcnER94d Dj2A== X-Gm-Message-State: AJaThX6G3mhqf5D55gfUgFfciD4AWZCqfSl5XO+Q+OTqMo9bUQ9P9KXp QeZGL0Dzu119xwyJHHiDx+4= X-Received: by 10.159.253.5 with SMTP id p5mr75146pls.372.1510129232784; Wed, 08 Nov 2017 00:20:32 -0800 (PST) Received: from [10.67.68.23] ([192.55.54.41]) by smtp.gmail.com with ESMTPSA id q70sm8141256pfj.39.2017.11.08.00.20.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 08 Nov 2017 00:20:31 -0800 (PST) To: FFmpeg development discussions and patches , Mark Thompson From: Jun Zhao Message-ID: <9a0a1319-8e13-5244-fc00-53d563b9b9e8@gmail.com> Date: Wed, 8 Nov 2017 16:20:28 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.4.0 MIME-Version: 1.0 Content-Language: en-US Subject: [FFmpeg-devel] [PATCH 1/3] lavc/vaapi_encode: Change the encode common code to support mutil-refs. 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" This is a early version for RFC, and will refactoring if have some comments. Test with i965 mainline master branch, test command like this:   ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -c:v h264_vaapi -refs 4 output_refs4.mp4   ffmpeg -hwaccel vaapi -hwaccel_device /dev/dri/renderD128 -hwaccel_output_format vaapi -i input.mp4 -c:v hevc_vaapi -refs 4 output_refs4.mp4 From 703e4425942eb51cfddda578bd21d1662cc50be7 Mon Sep 17 00:00:00 2001 From: Jun Zhao Date: Tue, 7 Nov 2017 14:30:57 +0800 Subject: [PATCH 1/3] lavc/vaapi_encode: Change the encode common code to support mutil-refs. Move vaapi_encode_alloc/free/step/output to vaapi_encode.h and change the max reference frames number. Signed-off-by: Jun Zhao Signed-off-by: Wang, Yi A --- libavcodec/vaapi_encode.c | 21 ++++++++++++++------- libavcodec/vaapi_encode.h | 19 ++++++++++++++++++- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index 590f4be4ed..74bb02dc29 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -108,6 +108,7 @@ static int vaapi_encode_wait(AVCodecContext *avctx, { VAAPIEncodeContext *ctx = avctx->priv_data; VAStatus vas; + int i; av_assert0(pic->encode_issued); @@ -131,6 +132,9 @@ static int vaapi_encode_wait(AVCodecContext *avctx, av_frame_free(&pic->input_image); pic->encode_complete = 1; + for (i = 0; i < pic->nb_refs; i++) { + pic->refs[i]->ref_count --; + } return 0; } @@ -448,8 +452,8 @@ fail_at_end: return err; } -static int vaapi_encode_output(AVCodecContext *avctx, - VAAPIEncodePicture *pic, AVPacket *pkt) +int vaapi_encode_output(AVCodecContext *avctx, + VAAPIEncodePicture *pic, AVPacket *pkt) { VAAPIEncodeContext *ctx = avctx->priv_data; VACodedBufferSegment *buf_list, *buf; @@ -526,7 +530,7 @@ static int vaapi_encode_discard(AVCodecContext *avctx, return 0; } -static VAAPIEncodePicture *vaapi_encode_alloc(void) +VAAPIEncodePicture *vaapi_encode_alloc(void) { VAAPIEncodePicture *pic; @@ -541,8 +545,8 @@ static VAAPIEncodePicture *vaapi_encode_alloc(void) return pic; } -static int vaapi_encode_free(AVCodecContext *avctx, - VAAPIEncodePicture *pic) +int vaapi_encode_free(AVCodecContext *avctx, + VAAPIEncodePicture *pic) { int i; @@ -573,8 +577,8 @@ static int vaapi_encode_free(AVCodecContext *avctx, return 0; } -static int vaapi_encode_step(AVCodecContext *avctx, - VAAPIEncodePicture *target) +int vaapi_encode_step(AVCodecContext *avctx, + VAAPIEncodePicture *target) { VAAPIEncodeContext *ctx = avctx->priv_data; VAAPIEncodePicture *pic; @@ -1097,6 +1101,8 @@ static av_cold int vaapi_encode_config_attributes(AVCodecContext *avctx) err = AVERROR(EINVAL); goto fail; } + ctx->max_ref_l0 = ref_l0; + ctx->max_ref_l1 = ref_l1; } break; case VAConfigAttribEncPackedHeaders: @@ -1340,6 +1346,7 @@ static av_cold int vaapi_encode_create_recon_frames(AVCodecContext *avctx) // At most three IDR/I/P frames and two runs of B frames can be in // flight at any one time. ctx->recon_frames->initial_pool_size = 3 + 2 * avctx->max_b_frames; + ctx->recon_frames->initial_pool_size += ctx->max_ref_l0 + ctx->max_ref_l1; err = av_hwframe_ctx_init(ctx->recon_frames_ref); if (err < 0) { diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index bcb9d57371..53950cc0a1 100644 --- a/libavcodec/vaapi_encode.h +++ b/libavcodec/vaapi_encode.h @@ -34,7 +34,7 @@ struct VAAPIEncodePicture; enum { MAX_CONFIG_ATTRIBUTES = 4, MAX_GLOBAL_PARAMS = 4, - MAX_PICTURE_REFERENCES = 2, + MAX_PICTURE_REFERENCES = 12, MAX_REORDER_DELAY = 16, MAX_PARAM_BUFFER_SIZE = 1024, }; @@ -79,9 +79,12 @@ typedef struct VAAPIEncodePicture { void *priv_data; void *codec_picture_params; + int ref_count; + int nb_refs; struct VAAPIEncodePicture *refs[MAX_PICTURE_REFERENCES]; + int nb_slices; VAAPIEncodeSlice *slices; } VAAPIEncodePicture; @@ -206,6 +209,10 @@ typedef struct VAAPIEncodeContext { int p_counter; int end_of_stream; + // max reference frame number + int max_ref_l0; + int max_ref_l1; + // Codec-local options are allocated to follow this structure in // memory (in the AVCodec definition, set priv_data_size to // sizeof(VAAPIEncodeContext) + sizeof(VAAPIEncodeFooOptions)). @@ -279,5 +286,15 @@ int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt, int ff_vaapi_encode_init(AVCodecContext *avctx); int ff_vaapi_encode_close(AVCodecContext *avctx); +VAAPIEncodePicture *vaapi_encode_alloc(void); +int vaapi_encode_free(AVCodecContext *avctx, + VAAPIEncodePicture *pic); + +int vaapi_encode_step(AVCodecContext *avctx, + VAAPIEncodePicture *target); +int vaapi_encode_output(AVCodecContext *avctx, + VAAPIEncodePicture *pic, AVPacket *pkt); + + #endif /* AVCODEC_VAAPI_ENCODE_H */