From patchwork Sat Jan 20 21:49:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 7375 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.156.27 with SMTP id q27csp1157093jak; Sat, 20 Jan 2018 13:50:35 -0800 (PST) X-Google-Smtp-Source: AH8x224zHJjwCzfTZo0qHTCuaDn3dIhfaurl8toM5D84Cf+HS4jptASIM0KnC25u+zrzsWGwHT8M X-Received: by 10.28.48.10 with SMTP id w10mr1868797wmw.93.1516485035567; Sat, 20 Jan 2018 13:50:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516485035; cv=none; d=google.com; s=arc-20160816; b=r2W6NkQlfDKqaqPy2y5iJDTxsDmniunJD0rbzPGsDJXWDe8GrvI+0TeG6iwGQ4W8IL ukruCMQ2GMVnzc/OnD5AXd0bqbqQz+DrK5831AcnarcpRQQlo+lo13TrUm9oyk+Ub78Y qBEjzlDGwbtU9t1hOnj1N9zyWUchl/zgt3wzZTrkCNNrapLf4tInUQKRdUicGQo5Ug8W NI+web6YAZ19gEy2866roSfRtrhOYKSIS3EzzP1eOfALZEy51FfnIMg7siTqzkWVErV0 C8K/IDxhdFyOFuK/Oc5xDUPfwEpmBopUyg9MKZODQFK2RS0n0jbaGuDB/HXzEll1HATh 1HTg== 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:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=f0uFsVHlOPT6QQbVTSFQsdUEuNqObcVjUKEKBhHLR5w=; b=lam3scENR+GhkGHU0TZqN/yqgnYFyvgxBsOGqa33PdXJgxUvzAkyR4lRZxLBQLUALi LIaEmS878TmnHneOg+CLJuqUBNTw6/bZR9GSIrrTH++enR4yXh0UTbNgp9pVZAmxOddh TnJra+84GnLqMMyIEfOLuwHcCmLDk5d+q/1ZV/Ig8gYf1tXVDBKHGnckEsRQky1wWV8v rN4jeUfEkLl0cC3R5Rzfa3JRDvna1O9eCjx8h5aQXXy+WjqGuG7ZdHy4geWus3GgKks1 Nug4qRA+SQ8T+hzuMk+I+UUcVbZrju/Ki4i57B4qc4nuh5bsLyrCQTIH1Lp+gLGvtunW IFsg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ucwDFfBD; 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 o204si2964637wme.155.2018.01.20.13.50.34; Sat, 20 Jan 2018 13:50:35 -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=ucwDFfBD; 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 0AFE368A1F8; Sat, 20 Jan 2018 23:50:32 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f193.google.com (mail-qt0-f193.google.com [209.85.216.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CF3FA689F9E for ; Sat, 20 Jan 2018 23:50:25 +0200 (EET) Received: by mail-qt0-f193.google.com with SMTP id c2so12242370qtn.9 for ; Sat, 20 Jan 2018 13:50:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=wlOFCL035t3cuVPx9p+IMhBjX8Ai8lRk9OpjlmFOLU8=; b=ucwDFfBDaf781zH+FBagKBcbaLDsx6tA2xbPZIfO/a4N27/jJFgyWG6ll7fQWq65U2 f8UF+o3RVpmZYS3SGQRGZW+PwGytz1gj+U0poovYp/6fES+Evp/o9g6T3RbFLGci/kVe 48HCW41pGzQHzi2+pF9KWZS0Q3hHqHnSDEhhoq49m3Md7MQJ+tA14SCt9zYibNXqJIJ3 Fg637r1JYKZIBsJl+Mn1jGujVLmz6B9Z8upNxL+Nfp+MJ2b7zwRolbg3Pxj7y6ps07uX HmZyolJGcPoztHeVcndk3WzXmPoJm0uIjpH6lI8HLSeMx3ta4TXIm2XQlxxGNNAt5Cvq kOLw== 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; bh=wlOFCL035t3cuVPx9p+IMhBjX8Ai8lRk9OpjlmFOLU8=; b=JVAaC3U8hV8bhX8WLtfeQeCYBWOuGdi6rWy5jqUkrPPl7UL3UuWvpmwkXKYgK2sM8h r12pscFRCkGN0Ha5KSXyfun2GeMDxH6fLvYX73aySgIr7qOw5MT+8HyNX8G+7BMvbbn3 iJVGki6CLNHUCpyct0iUE6Ixe/z2d88+mdoXv1zcGB38mNPzGDUPsVuMBlWuIrKZYfE/ GjQtAJs5WfCbC5RngHh669Sx3hHw4oLES0fvNaYZCQnkXbNRwry54Hug3eqXiKpUXlhH C4PPjnDLnQD/bLaY4lfk+YA6H3e9/IPseE/uon0BU6IwrtT3BwEJfeXbvvP0QrlrJRV4 5Dpw== X-Gm-Message-State: AKwxytdUMaBxPJZHDpn3LXk7XY0AJKzWc/ZFH4tAqmoxIKchXoLGkpnS +x2gMVq91idCYu6xObS7NAdWmA== X-Received: by 10.55.88.7 with SMTP id m7mr3826701qkb.142.1516485025673; Sat, 20 Jan 2018 13:50:25 -0800 (PST) Received: from localhost.localdomain ([181.229.225.176]) by smtp.gmail.com with ESMTPSA id u4sm7833552qtg.33.2018.01.20.13.50.24 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sat, 20 Jan 2018 13:50:25 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 20 Jan 2018 18:49:29 -0300 Message-Id: <20180120214929.2480-1-jamrial@gmail.com> X-Mailer: git-send-email 2.15.0 Subject: [FFmpeg-devel] [PATCH] avcodec/h264_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 --- Similar rationale as hevc. With up to 32 sps and 256 pps, this may come in handy when parsing raw streams. libavcodec/h264_parser.c | 3 ++- libavcodec/h264_ps.c | 22 ++++++++++++++++++++-- libavcodec/h264_ps.h | 5 +++++ libavcodec/h264dec.c | 3 +++ libavcodec/mediacodecdec.c | 4 ++++ 5 files changed, 34 insertions(+), 3 deletions(-) diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c index 65d9d44b50..fa6777fc05 100644 --- a/libavcodec/h264_parser.c +++ b/libavcodec/h264_parser.c @@ -697,7 +697,8 @@ static av_cold int init(AVCodecParserContext *s) p->reference_dts = AV_NOPTS_VALUE; p->last_frame_num = INT_MAX; ff_h264dsp_init(&p->h264dsp, 8, 1); - return 0; + + return ff_h264_ps_init(&p->ps); } AVCodecParser ff_h264_parser = { diff --git a/libavcodec/h264_ps.c b/libavcodec/h264_ps.c index 8d1ef831fa..50dbabdb8b 100644 --- a/libavcodec/h264_ps.c +++ b/libavcodec/h264_ps.c @@ -314,6 +314,21 @@ static int decode_scaling_matrices(GetBitContext *gb, const SPS *sps, return ret; } +int ff_h264_ps_init(H264ParamSets *ps) +{ + ps->sps_pool = av_buffer_pool_init(sizeof(*ps->sps), av_buffer_allocz); + ps->pps_pool = av_buffer_pool_init(sizeof(*ps->pps), av_buffer_allocz); + + if (!ps->sps_pool || !ps->pps_pool) { + av_buffer_pool_uninit(&ps->sps_pool); + av_buffer_pool_uninit(&ps->pps_pool); + + return AVERROR(ENOMEM); + } + + return 0; +} + void ff_h264_ps_uninit(H264ParamSets *ps) { int i; @@ -327,6 +342,9 @@ void ff_h264_ps_uninit(H264ParamSets *ps) av_buffer_unref(&ps->sps_ref); av_buffer_unref(&ps->pps_ref); + av_buffer_pool_uninit(&ps->sps_pool); + av_buffer_pool_uninit(&ps->pps_pool); + ps->pps = NULL; ps->sps = NULL; } @@ -341,7 +359,7 @@ int ff_h264_decode_seq_parameter_set(GetBitContext *gb, AVCodecContext *avctx, SPS *sps; int ret; - sps_buf = av_buffer_allocz(sizeof(*sps)); + sps_buf = av_buffer_pool_get(ps->sps_pool); if (!sps_buf) return AVERROR(ENOMEM); sps = (SPS*)sps_buf->data; @@ -738,7 +756,7 @@ int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avct return AVERROR_INVALIDDATA; } - pps_buf = av_buffer_allocz(sizeof(*pps)); + pps_buf = av_buffer_pool_get(ps->pps_pool); if (!pps_buf) return AVERROR(ENOMEM); pps = (PPS*)pps_buf->data; diff --git a/libavcodec/h264_ps.h b/libavcodec/h264_ps.h index 51b6694b5f..65730153e7 100644 --- a/libavcodec/h264_ps.h +++ b/libavcodec/h264_ps.h @@ -135,6 +135,9 @@ typedef struct PPS { } PPS; typedef struct H264ParamSets { + AVBufferPool *sps_pool; + AVBufferPool *pps_pool; + AVBufferRef *sps_list[MAX_SPS_COUNT]; AVBufferRef *pps_list[MAX_PPS_COUNT]; @@ -162,4 +165,6 @@ int ff_h264_decode_picture_parameter_set(GetBitContext *gb, AVCodecContext *avct */ void ff_h264_ps_uninit(H264ParamSets *ps); +int ff_h264_ps_init(H264ParamSets *ps); + #endif /* AVCODEC_H264_PS_H */ diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index 8c9c6d9f3b..ef79387326 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -326,6 +326,9 @@ static int h264_init_context(AVCodecContext *avctx, H264Context *h) ff_h264_sei_uninit(&h->sei); + if (ff_h264_ps_init(&h->ps) < 0) + return AVERROR(ENOMEM); + avctx->chroma_sample_location = AVCHROMA_LOC_LEFT; h->nb_slice_ctx = (avctx->active_thread_type & FF_THREAD_SLICE) ? avctx->thread_count : 1; diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c index 6c5d3ddd79..f623147741 100644 --- a/libavcodec/mediacodecdec.c +++ b/libavcodec/mediacodecdec.c @@ -131,6 +131,10 @@ static int h264_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format) memset(&ps, 0, sizeof(ps)); + ret = ff_h264_ps_init(&ps); + if (ret < 0) + goto done; + ret = ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size, &ps, &is_avc, &nal_length_size, 0, avctx); if (ret < 0) {