From: Kostya Shishkov Date: Sat, 31 Oct 2026 15:17:09 +0000 (+0100) Subject: tta: try to initialise decoder from input format if no header was provided X-Git-Url: https://git.nihav.org/?a=commitdiff_plain;h=63ac44b316fb109bb8e2ea76ba2c55c313f4a0e9;p=nihav.git tta: try to initialise decoder from input format if no header was provided --- diff --git a/nihav-llaudio/src/codecs/tta.rs b/nihav-llaudio/src/codecs/tta.rs index 1bfee62..9508a0f 100644 --- a/nihav-llaudio/src/codecs/tta.rs +++ b/nihav-llaudio/src/codecs/tta.rs @@ -219,7 +219,7 @@ fn check_crc(buf: &[u8]) -> bool { impl NADecoder for TTADecoder { fn init(&mut self, _supp: &mut NADecoderSupport, info: NACodecInfoRef) -> DecoderResult<()> { - if let NACodecTypeInfo::Audio(_ainfo) = info.get_properties() { + if let NACodecTypeInfo::Audio(ainfo) = info.get_properties() { if let Some(buf) = info.get_extradata() { if !check_crc(&buf) { return Err(DecoderError::ChecksumError); @@ -263,7 +263,30 @@ impl NADecoder for TTADecoder { self.ainfo = NAAudioInfo::new(srate, channels as u8, fmt, self.framelen as usize); Ok(()) } else { - Err(DecoderError::InvalidData) + println!("no TTA header was provided, trying to make data up"); + + self.nsamples = u32::MAX; + self.framelen = ainfo.sample_rate * 256 / 245; + self.chmap = if ainfo.channels == 1 { + NAChannelMap::from_str("C").unwrap() + } else if ainfo.channels == 2 { + NAChannelMap::from_str("L,R").unwrap() + } else { + return Err(DecoderError::NotImplemented); + }; + self.ainfo = ainfo; + self.ainfo.format = match ainfo.format.bits { + 8 | 16 => SND_S16P_FORMAT, + 24 | 32 => SND_S32P_FORMAT, + _ => return Err(DecoderError::NotImplemented), + }; + self.ainfo.block_len = self.framelen as usize; + self.bpp = (ainfo.format.bits / 8) as u8; + self.ch_dec = Vec::with_capacity(usize::from(ainfo.channels)); + for _ in 0..ainfo.channels { + self.ch_dec.push(ChannelDecoder::new()); + } + Ok(()) } } else { Err(DecoderError::InvalidData)