From patchwork Wed Sep 18 19:31:44 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 15142 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 646114481B1 for ; Wed, 18 Sep 2019 22:32:16 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4BAA4689D16; Wed, 18 Sep 2019 22:32:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f182.google.com (mail-qk1-f182.google.com [209.85.222.182]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 04840689CC3 for ; Wed, 18 Sep 2019 22:32:09 +0300 (EEST) Received: by mail-qk1-f182.google.com with SMTP id h126so661742qke.10 for ; Wed, 18 Sep 2019 12:32:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=EtxEphKbqNydwAY7l3MMP8ib/c0eFyDnQtMaQTXQnvU=; b=oGTybC7CvMfOVcbVPVQHSQ0G+m04zR6JI5xvAi784gWdIyIDHXWlDyv726UP96Ftf/ zux0LUAiA6B0tVRoXQauAWe1Re4FAn8d9W+rSmzgu9G4Xti7xGvujJ6qFTipovFEh9F8 oE4NuMeCfCA1Iifl+Ne2+be6gEmM0bziOUcXl6pE8yeXl/xqeuW+puTP5QwYGIqFLLbt yMGEs5efogi5E+JDnxmvvEeGZIT6tXiDKo3NAqRiCY/0DCwC6Sx9LVY8HRs/NLHXPYXm VUDIF9tDTFcLv2DPbJKn3pZBDsfvfwYkLmo2eIkFmOcFCVTPWwrPvszepe8r544qEOUZ hCiw== 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=EtxEphKbqNydwAY7l3MMP8ib/c0eFyDnQtMaQTXQnvU=; b=ZD/PRsKxSAzt/VTiuq4z3QTFcrqW2n2xLfhcU76idurUtElmx8WPnsxEyshbbNsFz2 AGuDSEoJEzd/2EoM5qu4BxNB254ANUVP88S4gk7l4k9yKM+mYzTHopR+pFfENoErmTEq G4Ft9mpmvm75e0AHN3tt7hHG7MIMecvb99ALJUi5CqxGPJmBdOY34MyFczOVemOLMQXF sFenzo43Q3FyxZxqtG3z1kg7rd+uWPCpuN5Lqp2oJ8NCLLkdgKT+V9Hw2oGGd89rXn03 eEvncrT3zN3vvy+fU7jf8IoNv5L8swCasrLslB5+14QzT1Z4yd8mRO+LGUa4zBSTKXo/ oNOg== X-Gm-Message-State: APjAAAWUv5PyJqD0jEyXaQNj4Ej9unMZnH+uJI9j1vPvxQqlH39Tz/iS si+wSkgQ6ln2o59Vvyp7tX2XTvqe X-Google-Smtp-Source: APXvYqzOQTVdCJjiVS8TARntDdFcrpVNDkz3Cj54Lgb6+lmBcEuHC5jJvQykl+HwD/Uruj3ijvHUkg== X-Received: by 2002:a37:2c44:: with SMTP id s65mr5411445qkh.303.1568835127620; Wed, 18 Sep 2019 12:32:07 -0700 (PDT) Received: from localhost.localdomain (ip-184-209-173-196.spfdma.spcsdns.net. [184.209.173.196]) by smtp.gmail.com with ESMTPSA id h184sm3545387qkf.89.2019.09.18.12.32.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Sep 2019 12:32:07 -0700 (PDT) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Wed, 18 Sep 2019 15:31:44 -0400 Message-Id: <20190918193144.5179-5-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190918193144.5179-1-andriy.gelman@gmail.com> References: <20190918193144.5179-1-andriy.gelman@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 4/4] hevc_mp4toannexb: Parse extradata directly from HVCC format 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: Andriy Gelman Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Andriy Gelman Since the original extradata is in HVCC format, there is no need to segment the output extradata into nal units. --- libavcodec/hevc_mp4toannexb_bsf.c | 66 ++++++++++++++++--------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/libavcodec/hevc_mp4toannexb_bsf.c b/libavcodec/hevc_mp4toannexb_bsf.c index 946e43e40f..57d07e53de 100644 --- a/libavcodec/hevc_mp4toannexb_bsf.c +++ b/libavcodec/hevc_mp4toannexb_bsf.c @@ -228,12 +228,17 @@ static int update_paramset(AVBSFContext *ctx, H2645NAL *nal) static int hevc_extradata_to_annexb(AVBSFContext *ctx) { + HEVCBSFContext *s = ctx->priv_data; GetByteContext gb; int length_size, num_arrays, i, j; int ret = 0; uint8_t *new_extradata = NULL; size_t new_extradata_size = 0; + size_t start, end; + + H2645Packet pkt; + memset(&pkt, 0, sizeof(H2645Packet)); /*in case goto fail is called before pkt is initialized*/ bytestream2_init(&gb, ctx->par_in->extradata, ctx->par_in->extradata_size); @@ -253,6 +258,7 @@ static int hevc_extradata_to_annexb(AVBSFContext *ctx) goto fail; } + start = bytestream2_tell(&gb); for (j = 0; j < cnt; j++) { int nalu_len = bytestream2_get_be16(&gb); @@ -269,6 +275,32 @@ static int hevc_extradata_to_annexb(AVBSFContext *ctx) new_extradata_size += 4 + nalu_len; memset(new_extradata + new_extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE); } + end = bytestream2_tell(&gb); + + /*split extradata into nalu packets*/ + ret = ff_h2645_packet_split(&pkt, ctx->par_in->extradata + start, + end - start, ctx, 1, 2, AV_CODEC_ID_HEVC, 1, 0); + if (ret < 0) + goto fail; + + /*parse the segmented nals*/ + for (j = 0; j < pkt.nb_nals; j++) { + H2645NAL *nal = &pkt.nals[j]; + + if (IS_PARAMSET(nal)) { + ret = update_paramset(ctx, nal); + if (ret < 0) + goto fail; + continue; + } + + if (nal->type == HEVC_NAL_SEI_PREFIX || nal->type == HEVC_NAL_SEI_SUFFIX) { + ret = append_sei_annexb(&s->ps.sei, nal); + if (ret < 0) + goto fail; + } + } + ff_h2645_packet_uninit(&pkt); } av_freep(&ctx->par_out->extradata); @@ -280,6 +312,7 @@ static int hevc_extradata_to_annexb(AVBSFContext *ctx) return length_size; fail: + ff_h2645_packet_uninit(&pkt); av_freep(&new_extradata); return ret; } @@ -287,51 +320,20 @@ fail: static int hevc_mp4toannexb_init(AVBSFContext *ctx) { HEVCBSFContext *s = ctx->priv_data; - H2645Packet pkt; - int i, ret; + int ret = 0; if (ctx->par_in->extradata_size < MIN_HEVCC_LENGTH || AV_RB24(ctx->par_in->extradata) == 1 || AV_RB32(ctx->par_in->extradata) == 1) { av_log(ctx, AV_LOG_VERBOSE, "The input looks like it is Annex B already\n"); - return 0; } else { ret = hevc_extradata_to_annexb(ctx); if (ret < 0) return ret; s->length_size = ret; s->extradata_parsed = 1; - - memset(&pkt, 0, sizeof(H2645Packet)); - ret = ff_h2645_packet_split(&pkt, ctx->par_out->extradata, ctx->par_out->extradata_size, - ctx, 0, 0, AV_CODEC_ID_HEVC, 1, 0); - if (ret < 0) - goto done; - - for (i = 0; i < pkt.nb_nals; ++i) { - H2645NAL *nal = &pkt.nals[i]; - - /*current segmentation algorithm includes next 0x00 from next nal unit*/ - if (nal->raw_data[nal->raw_size - 1] == 0x00) - nal->raw_size--; - - if (IS_PARAMSET(nal)) { - ret = update_paramset(ctx, nal); - if (ret < 0) - goto done; - continue; - } - - if (nal->type == HEVC_NAL_SEI_PREFIX || nal->type == HEVC_NAL_SEI_SUFFIX) { - ret = append_sei_annexb(&s->ps.sei, nal); - if (ret < 0) - goto done; - } - } } -done: - ff_h2645_packet_uninit(&pkt); return ret; }