X-Git-Url: https://git.nihav.org/?p=nihav-encoder.git;a=blobdiff_plain;f=src%2Facvt.rs;fp=src%2Facvt.rs;h=349e10b383a32f5a8e0dc5eab1e0a1e9bf7608f2;hp=5343039d1fb62e8fc8249ebf77d88660fe8cdd81;hb=6f6ba7bfe78bfbd3eff7145bf98839b21213df04;hpb=fd03a232220da2f5eca07bcc3e0229089cca1e3e diff --git a/src/acvt.rs b/src/acvt.rs index 5343039..349e10b 100644 --- a/src/acvt.rs +++ b/src/acvt.rs @@ -39,11 +39,18 @@ impl> AudioQueue { let old_len = self.get_cur_size(); let new_len = src.get_length(); - for (dst, (old, new)) in new_buf.chunks_exact_mut(new_stride).zip( - self.data.chunks_exact(self.stride).zip( - src.get_data().chunks(src.get_stride()))) { - dst[..old_len].copy_from_slice(&old[self.start..self.end]); - dst[old_len..][..new_len].copy_from_slice(&new[..new_len]); + if old_len > 0 { + for (dst, (old, new)) in new_buf.chunks_exact_mut(new_stride).zip( + self.data.chunks_exact(self.stride).zip( + src.get_data().chunks(src.get_stride()))) { + dst[..old_len].copy_from_slice(&old[self.start..self.end]); + dst[old_len..][..new_len].copy_from_slice(&new[..new_len]); + } + } else { + for (dst, new) in new_buf.chunks_exact_mut(new_stride).zip( + src.get_data().chunks(src.get_stride())) { + dst[..new_len].copy_from_slice(&new[..new_len]); + } } self.data = new_buf; self.stride = new_stride; @@ -110,10 +117,11 @@ pub struct AudioConverter { dst_fmt: NAAudioInfo, dst_chmap: NAChannelMap, apts: Option, + resampler: NAResample, } impl AudioConverter { - pub fn new(_sinfo: &NAAudioInfo, dinfo: &NAAudioInfo, dst_chmap: NAChannelMap) -> Self { + pub fn new(sinfo: &NAAudioInfo, dinfo: &NAAudioInfo, dst_chmap: NAChannelMap) -> Self { let ch = usize::from(dinfo.channels); let size = dinfo.block_len * 2; let il = !dinfo.format.planar; @@ -124,15 +132,18 @@ impl AudioConverter { (32, true, _) => AudioDataType::F32(AudioQueue::new(ch, size, il)), _ => AudioDataType::Packed(AudioQueue::new(ch, size, il)), }; + const RESAMPLE_FILTER_ORDER: usize = 16; + let resampler = NAResample::new(sinfo.sample_rate, dinfo, &dst_chmap, RESAMPLE_FILTER_ORDER); Self { queue, dst_fmt: *dinfo, dst_chmap, apts: None, + resampler, } } pub fn queue_frame(&mut self, buf: NABufferType, tinfo: NATimeInfo) -> bool { - let ret = convert_audio_frame(&buf, &self.dst_fmt, &self.dst_chmap); + let ret = self.resampler.convert_audio_frame(&buf); if let Ok(dbuf) = ret { if self.apts.is_none() && tinfo.get_pts().is_some() { self.apts = tinfo.get_pts();