]> git.sesse.net Git - narabu/blobdiff - qdc.cpp
Predict DC across the entire slice instead of resetting each row. Opens up for slices...
[narabu] / qdc.cpp
diff --git a/qdc.cpp b/qdc.cpp
index 556a8a5d541315a54d6bddf332cdd746a5c1769a..f1ff2542575f866ae4de3c063b2c57acac1586f3 100644 (file)
--- a/qdc.cpp
+++ b/qdc.cpp
@@ -719,16 +719,35 @@ int main(int argc, char **argv)
                chroma_energy / (WIDTH * HEIGHT), chroma_energy_pred / (WIDTH * HEIGHT));
 #endif
 
-       // DC coefficient pred from the right to left
-       for (unsigned yb = 0; yb < HEIGHT; yb += 8) {
-               for (unsigned xb = 0; xb < WIDTH - 8; xb += 8) {
-                       coeff_y[yb * WIDTH + xb] -= coeff_y[yb * WIDTH + (xb + 8)];
+       // DC coefficient pred from the right to left (within each slice)
+       for (unsigned block_idx = 0; block_idx < NUM_BLOCKS; block_idx += 320) {
+               int prev_k = 0;
+
+               for (unsigned subblock_idx = 320; subblock_idx --> 0; ) {
+                       unsigned yb = (block_idx + subblock_idx) / WIDTH_BLOCKS;
+                       unsigned xb = (block_idx + subblock_idx) % WIDTH_BLOCKS;
+                       int k = coeff_y[(yb * 8) * WIDTH + (xb * 8)];
+
+                       coeff_y[(yb * 8) * WIDTH + (xb * 8)] = k - prev_k;
+
+                       prev_k = k;
                }
        }
-       for (unsigned yb = 0; yb < HEIGHT; yb += 8) {
-               for (unsigned xb = 0; xb < WIDTH/2 - 8; xb += 8) {
-                       coeff_cb[yb * WIDTH/2 + xb] -= coeff_cb[yb * WIDTH/2 + (xb + 8)];
-                       coeff_cr[yb * WIDTH/2 + xb] -= coeff_cr[yb * WIDTH/2 + (xb + 8)];
+       for (unsigned block_idx = 0; block_idx < NUM_BLOCKS_CHROMA; block_idx += 320) {
+               int prev_k_cb = 0;
+               int prev_k_cr = 0;
+
+               for (unsigned subblock_idx = 320; subblock_idx --> 0; ) {
+                       unsigned yb = (block_idx + subblock_idx) / WIDTH_BLOCKS_CHROMA;
+                       unsigned xb = (block_idx + subblock_idx) % WIDTH_BLOCKS_CHROMA;
+                       int k_cb = coeff_cb[(yb * 8) * WIDTH/2 + (xb * 8)];
+                       int k_cr = coeff_cr[(yb * 8) * WIDTH/2 + (xb * 8)];
+
+                       coeff_cb[(yb * 8) * WIDTH/2 + (xb * 8)] = k_cb - prev_k_cb;
+                       coeff_cr[(yb * 8) * WIDTH/2 + (xb * 8)] = k_cr - prev_k_cr;
+
+                       prev_k_cb = k_cb;
+                       prev_k_cr = k_cr;
                }
        }