]> git.nihav.org Git - nihav.git/commitdiff
mpeg4asp: fix DC prediction calculations
authorKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 27 Jan 2025 17:45:32 +0000 (18:45 +0100)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Mon, 27 Jan 2025 17:45:32 +0000 (18:45 +0100)
nihav-mpeg/src/codecs/mpeg4asp/types.rs

index 73164da1935e28e116000c66629d116150859d36..f76548075bdd0508bedc90841f852378166538d4 100644 (file)
@@ -288,19 +288,19 @@ impl PredState {
             0..=3 => {
                 let cur_addr = mb_x * 2 + (n & 1) + (n / 2) * self.y_dc.stride;
                 let (diff, dir) = Self::dc_pred(&self.y_dc, cur_addr);
-                let dc = ((cur_dc + diff / i16::from(dc_scale)) * i16::from(dc_scale)).max(-2048).min(2047);
+                let dc = ((cur_dc + (diff + i16::from(dc_scale >> 1)) / i16::from(dc_scale)) * i16::from(dc_scale)).max(-2048).min(2047);
                 self.y_dc.data[self.y_dc.xpos + cur_addr] = dc;
                 (dc, dir)
             },
             4 => {
                 let (diff, dir) = Self::dc_pred(&self.u_dc, mb_x);
-                let dc = ((cur_dc + diff / i16::from(dc_scale)) * i16::from(dc_scale)).max(-2048).min(2047);
+                let dc = ((cur_dc + (diff + i16::from(dc_scale >> 1)) / i16::from(dc_scale)) * i16::from(dc_scale)).max(-2048).min(2047);
                 self.u_dc.data[self.u_dc.xpos + mb_x] = dc;
                 (dc, dir)
             },
             5 => {
                 let (diff, dir) = Self::dc_pred(&self.v_dc, mb_x);
-                let dc = ((cur_dc + diff / i16::from(dc_scale)) * i16::from(dc_scale)).max(-2048).min(2047);
+                let dc = ((cur_dc + (diff + i16::from(dc_scale >> 1)) / i16::from(dc_scale)) * i16::from(dc_scale)).max(-2048).min(2047);
                 self.v_dc.data[self.v_dc.xpos + mb_x] = dc;
                 (dc, dir)
             },