From patchwork Thu Sep 12 00:59:20 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 51539 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:612c:14c:b0:48e:c0f8:d0de with SMTP id h12csp722417vqi; Wed, 11 Sep 2024 23:24:13 -0700 (PDT) X-Forwarded-Encrypted: i=2; AJvYcCVNxKGYIUWCWs7vtd9cCpmMCiWnbRMJfXPnknulhZmEcWgvvPDXUGl0lPH/XQwnq+egW5YQaoesEoOXNYmW8KvJ@gmail.com X-Google-Smtp-Source: AGHT+IFzPoXD0YxzvZlc+hM8pDd6U4jROWCNSmQGpubpM5Mivmc2CX6UI6IWmeZWvT4i5pu8OwKQ X-Received: by 2002:a2e:b8c7:0:b0:2ef:2b6e:f8c2 with SMTP id 38308e7fff4ca-2f787dbb4a8mr2232881fa.6.1726122252728; Wed, 11 Sep 2024 23:24:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1726122252; cv=none; d=google.com; s=arc-20240605; b=MoUabN+tcQIIKPGLyNqtQYPmRjHQT49L8cgBDdwXi6VbwxGjsm7hsp33dqQdjO4dAD XVcjPby45A8jzAtQVZpX/zgFgNCMeTJ7vut9aiHI/xSKicV4/WgTA79bG6o2ry1MuQkL Weqm9rsvamJNzS2Vms1KQLb+sAgBaVKxtZOTZaJoFXP7qSqASsuXi40mv85zfRAq4wBt gM7MQRaGMpvUaDtfv3eyCFjoMKF7Pp/UO9/rWX8PpXnvPFGPssajYmbWCvUrcpGKhiZk RlHNp87t1AlV6Sr+Hjx4hmN4d/v7uQztrySRezbdCy4lTdzUCKZa2QI9uUPdgfyK3MIX P9Qw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=sender:errors-to:content-transfer-encoding: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=xThw6JgxwnV0UwRBipiOPDH28QGRmd+RastRR+WEnf0=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=Sfsx9RJmQp39jBbk9G1yGMZUtVfukEnLsC+wQmZmzqu/9K0FRpwsZhvIPvpcJ2ORiu bn6VuAKug8TZckv5RB6dFRsm/g0tzuVRDRZP8yNOYU5r5PUWb0CexzP6J7n6lKS0MB4k TU3m6d8yE7hqS82/ZxzeKbm6X/wPupuBTZ7C2y2WHxAZULPtrW9Im+itdQPFX74CBENB dLcAzul/gJq3JFyIEsEUW7U7ive4KxKrFN4IcXjcfd77IoA28iwDGA/s2HXuhrE0ZlpW xnCPgaAbYsavGniwAmVgRUKLXACm5KhsHQI41ww+77Gw3C44wxJuVKPRwRT19TM4m5lY L9qw==; dara=google.com ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20230601 header.b=TvQbc6O3; 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; dara=fail header.i=@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 38308e7fff4ca-2f75c0b8a72si32192611fa.620.2024.09.11.23.24.12; Wed, 11 Sep 2024 23:24:12 -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=20230601 header.b=TvQbc6O3; 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; dara=fail header.i=@gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D7BEB68D90B; Thu, 12 Sep 2024 03:59:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DFED368D858 for ; Thu, 12 Sep 2024 03:59:44 +0300 (EEST) Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2054e22ce3fso4720565ad.2 for ; Wed, 11 Sep 2024 17:59:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1726102782; x=1726707582; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=iLHwaGWg2SNhNa58PCg0KdEjijUshkgW+/KAPVLqHrY=; b=TvQbc6O3jYMMEgjR52dCiMODQfk8+DYRk4fJlIeLcq9Kquxp62r3bMeY/9Fpc1zhpE 2FWpF/6CkHYaTYn9tEkP/DG+oBm/XodAGlpLZJRzL2eDVs1ytkhwspLO3xTan4H/cLhD 2ZbKYl/3CWbBWT9kzaaPAYBYAI5vFspUnkONKQmRs70h/Kv8kwOp3HhlL5LAmcejIe9U I5Bj/8e5kqCO8tn4QiS6r143O6YJcnOpO1geCMQO488TeUIARRzzlkq5zEwUVbLTg49u ztjEsOKOsnDpUyGm3HI2kw7rhyR6j1vTitKHGIVgKWnzdkQqkris6Lm/2hhJcOceSyOJ SJ+A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1726102782; x=1726707582; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=iLHwaGWg2SNhNa58PCg0KdEjijUshkgW+/KAPVLqHrY=; b=umGArB45zpM6evfGOwKsu1V7rof8TrVMr+50bstPWmlEx87vmHiNQmS2flQ3WWRkIs NLIhbsRMK/RPF8TwRuLuZTeFeaTO+4J+or8nhi93v40HuOS+XTcrgsStiSQqxqCrxNZa +VI5OPCYs9gi5spe5cVozZ6uRY8E5OVrrLJjWnveX043Ypbq6cVfNQcoCJHpj5K4aAkA kUI+zizTj0CsDBfLHrWiFLu7A+1Xs1Iy8wS12T23IHrm1zvfJnftdxf7YcGxorH2LlHj 7/iUvHfyiVTYnOgyqydYl8d9ynXYSpOuIjto4+SmdJrZKmCJhVw6XdgVHF5vwAtS5Dse EvLw== X-Gm-Message-State: AOJu0YxN9Rh9tPt3qSnyn0DnJcP41yqNy4d4Nm03X4X4I26HWu043NxQ nLPcWhDr+HwQh8Yoq1NtYWuFr8Y9H5hv8j1bQzXbmOlOT6VRcsoSLzDHlw== X-Received: by 2002:a05:6a20:d486:b0:1c8:a5ba:d2ba with SMTP id adf61e73a8af0-1cf75f2a657mr1403912637.22.1726102782007; Wed, 11 Sep 2024 17:59:42 -0700 (PDT) Received: from localhost.localdomain ([181.92.233.116]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-71908fc8210sm3557769b3a.36.2024.09.11.17.59.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 11 Sep 2024 17:59:41 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 11 Sep 2024 21:59:20 -0300 Message-ID: <20240912005925.10151-6-jamrial@gmail.com> X-Mailer: git-send-email 2.46.0 In-Reply-To: <20240912005925.10151-1-jamrial@gmail.com> References: <20240912005925.10151-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 06/10 v2] avformat/mov: support for LCEVC tracks 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: F+GfxqazRGRN Co-authored-by: V-Nova Team Signed-off-by: James Almer --- libavformat/isom.h | 3 ++ libavformat/isom_tags.c | 2 + libavformat/mov.c | 86 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) diff --git a/libavformat/isom.h b/libavformat/isom.h index 15e9466e41..4723397048 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -212,6 +212,8 @@ typedef struct MOVStreamContext { unsigned drefs_count; MOVDref *drefs; int dref_id; + unsigned tref_flags; + int tref_id; int timecode_track; int width; ///< tkhd width int height; ///< tkhd height @@ -408,6 +410,7 @@ void ff_mp4_parse_es_descr(AVIOContext *pb, int *es_id); #define MOV_SAMPLE_DEPENDENCY_YES 0x1 #define MOV_SAMPLE_DEPENDENCY_NO 0x2 +#define MOV_TREF_FLAG_ENHANCEMENT 0x1 #define TAG_IS_AVCI(tag) \ ((tag) == MKTAG('a', 'i', '5', 'p') || \ diff --git a/libavformat/isom_tags.c b/libavformat/isom_tags.c index 058f0f2a59..5dd72d570e 100644 --- a/libavformat/isom_tags.c +++ b/libavformat/isom_tags.c @@ -290,6 +290,8 @@ const AVCodecTag ff_codec_movvideo_tags[] = { { AV_CODEC_ID_CFHD, MKTAG('C', 'F', 'H', 'D') }, + { AV_CODEC_ID_LCEVC, MKTAG('l', 'v', 'c', '1') }, /* LCEVC raw payload */ + { AV_CODEC_ID_NONE, 0 }, }; diff --git a/libavformat/mov.c b/libavformat/mov.c index d57c4f150b..e42f40e212 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -2434,6 +2434,30 @@ static int mov_read_dvc1(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_sbas(MOVContext* c, AVIOContext* pb, MOVAtom atom) +{ + AVStream* st; + MOVStreamContext* sc; + + if (c->fc->nb_streams < 1) + return 0; + + /* For SBAS this should be fine - though beware if someone implements a + * tref atom processor that doesn't drop down to default then this may + * be lost. */ + if (atom.size > 4) { + av_log(c->fc, AV_LOG_ERROR, "Only a single tref of type sbas is supported\n"); + return AVERROR_PATCHWELCOME; + } + + st = c->fc->streams[c->fc->nb_streams - 1]; + sc = st->priv_data; + sc->tref_id = avio_rb32(pb); + sc->tref_flags |= MOV_TREF_FLAG_ENHANCEMENT; + + return 0; +} + /** * An strf atom is a BITMAPINFOHEADER struct. This struct is 40 bytes itself, * but can have extradata appended at the end after the 40 bytes belonging @@ -4995,6 +5019,8 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) st->codecpar->codec_type = AVMEDIA_TYPE_DATA; sc->ffindex = st->index; c->trak_index = st->index; + sc->tref_flags = 0; + sc->tref_id = -1; sc->refcount = 1; if ((ret = mov_read_default(c, pb, atom)) < 0) @@ -9052,6 +9078,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('a','v','c','C'), mov_read_glbl }, { MKTAG('p','a','s','p'), mov_read_pasp }, { MKTAG('c','l','a','p'), mov_read_clap }, +{ MKTAG('s','b','a','s'), mov_read_sbas }, { MKTAG('s','i','d','x'), mov_read_sidx }, { MKTAG('s','t','b','l'), mov_read_default }, { MKTAG('s','t','c','o'), mov_read_stco }, @@ -9132,6 +9159,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('i','i','n','f'), mov_read_iinf }, { MKTAG('a','m','v','e'), mov_read_amve }, /* ambient viewing environment box */ { MKTAG('l','h','v','C'), mov_read_lhvc }, +{ MKTAG('l','v','c','C'), mov_read_glbl }, #if CONFIG_IAMFDEC { MKTAG('i','a','c','b'), mov_read_iacb }, #endif @@ -10029,6 +10057,21 @@ static int mov_parse_tiles(AVFormatContext *s) return 0; } +static AVStream *mov_find_reference_track(AVFormatContext *s, AVStream *st, + int first_index) +{ + MOVStreamContext *sc = st->priv_data; + + if (sc->tref_id < 0) + return NULL; + + for (int i = first_index; i < s->nb_streams; i++) + if (s->streams[i]->id == sc->tref_id) + return s->streams[i]; + + return NULL; +} + static int mov_read_header(AVFormatContext *s) { MOVContext *mov = s->priv_data; @@ -10154,6 +10197,49 @@ static int mov_read_header(AVFormatContext *s) } export_orphan_timecode(s); + /* Create LCEVC stream groups. */ + for (i = 0; i < s->nb_streams; i++) { + AVStreamGroup *stg; + AVStream *st = s->streams[i]; + AVStream *st_base; + MOVStreamContext *sc = st->priv_data; + + /* Find an enhancement stream. */ + if (!(sc->tref_flags & MOV_TREF_FLAG_ENHANCEMENT)) + continue; + + st->codecpar->codec_type = AVMEDIA_TYPE_DATA; + + stg = avformat_stream_group_create(s, AV_STREAM_GROUP_PARAMS_LCEVC, NULL); + if (!stg) + return AVERROR(ENOMEM); + + stg->id = st->id; + stg->params.lcevc->width = st->codecpar->width; + stg->params.lcevc->height = st->codecpar->height; + st->codecpar->width = 0; + st->codecpar->height = 0; + + j = 0; + while (st_base = mov_find_reference_track(s, st, j)) { + err = avformat_stream_group_add_stream(stg, st_base); + if (err < 0) + return err; + + j = st_base->index + 1; + } + if (!j) { + av_log(s, AV_LOG_ERROR, "Failed to find base stream for enhancement stream\n"); + return AVERROR_INVALIDDATA; + } + + err = avformat_stream_group_add_stream(stg, st); + if (err < 0) + return err; + + stg->params.lcevc->lcevc_index = stg->nb_streams; + } + for (i = 0; i < s->nb_streams; i++) { AVStream *st = s->streams[i]; FFStream *const sti = ffstream(st);