From patchwork Tue May 8 20:48:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 8886 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp4454567jad; Tue, 8 May 2018 13:55:55 -0700 (PDT) X-Google-Smtp-Source: AB8JxZo5VRucPWIDz02PXdz5ZeFX/6eJ/m3nVPVcgE2cCi+cBeaXN0Fv7mq12vgyYaqrUg3WvS7E X-Received: by 2002:adf:9d0d:: with SMTP id k13-v6mr35992257wre.179.1525812955254; Tue, 08 May 2018 13:55:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525812955; cv=none; d=google.com; s=arc-20160816; b=vdBfiftfcRlYj/oxUQL2Li8niRCV34wvNr0FTfVPaEv5ZJpkpgOqngUM4Lm/g56eqL /M7Yf/IhZcCjCUULYMBp1N4oB8YfrWzKaczMxY9ZrPJykoG1OhjfUAQ+L2o7O+icd+Tf fq+c1rvjqN6VMUQSUaLzHNybiv0+6Vq1QHsUwBHomxhSfOXZqbwfPG1P1e+md/CZwHEf vpjU0i3Rmj9gRYCOLP8pFyc2f1H7uEUZXTp/f34SGy58frAn38+geyeLAq/PYRBZCkq3 bUdZQeirKxPt3ZoBvLx7dhBPN/Gc4LCXL0hTYBj8EEOHu91Lo/I4IfWun9gowLTrVVMe nXoQ== 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=gb0LfEv+XcDwIoXde+9osotSvXBSZN8W63/VXLfQ1Z0=; b=L3yHKMNzeGAG46owJRaFbc6kBjZpLlK/LZNfae0EYT2W2kEjwAc7pkDckVzXz1Ihbv CMAbp6XvIsVUhsfTXvynxlRSFVFUw7vtxxK2sON4NgPlhp48zKavktnjb9CnrOPGYkk4 rAkzotMlu9dQ2/pm5nCMqrVa9Dqidd50UKT7Eo1gM2KxgfENBbkbRAgGnNvtiep0BGsF EaGkePi6BksoHOLW5OstY/pB87tGOgi5n4XdIdH1Sl4/WvS0A+OeiPFEJG7zjuXFUQ7t mHQeyyCMCrMTqOkDhdJVdoJR7evniRHTvJwOz77lxBT8T0covG2UK9MVdvFSZFPK/oo6 2kOw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=rpUp/p0p; 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 k79si2667803wmg.126.2018.05.08.13.55.54; Tue, 08 May 2018 13:55:55 -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=rpUp/p0p; 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 5346868A74B; Tue, 8 May 2018 23:55:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f196.google.com (mail-qk0-f196.google.com [209.85.220.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0640768975F for ; Tue, 8 May 2018 23:55:12 +0300 (EEST) Received: by mail-qk0-f196.google.com with SMTP id s70so25842875qks.13 for ; Tue, 08 May 2018 13:55:47 -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=cdnlOFwDDODw3PhGS35HFWVR1G2153yBj/N4d76T+3g=; b=rpUp/p0p21AoxIsQauI07pLgrkM2qkhio+jjmS1NbyocBwAcf5OPuHpTfI61xCIKVE 6O8VzygF5sSK92aDWX7GBXQSbaO+TSlPHZv08p+MaWxnc/hb1aN3fNW5BzWVlV6b9wGo G+NR6honJOMgGp8GV/oIqKGUR2NlywMONbM5sk9G2ADCeM/an2Em/oWDhjWOWpCvympF dwHI2bv+NbpWlEt1PQZys+QjY1njqHDBfJ14sDHssieDlgqXKVSJG1JJsZvM9z36dFc6 kCxhhCyNcVYoQRaE3IjEaalLHEqWVlSA8S2G2z3vIa+WP/tD6eLzA21czk1LR1vU6iso WlEw== 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=cdnlOFwDDODw3PhGS35HFWVR1G2153yBj/N4d76T+3g=; b=F371S8QBHq7q5VT0qvxqEQyfTPULz3wBurEdrefJ84+9hSB6Dw6GWLeZGOMHTNraZX sB/ZgUDBx5GP6nwqZzr7/xT6YIhNMAaOVxW6bBn+sKoOKIjKj7SU0QGS7a/Ct/ygjOei Y3KiUjZOfS8TAuXbCyhRdhLYs0OXImjNFsl0QkQfJQfBVaQobDz6BjFXq7wnLRFL+JPq B9eOZ6HJ30Imj2BwhVvpX+Mow5j1aPpKv4YwO20y5y+ANjlTO5yyoW3yaZeh83LWEC5x kzeG2DnNSMu4LNJadjfr9bV1fFioiOx6fwwb7VDorTUXdQOaT/u6tzmHYrjswbETPMf8 v8aA== X-Gm-Message-State: ALQs6tCONuhZOCxUZt7iQEEzvPr0NDMrH2bCJCqrjTJZj/2L/T4gOwT/ NQ+J5usTEueAb2gfGBPlyxnMOQ== X-Received: by 10.55.31.156 with SMTP id n28mr37346109qkh.379.1525812557674; Tue, 08 May 2018 13:49:17 -0700 (PDT) Received: from localhost.localdomain ([190.188.171.140]) by smtp.gmail.com with ESMTPSA id q15sm6456568qkj.2.2018.05.08.13.49.16 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 08 May 2018 13:49:17 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 May 2018 17:48:56 -0300 Message-Id: <20180508204856.10796-2-jamrial@gmail.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180508204856.10796-1-jamrial@gmail.com> References: <20180508204856.10796-1-jamrial@gmail.com> Subject: [FFmpeg-devel] [PATCH 2/2] 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" This is more in line to how h264_ps handles it. Signed-off-by: James Almer --- Not really going to make much of a difference seeing parameter sets rarely show up in-band even in raw streams, but it's one less memcpy anyway. libavcodec/cbs_h264.h | 4 +-- libavcodec/cbs_h2645.c | 41 ++++++++++++++------------- libavcodec/cbs_h264_syntax_template.c | 19 ++++++------- libavcodec/cbs_h265.h | 6 ++-- libavcodec/cbs_h265_syntax_template.c | 21 +++++++------- 5 files changed, 44 insertions(+), 47 deletions(-) diff --git a/libavcodec/cbs_h264.h b/libavcodec/cbs_h264.h index becea3adfe..239f3b6b90 100644 --- a/libavcodec/cbs_h264.h +++ b/libavcodec/cbs_h264.h @@ -420,8 +420,8 @@ typedef struct CodedBitstreamH264Context { // All currently available parameter sets. These are updated when // any parameter set NAL unit is read/written with this context. - H264RawSPS *sps[H264_MAX_SPS_COUNT]; - H264RawPPS *pps[H264_MAX_PPS_COUNT]; + AVBufferRef *sps[H264_MAX_SPS_COUNT]; + AVBufferRef *pps[H264_MAX_PPS_COUNT]; // The currently active parameter sets. These are updated when any // NAL unit refers to the relevant parameter set. These pointers diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index 580ca09f63..6c81a2e1b3 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -676,22 +676,23 @@ 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 \ " id : %d.\n", id); \ return AVERROR_INVALIDDATA; \ } \ - if (priv->ps_var[id] == priv->active_ ## ps_var) \ + if (priv->ps_var[id] && \ + (H26 ## h26n ## Raw ## ps_name *) priv->ps_var[id]->data == priv->active_ ## ps_var) \ priv->active_ ## ps_var = NULL ; \ - av_freep(&priv->ps_var[id]); \ - priv->ps_var[id] = av_malloc(sizeof(*ps_var)); \ + av_buffer_unref(&priv->ps_var[id]); \ + priv->ps_var[id] = av_buffer_ref(unit->content_ref); \ if (!priv->ps_var[id]) \ return AVERROR(ENOMEM); \ - memcpy(priv->ps_var[id], ps_var, sizeof(*ps_var)); \ return 0; \ } @@ -725,7 +726,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; } @@ -759,7 +760,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; } @@ -872,7 +873,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; } @@ -891,7 +892,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; } @@ -911,7 +912,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; } @@ -1001,7 +1002,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; } @@ -1025,7 +1026,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; } @@ -1122,7 +1123,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; } @@ -1136,7 +1137,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; } @@ -1150,7 +1151,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; } @@ -1384,9 +1385,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[i]); for (i = 0; i < FF_ARRAY_ELEMS(h264->pps); i++) - av_freep(&h264->pps[i]); + av_buffer_unref(&h264->pps[i]); } static void cbs_h265_close(CodedBitstreamContext *ctx) @@ -1399,11 +1400,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[i]); for (i = 0; i < FF_ARRAY_ELEMS(h265->sps); i++) - av_freep(&h265->sps[i]); + av_buffer_unref(&h265->sps[i]); for (i = 0; i < FF_ARRAY_ELEMS(h265->pps); i++) - av_freep(&h265->pps[i]); + av_buffer_unref(&h265->pps[i]); } const CodedBitstreamType ff_cbs_type_h264 = { diff --git a/libavcodec/cbs_h264_syntax_template.c b/libavcodec/cbs_h264_syntax_template.c index c3327f6e90..6e4155baac 100644 --- a/libavcodec/cbs_h264_syntax_template.c +++ b/libavcodec/cbs_h264_syntax_template.c @@ -368,7 +368,7 @@ static int FUNC(pps)(CodedBitstreamContext *ctx, RWContext *rw, ue(pic_parameter_set_id, 0, 255); ue(seq_parameter_set_id, 0, 31); - sps = h264->sps[current->seq_parameter_set_id]; + sps = (const H264RawSPS *)h264->sps[current->seq_parameter_set_id]->data; if (!sps) { av_log(ctx->log_ctx, AV_LOG_ERROR, "SPS id %d not available.\n", current->seq_parameter_set_id); @@ -471,13 +471,12 @@ static int FUNC(sei_buffering_period)(CodedBitstreamContext *ctx, RWContext *rw, ue(seq_parameter_set_id, 0, 31); - sps = h264->sps[current->seq_parameter_set_id]; - if (!sps) { + if (!h264->sps[current->seq_parameter_set_id]) { av_log(ctx->log_ctx, AV_LOG_ERROR, "SPS id %d not available.\n", current->seq_parameter_set_id); return AVERROR_INVALIDDATA; } - h264->active_sps = sps; + h264->active_sps = sps = (const H264RawSPS *)h264->sps[current->seq_parameter_set_id]->data; if (sps->vui.nal_hrd_parameters_present_flag) { for (i = 0; i <= sps->vui.nal_hrd_parameters.cpb_cnt_minus1; i++) { @@ -578,7 +577,7 @@ static int FUNC(sei_pic_timing)(CodedBitstreamContext *ctx, RWContext *rw, } } if (k >= 0) - sps = h264->sps[k]; + sps = (const H264RawSPS *)h264->sps[k]->data; } if (!sps) { av_log(ctx->log_ctx, AV_LOG_ERROR, @@ -1100,21 +1099,19 @@ static int FUNC(slice_header)(CodedBitstreamContext *ctx, RWContext *rw, ue(pic_parameter_set_id, 0, 255); - pps = h264->pps[current->pic_parameter_set_id]; - if (!pps) { + if (!h264->pps[current->pic_parameter_set_id]) { av_log(ctx->log_ctx, AV_LOG_ERROR, "PPS id %d not available.\n", current->pic_parameter_set_id); return AVERROR_INVALIDDATA; } - h264->active_pps = pps; + h264->active_pps = pps = (const H264RawPPS *)h264->pps[current->pic_parameter_set_id]->data; - sps = h264->sps[pps->seq_parameter_set_id]; - if (!sps) { + if (!h264->sps[pps->seq_parameter_set_id]) { av_log(ctx->log_ctx, AV_LOG_ERROR, "SPS id %d not available.\n", pps->seq_parameter_set_id); return AVERROR_INVALIDDATA; } - h264->active_sps = sps; + h264->active_sps = sps = (const H264RawSPS *)h264->sps[pps->seq_parameter_set_id]->data; if (sps->separate_colour_plane_flag) u(2, colour_plane_id, 0, 2); diff --git a/libavcodec/cbs_h265.h b/libavcodec/cbs_h265.h index 1b357293ab..4eec99e9a8 100644 --- a/libavcodec/cbs_h265.h +++ b/libavcodec/cbs_h265.h @@ -522,9 +522,9 @@ typedef struct CodedBitstreamH265Context { // All currently available parameter sets. These are updated when // any parameter set NAL unit is read/written with this context. - H265RawVPS *vps[HEVC_MAX_VPS_COUNT]; - H265RawSPS *sps[HEVC_MAX_SPS_COUNT]; - H265RawPPS *pps[HEVC_MAX_PPS_COUNT]; + AVBufferRef *vps[HEVC_MAX_VPS_COUNT]; + AVBufferRef *sps[HEVC_MAX_SPS_COUNT]; + AVBufferRef *pps[HEVC_MAX_PPS_COUNT]; // The currently active parameter sets. These are updated when any // NAL unit refers to the relevant parameter set. These pointers diff --git a/libavcodec/cbs_h265_syntax_template.c b/libavcodec/cbs_h265_syntax_template.c index 9f13061f38..bc9e6ddf08 100644 --- a/libavcodec/cbs_h265_syntax_template.c +++ b/libavcodec/cbs_h265_syntax_template.c @@ -690,11 +690,12 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw, CHECK(FUNC(nal_unit_header)(ctx, rw, ¤t->nal_unit_header, HEVC_NAL_SPS)); u(4, sps_video_parameter_set_id, 0, 15); - h265->active_vps = vps = h265->vps[current->sps_video_parameter_set_id]; + h265->active_vps = vps = NULL; u(3, sps_max_sub_layers_minus1, 0, HEVC_MAX_SUB_LAYERS - 1); flag(sps_temporal_id_nesting_flag); - if (vps) { + if (h265->vps[current->sps_video_parameter_set_id]) { + h265->active_vps = vps = (const H265RawVPS *)h265->vps[current->sps_video_parameter_set_id]->data; if (vps->vps_max_sub_layers_minus1 > current->sps_max_sub_layers_minus1) { av_log(ctx->log_ctx, AV_LOG_ERROR, "Invalid stream: " "sps_max_sub_layers_minus1 (%d) must be less than or equal to " @@ -949,13 +950,13 @@ static int FUNC(pps)(CodedBitstreamContext *ctx, RWContext *rw, ue(pps_pic_parameter_set_id, 0, 63); ue(pps_seq_parameter_set_id, 0, 15); - sps = h265->sps[current->pps_seq_parameter_set_id]; - if (!sps) { + + if (!h265->sps[current->pps_seq_parameter_set_id]) { av_log(ctx->log_ctx, AV_LOG_ERROR, "SPS id %d not available.\n", current->pps_seq_parameter_set_id); return AVERROR_INVALIDDATA; } - h265->active_sps = sps; + h265->active_sps = sps = (const H265RawSPS *)h265->sps[current->pps_seq_parameter_set_id]->data; flag(dependent_slice_segments_enabled_flag); flag(output_flag_present_flag); @@ -1224,21 +1225,19 @@ static int FUNC(slice_segment_header)(CodedBitstreamContext *ctx, RWContext *rw, ue(slice_pic_parameter_set_id, 0, 63); - pps = h265->pps[current->slice_pic_parameter_set_id]; - if (!pps) { + if (!h265->pps[current->slice_pic_parameter_set_id]) { av_log(ctx->log_ctx, AV_LOG_ERROR, "PPS id %d not available.\n", current->slice_pic_parameter_set_id); return AVERROR_INVALIDDATA; } - h265->active_pps = pps; + h265->active_pps = pps = (const H265RawPPS *)h265->pps[current->slice_pic_parameter_set_id]->data; - sps = h265->sps[pps->pps_seq_parameter_set_id]; - if (!sps) { + if (!h265->sps[pps->pps_seq_parameter_set_id]) { av_log(ctx->log_ctx, AV_LOG_ERROR, "SPS id %d not available.\n", pps->pps_seq_parameter_set_id); return AVERROR_INVALIDDATA; } - h265->active_sps = sps; + h265->active_sps = sps = (const H265RawSPS *)h265->sps[pps->pps_seq_parameter_set_id]->data; min_cb_log2_size_y = sps->log2_min_luma_coding_block_size_minus3 + 3; ctb_log2_size_y = min_cb_log2_size_y + sps->log2_diff_max_min_luma_coding_block_size;