From patchwork Sat Nov 24 01:55:36 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 11137 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 5A0FA44DA38 for ; Sat, 24 Nov 2018 03:57:09 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DF25E68A324; Sat, 24 Nov 2018 03:57:09 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 89B2868A16D for ; Sat, 24 Nov 2018 03:57:03 +0200 (EET) Received: by mail-wm1-f44.google.com with SMTP id r63-v6so13331535wma.4 for ; Fri, 23 Nov 2018 17:57:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=GEdTaNL/JBnDNEc/n+MncwiB5rrNswdeBucxYDZ0csw=; b=Nmf2m2U7KSfZBXXmy3hUSEh36pJDhDuT5K+8OaK/el+uULQ1nWiBIaQvNFYenvLnLM /ZxBdHbVIcfoYIoj06qwmffCR1DPs6QQjAnB35K1Nc1GGyQQpJPKjJ5SDm75KDUMeEH2 Kc1RzX7c8JwHnJSXAX3LJSarHiXdolpKkfeet11EEHJ54eLQDxVv2tyl2KNOu73w9vCD TJR6LO+tpE9t9bbfdot9NLXcxVM3w4arhLXbqMkBiyOFIP9x28Q7BoNTHpDTyPcuppL6 9OMcfX0mIDUEdGdiya6uNBvSGLvqymQN6Qnkul7DI/mEHO8cJ7NBjbKmxKQjEigmKjO2 vlng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=GEdTaNL/JBnDNEc/n+MncwiB5rrNswdeBucxYDZ0csw=; b=hhF6N6VVELp8KHF3mD+EHBmfzpZKQVp+te8NKyppQR19pYEjTUou0sRRH7Ua1mZShZ spNA0tT4bLIBLfJYftD/zB1uNsHDu2zJA5ZxHKB00mKLR+RCGrJfwGlTPcPYtsCTYuOP 2t/1v+nisCQLV46GQCE0jKcrqv1+4QWwe4SiLV5ppE4mCDGCleJluCdvecqVNFoQ26M9 i68/aWLPoGwS+e69Z6ITCcOA2W9Wf0tYMJqVGHkOoMwuNRrcVyI+xN4wsADYtRvkg1f3 vq325w+r9HVPBfeVqycDgZxJnmYMdVdYcu43WyKSRKwSzDYe4unND3eQCSDuXJZ+IZuT X7EA== X-Gm-Message-State: AA+aEWaxG4pPhpqYfYWv60SioXBlKXMUyxD3ukTYOjXm5guTawCL26y1 HPHgCGpfJn9liGQ+ntUSMn2LEAUO X-Google-Smtp-Source: AFSGD/WPH9HCl6l2aoimVD5vZB161jFBB5T/V5yXo1ghHdvh0m3Ahhbcs8y5PyxRtYsrFFkOTZ19Hw== X-Received: by 2002:a1c:8c4d:: with SMTP id o74mr15822070wmd.134.1543024626483; Fri, 23 Nov 2018 17:57:06 -0800 (PST) Received: from localhost.localdomain (ipbcc08c44.dynamic.kabel-deutschland.de. [188.192.140.68]) by smtp.googlemail.com with ESMTPSA id d8sm398284wrw.70.2018.11.23.17.57.05 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 23 Nov 2018 17:57:05 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 24 Nov 2018 02:55:36 +0100 Message-Id: <20181124015539.7164-4-andreas.rheinhardt@googlemail.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/5] cbs_h2645: Implement copy-functions for 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" and use them to replace the context's parameter sets. This fixes a dangling pointers problem with the parameter sets held in the CodedBitstreamH26xContext that occurs when the parameter sets were not reference-counted initially. The functions to free the parameter sets that have a special free callback are now also created via the same macro as the copy functions. Signed-off-by: Andreas Rheinhardt --- libavcodec/cbs_h2645.c | 47 ++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index 7296c4cf29..b40cf92a7b 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -413,14 +413,25 @@ static int cbs_h2645_read_more_rbsp_data(GetBitContext *gbc) #undef byte_alignment #undef allocate - -static void cbs_h264_free_pps(void *unit, uint8_t *content) +static AVBufferRef *cbs_h264_copy_sps(const H264RawSPS *source) { - H264RawPPS *pps = (H264RawPPS*)content; - av_buffer_unref(&pps->slice_group_id_ref); - av_freep(&content); + AVBufferRef *ref = av_buffer_alloc(sizeof(H264RawSPS)); + if (!ref) + return NULL; + memcpy(ref->data, source, sizeof(H264RawSPS)); + return ref; } +cbs_copy_free(h264, H264RawPPS, pps, slice_group_id, + pic_size_in_map_units_minus1, BYTES, 1) + +cbs_copy_free(h265, H265RawVPS, vps, extension_data.data, + extension_data.bit_length, BITS, 0) +cbs_copy_free(h265, H265RawSPS, sps, extension_data.data, + extension_data.bit_length, BITS, 0) +cbs_copy_free(h265, H265RawPPS, pps, extension_data.data, + extension_data.bit_length, BITS, 0) + static void cbs_h264_free_sei_payload(H264RawSEIPayload *payload) { switch (payload->payload_type) { @@ -459,27 +470,6 @@ static void cbs_h264_free_slice(void *unit, uint8_t *content) av_freep(&content); } -static void cbs_h265_free_vps(void *unit, uint8_t *content) -{ - H265RawVPS *vps = (H265RawVPS*)content; - av_buffer_unref(&vps->extension_data.data_ref); - av_freep(&content); -} - -static void cbs_h265_free_sps(void *unit, uint8_t *content) -{ - H265RawSPS *sps = (H265RawSPS*)content; - av_buffer_unref(&sps->extension_data.data_ref); - av_freep(&content); -} - -static void cbs_h265_free_pps(void *unit, uint8_t *content) -{ - H265RawPPS *pps = (H265RawPPS*)content; - av_buffer_unref(&pps->extension_data.data_ref); - av_freep(&content); -} - static void cbs_h265_free_slice(void *unit, uint8_t *content) { H265RawSlice *slice = (H265RawSlice*)content; @@ -721,6 +711,7 @@ static int cbs_h2645_split_fragment(CodedBitstreamContext *ctx, return 0; } + #define cbs_h2645_replace_ps(h26n, ps_name, ps_var, id_element) \ static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \ CodedBitstreamUnit *unit) \ @@ -739,12 +730,10 @@ static int cbs_h26 ## h26n ## _replace_ ## ps_var(CodedBitstreamContext *ctx, \ 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)); \ + priv->ps_var ## _ref[id] = cbs_h26 ## h26n ## _copy_ ## ps_var(ps_var); \ if (!priv->ps_var ## _ref[id]) \ return AVERROR(ENOMEM); \ 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; \ }