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 ABE8E4C75F for ; Wed, 22 Oct 2025 20:43:42 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'149E1q1hoMP6N69tQkfNutM2PuNUvYKynxqC3LCHO3E=', expected b'8KSQl97RKIGxlp+jwMhUHRYCbXA1Eh2ch/a8je1Kudk=')) 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=1761165807; 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=149E1q1hoMP6N69tQkfNutM2PuNUvYKynxqC3LCHO3E=; b=rI3ZA/NhmdUucSirN7prVvunS89wnxEoTsJkHgoX/2z8LHj52G17DHi+0JjDfuLfH1+4Y 2rcaKmRVEMSCWIiqTc/V0Qz9Ywj6JPuGDUt5cGPsBMhP5Sbo77mzCl0VAb2utzWMgb8qpxW b05U0Zcmp/jdklyQA5pDi6cKFrDUlzGGDygPKtV10waDEWYbkmr7ccx2gnZ+MyvpBqBJ7ZU oLRwMcqFd4szosn2fthggTsG2kCPjYfxMiDjsk+cKDndqb8JcbMom54D4Ymyw09U82l1Dx2 b7zwf3qqJSo2QKA3x1/l02QPqsfuKm6h0NOGnpvYl4EtOgJDLO/er41bxTMQ== Received: from [172.19.0.2] (unknown [172.19.0.2]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id B3E4268F5AF; Wed, 22 Oct 2025 23:43:27 +0300 (EEST) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1761165806; b=TuOtUBU7bVnNWkDhaxgfq0FZ7YrOdKB9TGpKfrehceK+jv9eroEd6spfg3yuZdWw93p8s rGieH7v/AYMGQX9zpFXpY4vfG7FiP87pl5B87Q6DXi0emKfDJwq674rrgvDCbEjltd36Gq7 fxddpPsbfBDpiy9CSYrDEUZ/YQ61OsnEeXNu0ldlTixGMM264CQsexUHwwoialZYmwSbi5w W6dd1hmMDgbtfDtSQbT9thz3M9FdA/EddqJ5NNwEAS95LWbX+uF4KY51DewuPDuv2IowTVB 3+jWiGzhmgV5iyjAPNFXMU+QEq+pfoF2OqV7DO2YxggW85EVAomDQv/XqutQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1761165806; 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=W1KuvCMkz7yvX/0jxuFf46Q81HejZFkc2u/hiVvL6g4=; b=twPg/xC9/DOf2tyQPh9PaFw+1VpNIsQM+Jw6zT6vihLekYUlFZkMWYAOgfhWsELMNeIuV +HwgH8gPjYr9L9QjzdP+hf8AA6UrQxO8l42gE0EdV32YRiHpBfsS11UwNEIs3489CmlsaA7 92+v5f3lTuTxkmldq/gE4ayaTtttj1yADnE3M/xX6UlyGZydjePWuDGQzjlNuVXrFLKhmwB 2CBIl0ZyjVzHrnmGDRqUwcUnp5tMOxKmcA7lJeXIOCWtqEMOMZnBLf+VhQRTDmPRfqtPSOO zOIKuLHJEv9Q98D3MWPExQ8sGz3WthPl/WQRaqjRPmRe7b407ZPQBGzcLLKQ== 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=1761165798; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=8KSQl97RKIGxlp+jwMhUHRYCbXA1Eh2ch/a8je1Kudk=; b=LoIyJgFIXy1nEPNRo7dMw69KZBK6YcFcEZk0cu60oi1yRwHEH9B9AU+bV2hAq/XTmCNsq MXXqLPiRx609pXGD/fDiZeOIvrZFgxRwIXDfm5Kh+Kdf4eHyBxJfJxiHCW3qkyTWW3aXLCO 1PslQVccHC+2X2QSS/NGnvfGfZyg7H9QFMQexFSJShp2AB4q3SFRWXB1jgNvIZvq/IGyabR w76H9Pw/Uq4GAB9MhIvyvQlVb1mFw3piFh/89STO8uL9lb3aSnS24BSgFjoXY3Mc7ZrCFBv if4rw750kvhf0Oh63x5SecVREEyNbBJypLaB3Sr7E8/be52BTiF6sINpmd4A== Received: from 547bf0a948a1 (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 103D068F588 for ; Wed, 22 Oct 2025 23:43:18 +0300 (EEST) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Wed, 22 Oct 2025 20:43:17 -0000 Message-ID: <176116579820.25.13088961014152099068@7d278768979e> Message-ID-Hash: 3TKBK7RHQC2MZLM5CACCP7PESER6VOD6 X-Message-ID-Hash: 3TKBK7RHQC2MZLM5CACCP7PESER6VOD6 X-MailFrom: code@ffmpeg.org 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; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] Add support for copying metadata boxed/mebx defined in ISO 14496-12 (PR #20738) 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: lholliger via ffmpeg-devel Cc: lholliger Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #20738 opened by lholliger URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20738 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20738.patch Currently there is no support to copy these MEBX tracks, so they are dropped. These tracks often appear on iPhones, especially when shooting cinematic mode, so allowing this to pass through makes it easier to transparently work with these files. >>From 0c0f8d74deb883fd77a2b21697fc485742f781fb Mon Sep 17 00:00:00 2001 From: Lukas Holliger Date: Wed, 22 Oct 2025 16:41:47 -0400 Subject: [PATCH] Add support for copying metadata boxed/mebx defined in ISO 14496-12 Currently there is no support to copy these MEBX tracks, so they are dropped. These tracks often appear on iPhones, especially when shooting cinematic mode, so allowing this to pass through makes it easier to transparently work with these files. --- libavcodec/codec_desc.c | 6 ++++++ libavcodec/codec_id.h | 1 + libavformat/isom.c | 1 + libavformat/mov.c | 7 +++++++ libavformat/movenc.c | 39 ++++++++++++++++++++++++++++++++++++++- 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index c72271bfad..40c8235f60 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -3839,6 +3839,12 @@ static const AVCodecDescriptor codec_descriptors[] = { .name = "smpte_436m_anc", .long_name = NULL_IF_CONFIG_SMALL("MXF SMPTE-436M ANC"), }, + { + .id = AV_CODEC_ID_MEBX, + .type = AVMEDIA_TYPE_DATA, + .name = "mebx", + .long_name = NULL_IF_CONFIG_SMALL("Metadata Boxed"), + }, { .id = AV_CODEC_ID_MPEG2TS, .type = AVMEDIA_TYPE_DATA, diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h index 8c98ac6335..c623efa0c3 100644 --- a/libavcodec/codec_id.h +++ b/libavcodec/codec_id.h @@ -613,6 +613,7 @@ enum AVCodecID { AV_CODEC_ID_SMPTE_2038, AV_CODEC_ID_LCEVC, AV_CODEC_ID_SMPTE_436M_ANC, + AV_CODEC_ID_MEBX, AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it diff --git a/libavformat/isom.c b/libavformat/isom.c index 29171fea40..7dbc934330 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -81,6 +81,7 @@ const AVCodecTag ff_codec_movsubtitle_tags[] = { const AVCodecTag ff_codec_movdata_tags[] = { { AV_CODEC_ID_BIN_DATA, MKTAG('g', 'p', 'm', 'd') }, + { AV_CODEC_ID_MEBX, MKTAG('m', 'e', 'b', 'x') }, { AV_CODEC_ID_NONE, 0 }, }; diff --git a/libavformat/mov.c b/libavformat/mov.c index 7fe4678234..35db690709 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -2895,6 +2895,13 @@ static int mov_parse_stsd_data(MOVContext *c, AVIOContext *pb, } } } + } else if (st->codecpar->codec_tag == MKTAG('m','e','b','x')) { + if ((int)size != size) + return AVERROR(ENOMEM); + + ret = ff_get_extradata(c->fc, st->codecpar, pb, size); + if (ret < 0) + return ret; } else { /* other codec type, just skip (rtp, mp4s ...) */ avio_skip(pb, size); diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 067d38b14b..6519225935 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -3052,6 +3052,36 @@ static int mov_write_gpmd_tag(AVIOContext *pb, const MOVTrack *track) return update_size(pb, pos); } +static int mov_write_mebx_keys_tag(AVIOContext *pb, const MOVTrack *track) +{ + int64_t pos = avio_tell(pb); + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, "keys"); + avio_wb32(pb, 0); /* version and flags */ + + return update_size(pb, pos); +} + +static int mov_write_mebx_tag(AVIOContext *pb, const MOVTrack *track) +{ + int64_t pos = avio_tell(pb); + avio_wb32(pb, 0); /* size */ + ffio_wfourcc(pb, "mebx"); + avio_wb32(pb, 0); /* Reserved */ + avio_wb16(pb, 0); /* Reserved */ + avio_wb16(pb, 1); /* Data-reference index */ + + // Write the keys box (and any other boxes) from extradata + if (track->par->extradata_size > 0) { + avio_write(pb, track->par->extradata, track->par->extradata_size); + } else { + // No extradata, write minimal empty keys box + mov_write_mebx_keys_tag(pb, track); + } + + return update_size(pb, pos); +} + static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) { int64_t pos = avio_tell(pb); @@ -3077,7 +3107,8 @@ static int mov_write_stsd_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext ret = mov_write_tmcd_tag(pb, track); else if (track->par->codec_tag == MKTAG('g','p','m','d')) ret = mov_write_gpmd_tag(pb, track); - + else if (track->par->codec_tag == MKTAG('m','e','b','x')) + ret = mov_write_mebx_tag(pb, track); if (ret < 0) return ret; } @@ -3499,6 +3530,9 @@ static int mov_write_hdlr_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra } else if (track->par->codec_tag == MKTAG('g','p','m','d')) { hdlr_type = "meta"; descr = "GoPro MET"; // GoPro Metadata + } else if (track->par->codec_tag == MKTAG('m','e','b','x')) { + hdlr_type = "meta"; + descr = "Metadata Boxed"; } else { av_log(s, AV_LOG_WARNING, "Unknown hdlr_type for %s, writing dummy values\n", @@ -3734,6 +3768,8 @@ static int mov_write_minf_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext mov_write_gmhd_tag(pb, track); } else if (track->tag == MKTAG('g','p','m','d')) { mov_write_gmhd_tag(pb, track); + } else if (track->tag == MKTAG('m','e','b','x')) { + mov_write_gmhd_tag(pb, track); } if (track->mode == MODE_MOV) /* ISO 14496-12 8.4.3.1 specifies hdlr only within mdia or meta boxes */ mov_write_hdlr_tag(s, pb, NULL); @@ -8803,6 +8839,7 @@ static const AVCodecTag codec_mp4_tags[] = { { AV_CODEC_ID_DVD_SUBTITLE, MKTAG('m', 'p', '4', 's') }, { AV_CODEC_ID_MOV_TEXT, MKTAG('t', 'x', '3', 'g') }, { AV_CODEC_ID_BIN_DATA, MKTAG('g', 'p', 'm', 'd') }, + { AV_CODEC_ID_MEBX, MKTAG('m', 'e', 'b', 'x') }, { AV_CODEC_ID_MPEGH_3D_AUDIO, MKTAG('m', 'h', 'm', '1') }, { AV_CODEC_ID_TTML, MOV_MP4_TTML_TAG }, { AV_CODEC_ID_TTML, MOV_ISMV_TTML_TAG }, -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org