diff --git a/crates/vp9enc/src/lib.rs b/crates/vp9enc/src/lib.rs index 5f5f209eb..bf24309a9 100644 --- a/crates/vp9enc/src/lib.rs +++ b/crates/vp9enc/src/lib.rs @@ -236,9 +236,13 @@ impl Vp9Encoder { /// samples that are not there. pub fn encode_frame(&mut self, y: &[u8], u: &[u8], v: &[u8], force_key: bool) -> EncodedFrame { let (w, h) = (self.cfg.width.max(1) as usize, self.cfg.height.max(1) as usize); - let chroma = w.div_ceil(2) * h.div_ceil(2); - if y.len() < w * h || u.len() < chroma || v.len() < chroma { - return EncodedFrame { data: vec![], key: false, q_idx: 0, filter_level: 0 }; + let empty = || EncodedFrame { data: vec![], key: false, q_idx: 0, filter_level: 0 }; + // Checked: on 32-bit targets (wasm32) a huge size would wrap to a small one. + let (Some(luma), Some(chroma)) = (w.checked_mul(h), w.div_ceil(2).checked_mul(h.div_ceil(2))) else { + return empty(); + }; + if y.len() < luma || u.len() < chroma || v.len() < chroma { + return empty(); } let key = self.is_key_due(force_key); let qidx = self.pick_qidx(key);