From patchwork Tue May 8 23:12:21 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 8888 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp4559864jad; Tue, 8 May 2018 16:13:04 -0700 (PDT) X-Google-Smtp-Source: AB8JxZpX5NvOh967TR+gn05jMtYUkxR7I2GO/qZeSoAUo+PD2loy7o35kFLCXtiMyJvWVz4BTZHR X-Received: by 2002:adf:ba4a:: with SMTP id t10-v6mr32543771wrg.219.1525821184123; Tue, 08 May 2018 16:13:04 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525821184; cv=none; d=google.com; s=arc-20160816; b=PSYHfjUkP+pnYI7huunzqRtP/DIP+Bahp59ZwYeOT52UBgYJH4nPA6wmCpjeE7OMTs NKz8qP1w3OJN80/1JXt2mlRttDMJ/Vx5B9uYHBPXfjznnmzjjpA6SeyGuU1v2uKChYwa CqQKWAz65Xj2f9GGXjIDOPa3OT3smM6eyfadKLPXKAQb8tMAI416utogz3kUezT56XDO 4sCZuEMp7oaz5eCmmfOnZ9o16R+QDO+E2yvIP+Y+OqcByTCvbyl864pyHZKL7ncBbwkP XJKlk9zbyFYvx752dK2Wh2KoywpfSUWlZkPyCQfOmhwq98epFba0B8txSHrAUTlgXFDU b3GA== 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=Io1EVSf6OqN+AzTindEDirULqrea7knCwKc4MTU/FzU=; b=yqsIiCiLdMsYqiDB9q/Sk2mzdo0WDA+8FiBdG+HkVF31eyNhMlW/PI717elOcPVUGd 7Qb8eN9FIoRPHgPcM2MqktZMW7JUxHYeQAmrGXNfMa7hvWMDPz4+JkstNuc1jtGA+h/N syCJr1XkSi5C1iM+t6fr+pYf2eBy/jppGnysltOP93iuJYKogwt6916lor3RoUIjFRp/ hsK1qvnzR96RjhDQUVlCxUDrUte0AjESiTHWG5HrZ9AX2ri1xsPE7osqC7XKsQbAbzhg ryVehQhlR2g7J6/6ZY7HU8Vi01I5mHxl5nCkL2oQpSbqD+BUAAnr+0r+9DjPf5S0DZeX pWxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=mpOUdhQQ; 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 t3-v6si10767958wrg.380.2018.05.08.16.13.03; Tue, 08 May 2018 16:13:04 -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=mpOUdhQQ; 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 CDFDA68A812; Wed, 9 May 2018 02:12:26 +0300 (EEST) 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 927E268A3C0 for ; Wed, 9 May 2018 02:12:20 +0300 (EEST) Received: by mail-qt0-f194.google.com with SMTP id f13-v6so33584115qtp.10 for ; Tue, 08 May 2018 16:12:56 -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=IL4DehhMd+vd6pkk+DR6cyqyy1E2aLDumoyO0vc17R8=; b=mpOUdhQQZg8f1mW4Fqi9wJFtBrSarLVnBh5QSgGnlF814Q9/yI9Dx/oSw5Ot49vlkO Ts1wOTEN5gA7YQHHK8TX6XB0Kqm8/7llzUl0UYWXvJs31iqvQT/SjDsokTKysth2Yfi2 EAFvLMVL/obQOQbdg0kmhO1zJeW1dQZ2Wl/Auufj7Y1smjvogvXJVQfN8PQMIMdlKkuv RCPMTHyQiRBPY+a+JoL+pM3Lfw8n5CmJ+xpggnZPYA32wJb5GAzTYhhJjtNRp5ZoxzFl wR8auSH8rg6ifL1FLxAFomEBIxeUe4frOttxwf5XGR6LB7bcgsbPNmNTOXuQx96BV7NQ q2yw== 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=IL4DehhMd+vd6pkk+DR6cyqyy1E2aLDumoyO0vc17R8=; b=b6hJ44EsDGppCHcMBUWjOCWj58rw9DIKGVzuZgO9IZ6nExHoiYWR7DVYFlNuKer1IP 4SoY6IzzFsFhRshYRApRFaB2mPNP35VAGLdIgZgVDx3yi2qqrSrRTprH2ZXR0RRE7Z0N XXRSf6KP1YaDR3M7XgsPsVUtayKITIuDjfV9Gx2LMSkw0+hgxCXnFbKhKmFL0OEJseB7 LbFM06c7XrrTKNn97LjEIep6MwB0+R/clVmAmLlFypKqceg0ZkvCAHl88Ho2LLI0kuFS nNB5H/SJdd2FFo2xn+4AmQfqQu4Rl4oNRCYRxjpzBjbS7R3AShn7ta+YUeJSFHr/NlNu MbeA== X-Gm-Message-State: ALQs6tAkdFD9gbyBtHaGYg7nOSAUGuwBUKMa1ikLycpkrXrUXNg+SMWG en2vl/2TF5+xP1z/0rnh+1coGQ== X-Received: by 2002:ac8:4a2:: with SMTP id s34-v6mr39261407qtg.129.1525821174830; Tue, 08 May 2018 16:12:54 -0700 (PDT) Received: from localhost.localdomain ([190.188.171.140]) by smtp.gmail.com with ESMTPSA id v56-v6sm21937470qtc.96.2018.05.08.16.12.53 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 08 May 2018 16:12:54 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 May 2018 20:12:21 -0300 Message-Id: <20180508231221.5332-1-jamrial@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <2a4eee4a-bd81-d738-b0e2-3648547ae25f@jkqxz.net> References: <2a4eee4a-bd81-d738-b0e2-3648547ae25f@jkqxz.net> Subject: [FFmpeg-devel] [PATCH v2] 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 fixes potential issues with dangling references held in said lists. Signed-off-by: James Almer --- libavcodec/cbs_h264.h | 2 ++ libavcodec/cbs_h2645.c | 41 +++++++++++++++++++++-------------------- libavcodec/cbs_h265.h | 3 +++ 3 files changed, 26 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..c391988b58 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,11 @@ 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]); \ + priv->ps_var ## _ref[id] = av_buffer_ref(unit->content_ref); \ + 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; \ return 0; \ } @@ -726,7 +727,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 +761,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 +874,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 +893,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 +913,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 +1003,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 +1027,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 +1124,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 +1138,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 +1152,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 +1386,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 +1401,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];