From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 7E2F84903A for ; Wed, 31 Jan 2024 18:12:35 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8578368D0A6; Wed, 31 Jan 2024 20:12:32 +0200 (EET) Received: from mail-pg1-f174.google.com (mail-pg1-f174.google.com [209.85.215.174]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BCCF968C7E6 for ; Wed, 31 Jan 2024 20:12:25 +0200 (EET) Received: by mail-pg1-f174.google.com with SMTP id 41be03b00d2f7-5c66b093b86so1011149a12.0 for ; Wed, 31 Jan 2024 10:12:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706724743; x=1707329543; darn=ffmpeg.org; h=content-transfer-encoding:in-reply-to:autocrypt:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=Xec/EvorDwnp2WcoLbZm3vRitJ/LZAesLTPT1kAsOM0=; b=Fysqi+duMqLLfcW/oaLM9YG/2Z6CXgpuPNier5tff6bvP85LJYEDQGKavmTqYx8FHl BUwufnfmmXnnNv4Q8N6uoe2nNMzPePGogZ2Yy7A9PmmqLqoyCw8AqDIVNShPqQRpUiLh HuTR2qjboeSZFojKBbnRt13V6BiRRbJVwpXjOWhLGcUrs0mLJY1UQ8wRCZDl5weCW52k VFaJEmBUIysCbrN4kwhnIDvoysAQ/3Jm0I4UEDk1kFT9GuP12cjnZTqmX/Kdzu0mIpZJ jrCzlvNCh0QsFCSwur/WupuSXZk0y+Om8CPHH9dwJA6U5Mjnv6cERYCuVd/cfXCX/tWm wzWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706724743; x=1707329543; h=content-transfer-encoding:in-reply-to:autocrypt:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Xec/EvorDwnp2WcoLbZm3vRitJ/LZAesLTPT1kAsOM0=; b=xTqSn32Xc/lMGF7qITP/WDdrLW4H5f2AowTM5Jra1elO2mReWmR4hLjv5FOizmtWjN E3azmxRhmkxvcVGHFyS1A2GVaehPq3R3fRTMQXioZ9wTYob6wLI75YThFHWNyBOQlwM8 EhLpZsOl70ZTdi7wmO7u8U17aJ8QCHbvy26j0vimuxB+85gA18lUgMV9eN0XVDFsLXaJ h8O96ikMzoMYlDWxSC/d88iW+5Oufn88u72EMlMlTKpAN+Ga4LNxwB9nmQxCcVmHrNTB gWjLyUMV99fAm7ycOeQ2AsJiRpnrkevakwCuVMVnutgHImvH8LwvYXoJvdQcr7+k1ib/ JMGA== X-Gm-Message-State: AOJu0YwX7a+N8C4F7xAX9n7UdzPy7VtxxiDSUHFiBXXGNoUGkoP/dtsV /2rF5BrZm6fOC6sSM3FSxaYYLkxcyIe//q6SSHqxy4Rjf5Xz8fDSYSDDTCFp X-Google-Smtp-Source: AGHT+IFePV9hSck6ui/czpUDb0ai+fieYFsekq/tN1d9BxhDP/bjueZ9iFLPaJSJp0P0aPm42SwmKg== X-Received: by 2002:a17:90a:4812:b0:28e:850e:7e87 with SMTP id a18-20020a17090a481200b0028e850e7e87mr5493515pjh.41.1706724742799; Wed, 31 Jan 2024 10:12:22 -0800 (PST) Received: from [192.168.0.18] (host197.190-225-105.telecom.net.ar. [190.225.105.197]) by smtp.gmail.com with ESMTPSA id px1-20020a17090b270100b00295d897a993sm1853500pjb.31.2024.01.31.10.12.21 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 31 Jan 2024 10:12:22 -0800 (PST) Message-ID: <65a3592e-74c2-4051-8114-32a7b6da78f2@gmail.com> Date: Wed, 31 Jan 2024 15:12:47 -0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: <20240131174718.17829-1-jamrial@gmail.com> From: James Almer Autocrypt: addr=jamrial@gmail.com; keydata= xsBNBFjZtqABCADLW+vdEoZaJZDsIO6geYFTOcn1unsEHefj9zn+3oTHlDFFzO47mzHsSfbK 9JE2xpOJEVnC8FAF5Sayi/pVwV+mtQUV3n5dgVeVBYF9GUQwOGFCpK8X54RRqhkgknbunOEE 0CtgAJgmpFmmmHgq02GvEspx1h/rh4apqwQR6QX4Favb+x9+i9ytVpwVcBX94vo2toyP7h/K BWfadQmb8ltgE1kshfg+SQs/H5bTV5Z1DuEASf02ZL/1qYB/sdTgWPLv9XMUHHsRFmMY8TMx wJSkP+Af3AiYQPJYz1B1D4tt98T/NoiVdin10zATakPjV8hXaobuRmxgakkUASXudydDABEB AAHNH0phbWVzIEFsbWVyIDxqYW1yaWFsQGdtYWlsLmNvbT7CwJIEEwEIADwCGwMGCwkIBwMC BhUIAgkKCwQWAgMBAh4BAheAFiEEd1EujP2UoWlX5pp6FGMBrXN2WeAFAmJoLUUCGQEACgkQ FGMBrXN2WeAFVQf9GtGhniRs1PzNUOgJktCnv6j4BbLieaIPYPEFXKDHOgjqQE2zVMYXnoXl Jam928ii902a8OY06r9ywn/R8ApD1/3NY/v64O71CY9scz5XyH2au8wIZ6HwFy3/f7sqjdGD uctY8Qs7rjT7NkoC5lmgMu2v2k03dGtM9AAf5AK5gU+H0EUw7vmKKiXzUqt5kvBuf4CEwXvH AQT1SMJ52rIlDWB7FQFyZeUbOAK2IgY/KNedfK6nsgd/eQVnlofPd2XoddE7kP6iys7jJefw DD3g3rZyDTq7in5dyk5glaNpWZpbHGBs+9SCYLnfQ8XvWqPFOD+gj0plamKANgOvavKTxM7A TQRY2bagAQgA69YtILj8kYxmqPr/M8+MXT7wVoOWVW9lvSmPquCELaDy/NIS7D06VC5EuE/6 JlJXZMTn37NLlyWhzwOgXuXw5w2tyoQQBuvqGiXJijuXwXH7HKdzrc6rpYtAqt5w05hzNrFS KrS0izG64VpWrfproy3BsL+8TBm9brLhhNPynVRqVukbbGzlATTzNQGZ14TTi2/dL6DkMQnM qn4jX9UEe4GdGQBP50bUJSSmeiIkyNLWA+znuN2PZEz930ZwNrF9GtDVw7mzcmpCZ7spldE2 tutbpy9D1bIqxyqBrYDSezyzL2adR1qgHyOTMCHg2AYNkrIQHrSyJxKTpZ1/hqOp8wARAQAB wsBfBBgBAgAJBQJY2bagAhsMAAoJEBRjAa1zdlnghekH/0Yb0iYJ74oID2f/Fj+AJKS2ekQF P2xOr8lpGzgp/+yWUvPtqbX0A33anBJdYwxaAC0NataX3tfZ+oJkzXqfmqhIHMPYHdZesJA2 Bk9hU/33mDl5s5U66/z0uelWzwKVHoQ2O6or4+qF3HJFSJLCe9uvWJ3zXf9F342Ftj73sfx+ 3xkw/IXsN1RqbYqDlzpoEQ99SIEfY/8Jjwnd3sIPfqkuyeaYfe6GJDqKawdCEP1oRRlbXEAp TJgYz8r3nPhGv9cdHNDCk44ISbsqVuxIEnLqi4fTPZaGupiQhT+srl268TTAp2TQW7+6Ce/b NPQorMquzS/LZoyALpmsYi/miMc= In-Reply-To: Subject: Re: [FFmpeg-devel] [PATCH 1/4 v3] avformat/mov: ignore item boxes for animated heif 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 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 1/31/2024 3:06 PM, Andreas Rheinhardt wrote: > James Almer: >> Fixes a regression since d9fed9df2a, where the single animated stream would >> be exported twice as two independent streams. >> >> Signed-off-by: James Almer >> --- >> libavformat/isom.h | 1 + >> libavformat/mov.c | 147 ++++++++++++++++++++++++++++++--------------- >> 2 files changed, 99 insertions(+), 49 deletions(-) >> >> diff --git a/libavformat/isom.h b/libavformat/isom.h >> index 2cf456fee1..21caaac256 100644 >> --- a/libavformat/isom.h >> +++ b/libavformat/isom.h >> @@ -280,6 +280,7 @@ typedef struct MOVContext { >> int64_t duration; ///< duration of the longest track >> int found_moov; ///< 'moov' atom has been found >> int found_iloc; ///< 'iloc' atom has been found >> + int found_iinf; ///< 'iinf' atom has been found >> int found_mdat; ///< 'mdat' atom has been found >> int found_hdlr_mdta; ///< 'hdlr' atom with type 'mdta' has been found >> int trak_index; ///< Index of the current 'trak' >> diff --git a/libavformat/mov.c b/libavformat/mov.c >> index cf931d4594..af95e1f662 100644 >> --- a/libavformat/mov.c >> +++ b/libavformat/mov.c >> @@ -81,6 +81,7 @@ typedef struct MOVParseTableEntry { >> >> static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom); >> static int mov_read_mfra(MOVContext *c, AVIOContext *f); >> +static void mov_free_stream_context(AVFormatContext *s, AVStream *st); >> static int64_t add_ctts_entry(MOVCtts** ctts_data, unsigned int* ctts_count, unsigned int* allocated_size, >> int count, int duration); >> >> @@ -4644,6 +4645,23 @@ static int mov_read_trak(MOVContext *c, AVIOContext *pb, MOVAtom atom) >> MOVStreamContext *sc; >> int ret; >> >> + if (c->found_iinf) { >> + // * For animated heif, if the iinf box showed up before the moov >> + // box, we need to clear all the streams read in the former. >> + for (int i = c->heif_info_size - 1; i >= 0; i--) { >> + HEIFItem *item = &c->heif_info[i]; >> + >> + if (!item->st) >> + continue; >> + >> + mov_free_stream_context(c->fc, item->st); >> + ff_remove_stream(c->fc, item->st); >> + } >> + av_freep(&c->heif_info); >> + c->heif_info_size = 0; >> + c->found_iinf = c->found_iloc = 0; >> + } >> + >> st = avformat_new_stream(c->fc, NULL); >> if (!st) return AVERROR(ENOMEM); >> st->id = -1; >> @@ -7773,8 +7791,9 @@ static int mov_read_iloc(MOVContext *c, AVIOContext *pb, MOVAtom atom) >> uint64_t base_offset, extent_offset, extent_length; >> uint8_t value; >> >> - if (c->found_iloc) { >> - av_log(c->fc, AV_LOG_INFO, "Duplicate iloc box found\n"); >> + if (c->found_moov) { >> + // * For animated heif, we don't care about the iloc box as all the >> + // necessary information can be found in the moov box. >> return 0; >> } >> >> @@ -7896,6 +7915,16 @@ static int mov_read_iinf(MOVContext *c, AVIOContext *pb, MOVAtom atom) >> int entry_count; >> int version, ret; >> >> + if (c->found_iinf) { >> + av_log(c->fc, AV_LOG_WARNING, "Duplicate iinf box found\n"); >> + return 0; >> + } >> + if (c->found_moov) { >> + // * For animated heif, we don't care about the iinf box as all the >> + // necessary information can be found in the moov box. >> + return 0; >> + } >> + >> version = avio_r8(pb); >> avio_rb24(pb); // flags. >> entry_count = version ? avio_rb32(pb) : avio_rb16(pb); >> @@ -7919,6 +7948,7 @@ static int mov_read_iinf(MOVContext *c, AVIOContext *pb, MOVAtom atom) >> return ret; >> } >> >> + c->found_iinf = 1; >> return 0; >> } >> >> @@ -7932,6 +7962,13 @@ static int mov_read_iref(MOVContext *c, AVIOContext *pb, MOVAtom atom) >> static int mov_read_ispe(MOVContext *c, AVIOContext *pb, MOVAtom atom) >> { >> uint32_t width, height; >> + >> + if (c->found_moov) { >> + // * For animated heif, we don't care about the ispe box as all the >> + // necessary information can be found in the moov box. >> + return 0; >> + } >> + >> avio_r8(pb); /* version */ >> avio_rb24(pb); /* flags */ >> width = avio_rb32(pb); >> @@ -7966,6 +8003,12 @@ static int mov_read_iprp(MOVContext *c, AVIOContext *pb, MOVAtom atom) >> int version, flags; >> int ret; >> >> + if (c->found_moov) { >> + // * For animated heif, we don't care about the iprp box as all the >> + // necessary information can be found in the moov box. >> + return 0; >> + } >> + >> a.size = avio_rb32(pb); >> a.type = avio_rl32(pb); >> >> @@ -8587,6 +8630,58 @@ static void mov_free_encryption_index(MOVEncryptionIndex **index) { >> av_freep(index); >> } >> >> +static void mov_free_stream_context(AVFormatContext *s, AVStream *st) >> +{ >> + MOVStreamContext *sc = st->priv_data; >> + >> + if (!sc) >> + return; >> + >> + av_freep(&sc->ctts_data); >> + for (int i = 0; i < sc->drefs_count; i++) { >> + av_freep(&sc->drefs[i].path); >> + av_freep(&sc->drefs[i].dir); >> + } >> + av_freep(&sc->drefs); >> + >> + sc->drefs_count = 0; >> + >> + if (!sc->pb_is_copied) >> + ff_format_io_close(s, &sc->pb); >> + >> + sc->pb = NULL; >> + av_freep(&sc->chunk_offsets); >> + av_freep(&sc->stsc_data); >> + av_freep(&sc->sample_sizes); >> + av_freep(&sc->keyframes); >> + av_freep(&sc->stts_data); >> + av_freep(&sc->sdtp_data); >> + av_freep(&sc->stps_data); >> + av_freep(&sc->elst_data); >> + av_freep(&sc->rap_group); >> + av_freep(&sc->sync_group); >> + av_freep(&sc->sgpd_sync); >> + av_freep(&sc->sample_offsets); >> + av_freep(&sc->open_key_samples); >> + av_freep(&sc->display_matrix); >> + av_freep(&sc->index_ranges); >> + >> + if (sc->extradata) >> + for (int i = 0; i < sc->stsd_count; i++) >> + av_free(sc->extradata[i]); >> + av_freep(&sc->extradata); >> + av_freep(&sc->extradata_size); >> + >> + mov_free_encryption_index(&sc->cenc.encryption_index); >> + av_encryption_info_free(sc->cenc.default_encrypted_sample); >> + av_aes_ctr_free(sc->cenc.aes_ctr); >> + >> + av_freep(&sc->stereo3d); >> + av_freep(&sc->spherical); >> + av_freep(&sc->mastering); >> + av_freep(&sc->coll); >> +} >> + >> static int mov_read_close(AVFormatContext *s) >> { >> MOVContext *mov = s->priv_data; >> @@ -8594,54 +8689,8 @@ static int mov_read_close(AVFormatContext *s) >> >> for (i = 0; i < s->nb_streams; i++) { >> AVStream *st = s->streams[i]; >> - MOVStreamContext *sc = st->priv_data; >> - >> - if (!sc) >> - continue; >> - >> - av_freep(&sc->ctts_data); >> - for (j = 0; j < sc->drefs_count; j++) { >> - av_freep(&sc->drefs[j].path); >> - av_freep(&sc->drefs[j].dir); >> - } >> - av_freep(&sc->drefs); >> - >> - sc->drefs_count = 0; >> >> - if (!sc->pb_is_copied) >> - ff_format_io_close(s, &sc->pb); >> - >> - sc->pb = NULL; >> - av_freep(&sc->chunk_offsets); >> - av_freep(&sc->stsc_data); >> - av_freep(&sc->sample_sizes); >> - av_freep(&sc->keyframes); >> - av_freep(&sc->stts_data); >> - av_freep(&sc->sdtp_data); >> - av_freep(&sc->stps_data); >> - av_freep(&sc->elst_data); >> - av_freep(&sc->rap_group); >> - av_freep(&sc->sync_group); >> - av_freep(&sc->sgpd_sync); >> - av_freep(&sc->sample_offsets); >> - av_freep(&sc->open_key_samples); >> - av_freep(&sc->display_matrix); >> - av_freep(&sc->index_ranges); >> - >> - if (sc->extradata) >> - for (j = 0; j < sc->stsd_count; j++) >> - av_free(sc->extradata[j]); >> - av_freep(&sc->extradata); >> - av_freep(&sc->extradata_size); >> - >> - mov_free_encryption_index(&sc->cenc.encryption_index); >> - av_encryption_info_free(sc->cenc.default_encrypted_sample); >> - av_aes_ctr_free(sc->cenc.aes_ctr); >> - >> - av_freep(&sc->stereo3d); >> - av_freep(&sc->spherical); >> - av_freep(&sc->mastering); >> - av_freep(&sc->coll); >> + mov_free_stream_context(s, st); > > Factoring this out does not belong in this patch. Locally split into its own patch. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".