From patchwork Mon Nov 26 13:39:11 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 11169 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 B846344D29F for ; Mon, 26 Nov 2018 15:40:04 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4052668A65A; Mon, 26 Nov 2018 15:40:05 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 95CBD68A667 for ; Mon, 26 Nov 2018 15:39:58 +0200 (EET) Received: by mail-wr1-f54.google.com with SMTP id c14so13311479wrr.0 for ; Mon, 26 Nov 2018 05:40:03 -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=7ncV1sg1LrnYlH2qWybghpOc5cLSM8n8Rkt2CuaBjdc=; b=Ea6jOcy4XXKHph7YZu9p6CX0SX1MGefI8DQdDVJuPwGi75RfVQf6ZoK2Mf7FIJG/cc GqSX7ooNIPr2g8wPjgZGGuCigJpWTA0xElPwbouvBUyrMyAmsDsVEM9ArBYp4Y3C/JT9 az/TDV2P2scd9rbRyPlStx/dLR0TR5bgyjWyDLS/DFRuGzjnGOiZXzb1XIyXkXo1WKd7 sfnkYKwphNKekVQgVhNcHl6Cr9tXsdafL48WSu+1n5I3lvAOC39PIaJTBKTKj1KKCXCL kmhULevd57qVoj7cG1ZgTWjxSr1wM30+PcCC+Lt8K36GwkiaJKJsS7GbjyRSunUgXZY0 DvEQ== 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=7ncV1sg1LrnYlH2qWybghpOc5cLSM8n8Rkt2CuaBjdc=; b=FguXusX91H/8DNeqnHhqUoRzr1ga4hTsZLfZeR08plh928LnvlZxByWi3TIakr/3QC IAcM3FOneEYSS8nmH9T0Z0mp/8I9f4TKbkmCiPJmVpCmDg1IiGp3MB4mBQnZtJGrPGrt jFs5C8cG7+fwgAX8rQILlqIAQvzxfyOdHf78nYh9+pnmMunhOI2x9vSYLwwsJHwUHUTj oREC+pCwIOfNX78cVlmpaYIoogOjC5R5fOXWtHLjkrYLHwknVax0qk14VO/4U5nLuerD xcBv2S8G4a9JGDVqmDb90BJQC4jlLnZkej0Fuvsmx2Ol8gYyM1tZaL3/6KzvIoB051BL fKfQ== X-Gm-Message-State: AA+aEWazXwt1wxtSwJcqiu+S6cFVVNFhhDF+2mIeDcHs8ZvOI1XRAy2l /PqP4QQFP7yRGnxxnZltEzjdS/nj X-Google-Smtp-Source: AFSGD/UnNwUJLJAtlY4UFrT5dDlUwrAzAFP5ygAkgarjGEAtVt622pIcwIXlTyXJtpmQPj3b6Pvtqg== X-Received: by 2002:a5d:4a0c:: with SMTP id m12mr20294742wrq.38.1543239602568; Mon, 26 Nov 2018 05:40:02 -0800 (PST) Received: from localhost.localdomain (ipbcc08c44.dynamic.kabel-deutschland.de. [188.192.140.68]) by smtp.googlemail.com with ESMTPSA id 142sm1184169wmw.27.2018.11.26.05.40.01 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 26 Nov 2018 05:40:02 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 26 Nov 2018 14:39:11 +0100 Message-Id: <20181126133913.2356-3-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 666970ed03..559290bd91 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; \ }