From patchwork Sat Jan 20 21:12:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 7371 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.156.27 with SMTP id q27csp1134231jak; Sat, 20 Jan 2018 13:14:46 -0800 (PST) X-Google-Smtp-Source: AH8x2242NOLLKPpMxgRHEC86X9+E85v7cKGvxFQfq6GLCCrmMr3QL7cGwXzMOMSKzhFaf/A1Kge7 X-Received: by 10.223.157.20 with SMTP id k20mr2098299wre.275.1516482886770; Sat, 20 Jan 2018 13:14:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516482886; cv=none; d=google.com; s=arc-20160816; b=U5XyufKKoJWtts5gnpWmc1iGgeGcbEr7IPkZRnxdpouG0AaWzEVqG+2QzpGBuuaxJz oaNDR0QoL40zK7rCmN0Pua50q3f2mOHbYBUHatp+Okuxjyp1l7HAD2buizZslGQ2gTJ3 JHo1Ec4w6vF4J2S1RqZizth2Y6qqjTcKhZ+o5uqj9xOr3thtaCvBu9FC5lok6HjrEoI7 GyFRLyi9LLtfkDhm2XEzdg/YwFT7japlzO0UbtPGF5NlPu2EPUvNPm0qINVdnjkWnP5u b6gR9fsGckI+OrlDXGddA3Oz79WE9Heo4i9mgvvYdG/K4fo7+sqMLF0oM+VlFtu97fgj fnXw== 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: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=3FGUaA3HMBQKZoAlSZBioz40wIf0X/VZGH54CU+5DG4=; b=aCin7673IKOnWEJBKAkv7U5EtwkkJI+y6nXJV8x/OBWF58mWaqTpmnv5bCjWD/QC1V R0XSR1YXuXIWS4Y4aA3MLyyi3CJN9mcJax9TnJ6OWb2BJVvt4wswGervJzhrEaJCND3o ewm5zqSsZ127sCABnJNT8rfytr/SEw0G3HTLSKMzwtLk13/FpjEibTaiRcCeEN2Yq9Yn SuBXfXIOO66e54kEcNtm7UVPDnx/Q0gIX0Ct9moCaQ6bpuDClei9uVELwr1u4vsKdJ0v KaqzxObaavixT9/tJB6aq0oP068DadMqHptX6STCtvBtDNPW9pGoP0qB1h5KYsdSKsfl nFBg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=oyxrnaoj; 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 k36si10397848wrc.119.2018.01.20.13.14.46; Sat, 20 Jan 2018 13:14:46 -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=oyxrnaoj; 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 8C75C68A256; Sat, 20 Jan 2018 23:14:14 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f194.google.com (mail-qt0-f194.google.com [209.85.216.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7911D68A205 for ; Sat, 20 Jan 2018 23:14:07 +0200 (EET) Received: by mail-qt0-f194.google.com with SMTP id d54so12141879qtd.4 for ; Sat, 20 Jan 2018 13:14:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=ljpU1PdxXv6nQXDTzN6/iQbNyG50+2p36kbQd9gBjyY=; b=oyxrnaoj6cxqfur7ANyylqFsD6M3NVnjBZ0KozG8atYZhtvsbj3BvAlN7NBRJu4EFD 1vEpCXoTPLuH1Xvs1qD2OYVoppwO3W9ERdZi7vBK1zWbWLlKB5t2oA3HavOSYYXvwg6u utqr+Fbr84pkt97nx4gcD3mXU21lmyuyceYKCBMIju2S6CFAuM7QgVSVfi3hpswtPeFv PpBrkV/d9ceVGZTymlwYN0gc7JiCY2LAZpGU3dSvyqjUtHp3iul6v5dYBjG7vzhYCh3L 7qD8hd25bTJzlSJZRFwK02Z2zMW4el+8QV8ItjUKDYFtIFEFBJWmLx1hjn0AlZd2LOPB MKgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=ljpU1PdxXv6nQXDTzN6/iQbNyG50+2p36kbQd9gBjyY=; b=RuniMLTcm8r8KHGSN7LKV00LJ0G+oazz/DPXTPC6nb+P1YIY9Nh4raNuOoPD/dqSgh yPoBj8QZvs7Bxsfo1mVcK77hRd2HAJ3nMjwACBWsYf0G6rDXplG59GNi/CbFdHc5Xwv8 llVIDb1k4AI9zC5GKpC5qEm2Rx/9+RWKlMYzD4Ux2gOyZMM9VMqYCuNYpHdfLzFKXVf/ 7gQXs0konxo2joNKv1mskdH9hL308vL6t/p1M/VlH89lONwWYW2l1+hnvjI2jDiODh1a F2hYePcvLgDWcRJIv7GInLHDKgHDUtX/3p4Lhp9VWHSSobbbFqGVdSfoGXgYlYCsGEkt JwzA== X-Gm-Message-State: AKwxytf3b530xp+Da0kjMEaZAqi9u7wlByFGZ8QVdrWWXTm/JgDEOmlE CsPjPPVaAY6Vq7okpz84TLSZBA== X-Received: by 10.200.64.219 with SMTP id f27mr3725925qtm.227.1516482847634; Sat, 20 Jan 2018 13:14:07 -0800 (PST) Received: from localhost.localdomain ([181.229.225.176]) by smtp.gmail.com with ESMTPSA id c1sm8755313qta.52.2018.01.20.13.14.06 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 20 Jan 2018 13:14:07 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 20 Jan 2018 18:12:53 -0300 Message-Id: <20180120211253.9676-5-jamrial@gmail.com> X-Mailer: git-send-email 2.15.0 In-Reply-To: <20180120211253.9676-1-jamrial@gmail.com> References: <20180120211253.9676-1-jamrial@gmail.com> Subject: [FFmpeg-devel] [PATCH 5/5] avcodec/hevc_ps: use the AVBufferPool API to allocate parameter set buffers 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: James Almer --- I don't know if this brings many benefits. With up to 16 sps/vps and 64 pps, plus the fact all three ff_hevc_decode_nal_* functions allocate a buffer even if the result will not be added to the HEVCParamSets list, it may considerably reduce the amount of buffer allocations on raw streams where parameter sets are repeated on every keyframe, but i can't say if it will have a noticeable effect in performance. libavcodec/hevc_parser.c | 8 +++++++ libavcodec/hevc_ps.c | 57 ++++++++++++++++++++++++++++++++++------------ libavcodec/hevc_ps.h | 6 +++++ libavcodec/hevcdec.c | 3 +++ libavcodec/mediacodecdec.c | 4 ++++ 5 files changed, 64 insertions(+), 14 deletions(-) diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index 09a203097b..8e4423263d 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -353,6 +353,13 @@ static int hevc_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size) return 0; } +static av_cold int hevc_parser_init(AVCodecParserContext *s) +{ + HEVCParserContext *ctx = s->priv_data; + + return ff_hevc_init_parameter_sets(&ctx->ps); +} + static void hevc_parser_close(AVCodecParserContext *s) { HEVCParserContext *ctx = s->priv_data; @@ -368,6 +375,7 @@ AVCodecParser ff_hevc_parser = { .codec_ids = { AV_CODEC_ID_HEVC }, .priv_data_size = sizeof(HEVCParserContext), .parser_parse = hevc_parse, + .parser_init = hevc_parser_init, .parser_close = hevc_parser_close, .split = hevc_split, }; diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c index b18457296b..7d5195d667 100644 --- a/libavcodec/hevc_ps.c +++ b/libavcodec/hevc_ps.c @@ -420,7 +420,7 @@ int ff_hevc_decode_nal_vps(GetBitContext *gb, AVCodecContext *avctx, int vps_id = 0; ptrdiff_t nal_size; HEVCVPS *vps; - AVBufferRef *vps_buf = av_buffer_allocz(sizeof(*vps)); + AVBufferRef *vps_buf = av_buffer_pool_get(ps->vps_pool); if (!vps_buf) return AVERROR(ENOMEM); @@ -1218,11 +1218,11 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps, int apply_defdispwin) { - HEVCSPS *sps; - AVBufferRef *sps_buf = av_buffer_allocz(sizeof(*sps)); unsigned int sps_id; int ret; ptrdiff_t nal_size; + HEVCSPS *sps; + AVBufferRef *sps_buf = av_buffer_pool_get(ps->sps_pool); if (!sps_buf) return AVERROR(ENOMEM); @@ -1291,6 +1291,21 @@ static void hevc_pps_free(void *opaque, uint8_t *data) av_freep(&pps); } +static AVBufferRef *hevc_pps_alloc(void *opaque, int size) +{ + AVBufferRef *buf; + uint8_t *data = av_mallocz(size); + + if (!data) + return NULL; + + buf = av_buffer_create(data, size, hevc_pps_free, NULL, 0); + if (!buf) + av_free(data); + + return buf; +} + static int pps_range_extensions(GetBitContext *gb, AVCodecContext *avctx, HEVCPPS *pps, HEVCSPS *sps) { int i; @@ -1467,19 +1482,12 @@ int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, unsigned int pps_id = 0; ptrdiff_t nal_size; unsigned log2_parallel_merge_level_minus2; + HEVCPPS *pps; + AVBufferRef *pps_buf = av_buffer_pool_get(ps->pps_pool); - AVBufferRef *pps_buf; - HEVCPPS *pps = av_mallocz(sizeof(*pps)); - - if (!pps) - return AVERROR(ENOMEM); - - pps_buf = av_buffer_create((uint8_t *)pps, sizeof(*pps), - hevc_pps_free, NULL, 0); - if (!pps_buf) { - av_freep(&pps); + if (!pps_buf) return AVERROR(ENOMEM); - } + pps = (HEVCPPS*)pps_buf->data; av_log(avctx, AV_LOG_DEBUG, "Decoding PPS\n"); @@ -1704,6 +1712,23 @@ err: return ret; } +int ff_hevc_init_parameter_sets(HEVCParamSets *ps) +{ + ps->vps_pool = av_buffer_pool_init (sizeof(*ps->vps), av_buffer_allocz); + ps->sps_pool = av_buffer_pool_init (sizeof(*ps->sps), av_buffer_allocz); + ps->pps_pool = av_buffer_pool_init2(sizeof(*ps->pps), NULL, hevc_pps_alloc, NULL); + + if (!ps->vps_pool || !ps->sps_pool || !ps->pps_pool) { + av_buffer_pool_uninit(&ps->vps_pool); + av_buffer_pool_uninit(&ps->sps_pool); + av_buffer_pool_uninit(&ps->pps_pool); + + return AVERROR(ENOMEM); + } + + return 0; +} + void ff_hevc_uninit_parameter_sets(HEVCParamSets *ps) { int i; @@ -1715,6 +1740,10 @@ void ff_hevc_uninit_parameter_sets(HEVCParamSets *ps) for (i = 0; i < FF_ARRAY_ELEMS(ps->pps_list); i++) av_buffer_unref(&ps->pps_list[i]); + av_buffer_pool_uninit(&ps->vps_pool); + av_buffer_pool_uninit(&ps->sps_pool); + av_buffer_pool_uninit(&ps->pps_pool); + ps->sps = NULL; ps->pps = NULL; ps->vps = NULL; diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h index 871a58acc6..c05265a9be 100644 --- a/libavcodec/hevc_ps.h +++ b/libavcodec/hevc_ps.h @@ -392,6 +392,10 @@ typedef struct HEVCPPS { } HEVCPPS; typedef struct HEVCParamSets { + AVBufferPool *vps_pool; + AVBufferPool *sps_pool; + AVBufferPool *pps_pool; + AVBufferRef *vps_list[HEVC_MAX_VPS_COUNT]; AVBufferRef *sps_list[HEVC_MAX_SPS_COUNT]; AVBufferRef *pps_list[HEVC_MAX_PPS_COUNT]; @@ -421,6 +425,8 @@ int ff_hevc_decode_nal_sps(GetBitContext *gb, AVCodecContext *avctx, int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, HEVCParamSets *ps); +int ff_hevc_init_parameter_sets(HEVCParamSets *ps); + void ff_hevc_uninit_parameter_sets(HEVCParamSets *ps); int ff_hevc_decode_short_term_rps(GetBitContext *gb, AVCodecContext *avctx, diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 98a96defb7..a10bdf00cb 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -3312,6 +3312,9 @@ static av_cold int hevc_init_context(AVCodecContext *avctx) s->HEVClcList[0] = s->HEVClc; s->sList[0] = s; + if (ff_hevc_init_parameter_sets(&s->ps) < 0) + goto fail; + s->cabac_state = av_malloc(HEVC_CONTEXTS); if (!s->cabac_state) goto fail; diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c index b360e7a7f1..0c33a7041a 100644 --- a/libavcodec/mediacodecdec.c +++ b/libavcodec/mediacodecdec.c @@ -202,6 +202,10 @@ static int hevc_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) memset(&ps, 0, sizeof(ps)); memset(&sei, 0, sizeof(sei)); + ret = ff_hevc_init_parameter_sets(&ps); + if (ret < 0) + goto done; + ret = ff_hevc_decode_extradata(avctx->extradata, avctx->extradata_size, &ps, &sei, &is_nalff, &nal_length_size, 0, 1, avctx); if (ret < 0) {