aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Shishkov <kostya.shishkov@gmail.com>2020-07-15 18:23:48 +0200
committerKostya Shishkov <kostya.shishkov@gmail.com>2020-07-15 18:23:48 +0200
commitc39708928eaa7eeb53e4b243cb5c18ea6013d82d (patch)
treed33480a4f871cb236e5f000da85e021f2210279d
parentbae2781b8f255732bbeeb6cf471a5c39282cedf1 (diff)
downloadnihav-c39708928eaa7eeb53e4b243cb5c18ea6013d82d.tar.gz
on2avc: fix scalefactor reading for partially empty band group
-rw-r--r--nihav-duck/src/codecs/on2avc.rs37
1 files changed, 26 insertions, 11 deletions
diff --git a/nihav-duck/src/codecs/on2avc.rs b/nihav-duck/src/codecs/on2avc.rs
index 29ead41..59fa8f8 100644
--- a/nihav-duck/src/codecs/on2avc.rs
+++ b/nihav-duck/src/codecs/on2avc.rs
@@ -210,21 +210,36 @@ impl AVCDecoder {
let mut cur_band = 0;
let mut scale = 0;
let mut first = true;
- for wg in self.win_grp.iter().take(self.windows) {
- if *wg {
+ for wg in 0..self.windows {
+ if self.win_grp[wg] {
for _ in 0..bands {
if self.cbs[cur_band] == 0 {
- self.scales[cur_band] = 0;
- } else {
- if first {
- scale = br.read(7)? as i16;
- first = false
- } else {
- scale += i16::from(br.read_cb(&self.codebooks.scale_cb)?);
- validate!((scale >= 0) && (scale < 128));
+ let mut all_zero = true;
+ let mut band2 = cur_band;
+ for wg2 in wg + 1..self.windows {
+ if self.win_grp[wg2] {
+ break;
+ }
+ band2 += bands;
+ if self.cbs[band2] != 0 {
+ all_zero = false;
+ break;
+ }
+ }
+ if all_zero {
+ self.scales[cur_band] = 0;
+ cur_band += 1;
+ continue;
}
- self.scales[cur_band] = scale as u8;
}
+ if first {
+ scale = br.read(7)? as i16;
+ first = false;
+ } else {
+ scale += i16::from(br.read_cb(&self.codebooks.scale_cb)?);
+ validate!((scale >= 0) && (scale < 128));
+ }
+ self.scales[cur_band] = scale as u8;
cur_band += 1;
}
} else {