From patchwork Wed May 9 01:12:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 8889 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp4640101jad; Tue, 8 May 2018 18:13:43 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqaD59Hi89Q0hME/JSWAO6Lmv2DZrIRerN8q8PG3hzaTI1zrj2W/ZMq8D+LgQkEm92J82Wq X-Received: by 2002:adf:aeea:: with SMTP id y97-v6mr36254403wrc.32.1525828423882; Tue, 08 May 2018 18:13:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525828423; cv=none; d=google.com; s=arc-20160816; b=UiZG/qwqcxD9UPFxTvfw5UUAb4wAaEMhDNQ7kxKemXXMxFox5IlUZM6xrEr3/dvDTb yfXT/+HI/mCaN4657yo7ZbyBsWIIn6FZ4NFPqHwsK/ghq0xUWsbkuUqUN+eb8TV4+Tvl rBMRWkbvi9ww8RsT9lgQelbgG5CE27PFb+3Jgi+5jRcLEdy//dQqU6lrG/VzYcjX2gKs 9Jjt4LB7bKfUqVYeC/8KSiBT+6Yr/PCRYfERcSPhxXoMitlHsZ525FxWnMLm+w5OuuC1 ZhJYkl0C7QxWpk78lGbNa4ykCeTPtht3XDYCx1Z4NLMcZGjAlmKdX6CYMbT1OAK4MC9G U/TQ== 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=/ovVZQd5tRNfHR2ZYMFspOdvijdBfxCslOyRc1D0iOM=; b=GJIYz1P8z1FMP6BP0yDKQC4drHTDk4xNA0xjWrClPCBDxdKVn6aopHaC+6m0S8qzfL TbC9AwDYV2btVYpb/GnTnKEnVGZlyijGbCvqCHhtXj3BkSSCNRsACU3yfy698iNnkbSr 2wo2lVKnT76DhLOLMzcOtf01bTz4B/TKk7VWhdHx02C1gso90sP8vcvnoCW3UH1jihk0 rx4Fmg8Mhttv8uPLAwJmkOUQy7/PYLZFt8uKHYSQQfWIlnvia2B8Q7dIok/npbLVC9KZ afgkQdUmHv3epg9jZgXFh3g3QS9ehG+itonU94gs2J4M46F6E/2wJAgxoMLc47s0qKil UfXA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=Xt408rfG; 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 t9-v6si13970926wri.364.2018.05.08.18.13.43; Tue, 08 May 2018 18:13:43 -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=Xt408rfG; 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 B0E2268A829; Wed, 9 May 2018 04:13:06 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f195.google.com (mail-qt0-f195.google.com [209.85.216.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DB8C968A80D for ; Wed, 9 May 2018 04:12:59 +0300 (EEST) Received: by mail-qt0-f195.google.com with SMTP id f13-v6so33865560qtp.10 for ; Tue, 08 May 2018 18:13:35 -0700 (PDT) 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=SPQ8VJZxlTPrE3Mb+K08ZG458pk+deuUz7Tby5z2gUY=; b=Xt408rfGZGO9qFwGEoYQwRp7WAfdCVpzXtshvrmQmNBTZCzOvjJcUJ/qcqtVBv4Hmk Q2bERwVcKn2QPAn81Hk8l1yerwZcWI6HzyULW4iyk59TFlBg1UxzjUPOPmlbU/20AAkL VZbHJdLWVMNGHAwTwYYa8YG0gQfpH453u+aM4h8wNPYpucUJfL1ofunXQNzIsbkkey+N +q3vpqjD6us0Lmo+0Ns10LW7xYsJJZyyIbCUC97RjVyCpvG7aLV15yVLwKFV917xY3ve Hc0VOkMXBOOGLExHXjhrGaBHN8OkaWNwJ6hWM2BQTaDk4dsVdItmxwJKOxIDAmd1FJEe U9vw== 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=SPQ8VJZxlTPrE3Mb+K08ZG458pk+deuUz7Tby5z2gUY=; b=HDtKbrxApMFrk+A6tMHNG+8R8t/bvHFElYCqQquwOI/8bODQxddLLOmAJwrs1vIIZ3 tcZXzwJock6f6rZ01VlRIjdqj9Bdx/PjndXF/AtT4JCAiD8e3jNeAl9ZbnSExWVFji8+ Q2JZ/bVFt6OX6/xsdcVeo2ymGPaUYZP6xkLFzxNJRLLee6YRFEtJmieLhIrfBugRpvSH RfHYWD2sos5Sru4V+KOlG+I0bQdn/2bH1TU8EM2sAOpcL6ucf8FTrmdIwnl/QL7/KaH3 PuiLtr+3h+Nvvy7ODDDRVRTgCsxKLgEJRU5f8bn1lk20nOSm7a46U9Dabxs1tEM+oEY1 zXRA== X-Gm-Message-State: ALQs6tBTzXCOEEEp4AivqXAFfK+mrOZDn0CWl3yvO/oHDZfHKmB9mt2G cqFW1EHoYA/JeY3obtjLCQeZYw== X-Received: by 2002:a0c:9944:: with SMTP id i4-v6mr40783266qvd.192.1525828414313; Tue, 08 May 2018 18:13:34 -0700 (PDT) Received: from localhost.localdomain ([190.188.171.140]) by smtp.gmail.com with ESMTPSA id u50-v6sm24207712qth.0.2018.05.08.18.13.33 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 08 May 2018 18:13:33 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 May 2018 22:12:55 -0300 Message-Id: <20180509011255.10888-1-jamrial@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: References: Subject: [FFmpeg-devel] [PATCH v3] avcodec/cbs_h2645: use AVBufferRef to store list of active parameter sets 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" Removes unnecessary data copies, and partially fixes potential issues with dangling references held in said lists. Signed-off-by: James Almer --- libavcodec/cbs_h264.h | 2 ++ libavcodec/cbs_h2645.c | 46 ++++++++++++++++++++++++------------------ libavcodec/cbs_h265.h | 3 +++ 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/libavcodec/cbs_h264.h b/libavcodec/cbs_h264.h index 2219d9da8d..d953c1f66b 100644 --- a/libavcodec/cbs_h264.h +++ b/libavcodec/cbs_h264.h @@ -421,6 +421,8 @@ typedef struct CodedBitstreamH264Context { // All currently available parameter sets. These are updated when // any parameter set NAL unit is read/written with this context. + AVBufferRef *sps_ref[H264_MAX_SPS_COUNT]; + AVBufferRef *pps_ref[H264_MAX_PPS_COUNT]; H264RawSPS *sps[H264_MAX_SPS_COUNT]; H264RawPPS *pps[H264_MAX_PPS_COUNT]; diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index 64a1a2d1ee..1ce42c6950 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -677,9 +677,10 @@ static int cbs_h2645_split_fragment(CodedBitstreamContext *ctx, #define cbs_h2645_replace_ps(h26n, ps_name, ps_var, id_element) \ static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \ - const H26 ## h26n ## Raw ## ps_name *ps_var) \ + CodedBitstreamUnit *unit) \ { \ CodedBitstreamH26 ## h26n ## Context *priv = ctx->priv_data; \ + H26 ## h26n ## Raw ## ps_name *ps_var = unit->content; \ unsigned int id = ps_var->id_element; \ if (id > FF_ARRAY_ELEMS(priv->ps_var)) { \ av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid " #ps_name \ @@ -688,11 +689,16 @@ static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \ } \ if (priv->ps_var[id] == priv->active_ ## ps_var) \ priv->active_ ## ps_var = NULL ; \ - av_freep(&priv->ps_var[id]); \ - priv->ps_var[id] = av_malloc(sizeof(*ps_var)); \ - if (!priv->ps_var[id]) \ + av_buffer_unref(&priv->ps_var ## _ref[id]); \ + if (unit->content_ref) \ + priv->ps_var ## _ref[id] = av_buffer_ref(unit->content_ref); \ + else \ + priv->ps_var ## _ref[id] = av_buffer_alloc(sizeof(*ps_var)); \ + if (!priv->ps_var ## _ref[id]) \ return AVERROR(ENOMEM); \ - memcpy(priv->ps_var[id], ps_var, sizeof(*ps_var)); \ + priv->ps_var[id] = (H26 ## h26n ## Raw ## ps_name *)priv->ps_var ## _ref[id]->data; \ + if (!unit->content_ref) \ + memcpy(priv->ps_var[id], ps_var, sizeof(*ps_var)); \ return 0; \ } @@ -726,7 +732,7 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = cbs_h264_replace_sps(ctx, sps); + err = cbs_h264_replace_sps(ctx, unit); if (err < 0) return err; } @@ -760,7 +766,7 @@ static int cbs_h264_read_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = cbs_h264_replace_pps(ctx, pps); + err = cbs_h264_replace_pps(ctx, unit); if (err < 0) return err; } @@ -873,7 +879,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = cbs_h265_replace_vps(ctx, vps); + err = cbs_h265_replace_vps(ctx, unit); if (err < 0) return err; } @@ -892,7 +898,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = cbs_h265_replace_sps(ctx, sps); + err = cbs_h265_replace_sps(ctx, unit); if (err < 0) return err; } @@ -912,7 +918,7 @@ static int cbs_h265_read_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = cbs_h265_replace_pps(ctx, pps); + err = cbs_h265_replace_pps(ctx, unit); if (err < 0) return err; } @@ -1002,7 +1008,7 @@ static int cbs_h264_write_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = cbs_h264_replace_sps(ctx, sps); + err = cbs_h264_replace_sps(ctx, unit); if (err < 0) return err; } @@ -1026,7 +1032,7 @@ static int cbs_h264_write_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = cbs_h264_replace_pps(ctx, pps); + err = cbs_h264_replace_pps(ctx, unit); if (err < 0) return err; } @@ -1123,7 +1129,7 @@ static int cbs_h265_write_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = cbs_h265_replace_vps(ctx, vps); + err = cbs_h265_replace_vps(ctx, unit); if (err < 0) return err; } @@ -1137,7 +1143,7 @@ static int cbs_h265_write_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = cbs_h265_replace_sps(ctx, sps); + err = cbs_h265_replace_sps(ctx, unit); if (err < 0) return err; } @@ -1151,7 +1157,7 @@ static int cbs_h265_write_nal_unit(CodedBitstreamContext *ctx, if (err < 0) return err; - err = cbs_h265_replace_pps(ctx, pps); + err = cbs_h265_replace_pps(ctx, unit); if (err < 0) return err; } @@ -1385,9 +1391,9 @@ static void cbs_h264_close(CodedBitstreamContext *ctx) av_freep(&h264->common.write_buffer); for (i = 0; i < FF_ARRAY_ELEMS(h264->sps); i++) - av_freep(&h264->sps[i]); + av_buffer_unref(&h264->sps_ref[i]); for (i = 0; i < FF_ARRAY_ELEMS(h264->pps); i++) - av_freep(&h264->pps[i]); + av_buffer_unref(&h264->pps_ref[i]); } static void cbs_h265_close(CodedBitstreamContext *ctx) @@ -1400,11 +1406,11 @@ static void cbs_h265_close(CodedBitstreamContext *ctx) av_freep(&h265->common.write_buffer); for (i = 0; i < FF_ARRAY_ELEMS(h265->vps); i++) - av_freep(&h265->vps[i]); + av_buffer_unref(&h265->vps_ref[i]); for (i = 0; i < FF_ARRAY_ELEMS(h265->sps); i++) - av_freep(&h265->sps[i]); + av_buffer_unref(&h265->sps_ref[i]); for (i = 0; i < FF_ARRAY_ELEMS(h265->pps); i++) - av_freep(&h265->pps[i]); + av_buffer_unref(&h265->pps_ref[i]); } const CodedBitstreamType ff_cbs_type_h264 = { diff --git a/libavcodec/cbs_h265.h b/libavcodec/cbs_h265.h index 33e71fc234..6d02979a17 100644 --- a/libavcodec/cbs_h265.h +++ b/libavcodec/cbs_h265.h @@ -523,6 +523,9 @@ typedef struct CodedBitstreamH265Context { // All currently available parameter sets. These are updated when // any parameter set NAL unit is read/written with this context. + AVBufferRef *vps_ref[HEVC_MAX_VPS_COUNT]; + AVBufferRef *sps_ref[HEVC_MAX_SPS_COUNT]; + AVBufferRef *pps_ref[HEVC_MAX_PPS_COUNT]; H265RawVPS *vps[HEVC_MAX_VPS_COUNT]; H265RawSPS *sps[HEVC_MAX_SPS_COUNT]; H265RawPPS *pps[HEVC_MAX_PPS_COUNT];