From fbf6aed30ea8618a390bb111a987cbe349bb7e99 Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Fri, 24 Jul 2026 14:30:21 +0200 Subject: [PATCH] mov: load track user data into codec extradata in certain cases This is needed mostly for NeXTTime Micro Wavelet codec --- nihav-commonfmt/src/demuxers/mov/track.rs | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/nihav-commonfmt/src/demuxers/mov/track.rs b/nihav-commonfmt/src/demuxers/mov/track.rs index 2413864..9ee1139 100644 --- a/nihav-commonfmt/src/demuxers/mov/track.rs +++ b/nihav-commonfmt/src/demuxers/mov/track.rs @@ -89,6 +89,7 @@ const MDIA_CHUNK_HANDLERS: &[TrackChunkHandler] = &[ TrackChunkHandler { ctype: mktag!(b"mdhd"), parse: read_mdhd }, TrackChunkHandler { ctype: mktag!(b"hdlr"), parse: read_hdlr }, TrackChunkHandler { ctype: mktag!(b"minf"), parse: read_minf }, + TrackChunkHandler { ctype: mktag!(b"udta"), parse: read_udta_mdia }, ]; fn read_mdhd(track: &mut Track, br: &mut dyn ByteIO, size: u64) -> DemuxerResult { @@ -141,6 +142,32 @@ fn read_hdlr(track: &mut Track, br: &mut dyn ByteIO, size: u64) -> DemuxerResult Ok(KNOWN_HDLR_SIZE) } +fn read_udta_mdia(track: &mut Track, br: &mut dyn ByteIO, size: u64) -> DemuxerResult { + validate!(size > 4); + let version = br.read_byte()?; + validate!(version == 0); + let size2 = u64::from(br.read_u24be()?); + if size2 == size { + let tag = br.peek_tag()?; + if &tag == b"NC00" && track.streams.len() == 1 { + let ref_strm = &track.streams[0]; + let ref_info = ref_strm.get_info(); + if ref_info.get_extradata().is_none() { + validate!(size > 8); + let mut edata = vec![0; size2 as usize - 4]; + br.read_buf(&mut edata)?; + let name = ref_info.get_name(); + let info = ref_info.get_properties(); + let cinfo = NACodecInfo::new(name, info, Some(edata)); + let strm_id = ref_strm.get_id(); + track.streams[0] = NAStream::new(track.stream_type, strm_id, cinfo, track.tb_num, track.tb_den, u64::from(track.pkt_demux.duration)); + return Ok(size); + } + } + } + Ok(4) +} + fn read_minf(track: &mut Track, br: &mut dyn ByteIO, size: u64) -> DemuxerResult { track.read_minf(br, size)?; Ok(size) -- 2.39.5