X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=qdc.cpp;h=5a4a9d506195586ec9c56d2893621c0f69379233;hb=df875b27feed0684ef6b469ceda368fdbf2a2043;hp=556a8a5d541315a54d6bddf332cdd746a5c1769a;hpb=34138d5b1a1302a7a1050fd46d2fb95c0186140a;p=narabu diff --git a/qdc.cpp b/qdc.cpp index 556a8a5..5a4a9d5 100644 --- 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 = 128; + + 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; } }