From patchwork Mon Dec 2 02:48:53 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andriy Gelman X-Patchwork-Id: 16516 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 4C5F54464ED for ; Mon, 2 Dec 2019 04:49:44 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 30A4868AF84; Mon, 2 Dec 2019 04:49:44 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f65.google.com (mail-qv1-f65.google.com [209.85.219.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BC02968AF40 for ; Mon, 2 Dec 2019 04:49:36 +0200 (EET) Received: by mail-qv1-f65.google.com with SMTP id t5so6999059qvs.5 for ; Sun, 01 Dec 2019 18:49:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=ekzhJQwaXzrdZudAXiLzdfPau/kpbqhmBCqSdbGYljw=; b=WKxyKeIw0TvcVTH7c9uMtwdJLpyiQWGstuA6WC2bIkal3+tUTA3WpYhIWlsDEdFRim vXgxyKMXFDTl5Sxk1Um2Cwq+s4LIBwxQiAFhpWwQaWlb8ZLIVT2FsdEt28VRNP5utupw UGkjNKhgLk1sJ41MHJgn41YbJn5XK6eXmpDpLwY/ueTysEyCcfjfqx0riSN4HItGWY1W pIDjkO4YfxG0MkTc8qFN7mtcnBx8bgoB1mdW9lD8xWDT8U9PAUTKBf6qyRm4OCrm8Eaz qkrH4VDkfifXur9KvWmNKt0MPKAax83b3bQyn0ngfjfyQ6b7vCwklGCiNWmoE9q0LXlG fuMw== 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:mime-version :content-transfer-encoding; bh=ekzhJQwaXzrdZudAXiLzdfPau/kpbqhmBCqSdbGYljw=; b=DngAqBaLOBKTzbxzQKi5TwSmUcUDPNTOw53DBzy5PZogfdgFGpL8dCCSVPreAPfU9z P2ZQV7NRZJ4aR/TCaQyOL2T2ufYVwA0I96pUrFREROH1c26jblIIktdGPsb8u84W8ONm bYUlbORew8FGql/qHQcqGJxgWDVvGIV8cI2P7l/3zrETekloKG+L2Y07Nva6ZRyO9v1E viuwcPZ6Ah2ruPrRgLBWz5F9wr57nn4gba8buAIV051CiMY4DGuGsO99jkme2acJaHTK TcUFFDzfIpTFZBE3RpCk1IEnFqmIVXYQRVrTlPTchA7niPJiA612yl4nisXS0FrrH9jQ YFHA== X-Gm-Message-State: APjAAAWr5c48DxDXyu0pq2EXvj5oefBelTw4/GR+rWSKQeDoV3Rk5TRC imLEQALy0VGUoPs4PcfCRfnnhs7H X-Google-Smtp-Source: APXvYqzoyGsKQZqvk8UeUYGTtevhVIpub2rb59mO26IhFnl32+Pn70J/HZihZ3wyo10OqlMtdYWkYQ== X-Received: by 2002:a0c:ef48:: with SMTP id t8mr30306281qvs.38.1575254974968; Sun, 01 Dec 2019 18:49:34 -0800 (PST) Received: from localhost.localdomain (c-71-232-27-28.hsd1.ma.comcast.net. [71.232.27.28]) by smtp.gmail.com with ESMTPSA id q15sm14092774qkq.120.2019.12.01.18.49.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Dec 2019 18:49:34 -0800 (PST) From: Andriy Gelman X-Google-Original-From: Andriy Gelman To: ffmpeg-devel@ffmpeg.org Date: Sun, 1 Dec 2019 21:48:53 -0500 Message-Id: <20191202024853.13412-1-andriy.gelman@gmail.com> X-Mailer: git-send-email 2.24.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] lavc/h2645_parse: Don't automatically remove nuh_layer_id > 0 packets 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 HEVC standard supports multi-layer streams (ITU-T H.265 02/2018 Annex F). Each NAL unit belongs to a particular layer defined by nuh_layer_id in the header. Currently, all NAL units that do not belong to a base layer are automatically removed in ff_h2645_packet_split(). Some data may therefore be lost when future filters/decoders are designed to support multi-layer streams. A better approach is to forward nuh_layer_id > 0 packets and let blocks down the chain decide how to process them. The condition to remove packets has been moved to hevcdec and cbs bsf where such packets are currently not supported. --- libavcodec/cbs_h2645.c | 3 +++ libavcodec/h2645_parse.c | 7 +++---- libavcodec/h2645_parse.h | 5 +++++ libavcodec/hevc_parse.c | 2 ++ libavcodec/hevc_parser.c | 2 ++ libavcodec/hevcdec.c | 2 +- 6 files changed, 16 insertions(+), 5 deletions(-) diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index 88fa0029cd6..9f89f1c5a55 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -562,6 +562,9 @@ static int cbs_h2645_fragment_add_nals(CodedBitstreamContext *ctx, for (i = 0; i < packet->nb_nals; i++) { const H2645NAL *nal = &packet->nals[i]; + if (nal->nuh_layer_id > 0) + continue; + AVBufferRef *ref; size_t size = nal->size; diff --git a/libavcodec/h2645_parse.c b/libavcodec/h2645_parse.c index 4808f79a67f..0f3343004f9 100644 --- a/libavcodec/h2645_parse.c +++ b/libavcodec/h2645_parse.c @@ -292,23 +292,22 @@ static int get_bit_length(H2645NAL *nal, int skip_trailing_zeros) static int hevc_parse_nal_header(H2645NAL *nal, void *logctx) { GetBitContext *gb = &nal->gb; - int nuh_layer_id; if (get_bits1(gb) != 0) return AVERROR_INVALIDDATA; nal->type = get_bits(gb, 6); - nuh_layer_id = get_bits(gb, 6); + nal->nuh_layer_id = get_bits(gb, 6); nal->temporal_id = get_bits(gb, 3) - 1; if (nal->temporal_id < 0) return AVERROR_INVALIDDATA; av_log(logctx, AV_LOG_DEBUG, "nal_unit_type: %d(%s), nuh_layer_id: %d, temporal_id: %d\n", - nal->type, hevc_nal_unit_name(nal->type), nuh_layer_id, nal->temporal_id); + nal->type, hevc_nal_unit_name(nal->type), nal->nuh_layer_id, nal->temporal_id); - return nuh_layer_id == 0; + return 1; } static int h264_parse_nal_header(H2645NAL *nal, void *logctx) diff --git a/libavcodec/h2645_parse.h b/libavcodec/h2645_parse.h index 2acf882d3da..3e47f86c53b 100644 --- a/libavcodec/h2645_parse.h +++ b/libavcodec/h2645_parse.h @@ -56,6 +56,11 @@ typedef struct H2645NAL { */ int temporal_id; + /* + * HEVC only, identifier of layer to which nal unit belongs + */ + int nuh_layer_id; + int skipped_bytes; int skipped_bytes_pos_size; int *skipped_bytes_pos; diff --git a/libavcodec/hevc_parse.c b/libavcodec/hevc_parse.c index dddb293df64..29dfd479f38 100644 --- a/libavcodec/hevc_parse.c +++ b/libavcodec/hevc_parse.c @@ -37,6 +37,8 @@ static int hevc_decode_nal_units(const uint8_t *buf, int buf_size, HEVCParamSets for (i = 0; i < pkt.nb_nals; i++) { H2645NAL *nal = &pkt.nals[i]; + if (nal->nuh_layer_id > 0) + continue; /* ignore everything except parameter sets and VCL NALUs */ switch (nal->type) { diff --git a/libavcodec/hevc_parser.c b/libavcodec/hevc_parser.c index b444b999550..a47104aea9c 100644 --- a/libavcodec/hevc_parser.c +++ b/libavcodec/hevc_parser.c @@ -200,6 +200,8 @@ static int parse_nal_units(AVCodecParserContext *s, const uint8_t *buf, for (i = 0; i < ctx->pkt.nb_nals; i++) { H2645NAL *nal = &ctx->pkt.nals[i]; + if (nal->nuh_layer_id > 0) + continue; GetBitContext *gb = &nal->gb; switch (nal->type) { diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 8f1c162acee..bcd8e67944a 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -3077,7 +3077,7 @@ static int decode_nal_units(HEVCContext *s, const uint8_t *buf, int length) if (s->avctx->skip_frame >= AVDISCARD_ALL || (s->avctx->skip_frame >= AVDISCARD_NONREF - && ff_hevc_nal_is_nonref(nal->type))) + && ff_hevc_nal_is_nonref(nal->type)) || nal->nuh_layer_id > 0) continue; ret = decode_nal_unit(s, nal);