From patchwork Fri Feb 18 23:19:59 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= X-Patchwork-Id: 34398 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6838:d078:0:0:0:0 with SMTP id x24csp1378240nkx; Fri, 18 Feb 2022 15:20:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJxZ2dBJK5uPGF8y6QU76uPZVmnSLe8Yt+1rN0a9DcYb05LIA51bc+qC7F7IU10VVc3x1lI7 X-Received: by 2002:a05:6402:1cae:b0:410:d3ae:3c8a with SMTP id cz14-20020a0564021cae00b00410d3ae3c8amr10280769edb.215.1645226445353; Fri, 18 Feb 2022 15:20:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645226445; cv=none; d=google.com; s=arc-20160816; b=hos+9R4/Te1IJeM6v0mbqxD8x2JV7/KcUyPVJ2CYeA1NA2hhqDQP8MEG0GmBebd/MT u+9myyWNNurB3oX5AIrTxBc3SpvWSy59ya/imby2VFZCdgaJrVahNGLlGfBpZgqSKmr/ S0G9pKhXfTfvz1KOBIwkf8g+cbSpA0/dxc/AmbCUIDidlHVbgLvqDKZ+UE8P58wuFcBA Ad2NJZG/Rgj0DKMZy1gGhibbMs+b5zxnXQvguKQtOvidr1B2EsdEh5hfh2uTaFkpw608 /BKVaSk6Ww06cj38CS3ci05J0qry+yhwzJE1QclozxPTKIMSNkX797SdY9/1u19ncSjo zfxA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=TjNuiRlVBwlpTyMTLkDHajkfOkcmbb5pz9QkZh8jQsU=; b=0oJW6F1I2OtHowjm5e67tzBrVBwwNhn2FYUh5pOYNE4K+JyStqVMqFByXtH1pzg73M IFL/GGDC0kyr70+Be9hTXuxLZECj2JWMJRVECkQ+6zZrvIZl2FGvhfShLhnHGY2fXVF9 SumU+0uBHOsOLTgyCTVwLg9GP3n6+E18TB+ksquXdQndOX+bBYB4aTkXfjIxyyVWAm6G 6SIZNOnN69EY1YMx8riBDg0Ij4y+Jym4VnWJDeAP2JLAycamrN0mR3F798LtOavihDFa ba81Ocd5oCSmmUTcLNe/nDUamTNV8WjwQXqAmnMXzR4cdA/WbIBbiDnTw8xCYUqdwn3Z e25w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@pkh.me header.s=selector1 header.b=lLh5kHzU; 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=NONE dis=NONE) header.from=pkh.me Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f10si4193529ejl.292.2022.02.18.15.20.44; Fri, 18 Feb 2022 15:20:45 -0800 (PST) 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=@pkh.me header.s=selector1 header.b=lLh5kHzU; 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=NONE dis=NONE) header.from=pkh.me Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CD2A768B143; Sat, 19 Feb 2022 01:20:20 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from ssq0.pkh.me (laubervilliers-656-1-228-164.w92-154.abo.wanadoo.fr [92.154.28.164]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 44F3468AF2A for ; Sat, 19 Feb 2022 01:20:14 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pkh.me; s=selector1; t=1645226404; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nl+4XVzTmTo77XAK67uh2ID1j6bvmH6Zc3NKIvrvxik=; b=lLh5kHzUX4E6PD0oK+Lo1O8OdxkL8BlcL8CEQw5X7d4ymiTZWc7oYJuWKh2kFCVVJsflIj l0yYAUR3IO5s69z2rf+gdK0fASRkmmcqINCb9rWwBVomVShECSPavOwuGTEE0lajTXJvf9 TslFwZbYjEBUQ1YKxOhsdQ8sUU2jVZU= Received: from localhost (ssq0.pkh.me [local]) by ssq0.pkh.me (OpenSMTPD) with ESMTPA id 1244174b; Fri, 18 Feb 2022 23:20:04 +0000 (UTC) From: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= To: ffmpeg-devel@ffmpeg.org Date: Sat, 19 Feb 2022 00:19:59 +0100 Message-Id: <20220218232001.345826-4-u@pkh.me> X-Mailer: git-send-email 2.34.0 In-Reply-To: <20220218232001.345826-1-u@pkh.me> References: <20220218232001.345826-1-u@pkh.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/5] avformat/mov: add parsing for the sgpd sync box X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: =?utf-8?b?Q2zDqW1lbnQgQsWTc2No?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: lyBD5ETq+IzK sgpd means Sample Group Description Box. For now, only the sync grouping type is parsed, but the function can easily be adjusted to support other flavours. The sbgp (Sample to Group Box) sync_group table built in previous commit contains references to this table through the group_description_index field. --- libavformat/isom.h | 2 ++ libavformat/mov.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/libavformat/isom.h b/libavformat/isom.h index e326f4f27f..bbe395ee4b 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -220,6 +220,8 @@ typedef struct MOVStreamContext { MOVSbgp *rap_group; unsigned int sync_group_count; MOVSbgp *sync_group; + uint8_t *sgpd_sync; + uint32_t sgpd_sync_count; int nb_frames_for_fps; int64_t duration_for_fps; diff --git a/libavformat/mov.c b/libavformat/mov.c index ebc397e573..6b22d8c5f8 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -3130,6 +3130,62 @@ static int mov_read_ctts(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_sgpd(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVStream *st; + MOVStreamContext *sc; + uint8_t version; + uint32_t grouping_type; + uint32_t default_length; + av_unused uint32_t default_group_description_index; + uint32_t entry_count; + + if (c->fc->nb_streams < 1) + return 0; + st = c->fc->streams[c->fc->nb_streams - 1]; + sc = st->priv_data; + + version = avio_r8(pb); /* version */ + avio_rb24(pb); /* flags */ + grouping_type = avio_rl32(pb); + + /* + * This function only supports "sync" boxes, but the code is able to parse + * other boxes (such as "tscl", "tsas" and "stsa") + */ + if (grouping_type != MKTAG('s','y','n','c')) + return 0; + + default_length = version >= 1 ? avio_rb32(pb) : 0; + default_group_description_index = version >= 2 ? avio_rb32(pb) : 0; + entry_count = avio_rb32(pb); + + av_freep(&sc->sgpd_sync); + sc->sgpd_sync_count = entry_count; + sc->sgpd_sync = av_calloc(entry_count, sizeof(*sc->sgpd_sync)); + if (!sc->sgpd_sync) + return AVERROR(ENOMEM); + + for (uint32_t i = 0; i < entry_count && !pb->eof_reached; i++) { + uint32_t description_length = default_length; + if (version >= 1 && default_length == 0) + description_length = avio_rb32(pb); + if (grouping_type == MKTAG('s','y','n','c')) { + const uint8_t nal_unit_type = avio_r8(pb) & 0x3f; + sc->sgpd_sync[i] = nal_unit_type; + description_length -= 1; + } + avio_skip(pb, description_length); + } + + if (pb->eof_reached) { + av_log(c->fc, AV_LOG_WARNING, "reached eof, corrupted SGPD atom\n"); + return AVERROR_EOF; + } + + return 0; +} + static int mov_read_sbgp(MOVContext *c, AVIOContext *pb, MOVAtom atom) { AVStream *st; @@ -4375,6 +4431,7 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) av_freep(&sc->elst_data); av_freep(&sc->rap_group); av_freep(&sc->sync_group); + av_freep(&sc->sgpd_sync); return 0; } @@ -7253,6 +7310,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('c','m','o','v'), mov_read_cmov }, { MKTAG('c','h','a','n'), mov_read_chan }, /* channel layout */ { MKTAG('d','v','c','1'), mov_read_dvc1 }, +{ MKTAG('s','g','p','d'), mov_read_sgpd }, { MKTAG('s','b','g','p'), mov_read_sbgp }, { MKTAG('h','v','c','C'), mov_read_glbl }, { MKTAG('u','u','i','d'), mov_read_uuid }, @@ -7713,6 +7771,7 @@ static int mov_read_close(AVFormatContext *s) av_freep(&sc->elst_data); av_freep(&sc->rap_group); av_freep(&sc->sync_group); + av_freep(&sc->sgpd_sync); av_freep(&sc->display_matrix); av_freep(&sc->index_ranges);