From patchwork Thu Sep 26 18:10:01 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 15316 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 079CB44A425 for ; Thu, 26 Sep 2019 21:10:18 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D76EE689DA7; Thu, 26 Sep 2019 21:10:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f194.google.com (mail-oi1-f194.google.com [209.85.167.194]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 53A74688298 for ; Thu, 26 Sep 2019 21:10:11 +0300 (EEST) Received: by mail-oi1-f194.google.com with SMTP id k25so2887996oiw.13 for ; Thu, 26 Sep 2019 11:10:11 -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=pWbCnmI3UaWOCScyh6GjUrgP1mhRGny4iPL1Rn43OcY=; b=tRF+Ruz2xfIGVg1UdN+bWeBV9F2OpHy8vbRLQPibxlTcQyXCW/UATUxYcMuTiYrYs9 p6nwGny901IdWzliK/v+BBY8AkRVMVO6yOWA1YtUjmBgZDsI3NdJZ5VbFpxB53kC/oIt O4sOGtZqyKEzhzQwv57cpktcEbGTvncX76ZVj/K71qd9/1HO5g0k+e69mjBn1XNQKynV rIkivoEUroNf0jodZkMy7zYzzC+xSEtwLbxWzd9U+0FdqLBQzTR+Ne47EYj13X4i8Mcx cK3/HAoWFVIBWKptHv8rkQjKO4XvVetEr80kfi6hNOBdYp04jHfWLJujSiM4MuwVIALG zfDA== 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=pWbCnmI3UaWOCScyh6GjUrgP1mhRGny4iPL1Rn43OcY=; b=AXvRojy9Tkx/07749xW9NUckui3hfNbPNRGBT/fjMOaWKHPufSBozCwrpRog/E3cfw fKEBjO8HnvMftZRtUvxQSuTaS2sAqbiUBNYyM2Xb/9KqDhC8I/mQNLF3WFEsEcoxfqn5 g4FLaDlo0xhuFm9PdiXNPRKTjwuwket04hwZGlkCW+coUPBO/mIA/p5GxbMrediHJf+5 O4FqzgyXGsOKN7GqmPXLxq5YVliEyRnA0SAQP9ea/WLgtEic2mVqUazhaiXE1IkxaWBb nDwNPWXmBmhT0pXQ1yaYFglWaEPwvN3zV4sdL6Vqo0FU/Adk8fO914QpD1kp9MKp+lQK wtgw== X-Gm-Message-State: APjAAAXHLsVRJhsmdJdnmFQMTCLuF6bptideR6iykcQQTInk9BgOX+hK YfshUNGehQxAn2eFJTWzj/zmrjLo X-Google-Smtp-Source: APXvYqwxHpRUTxbt8HYOXDAczbQAz4j4bQmLBCe/oQHC9R96gLIi6nX8+jVkv7G+1mFk7H5uQajLRg== X-Received: by 2002:aca:5cc3:: with SMTP id q186mr3425639oib.123.1569521409438; Thu, 26 Sep 2019 11:10:09 -0700 (PDT) Received: from manj.guest.slb.com (bjcacd-22-48.slb.com. [192.23.22.48]) by smtp.gmail.com with ESMTPSA id k24sm819299oic.29.2019.09.26.11.10.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Sep 2019 11:10:08 -0700 (PDT) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Thu, 26 Sep 2019 14:10:01 -0400 Message-Id: <20190926181001.23609-4-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20190926181001.23609-1-andriy.gelman@gmail.com> References: <20190926181001.23609-1-andriy.gelman@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v5 3/3] 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 90a4d17d25..78176290d8 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; }