From patchwork Fri Aug 18 02:13:33 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jun Zhao X-Patchwork-Id: 4735 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.46.211 with SMTP id u202csp255828vsu; Thu, 17 Aug 2017 19:13:49 -0700 (PDT) X-Received: by 10.28.39.70 with SMTP id n67mr350624wmn.163.1503022429824; Thu, 17 Aug 2017 19:13:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1503022429; cv=none; d=google.com; s=arc-20160816; b=dTsbAuZAzRSSob6qltgHCTOY5wpAgeqsR4Ot/7apEKR2hUqnY0RmcklD5qywX6qWlZ X2e1XlfIPa1uqDHky1D6lAx5bkflyzfw6vv98uugsJdUvHd0h9m5P85MPB109UlDAyg0 FfQcsXZ8y8pt8U6Sy704nzWKHsRJHZcbds7/h5fP5jsQ54f7mDckyLoWzlxRC8QFfUuK 5zazeA/IErkqQ9+ODYWt+1pRj38YSYZGw9Z/vUKtQ/hXzNGCdf02T67e9OFsHsIuzqmf rxrQtWhpwwmBYltbiYwdGm/owoW3EFiTj3wv8PPwYkQBwl2ATQFjPFDpIPAsY8O8C943 Jgpg== 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=sh6qvl3ju5ds0iWoqXk/bnOn0s5dl3u0FhXDaC5ga/A=; b=Ie2Twb2tCzD3wElgFA0oLCOvnAO7bdOgyJMTrAQChXzNwRpaXpkCwLIQi2EdUS+aXg nPOYLHvBiLXKBSdjTbfch+gRY5GkCMwzkpEjVGbPEDPSaCSHTzwbdNyR1ktL+7WRpN5/ 1A1hXnZt5XutlV2RM4U/zTGES5Lsw++S0dSs0+/ECxUz/NWuknb3xPX6AfGels6CYnrt gWrVmyHwKU/UgfZQurrjgCzdcKl2zddOWsiyDqBpuYKtUAKFthRBZ2BxCXb+b7YSg2O1 sIBKBqUhLoiuS/s9dAYi2DryRkypE5JyM09wZ70ymRiYwW2x5Tk8MuypibR0oxcJfg0u bj7Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ZFFXk8in; 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 s13si3398344wrb.479.2017.08.17.19.13.49; Thu, 17 Aug 2017 19:13:49 -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=ZFFXk8in; 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 8621F68995B; Fri, 18 Aug 2017 05:13:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pg0-f43.google.com (mail-pg0-f43.google.com [74.125.83.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D5B9C68826D for ; Fri, 18 Aug 2017 05:13:33 +0300 (EEST) Received: by mail-pg0-f43.google.com with SMTP id y129so54353924pgy.4 for ; Thu, 17 Aug 2017 19:13:39 -0700 (PDT) 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=zlFeZ0DyEAJ2QEzEnYhoHTuYf3FgjjFGWY/vFmkasAc=; b=ZFFXk8inGLswNAK/Dqg60xrQ4qY4R8TzlXMoX0qxw7njMmiZuRP4Xcb4n2qRrarfX0 i8YF2FHNLlyty3RbBuA2eUxbdTiiwrW7c6elraKxVAenKbnXnEQ/CPg6lQDnGev3RpVP +iBKVBUHqMPYO0k+wplsk7FV1j211ZZKZJnayjDAHz58ty1UvVRGNcrB/0L+X83AyhbH VnY3IFkerc6aYCoHdelWXhZ5qKflwt65SWzxmk8vLFFslLXrg8reujISK3deJ+Y0IVmx 4SfSiw27BXoA3KY665aaz4UnAHJUAIICKHjWPHSnw2Yrm1MNQpmGjEwkJKrvFTkcz+sG nf2A== 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=zlFeZ0DyEAJ2QEzEnYhoHTuYf3FgjjFGWY/vFmkasAc=; b=qGNzws+8b9uYgUwRpt1VZVeibfkh+uyUKkfrIJKoM56fCGSLkB7BxdHtkzXlY8Zfb/ pP+7C+QsajpFvFhCtkrNZq6wOopvBuGI+20idQWUolNBKgtnpz2dF1LOrOc9OapwzcOC plFtlHshwEQh05d9alZQN8vNvf/003droxnsZ0z+qQluhyAvdBLn4q4G1GJ/pvI0iu+H xkCsJslZtpfTbObzJsK4HAH/C+dXaPqas0m+rLozpmWonEYKb69jrIJrv+WzTNUxo7w6 gJkgZC/UiCmdddZsm/X23O2tTHVS1g/AlL8trk7tiDQ4oXAZWrfasrDYzHfZ0TwA+yBP GCpg== X-Gm-Message-State: AHYfb5it3Vtk9lGHoaPP3E1hhmHVFY7maneRuaCKbvCZEPHpH2VH5fGh v1XDuJvtJzXqLA== X-Received: by 10.84.232.199 with SMTP id x7mr390800plm.408.1503022417735; Thu, 17 Aug 2017 19:13:37 -0700 (PDT) Received: from [10.67.68.37] (fmdmzpr02-ext.fm.intel.com. [192.55.55.37]) by smtp.gmail.com with ESMTPSA id d1sm9114925pgc.57.2017.08.17.19.13.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 17 Aug 2017 19:13:36 -0700 (PDT) To: FFmpeg development discussions and patches , Mark Thompson From: Jun Zhao Message-ID: <52b1889d-bad2-cfd8-61fc-35a2f95da2db@gmail.com> Date: Fri, 18 Aug 2017 10:13:33 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 Content-Language: en-US Subject: [FFmpeg-devel] [PATCH V3 1/4] lavc/vaapi_encode: Change the slice/parameter buffers to dynamic alloc. 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" V3: - Making pic->slices be VAAPIEncodeSlice* instead of VAAPIEncodeSlice**. - Fix resource (vaBuffer) lead when realloc pic->param_buffers fail. - Adjust max_slices location in VAAPIEncodeContext. - Re-work distributing the macro-blocks for multi-slices function. V2: Change the slice/parameter buffers to dynamic alloc and split the mutil-slice support for AVC/HEVC. From 4b2414cf589b8b64639e87c2ab1b4045099b8ba0 Mon Sep 17 00:00:00 2001 From: Jun Zhao Date: Mon, 31 Jul 2017 22:46:23 -0400 Subject: [PATCH V3 1/4] lavc/vaapi_encode: Change the slice/parameter buffers to dynamic alloc. Change the slice/parameter buffers to be allocated dynamically. Signed-off-by: Wang, Yi A Signed-off-by: Jun Zhao --- libavcodec/vaapi_encode.c | 44 ++++++++++++++++++++++++++++++++------------ libavcodec/vaapi_encode.h | 6 ++---- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/libavcodec/vaapi_encode.c b/libavcodec/vaapi_encode.c index 2de5f76cab..afc3970d44 100644 --- a/libavcodec/vaapi_encode.c +++ b/libavcodec/vaapi_encode.c @@ -36,13 +36,18 @@ static int vaapi_encode_make_packed_header(AVCodecContext *avctx, VAAPIEncodeContext *ctx = avctx->priv_data; VAStatus vas; VABufferID param_buffer, data_buffer; + VABufferID *tmp; VAEncPackedHeaderParameterBuffer params = { .type = type, .bit_length = bit_len, .has_emulation_bytes = 1, }; - av_assert0(pic->nb_param_buffers + 2 <= MAX_PARAM_BUFFERS); + tmp = av_realloc_array(pic->param_buffers, sizeof(*tmp), pic->nb_param_buffers + 2); + if (!tmp) { + return AVERROR(ENOMEM); + } + pic->param_buffers = tmp; vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, VAEncPackedHeaderParameterBufferType, @@ -77,9 +82,14 @@ static int vaapi_encode_make_param_buffer(AVCodecContext *avctx, { VAAPIEncodeContext *ctx = avctx->priv_data; VAStatus vas; + VABufferID *tmp; VABufferID buffer; - av_assert0(pic->nb_param_buffers + 1 <= MAX_PARAM_BUFFERS); + tmp = av_realloc_array(pic->param_buffers, sizeof(*tmp), pic->nb_param_buffers + 1); + if (!tmp) { + return AVERROR(ENOMEM); + } + pic->param_buffers = tmp; vas = vaCreateBuffer(ctx->hwctx->display, ctx->va_context, type, len, 1, data, &buffer); @@ -313,15 +323,14 @@ static int vaapi_encode_issue(AVCodecContext *avctx, } } - av_assert0(pic->nb_slices <= MAX_PICTURE_SLICES); + pic->slices = av_mallocz(pic->nb_slices * sizeof(*slice)); + if (!pic->slices) { + err = AVERROR(ENOMEM); + goto fail; + } for (i = 0; i < pic->nb_slices; i++) { - slice = av_mallocz(sizeof(*slice)); - if (!slice) { - err = AVERROR(ENOMEM); - goto fail; - } + slice = &pic->slices[i]; slice->index = i; - pic->slices[i] = slice; if (ctx->codec->slice_params_size > 0) { slice->codec_slice_params = av_mallocz(ctx->codec->slice_params_size); @@ -425,8 +434,16 @@ fail_with_picture: fail: for(i = 0; i < pic->nb_param_buffers; i++) vaDestroyBuffer(ctx->hwctx->display, pic->param_buffers[i]); + for (i = 0; i < pic->nb_slices; i++) { + if (pic->slices && &pic->slices[i]) { + av_freep(&pic->slices[i].priv_data); + av_freep(&pic->slices[i].codec_slice_params); + } + } fail_at_end: av_freep(&pic->codec_picture_params); + av_freep(&pic->param_buffers); + av_freep(&pic->slices); av_frame_free(&pic->recon_image); av_buffer_unref(&pic->output_buffer_ref); pic->output_buffer = VA_INVALID_ID; @@ -535,15 +552,18 @@ static int vaapi_encode_free(AVCodecContext *avctx, vaapi_encode_discard(avctx, pic); for (i = 0; i < pic->nb_slices; i++) { - av_freep(&pic->slices[i]->priv_data); - av_freep(&pic->slices[i]->codec_slice_params); - av_freep(&pic->slices[i]); + if (pic->slices && &pic->slices[i]) { + av_freep(&pic->slices[i].priv_data); + av_freep(&pic->slices[i].codec_slice_params); + } } av_freep(&pic->codec_picture_params); av_frame_free(&pic->input_image); av_frame_free(&pic->recon_image); + av_freep(&pic->param_buffers); + av_freep(&pic->slices); // Output buffer should already be destroyed. av_assert0(pic->output_buffer == VA_INVALID_ID); diff --git a/libavcodec/vaapi_encode.h b/libavcodec/vaapi_encode.h index 0edf27e4cb..e9aaec6f74 100644 --- a/libavcodec/vaapi_encode.h +++ b/libavcodec/vaapi_encode.h @@ -35,8 +35,6 @@ enum { MAX_CONFIG_ATTRIBUTES = 4, MAX_GLOBAL_PARAMS = 4, MAX_PICTURE_REFERENCES = 2, - MAX_PICTURE_SLICES = 112, - MAX_PARAM_BUFFERS = 128, MAX_REORDER_DELAY = 16, MAX_PARAM_BUFFER_SIZE = 1024, }; @@ -73,7 +71,7 @@ typedef struct VAAPIEncodePicture { VASurfaceID recon_surface; int nb_param_buffers; - VABufferID param_buffers[MAX_PARAM_BUFFERS]; + VABufferID *param_buffers; AVBufferRef *output_buffer_ref; VABufferID output_buffer; @@ -85,7 +83,7 @@ typedef struct VAAPIEncodePicture { struct VAAPIEncodePicture *refs[MAX_PICTURE_REFERENCES]; int nb_slices; - VAAPIEncodeSlice *slices[MAX_PICTURE_SLICES]; + VAAPIEncodeSlice *slices; } VAAPIEncodePicture; typedef struct VAAPIEncodeContext {