From 66e0d1f5bc30c8d1f4619862cbe3c954ea0cd3eb Mon Sep 17 00:00:00 2001 From: minjaesong Date: Tue, 19 Aug 2025 22:54:18 +0900 Subject: [PATCH] working INTER frame decoding --- tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt | 5 +++-- video_encoder/encoder_tev.c | 9 ++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt b/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt index 858e531..5d7abd4 100644 --- a/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt +++ b/tsvm_core/src/net/torvald/tsvm/GraphicsJSR223Delegate.kt @@ -1933,8 +1933,9 @@ class GraphicsJSR223Delegate(private val vm: VM) { mcY = 128 } - // Add Y residual - finalY[pixelIdx] = (mcY + yResidual[pixelIdx]).coerceIn(0, 255) + // Add Y residual (subtract 128 bias added by IDCT) + val residual = yResidual[pixelIdx] - 128 + finalY[pixelIdx] = (mcY + residual).coerceIn(0, 255) } } } diff --git a/video_encoder/encoder_tev.c b/video_encoder/encoder_tev.c index 621e9e3..260c926 100644 --- a/video_encoder/encoder_tev.c +++ b/video_encoder/encoder_tev.c @@ -613,13 +613,16 @@ static void compute_motion_residual(tev_encoder_t *enc, int block_x, int block_y ref_y, ref_co, ref_cg); // Compute residuals: current - motion_compensated_reference + // Both current and reference Y should be centered around 0 for proper residual DCT for (int i = 0; i < 256; i++) { - enc->y_workspace[i] = (int)enc->y_workspace[i] - (int)ref_y[i]; + float ref_y_centered = (float)ref_y[i] - 128.0f; // Convert ref to centered like current + enc->y_workspace[i] = enc->y_workspace[i] - ref_y_centered; } + // Chroma residuals (already centered in both current and reference) for (int i = 0; i < 64; i++) { - enc->co_workspace[i] = (int)enc->co_workspace[i] - (int)ref_co[i]; - enc->cg_workspace[i] = (int)enc->cg_workspace[i] - (int)ref_cg[i]; + enc->co_workspace[i] = enc->co_workspace[i] - (float)ref_co[i]; + enc->cg_workspace[i] = enc->cg_workspace[i] - (float)ref_cg[i]; } }