aboutsummaryrefslogtreecommitdiff
path: root/indev/psxmdec
diff options
context:
space:
mode:
authorLameguy64 <lameguy64@gmail.com>2021-10-25 10:51:50 +0800
committerLameguy64 <lameguy64@gmail.com>2021-10-25 10:51:50 +0800
commit538f28cfbbbb8163ab8a96de77d6887123856c81 (patch)
treea3108f05c038d0f43f2e96ae4d2d34ce4da225b4 /indev/psxmdec
parent7718b576b7aba725455ce510ee9632067a65f0d7 (diff)
downloadpsn00bsdk-538f28cfbbbb8163ab8a96de77d6887123856c81.tar.gz
Added indev directory
Diffstat (limited to 'indev/psxmdec')
-rw-r--r--indev/psxmdec/data.s6
-rw-r--r--indev/psxmdec/main.c191
-rw-r--r--indev/psxmdec/makefile41
-rw-r--r--indev/psxmdec/mdec.s185
-rw-r--r--indev/psxmdec/output.bullschitbin0 -> 43200 bytes
-rw-r--r--indev/psxmdec/table.h102
-rw-r--r--indev/psxmdec/vlc.c305
7 files changed, 830 insertions, 0 deletions
diff --git a/indev/psxmdec/data.s b/indev/psxmdec/data.s
new file mode 100644
index 0000000..adf825a
--- /dev/null
+++ b/indev/psxmdec/data.s
@@ -0,0 +1,6 @@
+.section .data
+
+.global bs_data
+.type bs_data, @object
+bs_data:
+ .incbin "output.bullschit"
diff --git a/indev/psxmdec/main.c b/indev/psxmdec/main.c
new file mode 100644
index 0000000..c9fd678
--- /dev/null
+++ b/indev/psxmdec/main.c
@@ -0,0 +1,191 @@
+#include <sys/types.h>
+#include <stdio.h>
+#include <string.h>
+#include <malloc.h>
+#include <psxgte.h>
+#include <psxgpu.h>
+
+/* mdec.s */
+extern void mdec_reset( void );
+extern void mdec_setscale( void );
+extern void mdec_setquants( void );
+extern void mdec_cmd( unsigned int cmd );
+extern void mdec_in( void *src, int blocks );
+extern void mdec_out( void *dst, int blocks );
+
+/* vlc.c */
+int DecDCTvlc( unsigned short *mdec_bs, unsigned short *mdec_rl );
+
+/* data.s */
+extern unsigned short bs_data[];
+
+DISPENV disp[2];
+DRAWENV draw[2];
+int db;
+
+void memory_browser(unsigned int addr)
+{
+ int i,j,key;
+ unsigned char *ptr,*pptr;
+
+ while(1)
+ {
+ /* Set cursor position to top-left */
+ printf("\033[1;1H");
+ printf("MEMVIEW 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF");
+
+ ptr = (unsigned char*)addr;
+
+ /* Print contents from current location of memory */
+ for(j=0; j<23; j++)
+ {
+ printf("\n%04X: ", (unsigned int)ptr);
+ pptr = ptr;
+ for(i=0; i<16; i++)
+ {
+ printf("%02X ", *ptr);
+ ptr++;
+ }
+ printf(" ");
+ for(i=0; i<16; i++)
+ {
+ if(( *pptr < 32 ) || ( *pptr > 127 ) )
+ {
+ printf(".");
+ }
+ else
+ {
+ printf("%c", *pptr);
+ }
+ pptr++;
+ }
+ }
+
+ /* Parse input */
+ while(1)
+ {
+ key = getchar();
+ if( key == 0x1B )
+ {
+ key = getchar();
+
+ if( key == 0x5B )
+ {
+ key = getchar();
+ if( key == 0x41 ) // Up
+ {
+ addr -= 16;
+ break;
+ }
+ else if( key == 0x42 ) // Down
+ {
+ addr += 16;
+ break;
+ }
+ if( key == 0x35 ) // Page up
+ {
+ addr -= 16*23;
+ break;
+ }
+ else if( key == 0x36 ) // Page down
+ {
+ addr += 16*23;
+ break;
+ }
+ }
+ }
+
+ }
+ }
+
+} /* memory_browser */
+
+void init( void )
+{
+ ResetGraph( 0 );
+
+ SetDefDispEnv( &disp[0], 0, 0, 320, 240 );
+ SetDefDispEnv( &disp[1], 0, 240, 320, 240 );
+
+ SetDefDrawEnv( &draw[0], 0, 240, 320, 240 );
+ SetDefDrawEnv( &draw[1], 0, 0, 320, 240 );
+
+ draw[0].isbg = draw[1].isbg = 1;
+ setRGB0( &draw[0], 0, 63, 0 );
+ setRGB0( &draw[1], 0, 63, 0 );
+
+ PutDispEnv( &disp[1] );
+ PutDrawEnv( &draw[1] );
+ db = 0;
+
+} /* init */
+
+void display( void )
+{
+ DrawSync( 0 );
+ VSync( 0 );
+
+ PutDispEnv( &disp[db] );
+ PutDrawEnv( &draw[db] );
+ SetDispMask( 1 );
+
+ db = !db;
+
+} /* display */
+
+void decode_test( void )
+{
+ unsigned short *out_buff;
+ unsigned short *dec_buff;
+ int dec_len;
+ RECT rect;
+ int xx;
+
+ out_buff = (unsigned short*)malloc( 131072 );
+ dec_buff = (unsigned short*)malloc( 7680 );
+
+ memset( out_buff, 0, 131072 );
+ DecDCTvlc( bs_data, out_buff );
+
+ dec_len = ((unsigned short*)out_buff)[0];
+
+ printf( "out_buff=%p len=%d\n", out_buff, dec_len );
+
+ //memory_browser( (unsigned int)(out_buff+2) );
+ mdec_cmd( 0x38000000|dec_len );
+
+ mdec_in( out_buff+2, 8 );
+
+ rect.x = 320; rect.y = 0;
+ rect.w = 16; rect.h = 240;
+ xx = 0;
+ //while( xx < 320 )
+ {
+ mdec_out( dec_buff, 120 );
+ LoadImage( &rect, (unsigned int*)dec_buff );
+ DrawSync( 0 );
+ xx += 16;
+ rect.x += 16;
+ }
+
+} /* decode_test */
+
+int main( int argc, const char *argv[] )
+{
+ init();
+
+ /* init MDEC */
+ mdec_reset();
+ mdec_setscale();
+ mdec_setquants();
+
+ decode_test();
+
+ while( 1 )
+ {
+ display();
+ }
+
+ return( 0 );
+
+} /* main */
diff --git a/indev/psxmdec/makefile b/indev/psxmdec/makefile
new file mode 100644
index 0000000..3b921e0
--- /dev/null
+++ b/indev/psxmdec/makefile
@@ -0,0 +1,41 @@
+include ../../psn00bsdk-setup.mk
+
+TARGET = mdectest.elf
+
+CFILES = $(notdir $(wildcard *.c))
+CPPFILES = $(notdir $(wildcard *.cpp))
+AFILES = $(notdir $(wildcard *.s))
+
+OFILES = $(addprefix build/,$(CFILES:.c=.o)) \
+ $(addprefix build/,$(CPPFILES:.cpp=.o)) \
+ $(addprefix build/,$(AFILES:.s=.o))
+
+LIBS = -lpsxgpu -lpsxgte -lpsxspu -lpsxetc -lpsxapi -lc
+
+CFLAGS = -g -O2 -fno-builtin -fdata-sections -ffunction-sections
+
+CPPFLAGS = $(CFLAGS) -fno-exceptions
+
+AFLAGS = -g -msoft-float
+
+LDFLAGS = -g -Ttext=0x80010000 -gc-sections \
+ -T $(GCC_BASE)/mipsel-unknown-elf/lib/ldscripts/elf32elmip.x
+
+all: $(OFILES)
+ $(LD) $(LDFLAGS) $(LIBDIRS) $(OFILES) $(LIBS) -o $(TARGET)
+ elf2x -q $(TARGET)
+
+build/%.o: %.c
+ @mkdir -p $(dir $@)
+ $(CC) $(CFLAGS) $(INCLUDE) -c $< -o $@
+
+build/%.o: %.cpp
+ @mkdir -p $(dir $@)
+ $(CXX) $(AFLAGS) $(INCLUDE) -c $< -o $@
+
+build/%.o: %.s
+ @mkdir -p $(dir $@)
+ $(CC) $(AFLAGS) $(INCLUDE) -c $< -o $@
+
+clean:
+ rm -rf build $(TARGET) $(TARGET:.elf=.exe) \ No newline at end of file
diff --git a/indev/psxmdec/mdec.s b/indev/psxmdec/mdec.s
new file mode 100644
index 0000000..a7b5094
--- /dev/null
+++ b/indev/psxmdec/mdec.s
@@ -0,0 +1,185 @@
+.set noreorder
+
+.include "hwregs_a.h"
+
+.section .text
+
+.global mdec_reset # Resets the MDEC
+.type mdec_reset, @function
+mdec_reset:
+
+ lui $a0, IOBASE
+
+ lui $v0, 0xE000 # Reset MDEC
+ sw $v0, MDEC1($a0)
+ nop
+
+ lui $v1, 0x8004 # Wait until reset completes
+.Lreset_wait:
+ lw $v0, MDEC1($a0)
+ nop
+ bne $v0, $v1, .Lreset_wait
+ nop
+
+ jr $ra
+ nop
+
+
+.global mdec_cmd # Sends a MDEC command word
+.type mdec_cmd, @function
+mdec_cmd:
+
+ lui $a1, IOBASE
+
+.Lcmd_ready: # Wait until command busy is zero
+ lw $v0, MDEC1($a1)
+ lui $v1, 0x2000
+ and $v0, $v1
+ bnez $v0, .Lcmd_ready
+ nop
+
+ sw $a0, MDEC0($a1) # Write command word
+
+ jr $ra
+ nop
+
+.global mdec_in # Transmit data to DMA0 (MDEC in)
+.type mdec_in, @function
+mdec_in:
+
+ # a0 - data source address
+ # a1 - blocks to transfer (64 bytes per block)
+
+ lui $a3, IOBASE
+
+.Lmdec_in_wait: # Wait until MDEC is ready for data
+ lw $v0, MDEC1($a3)
+ lui $v1, 0x1000
+ and $v0, $v1
+ beqz $v0, .Lmdec_in_wait
+ nop
+
+ sw $a0, D0_MADR($a3) # Set source address
+
+ andi $v0, $a1, 0xFFFF # Set transfer length
+ sll $v0, 16
+ ori $v0, 0x20 # 32 word block size
+ sw $v0, D0_BCR($a3)
+
+ lui $v0, 0x0100 # Begin transfer
+ ori $v0, 0x0201
+ sw $v0, D0_CHCR($a3)
+
+ jr $ra
+ nop
+
+.global mdec_out # Transmit data to DMA0 (MDEC in)
+.type mdec_out, @function
+mdec_out:
+
+ # a0 - data source address
+ # a1 - blocks to transfer (64 bytes per block)
+
+ lui $a3, IOBASE
+
+.Lmdec_out_ready: # Wait until MDEC is ready for data
+ lw $v0, MDEC1($a3)
+ lui $v1, 0x1000
+ and $v0, $v1
+ beqz $v0, .Lmdec_out_ready
+ nop
+
+ sw $a0, D1_MADR($a3) # Set source address
+
+ andi $v0, $a1, 0xFFFF # Set transfer length
+ sll $v0, 16
+ ori $v0, 0x20 # 32 word block size
+ sw $v0, D1_BCR($a3)
+
+ lui $v0, 0x0100 # Begin transfer
+ ori $v0, 0x0200
+ sw $v0, D1_CHCR($a3)
+
+.Lmdec_out_wait:
+ lw $v0, D1_CHCR($a3)
+ lui $v1, 0x0200
+ and $v0, $v1
+ bnez $v0, .Lmdec_out_wait
+ nop
+
+ jr $ra
+ nop
+
+.global mdec_setscale # Uploads the internal scaletable to MDEC
+.type mdec_setscale, @function
+mdec_setscale:
+
+ addiu $sp, -4
+ sw $ra, 0($sp)
+
+ lui $a0, 0x6000 # Set scaletable command
+ jal mdec_cmd
+ nop
+
+ la $a0, _mdec_scaletable # Upload scaletable
+ jal mdec_in
+ li $a1, 1 # 64 halfwords
+
+ lw $ra, 0($sp)
+ addiu $sp, 4
+ jr $ra
+ nop
+
+
+.global mdec_setquants # Uploads the internal quant tables
+.type mdec_setquants, @function
+mdec_setquants:
+
+ addiu $sp, -4
+ sw $ra, 0($sp)
+
+ lui $a0, 0x4000 # Set quant tables command
+ ori $a0, 0x0001 # luma + chroma data
+ jal mdec_cmd
+ nop
+
+ la $a0, _mdec_qtables # Upload quant tables
+ jal mdec_in
+ li $a1, 2 # 128 halfwords
+
+ lw $ra, 0($sp)
+ addiu $sp, 4
+ jr $ra
+ nop
+
+
+.section .data
+
+_mdec_qtables:
+ # taken from CCITT Rec. T.81
+ .hword 16, 11, 10, 16, 24, 40, 51, 61 # Luma table
+ .hword 12, 12, 14, 19, 26, 58, 60, 55
+ .hword 14, 13, 16, 24, 40, 57, 69, 56
+ .hword 14, 17, 22, 29, 51, 87, 80, 62
+ .hword 18, 22, 37, 56, 68, 109, 103, 77
+ .hword 24, 35, 55, 64, 81, 104, 113, 92
+ .hword 49, 64, 78, 87, 103, 121, 120, 101
+ .hword 72, 92, 95, 98, 112, 100, 103, 99
+ .hword 17, 18, 24, 47, 99, 99, 99, 99 # Chroma table
+ .hword 18, 21, 26, 66, 99, 99, 99, 99
+ .hword 24, 26, 56, 99, 99, 99, 99, 99
+ .hword 47, 66, 99, 99, 99, 99, 99, 99
+ .hword 99, 99, 99, 99, 99, 99, 99, 99
+ .hword 99, 99, 99, 99, 99, 99, 99, 99
+ .hword 99, 99, 99, 99, 99, 99, 99, 99
+ .hword 99, 99, 99, 99, 99, 99, 99, 99
+
+_mdec_scaletable:
+ .hword 0x5A82,0x5A82,0x5A82,0x5A82,0x5A82,0x5A82,0x5A82,0x5A82
+ .hword 0x7D8A,0x6A6D,0x471C,0x18F8,0xE707,0xB8E3,0x9592,0x8275
+ .hword 0x7641,0x30FB,0xCF04,0x89BE,0x89BE,0xCF04,0x30FB,0x7641
+ .hword 0x6A6D,0xE707,0x8275,0xB8E3,0x471C,0x7D8A,0x18F8,0x9592
+ .hword 0x5A82,0xA57D,0xA57D,0x5A82,0x5A82,0xA57D,0xA57D,0x5A82
+ .hword 0x471C,0x8275,0x18F8,0x6A6D,0x9592,0xE707,0x7D8A,0xB8E3
+ .hword 0x30FB,0x89BE,0x7641,0xCF04,0xCF04,0x7641,0x89BE,0x30FB
+ .hword 0x18F8,0xB8E3,0x6A6D,0x8275,0x7D8A,0x9592,0x471C,0xE707
diff --git a/indev/psxmdec/output.bullschit b/indev/psxmdec/output.bullschit
new file mode 100644
index 0000000..4229da0
--- /dev/null
+++ b/indev/psxmdec/output.bullschit
Binary files differ
diff --git a/indev/psxmdec/table.h b/indev/psxmdec/table.h
new file mode 100644
index 0000000..3e50b18
--- /dev/null
+++ b/indev/psxmdec/table.h
@@ -0,0 +1,102 @@
+const static huff_t table0[]={
+ {6,3},{8,5},{10,6},{12,8},{76,9},{66,9},{20,11},{58,13},{48,13},{38,13},{32,13},{52,14},{50,14},{48,14},{46,14},{62,15},{60,15},{58,15},{56,15},{54,15},{52,15},{50,15},{48,15},{46,15},{44,15},{42,15},{40,15},{38,15},{36,15},{34,15},{32,15},{48,16},{46,16},{44,16},{42,16},{40,16},{38,16},{36,16},{34,16},{32,16},
+};
+const static huff_t table1[]={
+ {6,4},{12,7},{74,9},{24,11},{54,13},{44,14},{42,14},{62,16},{60,16},{58,16},{56,16},{54,16},{52,16},{50,16},{38,17},{36,17},{34,17},{32,17},
+};
+const static huff_t table2[]={
+ {10,5},{8,8},{22,11},{40,13},{40,14},
+};
+const static huff_t table3[]={
+ {14,6},{72,9},{56,13},{38,14},
+};
+const static huff_t table4[]={
+ {12,6},{30,11},{36,13},
+};
+const static huff_t table5[]={
+ {14,7},{18,11},{36,14},
+};
+const static huff_t table6[]={
+ {10,7},{60,13},{40,17},
+};
+const static huff_t table7[]={
+ {8,7},{42,13},
+};
+const static huff_t table8[]={
+ {14,8},{34,13},
+};
+const static huff_t table9[]={
+ {10,8},{34,14},
+};
+const static huff_t table10[]={
+ {78,9},{32,14},
+};
+const static huff_t table11[]={
+ {70,9},{52,17},
+};
+const static huff_t table12[]={
+ {68,9},{50,17},
+};
+const static huff_t table13[]={
+ {64,9},{48,17},
+};
+const static huff_t table14[]={
+ {28,11},{46,17},
+};
+const static huff_t table15[]={
+ {26,11},{44,17},
+};
+const static huff_t table16[]={
+ {16,11},{42,17},
+};
+const static huff_t table17[]={
+ {62,13},
+};
+const static huff_t table18[]={
+ {52,13},
+};
+const static huff_t table19[]={
+ {50,13},
+};
+const static huff_t table20[]={
+ {46,13},
+};
+const static huff_t table21[]={
+ {44,13},
+};
+const static huff_t table22[]={
+ {62,14},
+};
+const static huff_t table23[]={
+ {60,14},
+};
+const static huff_t table24[]={
+ {58,14},
+};
+const static huff_t table25[]={
+ {56,14},
+};
+const static huff_t table26[]={
+ {54,14},
+};
+const static huff_t table27[]={
+ {62,17},
+};
+const static huff_t table28[]={
+ {60,17},
+};
+const static huff_t table29[]={
+ {58,17},
+};
+const static huff_t table30[]={
+ {56,17},
+};
+const static huff_t table31[]={
+ {54,17},
+};
+const static huff_t *huff_table[]={
+ table0,table1,table2,table3,table4,table5,table6,table7,table8,table9,table10,table11,table12,table13,table14,table15,table16,table17,table18,table19,table20,table21,table22,table23,table24,table25,table26,table27,table28,table29,table30,table31,
+};
+const static int maxlevel[]={
+ 40,18,5,4,3,3,3,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
+};
diff --git a/indev/psxmdec/vlc.c b/indev/psxmdec/vlc.c
new file mode 100644
index 0000000..bc64a12
--- /dev/null
+++ b/indev/psxmdec/vlc.c
@@ -0,0 +1,305 @@
+#include <sys/types.h>
+
+typedef unsigned short Uint16;
+typedef unsigned int Uint32;
+
+typedef struct {
+ unsigned int code,nbits;
+} huff_t;
+
+#include "table.h"
+
+#define CODE1(a,b,c) (((a)<<10)|((b)&0x3ff)|((c)<<16))
+/* run, level, bit */
+#define CODE(a,b,c) CODE1(a,b,c+1),CODE1(a,-b,c+1)
+#define CODE0(a,b,c) CODE1(a,b,c),CODE1(a,b,c)
+#define CODE2(a,b,c) CODE1(a,b,c+1),CODE1(a,b,c+1)
+#define RUNOF(a) ((a)>>10)
+#define VALOF(a) ((short)((a)<<6)>>6)
+#define BITOF(a) ((a)>>16)
+#define EOB 0xfe00
+#define ESCAPE_CODE CODE1(63,0,6)
+#define EOB_CODE CODE1(63,512,2)
+
+/*
+ DC code
+ Y U,V
+0 100 00 0
+1 00x 01x -1,1
+2 01xx 10xx -3,-2,2,3
+3 101xxx 110xxx -7..-4,4..7
+4 110xxxx 1110 -15..-8,8..15
+5 1110xxxxx 11110 -31..-16,16..31
+6 11110xxxxxx 111110 -63..-32,32..63
+7 111110 1111110 -127..-64,64..127
+8 1111110 11111110 -255..-128,128..255
+ 7+8 8+8
+*/
+
+/*
+ This table based on MPEG2DEC by MPEG Software Simulation Group
+*/
+
+/* Table B-14, DCT coefficients table zero,
+* codes 0100 ... 1xxx (used for all other coefficients)
+*/
+static const Uint32 VLCtabnext[12*2] = {
+ CODE(0,2,4), CODE(2,1,4), CODE2(1,1,3), CODE2(1,-1,3),
+ CODE0(63,512,2), CODE0(63,512,2), CODE0(63,512,2), CODE0(63,512,2), /*EOB*/
+ CODE2(0,1,2), CODE2(0,1,2), CODE2(0,-1,2), CODE2(0,-1,2)
+};
+
+/* Table B-14, DCT coefficients table zero,
+* codes 000001xx ... 00111xxx
+*/
+static const Uint32 VLCtab0[60*2] = {
+ CODE0(63,0,6), CODE0(63,0,6),CODE0(63,0,6), CODE0(63,0,6), /* ESCAPE */
+ CODE2(2,2,7), CODE2(2,-2,7), CODE2(9,1,7), CODE2(9,-1,7),
+ CODE2(0,4,7), CODE2(0,-4,7), CODE2(8,1,7), CODE2(8,-1,7),
+ CODE2(7,1,6), CODE2(7,1,6), CODE2(7,-1,6), CODE2(7,-1,6),
+ CODE2(6,1,6), CODE2(6,1,6), CODE2(6,-1,6), CODE2(6,-1,6),
+ CODE2(1,2,6), CODE2(1,2,6), CODE2(1,-2,6), CODE2(1,-2,6),
+ CODE2(5,1,6), CODE2(5,1,6), CODE2(5,-1,6), CODE2(5,-1,6),
+ CODE(13,1,8), CODE(0,6,8), CODE(12,1,8), CODE(11,1,8),
+ CODE(3,2,8), CODE(1,3,8), CODE(0,5,8), CODE(10,1,8),
+ CODE2(0,3,5), CODE2(0,3,5), CODE2(0,3,5), CODE2(0,3,5),
+ CODE2(0,-3,5), CODE2(0,-3,5), CODE2(0,-3,5), CODE2(0,-3,5),
+ CODE2(4,1,5), CODE2(4,1,5), CODE2(4,1,5), CODE2(4,1,5),
+ CODE2(4,-1,5), CODE2(4,-1,5), CODE2(4,-1,5), CODE2(4,-1,5),
+ CODE2(3,1,5), CODE2(3,1,5), CODE2(3,1,5), CODE2(3,1,5),
+ CODE2(3,-1,5), CODE2(3,-1,5), CODE2(3,-1,5), CODE2(3,-1,5)
+};
+
+/* Table B-14, DCT coefficients table zero,
+* codes 0000001000 ... 0000001111
+*/
+static const Uint32 VLCtab1[8*2] = {
+ CODE(16,1,10), CODE(5,2,10), CODE(0,7,10), CODE(2,3,10),
+ CODE(1,4,10), CODE(15,1,10), CODE(14,1,10), CODE(4,2,10)
+};
+
+/* Table B-14/15, DCT coefficients table zero / one,
+* codes 000000010000 ... 000000011111
+*/
+static const Uint32 VLCtab2[16*2] = {
+ CODE(0,11,12), CODE(8,2,12), CODE(4,3,12), CODE(0,10,12),
+ CODE(2,4,12), CODE(7,2,12), CODE(21,1,12), CODE(20,1,12),
+ CODE(0,9,12), CODE(19,1,12), CODE(18,1,12), CODE(1,5,12),
+ CODE(3,3,12), CODE(0,8,12), CODE(6,2,12), CODE(17,1,12)
+};
+
+/* Table B-14/15, DCT coefficients table zero / one,
+* codes 0000000010000 ... 0000000011111
+*/
+static const Uint32 VLCtab3[16*2] = {
+ CODE(10,2,13), CODE(9,2,13), CODE(5,3,13), CODE(3,4,13),
+ CODE(2,5,13), CODE(1,7,13), CODE(1,6,13), CODE(0,15,13),
+ CODE(0,14,13), CODE(0,13,13), CODE(0,12,13), CODE(26,1,13),
+ CODE(25,1,13), CODE(24,1,13), CODE(23,1,13), CODE(22,1,13)
+};
+
+/* Table B-14/15, DCT coefficients table zero / one,
+* codes 00000000010000 ... 00000000011111
+*/
+static const Uint32 VLCtab4[16*2] = {
+ CODE(0,31,14), CODE(0,30,14), CODE(0,29,14), CODE(0,28,14),
+ CODE(0,27,14), CODE(0,26,14), CODE(0,25,14), CODE(0,24,14),
+ CODE(0,23,14), CODE(0,22,14), CODE(0,21,14), CODE(0,20,14),
+ CODE(0,19,14), CODE(0,18,14), CODE(0,17,14), CODE(0,16,14)
+};
+
+/* Table B-14/15, DCT coefficients table zero / one,
+* codes 000000000010000 ... 000000000011111
+*/
+static const Uint32 VLCtab5[16*2] = {
+ CODE(0,40,15), CODE(0,39,15), CODE(0,38,15), CODE(0,37,15),
+ CODE(0,36,15), CODE(0,35,15), CODE(0,34,15), CODE(0,33,15),
+ CODE(0,32,15), CODE(1,14,15), CODE(1,13,15), CODE(1,12,15),
+ CODE(1,11,15), CODE(1,10,15), CODE(1,9,15), CODE(1,8,15)
+};
+
+/* Table B-14/15, DCT coefficients table zero / one,
+* codes 0000000000010000 ... 0000000000011111
+*/
+static const Uint32 VLCtab6[16*2] = {
+ CODE(1,18,16), CODE(1,17,16), CODE(1,16,16), CODE(1,15,16),
+ CODE(6,3,16), CODE(16,2,16), CODE(15,2,16), CODE(14,2,16),
+ CODE(13,2,16), CODE(12,2,16), CODE(11,2,16), CODE(31,1,16),
+ CODE(30,1,16), CODE(29,1,16), CODE(28,1,16), CODE(27,1,16)
+};
+
+/*
+ DC code
+ Y U,V
+0 100 00 0
+1 00x 01x -1,1
+2 01xx 10xx -3,-2,2,3
+3 101xxx 110xxx -7..-4,4..7
+4 110xxxx 1110xxxx -15..-8,8..15
+5 1110xxxxx 11110xxxxx -31..-16,16..31
+6 11110xxxxxx 111110xxxxxx -63..-32,32..63
+7 111110xxxxxxx 1111110xxxxxxx -127..-64,64..127
+8 1111110xxxxxxxx 11111110xxxxxxxx -255..-128,128..255
+*/
+
+static const Uint32 DC_Ytab0[48] = {
+ CODE1(0,-1,3),CODE1(0,-1,3),CODE1(0,-1,3),CODE1(0,-1,3),
+ CODE1(0,-1,3),CODE1(0,-1,3),CODE1(0,-1,3),CODE1(0,-1,3),
+ CODE1(0,1,3),CODE1(0,1,3),CODE1(0,1,3),CODE1(0,1,3),
+ CODE1(0,1,3),CODE1(0,1,3),CODE1(0,1,3),CODE1(0,1,3),
+
+ CODE1(0,-3,4),CODE1(0,-3,4),CODE1(0,-3,4),CODE1(0,-3,4),
+ CODE1(0,-2,4),CODE1(0,-2,4),CODE1(0,-2,4),CODE1(0,-2,4),
+ CODE1(0,2,4),CODE1(0,2,4),CODE1(0,2,4),CODE1(0,2,4),
+ CODE1(0,3,4),CODE1(0,3,4),CODE1(0,3,4),CODE1(0,3,4),
+
+ CODE1(0,0,3),CODE1(0,0,3),CODE1(0,0,3),CODE1(0,0,3),
+ CODE1(0,0,3),CODE1(0,0,3),CODE1(0,0,3),CODE1(0,0,3),
+ CODE1(0,-7,6),CODE1(0,-6,6),CODE1(0,-5,6),CODE1(0,-4,6),
+ CODE1(0,4,6),CODE1(0,5,6),CODE1(0,6,6),CODE1(0,7,6),
+
+};
+
+static const Uint32 DC_UVtab0[56] = {
+ CODE1(0,0,2),CODE1(0,0,2),CODE1(0,0,2),CODE1(0,0,2),
+ CODE1(0,0,2),CODE1(0,0,2),CODE1(0,0,2),CODE1(0,0,2),
+ CODE1(0,0,2),CODE1(0,0,2),CODE1(0,0,2),CODE1(0,0,2),
+ CODE1(0,0,2),CODE1(0,0,2),CODE1(0,0,2),CODE1(0,0,2),
+
+ CODE1(0,-1,3),CODE1(0,-1,3),CODE1(0,-1,3),CODE1(0,-1,3),
+ CODE1(0,-1,3),CODE1(0,-1,3),CODE1(0,-1,3),CODE1(0,-1,3),
+ CODE1(0,1,3),CODE1(0,1,3),CODE1(0,1,3),CODE1(0,1,3),
+ CODE1(0,1,3),CODE1(0,1,3),CODE1(0,1,3),CODE1(0,1,3),
+
+ CODE1(0,-3,4),CODE1(0,-3,4),CODE1(0,-3,4),CODE1(0,-3,4),
+ CODE1(0,-2,4),CODE1(0,-2,4),CODE1(0,-2,4),CODE1(0,-2,4),
+ CODE1(0,2,4),CODE1(0,2,4),CODE1(0,2,4),CODE1(0,2,4),
+ CODE1(0,3,4),CODE1(0,3,4),CODE1(0,3,4),CODE1(0,3,4),
+
+ CODE1(0,-7,6),CODE1(0,-6,6),CODE1(0,-5,6),CODE1(0,-4,6),
+ CODE1(0,4,6),CODE1(0,5,6),CODE1(0,6,6),CODE1(0,7,6),
+};
+
+#define DCTSIZE2 64
+
+/* decode one intra coded MPEG-1 block */
+
+#define Show_Bits(N) (bitbuf>>(32-(N)))
+/* 最小有効bit 17 bit*/
+
+#define Flush_Buffer(N) {bitbuf <<=(N);incnt +=(N);while(incnt>=0) {bitbuf |= Get_Word()<<incnt;incnt-=16;}}
+
+#define Init_Buffer() {bitbuf = (mdec_bs[0]<<16)|(mdec_bs[1]);mdec_bs+=2;incnt = -16;}
+
+#define Get_Word() (*mdec_bs++)
+#define Printf printf
+
+int DecDCTvlc(Uint16 *mdec_bs,Uint16 *mdec_rl)
+{
+/* Uint16 *mdec_bs = mdecbs,*mdec_rl = mdecrl */
+ Uint16 *rl_end;
+ Uint32 bitbuf;
+ int incnt; /* 16-有効bit数 x86=char risc = long */
+ int q_code;
+ int type,n;
+ int last_dc[3];
+
+/* BS_HDR Uint16 rlsize,magic,ver,q_scale */
+
+ /* printf("%04x,%04x,",mdec_bs[0],mdec_bs[1]); */
+ *(long*)mdec_rl=*(long*)mdec_bs;
+ mdec_rl+=2;
+ rl_end = mdec_rl+(int)mdec_bs[0]*2;
+ q_code = (mdec_bs[2]<<10); /* code = q */
+ type = mdec_bs[3];
+ mdec_bs+=4;
+
+ Init_Buffer();
+
+ n = 0;
+ last_dc[0]=last_dc[1]=last_dc[2] = 0;
+ while(mdec_rl<rl_end) {
+ Uint32 code2;
+ /* DC */
+ if (type==2) {
+ code2 = Show_Bits(10)|(10<<16); /* DC code */
+ } else {
+ code2 = Show_Bits(6);
+ if (n>=2) {
+ /* Y */
+ if (code2<48) {
+ code2 = DC_Ytab0[code2];
+ code2 = (code2&0xffff0000)|((last_dc[2]+=VALOF(code2)*4)&0x3ff);
+ } else {
+ int nbit,val;
+ int bit = 3;
+ while(Show_Bits(bit)&1) { bit++;}
+ bit++;
+ nbit = bit*2-1;
+ val = Show_Bits(nbit)&((1<<bit)-1);
+ if ((val&(1<<(bit-1)))==0)
+ val -= (1<<bit)-1;
+ val = (last_dc[2]+=val*4);
+ code2 = (nbit<<16) | (val&0x3ff);
+ }
+ /* printf("%d ",last_dc[2]); */
+ } else {
+ /* U,V */
+ if (code2<56) {
+ code2 = DC_UVtab0[code2];
+ code2 = (code2&0xffff0000)|((last_dc[n]+=VALOF(code2)*4)&0x3ff);
+ } else {
+ int nbit,val;
+ int bit = 4;
+ while(Show_Bits(bit)&1) { bit++;}
+ nbit = bit*2;
+ val = Show_Bits(nbit)&((1<<bit)-1);
+ if ((val&(1<<(bit-1)))==0)
+ val -= (1<<bit)-1;
+ val = (last_dc[n]+=val*4);
+ code2 = (nbit<<16) | (val&0x3ff);
+ }
+ /* printf("%d ",last_dc[n]); */
+ }
+ if (++n==6) n=0;
+ }
+ /* printf("%d ",VALOF(code2)); */
+ code2 |= q_code;
+
+ /* AC */
+ while(mdec_rl<rl_end){
+/* Uint32 code; */
+#define code code2
+#define SBIT 17
+ *mdec_rl++=code2;
+ Flush_Buffer(BITOF(code2));
+ code = Show_Bits(SBIT);
+ if (code>=1<<(SBIT- 2)) {
+ code2 = VLCtabnext[(code>>12)-8];
+ if (code2==EOB_CODE) break;
+ }
+ else if (code>=1<<(SBIT- 6)) {
+ code2 = VLCtab0[(code>>8)-8];
+ if (code2==ESCAPE_CODE) {
+ Flush_Buffer(6); /* ESCAPE len */
+ code2 = Show_Bits(16)| (16<<16);
+ }
+ }
+ else if (code>=1<<(SBIT- 7)) code2 = VLCtab1[(code>>6)-16];
+ else if (code>=1<<(SBIT- 8)) code2 = VLCtab2[(code>>4)-32];
+ else if (code>=1<<(SBIT- 9)) code2 = VLCtab3[(code>>3)-32];
+ else if (code>=1<<(SBIT-10)) code2 = VLCtab4[(code>>2)-32];
+ else if (code>=1<<(SBIT-11)) code2 = VLCtab5[(code>>1)-32];
+ else if (code>=1<<(SBIT-12)) code2 = VLCtab6[(code>>0)-32];
+ else {
+ do {
+ *mdec_rl++=EOB;
+ } while(mdec_rl<rl_end);
+ return 0;
+ }
+ }
+ *mdec_rl++=code2; /* EOB code */
+ Flush_Buffer(2); /* EOB bitlen */
+ }
+ return 0;
+} \ No newline at end of file