From 50f0dd331f8168fb5b2cd60c70178fad627b7fb6 Mon Sep 17 00:00:00 2001 From: pixel Date: Sat, 27 Nov 2004 21:44:15 +0000 Subject: Large dos2unix commit... --- psxdev/bs.c | 698 +++++++++++++++--------------- psxdev/bs.h | 188 ++++----- psxdev/common.h | 98 ++--- psxdev/idctfst.c | 574 ++++++++++++------------- psxdev/jfdctint.c | 582 ++++++++++++------------- psxdev/table.h | 204 ++++----- psxdev/vlc.c | 1212 ++++++++++++++++++++++++++--------------------------- psxdev/xadecode.c | 604 +++++++++++++------------- psxdev/xadecode.h | 184 ++++---- 9 files changed, 2172 insertions(+), 2172 deletions(-) (limited to 'psxdev') diff --git a/psxdev/bs.c b/psxdev/bs.c index a79a877..e7c3526 100644 --- a/psxdev/bs.c +++ b/psxdev/bs.c @@ -1,349 +1,349 @@ -/* - (c)2000 by BERO bero@geocities.co.jp - - under GPL - - some changes by dbalster@psxdev.de - - - all globals now in a context (to use it as shlib) - - removed debugging printfs -*/ - -typedef struct { -/* bit i/o */ - unsigned int bitbuf; - int bitcount,bs_size,totalbit; - unsigned short *bsbuf; -/* huffman */ - int last_dc[3]; - int _type; - int rlsize; - const unsigned char *iqtab; -} bs_context_t; - -#include -#include "bs.h" -#include "common.h" - -/* static const char *copyright = N_("Copyright (C) 2000 by Daniel Balster "); */ - -enum {B,G,R}; -typedef int BLOCK; - -#define DCTSIZE2 64 -#define RGB2Y(r,g,b) ( 0.299*(r) + 0.587*(g) + 0.114*(b) ) -#define RGB2Cb(r,g,b) ( -0.16874*(r) - 0.33126*(g) +0.5*(b) ) -#define RGB2Cr(r,g,b) ( 0.5*(r) - 0.41869*(g) - 0.08131*(b) ) - -/* -16x16 RGB -> 8x8 Cb,Cr,Y0,Y1,Y2,Y3 - -[Y0][Y1] [Cb] [Cr] -[Y2][Y3] -*/ -#define Cb 0 -#define Cr DCTSIZE2 - -static void rgb2yuv (unsigned char image[][3], BLOCK *blk) -{ - int x,y,i; - int tmpblk[16*16][3],(*yuv)[3]; - BLOCK *yblk; - - yuv=tmpblk; - for(i=0;i<16*16;i++) { - yuv[0][0] = RGB2Y (image[0][R],image[0][G],image[0][B])-128; - yuv[0][1] = RGB2Cb(image[0][R],image[0][G],image[0][B]); - yuv[0][2] = RGB2Cr(image[0][R],image[0][G],image[0][B]); - yuv++; image++; - } - - yuv = tmpblk; - yblk = blk+DCTSIZE2*2; - for(y=0;y<16;y+=2,blk+=4,yblk+=8,yuv+=8+16) { - if (y==8) yblk+=DCTSIZE2; - for(x=0;x<4;x++,blk++,yblk+=2,yuv+=2) { - blk[Cb] = (yuv[0][1]+yuv[1][1]+yuv[16][1]+yuv[17][1])/4; - blk[Cr] = (yuv[0][2]+yuv[1][2]+yuv[16][2]+yuv[17][2])/4; - yblk[0] = yuv[ 0][0]; - yblk[1] = yuv[ 1][0]; - yblk[8] = yuv[16][0]; - yblk[9] = yuv[17][0]; - - blk[4+Cb] = (yuv[8+0][1]+yuv[8+1][1]+yuv[8+16][1]+yuv[8+17][1])/4; - blk[4+Cr] = (yuv[8+0][2]+yuv[8+1][2]+yuv[8+16][2]+yuv[8+17][2])/4; - yblk[DCTSIZE2+0] = yuv[8+ 0][0]; - yblk[DCTSIZE2+1] = yuv[8+ 1][0]; - yblk[DCTSIZE2+8] = yuv[8+16][0]; - yblk[DCTSIZE2+9] = yuv[8+17][0]; - } - } -} - -#undef Cb -#undef Cr - -/* bit i/o */ -#define BITBUFSIZE 16 -#define WriteWord(x) ctxt->bsbuf[ctxt->bs_size++]=(x) - -static void putbits_init (bs_context_t *ctxt) -{ - ctxt->bitbuf = 0; - ctxt->bitcount = BITBUFSIZE; - ctxt->bs_size = 0; - ctxt->totalbit = 0; -} - -static void putbits_flush (bs_context_t *ctxt) -{ - WriteWord(ctxt->bitbuf); -} - -static void putbits (bs_context_t *ctxt, unsigned int x, unsigned int n) -{ - ctxt->totalbit+=n; - - if (nbitcount) { - ctxt->bitcount-=n; - ctxt->bitbuf |= x << ctxt->bitcount; - } else { - n-=ctxt->bitcount; - WriteWord(ctxt->bitbuf | (x>>n) ); - if (nbitcount = BITBUFSIZE-n; - } else { - WriteWord( x>>(n-BITBUFSIZE) ); - ctxt->bitcount = BITBUFSIZE*2-n; - } - ctxt->bitbuf = x << ctxt->bitcount; - } -} - -typedef struct { - unsigned int code,nbits; -} huff_t; - -const static huff_t dc_y_table[] = { - {4,3},{0,2},{1,2},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8} -}; - -const static huff_t dc_c_table[] = { - {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9} -}; - -#include "table.h" - -static void encode_init (bs_context_t *ctxt, void *outbuf, int type, int q_scale) -{ - ctxt->_type = type; - ctxt->last_dc[0] = 0; - ctxt->last_dc[1] = 0; - ctxt->last_dc[2] = 0; - ctxt->rlsize = 0; - putbits_init(ctxt); - - ctxt->bsbuf = outbuf; - ctxt->bsbuf[1] = 0x3800; - ctxt->bsbuf[2] = q_scale; - ctxt->bsbuf[3] = type; - ctxt->bs_size+=4; -} - -static void encode_finish (bs_context_t *ctxt) -{ - putbits_flush(ctxt); - ctxt->bsbuf[0] = (((ctxt->rlsize+1)/2)+31)&~31; -} - -static void encode_dc (bs_context_t *ctxt, int n, int level) -{ - if (ctxt->_type==2) { - putbits(ctxt,level&0x3ff,10); - } else { - const huff_t *table; - int prev,cnt; - - level = level/4; - if (n<2) { - table = dc_c_table; - prev = ctxt->last_dc[n]; - ctxt->last_dc[n] = level; - } else { - table = dc_y_table; - prev = ctxt->last_dc[2]; - ctxt->last_dc[2] = level; - } - level -= prev; - if (level==0) cnt=0; - else { - int alevel = level; - if (alevel<0) alevel=-alevel; - for(cnt=8;(alevel>>cnt)==0;cnt--); - cnt++; - if (level<0) level--; - } - putbits(ctxt,table[cnt].code,table[cnt].nbits); - if (cnt) putbits(ctxt,level&((1<rlsize++; -} - -static void encode_ac (bs_context_t *ctxt, int run, int level) -{ - int abslevel,sign; - if (level>0) { - abslevel = level; - sign = 0; - } else { - abslevel = -level; - sign = 1; - } - if (run<=31 && abslevel<=maxlevel[run]) { - putbits(ctxt,huff_table[run][abslevel-1].code+sign,huff_table[run][abslevel-1].nbits); - } else { - /* ESCAPE */ - putbits(ctxt,1,6); - putbits(ctxt,(run<<10)+(level&0x3ff),16); - } - ctxt->rlsize++; -} - -static void encode_eob (bs_context_t *ctxt) -{ - putbits(ctxt, 2,2); - ctxt->rlsize++; -} - -extern void DCT(BLOCK *blk); - -unsigned char zscan[DCTSIZE2] = { - 0 ,1 ,8 ,16,9 ,2 ,3 ,10, - 17,24,32,25,18,11,4 ,5 , - 12,19,26,33,40,48,41,34, - 27,20,13,6 ,7 ,14,21,28, - 35,42,49,56,57,50,43,36, - 29,22,15,23,30,37,44,51, - 58,59,52,45,38,31,39,46, - 53,60,61,54,47,55,62,63 -}; - -static unsigned char xxx_iqtab[DCTSIZE2] = { - 2,16,19,22,26,27,29,34, - 16,16,22,24,27,29,34,37, - 19,22,26,27,29,34,34,38, - 22,22,26,27,29,34,37,40, - 22,26,27,29,32,35,40,48, - 26,27,29,32,35,40,48,58, - 26,27,29,34,38,46,56,69, - 27,29,35,38,46,56,69,83 -}; - -const unsigned char *bs_iqtab (void) { return xxx_iqtab; } - -static void blk2huff (bs_context_t *ctxt,BLOCK *blk,int q_scale) -{ - int i,k,run,level; - for(i=0;i<6;i++) { - DCT(blk); - for(k=0;k>=3; - level = blk[0]/ctxt->iqtab[0]; - encode_dc(ctxt,i,level); - run = 0; - for(k=1;k<64;k++) { - level = blk[zscan[k]]*8/(ctxt->iqtab[zscan[k]]*q_scale); - if (level==0) { - run++; - } else { - encode_ac(ctxt,run,level); - run=0; - } - } - encode_eob(ctxt); - blk+=DCTSIZE2; - } -} - -Uint8 bs_roundtbl[256*3]; - -void bs_init (void) -{ - int i; - for(i=0;i<256;i++) { - bs_roundtbl [i]=0; - bs_roundtbl [i+256]=i; - bs_roundtbl [i+512]=255; - } -} - -int bs_encode (bs_header_t *outbuf,bs_input_image_t *img,int type,int q_scale, - const unsigned char *myiqtab) -{ - unsigned char image[16][16][3]; - BLOCK blk[6][DCTSIZE2]; - bs_context_t *ctxt = malloc(sizeof(bs_context_t)); - - int x,y,xw,yw,rl; - - ctxt->iqtab = myiqtab ? myiqtab : bs_iqtab(); - - encode_init (ctxt,outbuf,type,q_scale); - - for(x=0;xwidth;x+=16) { - xw = img->width-x; if (xw>16) xw = 16; - for(y=0;yheight;y+=16) { - unsigned char *p0 = img->top + x*(img->bit)/8 + y*img->nextline; - int i,j=0; - yw = img->height-y; if (yw>16) yw = 16; - - /* get 16x16 image */ - - for(i=0;inextline; - switch(img->bit) { - case 16: - for(j=0;j>10)&31)*8; - image[i][j][G] = ((c>>5)&31)*8; - image[i][j][R] = ((c&31))*8; - p+=2; - } - break; - case 24: - for(j=0;jbs_size * 2); - free (ctxt); - - return rl; -} +/* + (c)2000 by BERO bero@geocities.co.jp + + under GPL + + some changes by dbalster@psxdev.de + + - all globals now in a context (to use it as shlib) + - removed debugging printfs +*/ + +typedef struct { +/* bit i/o */ + unsigned int bitbuf; + int bitcount,bs_size,totalbit; + unsigned short *bsbuf; +/* huffman */ + int last_dc[3]; + int _type; + int rlsize; + const unsigned char *iqtab; +} bs_context_t; + +#include +#include "bs.h" +#include "common.h" + +/* static const char *copyright = N_("Copyright (C) 2000 by Daniel Balster "); */ + +enum {B,G,R}; +typedef int BLOCK; + +#define DCTSIZE2 64 +#define RGB2Y(r,g,b) ( 0.299*(r) + 0.587*(g) + 0.114*(b) ) +#define RGB2Cb(r,g,b) ( -0.16874*(r) - 0.33126*(g) +0.5*(b) ) +#define RGB2Cr(r,g,b) ( 0.5*(r) - 0.41869*(g) - 0.08131*(b) ) + +/* +16x16 RGB -> 8x8 Cb,Cr,Y0,Y1,Y2,Y3 + +[Y0][Y1] [Cb] [Cr] +[Y2][Y3] +*/ +#define Cb 0 +#define Cr DCTSIZE2 + +static void rgb2yuv (unsigned char image[][3], BLOCK *blk) +{ + int x,y,i; + int tmpblk[16*16][3],(*yuv)[3]; + BLOCK *yblk; + + yuv=tmpblk; + for(i=0;i<16*16;i++) { + yuv[0][0] = RGB2Y (image[0][R],image[0][G],image[0][B])-128; + yuv[0][1] = RGB2Cb(image[0][R],image[0][G],image[0][B]); + yuv[0][2] = RGB2Cr(image[0][R],image[0][G],image[0][B]); + yuv++; image++; + } + + yuv = tmpblk; + yblk = blk+DCTSIZE2*2; + for(y=0;y<16;y+=2,blk+=4,yblk+=8,yuv+=8+16) { + if (y==8) yblk+=DCTSIZE2; + for(x=0;x<4;x++,blk++,yblk+=2,yuv+=2) { + blk[Cb] = (yuv[0][1]+yuv[1][1]+yuv[16][1]+yuv[17][1])/4; + blk[Cr] = (yuv[0][2]+yuv[1][2]+yuv[16][2]+yuv[17][2])/4; + yblk[0] = yuv[ 0][0]; + yblk[1] = yuv[ 1][0]; + yblk[8] = yuv[16][0]; + yblk[9] = yuv[17][0]; + + blk[4+Cb] = (yuv[8+0][1]+yuv[8+1][1]+yuv[8+16][1]+yuv[8+17][1])/4; + blk[4+Cr] = (yuv[8+0][2]+yuv[8+1][2]+yuv[8+16][2]+yuv[8+17][2])/4; + yblk[DCTSIZE2+0] = yuv[8+ 0][0]; + yblk[DCTSIZE2+1] = yuv[8+ 1][0]; + yblk[DCTSIZE2+8] = yuv[8+16][0]; + yblk[DCTSIZE2+9] = yuv[8+17][0]; + } + } +} + +#undef Cb +#undef Cr + +/* bit i/o */ +#define BITBUFSIZE 16 +#define WriteWord(x) ctxt->bsbuf[ctxt->bs_size++]=(x) + +static void putbits_init (bs_context_t *ctxt) +{ + ctxt->bitbuf = 0; + ctxt->bitcount = BITBUFSIZE; + ctxt->bs_size = 0; + ctxt->totalbit = 0; +} + +static void putbits_flush (bs_context_t *ctxt) +{ + WriteWord(ctxt->bitbuf); +} + +static void putbits (bs_context_t *ctxt, unsigned int x, unsigned int n) +{ + ctxt->totalbit+=n; + + if (nbitcount) { + ctxt->bitcount-=n; + ctxt->bitbuf |= x << ctxt->bitcount; + } else { + n-=ctxt->bitcount; + WriteWord(ctxt->bitbuf | (x>>n) ); + if (nbitcount = BITBUFSIZE-n; + } else { + WriteWord( x>>(n-BITBUFSIZE) ); + ctxt->bitcount = BITBUFSIZE*2-n; + } + ctxt->bitbuf = x << ctxt->bitcount; + } +} + +typedef struct { + unsigned int code,nbits; +} huff_t; + +const static huff_t dc_y_table[] = { + {4,3},{0,2},{1,2},{5,3},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8} +}; + +const static huff_t dc_c_table[] = { + {0,2},{1,2},{2,2},{6,3},{14,4},{30,5},{62,6},{126,7},{254,8},{510,9} +}; + +#include "table.h" + +static void encode_init (bs_context_t *ctxt, void *outbuf, int type, int q_scale) +{ + ctxt->_type = type; + ctxt->last_dc[0] = 0; + ctxt->last_dc[1] = 0; + ctxt->last_dc[2] = 0; + ctxt->rlsize = 0; + putbits_init(ctxt); + + ctxt->bsbuf = outbuf; + ctxt->bsbuf[1] = 0x3800; + ctxt->bsbuf[2] = q_scale; + ctxt->bsbuf[3] = type; + ctxt->bs_size+=4; +} + +static void encode_finish (bs_context_t *ctxt) +{ + putbits_flush(ctxt); + ctxt->bsbuf[0] = (((ctxt->rlsize+1)/2)+31)&~31; +} + +static void encode_dc (bs_context_t *ctxt, int n, int level) +{ + if (ctxt->_type==2) { + putbits(ctxt,level&0x3ff,10); + } else { + const huff_t *table; + int prev,cnt; + + level = level/4; + if (n<2) { + table = dc_c_table; + prev = ctxt->last_dc[n]; + ctxt->last_dc[n] = level; + } else { + table = dc_y_table; + prev = ctxt->last_dc[2]; + ctxt->last_dc[2] = level; + } + level -= prev; + if (level==0) cnt=0; + else { + int alevel = level; + if (alevel<0) alevel=-alevel; + for(cnt=8;(alevel>>cnt)==0;cnt--); + cnt++; + if (level<0) level--; + } + putbits(ctxt,table[cnt].code,table[cnt].nbits); + if (cnt) putbits(ctxt,level&((1<rlsize++; +} + +static void encode_ac (bs_context_t *ctxt, int run, int level) +{ + int abslevel,sign; + if (level>0) { + abslevel = level; + sign = 0; + } else { + abslevel = -level; + sign = 1; + } + if (run<=31 && abslevel<=maxlevel[run]) { + putbits(ctxt,huff_table[run][abslevel-1].code+sign,huff_table[run][abslevel-1].nbits); + } else { + /* ESCAPE */ + putbits(ctxt,1,6); + putbits(ctxt,(run<<10)+(level&0x3ff),16); + } + ctxt->rlsize++; +} + +static void encode_eob (bs_context_t *ctxt) +{ + putbits(ctxt, 2,2); + ctxt->rlsize++; +} + +extern void DCT(BLOCK *blk); + +unsigned char zscan[DCTSIZE2] = { + 0 ,1 ,8 ,16,9 ,2 ,3 ,10, + 17,24,32,25,18,11,4 ,5 , + 12,19,26,33,40,48,41,34, + 27,20,13,6 ,7 ,14,21,28, + 35,42,49,56,57,50,43,36, + 29,22,15,23,30,37,44,51, + 58,59,52,45,38,31,39,46, + 53,60,61,54,47,55,62,63 +}; + +static unsigned char xxx_iqtab[DCTSIZE2] = { + 2,16,19,22,26,27,29,34, + 16,16,22,24,27,29,34,37, + 19,22,26,27,29,34,34,38, + 22,22,26,27,29,34,37,40, + 22,26,27,29,32,35,40,48, + 26,27,29,32,35,40,48,58, + 26,27,29,34,38,46,56,69, + 27,29,35,38,46,56,69,83 +}; + +const unsigned char *bs_iqtab (void) { return xxx_iqtab; } + +static void blk2huff (bs_context_t *ctxt,BLOCK *blk,int q_scale) +{ + int i,k,run,level; + for(i=0;i<6;i++) { + DCT(blk); + for(k=0;k>=3; + level = blk[0]/ctxt->iqtab[0]; + encode_dc(ctxt,i,level); + run = 0; + for(k=1;k<64;k++) { + level = blk[zscan[k]]*8/(ctxt->iqtab[zscan[k]]*q_scale); + if (level==0) { + run++; + } else { + encode_ac(ctxt,run,level); + run=0; + } + } + encode_eob(ctxt); + blk+=DCTSIZE2; + } +} + +Uint8 bs_roundtbl[256*3]; + +void bs_init (void) +{ + int i; + for(i=0;i<256;i++) { + bs_roundtbl [i]=0; + bs_roundtbl [i+256]=i; + bs_roundtbl [i+512]=255; + } +} + +int bs_encode (bs_header_t *outbuf,bs_input_image_t *img,int type,int q_scale, + const unsigned char *myiqtab) +{ + unsigned char image[16][16][3]; + BLOCK blk[6][DCTSIZE2]; + bs_context_t *ctxt = malloc(sizeof(bs_context_t)); + + int x,y,xw,yw,rl; + + ctxt->iqtab = myiqtab ? myiqtab : bs_iqtab(); + + encode_init (ctxt,outbuf,type,q_scale); + + for(x=0;xwidth;x+=16) { + xw = img->width-x; if (xw>16) xw = 16; + for(y=0;yheight;y+=16) { + unsigned char *p0 = img->top + x*(img->bit)/8 + y*img->nextline; + int i,j=0; + yw = img->height-y; if (yw>16) yw = 16; + + /* get 16x16 image */ + + for(i=0;inextline; + switch(img->bit) { + case 16: + for(j=0;j>10)&31)*8; + image[i][j][G] = ((c>>5)&31)*8; + image[i][j][R] = ((c&31))*8; + p+=2; + } + break; + case 24: + for(j=0;jbs_size * 2); + free (ctxt); + + return rl; +} diff --git a/psxdev/bs.h b/psxdev/bs.h index 4d66e0c..ac6f22c 100644 --- a/psxdev/bs.h +++ b/psxdev/bs.h @@ -1,94 +1,94 @@ -/* $Id: bs.h,v 1.3 2002-06-23 15:47:03 Pixel Exp $ */ - -/* - libbs - library for the bitstream image format - - Copyright (C) 1999, 2000 by these people, who contributed to this project - - bero@geocities.co.jp - Daniel Balster - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -/* - DCT code is based on Independent JPEG Group's sotfware -*/ - -#ifndef __LIB_BS_H -#define __LIB_BS_H - -#ifndef _GNU_SOURCE -#define _GNU_SOURCE -#endif - -#include -#include -#include "generic.h" - -typedef struct { - int width,height; - int bit; - int nextline; - unsigned char *top,*lpbits; -} bs_input_image_t; - -#define BS_MAGIC 0x3800 -#define BS_TYPE 2 - -typedef struct { - Uint16 length; - Uint16 magic; - Uint16 q_scale; - Uint16 type; -} bs_header_t; - -/* prototypes */ - -#ifdef __cplusplus -extern "C" { -#endif - -void bs_init (void); - -int bs_encode ( /* returns BS image size in bytes */ - bs_header_t *outbuf, /* output BS image */ - bs_input_image_t *img, /* input image descriptor */ - int type, /* image type (use BS_TYPE) */ - int q_scale, /* Q scaling factor (1=best,>= lower quality) */ - const unsigned char *myiqtab /* provide own iqtab (NULL == default) */ - ); - -void bs_decode_rgb24 ( - unsigned char *outbuf, /* output RGB bytes (width*height*3) */ - bs_header_t *img, /* input BS image */ - int width, int height, /* dimension of BS image */ - const unsigned char *myiqtab - ); - -void bs_decode_rgb15 ( - unsigned short *outbuf, /* output RGB bytes (width*height*2) */ - bs_header_t *img, /* input BS image */ - int width, int height, /* dimension of BS image */ - const unsigned char *myiqtab - ); - -const unsigned char *bs_iqtab (void); - -#ifdef __cplusplus -} -#endif - -#endif /* __LIB_BS_H */ +/* $Id: bs.h,v 1.4 2004-11-27 21:44:57 pixel Exp $ */ + +/* + libbs - library for the bitstream image format + + Copyright (C) 1999, 2000 by these people, who contributed to this project + + bero@geocities.co.jp + Daniel Balster + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* + DCT code is based on Independent JPEG Group's sotfware +*/ + +#ifndef __LIB_BS_H +#define __LIB_BS_H + +#ifndef _GNU_SOURCE +#define _GNU_SOURCE +#endif + +#include +#include +#include "generic.h" + +typedef struct { + int width,height; + int bit; + int nextline; + unsigned char *top,*lpbits; +} bs_input_image_t; + +#define BS_MAGIC 0x3800 +#define BS_TYPE 2 + +typedef struct { + Uint16 length; + Uint16 magic; + Uint16 q_scale; + Uint16 type; +} bs_header_t; + +/* prototypes */ + +#ifdef __cplusplus +extern "C" { +#endif + +void bs_init (void); + +int bs_encode ( /* returns BS image size in bytes */ + bs_header_t *outbuf, /* output BS image */ + bs_input_image_t *img, /* input image descriptor */ + int type, /* image type (use BS_TYPE) */ + int q_scale, /* Q scaling factor (1=best,>= lower quality) */ + const unsigned char *myiqtab /* provide own iqtab (NULL == default) */ + ); + +void bs_decode_rgb24 ( + unsigned char *outbuf, /* output RGB bytes (width*height*3) */ + bs_header_t *img, /* input BS image */ + int width, int height, /* dimension of BS image */ + const unsigned char *myiqtab + ); + +void bs_decode_rgb15 ( + unsigned short *outbuf, /* output RGB bytes (width*height*2) */ + bs_header_t *img, /* input BS image */ + int width, int height, /* dimension of BS image */ + const unsigned char *myiqtab + ); + +const unsigned char *bs_iqtab (void); + +#ifdef __cplusplus +} +#endif + +#endif /* __LIB_BS_H */ diff --git a/psxdev/common.h b/psxdev/common.h index 3a3c9d1..be53bc9 100644 --- a/psxdev/common.h +++ b/psxdev/common.h @@ -1,49 +1,49 @@ -/* $Id: common.h,v 1.2 2002-06-23 15:47:03 Pixel Exp $ */ - -/* - common stuff - - Copyright (C) 1997, 1998, 1999, 2000 by these people, who contributed to this project - - Daniel Balster - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -*/ - -#ifndef __COMMON_H -#define __COMMON_H - -#define _GNU_SOURCE -#define _USE_GNU - -#include "generic.h" - -#include - -#if ENABLE_NLS -#if HAVE_LOCALE_H -#include -#endif -#if HAVE_LIBINTL_H -#include -#endif -#define _(string) gettext(string) -#define N_(string) (string) -#else -#define _(string) (string) -#define N_(string) (string) -#endif - -#endif +/* $Id: common.h,v 1.3 2004-11-27 21:44:57 pixel Exp $ */ + +/* + common stuff + + Copyright (C) 1997, 1998, 1999, 2000 by these people, who contributed to this project + + Daniel Balster + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __COMMON_H +#define __COMMON_H + +#define _GNU_SOURCE +#define _USE_GNU + +#include "generic.h" + +#include + +#if ENABLE_NLS +#if HAVE_LOCALE_H +#include +#endif +#if HAVE_LIBINTL_H +#include +#endif +#define _(string) gettext(string) +#define N_(string) (string) +#else +#define _(string) (string) +#define N_(string) (string) +#endif + +#endif diff --git a/psxdev/idctfst.c b/psxdev/idctfst.c index 345cdb1..5b857e9 100644 --- a/psxdev/idctfst.c +++ b/psxdev/idctfst.c @@ -1,287 +1,287 @@ -/* - * jidctfst.c - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains a fast, not so accurate integer implementation of the - * inverse DCT (Discrete Cosine Transform). In the IJG code, this routine - * must also perform dequantization of the input coefficients. - * - * A 2-D IDCT can be done by 1-D IDCT on each column followed by 1-D IDCT - * on each row (or vice versa, but it's more convenient to emit a row at - * a time). Direct algorithms are also available, but they are much more - * complex and seem not to be any faster when reduced to code. - * - * This implementation is based on Arai, Agui, and Nakajima's algorithm for - * scaled DCT. Their original paper (Trans. IEICE E-71(11):1095) is in - * Japanese, but the algorithm is described in the Pennebaker & Mitchell - * JPEG textbook (see REFERENCES section in file README). The following code - * is based directly on figure 4-8 in P&M. - * While an 8-point DCT cannot be done in less than 11 multiplies, it is - * possible to arrange the computation so that many of the multiplies are - * simple scalings of the final outputs. These multiplies can then be - * folded into the multiplications or divisions by the JPEG quantization - * table entries. The AA&N method leaves only 5 multiplies and 29 adds - * to be done in the DCT itself. - * The primary disadvantage of this method is that with fixed-point math, - * accuracy is lost due to imprecise representation of the scaled - * quantization values. The smaller the quantization table entry, the less - * precise the scaled value, so this implementation does worse with high- - * quality-setting files than with low-quality ones. - */ - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -/* Scaling decisions are generally the same as in the LL&M algorithm; - * see jidctint.c for more details. However, we choose to descale - * (right shift) multiplication products as soon as they are formed, - * rather than carrying additional fractional bits into subsequent additions. - * This compromises accuracy slightly, but it lets us save a few shifts. - * More importantly, 16-bit arithmetic is then adequate (for 8-bit samples) - * everywhere except in the multiplications proper; this saves a good deal - * of work on 16-bit-int machines. - * - * The dequantized coefficients are not integers because the AA&N scaling - * factors have been incorporated. We represent them scaled up by PASS1_BITS, - * so that the first and second IDCT rounds have the same input scaling. - * For 8-bit JSAMPLEs, we choose IFAST_SCALE_BITS = PASS1_BITS so as to - * avoid a descaling shift; this compromises accuracy rather drastically - * for small quantization table entries, but it saves a lot of shifts. - * For 12-bit JSAMPLEs, there's no hope of using 16x16 multiplies anyway, - * so we use a much larger scaling factor to preserve accuracy. - * - * A final compromise is to represent the multiplicative constants to only - * 8 fractional bits, rather than 13. This saves some shifting work on some - * machines, and may also reduce the cost of multiplication (since there - * are fewer one-bits in the constants). - */ - -#define BITS_IN_JSAMPLE 8 - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 8 -#define PASS1_BITS 2 -#else -#define CONST_BITS 8 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 8 -#define FIX_1_082392200 (277) /* FIX(1.082392200) */ -#define FIX_1_414213562 (362) /* FIX(1.414213562) */ -#define FIX_1_847759065 (473) /* FIX(1.847759065) */ -#define FIX_2_613125930 (669) /* FIX(2.613125930) */ -#else -#define FIX_1_082392200 FIX(1.082392200) -#define FIX_1_414213562 FIX(1.414213562) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_2_613125930 FIX(2.613125930) -#endif - - -/* We can gain a little more speed, with a further compromise in accuracy, - * by omitting the addition in a descaling shift. This yields an incorrectly - * rounded result half the time... - */ - - -/* Multiply a DCTELEM variable by an INT32 constant, and immediately - * descale to yield a DCTELEM result. - */ - -#define MULTIPLY(var,const) (DESCALE((var) * (const), CONST_BITS)) - - -/* Dequantize a coefficient by multiplying it by the multiplier-table - * entry; produce a DCTELEM result. For 8-bit data a 16x16->16 - * multiplication will do. For 12-bit data, the multiplier table is - * declared INT32, so a 32-bit multiply will be used. - */ - -#if BITS_IN_JSAMPLE == 8 -#define DEQUANTIZE(coef,quantval) (coef) -#else -#define DEQUANTIZE(coef,quantval) \ - DESCALE((coef), IFAST_SCALE_BITS-PASS1_BITS) -#endif - - -/* Like DESCALE, but applies to a DCTELEM and produces an int. - * We assume that int right shift is unsigned if INT32 right shift is. - */ - -#define DESCALE(x,n) ((x)>>(n)) -#define RANGE(n) (n) -#define BLOCK int - -/* - * Perform dequantization and inverse DCT on one block of coefficients. - */ -#define DCTSIZE 8 -#define DCTSIZE2 64 - -static void IDCT1(BLOCK *block) -{ - int val = RANGE(DESCALE(block[0], PASS1_BITS+3)); - int i; - for(i=0;i16 + * multiplication will do. For 12-bit data, the multiplier table is + * declared INT32, so a 32-bit multiply will be used. + */ + +#if BITS_IN_JSAMPLE == 8 +#define DEQUANTIZE(coef,quantval) (coef) +#else +#define DEQUANTIZE(coef,quantval) \ + DESCALE((coef), IFAST_SCALE_BITS-PASS1_BITS) +#endif + + +/* Like DESCALE, but applies to a DCTELEM and produces an int. + * We assume that int right shift is unsigned if INT32 right shift is. + */ + +#define DESCALE(x,n) ((x)>>(n)) +#define RANGE(n) (n) +#define BLOCK int + +/* + * Perform dequantization and inverse DCT on one block of coefficients. + */ +#define DCTSIZE 8 +#define DCTSIZE2 64 + +static void IDCT1(BLOCK *block) +{ + int val = RANGE(DESCALE(block[0], PASS1_BITS+3)); + int i; + for(i=0;i>(n)) -#define GLOBAL -#define jpeg_fdct_islow DCT -#define SHIFT_TEMPS -/* #define BITS_IN_JSAMPLE 8 - #define MULTIPLY16C16(var,const) ((var) * (const)) */ - - -#ifdef DCT_ISLOW_SUPPORTED - - -/* - * This module is specialized to the case DCTSIZE = 8. - */ - -#if DCTSIZE != 8 -#error Sorry, this code only copes with 8x8 DCTs. -#endif - - -/* - * The poop on this scaling stuff is as follows: - * - * Each 1-D DCT step produces outputs which are a factor of sqrt(N) - * larger than the true DCT outputs. The final outputs are therefore - * a factor of N larger than desired; since N=8 this can be cured by - * a simple right shift at the end of the algorithm. The advantage of - * this arrangement is that we save two multiplications per 1-D DCT, - * because the y0 and y4 outputs need not be divided by sqrt(N). - * In the IJG code, this factor of 8 is removed by the quantization step - * (in jcdctmgr.c), NOT in this module. - * - * We have to do addition and subtraction of the integer inputs, which - * is no problem, and multiplication by fractional constants, which is - * a problem to do in integer arithmetic. We multiply all the constants - * by CONST_SCALE and convert them to integer constants (thus retaining - * CONST_BITS bits of precision in the constants). After doing a - * multiplication we have to divide the product by CONST_SCALE, with proper - * rounding, to produce the correct output. This division can be done - * cheaply as a right shift of CONST_BITS bits. We postpone shifting - * as long as possible so that partial sums can be added together with - * full fractional precision. - * - * The outputs of the first pass are scaled up by PASS1_BITS bits so that - * they are represented to better-than-integral precision. These outputs - * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word - * with the recommended scaling. (For 12-bit sample data, the intermediate - * array is INT32 anyway.) - * - * To avoid overflow of the 32-bit intermediate results in pass 2, we must - * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis - * shows that the values given below are the most effective. - */ - -#if BITS_IN_JSAMPLE == 8 -#define CONST_BITS 13 -#define PASS1_BITS 2 -#else -#define CONST_BITS 13 -#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ -#endif - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 13 -#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ -#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ -#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ -#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ -#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ -#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ -#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ -#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ -#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ -#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ -#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ -#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ -#else -#define FIX_0_298631336 FIX(0.298631336) -#define FIX_0_390180644 FIX(0.390180644) -#define FIX_0_541196100 FIX(0.541196100) -#define FIX_0_765366865 FIX(0.765366865) -#define FIX_0_899976223 FIX(0.899976223) -#define FIX_1_175875602 FIX(1.175875602) -#define FIX_1_501321110 FIX(1.501321110) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_1_961570560 FIX(1.961570560) -#define FIX_2_053119869 FIX(2.053119869) -#define FIX_2_562915447 FIX(2.562915447) -#define FIX_3_072711026 FIX(3.072711026) -#endif - - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * For 8-bit samples with the recommended scaling, all the variable - * and constant values involved are no more than 16 bits wide, so a - * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. - * For 12-bit samples, a full 32-bit multiplication will be needed. - */ - -#if BITS_IN_JSAMPLE == 8 -#define MULTIPLY(var,const) MULTIPLY16C16(var,const) -#else -#define MULTIPLY(var,const) ((var) * (const)) -#endif - - -/* - * Perform the forward DCT on one block of samples. - */ - -GLOBAL void -jpeg_fdct_islow (DCTELEM * data) -{ - INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - INT32 tmp10, tmp11, tmp12, tmp13; - INT32 z1, z2, z3, z4, z5; - DCTELEM *dataptr; - int ctr; - SHIFT_TEMPS - - /* Pass 1: process rows. */ - /* Note results are scaled up by sqrt(8) compared to a true DCT; */ - /* furthermore, we scale the results by 2**PASS1_BITS. */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[0] + dataptr[7]; - tmp7 = dataptr[0] - dataptr[7]; - tmp1 = dataptr[1] + dataptr[6]; - tmp6 = dataptr[1] - dataptr[6]; - tmp2 = dataptr[2] + dataptr[5]; - tmp5 = dataptr[2] - dataptr[5]; - tmp3 = dataptr[3] + dataptr[4]; - tmp4 = dataptr[3] - dataptr[4]; - - /* Even part per LL&M figure 1 --- note that published figure is faulty; - * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". - */ - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS); - dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); - - z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); - dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), - CONST_BITS-PASS1_BITS); - dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), - CONST_BITS-PASS1_BITS); - - /* Odd part per figure 8 --- note paper omits factor of sqrt(2). - * cK represents cos(K*pi/16). - * i0..i3 in the paper are tmp4..tmp7 here. - */ - - z1 = tmp4 + tmp7; - z2 = tmp5 + tmp6; - z3 = tmp4 + tmp6; - z4 = tmp5 + tmp7; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS); - dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS); - dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS); - dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS); - - dataptr += DCTSIZE; /* advance pointer to next row */ - } - - /* Pass 2: process columns. - * We remove the PASS1_BITS scaling, but leave the results scaled up - * by an overall factor of 8. - */ - - dataptr = data; - for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { - tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; - tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; - tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; - tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; - tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; - tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; - tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; - tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - - /* Even part per LL&M figure 1 --- note that published figure is faulty; - * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". - */ - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS); - dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS); - - z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); - dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), - CONST_BITS+PASS1_BITS); - - /* Odd part per figure 8 --- note paper omits factor of sqrt(2). - * cK represents cos(K*pi/16). - * i0..i3 in the paper are tmp4..tmp7 here. - */ - - z1 = tmp4 + tmp7; - z2 = tmp5 + tmp6; - z3 = tmp4 + tmp6; - z4 = tmp5 + tmp7; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, - CONST_BITS+PASS1_BITS); - dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, - CONST_BITS+PASS1_BITS); - - dataptr++; /* advance pointer to next column */ - } -} - -#endif /* DCT_ISLOW_SUPPORTED */ +/* + * jfdctint.c + * + * Copyright (C) 1991-1994, Thomas G. Lane. + * This file is part of the Independent JPEG Group's software. + * For conditions of distribution and use, see the accompanying README file. + * + * This file contains a slow-but-accurate integer implementation of the + * forward DCT (Discrete Cosine Transform). + * + * A 2-D DCT can be done by 1-D DCT on each row followed by 1-D DCT + * on each column. Direct algorithms are also available, but they are + * much more complex and seem not to be any faster when reduced to code. + * + * This implementation is based on an algorithm described in + * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT + * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, + * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. + * The primary algorithm described there uses 11 multiplies and 29 adds. + * We use their alternate method with 12 multiplies and 32 adds. + * The advantage of this method is that no data path contains more than one + * multiplication; this allows a very simple and accurate implementation in + * scaled fixed-point arithmetic, with a minimal number of shifts. + */ + +#define DCT_ISLOW_SUPPORTED +#define DCTSIZE 8 +#define DCTELEM int +#define INT32 int +#define DESCALE(x,n) RIGHT_SHIFT((x) + (1 << ((n)-1)), n) +#define RIGHT_SHIFT(x,n) ((x)>>(n)) +#define GLOBAL +#define jpeg_fdct_islow DCT +#define SHIFT_TEMPS +/* #define BITS_IN_JSAMPLE 8 + #define MULTIPLY16C16(var,const) ((var) * (const)) */ + + +#ifdef DCT_ISLOW_SUPPORTED + + +/* + * This module is specialized to the case DCTSIZE = 8. + */ + +#if DCTSIZE != 8 +#error Sorry, this code only copes with 8x8 DCTs. +#endif + + +/* + * The poop on this scaling stuff is as follows: + * + * Each 1-D DCT step produces outputs which are a factor of sqrt(N) + * larger than the true DCT outputs. The final outputs are therefore + * a factor of N larger than desired; since N=8 this can be cured by + * a simple right shift at the end of the algorithm. The advantage of + * this arrangement is that we save two multiplications per 1-D DCT, + * because the y0 and y4 outputs need not be divided by sqrt(N). + * In the IJG code, this factor of 8 is removed by the quantization step + * (in jcdctmgr.c), NOT in this module. + * + * We have to do addition and subtraction of the integer inputs, which + * is no problem, and multiplication by fractional constants, which is + * a problem to do in integer arithmetic. We multiply all the constants + * by CONST_SCALE and convert them to integer constants (thus retaining + * CONST_BITS bits of precision in the constants). After doing a + * multiplication we have to divide the product by CONST_SCALE, with proper + * rounding, to produce the correct output. This division can be done + * cheaply as a right shift of CONST_BITS bits. We postpone shifting + * as long as possible so that partial sums can be added together with + * full fractional precision. + * + * The outputs of the first pass are scaled up by PASS1_BITS bits so that + * they are represented to better-than-integral precision. These outputs + * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word + * with the recommended scaling. (For 12-bit sample data, the intermediate + * array is INT32 anyway.) + * + * To avoid overflow of the 32-bit intermediate results in pass 2, we must + * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis + * shows that the values given below are the most effective. + */ + +#if BITS_IN_JSAMPLE == 8 +#define CONST_BITS 13 +#define PASS1_BITS 2 +#else +#define CONST_BITS 13 +#define PASS1_BITS 1 /* lose a little precision to avoid overflow */ +#endif + +/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus + * causing a lot of useless floating-point operations at run time. + * To get around this we use the following pre-calculated constants. + * If you change CONST_BITS you may want to add appropriate values. + * (With a reasonable C compiler, you can just rely on the FIX() macro...) + */ + +#if CONST_BITS == 13 +#define FIX_0_298631336 ((INT32) 2446) /* FIX(0.298631336) */ +#define FIX_0_390180644 ((INT32) 3196) /* FIX(0.390180644) */ +#define FIX_0_541196100 ((INT32) 4433) /* FIX(0.541196100) */ +#define FIX_0_765366865 ((INT32) 6270) /* FIX(0.765366865) */ +#define FIX_0_899976223 ((INT32) 7373) /* FIX(0.899976223) */ +#define FIX_1_175875602 ((INT32) 9633) /* FIX(1.175875602) */ +#define FIX_1_501321110 ((INT32) 12299) /* FIX(1.501321110) */ +#define FIX_1_847759065 ((INT32) 15137) /* FIX(1.847759065) */ +#define FIX_1_961570560 ((INT32) 16069) /* FIX(1.961570560) */ +#define FIX_2_053119869 ((INT32) 16819) /* FIX(2.053119869) */ +#define FIX_2_562915447 ((INT32) 20995) /* FIX(2.562915447) */ +#define FIX_3_072711026 ((INT32) 25172) /* FIX(3.072711026) */ +#else +#define FIX_0_298631336 FIX(0.298631336) +#define FIX_0_390180644 FIX(0.390180644) +#define FIX_0_541196100 FIX(0.541196100) +#define FIX_0_765366865 FIX(0.765366865) +#define FIX_0_899976223 FIX(0.899976223) +#define FIX_1_175875602 FIX(1.175875602) +#define FIX_1_501321110 FIX(1.501321110) +#define FIX_1_847759065 FIX(1.847759065) +#define FIX_1_961570560 FIX(1.961570560) +#define FIX_2_053119869 FIX(2.053119869) +#define FIX_2_562915447 FIX(2.562915447) +#define FIX_3_072711026 FIX(3.072711026) +#endif + + +/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. + * For 8-bit samples with the recommended scaling, all the variable + * and constant values involved are no more than 16 bits wide, so a + * 16x16->32 bit multiply can be used instead of a full 32x32 multiply. + * For 12-bit samples, a full 32-bit multiplication will be needed. + */ + +#if BITS_IN_JSAMPLE == 8 +#define MULTIPLY(var,const) MULTIPLY16C16(var,const) +#else +#define MULTIPLY(var,const) ((var) * (const)) +#endif + + +/* + * Perform the forward DCT on one block of samples. + */ + +GLOBAL void +jpeg_fdct_islow (DCTELEM * data) +{ + INT32 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; + INT32 tmp10, tmp11, tmp12, tmp13; + INT32 z1, z2, z3, z4, z5; + DCTELEM *dataptr; + int ctr; + SHIFT_TEMPS + + /* Pass 1: process rows. */ + /* Note results are scaled up by sqrt(8) compared to a true DCT; */ + /* furthermore, we scale the results by 2**PASS1_BITS. */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[0] + dataptr[7]; + tmp7 = dataptr[0] - dataptr[7]; + tmp1 = dataptr[1] + dataptr[6]; + tmp6 = dataptr[1] - dataptr[6]; + tmp2 = dataptr[2] + dataptr[5]; + tmp5 = dataptr[2] - dataptr[5]; + tmp3 = dataptr[3] + dataptr[4]; + tmp4 = dataptr[3] - dataptr[4]; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[0] = (DCTELEM) ((tmp10 + tmp11) << PASS1_BITS); + dataptr[4] = (DCTELEM) ((tmp10 - tmp11) << PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), + CONST_BITS-PASS1_BITS); + dataptr[6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), + CONST_BITS-PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents cos(K*pi/16). + * i0..i3 in the paper are tmp4..tmp7 here. + */ + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, CONST_BITS-PASS1_BITS); + dataptr[5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, CONST_BITS-PASS1_BITS); + dataptr[3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, CONST_BITS-PASS1_BITS); + dataptr[1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, CONST_BITS-PASS1_BITS); + + dataptr += DCTSIZE; /* advance pointer to next row */ + } + + /* Pass 2: process columns. + * We remove the PASS1_BITS scaling, but leave the results scaled up + * by an overall factor of 8. + */ + + dataptr = data; + for (ctr = DCTSIZE-1; ctr >= 0; ctr--) { + tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; + tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; + tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; + tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; + tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; + tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; + tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; + tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; + + /* Even part per LL&M figure 1 --- note that published figure is faulty; + * rotator "sqrt(2)*c1" should be "sqrt(2)*c6". + */ + + tmp10 = tmp0 + tmp3; + tmp13 = tmp0 - tmp3; + tmp11 = tmp1 + tmp2; + tmp12 = tmp1 - tmp2; + + dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp11, PASS1_BITS); + dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp10 - tmp11, PASS1_BITS); + + z1 = MULTIPLY(tmp12 + tmp13, FIX_0_541196100); + dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp13, FIX_0_765366865), + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(z1 + MULTIPLY(tmp12, - FIX_1_847759065), + CONST_BITS+PASS1_BITS); + + /* Odd part per figure 8 --- note paper omits factor of sqrt(2). + * cK represents cos(K*pi/16). + * i0..i3 in the paper are tmp4..tmp7 here. + */ + + z1 = tmp4 + tmp7; + z2 = tmp5 + tmp6; + z3 = tmp4 + tmp6; + z4 = tmp5 + tmp7; + z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ + + tmp4 = MULTIPLY(tmp4, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ + tmp5 = MULTIPLY(tmp5, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ + tmp6 = MULTIPLY(tmp6, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ + tmp7 = MULTIPLY(tmp7, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ + z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ + z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ + z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ + z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ + + z3 += z5; + z4 += z5; + + dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp4 + z1 + z3, + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp5 + z2 + z4, + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp6 + z2 + z3, + CONST_BITS+PASS1_BITS); + dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp7 + z1 + z4, + CONST_BITS+PASS1_BITS); + + dataptr++; /* advance pointer to next column */ + } +} + +#endif /* DCT_ISLOW_SUPPORTED */ diff --git a/psxdev/table.h b/psxdev/table.h index 0b50ad3..3e50b18 100644 --- a/psxdev/table.h +++ b/psxdev/table.h @@ -1,102 +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, -}; +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/psxdev/vlc.c b/psxdev/vlc.c index 4ff3d06..c313cdc 100644 --- a/psxdev/vlc.c +++ b/psxdev/vlc.c @@ -1,606 +1,606 @@ -#include -#include -#include -#include "bs.h" - -#define SOFT - -#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()<=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<=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_rliqtab[i] =ctxt->iq_y[i]*aanscales[i]>>(CONST_BITS-IFAST_SCALE_BITS); - } -} - -#define BLOCK long - -extern void IDCT(BLOCK *blk,int k); - -Uint16* rl2blk(bs_context_t *ctxt, BLOCK *blk,Uint16 *mdec_rl) -{ - int i,k,q_scale,rl; - memset(blk,0,6*DCTSIZE2*sizeof(BLOCK)); - for(i=0;i<6;i++) { - rl = *mdec_rl++; - q_scale = RUNOF(rl); - blk[0] = ctxt->iqtab[0]*VALOF(rl); - k = 0; - for(;;) { - rl = *mdec_rl++; - if (rl==EOB) break; - k += RUNOF(rl)+1; - blk[zscan[k]] = ctxt->iqtab[zscan[k]]*q_scale*VALOF(rl)/8; - } - - IDCT(blk,k+1); - - blk+=DCTSIZE2; - } - return mdec_rl; -} - -#define RGB15(r,g,b) ( (((b)&0xf8)<<7)|(((g)&0xf8)<<2)|((r)>>3) ) - -#define ROUND(r) bs_roundtbl[(r)+256] -#if 1 -#define SHIFT 12 -#define toFIX(a) (int)((a)*(1<>SHIFT) -#define FIX_1 toFIX(1) -#define MULR(a) toINT((a)*toFIX(1.402)) -#define MULG(a) toINT((a)*toFIX(-0.3437)) -#define MULG2(a) toINT((a)*toFIX(-0.7143)) -#define MULB(a) toINT((a)*toFIX(1.772)) -#else -#define MULR(a) 0 -#define MULG(a) 0 -#define MULG2(a) 0 -#define MULB(a) 0 -#endif - - -/* -int ROUND(int r) -{ - if (r<0) return 0; - else if (r>255) return 255; - else return r; -} -*/ - -extern Uint8 bs_roundtbl[256*3]; - -static void yuv2rgb15(BLOCK *blk,Uint16 *image) -{ - int x,yy; - BLOCK *yblk = blk+DCTSIZE2*2; - for(yy=0;yy<16;yy+=2,blk+=4,yblk+=8,image+=8+16) { - if (yy==8) yblk+=DCTSIZE2; - for(x=0;x<4;x++,blk++,yblk+=2,image+=2) { - int r0,b0,g0,y; - r0 = MULR(blk[DCTSIZE2]); /* cr */ - g0 = MULG(blk[0])+MULG2(blk[DCTSIZE2]); - b0 = MULB(blk[0]); /* cb */ - y = yblk[0]+128; - image[0] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); - y = yblk[1]+128+4; - image[1] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); - y = yblk[8]+128+6; - image[16] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); - y = yblk[9]+128+2; - image[17] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); - r0 = MULR(blk[4+DCTSIZE2]); - g0 = MULG(blk[4])+MULG2(blk[4+DCTSIZE2]); - b0 = MULB(blk[4]); - y = yblk[DCTSIZE2+0]+128; - image[8+0] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); - y = yblk[DCTSIZE2+1]+128+4; - image[8+1] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); - y = yblk[DCTSIZE2+8]+128+6; - image[8+16] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); - y = yblk[DCTSIZE2+9]+128+2; - image[8+17] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); - } - } -} - -enum {R, G, B}; - -static void yuv2rgb24(BLOCK *blk,Uint8 image[][3]) -{ - int x,yy; - BLOCK *yblk = blk+DCTSIZE2*2; - for(yy=0;yy<16;yy+=2,blk+=4,yblk+=8,image+=8+16) { - if (yy==8) yblk+=DCTSIZE2; - for(x=0;x<4;x++,blk++,yblk+=2,image+=2) { - int r0,b0,g0,y; - r0 = MULR(blk[DCTSIZE2]); /* cr */ - g0 = MULG(blk[0])+MULG2(blk[DCTSIZE2]); - b0 = MULB(blk[0]); /* cb */ - y = yblk[0]+128; - image[0][R] = ROUND(r0+y); - image[0][G] = ROUND(g0+y); - image[0][B] = ROUND(b0+y); - y = yblk[1]+128; - image[1][R] = ROUND(r0+y); - image[1][G] = ROUND(g0+y); - image[1][B] = ROUND(b0+y); - y = yblk[8]+128; - image[16][R] = ROUND(r0+y); - image[16][G] = ROUND(g0+y); - image[16][B] = ROUND(b0+y); - y = yblk[9]+128; - image[17][R] = ROUND(r0+y); - image[17][G] = ROUND(g0+y); - image[17][B] = ROUND(b0+y); - - r0 = MULR(blk[4+DCTSIZE2]); - g0 = MULG(blk[4])+MULG2(blk[4+DCTSIZE2]); - b0 = MULB(blk[4]); - y = yblk[DCTSIZE2+0]+128; - image[8+0][R] = ROUND(r0+y); - image[8+0][G] = ROUND(g0+y); - image[8+0][B] = ROUND(b0+y); - y = yblk[DCTSIZE2+1]+128; - image[8+1][R] = ROUND(r0+y); - image[8+1][G] = ROUND(g0+y); - image[8+1][B] = ROUND(b0+y); - y = yblk[DCTSIZE2+8]+128; - image[8+16][R] = ROUND(r0+y); - image[8+16][G] = ROUND(g0+y); - image[8+16][B] = ROUND(b0+y); - y = yblk[DCTSIZE2+9]+128; - image[8+17][R] = ROUND(r0+y); - image[8+17][G] = ROUND(g0+y); - image[8+17][B] = ROUND(b0+y); - } - } -} - -static void DecDCTReset(bs_context_t *ctxt, int mode) -{ - iqtab_init(ctxt); -} - -static void DecDCTin(bs_context_t *ctxt, Uint16 *mdecrl,int mode) -{ - mdecrl+=2; - ctxt->mdec_rl = mdecrl; - ctxt->rl_end = mdecrl+mdecrl[-2]*2; - ctxt->mdec_mode = mode; -} - -static void DecDCTout(bs_context_t *ctxt, Uint16 *image,int size) -{ - BLOCK blk[DCTSIZE2*6]; - int blocksize=16*16; - if (ctxt->mdec_mode) blocksize = 16*16*3/2; - for(;size>0;size-=blocksize/2,image+=blocksize) { - ctxt->mdec_rl = rl2blk(ctxt,blk,ctxt->mdec_rl); - if (ctxt->mdec_mode==0) yuv2rgb15(blk,image); - else yuv2rgb24(blk,image); - } -} - -void bs_decode_rgb24 ( - unsigned char *outbuf, /* output RGB bytes (width*height*3) */ - bs_header_t *img, /* input BS image */ - int width, int height, /* dimension of BS image */ - const unsigned char *myiqtab - ) -{ - unsigned short *buf2 = (unsigned short *) outbuf; - unsigned short *bufp = (unsigned short *) img; - bs_context_t ctxt; - unsigned short *rl,*image; - int slice; - /* int rlsize; */ - int mode; - int x,y; - int height2 = (height+15)&~15; - int w; - - ctxt.iq_y = myiqtab ? myiqtab : bs_iqtab(); - mode=1; - w=24; - width = width*3/2; - - image = (unsigned short *) malloc (height2*w*sizeof(short)); - rl = (unsigned short *) malloc ((bufp[0]+2)*sizeof(long)); - - DecDCTReset(&ctxt,0); - DecDCTvlc(bufp,rl); - DecDCTin(&ctxt,rl,mode); - - slice = height2*w/2; - - for(x=0;x=0;y--) - { - memcpy(dst,src,w*2); - src+=w; - dst+=width; - } - } - - free (image); - free (rl); -} - -void bs_decode_rgb15 ( - unsigned short *outbuf, /* output RGB bytes (width*height*2) */ - bs_header_t *img, /* input BS image */ - int width, int height, /* dimension of BS image */ - const unsigned char *myiqtab - ) -{ - unsigned short *buf2 = (unsigned short *) outbuf; - unsigned short *bufp = (unsigned short *) img; - bs_context_t ctxt; - unsigned short *rl,*image; - int slice; - /* int rlsize; */ - int mode; - int x,y; - int height2 = (height+15)&~15; - int w; - - ctxt.iq_y = myiqtab ? myiqtab : bs_iqtab(); - mode=0; - w=24; - - image = (unsigned short *) malloc (height2*w*sizeof(short)); - rl = (unsigned short *) malloc ((bufp[0]+2)*sizeof(long)); - - DecDCTReset(&ctxt,0); - DecDCTvlc(bufp,rl); - DecDCTin(&ctxt,rl,mode); - - slice = height2*w/2; - - for(x=0;x=0;y--) - { - memcpy(dst,src,w*2); - src+=w; - dst-=width; - } - } - - free (image); - free (rl); -} +#include +#include +#include +#include "bs.h" + +#define SOFT + +#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()<=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<=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_rliqtab[i] =ctxt->iq_y[i]*aanscales[i]>>(CONST_BITS-IFAST_SCALE_BITS); + } +} + +#define BLOCK long + +extern void IDCT(BLOCK *blk,int k); + +Uint16* rl2blk(bs_context_t *ctxt, BLOCK *blk,Uint16 *mdec_rl) +{ + int i,k,q_scale,rl; + memset(blk,0,6*DCTSIZE2*sizeof(BLOCK)); + for(i=0;i<6;i++) { + rl = *mdec_rl++; + q_scale = RUNOF(rl); + blk[0] = ctxt->iqtab[0]*VALOF(rl); + k = 0; + for(;;) { + rl = *mdec_rl++; + if (rl==EOB) break; + k += RUNOF(rl)+1; + blk[zscan[k]] = ctxt->iqtab[zscan[k]]*q_scale*VALOF(rl)/8; + } + + IDCT(blk,k+1); + + blk+=DCTSIZE2; + } + return mdec_rl; +} + +#define RGB15(r,g,b) ( (((b)&0xf8)<<7)|(((g)&0xf8)<<2)|((r)>>3) ) + +#define ROUND(r) bs_roundtbl[(r)+256] +#if 1 +#define SHIFT 12 +#define toFIX(a) (int)((a)*(1<>SHIFT) +#define FIX_1 toFIX(1) +#define MULR(a) toINT((a)*toFIX(1.402)) +#define MULG(a) toINT((a)*toFIX(-0.3437)) +#define MULG2(a) toINT((a)*toFIX(-0.7143)) +#define MULB(a) toINT((a)*toFIX(1.772)) +#else +#define MULR(a) 0 +#define MULG(a) 0 +#define MULG2(a) 0 +#define MULB(a) 0 +#endif + + +/* +int ROUND(int r) +{ + if (r<0) return 0; + else if (r>255) return 255; + else return r; +} +*/ + +extern Uint8 bs_roundtbl[256*3]; + +static void yuv2rgb15(BLOCK *blk,Uint16 *image) +{ + int x,yy; + BLOCK *yblk = blk+DCTSIZE2*2; + for(yy=0;yy<16;yy+=2,blk+=4,yblk+=8,image+=8+16) { + if (yy==8) yblk+=DCTSIZE2; + for(x=0;x<4;x++,blk++,yblk+=2,image+=2) { + int r0,b0,g0,y; + r0 = MULR(blk[DCTSIZE2]); /* cr */ + g0 = MULG(blk[0])+MULG2(blk[DCTSIZE2]); + b0 = MULB(blk[0]); /* cb */ + y = yblk[0]+128; + image[0] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); + y = yblk[1]+128+4; + image[1] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); + y = yblk[8]+128+6; + image[16] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); + y = yblk[9]+128+2; + image[17] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); + r0 = MULR(blk[4+DCTSIZE2]); + g0 = MULG(blk[4])+MULG2(blk[4+DCTSIZE2]); + b0 = MULB(blk[4]); + y = yblk[DCTSIZE2+0]+128; + image[8+0] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); + y = yblk[DCTSIZE2+1]+128+4; + image[8+1] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); + y = yblk[DCTSIZE2+8]+128+6; + image[8+16] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); + y = yblk[DCTSIZE2+9]+128+2; + image[8+17] = RGB15(ROUND(r0+y),ROUND(g0+y),ROUND(b0+y)); + } + } +} + +enum {R, G, B}; + +static void yuv2rgb24(BLOCK *blk,Uint8 image[][3]) +{ + int x,yy; + BLOCK *yblk = blk+DCTSIZE2*2; + for(yy=0;yy<16;yy+=2,blk+=4,yblk+=8,image+=8+16) { + if (yy==8) yblk+=DCTSIZE2; + for(x=0;x<4;x++,blk++,yblk+=2,image+=2) { + int r0,b0,g0,y; + r0 = MULR(blk[DCTSIZE2]); /* cr */ + g0 = MULG(blk[0])+MULG2(blk[DCTSIZE2]); + b0 = MULB(blk[0]); /* cb */ + y = yblk[0]+128; + image[0][R] = ROUND(r0+y); + image[0][G] = ROUND(g0+y); + image[0][B] = ROUND(b0+y); + y = yblk[1]+128; + image[1][R] = ROUND(r0+y); + image[1][G] = ROUND(g0+y); + image[1][B] = ROUND(b0+y); + y = yblk[8]+128; + image[16][R] = ROUND(r0+y); + image[16][G] = ROUND(g0+y); + image[16][B] = ROUND(b0+y); + y = yblk[9]+128; + image[17][R] = ROUND(r0+y); + image[17][G] = ROUND(g0+y); + image[17][B] = ROUND(b0+y); + + r0 = MULR(blk[4+DCTSIZE2]); + g0 = MULG(blk[4])+MULG2(blk[4+DCTSIZE2]); + b0 = MULB(blk[4]); + y = yblk[DCTSIZE2+0]+128; + image[8+0][R] = ROUND(r0+y); + image[8+0][G] = ROUND(g0+y); + image[8+0][B] = ROUND(b0+y); + y = yblk[DCTSIZE2+1]+128; + image[8+1][R] = ROUND(r0+y); + image[8+1][G] = ROUND(g0+y); + image[8+1][B] = ROUND(b0+y); + y = yblk[DCTSIZE2+8]+128; + image[8+16][R] = ROUND(r0+y); + image[8+16][G] = ROUND(g0+y); + image[8+16][B] = ROUND(b0+y); + y = yblk[DCTSIZE2+9]+128; + image[8+17][R] = ROUND(r0+y); + image[8+17][G] = ROUND(g0+y); + image[8+17][B] = ROUND(b0+y); + } + } +} + +static void DecDCTReset(bs_context_t *ctxt, int mode) +{ + iqtab_init(ctxt); +} + +static void DecDCTin(bs_context_t *ctxt, Uint16 *mdecrl,int mode) +{ + mdecrl+=2; + ctxt->mdec_rl = mdecrl; + ctxt->rl_end = mdecrl+mdecrl[-2]*2; + ctxt->mdec_mode = mode; +} + +static void DecDCTout(bs_context_t *ctxt, Uint16 *image,int size) +{ + BLOCK blk[DCTSIZE2*6]; + int blocksize=16*16; + if (ctxt->mdec_mode) blocksize = 16*16*3/2; + for(;size>0;size-=blocksize/2,image+=blocksize) { + ctxt->mdec_rl = rl2blk(ctxt,blk,ctxt->mdec_rl); + if (ctxt->mdec_mode==0) yuv2rgb15(blk,image); + else yuv2rgb24(blk,image); + } +} + +void bs_decode_rgb24 ( + unsigned char *outbuf, /* output RGB bytes (width*height*3) */ + bs_header_t *img, /* input BS image */ + int width, int height, /* dimension of BS image */ + const unsigned char *myiqtab + ) +{ + unsigned short *buf2 = (unsigned short *) outbuf; + unsigned short *bufp = (unsigned short *) img; + bs_context_t ctxt; + unsigned short *rl,*image; + int slice; + /* int rlsize; */ + int mode; + int x,y; + int height2 = (height+15)&~15; + int w; + + ctxt.iq_y = myiqtab ? myiqtab : bs_iqtab(); + mode=1; + w=24; + width = width*3/2; + + image = (unsigned short *) malloc (height2*w*sizeof(short)); + rl = (unsigned short *) malloc ((bufp[0]+2)*sizeof(long)); + + DecDCTReset(&ctxt,0); + DecDCTvlc(bufp,rl); + DecDCTin(&ctxt,rl,mode); + + slice = height2*w/2; + + for(x=0;x=0;y--) + { + memcpy(dst,src,w*2); + src+=w; + dst+=width; + } + } + + free (image); + free (rl); +} + +void bs_decode_rgb15 ( + unsigned short *outbuf, /* output RGB bytes (width*height*2) */ + bs_header_t *img, /* input BS image */ + int width, int height, /* dimension of BS image */ + const unsigned char *myiqtab + ) +{ + unsigned short *buf2 = (unsigned short *) outbuf; + unsigned short *bufp = (unsigned short *) img; + bs_context_t ctxt; + unsigned short *rl,*image; + int slice; + /* int rlsize; */ + int mode; + int x,y; + int height2 = (height+15)&~15; + int w; + + ctxt.iq_y = myiqtab ? myiqtab : bs_iqtab(); + mode=0; + w=24; + + image = (unsigned short *) malloc (height2*w*sizeof(short)); + rl = (unsigned short *) malloc ((bufp[0]+2)*sizeof(long)); + + DecDCTReset(&ctxt,0); + DecDCTvlc(bufp,rl); + DecDCTin(&ctxt,rl,mode); + + slice = height2*w/2; + + for(x=0;x=0;y--) + { + memcpy(dst,src,w*2); + src+=w; + dst-=width; + } + } + + free (image); + free (rl); +} diff --git a/psxdev/xadecode.c b/psxdev/xadecode.c index 10da6c9..39523aa 100644 --- a/psxdev/xadecode.c +++ b/psxdev/xadecode.c @@ -1,302 +1,302 @@ -/* - author: unknown, probably bitmaster? - slightly modified by dbalster -*/ - -#include -#include -#include -#include -#include "common.h" -#include "xadecode.h" - -#if USE_FXD -static FXD K0[4] = { - 0x00000000, - 0x0000F000, - 0x0001CC00, - 0x00018800 -}; -static FXD K1[4] = { - 0x00000000, - 0x00000000, - 0xFFFF3000, - 0xFFFF2400 -}; -FXD t1, t2, at1[256], at2[256]; -FXD t1_x, t2_x, at1_x[256], at2_x[256]; -#else -static double K0[4] = { - 0.0, - 0.9375, - 1.796875, - 1.53125 -}; -static double K1[4] = { - 0.0, - 0.0, - -0.8125, - -0.859375 -}; -double t1, t2, at1[256], at2[256]; -double t1_x, t2_x, at1_x[256], at2_x[256]; -#endif - -void initXaDecode(void) -{ - int i; - - for (i=0; i<256; ++i) - { - at1[i] = at2[i] = at1_x[i] = at2_x[i] = 0; - } -} -void reinitXaDecode(int i) -{ - at1[i] = at2[i] = at1_x[i] = at2_x[i] = 0; -} -void switchXaDecode(int i) -{ - t1 = at1[i]; - t2 = at2[i]; - t1_x = at1_x[i]; - t2_x = at2_x[i]; -} -void saveXaDecode(int i) -{ - at1[i] = t1; - at2[i] = t2; - at1_x[i]= t1_x; - at2_x[i]= t2_x; -} - -char xachannel(SoundSector *ss) -{ - return(ss->sectorFiller[XAChannel]); -} - -unsigned char xatype(SoundSector *ss) -{ - return(unsigned char) (ss->sectorFiller[XAType]); -} - -char xafileno(SoundSector *ss) -{ - return(ss->sectorFiller[XAFile]); -} - -char xastereo(SoundSector *ss) -{ - return(ss->sectorFiller[XAFlags]&XAFStereo); -} - -char xahalfhz(SoundSector *ss) -{ - return(ss->sectorFiller[XAFlags]&XAFHalfHz); -} - -long convXaToWave(char *adp, char *wav, int cn, int fn_s, int fn_e) -{ - SoundSector ssct; - int i; - - memcpy(ssct.sectorFiller,adp,sizeof(ssct.sectorFiller)); - for(i=0;i<18;i++) - memcpy(ssct.SoundGroups[i],adp+sizeof(ssct.sectorFiller)+(128*i),128); - if ((xachannel(&ssct) == cn) && (xatype(&ssct) == XAAUDIO)) - { - if (xafileno(&ssct) >= fn_s - && xafileno(&ssct) <= fn_e) - { - if (xastereo(&ssct)) - return(decodeSoundSect1(&ssct, wav)); - else - return(decodeSoundSect(&ssct, wav)); - } - } - return(0); -} - -long decodeSoundSect(SoundSector *ssct, char *wav) -{ - long count, outputBytes; - signed char snddat, filt, range; - short decoded; - long unit, sample; - long sndgrp; -#if USE_FXD - FXD tmp2, tmp3, tmp4, tmp5; -#else - double tmp2, tmp3, tmp4, tmp5; -#endif - - outputBytes = 0; - - for (sndgrp = 0; sndgrp < kNumOfSGs; sndgrp++) - { - count = 0; - for (unit = 0; unit < 8; unit++) - { - range = getRange(ssct->SoundGroups[sndgrp], unit); - filt = getFilter(ssct->SoundGroups[sndgrp], unit); - for (sample = 0; sample < 28; sample++) - { - snddat = getSoundData(ssct->SoundGroups[sndgrp], unit, sample); -#if USE_FXD - tmp2 = (long)(snddat) << (12 - range); - tmp3 = FXD_Pcm16ToFxd(tmp2); - tmp4 = FXD_FixMul(K0[filt], t1); - tmp5 = FXD_FixMul(K1[filt], t2); - t2 = t1; - t1 = tmp3 + tmp4 + tmp5; - decoded = FXD_FxdToPcm16(t1); -#else - tmp2 = (double)(1 << (12 - range)); - tmp3 = (double)snddat * tmp2; - tmp4 = t1 * K0[filt]; - tmp5 = t2 * K1[filt]; - t2 = t1; - t1 = tmp3 + tmp4 + tmp5; - decoded = DblToPCM(t1); -#endif - wav[outputBytes+count++] = (char)(decoded & 0x0000ffff); - wav[outputBytes+count++] = (char)(decoded >> 8); - } - } - outputBytes += count; - } - return outputBytes; -} - -long decodeSoundSect1(SoundSector *ssct, char *wav) -{ - long count, outputBytes; - signed char snddat, filt, range; - signed char filt1, range1; - short decoded; - long unit, sample; - long sndgrp; -#if USE_FXD - FXD tmp2, tmp3, tmp4, tmp5; -#else - double tmp2, tmp3, tmp4, tmp5; -#endif - - outputBytes = 0; - - for (sndgrp = 0; sndgrp < kNumOfSGs; sndgrp++) - { - count = 0; - for (unit = 0; unit < 8; unit+= 2) - { - range = getRange(ssct->SoundGroups[sndgrp], unit); - filt = getFilter(ssct->SoundGroups[sndgrp], unit); - range1 = getRange(ssct->SoundGroups[sndgrp], unit+1); - filt1 = getFilter(ssct->SoundGroups[sndgrp], unit+1); - - for (sample = 0; sample < 28; sample++) - { - /* Channel 1 */ - snddat = getSoundData(ssct->SoundGroups[sndgrp], unit, sample); -#if USE_FXD - tmp2 = (long)(snddat) << (12 - range); - tmp3 = FXD_Pcm16ToFxd(tmp2); - tmp4 = FXD_FixMul(K0[filt], t1); - tmp5 = FXD_FixMul(K1[filt], t2); - t2 = t1; - t1 = tmp3 + tmp4 + tmp5; - decoded = FXD_FxdToPcm16(t1); -#else - tmp2 = (double)(1 << (12 - range)); - tmp3 = (double)snddat * tmp2; - tmp4 = t1 * K0[filt]; - tmp5 = t2 * K1[filt]; - t2 = t1; - t1 = tmp3 + tmp4 + tmp5; - decoded = DblToPCM(t1); -#endif - wav[outputBytes + count++] = (char)(decoded & 0x0000ffff); - wav[outputBytes + count++] = (char)(decoded >> 8); - - /* Channel 2 */ - snddat = getSoundData(ssct->SoundGroups[sndgrp], unit+1, sample); -#if USE_FXD - tmp2 = (long)(snddat) << (12 - range1); - tmp3 = FXD_Pcm16ToFxd(tmp2); - tmp4 = FXD_FixMul(K0[filt1], t1_x); - tmp5 = FXD_FixMul(K1[filt1], t2_x); - t2_x = t1_x; - t1_x = tmp3 + tmp4 + tmp5; - decoded = FXD_FxdToPcm16(t1_x); -#else - tmp2 = (double)(1 << (12 - range1)); - tmp3 = (double)snddat * tmp2; - tmp4 = t1_x * K0[filt1]; - tmp5 = t2_x * K1[filt1]; - t2_x = t1_x; - t1_x = tmp3 + tmp4 + tmp5; - decoded = DblToPCM(t1_x); -#endif - wav[outputBytes + count++] = (char)(decoded & 0x0000ffff); - wav[outputBytes + count++] = (char)(decoded >> 8); - } - } - outputBytes += count; - } - return outputBytes; -} - -signed char getSoundData(char *buf, long unit, long sample) -{ - signed char ret; - char *p; - long offset, shift; - - p = buf; - shift = (unit%2) * 4; - - offset = 16 + (unit / 2) + (sample * 4); - p += offset; - - ret = (*p >> shift) & 0x0F; - - if (ret > 7) { - ret -= 16; - } - return ret; -} - -signed char getFilter(char *buf, long unit) -{ - return (*(buf + 4 + unit) >> 4) & 0x03; -} - - -signed char getRange(char *buf, long unit) -{ - return *(buf + 4 + unit) & 0x0F; -} - -#if USE_FXD -FXD FXD_FixMul(FXD a, FXD b) -{ - long high_a, low_a, high_b, low_b; - long hahb, halb, lahb; - unsigned long lalb; - FXD ret; - - high_a = a >> 16; - low_a = a & 0x0000FFFF; - high_b = b >> 16; - low_b = b & 0x0000FFFF; - - hahb = (high_a * high_b) << 16; - halb = high_a * low_b; - lahb = low_a * high_b; - lalb = (unsigned long)(low_a * low_b) >> 16; - - ret = hahb + halb + lahb + lalb; - - return ret; -} -#endif +/* + author: unknown, probably bitmaster? + slightly modified by dbalster +*/ + +#include +#include +#include +#include +#include "common.h" +#include "xadecode.h" + +#if USE_FXD +static FXD K0[4] = { + 0x00000000, + 0x0000F000, + 0x0001CC00, + 0x00018800 +}; +static FXD K1[4] = { + 0x00000000, + 0x00000000, + 0xFFFF3000, + 0xFFFF2400 +}; +FXD t1, t2, at1[256], at2[256]; +FXD t1_x, t2_x, at1_x[256], at2_x[256]; +#else +static double K0[4] = { + 0.0, + 0.9375, + 1.796875, + 1.53125 +}; +static double K1[4] = { + 0.0, + 0.0, + -0.8125, + -0.859375 +}; +double t1, t2, at1[256], at2[256]; +double t1_x, t2_x, at1_x[256], at2_x[256]; +#endif + +void initXaDecode(void) +{ + int i; + + for (i=0; i<256; ++i) + { + at1[i] = at2[i] = at1_x[i] = at2_x[i] = 0; + } +} +void reinitXaDecode(int i) +{ + at1[i] = at2[i] = at1_x[i] = at2_x[i] = 0; +} +void switchXaDecode(int i) +{ + t1 = at1[i]; + t2 = at2[i]; + t1_x = at1_x[i]; + t2_x = at2_x[i]; +} +void saveXaDecode(int i) +{ + at1[i] = t1; + at2[i] = t2; + at1_x[i]= t1_x; + at2_x[i]= t2_x; +} + +char xachannel(SoundSector *ss) +{ + return(ss->sectorFiller[XAChannel]); +} + +unsigned char xatype(SoundSector *ss) +{ + return(unsigned char) (ss->sectorFiller[XAType]); +} + +char xafileno(SoundSector *ss) +{ + return(ss->sectorFiller[XAFile]); +} + +char xastereo(SoundSector *ss) +{ + return(ss->sectorFiller[XAFlags]&XAFStereo); +} + +char xahalfhz(SoundSector *ss) +{ + return(ss->sectorFiller[XAFlags]&XAFHalfHz); +} + +long convXaToWave(char *adp, char *wav, int cn, int fn_s, int fn_e) +{ + SoundSector ssct; + int i; + + memcpy(ssct.sectorFiller,adp,sizeof(ssct.sectorFiller)); + for(i=0;i<18;i++) + memcpy(ssct.SoundGroups[i],adp+sizeof(ssct.sectorFiller)+(128*i),128); + if ((xachannel(&ssct) == cn) && (xatype(&ssct) == XAAUDIO)) + { + if (xafileno(&ssct) >= fn_s + && xafileno(&ssct) <= fn_e) + { + if (xastereo(&ssct)) + return(decodeSoundSect1(&ssct, wav)); + else + return(decodeSoundSect(&ssct, wav)); + } + } + return(0); +} + +long decodeSoundSect(SoundSector *ssct, char *wav) +{ + long count, outputBytes; + signed char snddat, filt, range; + short decoded; + long unit, sample; + long sndgrp; +#if USE_FXD + FXD tmp2, tmp3, tmp4, tmp5; +#else + double tmp2, tmp3, tmp4, tmp5; +#endif + + outputBytes = 0; + + for (sndgrp = 0; sndgrp < kNumOfSGs; sndgrp++) + { + count = 0; + for (unit = 0; unit < 8; unit++) + { + range = getRange(ssct->SoundGroups[sndgrp], unit); + filt = getFilter(ssct->SoundGroups[sndgrp], unit); + for (sample = 0; sample < 28; sample++) + { + snddat = getSoundData(ssct->SoundGroups[sndgrp], unit, sample); +#if USE_FXD + tmp2 = (long)(snddat) << (12 - range); + tmp3 = FXD_Pcm16ToFxd(tmp2); + tmp4 = FXD_FixMul(K0[filt], t1); + tmp5 = FXD_FixMul(K1[filt], t2); + t2 = t1; + t1 = tmp3 + tmp4 + tmp5; + decoded = FXD_FxdToPcm16(t1); +#else + tmp2 = (double)(1 << (12 - range)); + tmp3 = (double)snddat * tmp2; + tmp4 = t1 * K0[filt]; + tmp5 = t2 * K1[filt]; + t2 = t1; + t1 = tmp3 + tmp4 + tmp5; + decoded = DblToPCM(t1); +#endif + wav[outputBytes+count++] = (char)(decoded & 0x0000ffff); + wav[outputBytes+count++] = (char)(decoded >> 8); + } + } + outputBytes += count; + } + return outputBytes; +} + +long decodeSoundSect1(SoundSector *ssct, char *wav) +{ + long count, outputBytes; + signed char snddat, filt, range; + signed char filt1, range1; + short decoded; + long unit, sample; + long sndgrp; +#if USE_FXD + FXD tmp2, tmp3, tmp4, tmp5; +#else + double tmp2, tmp3, tmp4, tmp5; +#endif + + outputBytes = 0; + + for (sndgrp = 0; sndgrp < kNumOfSGs; sndgrp++) + { + count = 0; + for (unit = 0; unit < 8; unit+= 2) + { + range = getRange(ssct->SoundGroups[sndgrp], unit); + filt = getFilter(ssct->SoundGroups[sndgrp], unit); + range1 = getRange(ssct->SoundGroups[sndgrp], unit+1); + filt1 = getFilter(ssct->SoundGroups[sndgrp], unit+1); + + for (sample = 0; sample < 28; sample++) + { + /* Channel 1 */ + snddat = getSoundData(ssct->SoundGroups[sndgrp], unit, sample); +#if USE_FXD + tmp2 = (long)(snddat) << (12 - range); + tmp3 = FXD_Pcm16ToFxd(tmp2); + tmp4 = FXD_FixMul(K0[filt], t1); + tmp5 = FXD_FixMul(K1[filt], t2); + t2 = t1; + t1 = tmp3 + tmp4 + tmp5; + decoded = FXD_FxdToPcm16(t1); +#else + tmp2 = (double)(1 << (12 - range)); + tmp3 = (double)snddat * tmp2; + tmp4 = t1 * K0[filt]; + tmp5 = t2 * K1[filt]; + t2 = t1; + t1 = tmp3 + tmp4 + tmp5; + decoded = DblToPCM(t1); +#endif + wav[outputBytes + count++] = (char)(decoded & 0x0000ffff); + wav[outputBytes + count++] = (char)(decoded >> 8); + + /* Channel 2 */ + snddat = getSoundData(ssct->SoundGroups[sndgrp], unit+1, sample); +#if USE_FXD + tmp2 = (long)(snddat) << (12 - range1); + tmp3 = FXD_Pcm16ToFxd(tmp2); + tmp4 = FXD_FixMul(K0[filt1], t1_x); + tmp5 = FXD_FixMul(K1[filt1], t2_x); + t2_x = t1_x; + t1_x = tmp3 + tmp4 + tmp5; + decoded = FXD_FxdToPcm16(t1_x); +#else + tmp2 = (double)(1 << (12 - range1)); + tmp3 = (double)snddat * tmp2; + tmp4 = t1_x * K0[filt1]; + tmp5 = t2_x * K1[filt1]; + t2_x = t1_x; + t1_x = tmp3 + tmp4 + tmp5; + decoded = DblToPCM(t1_x); +#endif + wav[outputBytes + count++] = (char)(decoded & 0x0000ffff); + wav[outputBytes + count++] = (char)(decoded >> 8); + } + } + outputBytes += count; + } + return outputBytes; +} + +signed char getSoundData(char *buf, long unit, long sample) +{ + signed char ret; + char *p; + long offset, shift; + + p = buf; + shift = (unit%2) * 4; + + offset = 16 + (unit / 2) + (sample * 4); + p += offset; + + ret = (*p >> shift) & 0x0F; + + if (ret > 7) { + ret -= 16; + } + return ret; +} + +signed char getFilter(char *buf, long unit) +{ + return (*(buf + 4 + unit) >> 4) & 0x03; +} + + +signed char getRange(char *buf, long unit) +{ + return *(buf + 4 + unit) & 0x0F; +} + +#if USE_FXD +FXD FXD_FixMul(FXD a, FXD b) +{ + long high_a, low_a, high_b, low_b; + long hahb, halb, lahb; + unsigned long lalb; + FXD ret; + + high_a = a >> 16; + low_a = a & 0x0000FFFF; + high_b = b >> 16; + low_b = b & 0x0000FFFF; + + hahb = (high_a * high_b) << 16; + halb = high_a * low_b; + lahb = low_a * high_b; + lalb = (unsigned long)(low_a * low_b) >> 16; + + ret = hahb + halb + lahb + lalb; + + return ret; +} +#endif diff --git a/psxdev/xadecode.h b/psxdev/xadecode.h index b886285..4714667 100644 --- a/psxdev/xadecode.h +++ b/psxdev/xadecode.h @@ -1,92 +1,92 @@ -/* - author: unknown, probably bitmaster? - slightly modified by dbalster -*/ - -#include "generic.h" - -#ifndef XADECODE_H -#define XADECODE_H - -#define USE_FXD 1 - -#define kNumOfSamples 224 -#define kNumOfSGs 18 - -#define XAFile 0 -#define XAChannel 1 -#define XAType 2 -#define XAFlags 3 -/* bits in XAFlags byte */ -#define XAFStereo 1<<0 -#define XAFHalfHz 1<<2 - -#define XAAUDIO 0x64 -#define XAVIDEO 0x48 -#define XABREAK 0xE4 -#define XACURRENT 0x100 /* for application use only! */ -#define XANONE 0x200 /* for application use only! */ -#define XAAV 0x400 /* for application use only! */ - -#define max(a,b) (ab?b:a) - -#define FXD_FxdToPCM(dt) (max(min((short)((dt)>>16), 32767), -32768)) -#define DblToPCM(dt) (short)(max(min((dt), 32767), -32768)) - -#define WHP_READ68_AUTO(fp, dt) WHP_Read68(dt, sizeof(*(dt)), 1, fp) -#define WHP_WRITE68_AUTO(fp, dt) WHP_Write68(dt, sizeof(*(dt)), 1, fp) - -#define WHP_CNV_SHORT68(dt, ndt) WHP_CnvEndianShort((dt), (ndt)) -#define WHP_CNV_LONG68(dt, ndt) WHP_CnvEndianLong((dt), (ndt)) - -#if USE_FXD -#define FXD_FxdToPcm16(dt) (max(min((dt)/2, 32767), -32768)) -#define FXD_Pcm16ToFxd(dt) ((long)dt*2) -#endif - -#define XAWAVBUFSIZE (kNumOfSamples*kNumOfSGs*2) - -typedef char SoundGroup[128]; - -typedef struct SoundSector { - char sectorFiller[8]; - SoundGroup SoundGroups[kNumOfSGs]; -} PACKED SoundSector; - -typedef unsigned long DWORD; -typedef unsigned short WORD; - -#if USE_FXD -typedef long FXD; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -long decodeSoundSect(SoundSector *ssct, char *wav); -long decodeSoundSect1(SoundSector *ssct, char *wav); -long convXaToWave(char *adp, char *wav, int cn, int fn_s, int fn_e); -void initXaDecode(void); -void switchXaDecode(int channel); -void saveXaDecode(int channel); -void reinitXaDecode(int channel); -signed char getSoundData(char *buf, long unit, long sample); -signed char getFilter(char *buf, long unit); -signed char getRange(char *buf, long unit); -char xachannel(SoundSector *ss); -unsigned char xatype(SoundSector *ss); -char xafileno(SoundSector *ss); -char xastereo(SoundSector *ss); -char xahalfhz(SoundSector *ss); - -#if USE_FXD -FXD FXD_FixMul(FXD a, FXD b); -#endif - -#ifdef __cplusplus -} -#endif - -#endif +/* + author: unknown, probably bitmaster? + slightly modified by dbalster +*/ + +#include "generic.h" + +#ifndef XADECODE_H +#define XADECODE_H + +#define USE_FXD 1 + +#define kNumOfSamples 224 +#define kNumOfSGs 18 + +#define XAFile 0 +#define XAChannel 1 +#define XAType 2 +#define XAFlags 3 +/* bits in XAFlags byte */ +#define XAFStereo 1<<0 +#define XAFHalfHz 1<<2 + +#define XAAUDIO 0x64 +#define XAVIDEO 0x48 +#define XABREAK 0xE4 +#define XACURRENT 0x100 /* for application use only! */ +#define XANONE 0x200 /* for application use only! */ +#define XAAV 0x400 /* for application use only! */ + +#define max(a,b) (ab?b:a) + +#define FXD_FxdToPCM(dt) (max(min((short)((dt)>>16), 32767), -32768)) +#define DblToPCM(dt) (short)(max(min((dt), 32767), -32768)) + +#define WHP_READ68_AUTO(fp, dt) WHP_Read68(dt, sizeof(*(dt)), 1, fp) +#define WHP_WRITE68_AUTO(fp, dt) WHP_Write68(dt, sizeof(*(dt)), 1, fp) + +#define WHP_CNV_SHORT68(dt, ndt) WHP_CnvEndianShort((dt), (ndt)) +#define WHP_CNV_LONG68(dt, ndt) WHP_CnvEndianLong((dt), (ndt)) + +#if USE_FXD +#define FXD_FxdToPcm16(dt) (max(min((dt)/2, 32767), -32768)) +#define FXD_Pcm16ToFxd(dt) ((long)dt*2) +#endif + +#define XAWAVBUFSIZE (kNumOfSamples*kNumOfSGs*2) + +typedef char SoundGroup[128]; + +typedef struct SoundSector { + char sectorFiller[8]; + SoundGroup SoundGroups[kNumOfSGs]; +} PACKED SoundSector; + +typedef unsigned long DWORD; +typedef unsigned short WORD; + +#if USE_FXD +typedef long FXD; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +long decodeSoundSect(SoundSector *ssct, char *wav); +long decodeSoundSect1(SoundSector *ssct, char *wav); +long convXaToWave(char *adp, char *wav, int cn, int fn_s, int fn_e); +void initXaDecode(void); +void switchXaDecode(int channel); +void saveXaDecode(int channel); +void reinitXaDecode(int channel); +signed char getSoundData(char *buf, long unit, long sample); +signed char getFilter(char *buf, long unit); +signed char getRange(char *buf, long unit); +char xachannel(SoundSector *ss); +unsigned char xatype(SoundSector *ss); +char xafileno(SoundSector *ss); +char xastereo(SoundSector *ss); +char xahalfhz(SoundSector *ss); + +#if USE_FXD +FXD FXD_FixMul(FXD a, FXD b); +#endif + +#ifdef __cplusplus +} +#endif + +#endif -- cgit v1.2.3