From: Kostya Shishkov Date: Fri, 17 Jul 2020 12:15:36 +0000 (+0200) Subject: on2avc: factor out common overlap code X-Git-Url: https://git.nihav.org/?a=commitdiff_plain;h=f65c6fb45c243e937e06b17f2d22aadb61349bd7;p=nihav.git on2avc: factor out common overlap code --- diff --git a/nihav-duck/src/codecs/on2avc.rs b/nihav-duck/src/codecs/on2avc.rs index 59fa8f8..17f2d5e 100644 --- a/nihav-duck/src/codecs/on2avc.rs +++ b/nihav-duck/src/codecs/on2avc.rs @@ -361,17 +361,7 @@ impl AVCDecoder { } }, 2 | 7 => { - self.imdct_long.imdct(coeffs, &mut self.tmp); - for i in 0..SHORT_WIN_POINT0 { - dst[i] = delay[i]; - } - overlap(&mut dst[SHORT_WIN_POINT0..SHORT_WIN_POINT1], - &self.tmp[SHORT_WIN_POINT0..SHORT_WIN_POINT1], - &delay[SHORT_WIN_POINT0..SHORT_WIN_POINT1], AVC_WIN_SHORT); - for i in SHORT_WIN_POINT1..COEFFS { - dst[i] = self.tmp[i - SHORT_WIN_POINT1 + 128]; - } - delay.copy_from_slice(&self.tmp[COEFFS..]); + self.imdct_long.imdct_half(coeffs, &mut self.ew_buf); }, 3 => { for (ain, aout) in coeffs.chunks(128).zip(self.tmp.chunks_mut(256)) { @@ -402,76 +392,52 @@ impl AVCDecoder { for i in 0..SHORT_WIN_POINT1 { delay[i] = self.ew_buf[SHORT_WIN_POINT1 + i]; } - for i in SHORT_WIN_POINT1..COEFFS { - delay[i] = 0.0; + for i in COEFFS/2..COEFFS { + delay[i] = delay[COEFFS - 1 - i]; } }, 4 => { - for i in 0..SHORT_WIN_POINT0 { - dst[i] = delay[i]; - } if !self.use_generic { synth1024(&mut self.dsp, coeffs, &mut self.ew_buf, &mut self.tmp, self.is_40khz); } else { synth_generic(coeffs, &mut self.ew_buf, &mut self.tmp, self.is_40khz, 1024); } - overlap_half(&mut dst[SHORT_WIN_POINT0..SHORT_WIN_POINT1], - &self.ew_buf[0..64], - &delay[SHORT_WIN_POINT0..SHORT_WIN_POINT1], AVC_WIN_SHORT); - for i in SHORT_WIN_POINT1..COEFFS { - dst[i] = self.ew_buf[i - SHORT_WIN_POINT1 + 64]; - } - for i in 0..COEFFS/2 { - delay[i] = self.ew_buf[COEFFS/2 + i]; - } - for i in COEFFS/2..COEFFS { - delay[i] = delay[COEFFS - 1 - i]; - } - }, + }, 5 => { - for i in 0..SHORT_WIN_POINT0 { - dst[i] = delay[i]; - } if !self.use_generic { synth512(&mut self.dsp, coeffs, &mut self.ew_buf, &mut self.tmp, self.is_40khz); } else { synth_generic(coeffs, &mut self.ew_buf, &mut self.tmp, self.is_40khz, 512); } - self.imdct_mid.imdct(&coeffs[512..], &mut self.ew_buf[512..]); - overlap(&mut dst[SHORT_WIN_POINT0..SHORT_WIN_POINT1], - &self.ew_buf[SHORT_WIN_POINT0..SHORT_WIN_POINT1], - &delay[SHORT_WIN_POINT0..SHORT_WIN_POINT1], AVC_WIN_SHORT); - for i in SHORT_WIN_POINT1..COEFFS { - dst[i] = self.ew_buf[i]; - } - *delay = [0.0; COEFFS]; - for i in 0..SHORT_WIN_POINT1 { - delay[i] = self.ew_buf[i]; - } + self.imdct_mid.imdct_half(&coeffs[512..], &mut self.ew_buf[512..]); }, 6 => { - for i in 0..SHORT_WIN_POINT0 { - dst[i] = delay[i]; - } - self.imdct_mid.imdct(coeffs, &mut self.ew_buf); + self.imdct_mid.imdct_half(coeffs, &mut self.ew_buf); if !self.use_generic { synth512(&mut self.dsp, &coeffs[512..], &mut self.ew_buf[512..], &mut self.tmp, self.is_40khz); } else { synth_generic(&coeffs[512..], &mut self.ew_buf[512..], &mut self.tmp, self.is_40khz, 512); } - overlap(&mut dst[SHORT_WIN_POINT0..SHORT_WIN_POINT1], - &self.ew_buf[SHORT_WIN_POINT0..SHORT_WIN_POINT1], - &delay[SHORT_WIN_POINT0..SHORT_WIN_POINT1], AVC_WIN_SHORT); - for i in SHORT_WIN_POINT1..COEFFS { - dst[i] = self.ew_buf[i]; - } - *delay = [0.0; COEFFS]; - for i in 0..SHORT_WIN_POINT1 { - delay[i] = self.ew_buf[i]; - } }, _ => unreachable!(), }; + if (self.cur_win == 2) || (self.cur_win >= 4) { + for i in 0..SHORT_WIN_POINT0 { + dst[i] = delay[i]; + } + overlap_half(&mut dst[SHORT_WIN_POINT0..SHORT_WIN_POINT1], + &self.ew_buf[0..64], + &delay[SHORT_WIN_POINT0..SHORT_WIN_POINT1], AVC_WIN_SHORT); + for i in SHORT_WIN_POINT1..COEFFS { + dst[i] = self.ew_buf[i - SHORT_WIN_POINT1 + 64]; + } + for i in 0..COEFFS/2 { + delay[i] = self.ew_buf[COEFFS/2 + i]; + } + for i in COEFFS/2..COEFFS { + delay[i] = delay[COEFFS - 1 - i]; + } + } } }