ref: 716b378886c95a13f065faf063528d62046fb609
parent: 9ddca2f9ecca955261ce8bba32c6ddc4fcac24e3
author: allkern <lisandroaalarcon@gmail.com>
date: Wed Dec 20 07:50:08 EST 2023
Fix MDEC YCbCr ordering
--- a/psx/dev/mdec.c
+++ b/psx/dev/mdec.c
@@ -116,6 +116,19 @@
return src;
}
+// for y=0 to 7
+// for x=0 to 7
+// R=[Crblk+((x+xx)/2)+((y+yy)/2)*8], B=[Cbblk+((x+xx)/2)+((y+yy)/2)*8]
+// G=(-0.3437*B)+(-0.7143*R), R=(1.402*R), B=(1.772*B)
+// Y=[Yblk+(x)+(y)*8]
+// R=MinMax(-128,127,(Y+R))
+// G=MinMax(-128,127,(Y+G))
+// B=MinMax(-128,127,(Y+B))
+// if unsigned then BGR=BGR xor 808080h ;aka add 128 to the R,G,B values
+// dst[(x+xx)+(y+yy)*16]=BGR
+// next x
+// next y
+
void yuv_to_rgb(psx_mdec_t* mdec, uint8_t* buf, int xx, int yy) { for (int y = 0; y < 8; y++) { for (int x = 0; x < 8; x++) {@@ -206,9 +219,9 @@
in = rl_decode_block(mdec->yblk, in, mdec->y_quant_table, mdec->scale_table);
yuv_to_rgb(mdec, &mdec->output[(block_count * size) - block_size], 0, 0);
in = rl_decode_block(mdec->yblk, in, mdec->y_quant_table, mdec->scale_table);
- yuv_to_rgb(mdec, &mdec->output[(block_count * size) - block_size], 0, 8);
- in = rl_decode_block(mdec->yblk, in, mdec->y_quant_table, mdec->scale_table);
yuv_to_rgb(mdec, &mdec->output[(block_count * size) - block_size], 8, 0);
+ in = rl_decode_block(mdec->yblk, in, mdec->y_quant_table, mdec->scale_table);
+ yuv_to_rgb(mdec, &mdec->output[(block_count * size) - block_size], 0, 8);
in = rl_decode_block(mdec->yblk, in, mdec->y_quant_table, mdec->scale_table);
yuv_to_rgb(mdec, &mdec->output[(block_count * size) - block_size], 8, 8);
--
⑨