From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id DA2D54B5C9 for ; Sun, 23 Nov 2025 12:29:27 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'1SuqsixP6olUD5blyqwn7wEjnVuoPXUgT6VXDFohcVQ=', expected b'0EYrn4Jn/12nisOSBFfutuR9Efouf04HSh6H/Ws4GEQ=')) header.d=ffmpeg.org header.i=@ffmpeg.org header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1763900956; h=mime-version : to : date : message-id : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=1SuqsixP6olUD5blyqwn7wEjnVuoPXUgT6VXDFohcVQ=; b=zjezqW/bGoY3vvWAh59nC3wYy5UtG5n3wGjlGxrgmTUnatDbvR91yBl64u3GmaZVZH0dW l4hX+4jIiZlVM7nxI8jrQ51LkuWrO07+cU/H+7lNJiN9deEy/N1zMFon2LfxWaw9xKFPHzl 6A74rt0uxiKw/7pxd42XEVGo/9ieDVAJoLH9/CQMJXdBOx7wdY7dp7LJLCIHbDQpkf9wrFW 8Z+nDYAy/aVvqcBMpvgJZCwF+of7f2NdF/KjioKzwBnyLCezFTfRQC8p2G7Ug0BaXI8a3Sd UjvL6qvYIQG9hvbxJSveYxpvN3dN/1/awEBltNmICycewUHWRjK/DAkRNAKw== Received: from [172.19.0.3] (unknown [172.19.0.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 3039169007B; Sun, 23 Nov 2025 14:29:16 +0200 (EET) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1763900938; b=MOzieaqIPxz9zJ8LWWB+9COfUXMeHqsXDModJdDnmW18T9L+67AIJq6IrUjJ9X7FhGZ41 KCbS/ylmAf3IHGsyPLKEC2PtEvauFBR6H5LlbA2G7lPRHse645t1jjTn8KHY3Fb0/UIOT2L Yzm7pdoxLI3aeT6dl1Zqzj7pBs5UHdqcQWoKSj5owSQYEIGnC9cHU76E5ToNBqTF+NvnyVN ZQzrYqsqYu+cT1YLXbotFMmiuoAVOzRbDVhfxBhynvRRZm0cw8/y0mZLmmz6idxqgtbLXQK ueELhvkmlk3kjmz3n8lRB6IGL6/chR8DMlGvFuzx+xPdCY/ROkwEK0rDtOvA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1763900938; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=M+2mwiE4Cp0Mn+zvTv5hdpSho1d06NqglhdBI6AGCGM=; b=LO2EjBNmCrbrSnN/Hmjv7jmM5VRk7365N9iSlWUKvVlsEuiL7x8/fSVZXzfWkheVJ9FhM vmigVmn3SLxeGzbq9h7n2xXuGxs3/hjcar62bz3t3QR0RNf9BI90UHPgc84flkoIaRHbAwn BFj9z/CwRWgnYgi5Z1QIEbXYJD2/zcF1ze+Gx3Lu6JdWKBEAh/9ikF6s9AUz6WRyquVDf9Z 1Iq2rN+fZbUuh7RwdWTHe5mS67wcevRM3gq4qliuxoYmSPXPauM0Om2cc8Njimm3zaIlrs0 412gTWJhJoGU6oK5mrpvksMBRU8XlIAVVmhrrSO9MX+qEp9UyCUTTHAH83Gw== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=pass header.from=ffmpeg.org policy.dmarc=quarantine Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=pass (Used From Domain Record) header.from=ffmpeg.org policy.dmarc=quarantine DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1763900930; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=0EYrn4Jn/12nisOSBFfutuR9Efouf04HSh6H/Ws4GEQ=; b=bzoLsknTruZ6WeCUFaeHrgx75J3TyDK6yKW2pGcrMWwfsy6MSNCKTExOZvDH9QSR7rmuN RZqp0fs1v/Ic7ySJjYyMuqGIUyksItSEbi6Fdr0aRrUu8MhaVeoeW6Tt0xCnuqhw5eApf0G +K0TkDnlhDspVkw3jyaHDosgPK3rwADi9ShIOF+cgfC1vcrV9jButLE19/Cs25sue/4FZrt jhAmZXdibldG9+UT/XzikZPre0oail6DIhm5pKXfa3eyO7tQ4o9044yT9RTbsptCk7VpW/9 Y3PL7nbl7Isc1+G76Y10Zm6dvjO1Z68uGhgtdYJUvdQFjgtLesVon0PUgTew== Received: from 55ca25703178 (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id D7CE368FFF7 for ; Sun, 23 Nov 2025 14:28:50 +0200 (EET) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Sun, 23 Nov 2025 12:28:50 -0000 Message-ID: <176390093097.39.17516702450917205422@2cb04c0e5124> Message-ID-Hash: 7ZIMPHA7WYZDG2SILXHA556WPCYYZJ73 X-Message-ID-Hash: 7ZIMPHA7WYZDG2SILXHA556WPCYYZJ73 X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Hits: nonmember-moderation X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] avformat/movenc: add support for writing srat box (PR #21001) List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: James Almer via ffmpeg-devel Cc: James Almer Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #21001 opened by James Almer (jamrial) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21001 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/21001.patch Defined mainly to signal a sample rate with a value that doesn't fit the standard 16bit field for formats that don't report a sample rate within private codec parameters (which in general takes precedence), as is the case for PCM. For those, the spec recommends using AudioSampleEntryV1 to signal their parsing is required. >>From 2d5f77c5a2e0fe601eedd804dc67fef7a4708f78 Mon Sep 17 00:00:00 2001 From: James Almer Date: Fri, 21 Nov 2025 23:06:25 -0300 Subject: [PATCH] avformat/movenc: add support for writing srat box Signed-off-by: James Almer --- libavformat/movenc.c | 51 +++++++++++++++++++++++++++++++++++++++----- libavformat/movenc.h | 1 + 2 files changed, 47 insertions(+), 5 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 42c8771496..443ef2866c 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -161,6 +161,18 @@ static int64_t update_size(AVIOContext *pb, int64_t pos) return curpos - pos; } +static int64_t update_size_and_version(AVIOContext *pb, int64_t pos, int version) +{ + int64_t curpos = avio_tell(pb); + avio_seek(pb, pos, SEEK_SET); + avio_wb32(pb, curpos - pos); /* rewrite size */ + avio_skip(pb, 4); + avio_w8(pb, version); /* rewrite version */ + avio_seek(pb, curpos, SEEK_SET); + + return curpos - pos; +} + static int co64_required(const MOVTrack *track) { if (track->entry > 0 && track->cluster[track->entry - 1].pos + track->data_offset > UINT32_MAX) @@ -1344,6 +1356,18 @@ static int mov_write_pcmc_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra return update_size(pb, pos); } +static int mov_write_srat_tag(AVIOContext *pb, MOVTrack *track) +{ + int64_t pos = avio_tell(pb); + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, "srat"); + avio_wb32(pb, 0); /* version & flags */ + + avio_wb32(pb, track->par->sample_rate); + + return update_size(pb, pos); +} + static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) { int64_t pos = avio_tell(pb); @@ -1363,6 +1387,10 @@ static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex track->par->codec_id == AV_CODEC_ID_QDM2) { version = 1; } + } else if (track->mode == MODE_MP4) { + if (track->par->sample_rate > UINT16_MAX && + (tag == MOV_MP4_IPCM_TAG || tag == MOV_MP4_FPCM_TAG)) + version = 1; } avio_wb32(pb, 0); /* size */ @@ -1395,6 +1423,8 @@ static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex avio_wb32(pb, track->sample_size); avio_wb32(pb, get_samples_per_packet(track)); } else { + unsigned sample_rate = track->par->sample_rate; + if (track->mode == MODE_MOV) { avio_wb16(pb, track->par->ch_layout.nb_channels); if (track->par->codec_id == AV_CODEC_ID_PCM_U8 || @@ -1415,6 +1445,9 @@ static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex avio_wb16(pb, 16); } avio_wb16(pb, 0); + + while (sample_rate > UINT16_MAX) + sample_rate >>= 1; } avio_wb16(pb, 0); /* packet size (= 0) */ @@ -1425,14 +1458,14 @@ static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex else if (track->par->codec_id == AV_CODEC_ID_TRUEHD) avio_wb32(pb, track->par->sample_rate); else - avio_wb16(pb, track->par->sample_rate <= UINT16_MAX ? - track->par->sample_rate : 0); + avio_wb16(pb, sample_rate); if (track->par->codec_id != AV_CODEC_ID_TRUEHD) avio_wb16(pb, 0); /* Reserved */ } if (version == 1) { /* SoundDescription V1 extended info */ + if (track->mode == MODE_MOV) { if (mov_pcm_le_gt16(track->par->codec_id) || mov_pcm_be_gt16(track->par->codec_id)) avio_wb32(pb, 1); /* must be 1 for uncompressed formats */ @@ -1441,6 +1474,7 @@ static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex avio_wb32(pb, track->sample_size / track->par->ch_layout.nb_channels); /* Bytes per packet */ avio_wb32(pb, track->sample_size); /* Bytes per frame */ avio_wb32(pb, 2); /* Bytes per sample */ + } } if (track->mode == MODE_MOV && @@ -1489,9 +1523,13 @@ static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex if (ret < 0) return ret; - if (track->mode == MODE_MP4 && track->par->codec_type == AVMEDIA_TYPE_AUDIO - && ((ret = mov_write_SA3D_tag(s, pb, track)) < 0)) { + if (track->mode == MODE_MP4) { + ret = mov_write_SA3D_tag(s, pb, track); + if (ret < 0) return ret; + + if (track->par->sample_rate > UINT16_MAX) + mov_write_srat_tag(pb, track); } if (track->mode == MODE_MOV && track->par->codec_type == AVMEDIA_TYPE_AUDIO @@ -1508,6 +1546,9 @@ static int mov_write_audio_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex ((ret = mov_write_btrt_tag(pb, track)) < 0)) return ret; + if (track->mode == MODE_MP4) + track->entry_version = version; + ret = update_size(pb, pos); return ret; } @@ -3122,7 +3163,7 @@ static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext track->last_stsd_index = stsd_index_back; - return update_size(pb, pos); + return update_size_and_version(pb, pos, track->entry_version); } static int mov_write_ctts_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track) diff --git a/libavformat/movenc.h b/libavformat/movenc.h index 942ad905f7..eb12551ee5 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -86,6 +86,7 @@ typedef struct MOVFragmentInfo { typedef struct MOVTrack { int mode; + int entry_version; int entry, entry_written; unsigned timescale; uint64_t time; -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org