aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2020-07-17 14:15:36 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2020-07-17 14:15:36 +0200
commitf65c6fb45c243e937e06b17f2d22aadb61349bd7 (patch)
tree747548ad7b600c03015c772fa5cc4fa19f78d91c
parentc39708928eaa7eeb53e4b243cb5c18ea6013d82d (diff)
downloadnihav-f65c6fb45c243e937e06b17f2d22aadb61349bd7.tar.gz
on2avc: factor out common overlap code
-rw-r--r--nihav-duck/src/codecs/on2avc.rs80
1 files changed, 23 insertions, 57 deletions
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];
+ }
+ }
}
}