diff --git a/ee/dma/include/dma_tags.h b/ee/dma/include/dma_tags.h index 783d22c18e2..3e71be634aa 100644 --- a/ee/dma/include/dma_tags.h +++ b/ee/dma/include/dma_tags.h @@ -103,7 +103,7 @@ /** Insert anywhere, qwc at addr is sent, then ends transfer */ #define DMATAG_REFE(Q,QWC,ADDR,SPR,W2,W3) \ - Q->dw[0] = DMATAG(qwc, 0, DMA_TAG_REFE, 0, addr, spr), \ + Q->dw[0] = DMATAG(QWC,0,DMA_TAG_REFE,0,ADDR,SPR), \ Q->sw[2] = (u32)(W2), \ Q->sw[3] = (u32)(W3) diff --git a/ee/mpeg/Makefile b/ee/mpeg/Makefile index 6f7c4648437..d7ad7424a88 100644 --- a/ee/mpeg/Makefile +++ b/ee/mpeg/Makefile @@ -6,7 +6,9 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. -EE_OBJS = libmpeg.o libmpeg_core.o erl-support.o +EE_INCS += -I$(PS2SDKSRC)/ee/dma/include + +EE_OBJS = libmpeg.o libmpeg_core.o libmpeg_op.o erl-support.o include $(PS2SDKSRC)/Defs.make include $(PS2SDKSRC)/ee/Rules.lib.make diff --git a/ee/mpeg/samples/mpeg.c b/ee/mpeg/samples/mpeg.c index 5e967dfe32c..2207922e4bd 100644 --- a/ee/mpeg/samples/mpeg.c +++ b/ee/mpeg/samples/mpeg.c @@ -25,163 +25,166 @@ #include #include #include -#include +#include #include #include #include #include +#include +#include -#define MPEG_BITSTREAM_FILE "host:test.bin" +#define MPEG_BITSTREAM_FILE "test.bin" /* get the whole file (or first 24MB) into memory for simplicity */ -#define MAX_SIZE ( 1024 * 1024 * 24 ) - -typedef struct InitCBParam { - - MPEGSequenceInfo* m_pInfo; - void* m_pData; - packet_t *m_XFerPck; - packet_t *m_DrawPck; - int m_TexAddr; - +#define MAX_SIZE (1024 * 1024 * 24) + +typedef struct InitCBParam +{ + MPEGSequenceInfo *m_pInfo; + void *m_pData; + packet_t *m_XFerPck; + packet_t *m_DrawPck; + int m_TexAddr; } InitCBParam; -static unsigned char* s_pMPEGData; -static unsigned char* s_pTransferPtr; -static unsigned int s_MPEGDataSize; - -static int SetDMA ( void* ); -static void* InitCB ( void*, MPEGSequenceInfo* ); - -int main ( void ) { -/* read file (or part of it ) into memory */ - packet_t *lPck; - qword_t *q; - framebuffer_t frame; - zbuffer_t z; - InitCBParam lInfo; - int lFD = open ( MPEG_BITSTREAM_FILE, O_RDONLY ); - long lSize; - s64 lPTS, lCurPTS; - - frame.width = 640; - frame.height = 512; - frame.mask = 0; - frame.psm = GS_PSM_32; - frame.address = graph_vram_allocate(frame.width,frame.height, frame.psm, GRAPH_ALIGN_PAGE); - - z.enable = 0; - z.mask = 0; - z.method = 0; - z.zsm = 0; - z.address = 0; - - lPck = packet_init(100, PACKET_NORMAL); - - if ( lFD < 0 ) { - printf ( "test_mpeg: could not open '%s'\n", MPEG_BITSTREAM_FILE ); - goto end; - } /* end if */ - - lSize = lseek ( lFD, 0, SEEK_END ); - lseek ( lFD, 0, SEEK_SET ); - - if ( lSize <= 0 ) { - printf ( "test_mpeg: could not obtain file size (%ld)\n", lSize ); - goto end; - } /* end if */ - - s_pMPEGData = ( unsigned char* )memalign ( 64, lSize = lSize > MAX_SIZE ? MAX_SIZE : lSize ); - - if ( !s_pMPEGData ) { - printf ( "test_mpeg: could not allocate enough memory (%ld)\n", lSize ); - goto end; - } /* end if */ - - if ( read ( - lFD, s_pTransferPtr = s_pMPEGData, s_MPEGDataSize = lSize - ) != lSize - ) { - printf ( "test_mpeg: could not read file\n" ); - goto end; - } /* end if */ - - close ( lFD ); - -/* initialize DMAC (I have no idea what this code does as */ -/* I'm not quite familiar with ps2sdk) */ - dma_channel_initialize ( DMA_CHANNEL_toIPU, NULL, 0 ); - dma_channel_initialize ( DMA_CHANNEL_GIF, NULL, 0 ); - dma_channel_fast_waits( DMA_CHANNEL_GIF ); - -/* initialize graphics synthesizer */ - graph_initialize(0,640,512,GS_PSM_32,0,0); - -/* setup texture buffer address just after the framebuffer */ - lInfo.m_TexAddr = graph_vram_allocate(0,0,GS_PSM_32,GRAPH_ALIGN_BLOCK); - - q = lPck->data; - q = draw_setup_environment(q,0,&frame,&z); - -/* clear screen */ - q = draw_clear(q,0,0,0,640.0f,512.0f,0,0,0); - - dma_channel_send_normal(DMA_CHANNEL_GIF, lPck->data, q - lPck->data, 0, 0); - -/* now it's time to initialize MPEG decoder (though it can be */ -/* initialized any time). Just make sure that DMA transfers */ -/* to and from IPU (and DRAM -> SPR) are not active, otherwise */ -/* unpredicted things will happen. Initialization code is also */ -/* allocating some memory using 'memalign' function and no */ -/* check is performed whether the allocation was successful or */ -/* not, so, before calling this make sure that at least WxHx4x3 */ -/* bytes are avaliable for dynamic allocation (possibly using */ -/* ps2_sbrk ( 0 ) call) where W and H are picture dimensions in */ -/* units of pixels. */ - MPEG_Initialize ( SetDMA, NULL, InitCB, &lInfo, &lCurPTS ); -/* during decoding scratchpad RAM from address 0x0000 to 0x3C00 */ -/* is used by the decoder. */ -/* let's go */ - while ( 1 ) { -/* try decode picture into "lInfo.m_pData" area. It's allowed */ -/* to supply different area each time, just make sure that */ -/* there're no conflicts with data cache, as decoder doesn't do */ -/* anything to synchronize/flush/invalidate data cache. */ -/* RGB -> YUV colorspace conversion is pefromed automatically */ -/* using interrupt hahdler/semaphore, so, multithreaded */ -/* application can benefit from it. Usage of IPU and DMA channels */ -/* to/from IPU and DRAM -> SPR is strictly forbidden during */ -/* decoding :). */ - if ( !MPEG_Picture ( lInfo.m_pData, &lPTS ) ) { -/* MPEG_Picture returns nonzero if the picture was successfully */ -/* decoded. Zero return means one of the following: */ -/* - end of stream was detected (SetDMA function returned zero) */ -/* - MPEG sequence end code (0x000001B7) was detected */ -/* this test just finishes in both cases */ - if ( lInfo.m_pInfo -> m_fEOF ) break; -/* ...instead of 'break' we can continue to the next sequence...*/ -/* ...but I'm too lazy to handle second call of 'InitCB' :D */ - else break; - } /* end if */ -/* now transfer decoded picture data into texture area of GS RAM */ - dma_wait_fast(); - dma_channel_send_chain( DMA_CHANNEL_GIF, lInfo.m_XFerPck -> data, lInfo.m_XFerPck -> qwc, 0, 0); -/* wait for vsync 2 times (we have interlaced frame mode) */ - graph_wait_vsync (); - graph_wait_vsync (); -/* no need to wait for DMA transfer completion since vsyncs above */ -/* have enough lattency... */ -/* ...and finally draw decoded picture... */ - dma_channel_send_normal( DMA_CHANNEL_GIF, lInfo.m_DrawPck -> data, lInfo.m_DrawPck -> qwc, 0, 0); -/* ...and go back for the next one */ - } /* end while */ -/* free memory and other resources */ - MPEG_Destroy (); +static unsigned char *s_pMPEGData; +static unsigned char *s_pTransferPtr; +static unsigned int s_MPEGDataSize; + +static int SetDMA(void *); +static void *InitCB(void *, MPEGSequenceInfo *); + +int main(void) +{ + /* read file (or part of it ) into memory */ + packet_t *lPck; + qword_t *q; + framebuffer_t frame; + zbuffer_t z; + InitCBParam lInfo; + int lFD = open(MPEG_BITSTREAM_FILE, O_RDONLY); + long lSize; + s64 lPTS, lCurPTS; + + frame.width = 640; + frame.height = 512; + frame.mask = 0; + frame.psm = GS_PSM_32; + frame.address = graph_vram_allocate(frame.width, frame.height, frame.psm, GRAPH_ALIGN_PAGE); + + z.enable = 0; + z.mask = 0; + z.method = 0; + z.zsm = 0; + z.address = 0; + + lPck = packet_init(100, PACKET_NORMAL); + + if (lFD < 0) { + printf("test_mpeg: could not open '%s'\n", MPEG_BITSTREAM_FILE); + goto end; + } + + lSize = lseek(lFD, 0, SEEK_END); + lseek(lFD, 0, SEEK_SET); + + if (lSize <= 0) { + printf("test_mpeg: could not obtain file size (%ld)\n", lSize); + goto end; + } + + s_pMPEGData = memalign(64, lSize = lSize > MAX_SIZE ? MAX_SIZE : lSize); + if (!s_pMPEGData) { + printf("test_mpeg: could not allocate enough memory (%ld)\n", lSize); + goto end; + } + + if (read(lFD, s_pTransferPtr = s_pMPEGData, s_MPEGDataSize = lSize) != lSize) { + printf("test_mpeg: could not read file\n"); + goto end; + } + + close(lFD); + + /* initialize DMAC (I have no idea what this code does as */ + /* I'm not quite familiar with ps2sdk) */ + dma_channel_initialize(DMA_CHANNEL_toIPU, NULL, 0); + dma_channel_initialize(DMA_CHANNEL_GIF, NULL, 0); + dma_channel_fast_waits(DMA_CHANNEL_GIF); + + /* initialize graphics synthesizer */ + graph_initialize(0, 640, 512, GS_PSM_32, 0, 0); + + /* setup texture buffer address just after the framebuffer */ + lInfo.m_TexAddr = graph_vram_allocate(0, 0, GS_PSM_32, GRAPH_ALIGN_BLOCK); + + q = lPck->data; + q = draw_setup_environment(q, 0, &frame, &z); + + /* clear screen */ + q = draw_clear(q, 0, 0, 0, 640.0f, 512.0f, 0, 0, 0); + + dma_channel_send_normal(DMA_CHANNEL_GIF, lPck->data, q - lPck->data, 0, 0); + + /* now it's time to initialize MPEG decoder (though it can be */ + /* initialized any time). Just make sure that DMA transfers */ + /* to and from IPU (and DRAM -> SPR) are not active, otherwise */ + /* unpredicted things will happen. Initialization code is also */ + /* allocating some memory using 'memalign' function and no */ + /* check is performed whether the allocation was successful or */ + /* not, so, before calling this make sure that at least WxHx4x3 */ + /* bytes are avaliable for dynamic allocation (possibly using */ + /* ps2_sbrk ( 0 ) call) where W and H are picture dimensions in */ + /* units of pixels. */ + MPEG_Initialize(SetDMA, NULL, InitCB, &lInfo, &lCurPTS); + /* during decoding scratchpad RAM from address 0x0000 to 0x3C00 */ + /* is used by the decoder. */ + /* let's go */ + while (1) { + /* try decode picture into "lInfo.m_pData" area. It's allowed */ + /* to supply different area each time, just make sure that */ + /* there're no conflicts with data cache, as decoder doesn't do */ + /* anything to synchronize/flush/invalidate data cache. */ + /* RGB -> YUV colorspace conversion is pefromed automatically */ + /* using interrupt hahdler/semaphore, so, multithreaded */ + /* application can benefit from it. Usage of IPU and DMA channels */ + /* to/from IPU and DRAM -> SPR is strictly forbidden during */ + /* decoding :). */ + if (!MPEG_Picture(lInfo.m_pData, &lPTS)) { + /* MPEG_Picture returns nonzero if the picture was successfully */ + /* decoded. Zero return means one of the following: */ + /* - end of stream was detected (SetDMA function returned zero) */ + /* - MPEG sequence end code (0x000001B7) was detected */ + /* this test just finishes in both cases */ + if (lInfo.m_pInfo->m_fEOF) { + break; + } else { + /* ...instead of 'break' we can continue to the next sequence...*/ + /* ...but I'm too lazy to handle second call of 'InitCB' :D */ + break; + } + } + + /* now transfer decoded picture data into texture area of GS RAM */ + dma_wait_fast(); + dma_channel_send_chain(DMA_CHANNEL_GIF, lInfo.m_XFerPck->data, lInfo.m_XFerPck->qwc, 0, 0); + /* wait for vsync 2 times (we have interlaced frame mode) */ + graph_wait_vsync(); + graph_wait_vsync(); + /* no need to wait for DMA transfer completion since vsyncs above */ + /* have enough lattency... */ + /* ...and finally draw decoded picture... */ + dma_channel_send_normal(DMA_CHANNEL_GIF, lInfo.m_DrawPck->data, lInfo.m_DrawPck->qwc, 0, 0); + /* ...and go back for the next one */ + } + + /* free memory and other resources */ + MPEG_Destroy(); end: - printf ( "test_mpeg: test finished\n" ); - return SleepThread (), 0; + printf("test_mpeg: test finished\n"); + return SleepThread(), 0; +} -} /* end main */ /* This gets called by MPEG decoder to get data to decode. */ /* It performs normal DMA data transfer to IPU and returns */ /* nozero to indicate that data have been sent. Zero return */ @@ -190,19 +193,18 @@ int main ( void ) { /* 1MB minus 16. Sample function uses 2048 bytes blocks. */ /* Don't use source chain transfer as it will lead to */ /* unpredictable results. */ -static int SetDMA ( void* apUserData ) { - - if ( s_pTransferPtr - s_pMPEGData >= s_MPEGDataSize ) return 0; +static int SetDMA(void *apUserData) +{ - dma_channel_wait(DMA_CHANNEL_toIPU,0); - dma_channel_send_normal( - DMA_CHANNEL_toIPU, s_pTransferPtr, 2048>>4, 0, 0 - ); - s_pTransferPtr += 2048; + if (s_pTransferPtr - s_pMPEGData >= s_MPEGDataSize) + return 0; - return 1; + dma_channel_wait(DMA_CHANNEL_toIPU, 0); + dma_channel_send_normal(DMA_CHANNEL_toIPU, s_pTransferPtr, 2048 >> 4, 0, 0); + s_pTransferPtr += 2048; -} /* end SetDMA */ + return 1; +} /* This gets called when sequence start header is detected in the */ /* input bitstream. is filled by the decoder and callback */ @@ -215,87 +217,87 @@ static int SetDMA ( void* apUserData ) { /* pointer each time, but the data area should be large enough to */ /* accomodate the whole picture. is just a user supplied */ /* data (anything). */ -static void* InitCB ( void* apParam, MPEGSequenceInfo* apInfo ) { - - int lDataSize = apInfo -> m_Width * apInfo -> m_Height * 4; - char* retVal = ( char* )memalign ( 64, lDataSize ); - InitCBParam* lpParam = ( InitCBParam* )apParam; - int lMBW = ( apInfo -> m_Width ) >> 4; - int lMBH = ( apInfo -> m_Height ) >> 4; - int lTBW = ( apInfo -> m_Width + 63 ) >> 6; - int lTW = draw_log2 ( apInfo -> m_Width ); - int lTH = draw_log2 ( apInfo -> m_Height ); - int lX, lY; - char* lpImg; - qword_t* q; - - lpParam -> m_TexAddr >>= 6; - - lpParam -> m_pData = lpImg = retVal; - lpParam -> m_pInfo = apInfo; - SyncDCache ( retVal, retVal + lDataSize ); -/* This initializes picture transfer packet. */ -/* Decoded picture is a sequence of 16x16 pixels */ -/* 'subpictures' (macroblocks) and DMA controller */ -/* will transfer them all at once using source */ -/* chain transfer mode. */ - lpParam -> m_XFerPck = packet_init((10 + 12 * lMBW * lMBH )>>1,PACKET_NORMAL); - - q = lpParam-> m_XFerPck -> data; - - DMATAG_CNT(q, 3, 0, 0, 0); - q++; - PACK_GIFTAG(q,GIF_SET_TAG( 2, 0, 0, 0, 0, 1 ),GIF_REG_AD); - q++; - PACK_GIFTAG(q,GS_SET_TRXREG( 16, 16 ), GS_REG_TRXREG); - q++; - PACK_GIFTAG(q,GS_SET_BITBLTBUF( 0, 0, 0, lpParam -> m_TexAddr, lTBW, GS_PSM_32 ), GS_REG_BITBLTBUF); - q++; - - for ( lY = 0; lY < apInfo -> m_Height; lY += 16 ) { - for ( lX = 0; lX < apInfo -> m_Width; lX += 16, lpImg += 1024 ) { - DMATAG_CNT(q, 4, 0, 0, 0 ); - q++; - PACK_GIFTAG(q,GIF_SET_TAG( 2, 0, 0, 0, 0, 1 ), GIF_REG_AD ); - q++; - PACK_GIFTAG(q,GS_SET_TRXPOS( 0, 0, lX, lY, 0 ), GS_REG_TRXPOS ); - q++; - PACK_GIFTAG(q,GS_SET_TRXDIR( 0 ), GS_REG_TRXDIR ); - q++; - PACK_GIFTAG(q,GIF_SET_TAG( 64, 1, 0, 0, 2, 0),0); - q++; - DMATAG_REF(q, 64, ( unsigned )lpImg, 0, 0, 0); - q++; - } /* end for */ - } /* end for */ - - //DMATAG_END(q,0,0,0,0); - //q++; - - lpParam-> m_XFerPck -> qwc = q - lpParam-> m_XFerPck -> data; - -/* This initializes picture drawing packet. Just textrured sprite */ -/* that occupies the whole screen (no aspect ratio is taken into */ -/* account for simplicity. */ - lpParam -> m_DrawPck = packet_init(7,PACKET_NORMAL); - q = lpParam -> m_DrawPck -> data; - PACK_GIFTAG(q, GIF_SET_TAG( 6, 1, 0, 0, 0, 1 ), GIF_REG_AD ); - q++; - PACK_GIFTAG(q, GS_SET_TEX0( lpParam -> m_TexAddr, lTBW, GS_PSM_32, lTW, lTH, 1, 1, 0, 0, 0, 0, 0 ), GS_REG_TEX0_1 ); - q++; - PACK_GIFTAG(q, GS_SET_PRIM( 6, 0, 1, 0, 0, 0, 1, 0, 0 ), GS_REG_PRIM ); - q++; - PACK_GIFTAG(q, GS_SET_UV( 0, 0 ), GS_REG_UV ); - q++; - PACK_GIFTAG(q, GS_SET_XYZ( (2048 << 4), (2048 << 4), 0 ), GS_REG_XYZ2 ); - q++; - PACK_GIFTAG(q, GS_SET_UV( apInfo -> m_Width << 4, apInfo -> m_Height << 4 ), GS_REG_UV ); - q++; - PACK_GIFTAG(q, GS_SET_XYZ( (640 << 4) + (2048 << 4), (512 << 4) + (2048 << 4), 0 ), GS_REG_XYZ2 ); - q++; - - lpParam -> m_DrawPck -> qwc = q - lpParam -> m_DrawPck -> data; - - return retVal; - -} /* end InitCB */ +static void *InitCB(void *apParam, MPEGSequenceInfo *apInfo) +{ + + int lDataSize = apInfo->m_Width * apInfo->m_Height * 4; + char *retVal = (char *)memalign(64, lDataSize); + InitCBParam *lpParam = (InitCBParam *)apParam; + int lMBW = (apInfo->m_Width) >> 4; + int lMBH = (apInfo->m_Height) >> 4; + int lTBW = (apInfo->m_Width + 63) >> 6; + int lTW = draw_log2(apInfo->m_Width); + int lTH = draw_log2(apInfo->m_Height); + int lX, lY; + char *lpImg; + qword_t *q; + + lpParam->m_TexAddr >>= 6; + + lpParam->m_pData = lpImg = retVal; + lpParam->m_pInfo = apInfo; + SyncDCache(retVal, retVal + lDataSize); + /* This initializes picture transfer packet. */ + /* Decoded picture is a sequence of 16x16 pixels */ + /* 'subpictures' (macroblocks) and DMA controller */ + /* will transfer them all at once using source */ + /* chain transfer mode. */ + lpParam->m_XFerPck = packet_init((10 + 12 * lMBW * lMBH) >> 1, PACKET_NORMAL); + + q = lpParam->m_XFerPck->data; + + DMATAG_CNT(q, 3, 0, 0, 0); + q++; + PACK_GIFTAG(q, GIF_SET_TAG(2, 0, 0, 0, 0, 1), GIF_REG_AD); + q++; + PACK_GIFTAG(q, GS_SET_TRXREG(16, 16), GS_REG_TRXREG); + q++; + PACK_GIFTAG(q, GS_SET_BITBLTBUF(0, 0, 0, lpParam->m_TexAddr, lTBW, GS_PSM_32), GS_REG_BITBLTBUF); + q++; + + for (lY = 0; lY < apInfo->m_Height; lY += 16) { + for (lX = 0; lX < apInfo->m_Width; lX += 16, lpImg += 1024) { + DMATAG_CNT(q, 4, 0, 0, 0); + q++; + PACK_GIFTAG(q, GIF_SET_TAG(2, 0, 0, 0, 0, 1), GIF_REG_AD); + q++; + PACK_GIFTAG(q, GS_SET_TRXPOS(0, 0, lX, lY, 0), GS_REG_TRXPOS); + q++; + PACK_GIFTAG(q, GS_SET_TRXDIR(0), GS_REG_TRXDIR); + q++; + PACK_GIFTAG(q, GIF_SET_TAG(64, 1, 0, 0, 2, 0), 0); + q++; + DMATAG_REF(q, 64, (unsigned)lpImg, 0, 0, 0); + q++; + } + } + + // DMATAG_END(q,0,0,0,0); + // q++; + + lpParam->m_XFerPck->qwc = q - lpParam->m_XFerPck->data; + + /* This initializes picture drawing packet. Just textrured sprite */ + /* that occupies the whole screen (no aspect ratio is taken into */ + /* account for simplicity. */ + lpParam->m_DrawPck = packet_init(7, PACKET_NORMAL); + q = lpParam->m_DrawPck->data; + PACK_GIFTAG(q, GIF_SET_TAG(6, 1, 0, 0, 0, 1), GIF_REG_AD); + q++; + PACK_GIFTAG(q, GS_SET_TEX0(lpParam->m_TexAddr, lTBW, GS_PSM_32, lTW, lTH, 1, 1, 0, 0, 0, 0, 0), GS_REG_TEX0_1); + q++; + PACK_GIFTAG(q, GS_SET_PRIM(6, 0, 1, 0, 0, 0, 1, 0, 0), GS_REG_PRIM); + q++; + PACK_GIFTAG(q, GS_SET_UV(0, 0), GS_REG_UV); + q++; + PACK_GIFTAG(q, GS_SET_XYZ((2048 << 4), (2048 << 4), 0), GS_REG_XYZ2); + q++; + PACK_GIFTAG(q, GS_SET_UV(apInfo->m_Width << 4, apInfo->m_Height << 4), GS_REG_UV); + q++; + PACK_GIFTAG(q, GS_SET_XYZ((640 << 4) + (2048 << 4), (512 << 4) + (2048 << 4), 0), GS_REG_XYZ2); + q++; + + lpParam->m_DrawPck->qwc = q - lpParam->m_DrawPck->data; + + return retVal; +} diff --git a/ee/mpeg/src/libmpeg.c b/ee/mpeg/src/libmpeg.c index c1a4ccda5ae..5ed4ad8e1d4 100644 --- a/ee/mpeg/src/libmpeg.c +++ b/ee/mpeg/src/libmpeg.c @@ -15,1288 +15,1140 @@ #include #include "libmpeg.h" +#include "ee_regs.h" #include "libmpeg_internal.h" static _MPEGContext s_MPEG12Ctx; -static s64* s_pCurPTS; - -static void ( *LumaOp[ 8 ] ) ( u8* arg1, u16* arg2, int arg3, int arg4, int var1, int ta ) = { - _MPEG_put_luma, _MPEG_put_luma_X, _MPEG_put_luma_Y, _MPEG_put_luma_XY, - _MPEG_avg_luma, _MPEG_avg_luma_X, _MPEG_avg_luma_Y, _MPEG_avg_luma_XY -}; +static s64 *s_pCurPTS; + +static void (*LumaOp[8])(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int) = { + _MPEG_put_luma, _MPEG_put_luma_X, _MPEG_put_luma_Y, _MPEG_put_luma_XY, + _MPEG_avg_luma, _MPEG_avg_luma_X, _MPEG_avg_luma_Y, _MPEG_avg_luma_XY}; + +static void (*ChromaOp[8])(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int) = { + _MPEG_put_chroma, _MPEG_put_chroma_X, _MPEG_put_chroma_Y, _MPEG_put_chroma_XY, + _MPEG_avg_chroma, _MPEG_avg_chroma_X, _MPEG_avg_chroma_Y, _MPEG_avg_chroma_XY}; + +static void (*PutBlockOp[3])(_MPEGMotions *) = { + _MPEG_put_block_il, _MPEG_put_block_fr, _MPEG_put_block_fl}; + +static void (*AddBlockOp[2][2])(_MPEGMotions *) = { + {_MPEG_add_block_frfr, _MPEG_add_block_frfl}, + {_MPEG_add_block_ilfl, _MPEG_add_block_ilfl}}; + +static float s_FrameRate[16] = { + 0.0F, ((23.0F * 1000.0F) / 1001.0F), + 24.0F, 25.0F, ((30.0F * 1000.0F) / 1001.0F), + 30.0F, 50.0F, ((60.0F * 1000.0F) / 1001.0F), + 60.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F}; + +static void *(*_init_cb)(void *, MPEGSequenceInfo *); +static void *s_pInitCBParam; + +static void *_init_seq(void); +static void _destroy_seq(void); + +static int _get_hdr(void); + +static void _seq_header(void); +static void _gop_header(void); +static void _pic_header(void); +static void _ext_and_ud(void); +static void _ext_unknown(void); +static void _ext_seq(void); +static void _ext_seq_dsp(void); +static void _ext_qnt_mtx(void); +static void _ext_cpy_rgt(void); +static void _ext_seq_scl(void); +static void _ext_pic_dsp(void); +static void _ext_pic_cod(void); +static void _ext_pic_ssc(void); +static void _ext_pic_tsc(void); +static void _xtra_bitinf(void); + +static int _get_next_picture(void *, s64 *); +static int _get_first_picture(void *, s64 *); + +int (*MPEG_Picture)(void *, s64 *); + +static void (*DoMC)(void); + +static void _mpeg12_picture_data(void); +static int _mpeg12_slice(int); +static int _mpeg12_dec_mb(int *, int *, int[2][2][2], int[2][2], int[2]); + +void MPEG_Initialize( + int (*apDataCB)(void *), void *apDataCBParam, + void *(*apInitCB)(void *, MPEGSequenceInfo *), void *apInitCBParam, + s64 *apCurPTS) +{ + memset(&s_MPEG12Ctx, 0, sizeof(s_MPEG12Ctx)); + + _MPEG_Initialize(&s_MPEG12Ctx, apDataCB, apDataCBParam, &s_MPEG12Ctx.m_SI.m_fEOF); + + _init_cb = apInitCB; + s_pInitCBParam = apInitCBParam; + s_pCurPTS = apCurPTS; + + s_MPEG12Ctx.m_SI.m_FrameCnt = 0; + s_MPEG12Ctx.m_SI.m_fEOF = 0; + s_MPEG12Ctx.m_SI.m_Profile = -1; + s_MPEG12Ctx.m_SI.m_Level = -1; + s_MPEG12Ctx.m_SI.m_ChromaFmt = MPEG_CHROMA_FORMAT_420; + s_MPEG12Ctx.m_SI.m_VideoFmt = MPEG_VIDEO_FORMAT_UNSPEC; + s_MPEG12Ctx.m_fMPEG2 = 0; + + s_MPEG12Ctx.m_MC[0].m_pSPRBlk = (void *)0x70000000; + s_MPEG12Ctx.m_MC[0].m_pSPRRes = (void *)0x70000300; + s_MPEG12Ctx.m_MC[0].m_pSPRMC = (void *)0x70000600; + s_MPEG12Ctx.m_MC[1].m_pSPRBlk = (void *)0x70001E00; + s_MPEG12Ctx.m_MC[1].m_pSPRRes = (void *)0x70002100; + s_MPEG12Ctx.m_MC[1].m_pSPRMC = (void *)0x70002400; -static void ( *ChromaOp[ 8 ] ) ( u8* arg1, u16* arg2, int arg3, int arg4, int var1, int ta ) = { - _MPEG_put_chroma, _MPEG_put_chroma_X, _MPEG_put_chroma_Y, _MPEG_put_chroma_XY, - _MPEG_avg_chroma, _MPEG_avg_chroma_X, _MPEG_avg_chroma_Y, _MPEG_avg_chroma_XY -}; - -static void ( *PutBlockOp[ 3 ] ) ( _MPEGMotions* ) = { - _MPEG_put_block_il, _MPEG_put_block_fr, _MPEG_put_block_fl -}; - -static void ( *AddBlockOp[ 2 ][ 2 ] ) ( _MPEGMotions* ) = { - { _MPEG_add_block_frfr, _MPEG_add_block_frfl }, - { _MPEG_add_block_ilfl, _MPEG_add_block_ilfl } -}; - -static float s_FrameRate[ 16 ] = { - 0.0F, ( ( 23.0F * 1000.0F ) / 1001.0F ), - 24.0F, 25.0F, ( ( 30.0F * 1000.0F ) / 1001.0F ), - 30.0F, 50.0F, ( ( 60.0F * 1000.0F ) / 1001.0F ), - 60.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F, 0.0F -}; - -static void* ( *_init_cb ) ( void*, MPEGSequenceInfo* ); -static void* s_pInitCBParam; - -static void* _init_seq ( void ); -static void _destroy_seq ( void ); - -static int _get_hdr ( void ); - -static void _seq_header ( void ); -static void _gop_header ( void ); -static void _pic_header ( void ); -static void _ext_and_ud ( void ); -static void _ext_unknown ( void ); -static void _ext_seq ( void ); -static void _ext_seq_dsp ( void ); -static void _ext_qnt_mtx ( void ); -static void _ext_cpy_rgt ( void ); -static void _ext_seq_scl ( void ); -static void _ext_pic_dsp ( void ); -static void _ext_pic_cod ( void ); -static void _ext_pic_ssc ( void ); -static void _ext_pic_tsc ( void ); -static void _xtra_bitinf ( void ); - -static int _get_next_picture ( void*, s64* ); -static int _get_first_picture ( void*, s64* ); - -int ( *MPEG_Picture ) ( void*, s64* ); - -static void ( *DoMC ) ( void ); - -static void _mpeg12_picture_data ( void ); -static int _mpeg12_slice ( int ); -static int _mpeg12_dec_mb ( int*, int*, int[ 2 ][ 2 ][ 2 ], int [ 2 ][ 2 ], int[ 2 ] ); - -void MPEG_Initialize ( - int ( *apDataCB ) ( void* ), void* apDataCBParam, - void* ( *apInitCB ) ( void*, MPEGSequenceInfo* ), void* apInitCBParam, - s64* apCurPTS - ) { - - memset ( &s_MPEG12Ctx, 0, sizeof ( s_MPEG12Ctx ) ); - - _MPEG_Initialize ( &s_MPEG12Ctx, apDataCB, apDataCBParam, &s_MPEG12Ctx.m_SI.m_fEOF ); - - _init_cb = apInitCB; - s_pInitCBParam = apInitCBParam; - s_pCurPTS = apCurPTS; - - s_MPEG12Ctx.m_SI.m_FrameCnt = 0; - s_MPEG12Ctx.m_SI.m_fEOF = 0; - s_MPEG12Ctx.m_SI.m_Profile = -1; - s_MPEG12Ctx.m_SI.m_Level = -1; - s_MPEG12Ctx.m_SI.m_ChromaFmt = MPEG_CHROMA_FORMAT_420; - s_MPEG12Ctx.m_SI.m_VideoFmt = MPEG_VIDEO_FORMAT_UNSPEC; - s_MPEG12Ctx.m_fMPEG2 = 0; - - s_MPEG12Ctx.m_MC[ 0 ].m_pSPRBlk = ( void* )0x70000000; - s_MPEG12Ctx.m_MC[ 0 ].m_pSPRRes = ( void* )0x70000300; - s_MPEG12Ctx.m_MC[ 0 ].m_pSPRMC = ( void* )0x70000600; - s_MPEG12Ctx.m_MC[ 1 ].m_pSPRBlk = ( void* )0x70001E00; - s_MPEG12Ctx.m_MC[ 1 ].m_pSPRRes = ( void* )0x70002100; - s_MPEG12Ctx.m_MC[ 1 ].m_pSPRMC = ( void* )0x70002400; - - MPEG_Picture = _get_first_picture; - -} /* end MPEG_Initialize */ - -void MPEG_Destroy ( void ) { - - _destroy_seq (); - _MPEG_Destroy (); - -} /* end MPEG_Destroy */ - -static void* _init_seq ( void ) { - - int lMBWidth, lMBHeight; - - if ( !s_MPEG12Ctx.m_fMPEG2 ) { - s_MPEG12Ctx.m_fProgSeq = 1; - s_MPEG12Ctx.m_PictStruct = _MPEG_PS_FRAME; - s_MPEG12Ctx.m_fFPFrmDCT = 1; - } /* end if */ - - lMBWidth = ( s_MPEG12Ctx.m_SI.m_Width + 15 ) / 16; - lMBHeight = s_MPEG12Ctx.m_fMPEG2 && !s_MPEG12Ctx.m_fProgSeq ? 2 * ( ( s_MPEG12Ctx.m_SI.m_Height + 31 ) / 32 ) - : ( s_MPEG12Ctx.m_SI.m_Height + 15 ) / 16; - - if ( lMBWidth != s_MPEG12Ctx.m_MBWidth || - lMBHeight != s_MPEG12Ctx.m_MBHeight - ) { - - int i, lSize; - - if ( s_MPEG12Ctx.m_pFwdFrame ) _destroy_seq (); - - s_MPEG12Ctx.m_MBWidth = lMBWidth; - s_MPEG12Ctx.m_MBHeight = lMBHeight; - s_MPEG12Ctx.m_SI.m_Width = lMBWidth << 4; - s_MPEG12Ctx.m_SI.m_Height = lMBHeight << 4; - - s_MPEG12Ctx.m_MBStride = lMBWidth * sizeof ( _MPEGMacroBlock8 ); - - lSize = lMBWidth * ( lMBHeight + 1 ) * sizeof ( _MPEGMacroBlock8 ) + sizeof ( _MPEGMacroBlock8 ); - - s_MPEG12Ctx.m_pFwdFrame = ( _MPEGMacroBlock8* )memalign ( 64, lSize ); - s_MPEG12Ctx.m_pBckFrame = ( _MPEGMacroBlock8* )memalign ( 64, lSize ); - s_MPEG12Ctx.m_pAuxFrame = ( _MPEGMacroBlock8* )memalign ( 64, lSize ); - - s_MPEG12Ctx.m_pMBXY = ( _MPEGMBXY* )malloc ( - sizeof ( _MPEGMBXY ) * ( s_MPEG12Ctx.m_MBCount = s_MPEG12Ctx.m_MBWidth * s_MPEG12Ctx.m_MBHeight ) - ); - - for ( i = 0; i < s_MPEG12Ctx.m_MBCount; ++i ) { - s_MPEG12Ctx.m_pMBXY[ i ].m_X = i % lMBWidth; - s_MPEG12Ctx.m_pMBXY[ i ].m_Y = i / lMBWidth; - } /* end for */ - - } /* end if */ - - return _init_cb ( s_pInitCBParam, &s_MPEG12Ctx.m_SI ); - -} /* end _init_seq */ - -static void _destroy_seq ( void ) { - - MPEG_Picture = _get_first_picture; - - if ( s_MPEG12Ctx.m_pAuxFrame ) { - free ( s_MPEG12Ctx.m_pAuxFrame ); - s_MPEG12Ctx.m_pAuxFrame = NULL; - } /* end if */ - - if ( s_MPEG12Ctx.m_pBckFrame ) { - free ( s_MPEG12Ctx.m_pBckFrame ); - s_MPEG12Ctx.m_pBckFrame = NULL; - } /* end if */ + MPEG_Picture = _get_first_picture; +} + +void MPEG_Destroy(void) +{ + _destroy_seq(); + _MPEG_Destroy(); +} + +static void *_init_seq(void) +{ + int lMBWidth, lMBHeight; + char *pA; + + if (!s_MPEG12Ctx.m_fMPEG2) { + s_MPEG12Ctx.m_fProgSeq = 1; + s_MPEG12Ctx.m_PictStruct = _MPEG_PS_FRAME; + s_MPEG12Ctx.m_fFPFrmDCT = 1; + } + + lMBWidth = (s_MPEG12Ctx.m_SI.m_Width + 15) / 16; + if (s_MPEG12Ctx.m_fMPEG2 && !s_MPEG12Ctx.m_fProgSeq) { + lMBHeight = 2 * ((s_MPEG12Ctx.m_SI.m_Height + 31) / 32); + } else { + lMBHeight = (s_MPEG12Ctx.m_SI.m_Height + 15) / 16; + } - if ( s_MPEG12Ctx.m_pFwdFrame ) { - free ( s_MPEG12Ctx.m_pFwdFrame ); - s_MPEG12Ctx.m_pFwdFrame = NULL; - } /* end if */ + if (lMBWidth != s_MPEG12Ctx.m_MBWidth || lMBHeight != s_MPEG12Ctx.m_MBHeight) { + unsigned int lAllocSize; + int i, lSize; - if ( s_MPEG12Ctx.m_pMBXY ) { - free ( s_MPEG12Ctx.m_pMBXY ); - s_MPEG12Ctx.m_pMBXY = NULL; - } /* end if */ + if (s_MPEG12Ctx.m_pFwdFrame) + _destroy_seq(); - s_MPEG12Ctx.m_MBWidth = - s_MPEG12Ctx.m_MBHeight = 0; + s_MPEG12Ctx.m_MBWidth = lMBWidth; + s_MPEG12Ctx.m_MBHeight = lMBHeight; + s_MPEG12Ctx.m_SI.m_Width = lMBWidth << 4; + s_MPEG12Ctx.m_SI.m_Height = lMBHeight << 4; -} /* end _destroy_seq */ + s_MPEG12Ctx.m_MBStride = lMBWidth * sizeof(_MPEGMacroBlock8); -static int _get_hdr ( void ) { + lSize = lMBWidth * (lMBHeight + 1) * sizeof(_MPEGMacroBlock8) + sizeof(_MPEGMacroBlock8); - while ( 1 ) { + s_MPEG12Ctx.m_MBCount = s_MPEG12Ctx.m_MBWidth * s_MPEG12Ctx.m_MBHeight; - unsigned int lCode; - lCode = _MPEG_NextStartCode (); _MPEG_GetBits ( 32 ); + lAllocSize = (lSize * 3) + (s_MPEG12Ctx.m_MBCount * sizeof(_MPEGMBXY)); - switch ( lCode ) { + pA = memalign(64, lAllocSize); - case _MPEG_CODE_SEQ_HDR: - _seq_header (); - break; + s_MPEG12Ctx.m_pFrameArena = pA; + s_MPEG12Ctx.m_pFwdFrame = (_MPEGMacroBlock8 *)pA; + pA += lSize; + s_MPEG12Ctx.m_pBckFrame = (_MPEGMacroBlock8 *)pA; + pA += lSize; + s_MPEG12Ctx.m_pAuxFrame = (_MPEGMacroBlock8 *)pA; + pA += lSize; + s_MPEG12Ctx.m_pMBXY = (_MPEGMBXY *)pA; - case _MPEG_CODE_GRP_START: - _gop_header (); - break; + for (i = 0; i < s_MPEG12Ctx.m_MBCount; ++i) { + s_MPEG12Ctx.m_pMBXY[i].m_X = i % lMBWidth; + s_MPEG12Ctx.m_pMBXY[i].m_Y = i / lMBWidth; + } + } - case _MPEG_CODE_PIC_START: - _pic_header (); - return 1; + return _init_cb(s_pInitCBParam, &s_MPEG12Ctx.m_SI); +} - case _MPEG_CODE_SEQ_END: +static void _destroy_seq(void) +{ MPEG_Picture = _get_first_picture; - return 0; - break; - - } /* end switch */ - - } /* end while */ - -} /* end _get_hdr */ - -static void _seq_header ( void ) { - s_MPEG12Ctx.m_SI.m_Width = _MPEG_GetBits ( 12 ); - s_MPEG12Ctx.m_SI.m_Height = _MPEG_GetBits ( 12 ); + if (s_MPEG12Ctx.m_pFrameArena) { + free(s_MPEG12Ctx.m_pFrameArena); + s_MPEG12Ctx.m_pAuxFrame = NULL; + s_MPEG12Ctx.m_pBckFrame = NULL; + s_MPEG12Ctx.m_pFwdFrame = NULL; + s_MPEG12Ctx.m_pMBXY = NULL; + } - _MPEG_GetBits ( 4 ); /* aspect_ratio_information */ - s_MPEG12Ctx.m_SI.m_MSPerFrame = ( int )( - ( 1000.0F / s_FrameRate[ s_MPEG12Ctx.m_FRCode = _MPEG_GetBits ( 4 ) ] ) + 0.5F - ); - _MPEG_GetBits ( 18 ); /* bit_rate_value */ - _MPEG_GetBits ( 1 ); /* marker_bit */ - _MPEG_GetBits ( 10 ); /* vbv_buffer_size */ - _MPEG_GetBits ( 1 ); /* constrained_parameters_flag */ + s_MPEG12Ctx.m_MBWidth = 0; + s_MPEG12Ctx.m_MBHeight = 0; +} - if ( _MPEG_GetBits ( 1 ) ) - _MPEG_SetQM ( 0 ); - else _MPEG_SetDefQM ( 0 ); - - if ( _MPEG_GetBits ( 1 ) ) - _MPEG_SetQM ( 1 ); - else _MPEG_SetDefQM ( 1 ); - - _ext_and_ud (); - -} /* end _seq_header */ - -static void _gop_header ( void ) { +/* + * decode headers from one input stream + * until an End of Sequence or picture start code + * is found + */ +static int _get_hdr(void) +{ + while (1) { + unsigned int lCode = _MPEG_NextStartCode(); + _MPEG_GetBits(32); + + switch (lCode) { + case _MPEG_CODE_SEQ_HDR: + _seq_header(); + break; + case _MPEG_CODE_GRP_START: + _gop_header(); + break; + case _MPEG_CODE_PIC_START: + _pic_header(); + return 1; + case _MPEG_CODE_SEQ_END: + MPEG_Picture = _get_first_picture; + return 0; + } + } +} + +static void _seq_header(void) +{ + s_MPEG12Ctx.m_SI.m_Width = _MPEG_GetBits(12); + s_MPEG12Ctx.m_SI.m_Height = _MPEG_GetBits(12); + + _MPEG_GetBits(4); /* aspect_ratio_information */ + s_MPEG12Ctx.m_SI.m_MSPerFrame = (int)((1000.0F / s_FrameRate[s_MPEG12Ctx.m_FRCode = _MPEG_GetBits(4)]) + 0.5F); + _MPEG_GetBits(18); /* bit_rate_value */ + _MPEG_GetBits(1); /* marker_bit */ + _MPEG_GetBits(10); /* vbv_buffer_size */ + _MPEG_GetBits(1); /* constrained_parameters_flag */ + + if (_MPEG_GetBits(1)) + _MPEG_SetQM(0); + else + _MPEG_SetDefQM(0); + + if (_MPEG_GetBits(1)) + _MPEG_SetQM(1); + else + _MPEG_SetDefQM(1); + + _ext_and_ud(); +} + +static void _gop_header(void) +{ #ifdef _DEBUG - _MPEG_GetBits ( 1 ); /* drop_flag */ - _MPEG_GetBits ( 5 ); /* hour */ - _MPEG_GetBits ( 6 ); /* minute */ - _MPEG_GetBits ( 1 ); /* marker_bit */ - _MPEG_GetBits ( 6 ); /* sec */ - _MPEG_GetBits ( 6 ); /* frame */ - _MPEG_GetBits ( 1 ); /* closed_gop */ - _MPEG_GetBits ( 1 ); /* broken_link */ + _MPEG_GetBits(1); /* drop_flag */ + _MPEG_GetBits(5); /* hour */ + _MPEG_GetBits(6); /* minute */ + _MPEG_GetBits(1); /* marker_bit */ + _MPEG_GetBits(6); /* sec */ + _MPEG_GetBits(6); /* frame */ + _MPEG_GetBits(1); /* closed_gop */ + _MPEG_GetBits(1); /* broken_link */ #else - _MPEG_GetBits ( 27 ); -#endif /* _DEBUG */ - _ext_and_ud (); - -} /* end _gop_header */ - -static void _pic_header ( void ) { - - unsigned int lPicCT; - - _MPEG_GetBits ( 10 ); /* temporal_reference */ - lPicCT = _MPEG_GetBits ( 3 ); - _MPEG_GetBits ( 16 ); /* vbv_delay */ - - if ( lPicCT == _MPEG_PT_P || lPicCT == _MPEG_PT_B ) { - s_MPEG12Ctx.m_FPFVector = _MPEG_GetBits ( 1 ); - s_MPEG12Ctx.m_FwdFCode = _MPEG_GetBits ( 3 ); - } /* end if */ - - if ( lPicCT == _MPEG_PT_B ) { - s_MPEG12Ctx.m_FPBVector = _MPEG_GetBits ( 1 ); - s_MPEG12Ctx.m_BckFCode = _MPEG_GetBits ( 3 ); - } /* end if */ - - _xtra_bitinf (); - _ext_and_ud (); - - _MPEG_SetPCT ( s_MPEG12Ctx.m_PictCodingType = lPicCT ); - -} /* end _pic_header */ - -static void _ext_and_ud ( void ) { - - int lCode, lXID; - - lCode = _MPEG_NextStartCode (); - - while ( lCode == _MPEG_CODE_EXTENSION || lCode == _MPEG_CODE_USER_DATA ) { - - if ( lCode == _MPEG_CODE_EXTENSION ) { - - _MPEG_GetBits ( 32 ); - lXID = _MPEG_GetBits ( 4 ); - - switch ( lXID ) { - - case _MPEG_XID_0: - _ext_unknown (); - break; - - case _MPEG_XID_SEQUENCE: - _ext_seq (); - break; - - case _MPEG_XID_DISPLAY: - _ext_seq_dsp (); - break; - - case _MPEG_XID_QMATRIX: - _ext_qnt_mtx (); - break; - - case _MPEG_XID_COPYRIGHT: - _ext_cpy_rgt (); - break; - - case _MPEG_XID_SCALABLE: - _ext_seq_scl (); - break; - - case _MPEG_XID_6: - _ext_unknown (); - break; - - case _MPEG_XID_PIC_DSP: - _ext_pic_dsp (); - break; - - case _MPEG_XID_PIC_COD: - _ext_pic_cod (); - break; - - case _MPEG_XID_PIC_SSC: - _ext_pic_ssc (); - break; - - case _MPEG_XID_PIC_TSC: - _ext_pic_tsc (); - break; - - } /* end switch */ - - lCode = _MPEG_NextStartCode (); - - } else { /* user data */ - - _MPEG_GetBits ( 32 ); - lCode = _MPEG_NextStartCode (); - - } /* end else */ - - } /* end while */ - -} /* end _ext_and_ud */ - -static void _ext_unknown ( void ) { - - -} /* end _ext_unknown */ - -static void _ext_seq ( void ) { - - int lHSzX; - int lVSzX; - int lProfLevel; - int lFRXn, lFRXd; - - s_MPEG12Ctx.m_fMPEG2 = 1; - - *( volatile unsigned int* )0x10002010 &= 0xFF7FFFFF; - - lProfLevel = _MPEG_GetBits ( 8 ); - s_MPEG12Ctx.m_fProgSeq = _MPEG_GetBits ( 1 ); - s_MPEG12Ctx.m_SI.m_ChromaFmt = _MPEG_GetBits ( 2 ); - lHSzX = _MPEG_GetBits ( 2 ); - lVSzX = _MPEG_GetBits ( 2 ); + _MPEG_GetBits(27); +#endif /* _DEBUG */ + _ext_and_ud(); +} + +static void _pic_header(void) +{ + unsigned int lPicCT; + + _MPEG_GetBits(10); /* temporal_reference */ + lPicCT = _MPEG_GetBits(3); + _MPEG_GetBits(16); /* vbv_delay */ + + if (lPicCT == _MPEG_PT_P || lPicCT == _MPEG_PT_B) { + s_MPEG12Ctx.m_FPFVector = _MPEG_GetBits(1); + s_MPEG12Ctx.m_FwdFCode = _MPEG_GetBits(3); + } + + if (lPicCT == _MPEG_PT_B) { + s_MPEG12Ctx.m_FPBVector = _MPEG_GetBits(1); + s_MPEG12Ctx.m_BckFCode = _MPEG_GetBits(3); + } + + _xtra_bitinf(); + _ext_and_ud(); + + _MPEG_SetPCT(s_MPEG12Ctx.m_PictCodingType = lPicCT); +} + +static void _ext_and_ud(void) +{ + int lCode, lXID; + lCode = _MPEG_NextStartCode(); + + while (lCode == _MPEG_CODE_EXTENSION || lCode == _MPEG_CODE_USER_DATA) { + if (lCode == _MPEG_CODE_EXTENSION) { + _MPEG_GetBits(32); + lXID = _MPEG_GetBits(4); + + switch (lXID) { + case _MPEG_XID_0: + _ext_unknown(); + break; + case _MPEG_XID_SEQUENCE: + _ext_seq(); + break; + case _MPEG_XID_DISPLAY: + _ext_seq_dsp(); + break; + case _MPEG_XID_QMATRIX: + _ext_qnt_mtx(); + break; + case _MPEG_XID_COPYRIGHT: + _ext_cpy_rgt(); + break; + case _MPEG_XID_SCALABLE: + _ext_seq_scl(); + break; + case _MPEG_XID_6: + _ext_unknown(); + break; + case _MPEG_XID_PIC_DSP: + _ext_pic_dsp(); + break; + case _MPEG_XID_PIC_COD: + _ext_pic_cod(); + break; + case _MPEG_XID_PIC_SSC: + _ext_pic_ssc(); + break; + case _MPEG_XID_PIC_TSC: + _ext_pic_tsc(); + break; + } + + lCode = _MPEG_NextStartCode(); + } else { + _MPEG_GetBits(32); + lCode = _MPEG_NextStartCode(); + } + } +} + +static void _ext_unknown(void) {} + +static void _ext_seq(void) +{ + int lHSzX; + int lVSzX; + int lProfLevel; + int lFRXn, lFRXd; + + s_MPEG12Ctx.m_fMPEG2 = 1; + + *R_EE_IPU_CTRL &= 0xFF7FFFFF; + + lProfLevel = _MPEG_GetBits(8); + s_MPEG12Ctx.m_fProgSeq = _MPEG_GetBits(1); + s_MPEG12Ctx.m_SI.m_ChromaFmt = _MPEG_GetBits(2); + lHSzX = _MPEG_GetBits(2); + lVSzX = _MPEG_GetBits(2); #ifdef _DEBUG - _MPEG_GetBits ( 12 ); /* bit_rate_extension */ - _MPEG_GetBits ( 1 ); /* marker_bit */ - _MPEG_GetBits ( 8 ); /* vbv_buffer_size_extension */ - _MPEG_GetBits ( 1 ); /* low_delay */ - lFRXn = _MPEG_GetBits ( 2 ); - lFRXd = _MPEG_GetBits ( 5 ); + _MPEG_GetBits(12); /* bit_rate_extension */ + _MPEG_GetBits(1); /* marker_bit */ + _MPEG_GetBits(8); /* vbv_buffer_size_extension */ + _MPEG_GetBits(1); /* low_delay */ + lFRXn = _MPEG_GetBits(2); + lFRXd = _MPEG_GetBits(5); #else - _MPEG_GetBits ( 22 ); - lFRXn = _MPEG_GetBits ( 2 ); - lFRXd = _MPEG_GetBits ( 5 ); -#endif /* _DEBUG */ - s_MPEG12Ctx.m_SI.m_MSPerFrame = ( int )( - ( 1000.0F / ( - s_FrameRate[ s_MPEG12Ctx.m_FRCode ] * ( ( lFRXn + 1.0F ) / ( lFRXd + 1.0F ) ) - ) - ) + 0.5F - ); - - if( ( lProfLevel >> 7 ) & 1 ) { - - if ( ( lProfLevel & 15 ) == 5 ) { - - s_MPEG12Ctx.m_SI.m_Profile = MPEG_PROFILE_422; - s_MPEG12Ctx.m_SI.m_Level = MPEG_LEVEL_MAIN; - - } else s_MPEG12Ctx.m_SI.m_Profile = s_MPEG12Ctx.m_SI.m_Level = -1; - - } else { - - s_MPEG12Ctx.m_SI.m_Profile = lProfLevel >> 4; - s_MPEG12Ctx.m_SI.m_Level = lProfLevel & 0xF; - - } /* end else */ - - s_MPEG12Ctx.m_SI.m_Width = ( lHSzX << 12 ) | ( s_MPEG12Ctx.m_SI.m_Width & 0x0FFF ); - s_MPEG12Ctx.m_SI.m_Height = ( lVSzX << 12 ) | ( s_MPEG12Ctx.m_SI.m_Height & 0x0FFF ); + _MPEG_GetBits(22); + lFRXn = _MPEG_GetBits(2); + lFRXd = _MPEG_GetBits(5); +#endif /* _DEBUG */ + s_MPEG12Ctx.m_SI.m_MSPerFrame = (int)((1000.0F / (s_FrameRate[s_MPEG12Ctx.m_FRCode] * ((lFRXn + 1.0F) / (lFRXd + 1.0F)))) + 0.5F); + + if ((lProfLevel >> 7) & 1) { + if ((lProfLevel & 15) == 5) { + s_MPEG12Ctx.m_SI.m_Profile = MPEG_PROFILE_422; + s_MPEG12Ctx.m_SI.m_Level = MPEG_LEVEL_MAIN; + } else { + s_MPEG12Ctx.m_SI.m_Profile = s_MPEG12Ctx.m_SI.m_Level = -1; + } + } else { + s_MPEG12Ctx.m_SI.m_Profile = lProfLevel >> 4; + s_MPEG12Ctx.m_SI.m_Level = lProfLevel & 0xF; + } -} /* end _ext_seq */ + s_MPEG12Ctx.m_SI.m_Width = (lHSzX << 12) | (s_MPEG12Ctx.m_SI.m_Width & 0x0FFF); + s_MPEG12Ctx.m_SI.m_Height = (lVSzX << 12) | (s_MPEG12Ctx.m_SI.m_Height & 0x0FFF); +} -static void _ext_seq_dsp ( void ) { - s_MPEG12Ctx.m_SI.m_VideoFmt = _MPEG_GetBits ( 3 ); +static void _ext_seq_dsp(void) +{ + s_MPEG12Ctx.m_SI.m_VideoFmt = _MPEG_GetBits(3); - if ( _MPEG_GetBits ( 1 ) ) { /* color_description */ + if (_MPEG_GetBits(1)) { /* color_description */ #ifdef _DEBUG - _MPEG_GetBits ( 8 ); /* color_primaries */ - _MPEG_GetBits ( 8 ); /* transfer_characteristics */ - _MPEG_GetBits ( 8 ); /* matrix_coefficients */ + _MPEG_GetBits(8); /* color_primaries */ + _MPEG_GetBits(8); /* transfer_characteristics */ + _MPEG_GetBits(8); /* matrix_coefficients */ #else - _MPEG_GetBits ( 24 ); -#endif /* _DEBUG */ - } /* end if */ + _MPEG_GetBits(24); +#endif /* _DEBUG */ + } #ifdef _DEBUG - _MPEG_GetBits ( 14 ); /* display_horizontal_size */ - _MPEG_GetBits ( 1 ); /* marker_bit */ - _MPEG_GetBits ( 14 ); /* display_vertical_size */ + _MPEG_GetBits(14); /* display_horizontal_size */ + _MPEG_GetBits(1); /* marker_bit */ + _MPEG_GetBits(14); /* display_vertical_size */ #else - _MPEG_GetBits ( 29 ); -#endif /* _DEBUG */ -} /* end _ext_seq_dsp */ + _MPEG_GetBits(29); +#endif /* _DEBUG */ +} -static void _ext_qnt_mtx ( void ) { +static void _ext_qnt_mtx(void) +{ + int i; - int i; + if (_MPEG_GetBits(1)) + _MPEG_SetQM(0); - if ( _MPEG_GetBits ( 1 ) ) _MPEG_SetQM ( 0 ); - if ( _MPEG_GetBits ( 1 ) ) _MPEG_SetQM ( 1 ); + if (_MPEG_GetBits(1)) + _MPEG_SetQM(1); - if ( _MPEG_GetBits ( 1 ) ) for ( i = 0; i < 16; ++i ) _MPEG_GetBits ( 32 ); - if ( _MPEG_GetBits ( 1 ) ) for ( i = 0; i < 16; ++i ) _MPEG_GetBits ( 32 ); + if (_MPEG_GetBits(1)) { + for (i = 0; i < 16; ++i) + _MPEG_GetBits(32); + } -} /* end _ext_qnt_mtx */ + if (_MPEG_GetBits(1)) { + for (i = 0; i < 16; ++i) + _MPEG_GetBits(32); + } +} -static void _ext_cpy_rgt ( void ) { +static void _ext_cpy_rgt(void) +{ #ifdef _DEBUG - _MPEG_GetBits ( 1 ); /* copyright_flag */ - _MPEG_GetBits ( 8 ); /* copyright_identifier */ - _MPEG_GetBits ( 1 ); /* original_or_copy */ - _MPEG_GetBits ( 7 ); /* reserved_data */ - _MPEG_GetBits ( 1 ); /* marker_bit */ - _MPEG_GetBits ( 20 ); /* copyright_number_1 */ - _MPEG_GetBits ( 1 ); /* marker_bit */ - _MPEG_GetBits ( 22 ); /* copyright_number_2 */ - _MPEG_GetBits ( 1 ); /* marker_bit */ - _MPEG_GetBits ( 22 ); /* copyright_number_3 */ + _MPEG_GetBits(1); /* copyright_flag */ + _MPEG_GetBits(8); /* copyright_identifier */ + _MPEG_GetBits(1); /* original_or_copy */ + _MPEG_GetBits(7); /* reserved_data */ + _MPEG_GetBits(1); /* marker_bit */ + _MPEG_GetBits(20); /* copyright_number_1 */ + _MPEG_GetBits(1); /* marker_bit */ + _MPEG_GetBits(22); /* copyright_number_2 */ + _MPEG_GetBits(1); /* marker_bit */ + _MPEG_GetBits(22); /* copyright_number_3 */ #else - _MPEG_GetBits ( 32 ); - _MPEG_GetBits ( 32 ); - _MPEG_GetBits ( 20 ); -#endif /* _DEBUG */ -} /* end _ext_cop_rgt */ - -static void _ext_seq_scl ( void ) { - -} /* end _ext_seq_scl */ - -static void _ext_pic_dsp ( void ) { - - int i; - int lnFCO; - - if ( s_MPEG12Ctx.m_fProgSeq ) { - - if ( s_MPEG12Ctx.m_fRepFF ) - lnFCO = s_MPEG12Ctx.m_fTopFF ? 3 : 2; - else lnFCO = 1; - - } else { - - if ( s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME ) - lnFCO = 1; - else lnFCO = s_MPEG12Ctx.m_fRepFF ? 3 : 2; - - } /* end else */ - - for ( i = 0; i < lnFCO; ++i ) { - _MPEG_GetBits ( 16 ); /* frame_center_horizontal_offset[ i ] */ - _MPEG_GetBits ( 1 ); /* marker_bit */ - _MPEG_GetBits ( 16 ); /* frame_center_vertical_offset [ i ] */ - _MPEG_GetBits ( 1 ); /* marker_bit */ - } /* end for */ - -} /* end _ext_pic_dsp */ - -static void _ext_pic_cod ( void ) { - - s_MPEG12Ctx.m_FCode[ 0 ][ 0 ] = _MPEG_GetBits ( 4 ); - s_MPEG12Ctx.m_FCode[ 0 ][ 1 ] = _MPEG_GetBits ( 4 ); - s_MPEG12Ctx.m_FCode[ 1 ][ 0 ] = _MPEG_GetBits ( 4 ); - s_MPEG12Ctx.m_FCode[ 1 ][ 1 ] = _MPEG_GetBits ( 4 ); - _MPEG_SetIDCP (); - s_MPEG12Ctx.m_PictStruct = _MPEG_GetBits ( 2 ); - s_MPEG12Ctx.m_fTopFF = _MPEG_GetBits ( 1 ); - s_MPEG12Ctx.m_fFPFrmDCT = _MPEG_GetBits ( 1 ); - s_MPEG12Ctx.m_fConsMV = _MPEG_GetBits ( 1 ); - _MPEG_SetQSTIVFAS (); - s_MPEG12Ctx.m_fRepFF = _MPEG_GetBits ( 1 ); + _MPEG_GetBits(32); + _MPEG_GetBits(32); + _MPEG_GetBits(20); +#endif /* _DEBUG */ +} + +static void _ext_seq_scl(void) {} + +static void _ext_pic_dsp(void) +{ + int i; + int lnFCO; + + if (s_MPEG12Ctx.m_fProgSeq) { + if (s_MPEG12Ctx.m_fRepFF) + lnFCO = s_MPEG12Ctx.m_fTopFF ? 3 : 2; + else + lnFCO = 1; + } else { + if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME) + lnFCO = 1; + else + lnFCO = s_MPEG12Ctx.m_fRepFF ? 3 : 2; + } + + + for (i = 0; i < lnFCO; ++i) { + _MPEG_GetBits(16); /* frame_center_horizontal_offset[ i ] */ + _MPEG_GetBits(1); /* marker_bit */ + _MPEG_GetBits(16); /* frame_center_vertical_offset [ i ] */ + _MPEG_GetBits(1); /* marker_bit */ + } +} + +static void _ext_pic_cod(void) +{ + + s_MPEG12Ctx.m_FCode[0][0] = _MPEG_GetBits(4); + s_MPEG12Ctx.m_FCode[0][1] = _MPEG_GetBits(4); + s_MPEG12Ctx.m_FCode[1][0] = _MPEG_GetBits(4); + s_MPEG12Ctx.m_FCode[1][1] = _MPEG_GetBits(4); + _MPEG_SetIDCP(); + s_MPEG12Ctx.m_PictStruct = _MPEG_GetBits(2); + s_MPEG12Ctx.m_fTopFF = _MPEG_GetBits(1); + s_MPEG12Ctx.m_fFPFrmDCT = _MPEG_GetBits(1); + s_MPEG12Ctx.m_fConsMV = _MPEG_GetBits(1); + _MPEG_SetQSTIVFAS(); + s_MPEG12Ctx.m_fRepFF = _MPEG_GetBits(1); #ifdef _DEBUG - _MPEG_GetBits ( 1 ); /* chroma_420_type */ - _MPEG_GetBits ( 1 ); /* progressive_frame */ + _MPEG_GetBits(1); /* chroma_420_type */ + _MPEG_GetBits(1); /* progressive_frame */ #else - _MPEG_GetBits ( 2 ); -#endif /* _DEBUG */ - if ( _MPEG_GetBits ( 1 ) ) { /* composite_display_flag */ + _MPEG_GetBits(2); +#endif /* _DEBUG */ + if (_MPEG_GetBits(1)) { /* composite_display_flag */ #ifdef _DEBUG - _MPEG_GetBits ( 1 ); /* v_axis */ - _MPEG_GetBits ( 3 ); /* field_sequence */ - _MPEG_GetBits ( 1 ); /* sub_carrier */ - _MPEG_GetBits ( 7 ); /* burst_amplitude */ - _MPEG_GetBits ( 8 ); /* sub_carrier_phase */ + _MPEG_GetBits(1); /* v_axis */ + _MPEG_GetBits(3); /* field_sequence */ + _MPEG_GetBits(1); /* sub_carrier */ + _MPEG_GetBits(7); /* burst_amplitude */ + _MPEG_GetBits(8); /* sub_carrier_phase */ #else - _MPEG_GetBits ( 20 ); -#endif /* _DEBUG */ - } /* end if */ + _MPEG_GetBits(20); +#endif /* _DEBUG */ + } +} -} /* end _ext_pic_cod */ +static void _ext_pic_ssc(void) {} -static void _ext_pic_ssc ( void ) { -} /* end _ext_pic_ssc */ +static void _ext_pic_tsc(void) {} -static void _ext_pic_tsc ( void ) { +static void _xtra_bitinf(void) +{ + while (_MPEG_GetBits(1)) + _MPEG_GetBits(8); +} -} /* end _ext_pic_tsc */ +static int _get_first_picture(void *apData, s64 *apPTS) +{ + int retVal = _get_hdr(); -static void _xtra_bitinf ( void ) { + if (retVal) { + s_MPEG12Ctx.m_SI.m_FrameCnt = 0; - while ( _MPEG_GetBits ( 1 ) ) _MPEG_GetBits ( 8 ); + apData = _init_seq(); + _mpeg12_picture_data(); -} /* end _xtra_bitinf */ + if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME) + s_MPEG12Ctx.m_fSecField ^= 1; -static int _get_first_picture ( void* apData, s64* apPTS ) { + MPEG_Picture = _get_next_picture; - int retVal = _get_hdr (); + if (!s_MPEG12Ctx.m_fSecField) + ++s_MPEG12Ctx.m_SI.m_FrameCnt; - if ( retVal ) { + retVal = _get_next_picture(apData, apPTS); + } - s_MPEG12Ctx.m_SI.m_FrameCnt = 0; + return retVal; +} - apData = _init_seq (); - _mpeg12_picture_data (); +static int _get_next_picture(void *apData, s64 *apPTS) +{ + int retVal; - if ( s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME ) s_MPEG12Ctx.m_fSecField ^= 1; + while (1) { + if ((retVal = _get_hdr())) { + int lfPic = 0; - MPEG_Picture = _get_next_picture; + _mpeg12_picture_data(); - if ( !s_MPEG12Ctx.m_fSecField ) ++s_MPEG12Ctx.m_SI.m_FrameCnt; + if ((s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME || s_MPEG12Ctx.m_fSecField) && s_MPEG12Ctx.m_SI.m_FrameCnt) { + void *lpData; - retVal = _get_next_picture ( apData, apPTS ); + if (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_B) { + lpData = s_MPEG12Ctx.m_pAuxFrame; + *apPTS = s_MPEG12Ctx.m_AuxPTS; + } else { + lpData = s_MPEG12Ctx.m_pFwdFrame; + *apPTS = s_MPEG12Ctx.m_FwdPTS; + } - } /* end if */ + lfPic = _MPEG_CSCImage(lpData, apData, s_MPEG12Ctx.m_MBCount); + } - return retVal; + if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME) + s_MPEG12Ctx.m_fSecField ^= 1; -} /* end _get_first_picture */ + if (!s_MPEG12Ctx.m_fSecField) + ++s_MPEG12Ctx.m_SI.m_FrameCnt; -static int _get_next_picture ( void* apData, s64* apPTS ) { + if (lfPic) + break; + } else { + break; + } + } - int retVal; + return retVal; +} - while ( 1 ) { +static void _mpeg12_do_next_mc(void) +{ + _MPEGMotions *lpMotions = &s_MPEG12Ctx.m_MC[!s_MPEG12Ctx.m_CurMC]; + _MPEGMotion *lpMotion = &lpMotions->m_Motion[0]; - if ( ( retVal = _get_hdr () ) ) { + while (lpMotion->MC_Luma) { + _MPEG_do_mc(lpMotion); + ++lpMotion; + } - int lfPic = 0; + lpMotions->BlockOp(lpMotions); +} - _mpeg12_picture_data (); +static void _mpeg12_do_first_mc(void) +{ + DoMC = _mpeg12_do_next_mc; +} - if ( ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME || s_MPEG12Ctx.m_fSecField ) && s_MPEG12Ctx.m_SI.m_FrameCnt ) { +/* Decode all macroblocks of the current picture */ +static void _mpeg12_picture_data(void) +{ + int lMBAMax = s_MPEG12Ctx.m_MBWidth * s_MPEG12Ctx.m_MBHeight; + _MPEGMacroBlock8 *lpMB; - void* lpData; + if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME && s_MPEG12Ctx.m_fSecField) + s_MPEG12Ctx.m_fSecField = 0; - if ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_B ) { - lpData = s_MPEG12Ctx.m_pAuxFrame; - *apPTS = s_MPEG12Ctx.m_AuxPTS; + if (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_B) { + s_MPEG12Ctx.m_pCurFrame = s_MPEG12Ctx.m_pAuxFrame; + s_MPEG12Ctx.m_AuxPTS = *s_pCurPTS; } else { - lpData = s_MPEG12Ctx.m_pFwdFrame; - *apPTS = s_MPEG12Ctx.m_FwdPTS; - } /* end else */ - - lfPic = _MPEG_CSCImage ( lpData, apData, s_MPEG12Ctx.m_MBCount ); - - } /* end if */ - - if ( s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME ) s_MPEG12Ctx.m_fSecField ^= 1; - - if ( !s_MPEG12Ctx.m_fSecField ) ++s_MPEG12Ctx.m_SI.m_FrameCnt; - - if ( lfPic ) break; - - } else break; - - } /* end while */ - - return retVal; - -} /* end _get_next_picture */ - -static void _mpeg12_do_next_mc ( void ) { - - _MPEGMotions* lpMotions = &s_MPEG12Ctx.m_MC[ !s_MPEG12Ctx.m_CurMC ]; - _MPEGMotion* lpMotion = &lpMotions -> m_Motion[ 0 ]; - - while ( lpMotion -> MC_Luma ) { - - _MPEG_do_mc ( lpMotion ); - ++lpMotion; - - } /* end while */ - - lpMotions -> BlockOp ( lpMotions ); - -} /* end _mpeg12_do_next_mc */ - -static void _mpeg12_do_first_mc ( void ) { - - DoMC = _mpeg12_do_next_mc; - -} /* end _mpeg12_do_first_mc */ - -static void _mpeg12_picture_data ( void ) { - - int lMBAMax = s_MPEG12Ctx.m_MBWidth * s_MPEG12Ctx.m_MBHeight; - _MPEGMacroBlock8* lpMB; - s64 lPTS; - - if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME && s_MPEG12Ctx.m_fSecField ) s_MPEG12Ctx.m_fSecField = 0; - - if ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_B ) { - s_MPEG12Ctx.m_pCurFrame = s_MPEG12Ctx.m_pAuxFrame; - s_MPEG12Ctx.m_AuxPTS = *s_pCurPTS; - } else { - if ( !s_MPEG12Ctx.m_fSecField ) { - lpMB = s_MPEG12Ctx.m_pFwdFrame; - lPTS = s_MPEG12Ctx.m_FwdPTS; - s_MPEG12Ctx.m_pFwdFrame = s_MPEG12Ctx.m_pBckFrame; - s_MPEG12Ctx.m_FwdPTS = s_MPEG12Ctx.m_BckPTS; - s_MPEG12Ctx.m_pBckFrame = lpMB; - s_MPEG12Ctx.m_BckPTS = lPTS; - } /* end if */ - s_MPEG12Ctx.m_pCurFrame = s_MPEG12Ctx.m_pBckFrame; - s_MPEG12Ctx.m_BckPTS = *s_pCurPTS; - } /* end else */ - s_MPEG12Ctx.m_pCurFrameY = ( unsigned char* )s_MPEG12Ctx.m_pCurFrame; - s_MPEG12Ctx.m_pCurFrameCbCr = ( unsigned char* )s_MPEG12Ctx.m_pCurFrame + 256; - if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD ) { - s_MPEG12Ctx.m_pCurFrameY += 16; - s_MPEG12Ctx.m_pCurFrameCbCr += 8; - } /* end if */ - - if ( s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME ) lMBAMax >>= 1; - - s_MPEG12Ctx.m_CurMC = 0; - DoMC = _mpeg12_do_first_mc; - - while ( _mpeg12_slice ( lMBAMax ) >= 0 ); - - _MPEG_WaitBDEC (); - DoMC (); - -} /* end _mpeg12_picture_data */ - -static void _mpeg12_decode_motion_vector ( - int* apPred, int aRSize, int aMotionCode, int aMotionResidual, int aFullPelVector - ) { - - int lLim = 16 << aRSize; - int lVec = aFullPelVector ? *apPred >> 1 : *apPred; - - if ( aMotionCode > 0 ) { - - lVec += ( ( aMotionCode - 1 ) << aRSize ) + aMotionResidual + 1; - - if ( lVec >= lLim ) lVec -= lLim + lLim; - - } else if ( aMotionCode < 0 ) { - - lVec -= ( ( -aMotionCode - 1 ) << aRSize ) + aMotionResidual + 1; - - if ( lVec < -lLim ) lVec += lLim + lLim; - - } /* end if */ - - *apPred = aFullPelVector ? lVec << 1 : lVec; - -} /* end _mpeg12_decode_motion_vector */ - -static void _mpeg12_dual_prime_vector ( int aDMV[][ 2 ], const int* apDMVector, int aMVX, int aMVY ) { - - if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) { - - if ( s_MPEG12Ctx.m_fTopFF ) { - - aDMV[ 0 ][ 0 ] = ( ( aMVX + ( aMVX > 0 ) ) >> 1 ) + apDMVector[ 0 ]; - aDMV[ 0 ][ 1 ] = ( ( aMVY + ( aMVY > 0 ) ) >> 1 ) + apDMVector[ 1 ] - 1; - - aDMV[ 1 ][ 0 ] = ( ( 3 * aMVX + ( aMVX > 0 ) ) >> 1 ) + apDMVector[ 0 ]; - aDMV[ 1 ][ 1 ] = ( ( 3 * aMVY + ( aMVY > 0 ) ) >> 1 ) + apDMVector[ 1 ] + 1; - - } else { - - aDMV[ 0 ][ 0 ] = ( ( 3 * aMVX + ( aMVX > 0 ) ) >> 1 ) + apDMVector[ 0 ]; - aDMV[ 0 ][ 1 ] = ( ( 3 * aMVY + ( aMVY > 0 ) ) >> 1 ) + apDMVector[ 1 ] - 1; - - aDMV[ 1 ][ 0 ] = ( ( aMVX + ( aMVX > 0 ) ) >> 1 ) + apDMVector[ 0 ]; - aDMV[ 1 ][ 1 ] = ( ( aMVY + ( aMVY > 0 ) ) >> 1 ) + apDMVector[ 1 ] + 1; - - } /* end else */ - - } else { - - aDMV[ 0 ][ 0 ] = ( ( aMVX + ( aMVX > 0 ) ) >> 1 ) + apDMVector[ 0 ]; - aDMV[ 0 ][ 1 ] = ( ( aMVY + ( aMVY > 0 ) ) >> 1 ) + apDMVector[ 1 ]; - - if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_TOP_FIELD ) - --aDMV[ 0 ][ 1 ]; - else ++aDMV[ 0 ][ 1 ]; - - } /* end else */ - -} /* end _mpeg12_dual_prime_vector */ - -static void _mpeg12_motion_vector ( - int* apPMV, int* apDMVector, int aHRSize, int aVRSize, int aDMV, int aMVScale, int aFullPelVector - ) { - - int lMotionCode = _MPEG_GetMotionCode (); - int lMotionResidual = aHRSize && lMotionCode ? _MPEG_GetBits ( aHRSize ) : 0; - - _mpeg12_decode_motion_vector ( - &apPMV[ 0 ], aHRSize, lMotionCode, lMotionResidual, aFullPelVector - ); - - if ( aDMV ) apDMVector[ 0 ] = _MPEG_GetDMVector (); - - s_MPEG12Ctx.m_fError = lMotionCode == -32768; - - lMotionCode = _MPEG_GetMotionCode (); - lMotionResidual = aVRSize && lMotionCode ? _MPEG_GetBits ( aVRSize ) : 0; - - if ( aMVScale ) apPMV[ 1 ] >>= 1; - - _mpeg12_decode_motion_vector ( - &apPMV[ 1 ], aVRSize, lMotionCode, lMotionResidual, aFullPelVector - ); - - if ( aMVScale ) apPMV[ 1 ] <<= 1; - - if ( aDMV ) apDMVector[ 1 ] = _MPEG_GetDMVector (); - - s_MPEG12Ctx.m_fError = lMotionCode == -32768; - -} /* end _mpeg12_motion_vector */ - -static void _mpeg12_motion_vectors ( - int aPMV[ 2 ][ 2 ][ 2 ], int aDMVector[ 2 ], int aMVFS[ 2 ][ 2 ], int aS, int anMV, - int aMVFmt, int aHRSize, int aVRSize, int aDMV, int aMVScale - ) { - - if ( anMV == 1 ) { - - if ( aMVFmt == _MPEG_MV_FIELD && !aDMV ) aMVFS[ 1 ][ aS ] = aMVFS[ 0 ][ aS ] = _MPEG_GetBits ( 1 ); - - _mpeg12_motion_vector ( aPMV[ 0 ][ aS ], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0 ); - - aPMV[ 1 ][ aS ][ 0 ] = aPMV[ 0 ][ aS ][ 0 ]; - aPMV[ 1 ][ aS ][ 1 ] = aPMV[ 0 ][ aS ][ 1 ]; - - } else { - - aMVFS[ 0 ][ aS ] = _MPEG_GetBits ( 1 ); - _mpeg12_motion_vector ( aPMV[ 0 ][ aS ], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0 ); - - aMVFS[ 1 ][ aS ] = _MPEG_GetBits ( 1 ); - _mpeg12_motion_vector ( aPMV[ 1 ][ aS ], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0 ); - - } /* end else */ - -} /* end _mpeg12_motion_vectors */ - -static int _mpeg12_dec_mb ( - int* apMBType, int* apMotionType, - int aPMV[ 2 ][ 2 ][ 2 ], int aMVFS[ 2 ][ 2 ], int aDMVector[ 2 ] - ) { - - int lMBType; - int lDMV; - int lMVScale; - int lnMV; - int lMVFmt; - int lDCType; - int lMotionType; - int lfIntra; - - lMotionType = 0; - lMBType = _MPEG_GetMBType (); - - if ( !lMBType ) return 0; - - lfIntra = lMBType & _MPEG_MBT_INTRA; - - if ( lMBType & ( _MPEG_MBT_MOTION_FORWARD | _MPEG_MBT_MOTION_BACKWARD ) ) { - - if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) - lMotionType = s_MPEG12Ctx.m_fFPFrmDCT ? _MPEG_MC_FRAME : _MPEG_GetBits ( 2 ); - else lMotionType = _MPEG_GetBits ( 2 ); - - } else if ( lfIntra && s_MPEG12Ctx.m_fConsMV ) - lMotionType = ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) ? _MPEG_MC_FRAME : _MPEG_MC_FIELD; - - if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) { - lnMV = lMotionType == _MPEG_MC_FIELD ? 2 : 1; - lMVFmt = lMotionType == _MPEG_MC_FRAME ? _MPEG_MV_FRAME : _MPEG_MV_FIELD; - } else { - lnMV = ( lMotionType == _MPEG_MC_16X8 ) ? 2 : 1; - lMVFmt = _MPEG_MV_FIELD; - } /* end else */ - - lDMV = lMotionType == _MPEG_MC_DMV; - lMVScale = lMVFmt == _MPEG_MV_FIELD && s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME; - lDCType = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME && - !s_MPEG12Ctx.m_fFPFrmDCT && - lMBType & ( _MPEG_MBT_PATTERN | _MPEG_MBT_INTRA ) ? _MPEG_GetBits ( 1 ) : 0; - - if ( lMBType & _MPEG_MBT_QUANT ) s_MPEG12Ctx.m_QScale = _MPEG_GetBits ( 5 ); - - if ( ( lMBType & _MPEG_MBT_MOTION_FORWARD ) || - ( lfIntra && s_MPEG12Ctx.m_fConsMV ) - ) { - - if ( s_MPEG12Ctx.m_fMPEG2 ) - _mpeg12_motion_vectors ( - aPMV, aDMVector, aMVFS, 0, lnMV, lMVFmt, - s_MPEG12Ctx.m_FCode[ 0 ][ 0 ] - 1, s_MPEG12Ctx.m_FCode[ 0 ][ 1 ] - 1, lDMV, lMVScale - ); - else _mpeg12_motion_vector ( - aPMV[ 0 ][ 0 ], aDMVector, s_MPEG12Ctx.m_FwdFCode - 1, s_MPEG12Ctx.m_FwdFCode - 1, - 0, 0, s_MPEG12Ctx.m_FPFVector - ); - } /* end if */ - - if ( s_MPEG12Ctx.m_fError ) return 0; - - if ( lMBType & _MPEG_MBT_MOTION_BACKWARD ) { - - if ( s_MPEG12Ctx.m_fMPEG2 ) - _mpeg12_motion_vectors ( - aPMV, aDMVector, aMVFS, 1, lnMV, lMVFmt, - s_MPEG12Ctx.m_FCode[ 1 ][ 0 ] - 1, s_MPEG12Ctx.m_FCode[ 1 ][ 1 ] - 1, 0, lMVScale - ); - else _mpeg12_motion_vector ( - aPMV[ 0 ][ 1 ], aDMVector, s_MPEG12Ctx.m_BckFCode - 1, s_MPEG12Ctx.m_BckFCode - 1, - 0, 0, s_MPEG12Ctx.m_FPBVector - ); - } /* end if */ - - if ( s_MPEG12Ctx.m_fError ) return 0; - - if ( lfIntra && s_MPEG12Ctx.m_fConsMV ) _MPEG_GetBits ( 1 ); - - if ( lMBType & ( _MPEG_MBT_INTRA | _MPEG_MBT_PATTERN ) ) - _MPEG_BDEC ( lfIntra, s_MPEG12Ctx.m_fDCRst, lDCType, s_MPEG12Ctx.m_QScale, s_MPEG12Ctx.m_pCurMotions -> m_pSPRBlk ); - - s_MPEG12Ctx.m_fDCRst = !lfIntra; - - if ( lfIntra && !s_MPEG12Ctx.m_fConsMV ) - aPMV[ 0 ][ 0 ][ 0 ] = aPMV[ 0 ][ 0 ][ 1 ] = - aPMV[ 1 ][ 0 ][ 0 ] = aPMV[ 1 ][ 0 ][ 1 ] = - aPMV[ 0 ][ 1 ][ 0 ] = aPMV[ 0 ][ 1 ][ 1 ] = - aPMV[ 1 ][ 1 ][ 0 ] = aPMV[ 1 ][ 1 ][ 1 ] = 0; - - if ( ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P ) && - !( lMBType & ( _MPEG_MBT_MOTION_FORWARD | _MPEG_MBT_INTRA ) ) - ) { - - aPMV[ 0 ][ 0 ][ 0 ] = aPMV[ 0 ][ 0 ][ 1 ] = - aPMV[ 1 ][ 0 ][ 0 ] = aPMV[ 1 ][ 0 ][ 1 ] = 0; - - if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) - lMotionType = _MPEG_MC_FRAME; - else { - lMotionType = _MPEG_MC_FIELD; - aMVFS[ 0 ][ 0 ] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD; - } /* end else */ - - } /* end if */ - - *apMBType = lMBType; - *apMotionType = lMotionType; - - return 1; - -} /* end _mpeg12_dec_mb */ - -static void _mpeg12_get_ref ( - _MPEGMacroBlock8* apMBSrc, int aX, int anY, - int aDX, int aDY, int aH, int aFSrc, int aFDst, int afAvg - ) { - - int lfInt = ( aH & 8 ) >> 3; - int lDXY = ( ( aDY & 1 ) << 1 ) | ( aDX & 1 ); - int lUVXY = ( ( aDX & 2 ) >> 1 ) | ( aDY & 2 ); - int lSrcX = aX + ( aDX >> 1 ); - int lSrcY = ( ( anY + ( aDY >> 1 ) ) << lfInt ) + aFSrc; - int lMBX = lSrcX >> 4; - int lMBY = lSrcY >> 4; - _MPEGMotion* lpMotion = &s_MPEG12Ctx.m_pCurMotions -> m_Motion[ s_MPEG12Ctx.m_pCurMotions -> m_nMotions++ ]; - - afAvg <<= 2; - - __asm__ __volatile__( - ".set push\n\t" - ".set noat\n\t" - "pnor $v0, $zero, $zero\n\t" - "ld $at, %4\n\t" - "pextlw %0, %3, %0\n\t" - "paddw $at, $at, $v0\n\t" - "pmaxw %0, %0, $zero\n\t" - "pminw %0, %0, $at\n\t" - "dsrl32 %1, %0, 0\n\t" - "sll %0, %0, 0\n\t" - ".set pop\n\t" - : "=r"( lMBX ), "=r"( lMBY ) : "r"( lMBX ), "r"( lMBY ), "m"( s_MPEG12Ctx.m_MBWidth ) : "at", "v0" - ); - - lpMotion -> m_pSrc = ( unsigned char* )( apMBSrc + lMBX + lMBY * s_MPEG12Ctx.m_MBWidth ); - lpMotion -> m_pDstY = ( short* )( s_MPEG12Ctx.m_pCurMotions -> m_pSPRRes + ( aFDst << 5 ) ); - lpMotion -> m_pDstCbCr = ( short* )( s_MPEG12Ctx.m_pCurMotions -> m_pSPRRes + 512 + ( aFDst << 3 ) ); - lpMotion -> m_X = lSrcX & 0xF; - lpMotion -> m_Y = lSrcY & 0xF; - lpMotion -> m_H = aH; - lpMotion -> m_fInt = lfInt; - lpMotion -> m_Field = aFSrc; - lpMotion -> MC_Luma = LumaOp [ lDXY + afAvg ]; - lpMotion -> MC_Chroma = ChromaOp[ lUVXY + afAvg ]; - -} /* end _mpeg12_get_ref */ - -static void _mpeg12_get_refs ( - int aBX, int aBY, int aMBType, int aMotionType, int aPMV[ 2 ][ 2 ][ 2 ], - int aMVFS[ 2 ][ 2 ], int aDMVector[ 2 ] - ) { - - int lfAdd = 0; - - s_MPEG12Ctx.m_pCurMotions -> m_nMotions = 0; - - if ( ( aMBType & _MPEG_MBT_MOTION_FORWARD ) || - ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P ) - ) { - - int lDMV[ 2 ][ 2 ]; - - if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) { - - if ( ( aMotionType == _MPEG_MC_FRAME ) || - !( aMBType & _MPEG_MBT_MOTION_FORWARD ) - ) { - - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pFwdFrame, aBX, aBY, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ], - 16, 0, 0, 0 - ); - - } else if ( aMotionType == _MPEG_MC_FIELD ) { - - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ] >> 1, - 8, aMVFS[ 0 ][ 0 ], 0, 0 - ); - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[ 1 ][ 0 ][ 0 ], aPMV[ 1 ][ 0 ][ 1 ] >> 1, - 8, aMVFS[ 1 ][ 0 ], 8, 0 - ); - - } else if ( aMotionType == _MPEG_MC_DMV ) { - - _mpeg12_dual_prime_vector ( lDMV, aDMVector, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ] >> 1 ); - - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ] >> 1, - 8, 0, 0, 0 - ); - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, lDMV[ 0 ][ 0 ], lDMV[ 0 ][ 1 ], - 8, 1, 0, 1 - ); - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ] >> 1, - 8, 1, 8, 0 - ); - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, lDMV[ 1 ][ 0 ], lDMV[ 1 ][ 1 ], - 8, 0, 8, 1 - ); - - } /* end if */ - - } else { - - int lCurField; - _MPEGMacroBlock8* lpMBSrc; - - lCurField = ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD ); - lpMBSrc = ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P ) && - s_MPEG12Ctx.m_fSecField && - ( lCurField != aMVFS[ 0 ][ 0 ] ) ? s_MPEG12Ctx.m_pBckFrame - : s_MPEG12Ctx.m_pFwdFrame; - - if ( ( aMotionType == _MPEG_MC_FIELD ) || !( aMBType & _MPEG_MBT_MOTION_FORWARD ) ) { - - _mpeg12_get_ref ( - lpMBSrc, aBX, aBY, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ], 8, - aMVFS[ 0 ][ 0 ], 0, 0 - ); - _mpeg12_get_ref ( - lpMBSrc, aBX, aBY + 8, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ], 8, - aMVFS[ 0 ][ 0 ], 8, 0 - ); - - } else if ( aMotionType == _MPEG_MC_16X8 ) { - - _mpeg12_get_ref ( - lpMBSrc, aBX, aBY, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ], 8, - aMVFS[ 0 ][ 0 ], 0, 0 - ); - - lpMBSrc = ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P ) && - s_MPEG12Ctx.m_fSecField && - ( lCurField != aMVFS[ 1 ][ 0 ] ) ? s_MPEG12Ctx.m_pBckFrame - : s_MPEG12Ctx.m_pFwdFrame; - _mpeg12_get_ref ( - lpMBSrc, aBX, aBY + 8, aPMV[ 1 ][ 0 ][ 0 ], aPMV[ 1 ][ 0 ][ 1 ], 8, - aMVFS[ 1 ][ 0 ], 8, 0 - ); - - } else if ( aMotionType == _MPEG_MC_DMV ) { - - lpMBSrc = s_MPEG12Ctx.m_fSecField ? s_MPEG12Ctx.m_pBckFrame : s_MPEG12Ctx.m_pFwdFrame; - - _mpeg12_dual_prime_vector ( lDMV, aDMVector, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ] ); - - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pFwdFrame, aBX, aBY, aPMV[ 0 ][ 0 ][ 0 ], aPMV[ 0 ][ 0 ][ 1 ], 16, - lCurField, 0, 0 - ); - _mpeg12_get_ref ( - lpMBSrc, aBX, aBY, lDMV[ 0 ][ 0 ], lDMV[ 0 ][ 1 ], 16, !lCurField, 1, 1 - ); - - } /* end if */ - - } /* end else */ - - lfAdd = 1; - - } /* end if */ - - if ( aMBType & _MPEG_MBT_MOTION_BACKWARD ) { - - if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) { - - if ( aMotionType == _MPEG_MC_FRAME ) { - - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[ 0 ][ 1 ][ 0 ], aPMV[ 0 ][ 1 ][ 1 ], - 16, 0, 0, lfAdd - ); - - } else { - - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pBckFrame, aBX, aBY >> 1, aPMV[ 0 ][ 1 ][ 0 ], aPMV[ 0 ][ 1 ][ 1 ] >> 1, - 8, aMVFS[ 0 ][ 1 ], 0, lfAdd - ); - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pBckFrame, aBX, aBY >> 1, aPMV[ 1 ][ 1 ][ 0 ], aPMV[ 1 ][ 1 ][ 1 ] >> 1, - 8, aMVFS[ 1 ][ 1 ], 8, lfAdd - ); - - } /* end else */ - - } else { - - if ( aMotionType == _MPEG_MC_FIELD ) { - - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[ 0 ][ 1 ][ 0 ], aPMV[ 0 ][ 1 ][ 1 ], 8, - aMVFS[ 0 ][ 1 ], 0, lfAdd - ); - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pBckFrame, aBX, aBY + 8, aPMV[ 0 ][ 1 ][ 0 ], aPMV[ 0 ][ 1 ][ 1 ], 8, - aMVFS[ 0 ][ 1 ], 8, lfAdd - ); - - } else if ( aMotionType == _MPEG_MC_16X8 ) { - - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[ 0 ][ 1 ][ 0 ], aPMV[ 0 ][ 1 ][ 1 ], - 8, aMVFS[ 0 ][ 1 ], 0, lfAdd - ); - _mpeg12_get_ref ( - s_MPEG12Ctx.m_pBckFrame, aBX, aBY + 8, aPMV[ 1 ][ 1 ][ 0 ], aPMV[ 1 ][ 1 ][ 1 ], - 8, aMVFS[ 1 ][ 1 ], 8, lfAdd - ); - - } /* end if */ - - } /* end else */ - - } /* end if */ - - _MPEG_dma_ref_image ( - ( _MPEGMacroBlock8* )s_MPEG12Ctx.m_pCurMotions -> m_pSPRMC, - &s_MPEG12Ctx.m_pCurMotions -> m_Motion[ 0 ], - s_MPEG12Ctx.m_pCurMotions -> m_nMotions, s_MPEG12Ctx.m_MBWidth - ); + s64 lPTS; + + if (!s_MPEG12Ctx.m_fSecField) { + lpMB = s_MPEG12Ctx.m_pFwdFrame; + lPTS = s_MPEG12Ctx.m_FwdPTS; + s_MPEG12Ctx.m_pFwdFrame = s_MPEG12Ctx.m_pBckFrame; + s_MPEG12Ctx.m_FwdPTS = s_MPEG12Ctx.m_BckPTS; + s_MPEG12Ctx.m_pBckFrame = lpMB; + s_MPEG12Ctx.m_BckPTS = lPTS; + } + + s_MPEG12Ctx.m_pCurFrame = s_MPEG12Ctx.m_pBckFrame; + s_MPEG12Ctx.m_BckPTS = *s_pCurPTS; + } + + s_MPEG12Ctx.m_pCurFrameY = (unsigned char *)s_MPEG12Ctx.m_pCurFrame; + s_MPEG12Ctx.m_pCurFrameCbCr = (unsigned char *)s_MPEG12Ctx.m_pCurFrame + 256; + if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD) { + s_MPEG12Ctx.m_pCurFrameY += 16; + s_MPEG12Ctx.m_pCurFrameCbCr += 8; + } + + if (s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME) + lMBAMax >>= 1; + + s_MPEG12Ctx.m_CurMC = 0; + + DoMC = _mpeg12_do_first_mc; + + while (_mpeg12_slice(lMBAMax) >= 0) + ; + + _MPEG_WaitBDEC(); + DoMC(); +} + +/* calculate motion vector component */ +/* ISO/IEC 13818-2 section 7.6.3.1: Decoding the motion vectors */ +static void _mpeg12_decode_motion_vector(int *apPred, int aRSize, int aMotionCode, + int aMotionResidual, int aFullPelVector) +{ + int lLim = 16 << aRSize; + int lVec = aFullPelVector ? *apPred >> 1 : *apPred; + + if (aMotionCode > 0) { + lVec += ((aMotionCode - 1) << aRSize) + aMotionResidual + 1; + + if (lVec >= lLim) + lVec -= lLim + lLim; + + } else if (aMotionCode < 0) { + lVec -= ((-aMotionCode - 1) << aRSize) + aMotionResidual + 1; + + if (lVec < -lLim) + lVec += lLim + lLim; + } + + *apPred = aFullPelVector ? lVec << 1 : lVec; +} + +/* ISO/IEC 13818-2 section 7.6.3.6: Dual prime additional arithmetic */ +static void _mpeg12_dual_prime_vector(int aDMV[][2], const int *apDMVector, int aMVX, int aMVY) +{ + if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) { + if (s_MPEG12Ctx.m_fTopFF) { + aDMV[0][0] = ((aMVX + (aMVX > 0)) >> 1) + apDMVector[0]; + aDMV[0][1] = ((aMVY + (aMVY > 0)) >> 1) + apDMVector[1] - 1; + + aDMV[1][0] = ((3 * aMVX + (aMVX > 0)) >> 1) + apDMVector[0]; + aDMV[1][1] = ((3 * aMVY + (aMVY > 0)) >> 1) + apDMVector[1] + 1; + } else { + aDMV[0][0] = ((3 * aMVX + (aMVX > 0)) >> 1) + apDMVector[0]; + aDMV[0][1] = ((3 * aMVY + (aMVY > 0)) >> 1) + apDMVector[1] - 1; + + aDMV[1][0] = ((aMVX + (aMVX > 0)) >> 1) + apDMVector[0]; + aDMV[1][1] = ((aMVY + (aMVY > 0)) >> 1) + apDMVector[1] + 1; + } + } else { + aDMV[0][0] = ((aMVX + (aMVX > 0)) >> 1) + apDMVector[0]; + aDMV[0][1] = ((aMVY + (aMVY > 0)) >> 1) + apDMVector[1]; -} /* end _mpeg12_get_refs */ + if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_TOP_FIELD) + --aDMV[0][1]; + else + ++aDMV[0][1]; + } +} -static void _mpeg2_mc ( - int aMBA, int aMBType, int aMotionType, int aPMV[ 2 ][ 2 ][ 2 ], - int aMVFS[ 2 ][ 2 ], int aDMVector[ 2 ], int aMBAI - ){ +/* get and decode motion vector and differential motion vector + for one prediction */ +static void _mpeg12_motion_vector(int *apPMV, int *apDMVector, int aHRSize, + int aVRSize, int aDMV, int aMVScale, int aFullPelVector) +{ + int lMotionCode; + int lMotionResidual; - int lBX, lBY; - int lfField; - int lfIntra; - int lOffset; - int lfNoSkip; - int lfFiledMV; + /* horizontal component */ + lMotionCode = _MPEG_GetMotionCode(); + lMotionResidual = aHRSize && lMotionCode ? _MPEG_GetBits(aHRSize) : 0; - lBX = s_MPEG12Ctx.m_pMBXY[ aMBA ].m_X; - lBY = s_MPEG12Ctx.m_pMBXY[ aMBA ].m_Y; - lfField = s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME; - lOffset = ( lBY * ( s_MPEG12Ctx.m_MBWidth << lfField ) + lBX ) * sizeof ( _MPEGMacroBlock8 ); - lfIntra = aMBType & _MPEG_MBT_INTRA; - lfNoSkip = aMBAI == 1; - lfFiledMV = aMotionType & _MPEG_MC_FIELD; + _mpeg12_decode_motion_vector(&apPMV[0], aHRSize, lMotionCode, lMotionResidual, aFullPelVector); - s_MPEG12Ctx.m_pCurMotions -> m_Stride = s_MPEG12Ctx.m_MBStride; - s_MPEG12Ctx.m_pCurMotions -> m_pMBDstY = UNCACHED_SEG( s_MPEG12Ctx.m_pCurFrameY + lOffset ); - s_MPEG12Ctx.m_pCurMotions -> m_pMBDstCbCr = UNCACHED_SEG( s_MPEG12Ctx.m_pCurFrameCbCr + lOffset ); + if (aDMV) + apDMVector[0] = _MPEG_GetDMVector(); - lBX <<= 4; - lBY <<= 4; + s_MPEG12Ctx.m_fError = lMotionCode == -32768; - if ( !lfIntra ) { - _mpeg12_get_refs ( lBX, lBY, aMBType, aMotionType, aPMV, aMVFS, aDMVector ); - if ( lfNoSkip && ( aMBType & _MPEG_MBT_PATTERN ) ) - s_MPEG12Ctx.m_pCurMotions -> BlockOp = AddBlockOp[ lfField ][ lfFiledMV ]; - else { - s_MPEG12Ctx.m_pCurMotions -> m_pSrc = s_MPEG12Ctx.m_pCurMotions -> m_pSPRRes; - s_MPEG12Ctx.m_pCurMotions -> BlockOp = PutBlockOp[ !lfField + ( lfNoSkip && lfFiledMV && !lfField ) ]; - } /* end else */ - } else { - s_MPEG12Ctx.m_pCurMotions -> m_Motion[ 0 ].MC_Luma = NULL; - s_MPEG12Ctx.m_pCurMotions -> m_pSrc = s_MPEG12Ctx.m_pCurMotions -> m_pSPRBlk; - s_MPEG12Ctx.m_pCurMotions -> BlockOp = PutBlockOp[ !lfField ]; - } /* end else */ + /* vertical component */ + lMotionCode = _MPEG_GetMotionCode(); + lMotionResidual = aVRSize && lMotionCode ? _MPEG_GetBits(aVRSize) : 0; -} /* end _mpeg2_mc */ + if (aMVScale) + apPMV[1] >>= 1; -static int _mpeg12_slice ( int aMBAMax ) { + _mpeg12_decode_motion_vector(&apPMV[1], aVRSize, lMotionCode, lMotionResidual, aFullPelVector); - int lPMV [ 2 ][ 2 ][ 2 ]; - int lMVFS [ 2 ][ 2 ]; - int lDMVector[ 2 ]; - int lMBA, lMBAI, lMBType, lMotionType; - int retVal; + if (aMVScale) + apPMV[1] <<= 1; - s_MPEG12Ctx.m_fError = 0; - lMBType = _MPEG_NextStartCode (); + if (aDMV) + apDMVector[1] = _MPEG_GetDMVector(); - if ( lMBType < _MPEG_CODE_SLICE_MIN || lMBType > _MPEG_CODE_SLICE_MAX ) return -1; + s_MPEG12Ctx.m_fError = lMotionCode == -32768; +} - _MPEG_GetBits ( 32 ); +static void _mpeg12_motion_vectors( + int aPMV[2][2][2], int aDMVector[2], int aMVFS[2][2], int aS, int anMV, + int aMVFmt, int aHRSize, int aVRSize, int aDMV, int aMVScale) +{ + if (anMV == 1) { + if (aMVFmt == _MPEG_MV_FIELD && !aDMV) + aMVFS[1][aS] = aMVFS[0][aS] = _MPEG_GetBits(1); - s_MPEG12Ctx.m_QScale = _MPEG_GetBits ( 5 ); + _mpeg12_motion_vector(aPMV[0][aS], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0); - if ( _MPEG_GetBits ( 1 ) ) { - _MPEG_GetBits ( 8 ); - _xtra_bitinf (); - } /* end if */ + aPMV[1][aS][0] = aPMV[0][aS][0]; + aPMV[1][aS][1] = aPMV[0][aS][1]; + } else { + aMVFS[0][aS] = _MPEG_GetBits(1); + _mpeg12_motion_vector(aPMV[0][aS], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0); - lMBAI = _MPEG_GetMBAI (); + aMVFS[1][aS] = _MPEG_GetBits(1); + _mpeg12_motion_vector(aPMV[1][aS], aDMVector, aHRSize, aVRSize, aDMV, aMVScale, 0); + } +} - if ( lMBAI ) { +static int _mpeg12_dec_mb( + int *apMBType, int *apMotionType, + int aPMV[2][2][2], int aMVFS[2][2], int aDMVector[2]) +{ - lMBA = ( ( lMBType & 255 ) - 1 ) * s_MPEG12Ctx.m_MBWidth + lMBAI - 1; + int lMBType; + int lDMV; + int lMVScale; + int lnMV; + int lMVFmt; + int lDCType; + int lMotionType; + int lfIntra; - lMBAI = - s_MPEG12Ctx.m_fDCRst = 1; + lMotionType = 0; + lMBType = _MPEG_GetMBType(); - lPMV[ 0 ][ 0 ][ 0 ] = lPMV[ 0 ][ 0 ][ 1 ] = lPMV[ 1 ][ 0 ][ 0 ] = lPMV[ 1 ][ 0 ][ 1 ] = 0; - lPMV[ 0 ][ 1 ][ 0 ] = lPMV[ 0 ][ 1 ][ 1 ] = lPMV[ 1 ][ 1 ][ 0 ] = lPMV[ 1 ][ 1 ][ 1 ] = 0; + if (!lMBType) + return 0; - } else return 0; + lfIntra = lMBType & _MPEG_MBT_INTRA; - while ( 1 ) { + if (lMBType & (_MPEG_MBT_MOTION_FORWARD | _MPEG_MBT_MOTION_BACKWARD)) { - s_MPEG12Ctx.m_pCurMotions = &s_MPEG12Ctx.m_MC[ s_MPEG12Ctx.m_CurMC ]; + if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) + lMotionType = s_MPEG12Ctx.m_fFPFrmDCT ? _MPEG_MC_FRAME : _MPEG_GetBits(2); + else + lMotionType = _MPEG_GetBits(2); - if ( lMBA >= aMBAMax || !_MPEG_WaitBDEC () ) return -1; + } else if (lfIntra && s_MPEG12Ctx.m_fConsMV) + lMotionType = (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) ? _MPEG_MC_FRAME : _MPEG_MC_FIELD; - if ( !lMBAI ) { + if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) { + lnMV = lMotionType == _MPEG_MC_FIELD ? 2 : 1; + lMVFmt = lMotionType == _MPEG_MC_FRAME ? _MPEG_MV_FRAME : _MPEG_MV_FIELD; + } else { + lnMV = (lMotionType == _MPEG_MC_16X8) ? 2 : 1; + lMVFmt = _MPEG_MV_FIELD; + } + + lDMV = lMotionType == _MPEG_MC_DMV; + lMVScale = lMVFmt == _MPEG_MV_FIELD && s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME; + lDCType = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME && !s_MPEG12Ctx.m_fFPFrmDCT && lMBType & (_MPEG_MBT_PATTERN | _MPEG_MBT_INTRA) ? _MPEG_GetBits(1) : 0; + + if (lMBType & _MPEG_MBT_QUANT) + s_MPEG12Ctx.m_QScale = _MPEG_GetBits(5); + + if ((lMBType & _MPEG_MBT_MOTION_FORWARD) || (lfIntra && s_MPEG12Ctx.m_fConsMV)) { + if (s_MPEG12Ctx.m_fMPEG2) + _mpeg12_motion_vectors(aPMV, aDMVector, aMVFS, 0, lnMV, lMVFmt, s_MPEG12Ctx.m_FCode[0][0] - 1, s_MPEG12Ctx.m_FCode[0][1] - 1, lDMV, lMVScale); + else + _mpeg12_motion_vector(aPMV[0][0], aDMVector, s_MPEG12Ctx.m_FwdFCode - 1, s_MPEG12Ctx.m_FwdFCode - 1, 0, 0, s_MPEG12Ctx.m_FPFVector); + } + + if (s_MPEG12Ctx.m_fError) + return 0; + + if (lMBType & _MPEG_MBT_MOTION_BACKWARD) { + if (s_MPEG12Ctx.m_fMPEG2) + _mpeg12_motion_vectors(aPMV, aDMVector, aMVFS, 1, lnMV, lMVFmt, s_MPEG12Ctx.m_FCode[1][0] - 1, s_MPEG12Ctx.m_FCode[1][1] - 1, 0, lMVScale); + else + _mpeg12_motion_vector(aPMV[0][1], aDMVector, s_MPEG12Ctx.m_BckFCode - 1, s_MPEG12Ctx.m_BckFCode - 1, 0, 0, s_MPEG12Ctx.m_FPBVector); + } + + if (s_MPEG12Ctx.m_fError) + return 0; + + if (lfIntra && s_MPEG12Ctx.m_fConsMV) + _MPEG_GetBits(1); + + if (lMBType & (_MPEG_MBT_INTRA | _MPEG_MBT_PATTERN)) + _MPEG_BDEC(lfIntra, s_MPEG12Ctx.m_fDCRst, lDCType, s_MPEG12Ctx.m_QScale, s_MPEG12Ctx.m_pCurMotions->m_pSPRBlk); + + s_MPEG12Ctx.m_fDCRst = !lfIntra; + + if (lfIntra && !s_MPEG12Ctx.m_fConsMV) { + aPMV[0][0][0] = 0; + aPMV[0][0][1] = 0; + aPMV[1][0][0] = 0; + aPMV[1][0][1] = 0; + aPMV[0][1][0] = 0; + aPMV[0][1][1] = 0; + aPMV[1][1][0] = 0; + aPMV[1][1][1] = 0; + } + + if ((s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) && !(lMBType & (_MPEG_MBT_MOTION_FORWARD | _MPEG_MBT_INTRA))) { + aPMV[0][0][0] = 0; + aPMV[0][0][1] = 0; + aPMV[1][0][0] = 0; + aPMV[1][0][1] = 0; + + if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) { + lMotionType = _MPEG_MC_FRAME; + } else { + lMotionType = _MPEG_MC_FIELD; + aMVFS[0][0] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD; + } + } + + *apMBType = lMBType; + *apMotionType = lMotionType; + + return 1; +} + +static void _mpeg12_get_ref(_MPEGMacroBlock8 *apMBSrc, int aX, int anY, + int aDX, int aDY, int aH, int aFSrc, int aFDst, int afAvg) +{ + + int lfInt = (aH & 8) >> 3; + int lDXY = ((aDY & 1) << 1) | (aDX & 1); + int lUVXY = ((aDX & 2) >> 1) | (aDY & 2); + int lSrcX = aX + (aDX >> 1); + int lSrcY = ((anY + (aDY >> 1)) << lfInt) + aFSrc; + int lMBX = lSrcX >> 4; + int lMBY = lSrcY >> 4; + _MPEGMotion *lpMotion = &s_MPEG12Ctx.m_pCurMotions->m_Motion[s_MPEG12Ctx.m_pCurMotions->m_nMotions++]; + + afAvg <<= 2; + + __asm__ __volatile__( + "pnor $v1, $zero, $zero \n" + "ld $v0, %4 \n" + "pextlw %0, %3, %2 \n" + "paddw $v0, $v0, $v1 \n" + "pmaxw %0, %0, $zero \n" + "pminw %0, %0, $v0 \n" + "dsrl32 %1, %0, 0 \n" + "sll %0, %0, 0 \n" + : "=r"(lMBX), "=r"(lMBY) : "r"(lMBX), "r"(lMBY), "m"(s_MPEG12Ctx.m_MBWidth) + : "v0", "v1"); + + lpMotion->m_pSrc = (unsigned char *)(apMBSrc + lMBX + lMBY * s_MPEG12Ctx.m_MBWidth); + lpMotion->m_pDstY = (short *)(s_MPEG12Ctx.m_pCurMotions->m_pSPRRes + (aFDst << 5)); + lpMotion->m_pDstCbCr = (short *)(s_MPEG12Ctx.m_pCurMotions->m_pSPRRes + 512 + (aFDst << 3)); + lpMotion->m_X = lSrcX & 0xF; + lpMotion->m_Y = lSrcY & 0xF; + lpMotion->m_H = aH; + lpMotion->m_fInt = lfInt; + lpMotion->m_Field = aFSrc; + lpMotion->MC_Luma = LumaOp[lDXY + afAvg]; + lpMotion->MC_Chroma = ChromaOp[lUVXY + afAvg]; +} + +static void _mpeg12_get_refs(int aBX, int aBY, int aMBType, int aMotionType, int aPMV[2][2][2], + int aMVFS[2][2], int aDMVector[2]) +{ + int lfAdd = 0; + + s_MPEG12Ctx.m_pCurMotions->m_nMotions = 0; + + if ((aMBType & _MPEG_MBT_MOTION_FORWARD) || + (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P)) { + + int lDMV[2][2]; + + if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) { + + if ((aMotionType == _MPEG_MC_FRAME) || !(aMBType & _MPEG_MBT_MOTION_FORWARD)) { + _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1], + 16, 0, 0, 0); + } else if (aMotionType == _MPEG_MC_FIELD) { + _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[0][0][0], aPMV[0][0][1] >> 1, + 8, aMVFS[0][0], 0, 0); + _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[1][0][0], aPMV[1][0][1] >> 1, + 8, aMVFS[1][0], 8, 0); + } else if (aMotionType == _MPEG_MC_DMV) { + + _mpeg12_dual_prime_vector(lDMV, aDMVector, aPMV[0][0][0], aPMV[0][0][1] >> 1); + _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[0][0][0], aPMV[0][0][1] >> 1, + 8, 0, 0, 0); + _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, lDMV[0][0], lDMV[0][1], + 8, 1, 0, 1); + _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, aPMV[0][0][0], aPMV[0][0][1] >> 1, + 8, 1, 8, 0); + _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY >> 1, lDMV[1][0], lDMV[1][1], + 8, 0, 8, 1); + } + } else { + int lCurField; + _MPEGMacroBlock8 *lpMBSrc; + + lCurField = (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD); + lpMBSrc = (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) && s_MPEG12Ctx.m_fSecField && (lCurField != aMVFS[0][0]) ? s_MPEG12Ctx.m_pBckFrame : s_MPEG12Ctx.m_pFwdFrame; + + if ((aMotionType == _MPEG_MC_FIELD) || !(aMBType & _MPEG_MBT_MOTION_FORWARD)) { + _mpeg12_get_ref(lpMBSrc, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1], 8, + aMVFS[0][0], 0, 0); + _mpeg12_get_ref(lpMBSrc, aBX, aBY + 8, aPMV[0][0][0], aPMV[0][0][1], 8, + aMVFS[0][0], 8, 0); + } else if (aMotionType == _MPEG_MC_16X8) { + _mpeg12_get_ref(lpMBSrc, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1], 8, + aMVFS[0][0], 0, 0); + + lpMBSrc = (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) && + s_MPEG12Ctx.m_fSecField && + (lCurField != aMVFS[1][0]) ? + s_MPEG12Ctx.m_pBckFrame : + s_MPEG12Ctx.m_pFwdFrame; + _mpeg12_get_ref(lpMBSrc, aBX, aBY + 8, aPMV[1][0][0], aPMV[1][0][1], 8, + aMVFS[1][0], 8, 0); + } else if (aMotionType == _MPEG_MC_DMV) { + lpMBSrc = s_MPEG12Ctx.m_fSecField ? s_MPEG12Ctx.m_pBckFrame : s_MPEG12Ctx.m_pFwdFrame; + _mpeg12_dual_prime_vector(lDMV, aDMVector, aPMV[0][0][0], aPMV[0][0][1]); + _mpeg12_get_ref(s_MPEG12Ctx.m_pFwdFrame, aBX, aBY, aPMV[0][0][0], aPMV[0][0][1], 16, + lCurField, 0, 0); + _mpeg12_get_ref(lpMBSrc, aBX, aBY, lDMV[0][0], lDMV[0][1], 16, !lCurField, 1, 1); + } + } + + lfAdd = 1; + } + + if (aMBType & _MPEG_MBT_MOTION_BACKWARD) { + if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) { + if (aMotionType == _MPEG_MC_FRAME) { + _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[0][1][0], aPMV[0][1][1], + 16, 0, 0, lfAdd); + } else { + _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY >> 1, aPMV[0][1][0], aPMV[0][1][1] >> 1, + 8, aMVFS[0][1], 0, lfAdd); + _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY >> 1, aPMV[1][1][0], aPMV[1][1][1] >> 1, + 8, aMVFS[1][1], 8, lfAdd); + } + } else { + if (aMotionType == _MPEG_MC_FIELD) { + _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[0][1][0], aPMV[0][1][1], 8, + aMVFS[0][1], 0, lfAdd); + _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY + 8, aPMV[0][1][0], aPMV[0][1][1], 8, + aMVFS[0][1], 8, lfAdd); + } else if (aMotionType == _MPEG_MC_16X8) { + _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY, aPMV[0][1][0], aPMV[0][1][1], + 8, aMVFS[0][1], 0, lfAdd); + _mpeg12_get_ref(s_MPEG12Ctx.m_pBckFrame, aBX, aBY + 8, aPMV[1][1][0], aPMV[1][1][1], + 8, aMVFS[1][1], 8, lfAdd); + } + } + } + + _MPEG_dma_ref_image((_MPEGMacroBlock8 *)s_MPEG12Ctx.m_pCurMotions->m_pSPRMC, + &s_MPEG12Ctx.m_pCurMotions->m_Motion[0], + s_MPEG12Ctx.m_pCurMotions->m_nMotions, s_MPEG12Ctx.m_MBWidth); +} + +/* Motion compensation */ +static void _mpeg2_mc(int aMBA, int aMBType, int aMotionType, + int aPMV[2][2][2], int aMVFS[2][2], + int aDMVector[2], int aMBAI) +{ + /* block x,y */ + int lBX, lBY; + int lfField; + int lfIntra; + int lOffset; + int lfNoSkip; + int lfFiledMV; + + lBX = s_MPEG12Ctx.m_pMBXY[aMBA].m_X; + lBY = s_MPEG12Ctx.m_pMBXY[aMBA].m_Y; + lfField = s_MPEG12Ctx.m_PictStruct != _MPEG_PS_FRAME; + lOffset = (lBY * (s_MPEG12Ctx.m_MBWidth << lfField) + lBX) * sizeof(_MPEGMacroBlock8); + lfIntra = aMBType & _MPEG_MBT_INTRA; + lfNoSkip = aMBAI == 1; + lfFiledMV = aMotionType & _MPEG_MC_FIELD; + + s_MPEG12Ctx.m_pCurMotions->m_Stride = s_MPEG12Ctx.m_MBStride; + s_MPEG12Ctx.m_pCurMotions->m_pMBDstY = UNCACHED_SEG(s_MPEG12Ctx.m_pCurFrameY + lOffset); + s_MPEG12Ctx.m_pCurMotions->m_pMBDstCbCr = UNCACHED_SEG(s_MPEG12Ctx.m_pCurFrameCbCr + lOffset); + + lBX <<= 4; + lBY <<= 4; + + if (!lfIntra) { + _mpeg12_get_refs(lBX, lBY, aMBType, aMotionType, aPMV, aMVFS, aDMVector); + if (lfNoSkip && (aMBType & _MPEG_MBT_PATTERN)) + s_MPEG12Ctx.m_pCurMotions->BlockOp = AddBlockOp[lfField][lfFiledMV]; + else { + s_MPEG12Ctx.m_pCurMotions->m_pSrc = s_MPEG12Ctx.m_pCurMotions->m_pSPRRes; + s_MPEG12Ctx.m_pCurMotions->BlockOp = PutBlockOp[!lfField + (lfNoSkip && lfFiledMV && !lfField)]; + } + } else { + s_MPEG12Ctx.m_pCurMotions->m_Motion[0].MC_Luma = NULL; + s_MPEG12Ctx.m_pCurMotions->m_pSrc = s_MPEG12Ctx.m_pCurMotions->m_pSPRBlk; + s_MPEG12Ctx.m_pCurMotions->BlockOp = PutBlockOp[!lfField]; + } +} + +/* decode all macroblocks of the current picture */ +static int _mpeg12_slice(int aMBAMax) +{ + int lPMV[2][2][2]; + int lMVFS[2][2]; + int lDMVector[2]; + int lMBA, lMBAI, lMBType, lMotionType; + int retVal; - if ( !_MPEG_ShowBits ( 23 ) || s_MPEG12Ctx.m_fError ) { -resync: s_MPEG12Ctx.m_fError = 0; - return 0; - - } else { - - lMBAI = _MPEG_GetMBAI (); - - if ( !lMBAI ) goto resync; - - } /* end else */ - - } /* end if */ - - if ( lMBA >= aMBAMax ) return -1; - - if ( lMBAI == 1 ) { + lMBType = _MPEG_NextStartCode(); - retVal = _mpeg12_dec_mb ( &lMBType, &lMotionType, lPMV, lMVFS, lDMVector ); + /* only slice headers are allowed in picture_data */ + if (lMBType < _MPEG_CODE_SLICE_MIN || lMBType > _MPEG_CODE_SLICE_MAX) + return -1; - if ( retVal < 0 ) return retVal; - if ( !retVal ) goto resync; + _MPEG_GetBits(32); - } else { /* skipped macroblock */ + s_MPEG12Ctx.m_QScale = _MPEG_GetBits(5); - s_MPEG12Ctx.m_fDCRst = 1; + if (_MPEG_GetBits(1)) { + _MPEG_GetBits(8); + _xtra_bitinf(); + } - if ( s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P ) - lPMV[ 0 ][ 0 ][ 0 ] = lPMV[ 0 ][ 0 ][ 1 ] = - lPMV[ 1 ][ 0 ][ 0 ] = lPMV[ 1 ][ 0 ][ 1 ] = 0; - if ( s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME ) - lMotionType = _MPEG_MC_FRAME; - else { - lMotionType = _MPEG_MC_FIELD; - lMVFS[ 0 ][ 0 ] = - lMVFS[ 0 ][ 1 ] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD; - } /* end else */ + lMBAI = _MPEG_GetMBAI(); - lMBType &= ~_MPEG_MBT_INTRA; + if (lMBAI) { + lMBA = ((lMBType & 255) - 1) * s_MPEG12Ctx.m_MBWidth + lMBAI - 1; - } /* end else */ + lMBAI = s_MPEG12Ctx.m_fDCRst = 1; - _mpeg2_mc ( lMBA, lMBType, lMotionType, lPMV, lMVFS, lDMVector, lMBAI ); - - DoMC (); - - ++lMBA; - --lMBAI; - - s_MPEG12Ctx.m_CurMC ^= 1; - - if ( lMBA >= aMBAMax ) return -1; - - } /* end while */ - -} /* end _mpeg12_slice */ + lPMV[0][0][0] = lPMV[0][0][1] = lPMV[1][0][0] = lPMV[1][0][1] = 0; + lPMV[0][1][0] = lPMV[0][1][1] = lPMV[1][1][0] = lPMV[1][1][1] = 0; + } else { + return 0; + } + + while (1) { + s_MPEG12Ctx.m_pCurMotions = &s_MPEG12Ctx.m_MC[s_MPEG12Ctx.m_CurMC]; + + if (lMBA >= aMBAMax || !_MPEG_WaitBDEC()) + return -1; + + if (!lMBAI) { + if (!_MPEG_ShowBits(23) || s_MPEG12Ctx.m_fError) { + resync: + s_MPEG12Ctx.m_fError = 0; + return 0; + } else { + lMBAI = _MPEG_GetMBAI(); + + if (!lMBAI) + goto resync; + } + } + + if (lMBA >= aMBAMax) + return -1; + + if (lMBAI == 1) { + retVal = _mpeg12_dec_mb(&lMBType, &lMotionType, lPMV, lMVFS, lDMVector); + + if (retVal < 0) + return retVal; + + if (!retVal) + goto resync; + } else { + /* skipped macroblock */ + s_MPEG12Ctx.m_fDCRst = 1; + + if (s_MPEG12Ctx.m_PictCodingType == _MPEG_PT_P) { + lPMV[0][0][0] = 0; + lPMV[0][0][1] = 0; + lPMV[1][0][0] = 0; + lPMV[1][0][1] = 0; + } + + if (s_MPEG12Ctx.m_PictStruct == _MPEG_PS_FRAME) { + lMotionType = _MPEG_MC_FRAME; + } else { + lMotionType = _MPEG_MC_FIELD; + lMVFS[0][0] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD; + lMVFS[0][1] = s_MPEG12Ctx.m_PictStruct == _MPEG_PS_BOTTOM_FIELD; + } + + lMBType &= ~_MPEG_MBT_INTRA; + } + + _mpeg2_mc(lMBA, lMBType, lMotionType, lPMV, lMVFS, lDMVector, lMBAI); + + DoMC(); + + ++lMBA; + --lMBAI; + + s_MPEG12Ctx.m_CurMC ^= 1; + + if (lMBA >= aMBAMax) + return -1; + } +} diff --git a/ee/mpeg/src/libmpeg_core.c b/ee/mpeg/src/libmpeg_core.c new file mode 100644 index 00000000000..2fabc711f25 --- /dev/null +++ b/ee/mpeg/src/libmpeg_core.c @@ -0,0 +1,737 @@ +/* +# _____ ___ ____ ___ ____ +# ____| | ____| | | |____| +# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. +#----------------------------------------------------------------------- +# Copyright (c) 2006-2007 Eugene Plotnikov +# Licenced under Academic Free License version 2.0 +# Review ps2sdk README & LICENSE files for further details. +# Based on refernce software of MSSG +*/ + +#include +#include +#include +#include +#include +#include +#include + +#include "libmpeg.h" +#include "libmpeg_internal.h" + +#define READ_ONCE(x) (*(const volatile typeof(x) *)(&x)) +#define WRITE_ONCE(x, val) (*(volatile typeof(x) *)(&x) = (val)) + +struct CSCParam +{ + u32 source; + u32 dest; + u32 blocks; +}; + +struct IPUState +{ + u32 d4_chcr; + u32 d4_madr; + u32 d4_qwc; + + u32 d3_chcr; + u32 d3_madr; + u32 d3_qwc; + + u32 ipu_ctrl; + u32 ipu_bp; +}; + +static qword_t s_DMAPack[17] __attribute__((aligned(64))); +static int (*s_SetDMA_func)(void *); +static void *s_SetDMA_arg; +static struct IPUState s_IPUState; +static int *s_pEOF; +static int s_Sema; +static struct CSCParam s_CSCParam; +static int s_CSCID; +static u8 s_CSCFlag; +static u32 s_BitsBuffered; +static u32 s_LocalBits; + +static u32 s_QmIntra[16] __attribute__((aligned(16))) = { + 0x13101008, + 0x16161310, + 0x16161616, + 0x1B1A181A, + 0x1A1A1B1B, + 0x1B1B1A1A, + 0x1D1D1D1B, + 0x1D222222, + 0x1B1B1D1D, + 0x20201D1D, + 0x26252222, + 0x22232325, + 0x28262623, + 0x30302828, + 0x38382E2E, + 0x5345453A, +}; + +static u32 s_QmNonIntra[16] __attribute__((aligned(16))) = { + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, + 0x10101010, +}; + + +extern s32 _mpeg_dmac_handler(s32 channel, void *arg, void *addr); + +#define RGBA32_BLOCK_SIZE (16 * 16 * 4) + +#define IPU_CMD_BUSY (1ull << 63) + +#define IPU_CTRL_BUSY (1 << 31) +#define IPU_CTRL_RST (1 << 30) +#define IPU_CTRL_MP1 (1 << 23) +#define IPU_CTRL_ECD (1 << 14) + +// clang-format off +#define IPU_COMMAND_BCLR 0x00000000 +#define IPU_COMMAND_IDEC 0x10000000 +#define IPU_COMMAND_BDEC 0x20000000 +#define IPU_COMMAND_VDEC 0x30000000 +#define IPU_COMMAND_VDEC_MBAI 0x00000000 +#define IPU_COMMAND_VDEC_MBTYPE 0x04000000 +#define IPU_COMMAND_VDEC_MCODE 0x08000000 +#define IPU_COMMAND_VDEC_DMV 0x0C000000 +#define IPU_COMMAND_FDEC 0x40000000 +#define IPU_COMMAND_SETIQ 0x50000000 +#define IPU_COMMAND_SETVQ 0x60000000 +#define IPU_COMMAND_CSC 0x70000000 +#define IPU_COMMAND_PACK 0x80000000 +#define IPU_COMMAND_SETTH 0x90000000 +// clang-format on + +void _MPEG_Initialize(_MPEGContext *mc, int (*data_cb)(void *), void *cb_user, int *eof_flag) +{ + (void)mc; + ee_sema_t sema; + + *R_EE_IPU_CTRL = IPU_CTRL_RST; + while (*R_EE_IPU_CTRL & IPU_CTRL_BUSY) + ; + *R_EE_IPU_CMD = IPU_COMMAND_BCLR; + while (*R_EE_IPU_CTRL & IPU_CTRL_BUSY) + ; + *R_EE_IPU_CTRL |= IPU_CTRL_MP1; + *R_EE_D3_QWC = 0; + *R_EE_D4_QWC = 0; + s_SetDMA_func = data_cb; + s_SetDMA_arg = cb_user; + s_pEOF = eof_flag; + *s_pEOF = 0; + + memset(&sema, 0, sizeof(sema)); + sema.init_count = 0; + sema.max_count = 1; + sema.option = 0; + s_Sema = CreateSema(&sema); + s_CSCID = AddDmacHandler2(3, _mpeg_dmac_handler, 0, &s_CSCParam); + s_BitsBuffered = 0; + s_LocalBits = 0; +} + +void _MPEG_Destroy(void) +{ + while (READ_ONCE(s_CSCFlag) != 0) + ; + RemoveDmacHandler(3, s_CSCID); + DeleteSema(s_Sema); +} + +void _ipu_suspend(void) +{ + int oldintr; + u32 enabler; + + /* Stop ch 4 */ + oldintr = DIntr(); + enabler = *R_EE_D_ENABLER; + + *R_EE_D_ENABLEW = enabler | 0x10000; + EE_SYNCL(); + + *R_EE_D4_CHCR &= ~0x100; + s_IPUState.d4_chcr = *R_EE_D4_CHCR; + s_IPUState.d4_madr = *R_EE_D4_MADR; + s_IPUState.d4_qwc = *R_EE_D4_QWC; + + *R_EE_D_ENABLEW = enabler; + if (oldintr) { + EIntr(); + } + + /* Wait for IPU output fifo to drain */ + while (*R_EE_IPU_CTRL & 0xf0) + ; + + /* Stop ch 3 */ + oldintr = DIntr(); + enabler = *R_EE_D_ENABLER; + + *R_EE_D_ENABLEW = enabler | 0x10000; + EE_SYNCL(); + + *R_EE_D3_CHCR &= ~0x100; + s_IPUState.d3_chcr = *R_EE_D3_CHCR; + s_IPUState.d3_madr = *R_EE_D3_MADR; + s_IPUState.d3_qwc = *R_EE_D3_QWC; + s_IPUState.ipu_ctrl = *R_EE_IPU_CTRL; + s_IPUState.ipu_bp = *R_EE_IPU_BP; + + *R_EE_D_ENABLEW = enabler; + if (oldintr) { + EIntr(); + } +} + +void _MPEG_Suspend(void) +{ + while (READ_ONCE(s_CSCFlag) != 0) + ; + + _ipu_suspend(); +} + +void _ipu_resume(void) +{ + if (s_IPUState.d3_qwc != 0) { + *R_EE_D3_MADR = s_IPUState.d3_madr; + *R_EE_D3_QWC = s_IPUState.d3_qwc; + *R_EE_D3_CHCR = s_IPUState.d3_chcr | 0x100; + } + u32 qw_to_reinsert = (s_IPUState.ipu_bp >> 16 & 3) + (s_IPUState.ipu_bp >> 8 & 0xf); + u32 actual_qwc = s_IPUState.d4_qwc + qw_to_reinsert; + if (actual_qwc != 0) { + *R_EE_IPU_CMD = IPU_COMMAND_BCLR | (s_IPUState.ipu_bp & 0x7f); + while (*R_EE_IPU_CMD & IPU_CMD_BUSY) + ; + *R_EE_IPU_CTRL = s_IPUState.ipu_ctrl; + *R_EE_D4_MADR = s_IPUState.d4_madr - (qw_to_reinsert * 16); + *R_EE_D4_QWC = actual_qwc; + *R_EE_D4_CHCR = s_IPUState.d4_chcr | 0x100; + } +} + +void _MPEG_Resume(void) +{ + _ipu_resume(); +} + +s32 _mpeg_dmac_handler(s32 channel, void *arg, void *addr) +{ + (void)channel; + (void)addr; + + struct CSCParam *cp = arg; + + if (cp->blocks == 0) { + iDisableDmac(3); + iSignalSema(s_Sema); + WRITE_ONCE(s_CSCFlag, 0); + return -1; + } + + u32 mbc = cp->blocks; + if (mbc > 0x3ff) { + mbc = 0x3ff; + } + *R_EE_D3_MADR = cp->dest; + *R_EE_D4_MADR = cp->source; + cp->source += mbc * sizeof(_MPEGMacroBlock8); + cp->dest += mbc * RGBA32_BLOCK_SIZE; + cp->blocks = cp->blocks - mbc; + *R_EE_D3_QWC = (mbc * sizeof(_MPEGMacroBlock8)) >> 4; + *R_EE_D4_QWC = (mbc * RGBA32_BLOCK_SIZE) >> 4; + *R_EE_D4_CHCR = 0x101; + *R_EE_IPU_CMD = IPU_COMMAND_CSC | mbc; + *R_EE_D3_CHCR = 0x100; + + ExitHandler(); + return -1; +} + +int _MPEG_CSCImage(void *source, void *dest, int mbcount) +{ + _ipu_suspend(); + *R_EE_IPU_CMD = IPU_COMMAND_BCLR; + *R_EE_D_STAT = 8; // ack ch3 + int mbc = mbcount; + if (mbc > 0x3ff) { + mbc = 0x3ff; + } + + *R_EE_D3_MADR = (u32)dest; + *R_EE_D4_MADR = (u32)source; + + s_CSCParam.source = (u32)source + mbc * sizeof(_MPEGMacroBlock8); + s_CSCParam.dest = (u32)dest + mbc * RGBA32_BLOCK_SIZE; + s_CSCParam.blocks = mbcount - mbc; + + *R_EE_D4_QWC = (mbc * sizeof(_MPEGMacroBlock8)) >> 4; + *R_EE_D3_QWC = (mbc * RGBA32_BLOCK_SIZE) >> 4; + EnableDmac(3); + *R_EE_D4_CHCR = 0x101; + *R_EE_IPU_CMD = IPU_COMMAND_CSC | mbc; + *R_EE_D3_CHCR = 0x100; + + WRITE_ONCE(s_CSCFlag, 1); + WaitSema(s_Sema); + _ipu_resume(); + return mbc; +} + +static int _ipu_bits_in_fifo() +{ + u32 bp_reg; + u32 bp, ifc, fp; + + bp_reg = *R_EE_IPU_BP; + bp = bp_reg & 0x7f; + ifc = (bp_reg >> 8) & 0xf; + fp = (bp_reg >> 16) & 0x3; + + return (ifc << 7) + (fp << 7) - bp; +} + +static int _ipu_needs_bits() +{ + return _ipu_bits_in_fifo() < 32; +} + +static int _req_data() +{ + if (*R_EE_D4_QWC == 0) { + if (s_SetDMA_func(s_SetDMA_arg) == 0) { + s_BitsBuffered = 32; + s_LocalBits = _MPEG_CODE_SEQ_END; + *s_pEOF = 1; + return 1; + } + } + + return 0; +} + +void _ipu_sync(void) +{ + u32 ctrl = *R_EE_IPU_CTRL; + int i = 0; + + while ((ctrl & IPU_CTRL_ECD) == 0) { + if (_ipu_needs_bits()) { + if (_req_data()) { + return; + } + } + + // Are we stuck? try throwing more data at the problem + if (i > 500) { + if (_req_data()) { + return; + } + } + + if ((ctrl & IPU_CTRL_BUSY) == 0) { + return; + } + + ctrl = *R_EE_IPU_CTRL; + i++; + } +} + +u32 _ipu_sync_data(void) +{ + u32 ctrl = *R_EE_IPU_CTRL; + u64 cmd = *R_EE_IPU_CMD; + int i = 0; + + while ((ctrl & IPU_CTRL_ECD) == 0) { + if (_ipu_needs_bits()) { + if (_req_data()) { + return _MPEG_CODE_SEQ_END; + } + } + + // Are we stuck? try throwing more data at the problem + if (i > 500) { + if (_req_data()) { + return _MPEG_CODE_SEQ_END; + } + } + + if ((cmd & IPU_CMD_BUSY) == 0) { + return cmd; + } + + cmd = *R_EE_IPU_CMD; + ctrl = *R_EE_IPU_CTRL; + i++; + } + + return cmd; +} + +unsigned int _ipu_get_bits(unsigned int bits) +{ + u32 ret; + + _ipu_sync(); + if (s_BitsBuffered < bits) { + *R_EE_IPU_CMD = IPU_COMMAND_FDEC; + s_LocalBits = _ipu_sync_data(); + s_BitsBuffered = 32; + } + *R_EE_IPU_CMD = IPU_COMMAND_FDEC | bits; + s_BitsBuffered = s_BitsBuffered - bits; + ret = s_LocalBits >> ((32 - bits) & 0x1f); + s_LocalBits = s_LocalBits << (bits & 0x1f); + + return ret; +} + + +unsigned int _MPEG_GetBits(unsigned int bits) +{ + return _ipu_get_bits(bits); +} + +unsigned int _ipu_show_bits(unsigned int bits) +{ + if (s_BitsBuffered < bits) { + _ipu_sync(); + *R_EE_IPU_CMD = IPU_COMMAND_FDEC; + s_LocalBits = _ipu_sync_data(); + s_BitsBuffered = 32; + } + + return s_LocalBits >> ((32 - bits) & 0x1f); +} + +unsigned int _MPEG_ShowBits(unsigned int bits) +{ + return _ipu_show_bits(bits); +} + +void _ipu_align_bits(void) +{ + _ipu_sync(); + u32 var3 = -(*R_EE_IPU_BP & 7) & 7; + if (var3 != 0) { + _MPEG_GetBits(var3); + } +} + +void _MPEG_AlignBits(void) +{ + _ipu_align_bits(); +} + +unsigned int _MPEG_NextStartCode(void) +{ + _MPEG_AlignBits(); + while (_MPEG_ShowBits(24) != 1) { + _MPEG_GetBits(8); + } + + return _MPEG_ShowBits(32); +} + +void _MPEG_SetDefQM(int arg0) +{ + (void)arg0; + qword_t *q; + int i; + + _ipu_suspend(); + *R_EE_IPU_CMD = IPU_COMMAND_BCLR; + while (*R_EE_IPU_CTRL & IPU_CTRL_BUSY) + ; + + q = (qword_t *)s_QmIntra; + for (i = 0; i < 4; i++) { + __asm__ volatile( + "lq $2, 0(%0) \n" + "sq $2, 0(%1) \n" + : + : "d"(&q[i]), "d"(A_EE_IPU_in_FIFO) + : "2"); + } + + *R_EE_IPU_CMD = IPU_COMMAND_SETIQ; + while (*R_EE_IPU_CTRL & IPU_CTRL_BUSY) + ; + + q = (qword_t *)s_QmNonIntra; + for (i = 0; i < 4; i++) { + __asm__ volatile( + "lq $2, 0(%0) \n" + "sq $2, 0(%1) \n" + : + : "d"(&q[i]), "d"(A_EE_IPU_in_FIFO) + : "2"); + } + + *R_EE_IPU_CMD = IPU_COMMAND_SETIQ | 0x08000000; + while (*R_EE_IPU_CTRL & IPU_CTRL_BUSY) + ; + + _ipu_resume(); +} + +void _MPEG_SetQM(int iqm) +{ + _ipu_sync(); + *R_EE_IPU_CMD = IPU_COMMAND_SETIQ | iqm << 27; + s_BitsBuffered = 0; +} + +int _MPEG_GetMBAI(void) +{ + u32 mbai = 0, ret; + _ipu_sync(); + while (1) { + *R_EE_IPU_CMD = IPU_COMMAND_VDEC | IPU_COMMAND_VDEC_MBAI; + ret = _ipu_sync_data() & 0xffff; + + if (ret == 0) { + return 0; + } + + // Stuffing + if (ret == 0x22) { + } + + // MB escape + if (ret == 0x23) { + mbai += 0x21; + } + + if (ret < 0x22) { + mbai += ret; + break; + } + } + + s_BitsBuffered = 32; + s_LocalBits = *R_EE_IPU_TOP; + return mbai; +} + +int _MPEG_GetMBType(void) +{ + _ipu_sync(); + *R_EE_IPU_CMD = IPU_COMMAND_VDEC | IPU_COMMAND_VDEC_MBTYPE; + u32 ret = _ipu_sync_data(); + if (ret != 0) { + ret &= 0xffff; + s_BitsBuffered = 32; + s_LocalBits = *R_EE_IPU_TOP; + } + return ret; +} + +int _MPEG_GetMotionCode(void) +{ + short mcode; + u32 ret; + + _ipu_sync(); + *R_EE_IPU_CMD = IPU_COMMAND_VDEC | IPU_COMMAND_VDEC_MCODE; + ret = _ipu_sync_data(); + + if (ret == 0) { + return -32768; + } + + s_BitsBuffered = 32; + s_LocalBits = *R_EE_IPU_TOP; + + mcode = (short)ret; + + return mcode; +} +int _MPEG_GetDMVector(void) +{ + u32 ret; + + _ipu_sync(); + *R_EE_IPU_CMD = IPU_COMMAND_VDEC | IPU_COMMAND_VDEC_DMV; + ret = _ipu_sync_data() & 0xffff; + s_BitsBuffered = 32; + s_LocalBits = *R_EE_IPU_TOP; + return ret; +} + +void _MPEG_SetIDCP(void) +{ + unsigned int var1 = _MPEG_GetBits(2); + *R_EE_IPU_CTRL = (*R_EE_IPU_CTRL & ~0x30000) | var1 << 0x10; +} + +void _MPEG_SetQSTIVFAS(void) +{ + unsigned int qst = _MPEG_GetBits(1); + unsigned int ivf = _MPEG_GetBits(1); + unsigned int as = _MPEG_GetBits(1); + *R_EE_IPU_CTRL = (*R_EE_IPU_CTRL & ~0x700000) | qst << 22 | ivf << 21 | as << 20; +} + +void _MPEG_SetPCT(unsigned int arg0) +{ + _ipu_sync(); + *R_EE_IPU_CTRL = (*R_EE_IPU_CTRL & ~0x07000000) | arg0 << 0x18; +} + +void _MPEG_BDEC(int mbi, int dcr, int dt, int qsc, void *spaddr) +{ + *R_EE_D3_MADR = ((u32)spaddr & ~0xf0000000) | 0x80000000; + *R_EE_D3_QWC = 0x30; + *R_EE_D3_CHCR = 0x100; + _ipu_sync(); + *R_EE_IPU_CMD = IPU_COMMAND_BDEC | mbi << 27 | dcr << 26 | dt << 25 | qsc << 16; +} + +int _MPEG_WaitBDEC(void) +{ + int oldintr; + + while (1) { + _ipu_sync(); + if ((*s_pEOF != 0)) { + break; + } + + if (*R_EE_IPU_CTRL & IPU_CTRL_ECD) { + break; + } + + if (*R_EE_D3_QWC == 0) { + s_BitsBuffered = 32; + s_LocalBits = *R_EE_IPU_TOP; + return 1; + } + } + + _ipu_suspend(); + *R_EE_IPU_CTRL = IPU_CTRL_RST; + _ipu_resume(); + + oldintr = DIntr(); + *R_EE_D_ENABLEW = *R_EE_D_ENABLER | 0x10000; + *R_EE_D3_CHCR = 0; + *R_EE_D_ENABLEW = *R_EE_D_ENABLER & ~0x10000; + if (oldintr) { + EIntr(); + } + *R_EE_D3_QWC = 0; + s_BitsBuffered = 0; + s_LocalBits = 0; + return 0; +} + +void _MPEG_dma_ref_image(_MPEGMacroBlock8 *mb, _MPEGMotion *motions, s64 n_motions, int width) +{ + const u32 mbwidth = width * sizeof(*mb); + qword_t *q; + int i; + + if (n_motions <= 0) { + return; + } + + while (*R_EE_D9_CHCR & 0x100) + ; + + *R_EE_D9_QWC = 0; + *R_EE_D9_SADR = (u32)mb & 0xFFFFFFF; + *R_EE_D9_TADR = (u32)s_DMAPack; + + q = UNCACHED_SEG(s_DMAPack); + for (i = 0; i < n_motions; i++) { + DMATAG_REF(q, 0x30, (u32)motions[i].m_pSrc, 0, 0, 0); + q++; + DMATAG_REF(q, 0x30, (u32)motions[i].m_pSrc + mbwidth, 0, 0, 0); + q++; + + motions[i].m_pSrc = (unsigned char *)mb; + mb += 4; + } + + DMATAG_REFE(q, 0, 0, 0, 0, 0); + motions[i].MC_Luma = NULL; + + EE_SYNCL(); + *R_EE_D9_CHCR = 0x105; +} + +/* +// TODO: verify delay slots +void _MPEG_do_mc(_MPEGMotion *arg0) +{ + int var0 = 16; // addiu $v0, $zero, 16 + u8 *arg1 = arg0->m_pSrc; // lw $a1, 0($a0) + // addiu $sp, $sp, -16 + u16 *arg2 = (u16 *)arg0->m_pDstY; // lw $a2, 4($a0) + int arg3 = arg0->m_X; // lw $a3, 12($a0) + int tmp0 = arg0->m_Y; // lw $t0, 16($a0) + int tmp1 = arg0->m_H; // lw $t1, 20($a0) + int tmp2 = arg0->m_fInt; // lw $t2, 24($a0) + int tmp4 = arg0->m_Field; // lw $t4, 28($a0) + // lw $t5, 32($a0) <-- MC_Luma + tmp0 -= tmp4; // subu $t0, $t0, $t4 + tmp4 <<= 4; // sll $t4, $t4, 4 + arg1 += tmp4; // addu $a1, $a1, $t4 + int var1 = var0 - tmp0; // subu $v1, $v0, $t0 + int tmp3 = var0 << tmp2; // sllv $t3, $v0, $t2 + var1 >>= tmp2; // srlv $v1, $v1, $t2 + int ta = tmp0 << 4; // sll $at, $t0, 4 + // sw $ra, 0($sp) + arg1 += ta; // addu $a1, $a1, $at + ta = tmp1 - var1; // subu $at, $t1, $v1 + arg0->MC_Luma(arg1, arg2, arg3, tmp3, var1, ta); // jalr $t5 + arg1 = arg0->m_pSrc; // lw $a1, 0($a0) + arg2 = (u16 *)arg0->m_pDstCbCr; // lw $a2, 8($a0) + // lw $t5, 36($a0) <-- MC_Chroma + arg1 += 256; // addiu $a1, $a1, 256 + tmp4 >>= 1; // srl $t4, $t4, 1 + arg3 >>= 1; // srl $a3, $a3, 1 + tmp0 >>= 1; // srl $t0, $t0, 1 + tmp1 >>= 1; // srl $t1, $t1, 1 + // lw $ra, 0($sp) + tmp0 >>= tmp2; // srlv $t0, $t0, $t2 + arg1 += tmp4; // addu $a1, $a1, $t4 + var0 = 8; // addiu $v0, $zero, 8 + tmp0 <<= tmp2; // sllv $t0, $t0, $t2 + var1 = var0 - tmp0; // subu $v1, $v0, $t0 + tmp3 = var0 << tmp2; // sllv $t3, $v0, $t2 + var1 >>= tmp2; // srlv $v1, $v1, $t2 + ta = tmp0 << 3; // sll $at, $t0, 3 + arg1 += ta; // addu $a1, $a1, $at + ta = tmp1 - var1; // subu $at, $t1, $v1 + arg0->MC_Chroma(arg1, arg2, arg3, tmp3, var1, ta); // jr $t5 + // addiu $sp, $sp, 16 +} +*/ diff --git a/ee/mpeg/src/libmpeg_core_c.c b/ee/mpeg/src/libmpeg_core_c.c deleted file mode 100644 index 0e96512b4d8..00000000000 --- a/ee/mpeg/src/libmpeg_core_c.c +++ /dev/null @@ -1,2681 +0,0 @@ -/* -# _____ ___ ____ ___ ____ -# ____| | ____| | | |____| -# | ___| |____ ___| ____| | \ PS2DEV Open Source Project. -#----------------------------------------------------------------------- -# Copyright (c) 2006-2007 Eugene Plotnikov -# Licenced under Academic Free License version 2.0 -# Review ps2sdk README & LICENSE files for further details. -# Based on refernce software of MSSG -*/ - -#include -#include -#include -#include -#include -#include - -#include "libmpeg.h" -#include "libmpeg_internal.h" - -static u8 s_DMAPack[128]; -static u32 s_DataBuf[2]; -static int ( * s_SetDMA_func) ( void* ); -static void * s_SetDMA_arg; -static u32 s_IPUState[8]; -static int* s_pEOF; -static int s_Sema; -static u32 s_CSCParam[3]; -static int s_CSCID; -static u8 s_CSCFlag; - -extern s32 _mpeg_dmac_handler( s32 channel, void *arg, void *addr ); - -void _MPEG_Initialize ( _MPEGContext* arg0, int ( * arg1) ( void* ), void* arg2, int* arg3) -{ - (void)arg0; - - *R_EE_IPU_CTRL = 0x40000000; - while ((s32)*R_EE_IPU_CTRL < 0); - *R_EE_IPU_CMD = 0; - while ((s32)*R_EE_IPU_CTRL < 0); - *R_EE_IPU_CTRL |= 0x800000; - *R_EE_D3_QWC = 0; - *R_EE_D4_QWC = 0; - s_SetDMA_func = arg1; - s_SetDMA_arg = arg2; - s_pEOF = arg3; - *s_pEOF = 0; - // TODO: check if this is the correct options for the semaphore - ee_sema_t sema; - memset(&sema, 0, sizeof(sema)); - sema.init_count = 0; - sema.max_count = 1; - sema.option = 0; - s_Sema = CreateSema(&sema); - s_CSCID = AddDmacHandler2(3, _mpeg_dmac_handler, 0, &s_CSCParam); - s_DataBuf[0] = 0; - s_DataBuf[1] = 0; -} - -void _MPEG_Destroy ( void ) -{ - while (s_CSCFlag != 0); - RemoveDmacHandler(3, s_CSCID); - DeleteSema(s_Sema); -} - -void _ipu_suspend ( void ) -{ - int eie; - do - { - DI(); - EE_SYNCP(); - asm volatile ("mfc0\t%0, $12" : "=r" (eie)); - eie &= 0x10000; - } - while (eie != 0); - *R_EE_D4_CHCR &= ~0x100; - *R_EE_D_ENABLEW = *R_EE_D_ENABLER & ~0x100; - EI(); - s_IPUState[0] = *R_EE_D4_CHCR; - s_IPUState[1] = *R_EE_D4_MADR; - s_IPUState[2] = *R_EE_D4_QWC; - while ((*R_EE_IPU_CTRL & 0xf0) != 0); - do - { - DI(); - EE_SYNCP(); - asm volatile ("mfc0\t%0, $12" : "=r" (eie)); - eie &= 0x10000; - } - while (eie != 0); - *R_EE_D3_CHCR &= ~0x100; - *R_EE_D_ENABLEW = *R_EE_D_ENABLER & ~0x100; - EI(); - s_IPUState[3] = *R_EE_D3_CHCR; - s_IPUState[4] = *R_EE_D3_MADR; - s_IPUState[5] = *R_EE_D3_QWC; - s_IPUState[6] = *R_EE_IPU_CTRL; - s_IPUState[7] = *R_EE_IPU_BP; -} - -void _MPEG_Suspend ( void ) -{ - while (s_CSCFlag != 0); - return _ipu_suspend(); -} - -void _ipu_resume ( void ) -{ - if (s_IPUState[5] != 0) - { - *R_EE_D3_MADR = s_IPUState[4]; - *R_EE_D3_QWC = s_IPUState[5]; - *R_EE_D3_CHCR = s_IPUState[3] | 0x100; - } - u32 var2 = (s_IPUState[7] >> 0x10 & 3) + (s_IPUState[7] >> 8 & 0xf); - u32 var3 = (s_IPUState[2]) + var2; - if (var3 != 0) - { - *R_EE_IPU_CMD = (s_IPUState[7]) & 0x7f; - while (((*R_EE_IPU_CTRL) & 0x80000000) != 0); - *R_EE_IPU_CTRL = s_IPUState[6]; - *R_EE_D4_MADR = (s_IPUState[1]) - var2 * 0x10; - *R_EE_D4_QWC = var3; - *R_EE_D4_CHCR = s_IPUState[0] | 0x100; - } -} - -void _MPEG_Resume ( void ) -{ - return _ipu_resume(); -} - -s32 _mpeg_dmac_handler( s32 channel, void *arg, void *addr ) -{ - (void)channel; - (void)addr; - - u32 *carg = arg; - u32 var1 = carg[2]; - if (var1 == 0) - { - iDisableDmac(3); - iSignalSema(s_Sema); - s_CSCFlag = 0; - return ~0; - } - u32 var2 = var1; - if (0x3fe < (int)var1) - { - var2 = 0x3ff; - } - *R_EE_D3_MADR = carg[1]; - *R_EE_D4_MADR = carg[0]; - carg[0] += var2 * 0x180; - carg[1] += var2 * 0x400; - carg[2] = var1 - var2; - *R_EE_D3_QWC = var2 * 0x400 >> 4; - *R_EE_D4_QWC = var2 * 0x180 >> 4; - *R_EE_D4_CHCR = 0x101; - *R_EE_IPU_CMD = var2 | 0x70000000; - *R_EE_D3_CHCR = 0x100; - return ~0; -} - -int _MPEG_CSCImage ( void* arg0, void* arg1, int arg2 ) -{ - _ipu_suspend(); - *R_EE_IPU_CMD = 0; - *R_EE_D_STAT = 8; - int var1 = arg2; - if (0x3fe < var1) - { - var1 = 0x3ff; - } - s_CSCParam[2] = arg2 - var1; - *R_EE_D3_MADR = (u32)arg1; - *R_EE_D4_MADR = (u32)arg0; - s_CSCParam[0] = (int)arg0 + var1 * 0x180; - s_CSCParam[1] = (int)arg1 + var1 * 0x400; - *R_EE_D4_QWC = var1 * 0x180; - *R_EE_D3_QWC = var1 * 0x400; - EnableDmac(3); - var1 |= 0x70000000; - *R_EE_D4_CHCR = 0x101; - *R_EE_IPU_CMD = var1; - *R_EE_D3_CHCR = 0x100; - s_CSCFlag = 68; // TODO: validate this - WaitSema(s_Sema); - _ipu_resume(); - return var1; -} - -void _ipu_sync( void ) -{ - if ((s32)*R_EE_IPU_CTRL >= 0) - { - return; - } - while (1) - { - while (1) - { - if ((*R_EE_IPU_CTRL & 0x4000) != 0) - { - return; - } - u32 var0 = *R_EE_IPU_BP; - if ((int)((((var0 & 0xff00) >> 1) + ((var0 & 0x30000) >> 9)) - (var0 & 0x7f)) < 0x20) - { - break; - } -LAB_0001041c: - if ((u32)(-1) < *R_EE_IPU_CTRL) - { - return; - } - } - - if ((int)*R_EE_D4_QWC < 1) - { - if (s_SetDMA_func(s_SetDMA_arg) == 0) - { - *s_pEOF = 0x20; - s_DataBuf[0] = 0x20; - s_DataBuf[1] = 0x1b7; - } - goto LAB_0001041c; - } - } -} - -u32 _ipu_sync_data( void ) -{ - if ((u64)(-1) < *R_EE_IPU_CMD) - { - return *R_EE_IPU_BP; - } - u32 var3 = *R_EE_IPU_BP; - do - { - while (0x1f < (((var3 & 0xff00) >> 1) + ((var3 & 0x30000) >> 9)) - (var3 & 0x7f)) - { -LAB_000104b8: - if ((u64)(-1) < *R_EE_IPU_CMD) - { - return var3; - } - var3 = *R_EE_IPU_BP; - } - if (*R_EE_D4_QWC < 1) - { - if (s_SetDMA_func(s_SetDMA_arg) == 0) - { - *s_pEOF = 0x20; - return var3; - } - goto LAB_000104b8; - } - var3 = *R_EE_IPU_BP; - } - while (1); -} - -unsigned int _ipu_get_bits( unsigned int arg0 ) -{ - _ipu_sync(); - if (s_DataBuf[0] < arg0) - { - *R_EE_IPU_CMD = 0x40000000; - s_DataBuf[1] = _ipu_sync_data(); - s_DataBuf[0] = 0x20; - } - *R_EE_IPU_CMD = arg0 | 0x40000000; - u32 var3 = s_DataBuf[1] >> (-arg0 & 0x1f); - s_DataBuf[0] = s_DataBuf[0] - arg0; - s_DataBuf[1] = s_DataBuf[1] << (arg0 & 0x1f); - return var3; -} - -unsigned int _MPEG_GetBits ( unsigned int arg0 ) -{ - return _ipu_get_bits(arg0); -} - -unsigned int _ipu_show_bits ( unsigned int arg0 ) -{ - if (s_DataBuf[0] < arg0) - { - _ipu_sync(); - *R_EE_IPU_CMD = 0x40000000; - s_DataBuf[1] = _ipu_sync_data(); - s_DataBuf[0] = 0x20; - } - return s_DataBuf[1] >> (-arg0 & 0x1f); -} - -unsigned int _MPEG_ShowBits ( unsigned int arg0 ) -{ - return _ipu_show_bits(arg0); -} - -void _ipu_align_bits( void ) -{ - _ipu_sync(); - u32 var3 = -(*R_EE_IPU_BP & 7) & 7; - if (var3 != 0) - { - _MPEG_GetBits(var3); - } -} - -void _MPEG_AlignBits ( void ) -{ - return _ipu_align_bits(); -} - -unsigned int _MPEG_NextStartCode ( void ) -{ - _MPEG_AlignBits(); - while (_MPEG_ShowBits(0x18) != 1) - { - _MPEG_GetBits(8); - } - return _MPEG_ShowBits(0x20); -} - -void _MPEG_SetDefQM ( int arg0 ) -{ - (void)arg0; - - _ipu_suspend(); - *R_EE_IPU_CMD = 0; - while (((*R_EE_IPU_CTRL) & 0x80000000) != 0); - R_EE_IPU_in_FIFO[0] = 0x13101008; - R_EE_IPU_in_FIFO[1] = 0x16161310; - R_EE_IPU_in_FIFO[2] = 0x16161616; - R_EE_IPU_in_FIFO[3] = 0x1B1A181A; - R_EE_IPU_in_FIFO[0] = 0x1A1A1B1B; - R_EE_IPU_in_FIFO[1] = 0x1B1B1A1A; - R_EE_IPU_in_FIFO[2] = 0x1D1D1D1B; - R_EE_IPU_in_FIFO[3] = 0x1D222222; - R_EE_IPU_in_FIFO[0] = 0x1B1B1D1D; - R_EE_IPU_in_FIFO[1] = 0x20201D1D; - R_EE_IPU_in_FIFO[2] = 0x26252222; - R_EE_IPU_in_FIFO[3] = 0x22232325; - R_EE_IPU_in_FIFO[0] = 0x28262623; - R_EE_IPU_in_FIFO[1] = 0x30302828; - R_EE_IPU_in_FIFO[2] = 0x38382E2E; - R_EE_IPU_in_FIFO[3] = 0x5345453A; - *R_EE_IPU_CMD = 0x50000000; - while (((*R_EE_IPU_CTRL) & 0x80000000) != 0); - R_EE_IPU_in_FIFO[0] = 0x10101010; - R_EE_IPU_in_FIFO[1] = 0x10101010; - R_EE_IPU_in_FIFO[2] = 0x10101010; - R_EE_IPU_in_FIFO[3] = 0x10101010; - R_EE_IPU_in_FIFO[0] = 0x10101010; - R_EE_IPU_in_FIFO[1] = 0x10101010; - R_EE_IPU_in_FIFO[2] = 0x10101010; - R_EE_IPU_in_FIFO[3] = 0x10101010; - R_EE_IPU_in_FIFO[0] = 0x10101010; - R_EE_IPU_in_FIFO[1] = 0x10101010; - R_EE_IPU_in_FIFO[2] = 0x10101010; - R_EE_IPU_in_FIFO[3] = 0x10101010; - R_EE_IPU_in_FIFO[0] = 0x10101010; - R_EE_IPU_in_FIFO[1] = 0x10101010; - R_EE_IPU_in_FIFO[2] = 0x10101010; - R_EE_IPU_in_FIFO[3] = 0x10101010; - *R_EE_IPU_CMD = 0x58000000; - while (((*R_EE_IPU_CTRL) & 0x80000000) != 0); - _MPEG_Resume(); -} - -void _MPEG_SetQM ( int arg0 ) -{ - _ipu_sync(); - *R_EE_IPU_CMD = arg0 << 0x1b | 0x50000000; - s_DataBuf[0] = 0; -} - -int _MPEG_GetMBAI ( void ) -{ - _ipu_sync(); - int var5 = 0; - u32 var4 = 0; - while (1) - { - *R_EE_IPU_CMD = 0x30000000; - var4 = _ipu_sync_data(); - var4 &= 0xffff; - if (var4 == 0) - { - return 0; - } - if (var4 < 0x22) - { - break; - } - if (var4 == 0x23) - { - var5 += 0x21; - } - } - s_DataBuf[0] = 0x20; - s_DataBuf[1] = *R_EE_IPU_TOP; - return var5 + (int)var4; -} - -int _MPEG_GetMBType ( void ) -{ - _ipu_sync(); - *R_EE_IPU_CMD = 0x34000000; - u32 var4 = _ipu_sync_data(); - if (var4 != 0) - { - var4 &= 0xffff; - s_DataBuf[0] = 0x20; - s_DataBuf[1] = *R_EE_IPU_TOP; - } - return (int)var4; -} - -int _MPEG_GetMotionCode ( void ) -{ - _ipu_sync(); - *R_EE_IPU_CMD = 0x38000000; - u32 var4 = _ipu_sync_data(); - if (var4 == 0) - { - var4 = 0x8000; - } - else - { - var4 &= 0xffff; - s_DataBuf[0] = 0x20; - s_DataBuf[1] = *R_EE_IPU_TOP; - } - return (int)var4; -} - -int _MPEG_GetDMVector ( void ) -{ - _ipu_sync(); - *R_EE_IPU_CMD = 0x3c000000; - u32 var4 = _ipu_sync_data(); - var4 &= 0xffff; - s_DataBuf[0] = 0x20; - s_DataBuf[1] = *R_EE_IPU_TOP; - return (int)var4; -} - -void _MPEG_SetIDCP ( void ) -{ - unsigned int var1 = _MPEG_GetBits(2); - *R_EE_IPU_CTRL = (*R_EE_IPU_CTRL & ~0x30000) | var1 << 0x10; -} - -void _MPEG_SetQSTIVFAS ( void ) -{ - unsigned int var1 = _MPEG_GetBits(1); - unsigned int var2 = _MPEG_GetBits(1); - unsigned int var3 = _MPEG_GetBits(1); - *R_EE_IPU_CTRL = (*R_EE_IPU_CTRL & ~0x700000) | var1 << 0x16 | var2 << 0x15 | var3 << 0x14; -} - -void _MPEG_SetPCT ( unsigned int arg0 ) -{ - u32 var3 = *R_EE_IPU_CTRL; - if (-1 < (int)var3) - { - *R_EE_IPU_CTRL = (var3 & ~0x7000000) | arg0 << 0x18; - return; - } - // TODO: validate. Bugged and in wrong place? - _ipu_sync(); -} - -void _MPEG_BDEC ( int arg0, int arg1, int arg2, int arg3, void* arg4 ) -{ - *R_EE_D3_MADR = ((uint32_t)arg4 & ~0xf0000000) | 0x80000000; - *R_EE_D3_QWC = 0x30; - *R_EE_D3_CHCR = 0x100; - _ipu_sync(); - *R_EE_IPU_CMD = arg0 << 0x1b | 0x20000000 | arg1 << 0x1a | arg2 << 0x19 | arg3 << 0x10; -} - -int _MPEG_WaitBDEC ( void ) -{ - while (1) - { - _ipu_sync(); - if ((*s_pEOF != 0)) - { - break; - } - u32 var1 = *R_EE_D3_QWC; - if ((*R_EE_IPU_CTRL & 0x4000) != 0) - { - break; - } - if (var1 == 0) - { - s_DataBuf[0] = 0x20; - s_DataBuf[1] = *R_EE_IPU_TOP; - return 1; - } - } - _ipu_suspend(); - // XXX: $t1 is not set in this function, so probably from another function? - *R_EE_IPU_CTRL = 0x40000000; - _ipu_resume(); - int eie; - do - { - DI(); - EE_SYNCP(); - asm volatile ("mfc0\t%0, $12" : "=r" (eie)); - eie &= 0x10000; - } - while (eie != 0); - *R_EE_D_ENABLEW = *R_EE_D_ENABLER | 0x10000; - *R_EE_D3_CHCR = 0; - *R_EE_D_ENABLEW = *R_EE_D_ENABLER & ~0x10000; - EI(); - *R_EE_D3_QWC = 0; - s_DataBuf[0] = 0; - s_DataBuf[1] = 0; - return 0; -} - -void _MPEG_dma_ref_image ( _MPEGMacroBlock8* arg0, _MPEGMotion* arg1, s64 arg2, int arg3 ) -{ - u8* var00 = (u8*)arg0; - _MPEGMotion* var01 = (_MPEGMotion*)arg1; - u32 var3 = 4; - if (arg2 < 5) - { - var3 = arg2; - } - u64 var5 = (uint64_t)var3; - if (arg2 >> 0x1f < 1) - { - // TODO: correct implementation of CONCAT44? - var5 = ((u64)(arg2 >> 0x1f) << 32) | var3; - } - if (0 < var5) - { - while ((*R_EE_D9_CHCR & 0x100) != 0); - *R_EE_D9_QWC = 0; - *R_EE_D9_SADR = (u32)arg0 & ~0xf0000000; - *R_EE_D9_SADR = (u32)&s_DMAPack; - u32 *var2 = (u32 *)((u32)&s_DMAPack | 0x20000000); - u32 *var6; - do - { - var6 = var2; - u8 * var1 = var01->m_pSrc; - var5 -= 1; - var6[0] = 0x30000030; - var6[1] = (u32)var1; - var6[4] = 0x30000030; - var6[5] = (u32)var1 + arg3 * 0x180; - var01->m_pSrc = var00; - var00 += 4; - var2 = var6 + 2; // + 8 bytewise - var01 += 1; - } - while (var5 != 0); - var6[4] = 0x30; - var01 += 1; - var01->MC_Luma = (void *)0x0; - EE_SYNCL(); - *R_EE_D9_CHCR = 0x105; - } -} - -void _MPEG_put_block_fr(_MPEGMotions *a1) -{ - u8 *m_pMBDstY; - u8 *m_pSrc; - int count; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9; - - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - : [reg1] "=r"(reg1) - ); - m_pMBDstY = a1->m_pMBDstY; - m_pSrc = a1->m_pSrc; - count = 6; - __asm__ - ( - "psrlh %[reg1], %[reg1], 8\n" - : [reg1] "+r"(reg1) - ); - do - { - reg2 = ((u128 *)m_pSrc)[0]; - reg9 = ((u128 *)m_pSrc)[1]; - reg8 = ((u128 *)m_pSrc)[2]; - reg7 = ((u128 *)m_pSrc)[3]; - count -= 1; - reg3 = ((u128 *)m_pSrc)[4]; - reg4 = ((u128 *)m_pSrc)[5]; - reg5 = ((u128 *)m_pSrc)[6]; - reg6 = ((u128 *)m_pSrc)[7]; - m_pSrc += 128; - __asm__ - ( - "pmaxh %[reg2], $zero, %[reg2]\n" - "pmaxh %[reg9], $zero, %[reg9]\n" - "pmaxh %[reg8], $zero, %[reg8]\n" - "pmaxh %[reg7], $zero, %[reg7]\n" - "pmaxh %[reg3], $zero, %[reg3]\n" - "pmaxh %[reg4], $zero, %[reg4]\n" - "pmaxh %[reg5], $zero, %[reg5]\n" - "pmaxh %[reg6], $zero, %[reg6]\n" - "pminh %[reg2], %[reg1], %[reg2]\n" - "pminh %[reg9], %[reg1], %[reg9]\n" - "pminh %[reg8], %[reg1], %[reg8]\n" - "pminh %[reg7], %[reg1], %[reg7]\n" - "pminh %[reg3], %[reg1], %[reg3]\n" - "pminh %[reg4], %[reg1], %[reg4]\n" - "pminh %[reg5], %[reg1], %[reg5]\n" - "pminh %[reg6], %[reg1], %[reg6]\n" - "ppacb %[reg2], %[reg9], %[reg2]\n" - "ppacb %[reg8], %[reg7], %[reg8]\n" - "ppacb %[reg3], %[reg4], %[reg3]\n" - "ppacb %[reg5], %[reg6], %[reg5]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstY)[0] = reg2; - ((u128 *)m_pMBDstY)[1] = reg8; - ((u128 *)m_pMBDstY)[2] = reg3; - ((u128 *)m_pMBDstY)[3] = reg5; - m_pMBDstY += 64; - } - while ( count > 0 ); -} - -void _MPEG_put_block_fl(_MPEGMotions *a1) -{ - u8 *m_pMBDstY; - u8 *m_pSrc; - int count; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9; - - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - : [reg1] "=r"(reg1) - ); - m_pMBDstY = a1->m_pMBDstY; - m_pSrc = a1->m_pSrc; - count = 4; - __asm__ - ( - "psrlh %[reg1], %[reg1], 8\n" - : [reg1] "+r"(reg1) - ); - do - { - reg2 = ((u128 *)m_pSrc)[0x00]; - reg9 = ((u128 *)m_pSrc)[0x01]; - reg8 = ((u128 *)m_pSrc)[0x02]; - reg7 = ((u128 *)m_pSrc)[0x03]; - count -= 1; - reg3 = ((u128 *)m_pSrc)[0x10]; - reg4 = ((u128 *)m_pSrc)[0x11]; - reg5 = ((u128 *)m_pSrc)[0x12]; - reg6 = ((u128 *)m_pSrc)[0x13]; - m_pSrc += 64; - __asm__ - ( - "pmaxh %[reg2], $zero, %[reg2]\n" - "pmaxh %[reg9], $zero, %[reg9]\n" - "pmaxh %[reg8], $zero, %[reg8]\n" - "pmaxh %[reg7], $zero, %[reg7]\n" - "pmaxh %[reg3], $zero, %[reg3]\n" - "pmaxh %[reg4], $zero, %[reg4]\n" - "pmaxh %[reg5], $zero, %[reg5]\n" - "pmaxh %[reg6], $zero, %[reg6]\n" - "pminh %[reg2], %[reg1], %[reg2]\n" - "pminh %[reg9], %[reg1], %[reg9]\n" - "pminh %[reg8], %[reg1], %[reg8]\n" - "pminh %[reg7], %[reg1], %[reg7]\n" - "pminh %[reg3], %[reg1], %[reg3]\n" - "pminh %[reg4], %[reg1], %[reg4]\n" - "pminh %[reg5], %[reg1], %[reg5]\n" - "pminh %[reg6], %[reg1], %[reg6]\n" - "ppacb %[reg2], %[reg9], %[reg2]\n" - "ppacb %[reg8], %[reg7], %[reg8]\n" - "ppacb %[reg3], %[reg4], %[reg3]\n" - "ppacb %[reg5], %[reg6], %[reg5]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstY)[0] = reg2; - ((u128 *)m_pMBDstY)[1] = reg3; - ((u128 *)m_pMBDstY)[2] = reg8; - ((u128 *)m_pMBDstY)[3] = reg5; - m_pMBDstY += 64; - } - while ( count > 0 ); - count += 2; - do - { - reg2 = ((u128 *)m_pSrc)[0x10]; - reg9 = ((u128 *)m_pSrc)[0x11]; - reg8 = ((u128 *)m_pSrc)[0x12]; - reg7 = ((u128 *)m_pSrc)[0x13]; - count -= 1; - reg3 = ((u128 *)m_pSrc)[0x14]; - reg4 = ((u128 *)m_pSrc)[0x15]; - reg5 = ((u128 *)m_pSrc)[0x16]; - reg6 = ((u128 *)m_pSrc)[0x17]; - m_pSrc += 128; - __asm__ - ( - "pmaxh %[reg2], $zero, %[reg2]\n" - "pmaxh %[reg9], $zero, %[reg9]\n" - "pmaxh %[reg8], $zero, %[reg8]\n" - "pmaxh %[reg7], $zero, %[reg7]\n" - "pmaxh %[reg3], $zero, %[reg3]\n" - "pmaxh %[reg4], $zero, %[reg4]\n" - "pmaxh %[reg5], $zero, %[reg5]\n" - "pmaxh %[reg6], $zero, %[reg6]\n" - "pminh %[reg2], %[reg1], %[reg2]\n" - "pminh %[reg9], %[reg1], %[reg9]\n" - "pminh %[reg8], %[reg1], %[reg8]\n" - "pminh %[reg7], %[reg1], %[reg7]\n" - "pminh %[reg3], %[reg1], %[reg3]\n" - "pminh %[reg4], %[reg1], %[reg4]\n" - "pminh %[reg5], %[reg1], %[reg5]\n" - "pminh %[reg6], %[reg1], %[reg6]\n" - "ppacb %[reg2], %[reg9], %[reg2]\n" - "ppacb %[reg8], %[reg7], %[reg8]\n" - "ppacb %[reg3], %[reg4], %[reg3]\n" - "ppacb %[reg5], %[reg6], %[reg5]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstY)[0] = reg2; - ((u128 *)m_pMBDstY)[1] = reg8; - ((u128 *)m_pMBDstY)[2] = reg3; - ((u128 *)m_pMBDstY)[3] = reg5; - m_pMBDstY += 64; - } - while ( count > 0 ); -} - -void _MPEG_put_block_il(_MPEGMotions *a1) -{ - u8 *m_pMBDstY; - u8 *m_pSrc; - int count; - u8 *m_pMBDstCbCr; - u8 *v28; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9; - - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - : [reg1] "=r"(reg1) - ); - m_pMBDstY = a1->m_pMBDstY; - m_pSrc = a1->m_pSrc; - count = 4; - v28 = &m_pMBDstY[a1->m_Stride]; - __asm__ - ( - "psrlh %[reg1], %[reg1], 8\n" - : [reg1] "+r"(reg1) - ); - do - { - reg2 = ((u128 *)m_pSrc)[0x00]; - reg9 = ((u128 *)m_pSrc)[0x01]; - reg8 = ((u128 *)m_pSrc)[0x02]; - reg7 = ((u128 *)m_pSrc)[0x03]; - count -= 1; - reg3 = ((u128 *)m_pSrc)[0x10]; - reg4 = ((u128 *)m_pSrc)[0x11]; - reg5 = ((u128 *)m_pSrc)[0x12]; - reg6 = ((u128 *)m_pSrc)[0x13]; - m_pSrc += 64; - __asm__ - ( - "pmaxh %[reg2], $zero, %[reg2]\n" - "pmaxh %[reg9], $zero, %[reg9]\n" - "pmaxh %[reg8], $zero, %[reg8]\n" - "pmaxh %[reg7], $zero, %[reg7]\n" - "pmaxh %[reg3], $zero, %[reg3]\n" - "pmaxh %[reg4], $zero, %[reg4]\n" - "pmaxh %[reg5], $zero, %[reg5]\n" - "pmaxh %[reg6], $zero, %[reg6]\n" - "pminh %[reg2], %[reg1], %[reg2]\n" - "pminh %[reg9], %[reg1], %[reg9]\n" - "pminh %[reg8], %[reg1], %[reg8]\n" - "pminh %[reg7], %[reg1], %[reg7]\n" - "pminh %[reg3], %[reg1], %[reg3]\n" - "pminh %[reg4], %[reg1], %[reg4]\n" - "pminh %[reg5], %[reg1], %[reg5]\n" - "pminh %[reg6], %[reg1], %[reg6]\n" - "ppacb %[reg2], %[reg9], %[reg2]\n" - "ppacb %[reg8], %[reg7], %[reg8]\n" - "ppacb %[reg3], %[reg4], %[reg3]\n" - "ppacb %[reg5], %[reg6], %[reg5]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstY)[0x00] = reg2; - ((u128 *)m_pMBDstY)[0x02] = reg8; - m_pMBDstY += 64; - ((u128 *)v28)[0x00] = reg3; - ((u128 *)v28)[0x02] = reg5; - v28 += 64; - } - while ( count > 0 ); - m_pMBDstCbCr = a1->m_pMBDstCbCr; - count = 2; - v28 = &m_pMBDstCbCr[a1->m_Stride]; - do - { - reg2 = ((u128 *)m_pSrc)[0x10]; - reg9 = ((u128 *)m_pSrc)[0x11]; - reg8 = ((u128 *)m_pSrc)[0x12]; - reg7 = ((u128 *)m_pSrc)[0x13]; - count -= 1; - reg3 = ((u128 *)m_pSrc)[0x14]; - reg4 = ((u128 *)m_pSrc)[0x15]; - reg5 = ((u128 *)m_pSrc)[0x16]; - reg6 = ((u128 *)m_pSrc)[0x17]; - m_pSrc += 128; - __asm__ - ( - "pmaxh %[reg2], $zero, %[reg2]\n" - "pmaxh %[reg9], $zero, %[reg9]\n" - "pmaxh %[reg8], $zero, %[reg8]\n" - "pmaxh %[reg7], $zero, %[reg7]\n" - "pmaxh %[reg3], $zero, %[reg3]\n" - "pmaxh %[reg4], $zero, %[reg4]\n" - "pmaxh %[reg5], $zero, %[reg5]\n" - "pmaxh %[reg6], $zero, %[reg6]\n" - "pminh %[reg2], %[reg1], %[reg2]\n" - "pminh %[reg9], %[reg1], %[reg9]\n" - "pminh %[reg8], %[reg1], %[reg8]\n" - "pminh %[reg7], %[reg1], %[reg7]\n" - "pminh %[reg3], %[reg1], %[reg3]\n" - "pminh %[reg4], %[reg1], %[reg4]\n" - "pminh %[reg5], %[reg1], %[reg5]\n" - "pminh %[reg6], %[reg1], %[reg6]\n" - "ppacb %[reg2], $zero, %[reg2]\n" - "ppacb %[reg9], $zero, %[reg9]\n" - "ppacb %[reg8], $zero, %[reg8]\n" - "ppacb %[reg7], $zero, %[reg7]\n" - "ppacb %[reg3], $zero, %[reg3]\n" - "ppacb %[reg4], $zero, %[reg4]\n" - "ppacb %[reg5], $zero, %[reg5]\n" - "ppacb %[reg6], $zero, %[reg6]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u64 *)m_pMBDstCbCr)[0x00] = reg2; - ((u64 *)m_pMBDstCbCr)[0x02] = reg9; - ((u64 *)m_pMBDstCbCr)[0x04] = reg8; - ((u64 *)m_pMBDstCbCr)[0x06] = reg7; - ((u64 *)v28)[0x00] = reg3; - ((u64 *)v28)[0x02] = reg4; - ((u64 *)v28)[0x04] = reg5; - ((u64 *)v28)[0x06] = reg6; - m_pMBDstCbCr += 64; - v28 += 64; - } - while ( count > 0 ); -} - -void _MPEG_add_block_frfr(_MPEGMotions *a1) -{ - u8 *m_pMBDstY; - u8 *m_pSPRBlk; - u8 *m_pSPRRes; - int count; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9; - - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - : [reg1] "=r"(reg1) - ); - m_pMBDstY = a1->m_pMBDstY; - m_pSPRBlk = a1->m_pSPRBlk; - m_pSPRRes = a1->m_pSPRRes; - count = 6; - __asm__ - ( - "psrlh %[reg1], %[reg1], 8\n" - : [reg1] "+r"(reg1) - ); - do - { - reg2 = ((u128 *)m_pSPRBlk)[0x00]; - reg9 = ((u128 *)m_pSPRBlk)[0x01]; - reg8 = ((u128 *)m_pSPRBlk)[0x02]; - reg7 = ((u128 *)m_pSPRBlk)[0x03]; - count -= 1; - reg3 = ((u128 *)m_pSPRRes)[0x00]; - reg4 = ((u128 *)m_pSPRRes)[0x01]; - reg5 = ((u128 *)m_pSPRRes)[0x02]; - reg6 = ((u128 *)m_pSPRRes)[0x03]; - __asm__ - ( - "paddh %[reg2], %[reg2], %[reg3]\n" - "paddh %[reg9], %[reg9], %[reg4]\n" - "paddh %[reg8], %[reg8], %[reg5]\n" - "paddh %[reg7], %[reg7], %[reg6]\n" - "pmaxh %[reg2], $zero, %[reg2]\n" - "pmaxh %[reg9], $zero, %[reg9]\n" - "pmaxh %[reg8], $zero, %[reg8]\n" - "pmaxh %[reg7], $zero, %[reg7]\n" - "pminh %[reg2], %[reg1], %[reg2]\n" - "pminh %[reg9], %[reg1], %[reg9]\n" - "pminh %[reg8], %[reg1], %[reg8]\n" - "pminh %[reg7], %[reg1], %[reg7]\n" - "ppacb %[reg2], %[reg9], %[reg2]\n" - "ppacb %[reg8], %[reg7], %[reg8]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstY)[0x00] = reg2; - ((u128 *)m_pMBDstY)[0x01] = reg8; - reg3 = ((u128 *)m_pSPRBlk)[0x04]; - reg4 = ((u128 *)m_pSPRBlk)[0x05]; - reg5 = ((u128 *)m_pSPRBlk)[0x06]; - reg6 = ((u128 *)m_pSPRBlk)[0x07]; - m_pSPRBlk += 128; - reg2 = ((u128 *)m_pSPRRes)[0x04]; - reg9 = ((u128 *)m_pSPRRes)[0x05]; - reg8 = ((u128 *)m_pSPRRes)[0x06]; - reg7 = ((u128 *)m_pSPRRes)[0x07]; - m_pSPRRes += 128; - __asm__ - ( - "paddh %[reg3], %[reg3], %[reg2]\n" - "paddh %[reg4], %[reg4], %[reg9]\n" - "paddh %[reg5], %[reg5], %[reg8]\n" - "paddh %[reg6], %[reg6], %[reg7]\n" - "pmaxh %[reg3], $zero, %[reg3]\n" - "pmaxh %[reg4], $zero, %[reg4]\n" - "pmaxh %[reg5], $zero, %[reg5]\n" - "pmaxh %[reg6], $zero, %[reg6]\n" - "pminh %[reg3], %[reg1], %[reg3]\n" - "pminh %[reg4], %[reg1], %[reg4]\n" - "pminh %[reg5], %[reg1], %[reg5]\n" - "pminh %[reg6], %[reg1], %[reg6]\n" - "ppacb %[reg3], %[reg4], %[reg3]\n" - "ppacb %[reg5], %[reg6], %[reg5]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstY)[0x02] = reg3; - ((u128 *)m_pMBDstY)[0x03] = reg5; - m_pMBDstY += 64; - } - while ( count > 0 ); -} - -void _MPEG_add_block_ilfl(_MPEGMotions *a1) -{ - u8 *m_pMBDstY; - u8 *m_pSPRBlk; - u8 *m_pSPRRes; - int count; - u8 *v6; - u8 *m_pMBDstCbCr; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9; - - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - : [reg1] "=r"(reg1) - ); - m_pMBDstY = a1->m_pMBDstY; - m_pSPRBlk = a1->m_pSPRBlk; - m_pSPRRes = a1->m_pSPRRes; - count = 4; - __asm__ - ( - "psrlh %[reg1], %[reg1], 8\n" - : [reg1] "+r"(reg1) - ); - v6 = &m_pMBDstY[a1->m_Stride]; - do - { - reg2 = ((u128 *)m_pSPRBlk)[0x00]; - reg9 = ((u128 *)m_pSPRBlk)[0x01]; - reg8 = ((u128 *)m_pSPRBlk)[0x02]; - reg7 = ((u128 *)m_pSPRBlk)[0x03]; - count -= 1; - reg3 = ((u128 *)m_pSPRRes)[0x00]; - reg4 = ((u128 *)m_pSPRRes)[0x01]; - reg5 = ((u128 *)m_pSPRRes)[0x02]; - reg6 = ((u128 *)m_pSPRRes)[0x03]; - __asm__ - ( - "paddh %[reg2], %[reg2], %[reg3]\n" - "paddh %[reg9], %[reg9], %[reg4]\n" - "paddh %[reg8], %[reg8], %[reg5]\n" - "paddh %[reg7], %[reg7], %[reg6]\n" - "pmaxh %[reg2], $zero, %[reg2]\n" - "pmaxh %[reg9], $zero, %[reg9]\n" - "pmaxh %[reg8], $zero, %[reg8]\n" - "pmaxh %[reg7], $zero, %[reg7]\n" - "pminh %[reg2], %[reg1], %[reg2]\n" - "pminh %[reg9], %[reg1], %[reg9]\n" - "pminh %[reg8], %[reg1], %[reg8]\n" - "pminh %[reg7], %[reg1], %[reg7]\n" - "ppacb %[reg2], %[reg9], %[reg2]\n" - "ppacb %[reg8], %[reg7], %[reg8]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstY)[0] = reg2; - ((u128 *)m_pMBDstY)[2] = reg8; - reg3 = ((u128 *)m_pSPRBlk)[0x10]; - reg4 = ((u128 *)m_pSPRBlk)[0x11]; - reg5 = ((u128 *)m_pSPRBlk)[0x12]; - reg6 = ((u128 *)m_pSPRBlk)[0x13]; - m_pSPRBlk += 64; - reg2 = ((u128 *)m_pSPRRes)[0x10]; - reg9 = ((u128 *)m_pSPRRes)[0x11]; - reg8 = ((u128 *)m_pSPRRes)[0x12]; - reg7 = ((u128 *)m_pSPRRes)[0x13]; - __asm__ - ( - "paddh %[reg3], %[reg3], %[reg2]\n" - "paddh %[reg4], %[reg4], %[reg9]\n" - "paddh %[reg5], %[reg5], %[reg8]\n" - "paddh %[reg6], %[reg6], %[reg7]\n" - "pmaxh %[reg3], $zero, %[reg3]\n" - "pmaxh %[reg4], $zero, %[reg4]\n" - "pmaxh %[reg5], $zero, %[reg5]\n" - "pmaxh %[reg6], $zero, %[reg6]\n" - "pminh %[reg3], %[reg1], %[reg3]\n" - "pminh %[reg4], %[reg1], %[reg4]\n" - "pminh %[reg5], %[reg1], %[reg5]\n" - "pminh %[reg6], %[reg1], %[reg6]\n" - "ppacb %[reg3], %[reg4], %[reg3]\n" - "ppacb %[reg5], %[reg6], %[reg5]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)v6)[0x00] = reg3; - ((u128 *)v6)[0x02] = reg5; - v6 += 64; - m_pSPRRes += 64; - } - while ( count > 0 ); - m_pMBDstCbCr = a1->m_pMBDstCbCr; - count = 2; - v6 = &m_pMBDstCbCr[a1->m_Stride]; - do - { - reg2 = ((u128 *)m_pSPRBlk)[0x10]; - reg9 = ((u128 *)m_pSPRBlk)[0x11]; - reg8 = ((u128 *)m_pSPRBlk)[0x12]; - reg7 = ((u128 *)m_pSPRBlk)[0x13]; - count -= 1; - reg3 = ((u128 *)m_pSPRRes)[0x10]; - reg4 = ((u128 *)m_pSPRRes)[0x11]; - reg5 = ((u128 *)m_pSPRRes)[0x12]; - reg6 = ((u128 *)m_pSPRRes)[0x13]; - __asm__ - ( - "paddh %[reg2], %[reg2], %[reg3]\n" - "paddh %[reg9], %[reg9], %[reg4]\n" - "paddh %[reg8], %[reg8], %[reg5]\n" - "paddh %[reg7], %[reg7], %[reg6]\n" - "pmaxh %[reg2], $zero, %[reg2]\n" - "pmaxh %[reg9], $zero, %[reg9]\n" - "pmaxh %[reg8], $zero, %[reg8]\n" - "pmaxh %[reg7], $zero, %[reg7]\n" - "pminh %[reg2], %[reg1], %[reg2]\n" - "pminh %[reg9], %[reg1], %[reg9]\n" - "pminh %[reg8], %[reg1], %[reg8]\n" - "pminh %[reg7], %[reg1], %[reg7]\n" - "ppacb %[reg2], $zero, %[reg2]\n" - "ppacb %[reg9], $zero, %[reg9]\n" - "ppacb %[reg8], $zero, %[reg8]\n" - "ppacb %[reg7], $zero, %[reg7]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u64 *)m_pMBDstCbCr)[0] = reg2; - ((u64 *)m_pMBDstCbCr)[2] = reg9; - ((u64 *)m_pMBDstCbCr)[4] = reg8; - ((u64 *)m_pMBDstCbCr)[6] = reg7; - reg3 = ((u128 *)m_pSPRBlk)[0x14]; - reg4 = ((u128 *)m_pSPRBlk)[0x15]; - reg5 = ((u128 *)m_pSPRBlk)[0x16]; - reg6 = ((u128 *)m_pSPRBlk)[0x17]; - m_pSPRBlk += 128; - reg2 = ((u128 *)m_pSPRRes)[0x14]; - reg9 = ((u128 *)m_pSPRRes)[0x15]; - reg8 = ((u128 *)m_pSPRRes)[0x16]; - reg7 = ((u128 *)m_pSPRRes)[0x17]; - __asm__ - ( - "paddh %[reg3], %[reg3], %[reg2]\n" - "paddh %[reg4], %[reg4], %[reg9]\n" - "paddh %[reg5], %[reg5], %[reg8]\n" - "paddh %[reg6], %[reg6], %[reg7]\n" - "pmaxh %[reg3], $zero, %[reg3]\n" - "pmaxh %[reg4], $zero, %[reg4]\n" - "pmaxh %[reg5], $zero, %[reg5]\n" - "pmaxh %[reg6], $zero, %[reg6]\n" - "pminh %[reg3], %[reg1], %[reg3]\n" - "pminh %[reg4], %[reg1], %[reg4]\n" - "pminh %[reg5], %[reg1], %[reg5]\n" - "pminh %[reg6], %[reg1], %[reg6]\n" - "ppacb %[reg3], $zero, %[reg3]\n" - "ppacb %[reg4], $zero, %[reg4]\n" - "ppacb %[reg5], $zero, %[reg5]\n" - "ppacb %[reg6], $zero, %[reg6]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u64 *)v6)[0x00] = reg3; - ((u64 *)v6)[0x02] = reg4; - ((u64 *)v6)[0x04] = reg5; - ((u64 *)v6)[0x06] = reg6; - m_pMBDstCbCr += 64; - v6 += 64; - } - while ( count > 0 ); -} - -void _MPEG_add_block_frfl(_MPEGMotions *a1) -{ - u8 *m_pSPRBlk; - u8 *m_pSPRRes; - int count; - u8 *m_pMBDstCbCr; - u8 *m_pMBDstY; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9; - - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - : [reg1] "=r"(reg1) - ); - m_pSPRBlk = a1->m_pSPRBlk; - m_pSPRRes = a1->m_pSPRRes; - m_pMBDstY = a1->m_pMBDstY; - count = 4; - __asm__ - ( - "psrlh %[reg1], %[reg1], 8\n" - : [reg1] "+r"(reg1) - ); - do - { - reg2 = ((u128 *)m_pSPRBlk)[0x00]; - reg9 = ((u128 *)m_pSPRBlk)[0x01]; - reg8 = ((u128 *)m_pSPRBlk)[0x02]; - reg7 = ((u128 *)m_pSPRBlk)[0x03]; - count -= 1; - reg3 = ((u128 *)m_pSPRRes)[0x00]; - reg4 = ((u128 *)m_pSPRRes)[0x01]; - reg5 = ((u128 *)m_pSPRRes)[0x10]; - reg6 = ((u128 *)m_pSPRRes)[0x11]; - __asm__ - ( - "paddh %[reg2], %[reg2], %[reg3]\n" - "paddh %[reg9], %[reg9], %[reg4]\n" - "paddh %[reg8], %[reg8], %[reg5]\n" - "paddh %[reg7], %[reg7], %[reg6]\n" - "pmaxh %[reg2], $zero, %[reg2]\n" - "pmaxh %[reg9], $zero, %[reg9]\n" - "pmaxh %[reg8], $zero, %[reg8]\n" - "pmaxh %[reg7], $zero, %[reg7]\n" - "pminh %[reg2], %[reg1], %[reg2]\n" - "pminh %[reg9], %[reg1], %[reg9]\n" - "pminh %[reg8], %[reg1], %[reg8]\n" - "pminh %[reg7], %[reg1], %[reg7]\n" - "ppacb %[reg2], %[reg9], %[reg2]\n" - "ppacb %[reg8], %[reg7], %[reg8]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstY)[0x00] = reg2; - ((u128 *)m_pMBDstY)[0x01] = reg8; - reg3 = ((u128 *)m_pSPRBlk)[0x04]; - reg4 = ((u128 *)m_pSPRBlk)[0x05]; - reg5 = ((u128 *)m_pSPRBlk)[0x06]; - reg6 = ((u128 *)m_pSPRBlk)[0x07]; - m_pSPRBlk += 128; - reg2 = ((u128 *)m_pSPRRes)[0x02]; - reg9 = ((u128 *)m_pSPRRes)[0x03]; - reg8 = ((u128 *)m_pSPRRes)[0x12]; - reg7 = ((u128 *)m_pSPRRes)[0x13]; - __asm__ - ( - "paddh %[reg3], %[reg3], %[reg2]\n" - "paddh %[reg4], %[reg4], %[reg9]\n" - "paddh %[reg5], %[reg5], %[reg8]\n" - "paddh %[reg6], %[reg6], %[reg7]\n" - "pmaxh %[reg3], $zero, %[reg3]\n" - "pmaxh %[reg4], $zero, %[reg4]\n" - "pmaxh %[reg5], $zero, %[reg5]\n" - "pmaxh %[reg6], $zero, %[reg6]\n" - "pminh %[reg3], %[reg1], %[reg3]\n" - "pminh %[reg4], %[reg1], %[reg4]\n" - "pminh %[reg5], %[reg1], %[reg5]\n" - "pminh %[reg6], %[reg1], %[reg6]\n" - "ppacb %[reg3], %[reg4], %[reg3]\n" - "ppacb %[reg5], %[reg6], %[reg5]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstY)[0x02] = reg3; - ((u128 *)m_pMBDstY)[0x03] = reg5; - m_pSPRRes += 64; - m_pMBDstY += 64; - } - while ( count > 0 ); - m_pMBDstCbCr = a1->m_pMBDstCbCr; - count = 2; - do - { - reg2 = ((u128 *)m_pSPRBlk)[0x00]; - reg9 = ((u128 *)m_pSPRBlk)[0x01]; - reg8 = ((u128 *)m_pSPRBlk)[0x02]; - reg7 = ((u128 *)m_pSPRBlk)[0x03]; - count -= 1; - reg3 = ((u128 *)m_pSPRRes)[0x10]; - reg4 = ((u128 *)m_pSPRRes)[0x14]; - reg5 = ((u128 *)m_pSPRRes)[0x11]; - reg6 = ((u128 *)m_pSPRRes)[0x15]; - __asm__ - ( - "paddh %[reg2], %[reg2], %[reg3]\n" - "paddh %[reg9], %[reg9], %[reg4]\n" - "paddh %[reg8], %[reg8], %[reg5]\n" - "paddh %[reg7], %[reg7], %[reg6]\n" - "pmaxh %[reg2], $zero, %[reg2]\n" - "pmaxh %[reg9], $zero, %[reg9]\n" - "pmaxh %[reg8], $zero, %[reg8]\n" - "pmaxh %[reg7], $zero, %[reg7]\n" - "pminh %[reg2], %[reg1], %[reg2]\n" - "pminh %[reg9], %[reg1], %[reg9]\n" - "pminh %[reg8], %[reg1], %[reg8]\n" - "pminh %[reg7], %[reg1], %[reg7]\n" - "ppacb %[reg2], %[reg9], %[reg2]\n" - "ppacb %[reg8], %[reg7], %[reg8]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstCbCr)[0x00] = reg2; - ((u128 *)m_pMBDstCbCr)[0x01] = reg8; - reg3 = ((u128 *)m_pSPRBlk)[0x04]; - reg4 = ((u128 *)m_pSPRBlk)[0x05]; - reg5 = ((u128 *)m_pSPRBlk)[0x06]; - reg6 = ((u128 *)m_pSPRBlk)[0x07]; - m_pSPRBlk += 128; - reg2 = ((u128 *)m_pSPRRes)[0x12]; - reg9 = ((u128 *)m_pSPRRes)[0x16]; - reg8 = ((u128 *)m_pSPRRes)[0x13]; - reg7 = ((u128 *)m_pSPRRes)[0x17]; - __asm__ - ( - "paddh %[reg3], %[reg3], %[reg2]\n" - "paddh %[reg4], %[reg4], %[reg9]\n" - "paddh %[reg5], %[reg5], %[reg8]\n" - "paddh %[reg6], %[reg6], %[reg7]\n" - "pmaxh %[reg3], $zero, %[reg3]\n" - "pmaxh %[reg4], $zero, %[reg4]\n" - "pmaxh %[reg5], $zero, %[reg5]\n" - "pmaxh %[reg6], $zero, %[reg6]\n" - "pminh %[reg3], %[reg1], %[reg3]\n" - "pminh %[reg4], %[reg1], %[reg4]\n" - "pminh %[reg5], %[reg1], %[reg5]\n" - "pminh %[reg6], %[reg1], %[reg6]\n" - "ppacb %[reg3], %[reg4], %[reg3]\n" - "ppacb %[reg5], %[reg6], %[reg5]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pMBDstCbCr)[0x02] = reg3; - ((u128 *)m_pMBDstCbCr)[0x03] = reg5; - m_pMBDstCbCr += 64; - m_pSPRRes += 128; - } - while ( count > 0 ); -} - -// TODO: verify delay slots -void _MPEG_do_mc ( _MPEGMotion* arg0 ) -{ - int var0 = 16; // addiu $v0, $zero, 16 - u8* arg1 = arg0->m_pSrc; // lw $a1, 0($a0) - // addiu $sp, $sp, -16 - u16* arg2 = (u16 *)arg0->m_pDstY; // lw $a2, 4($a0) - int arg3 = arg0->m_X; // lw $a3, 12($a0) - int tmp0 = arg0->m_Y; // lw $t0, 16($a0) - int tmp1 = arg0->m_H; // lw $t1, 20($a0) - int tmp2 = arg0->m_fInt; // lw $t2, 24($a0) - int tmp4 = arg0->m_Field; // lw $t4, 28($a0) - // lw $t5, 32($a0) <-- MC_Luma - tmp0 -= tmp4; // subu $t0, $t0, $t4 - tmp4 <<= 4; // sll $t4, $t4, 4 - arg1 += tmp4; // addu $a1, $a1, $t4 - int var1 = var0 - tmp0; // subu $v1, $v0, $t0 - int tmp3 = var0 << tmp2; // sllv $t3, $v0, $t2 - var1 >>= tmp2; // srlv $v1, $v1, $t2 - int ta = tmp0 << 4; // sll $at, $t0, 4 - // sw $ra, 0($sp) - arg1 += ta; // addu $a1, $a1, $at - ta = tmp1 - var1; // subu $at, $t1, $v1 - arg0->MC_Luma(arg1, arg2, arg3, tmp3, var1, ta); // jalr $t5 - arg1 = arg0->m_pSrc; // lw $a1, 0($a0) - arg2 = (u16 *)arg0->m_pDstCbCr; // lw $a2, 8($a0) - // lw $t5, 36($a0) <-- MC_Chroma - arg1 += 256; // addiu $a1, $a1, 256 - tmp4 >>= 1; // srl $t4, $t4, 1 - arg3 >>= 1; // srl $a3, $a3, 1 - tmp0 >>= 1; // srl $t0, $t0, 1 - tmp1 >>= 1; // srl $t1, $t1, 1 - // lw $ra, 0($sp) - tmp0 >>= tmp2; // srlv $t0, $t0, $t2 - arg1 += tmp4; // addu $a1, $a1, $t4 - var0 = 8; // addiu $v0, $zero, 8 - tmp0 <<= tmp2; // sllv $t0, $t0, $t2 - var1 = var0 - tmp0; // subu $v1, $v0, $t0 - tmp3 = var0 << tmp2; // sllv $t3, $v0, $t2 - var1 >>= tmp2; // srlv $v1, $v1, $t2 - ta = tmp0 << 3; // sll $at, $t0, 3 - arg1 += ta; // addu $a1, $a1, $at - ta = tmp1 - var1; // subu $at, $t1, $v1 - arg0->MC_Chroma(arg1, arg2, arg3, tmp3, var1, ta); // jr $t5 - // addiu $sp, $sp, 16 -} - - -static inline void set_mtsab_to_value(int value) -{ - if (value == 1) - { - // XXX: mtsab difference? -#if 1 - __asm__ volatile - ( - "mtsab $zero, 1\n" - ); -#else - int tmp; - __asm__ volatile - ( - "addiu %[tmp], $zero, 1\n" - "mtsab %[tmp], 0\n" - : [tmp] "=r"(tmp) - ); -#endif - } - else - { - int tmp = value; - __asm__ volatile - ( - "mtsab %[tmp], 0\n" - : - : [tmp] "r"(tmp) - ); - } -} - -void _MPEG_put_luma(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstY; - u128 reg1, reg2; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstY = a2; - set_mtsab_to_value(a3); - do - { - do - { - reg1 = ((u128 *)m_pSrc)[0x00]; - reg2 = ((u128 *)m_pSrc)[0x18]; - m_pSrc += a4; - count -= 1; - __asm__ - ( - "qfsrv %[reg1], %[reg2], %[reg1]\n" - "pextlb %[reg2], $zero, %[reg1]\n" - "pextub %[reg1], $zero, %[reg1]\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2) - ); - ((u128 *)m_pDstY)[0x00] = reg2; - ((u128 *)m_pDstY)[0x01] = reg1; - } - while ( count > 0 ); - m_pDstY += 16; - count = count2; - m_pSrc += 512; - } - while ( count2 > 0 ); -} - -void _MPEG_put_chroma(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstCbCr; - u128 reg1, reg2, reg3, reg4; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstCbCr = a2; - set_mtsab_to_value(a3); - do - { - do - { - reg1 = ((u64 *)m_pSrc)[0x00]; - reg2 = ((u64 *)m_pSrc)[0x01]; - reg3 = ((u64 *)m_pSrc)[0x06]; - reg4 = ((u64 *)m_pSrc)[0x07]; - m_pSrc += a4; - count -= 1; - __asm__ - ( - "pcpyld %[reg1], %[reg3], %[reg1]\n" - "pcpyld %[reg2], %[reg4], %[reg2]\n" - "qfsrv %[reg1], %[reg1], %[reg1]\n" - "qfsrv %[reg2], %[reg2], %[reg2]\n" - "pextlb %[reg1], $zero, %[reg1]\n" - "pextlb %[reg2], $zero, %[reg2]\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2) - : [reg3] "r"(reg3), [reg4] "r"(reg4) - ); - ((u128 *)m_pDstCbCr)[0x00] = reg1; - ((u128 *)m_pDstCbCr)[0x08] = reg2; - } - while ( count > 0 ); - m_pDstCbCr += 8; - count = count2; - m_pSrc += 704; - } - while ( count2 > 0 ); -} - -void _MPEG_put_luma_X(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstY; - u128 reg1, reg2, reg3, reg4, reg5; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstY = a2; - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - "psrlh %[reg1], %[reg1], 0xF\n" - : [reg1] "=r"(reg1) - ); - do - { - do - { - reg2 = ((u128 *)m_pSrc)[0x00]; - reg3 = ((u128 *)m_pSrc)[0x18]; - set_mtsab_to_value(a3); - __asm__ - ( - "qfsrv %[reg4], %[reg3], %[reg2]\n" - "qfsrv %[reg5], %[reg2], %[reg3]\n" - "pextlb %[reg2], $zero, %[reg4]\n" - "pextub %[reg3], $zero, %[reg4]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "=r"(reg4), [reg5] "=r"(reg5) - ); - m_pSrc += a4; - set_mtsab_to_value(1); - count -= 1; - __asm__ - ( - "qfsrv %[reg5], %[reg5], %[reg4]\n" - "pextlb %[reg4], $zero, %[reg5]\n" - "pextub %[reg5], $zero, %[reg5]\n" - "paddh %[reg2], %[reg2], %[reg4]\n" - "paddh %[reg3], %[reg3], %[reg5]\n" - "paddh %[reg2], %[reg2], %[reg1]\n" - "paddh %[reg3], %[reg3], %[reg1]\n" - "psrlh %[reg2], %[reg2], 1\n" - "psrlh %[reg3], %[reg3], 1\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pDstY)[0x00] = reg2; - ((u128 *)m_pDstY)[0x01] = reg3; - } - while ( count > 0 ); - m_pDstY += 16; - count = count2; - m_pSrc += 512; - } - while ( count2 > 0 ); -} - -void _MPEG_put_chroma_X(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstCbCr; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstCbCr = a2; - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - "psrlh %[reg1], %[reg1], 0xF\n" - : [reg1] "=r"(reg1) - ); - do - { - do - { - reg2 = ((u64 *)m_pSrc)[0x00]; - reg3 = ((u64 *)m_pSrc)[0x01]; - reg4 = ((u64 *)m_pSrc)[0x06]; - reg5 = ((u64 *)m_pSrc)[0x07]; - __asm__ - ( - "pcpyld %[reg2], %[reg4], %[reg2]\n" - "pcpyld %[reg3], %[reg5], %[reg3]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5) - ); - set_mtsab_to_value(a3); - __asm__ - ( - "qfsrv %[reg2], %[reg2], %[reg2]\n" - "qfsrv %[reg3], %[reg3], %[reg3]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3) - ); - m_pSrc += a4; - count -= 1; - set_mtsab_to_value(1); - __asm__ - ( - "qfsrv %[reg7], %[reg2], %[reg2]\n" - "qfsrv %[reg6], %[reg3], %[reg3]\n" - "pextlb %[reg2], $zero, %[reg2]\n" - "pextlb %[reg3], $zero, %[reg3]\n" - "pextlb %[reg7], $zero, %[reg7]\n" - "pextlb %[reg6], $zero, %[reg6]\n" - "paddh %[reg2], %[reg2], %[reg7]\n" - "paddh %[reg3], %[reg3], %[reg6]\n" - "paddh %[reg2], %[reg2], %[reg1]\n" - "paddh %[reg3], %[reg3], %[reg1]\n" - "psrlh %[reg2], %[reg2], 1\n" - "psrlh %[reg3], %[reg3], 1\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg6] "=r"(reg6), [reg7] "=r"(reg7) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pDstCbCr)[0x00] = reg2; - ((u128 *)m_pDstCbCr)[0x08] = reg3; - } - while ( count > 0 ); - m_pDstCbCr += 8; - count = count2; - m_pSrc += 704; - } - while ( count2 > 0 ); -} - -void _MPEG_put_luma_Y(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstY; - u128 reg1, reg2, reg3, reg4, reg5, reg6; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstY = a2; - set_mtsab_to_value(a3); - reg5 = ((u128 *)m_pSrc)[0x00]; - reg6 = ((u128 *)m_pSrc)[0x18]; - m_pSrc = &m_pSrc[a4]; - count -= 1; - __asm__ - ( - "qfsrv %[reg5], %[reg6], %[reg5]\n" - "pextub %[reg6], $zero, %[reg5]\n" - "pextlb %[reg5], $zero, %[reg5]\n" - : [reg5] "+r"(reg5), [reg6] "+r"(reg6) - ); - if ( !count ) - goto LABEL_5; - count2 += 1; - do - { - do - { - reg3 = ((u128 *)m_pSrc)[0x00]; - reg4 = ((u128 *)m_pSrc)[0x18]; - m_pSrc += a4; - count -= 1; - __asm__ - ( - "qfsrv %[reg3], %[reg4], %[reg3]\n" - "pextub %[reg4], $zero, %[reg3]\n" - "pextlb %[reg3], $zero, %[reg3]\n" - "paddh %[reg2], %[reg4], %[reg6]\n" - "pnor %[reg6], $zero, $zero\n" - "paddh %[reg1], %[reg3], %[reg5]\n" - "psrlh %[reg6], %[reg6], 0xF\n" - "por %[reg5], $zero, %[reg3]\n" - "paddh %[reg1], %[reg1], %[reg6]\n" - "paddh %[reg2], %[reg2], %[reg6]\n" - "por %[reg6], $zero, %[reg4]\n" - "psrlh %[reg1], %[reg1], 1\n" - "psrlh %[reg2], %[reg2], 1\n" - : [reg1] "=r"(reg1), [reg2] "=r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6) - ); - ((u128 *)m_pDstY)[0x00] = reg1; - ((u128 *)m_pDstY)[0x01] = reg2; - } - while ( count > 0 ); - m_pDstY += 16; -LABEL_5: - count = count2; - m_pSrc += 512; - } - while ( count2 > 0 ); -} - -void _MPEG_put_chroma_Y(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstCbCr; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, regA; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstCbCr = a2; - set_mtsab_to_value(a3); - reg2 = ((u64 *)m_pSrc)[0x00]; - reg3 = ((u64 *)m_pSrc)[0x01]; - regA = ((u64 *)m_pSrc)[0x06]; - reg9 = ((u64 *)m_pSrc)[0x07]; - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - : [reg1] "=r"(reg1) - ); - m_pSrc = &m_pSrc[a4]; - count -= 1; - __asm__ - ( - "psrlh %[reg1], %[reg1], 0xF\n" - "pcpyld %[reg2], %[regA], %[reg2]\n" - "pcpyld %[reg3], %[reg9], %[reg3]\n" - "qfsrv %[reg2], %[reg2], %[reg2]\n" - "qfsrv %[reg3], %[reg3], %[reg3]\n" - "pextlb %[reg2], $zero, %[reg2]\n" - "pextlb %[reg3], $zero, %[reg3]\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg9] "+r"(reg9), [regA] "+r"(regA) - ); - if ( !count ) - goto LABEL_5; - count2 += 1; - do - { - do - { - reg4 = ((u64 *)m_pSrc)[0x00]; - reg5 = ((u64 *)m_pSrc)[0x01]; - reg6 = ((u64 *)m_pSrc)[0x06]; - reg7 = ((u64 *)m_pSrc)[0x07]; - m_pSrc += a4; - count -= 1; - __asm__ - ( - "pcpyld %[reg4], %[reg6], %[reg4]\n" - "pcpyld %[reg5], %[reg7], %[reg5]\n" - "qfsrv %[reg4], %[reg4], %[reg4]\n" - "qfsrv %[reg5], %[reg5], %[reg5]\n" - "pextlb %[reg4], $zero, %[reg4]\n" - "pextlb %[reg5], $zero, %[reg5]\n" - "paddh %[reg9], %[reg4], %[reg2]\n" - "paddh %[reg8], %[reg5], %[reg3]\n" - "por %[reg2], $zero, %[reg4]\n" - "por %[reg3], $zero, %[reg5]\n" - "paddh %[reg9], %[reg9], %[reg1]\n" - "paddh %[reg8], %[reg8], %[reg1]\n" - "psrlh %[reg9], %[reg9], 1\n" - "psrlh %[reg8], %[reg8], 1\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg8] "=r"(reg8), [reg9] "=r"(reg9) - : [reg1] "r"(reg1), [reg6] "r"(reg6), [reg7] "r"(reg7) - ); - ((u128 *)m_pDstCbCr)[0x00] = reg9; - ((u128 *)m_pDstCbCr)[0x08] = reg8; - } - while ( count > 0 ); - m_pDstCbCr += 8; -LABEL_5: - count = count2; - m_pSrc += 704; - } - while ( count2 > 0 ); -} - -void _MPEG_put_luma_XY(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstY; - u128 reg1, reg2, reg3, reg4, reg5, reg6; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstY = a2; - set_mtsab_to_value(a3); - reg2 = ((u128 *)m_pSrc)[0x00]; - reg5 = ((u128 *)m_pSrc)[0x18]; - m_pSrc = &m_pSrc[a4]; - __asm__ - ( - "qfsrv %[reg6], %[reg5], %[reg2]\n" - "qfsrv %[reg1], %[reg2], %[reg5]\n" - : [reg1] "=r"(reg1), [reg6] "=r"(reg6) - : [reg2] "r"(reg2), [reg5] "r"(reg5) - ); - count -= 1; - __asm__ - ( - "pextlb %[reg2], $zero, %[reg6]\n" - "pextub %[reg5], $zero, %[reg6]\n" - : [reg2] "+r"(reg2), [reg5] "+r"(reg5) - : [reg6] "r"(reg6) - ); - set_mtsab_to_value(1); - __asm__ - ( - "qfsrv %[reg1], %[reg1], %[reg6]\n" - "pextlb %[reg6], $zero, %[reg1]\n" - "pextub %[reg1], $zero, %[reg1]\n" - "paddh %[reg2], %[reg2], %[reg6]\n" - "paddh %[reg5], %[reg5], %[reg1]\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2), [reg5] "+r"(reg5), [reg6] "+r"(reg6) - ); - if ( !count ) - goto LABEL_5; - count2 += 1; - do - { - do - { - reg3 = ((u128 *)m_pSrc)[0x00]; - reg4 = ((u128 *)m_pSrc)[0x18]; - set_mtsab_to_value(a3); - m_pSrc += a4; - __asm__ - ( - "qfsrv %[reg6], %[reg4], %[reg3]\n" - "qfsrv %[reg1], %[reg3], %[reg4]\n" - : [reg1] "+r"(reg1), [reg6] "+r"(reg6) - : [reg3] "r"(reg3), [reg4] "r"(reg4) - ); - count -= 1; - __asm__ - ( - "pextlb %[reg3], $zero, %[reg6]\n" - "pextub %[reg4], $zero, %[reg6]\n" - : [reg3] "=r"(reg3), [reg4] "=r"(reg4) - : [reg6] "r"(reg6) - ); - set_mtsab_to_value(1); - __asm__ - ( - "qfsrv %[reg1], %[reg1], %[reg6]\n" - "pextlb %[reg6], $zero, %[reg1]\n" - "pextub %[reg1], $zero, %[reg1]\n" - "paddh %[reg3], %[reg3], %[reg6]\n" - "paddh %[reg4], %[reg4], %[reg1]\n" - "paddh %[reg6], %[reg2], %[reg3]\n" - "paddh %[reg1], %[reg5], %[reg4]\n" - "por %[reg2], $zero, %[reg3]\n" - "pnor %[reg3], $zero, $zero\n" - "por %[reg5], $zero, %[reg4]\n" - "psrlh %[reg3], %[reg3], 0xF\n" - "psllh %[reg3], %[reg3], 1\n" - "paddh %[reg6], %[reg6], %[reg3]\n" - "paddh %[reg1], %[reg1], %[reg3]\n" - "psrlh %[reg6], %[reg6], 2\n" - "psrlh %[reg1], %[reg1], 2\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6) - ); - ((u128 *)m_pDstY)[0x00] = reg6; - ((u128 *)m_pDstY)[0x01] = reg1; - } - while ( count > 0 ); - m_pDstY += 16; -LABEL_5: - count = count2; - m_pSrc += 512; - } - while ( count2 > 0 ); -} - -void _MPEG_put_chroma_XY(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstCbCr; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstCbCr = a2; - set_mtsab_to_value(a3); - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - : [reg1] "=r"(reg1) - ); - reg3 = ((u64 *)m_pSrc)[0x00]; - reg2 = ((u64 *)m_pSrc)[0x01]; - set_mtsab_to_value(1); - reg9 = ((u64 *)m_pSrc)[0x06]; - reg8 = ((u64 *)m_pSrc)[0x07]; - __asm__ - ( - "pcpyld %[reg3], %[reg9], %[reg3]\n" - "pcpyld %[reg2], %[reg8], %[reg2]\n" - "qfsrv %[reg3], %[reg3], %[reg3]\n" - "qfsrv %[reg2], %[reg2], %[reg2]\n" - "psrlh %[reg1], %[reg1], 0xF\n" - "psllh %[reg1], %[reg1], 1\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2), [reg3] "+r"(reg3) - : [reg8] "r"(reg8), [reg9] "r"(reg9) - ); - m_pSrc = &m_pSrc[a4]; - count -= 1; - __asm__ - ( - "qfsrv %[reg9], %[reg3], %[reg3]\n" - "qfsrv %[reg8], %[reg2], %[reg2]\n" - "pextlb %[reg3], $zero, %[reg3]\n" - "pextlb %[reg2], $zero, %[reg2]\n" - "pextlb %[reg9], $zero, %[reg9]\n" - "pextlb %[reg8], $zero, %[reg8]\n" - "paddh %[reg3], %[reg3], %[reg9]\n" - "paddh %[reg9], %[reg2], %[reg8]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - ); - if ( !count ) - goto LABEL_5; - count2 += 1; - do - { - do - { - reg4 = ((u64 *)m_pSrc)[0x00]; - reg6 = ((u64 *)m_pSrc)[0x01]; - set_mtsab_to_value(a3); - reg5 = ((u64 *)m_pSrc)[0x06]; - reg7 = ((u64 *)m_pSrc)[0x07]; - __asm__ - ( - "pcpyld %[reg4], %[reg5], %[reg4]\n" - "pcpyld %[reg6], %[reg7], %[reg6]\n" - "qfsrv %[reg4], %[reg4], %[reg4]\n" - "qfsrv %[reg6], %[reg6], %[reg6]\n" - : [reg4] "+r"(reg4), [reg6] "+r"(reg6) - : [reg5] "r"(reg5), [reg7] "r"(reg7) - ); - m_pSrc += a4; - count -= 1; - set_mtsab_to_value(1); - __asm__ - ( - "qfsrv %[reg5], %[reg4], %[reg4]\n" - "qfsrv %[reg7], %[reg6], %[reg6]\n" - "pextlb %[reg4], $zero, %[reg4]\n" - "pextlb %[reg6], $zero, %[reg6]\n" - "pextlb %[reg5], $zero, %[reg5]\n" - "pextlb %[reg7], $zero, %[reg7]\n" - "paddh %[reg4], %[reg4], %[reg5]\n" - "paddh %[reg5], %[reg6], %[reg7]\n" - "paddh %[reg6], %[reg3], %[reg4]\n" - "paddh %[reg7], %[reg9], %[reg5]\n" - "por %[reg3], $zero, %[reg4]\n" - "por %[reg9], $zero, %[reg5]\n" - "paddh %[reg6], %[reg6], %[reg1]\n" - "paddh %[reg7], %[reg7], %[reg1]\n" - "psrlh %[reg6], %[reg6], 2\n" - "psrlh %[reg7], %[reg7], 2\n" - : [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - ((u128 *)m_pDstCbCr)[0x00] = reg6; - ((u128 *)m_pDstCbCr)[0x08] = reg7; - } - while ( count > 0 ); - m_pDstCbCr += 8; -LABEL_5: - count = count2; - m_pSrc += 704; - } - while ( count2 > 0 ); -} - -void _MPEG_avg_luma(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstY; - u128 reg1, reg2, reg3, reg4, reg5, reg6; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstY = a2; - set_mtsab_to_value(a3); - do - { - do - { - reg3 = ((u128 *)m_pSrc)[0x00]; - reg4 = ((u128 *)m_pSrc)[0x18]; - m_pSrc += a4; - count -= 1; - __asm__ - ( - "qfsrv %[reg3], %[reg4], %[reg3]\n" - "pextlb %[reg4], $zero, %[reg3]\n" - "pextub %[reg3], $zero, %[reg3]\n" - : [reg3] "+r"(reg3), [reg4] "+r"(reg4) - ); - reg6 = ((u128 *)m_pDstY)[0x00]; - reg1 = ((u128 *)m_pDstY)[0x01]; - __asm__ - ( - "paddh %[reg4], %[reg4], %[reg6]\n" - "paddh %[reg3], %[reg3], %[reg1]\n" - "pcgth %[reg6], %[reg4], $zero\n" - "pcgth %[reg1], %[reg3], $zero\n" - "pceqh %[reg2], %[reg4], $zero\n" - "pceqh %[reg5], %[reg3], $zero\n" - "psrlh %[reg6], %[reg6], 0xF\n" - "psrlh %[reg1], %[reg1], 0xF\n" - "psrlh %[reg2], %[reg2], 0xF\n" - "psrlh %[reg5], %[reg5], 0xF\n" - "por %[reg6], %[reg6], %[reg2]\n" - "por %[reg1], %[reg1], %[reg5]\n" - "paddh %[reg4], %[reg4], %[reg6]\n" - "paddh %[reg3], %[reg3], %[reg1]\n" - "psrlh %[reg4], %[reg4], 1\n" - "psrlh %[reg3], %[reg3], 1\n" - : [reg1] "+r"(reg1), [reg2] "=r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "=r"(reg5), [reg6] "+r"(reg6) - ); - ((u128 *)m_pDstY)[0x00] = reg4; - ((u128 *)m_pDstY)[0x01] = reg3; - } - while ( count > 0 ); - m_pDstY += 16; - count = count2; - m_pSrc += 512; - } - while ( count2 > 0 ); -} - -void _MPEG_avg_chroma(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstCbCr; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstCbCr = a2; - set_mtsab_to_value(a3); - do - { - do - { - reg3 = ((u64 *)m_pSrc)[0x00]; - reg4 = ((u64 *)m_pSrc)[0x01]; - count -= 1; - reg5 = ((u64 *)m_pSrc)[0x06]; - reg6 = ((u64 *)m_pSrc)[0x07]; - m_pSrc += a4; - __asm__ - ( - "pcpyld %[reg3], %[reg5], %[reg3]\n" - "pcpyld %[reg4], %[reg6], %[reg4]\n" - "qfsrv %[reg3], %[reg3], %[reg3]\n" - "qfsrv %[reg4], %[reg4], %[reg4]\n" - "pextlb %[reg3], $zero, %[reg3]\n" - "pextlb %[reg4], $zero, %[reg4]\n" - : [reg3] "+r"(reg3), [reg4] "+r"(reg4) - : [reg5] "r"(reg5), [reg6] "r"(reg6) - ); - reg8 = ((u128 *)m_pDstCbCr)[0x00]; - reg7 = ((u128 *)m_pDstCbCr)[0x08]; - __asm__ - ( - "paddh %[reg3], %[reg3], %[reg8]\n" - "paddh %[reg4], %[reg4], %[reg7]\n" - "pcgth %[reg8], %[reg3], $zero\n" - "pcgth %[reg7], %[reg4], $zero\n" - "pceqh %[reg2], %[reg3], $zero\n" - "pceqh %[reg1], %[reg4], $zero\n" - "psrlh %[reg8], %[reg8], 0xF\n" - "psrlh %[reg7], %[reg7], 0xF\n" - "psrlh %[reg2], %[reg2], 0xF\n" - "psrlh %[reg1], %[reg1], 0xF\n" - "por %[reg8], %[reg8], %[reg2]\n" - "por %[reg7], %[reg7], %[reg1]\n" - "paddh %[reg3], %[reg3], %[reg8]\n" - "paddh %[reg4], %[reg4], %[reg7]\n" - "psrlh %[reg3], %[reg3], 1\n" - "psrlh %[reg4], %[reg4], 1\n" - : [reg1] "=r"(reg1), [reg2] "=r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg7] "+r"(reg7), [reg8] "+r"(reg8) - ); - ((u128 *)m_pDstCbCr)[0x00] = reg4; - ((u128 *)m_pDstCbCr)[0x08] = reg3; - } - while ( count > 0 ); - m_pDstCbCr += 8; - count = count2; - m_pSrc += 704; - } - while ( count2 > 0 ); -} - -void _MPEG_avg_luma_X(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstY; - u128 reg1, reg2, reg3, reg4, reg5, reg6; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstY = a2; - __asm__ - ( - "pnor %[reg2], $zero, $zero\n" - "psrlh %[reg2], %[reg2], 0xF\n" - : [reg2] "=r"(reg2) - ); - do - { - do - { - reg3 = ((u128 *)m_pSrc)[0x00]; - reg4 = ((u128 *)m_pSrc)[0x18]; - set_mtsab_to_value(a3); - __asm__ - ( - "qfsrv %[reg5], %[reg4], %[reg3]\n" - "qfsrv %[reg6], %[reg3], %[reg4]\n" - "pextlb %[reg3], $zero, %[reg5]\n" - "pextub %[reg4], $zero, %[reg5]\n" - : [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "=r"(reg5), [reg6] "=r"(reg6) - ); - m_pSrc += a4; - set_mtsab_to_value(1); - count -= 1; - __asm__ - ( - "qfsrv %[reg6], %[reg6], %[reg5]\n" - "pextlb %[reg5], $zero, %[reg6]\n" - "pextub %[reg6], $zero, %[reg6]\n" - "paddh %[reg3], %[reg3], %[reg5]\n" - "paddh %[reg4], %[reg4], %[reg6]\n" - "paddh %[reg3], %[reg3], %[reg2]\n" - "paddh %[reg4], %[reg4], %[reg2]\n" - "psrlh %[reg3], %[reg3], 1\n" - "psrlh %[reg4], %[reg4], 1\n" - : [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6) - : [reg2] "r"(reg2) - ); - reg6 = ((u128 *)m_pDstY)[0x00]; - reg1 = ((u128 *)m_pDstY)[0x01]; - __asm__ - ( - "paddh %[reg3], %[reg3], %[reg6]\n" - "paddh %[reg4], %[reg4], %[reg1]\n" - "pcgth %[reg6], %[reg3], $zero\n" - "pceqh %[reg1], %[reg3], $zero\n" - "psrlh %[reg6], %[reg6], 0xF\n" - "psrlh %[reg1], %[reg1], 0xF\n" - "por %[reg6], %[reg6], %[reg1]\n" - "paddh %[reg3], %[reg3], %[reg6]\n" - "pcgth %[reg6], %[reg4], $zero\n" - "pceqh %[reg1], %[reg4], $zero\n" - "psrlh %[reg6], %[reg6], 0xF\n" - "psrlh %[reg1], %[reg1], 0xF\n" - "por %[reg6], %[reg6], %[reg1]\n" - "paddh %[reg4], %[reg4], %[reg6]\n" - "psrlh %[reg3], %[reg3], 1\n" - "psrlh %[reg4], %[reg4], 1\n" - : [reg1] "+r"(reg1), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg6] "+r"(reg6) - ); - ((u128 *)m_pDstY)[0x00] = reg3; - ((u128 *)m_pDstY)[0x01] = reg4; - } - while ( count > 0 ); - m_pDstY += 16; - count = count2; - m_pSrc += 512; - } - while ( count2 > 0 ); -} - -void _MPEG_avg_chroma_X(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstCbCr; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstCbCr = a2; - __asm__ - ( - "pnor %[reg2], $zero, $zero\n" - "psrlh %[reg2], %[reg2], 0xF\n" - : [reg2] "=r"(reg2) - ); - do - { - do - { - reg4 = ((u64 *)m_pSrc)[0x00]; - reg5 = ((u64 *)m_pSrc)[0x01]; - set_mtsab_to_value(a3); - reg6 = ((u64 *)m_pSrc)[0x06]; - reg7 = ((u64 *)m_pSrc)[0x07]; - __asm__ - ( - "pcpyld %[reg4], %[reg6], %[reg4]\n" - "pcpyld %[reg5], %[reg7], %[reg5]\n" - "qfsrv %[reg4], %[reg4], %[reg4]\n" - "qfsrv %[reg5], %[reg5], %[reg5]\n" - : [reg4] "+r"(reg4), [reg5] "+r"(reg5) - : [reg6] "r"(reg6), [reg7] "r"(reg7) - ); - m_pSrc += a4; - count -= 1; - set_mtsab_to_value(1); - __asm__ - ( - "qfsrv %[reg9], %[reg4], %[reg4]\n" - "qfsrv %[reg8], %[reg5], %[reg5]\n" - "pextlb %[reg4], $zero, %[reg4]\n" - "pextlb %[reg5], $zero, %[reg5]\n" - "pextlb %[reg9], $zero, %[reg9]\n" - "pextlb %[reg8], $zero, %[reg8]\n" - "paddh %[reg4], %[reg4], %[reg9]\n" - "paddh %[reg5], %[reg5], %[reg8]\n" - "paddh %[reg4], %[reg4], %[reg2]\n" - "paddh %[reg5], %[reg5], %[reg2]\n" - "psrlh %[reg4], %[reg4], 1\n" - "psrlh %[reg5], %[reg5], 1\n" - : [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg8] "=r"(reg8), [reg9] "=r"(reg9) - : [reg2] "r"(reg2) - ); - reg9 = ((u128 *)m_pDstCbCr)[0x00]; - reg8 = ((u128 *)m_pDstCbCr)[0x08]; - __asm__ - ( - "paddh %[reg4], %[reg4], %[reg9]\n" - "paddh %[reg5], %[reg5], %[reg8]\n" - "pcgth %[reg9], %[reg4], $zero\n" - "pcgth %[reg8], %[reg5], $zero\n" - "pceqh %[reg1], %[reg4], $zero\n" - "pceqh %[reg3], %[reg5], $zero\n" - "psrlh %[reg9], %[reg9], 0xF\n" - "psrlh %[reg8], %[reg8], 0xF\n" - "psrlh %[reg1], %[reg1], 0xF\n" - "psrlh %[reg3], %[reg3], 0xF\n" - "por %[reg9], %[reg9], %[reg1]\n" - "por %[reg8], %[reg8], %[reg3]\n" - "paddh %[reg4], %[reg4], %[reg9]\n" - "paddh %[reg5], %[reg5], %[reg8]\n" - "psrlh %[reg4], %[reg4], 1\n" - "psrlh %[reg5], %[reg5], 1\n" - : [reg1] "=r"(reg1), [reg3] "=r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - ); - ((u128 *)m_pDstCbCr)[0x00] = reg4; - ((u128 *)m_pDstCbCr)[0x08] = reg5; - } - while ( count > 0 ); - m_pDstCbCr += 8; - count = count2; - m_pSrc += 704; - } - while ( count2 > 0 ); -} - -void _MPEG_avg_luma_Y(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstY; - u128 reg1, reg2, reg3, reg4, reg5, reg6; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstY = a2; - set_mtsab_to_value(a3); - reg5 = ((u128 *)m_pSrc)[0x00]; - reg6 = ((u128 *)m_pSrc)[0x18]; - m_pSrc = &m_pSrc[a4]; - count -= 1; - __asm__ - ( - "qfsrv %[reg5], %[reg6], %[reg5]\n" - "pextub %[reg6], $zero, %[reg5]\n" - "pextlb %[reg5], $zero, %[reg5]\n" - : [reg5] "+r"(reg5), [reg6] "+r"(reg6) - ); - if ( !count ) - goto LABEL_5; - count2 += 1; - do - { - do - { - reg3 = ((u128 *)m_pSrc)[0x00]; - reg4 = ((u128 *)m_pSrc)[0x18]; - m_pSrc += a4; - count -= 1; - __asm__ - ( - "qfsrv %[reg3], %[reg4], %[reg3]\n" - "pextub %[reg4], $zero, %[reg3]\n" - "pextlb %[reg3], $zero, %[reg3]\n" - "paddh %[reg2], %[reg4], %[reg6]\n" - "pnor %[reg6], $zero, $zero\n" - "paddh %[reg1], %[reg3], %[reg5]\n" - "psrlh %[reg6], %[reg6], 0xF\n" - "por %[reg5], $zero, %[reg3]\n" - "paddh %[reg1], %[reg1], %[reg6]\n" - "paddh %[reg2], %[reg2], %[reg6]\n" - "por %[reg6], $zero, %[reg4]\n" - "psrlh %[reg1], %[reg1], 1\n" - "psrlh %[reg2], %[reg2], 1\n" - : [reg1] "=r"(reg1), [reg2] "=r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6) - ); - reg3 = ((u128 *)m_pDstY)[0x00]; - reg4 = ((u128 *)m_pDstY)[0x01]; - __asm__ - ( - "paddh %[reg1], %[reg1], %[reg3]\n" - "paddh %[reg2], %[reg2], %[reg4]\n" - "pcgth %[reg3], %[reg1], $zero\n" - "pceqh %[reg4], %[reg1], $zero\n" - "psrlh %[reg3], %[reg3], 0xF\n" - "psrlh %[reg4], %[reg4], 0xF\n" - "por %[reg3], %[reg3], %[reg4]\n" - "paddh %[reg1], %[reg1], %[reg3]\n" - "pcgth %[reg3], %[reg2], $zero\n" - "pceqh %[reg4], %[reg2], $zero\n" - "psrlh %[reg3], %[reg3], 0xF\n" - "psrlh %[reg4], %[reg4], 0xF\n" - "por %[reg3], %[reg3], %[reg4]\n" - "paddh %[reg2], %[reg2], %[reg3]\n" - "psrlh %[reg1], %[reg1], 1\n" - "psrlh %[reg2], %[reg2], 1\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4) - ); - ((u128 *)m_pDstY)[0x00] = reg1; - ((u128 *)m_pDstY)[0x01] = reg2; - } - while ( count > 0 ); - m_pDstY += 16; -LABEL_5: - count = count2; - m_pSrc += 512; - } - while ( count2 > 0 ); -} - -void _MPEG_avg_chroma_Y(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstCbCr; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9, regA; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstCbCr = a2; - set_mtsab_to_value(a3); - reg2 = ((u64 *)m_pSrc)[0x00]; - reg3 = ((u64 *)m_pSrc)[0x01]; - regA = ((u64 *)m_pSrc)[0x06]; - reg9 = ((u64 *)m_pSrc)[0x07]; - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - : [reg1] "=r"(reg1) - ); - m_pSrc = &m_pSrc[a4]; - count -= 1; - __asm__ - ( - "psrlh %[reg1], %[reg1], 0xF\n" - "pcpyld %[reg2], %[regA], %[reg2]\n" - "pcpyld %[reg3], %[reg9], %[reg3]\n" - "qfsrv %[reg2], %[reg2], %[reg2]\n" - "qfsrv %[reg3], %[reg3], %[reg3]\n" - "pextlb %[reg2], $zero, %[reg2]\n" - "pextlb %[reg3], $zero, %[reg3]\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2), [reg3] "+r"(reg3) - : [reg9] "r"(reg9), [regA] "r"(regA) - ); - if ( !count ) - goto LABEL_5; - count2 += 1; - do - { - do - { - reg4 = ((u64 *)m_pSrc)[0x00]; - reg5 = ((u64 *)m_pSrc)[0x01]; - count -= 1; - reg6 = ((u64 *)m_pSrc)[0x06]; - reg7 = ((u64 *)m_pSrc)[0x07]; - m_pSrc += a4; - __asm__ - ( - "pcpyld %[reg4], %[reg6], %[reg4]\n" - "pcpyld %[reg5], %[reg7], %[reg5]\n" - "qfsrv %[reg4], %[reg4], %[reg4]\n" - "qfsrv %[reg5], %[reg5], %[reg5]\n" - "pextlb %[reg4], $zero, %[reg4]\n" - "pextlb %[reg5], $zero, %[reg5]\n" - "paddh %[reg9], %[reg4], %[reg2]\n" - "paddh %[reg8], %[reg5], %[reg3]\n" - "por %[reg2], $zero, %[reg4]\n" - "por %[reg3], $zero, %[reg5]\n" - "paddh %[reg9], %[reg9], %[reg1]\n" - "paddh %[reg8], %[reg8], %[reg1]\n" - "psrlh %[reg9], %[reg9], 1\n" - "psrlh %[reg8], %[reg8], 1\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg8] "=r"(reg8), [reg9] "=r"(reg9) - : [reg1] "r"(reg1), [reg6] "r"(reg6), [reg7] "r"(reg7) - ); - reg4 = ((u128 *)m_pDstCbCr)[0x00]; - reg5 = ((u128 *)m_pDstCbCr)[0x80]; - __asm__ - ( - "paddh %[reg9], %[reg9], %[reg4]\n" - "paddh %[reg8], %[reg8], %[reg5]\n" - "pcgth %[reg4], %[reg9], $zero\n" - "pceqh %[reg5], %[reg9], $zero\n" - "psrlh %[reg4], %[reg4], 0xF\n" - "psrlh %[reg5], %[reg5], 0xF\n" - "por %[reg4], %[reg4], %[reg5]\n" - "paddh %[reg9], %[reg9], %[reg4]\n" - "pcgth %[reg4], %[reg8], $zero\n" - "pceqh %[reg5], %[reg8], $zero\n" - "psrlh %[reg4], %[reg4], 0xF\n" - "psrlh %[reg5], %[reg5], 0xF\n" - "por %[reg4], %[reg4], %[reg5]\n" - "paddh %[reg8], %[reg8], %[reg4]\n" - "psrlh %[reg9], %[reg9], 1\n" - "psrlh %[reg8], %[reg8], 1\n" - : [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg8] "+r"(reg8), [reg9] "+r"(reg9) - ); - ((u128 *)m_pDstCbCr)[0x00] = reg9; - ((u128 *)m_pDstCbCr)[0x08] = reg8; - } - while ( count > 0 ); - m_pDstCbCr += 8; -LABEL_5: - count = count2; - m_pSrc += 704; - } - while ( count2 > 0 ); -} - -void _MPEG_avg_luma_XY(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstY; - u128 reg1, reg2, reg3, reg4, reg5, reg6; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstY = a2; - set_mtsab_to_value(a3); - reg2 = ((u128 *)m_pSrc)[0x00]; - reg5 = ((u128 *)m_pSrc)[0x18]; - m_pSrc = &m_pSrc[a4]; - __asm__ - ( - "qfsrv %[reg6], %[reg5], %[reg2]\n" - "qfsrv %[reg1], %[reg2], %[reg5]\n" - : [reg1] "=r"(reg1), [reg6] "=r"(reg6) - : [reg2] "r"(reg2), [reg5] "r"(reg5) - ); - count -= 1; - __asm__ - ( - "pextlb %[reg2], $zero, %[reg6]\n" - "pextub %[reg5], $zero, %[reg6]\n" - : [reg2] "+r"(reg2), [reg5] "+r"(reg5) - : [reg6] "r"(reg6) - ); - set_mtsab_to_value(1); - __asm__ - ( - "qfsrv %[reg1], %[reg1], %[reg6]\n" - "pextlb %[reg6], $zero, %[reg1]\n" - "pextub %[reg1], $zero, %[reg1]\n" - "paddh %[reg2], %[reg2], %[reg6]\n" - "paddh %[reg5], %[reg5], %[reg1]\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2), [reg5] "+r"(reg5), [reg6] "+r"(reg6) - ); - if ( !count ) - goto LABEL_5; - count2 += 1; - do - { - do - { - reg3 = ((u128 *)m_pSrc)[0x00]; - reg4 = ((u128 *)m_pSrc)[0x18]; - set_mtsab_to_value(a3); - m_pSrc += a4; - __asm__ - ( - "qfsrv %[reg6], %[reg4], %[reg3]\n" - "qfsrv %[reg1], %[reg3], %[reg4]\n" - : [reg1] "=r"(reg1), [reg6] "=r"(reg6) - : [reg3] "r"(reg3), [reg4] "r"(reg4) - ); - count -= 1; - __asm__ - ( - "pextlb %[reg3], $zero, %[reg6]\n" - "pextub %[reg4], $zero, %[reg6]\n" - : [reg3] "=r"(reg3), [reg4] "=r"(reg4) - : [reg6] "r"(reg6) - ); - set_mtsab_to_value(1); - __asm__ - ( - "qfsrv %[reg1], %[reg1], %[reg6]\n" - "pextlb %[reg6], $zero, %[reg1]\n" - "pextub %[reg1], $zero, %[reg1]\n" - "paddh %[reg3], %[reg3], %[reg6]\n" - "paddh %[reg4], %[reg4], %[reg1]\n" - "paddh %[reg6], %[reg2], %[reg3]\n" - "paddh %[reg1], %[reg5], %[reg4]\n" - "por %[reg2], $zero, %[reg3]\n" - "pnor %[reg3], $zero, $zero\n" - "por %[reg5], $zero, %[reg4]\n" - "psrlh %[reg3], %[reg3], 0xF\n" - "psllh %[reg3], %[reg3], 1\n" - "paddh %[reg6], %[reg6], %[reg3]\n" - "paddh %[reg1], %[reg1], %[reg3]\n" - "psrlh %[reg6], %[reg6], 2\n" - "psrlh %[reg1], %[reg1], 2\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6) - ); - reg3 = ((u128 *)m_pDstY)[0x00]; - reg4 = ((u128 *)m_pDstY)[0x01]; - __asm__ - ( - "paddh %[reg6], %[reg6], %[reg3]\n" - "paddh %[reg1], %[reg1], %[reg4]\n" - "pcgth %[reg3], %[reg6], $zero\n" - "pceqh %[reg4], %[reg6], $zero\n" - "psrlh %[reg3], %[reg3], 0xF\n" - "psrlh %[reg4], %[reg4], 0xF\n" - "por %[reg3], %[reg3], %[reg4]\n" - "paddh %[reg6], %[reg6], %[reg3]\n" - "pcgth %[reg3], %[reg1], $zero\n" - "pceqh %[reg4], %[reg1], $zero\n" - "psrlh %[reg3], %[reg3], 0xF\n" - "psrlh %[reg4], %[reg4], 0xF\n" - "por %[reg3], %[reg3], %[reg4]\n" - "paddh %[reg1], %[reg1], %[reg3]\n" - "psrlh %[reg6], %[reg6], 1\n" - "psrlh %[reg1], %[reg1], 1\n" - : [reg1] "+r"(reg1), [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg6] "+r"(reg6) - ); - ((u128 *)m_pDstY)[0x00] = reg6; - ((u128 *)m_pDstY)[0x01] = reg1; - } - while ( count > 0 ); - m_pDstY += 16; -LABEL_5: - count = count2; - m_pSrc += 512; - } - while ( count2 > 0 ); -} - -void _MPEG_avg_chroma_XY(u8 *a1, u16 *a2, int a3, int a4, int var1, int ta) -{ - int count; - int count2; - u8 *m_pSrc; - u16 *m_pDstCbCr; - u128 reg1, reg2, reg3, reg4, reg5, reg6, reg7, reg8, reg9; - - count = var1; - count2 = ta; - m_pSrc = a1; - m_pDstCbCr = a2; - set_mtsab_to_value(a3); - __asm__ - ( - "pnor %[reg1], $zero, $zero\n" - : [reg1] "=r"(reg1) - ); - reg3 = ((u64 *)m_pSrc)[0x00]; - reg2 = ((u64 *)m_pSrc)[0x01]; - set_mtsab_to_value(1); - reg9 = ((u64 *)m_pSrc)[0x06]; - reg8 = ((u64 *)m_pSrc)[0x07]; - __asm__ - ( - "pcpyld %[reg3], %[reg9], %[reg3]\n" - "pcpyld %[reg2], %[reg8], %[reg2]\n" - "qfsrv %[reg3], %[reg3], %[reg3]\n" - "qfsrv %[reg2], %[reg2], %[reg2]\n" - "psrlh %[reg1], %[reg1], 0xF\n" - "psllh %[reg1], %[reg1], 1\n" - : [reg1] "+r"(reg1), [reg2] "+r"(reg2), [reg3] "+r"(reg3) - : [reg8] "r"(reg8), [reg9] "r"(reg9) - ); - m_pSrc = &m_pSrc[a4]; - count -= 1; - __asm__ - ( - "qfsrv %[reg9], %[reg3], %[reg3]\n" - "qfsrv %[reg8], %[reg2], %[reg2]\n" - "pextlb %[reg3], $zero, %[reg3]\n" - "pextlb %[reg2], $zero, %[reg2]\n" - "pextlb %[reg9], $zero, %[reg9]\n" - "pextlb %[reg8], $zero, %[reg8]\n" - "paddh %[reg3], %[reg3], %[reg9]\n" - "paddh %[reg9], %[reg2], %[reg8]\n" - : [reg2] "+r"(reg2), [reg3] "+r"(reg3), [reg8] "=r"(reg8), [reg9] "=r"(reg9) - ); - if ( !count ) - goto LABEL_5; - count2 += 1; - do - { - do - { - reg4 = ((u64 *)m_pSrc)[0x00]; - reg6 = ((u64 *)m_pSrc)[0x01]; - set_mtsab_to_value(a3); - reg5 = ((u64 *)m_pSrc)[0x06]; - reg7 = ((u64 *)m_pSrc)[0x07]; - __asm__ - ( - "pcpyld %[reg4], %[reg5], %[reg4]\n" - "pcpyld %[reg6], %[reg7], %[reg6]\n" - "qfsrv %[reg4], %[reg4], %[reg4]\n" - "qfsrv %[reg6], %[reg6], %[reg6]\n" - : [reg4] "+r"(reg4), [reg6] "+r"(reg6) - : [reg5] "r"(reg5), [reg7] "r"(reg7) - ); - m_pSrc += a4; - count -= 1; - set_mtsab_to_value(1); - __asm__ - ( - "qfsrv %[reg5], %[reg4], %[reg4]\n" - "qfsrv %[reg7], %[reg6], %[reg6]\n" - "pextlb %[reg4], $zero, %[reg4]\n" - "pextlb %[reg6], $zero, %[reg6]\n" - "pextlb %[reg5], $zero, %[reg5]\n" - "pextlb %[reg7], $zero, %[reg7]\n" - "paddh %[reg4], %[reg4], %[reg5]\n" - "paddh %[reg5], %[reg6], %[reg7]\n" - "paddh %[reg6], %[reg3], %[reg4]\n" - "paddh %[reg7], %[reg9], %[reg5]\n" - "por %[reg3], $zero, %[reg4]\n" - "por %[reg9], $zero, %[reg5]\n" - "paddh %[reg6], %[reg6], %[reg1]\n" - "paddh %[reg7], %[reg7], %[reg1]\n" - "psrlh %[reg6], %[reg6], 2\n" - "psrlh %[reg7], %[reg7], 2\n" - : [reg3] "+r"(reg3), [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7), [reg9] "+r"(reg9) - : [reg1] "r"(reg1) - ); - reg4 = ((u128 *)m_pDstCbCr)[0x00]; - reg5 = ((u128 *)m_pDstCbCr)[0x08]; - __asm__ - ( - "paddh %[reg6], %[reg6], %[reg4]\n" - "paddh %[reg7], %[reg7], %[reg5]\n" - "pcgth %[reg4], %[reg6], $zero\n" - "pceqh %[reg5], %[reg6], $zero\n" - "psrlh %[reg4], %[reg4], 0xF\n" - "psrlh %[reg5], %[reg5], 0xF\n" - "por %[reg4], %[reg4], %[reg5]\n" - "paddh %[reg6], %[reg6], %[reg4]\n" - "pcgth %[reg4], %[reg7], $zero\n" - "pceqh %[reg5], %[reg7], $zero\n" - "psrlh %[reg4], %[reg4], 0xF\n" - "psrlh %[reg5], %[reg5], 0xF\n" - "por %[reg4], %[reg4], %[reg5]\n" - "paddh %[reg7], %[reg7], %[reg4]\n" - "psrlh %[reg6], %[reg6], 1\n" - "psrlh %[reg7], %[reg7], 1\n" - : [reg4] "+r"(reg4), [reg5] "+r"(reg5), [reg6] "+r"(reg6), [reg7] "+r"(reg7) - ); - ((u128 *)m_pDstCbCr)[0x00] = reg6; - ((u128 *)m_pDstCbCr)[0x08] = reg7; - } - while ( count > 0 ); - m_pDstCbCr += 8; -LABEL_5: - count = count2; - m_pSrc += 704; - } - while ( count2 > 0 ); -} - diff --git a/ee/mpeg/src/libmpeg_internal.h b/ee/mpeg/src/libmpeg_internal.h index 1828b01bcdd..c4ed99c8340 100644 --- a/ee/mpeg/src/libmpeg_internal.h +++ b/ee/mpeg/src/libmpeg_internal.h @@ -14,183 +14,195 @@ */ #ifndef __libmpeg_internal_H -# define __libmpeg_internal_H - -# include - -# define _MPEG_PT_I 1 -# define _MPEG_PT_P 2 -# define _MPEG_PT_B 3 -# define _MPEG_PT_D 4 - -# define _MPEG_PS_TOP_FIELD 1 -# define _MPEG_PS_BOTTOM_FIELD 2 -# define _MPEG_PS_FRAME 3 - -# define _MPEG_MBT_INTRA 1 -# define _MPEG_MBT_PATTERN 2 -# define _MPEG_MBT_MOTION_BACKWARD 4 -# define _MPEG_MBT_MOTION_FORWARD 8 -# define _MPEG_MBT_QUANT 16 - -# define _MPEG_MC_FIELD 1 -# define _MPEG_MC_FRAME 2 -# define _MPEG_MC_16X8 2 -# define _MPEG_MC_DMV 3 - -# define _MPEG_MV_FIELD 0 -# define _MPEG_MV_FRAME 1 - -# define _MPEG_CODE_PIC_START 0x00000100 -# define _MPEG_CODE_SLICE_MIN 0x00000101 -# define _MPEG_CODE_SLICE_MAX 0x000001AF -# define _MPEG_CODE_USER_DATA 0x000001B2 -# define _MPEG_CODE_SEQ_HDR 0x000001B3 -# define _MPEG_CODE_EXTENSION 0x000001B5 -# define _MPEG_CODE_SEQ_END 0x000001B7 -# define _MPEG_CODE_GRP_START 0x000001B8 - -# define _MPEG_XID_0 0 -# define _MPEG_XID_SEQUENCE 1 -# define _MPEG_XID_DISPLAY 2 -# define _MPEG_XID_QMATRIX 3 -# define _MPEG_XID_COPYRIGHT 4 -# define _MPEG_XID_SCALABLE 5 -# define _MPEG_XID_6 6 -# define _MPEG_XID_PIC_DSP 7 -# define _MPEG_XID_PIC_COD 8 -# define _MPEG_XID_PIC_SSC 9 -# define _MPEG_XID_PIC_TSC 10 - -typedef struct _MPEGMBXY { - - unsigned char m_X; - unsigned char m_Y; - +#define __libmpeg_internal_H + +#include + +#define TRACE0() \ + do { \ + printf("%s:%d\n", __PRETTY_FUNCTION__, __LINE__); \ + } while (0) +#define TRACE1(val) \ + do { \ + printf("%s:%d %s == %08x\n", __PRETTY_FUNCTION__, __LINE__, #val, val); \ + } while (0) + +#define GET_MACRO(_0, _1, _2, NAME, ...) NAME +#define TRACE(...) GET_MACRO(_0, ##__VA_ARGS__, TRACE2, TRACE1, TRACE0)(__VA_ARGS__) + +#define _MPEG_PT_I 1 +#define _MPEG_PT_P 2 +#define _MPEG_PT_B 3 +#define _MPEG_PT_D 4 + +#define _MPEG_PS_TOP_FIELD 1 +#define _MPEG_PS_BOTTOM_FIELD 2 +#define _MPEG_PS_FRAME 3 + +#define _MPEG_MBT_INTRA 1 +#define _MPEG_MBT_PATTERN 2 +#define _MPEG_MBT_MOTION_BACKWARD 4 +#define _MPEG_MBT_MOTION_FORWARD 8 +#define _MPEG_MBT_QUANT 16 + +#define _MPEG_MC_FIELD 1 +#define _MPEG_MC_FRAME 2 +#define _MPEG_MC_16X8 2 +#define _MPEG_MC_DMV 3 + +#define _MPEG_MV_FIELD 0 +#define _MPEG_MV_FRAME 1 + +#define _MPEG_CODE_PIC_START 0x00000100 +#define _MPEG_CODE_SLICE_MIN 0x00000101 +#define _MPEG_CODE_SLICE_MAX 0x000001AF +#define _MPEG_CODE_USER_DATA 0x000001B2 +#define _MPEG_CODE_SEQ_HDR 0x000001B3 +#define _MPEG_CODE_EXTENSION 0x000001B5 +#define _MPEG_CODE_SEQ_END 0x000001B7 +#define _MPEG_CODE_GRP_START 0x000001B8 + +#define _MPEG_XID_0 0 +#define _MPEG_XID_SEQUENCE 1 +#define _MPEG_XID_DISPLAY 2 +#define _MPEG_XID_QMATRIX 3 +#define _MPEG_XID_COPYRIGHT 4 +#define _MPEG_XID_SCALABLE 5 +#define _MPEG_XID_6 6 +#define _MPEG_XID_PIC_DSP 7 +#define _MPEG_XID_PIC_COD 8 +#define _MPEG_XID_PIC_SSC 9 +#define _MPEG_XID_PIC_TSC 10 + +typedef struct _MPEGMBXY +{ + unsigned char m_X; + unsigned char m_Y; } _MPEGMBXY; -typedef struct _MPEGMacroBlock8 { - - unsigned char m_Y [ 16 ][ 16 ]; - unsigned char m_Cb[ 8 ][ 8 ]; - unsigned char m_Cr[ 8 ][ 8 ]; - +typedef struct _MPEGMacroBlock8 +{ + unsigned char m_Y[16][16]; + unsigned char m_Cb[8][8]; + unsigned char m_Cr[8][8]; } _MPEGMacroBlock8; -typedef struct _MPEGMotion { - - unsigned char* m_pSrc; - short* m_pDstY; - short* m_pDstCbCr; - int m_X; - int m_Y; - int m_H; - int m_fInt; - int m_Field; - - void ( *MC_Luma ) ( u8* a1, u16* a2, int a3, int a4, int var1, int tmpa ); - void ( *MC_Chroma ) ( u8* a1, u16* a2, int a3, int a4, int var1, int tmpa ); - +typedef struct _MPEGMotion +{ + unsigned char *m_pSrc; + short *m_pDstY; + short *m_pDstCbCr; + int m_X; + int m_Y; + int m_H; + int m_fInt; + int m_Field; + + // These are used from assembly, supress linter warnings. + // cppcheck-suppress unusedStructMember + void (*MC_Luma)(struct _MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int tmpa, int, int); + // cppcheck-suppress unusedStructMember + void (*MC_Chroma)(struct _MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int tmpa, int, int); } _MPEGMotion; -typedef struct _MPEGMotions { - - unsigned char* m_pMBDstY; - unsigned char* m_pMBDstCbCr; - unsigned char* m_pSrc; - unsigned char* m_pSPRBlk; - unsigned char* m_pSPRRes; - unsigned char* m_pSPRMC; - int m_Stride; - int m_nMotions; - void ( *BlockOp ) ( struct _MPEGMotions* ); - _MPEGMotion m_Motion[ 7 ]; - +typedef struct _MPEGMotions +{ + unsigned char *m_pMBDstY; + unsigned char *m_pMBDstCbCr; + unsigned char *m_pSrc; + unsigned char *m_pSPRBlk; + unsigned char *m_pSPRRes; + unsigned char *m_pSPRMC; + int m_Stride; + int m_nMotions; + void (*BlockOp)(struct _MPEGMotions *); + _MPEGMotion m_Motion[7]; } _MPEGMotions; -typedef struct _MPEGContext { - - MPEGSequenceInfo m_SI; - s64 m_FwdPTS; - s64 m_BckPTS; - s64 m_AuxPTS; - int m_MBWidth; - int m_MBHeight; - _MPEGMacroBlock8* m_pFwdFrame; - _MPEGMacroBlock8* m_pBckFrame; - _MPEGMacroBlock8* m_pAuxFrame; - _MPEGMacroBlock8* m_pCurFrame; - _MPEGMBXY* m_pMBXY; - unsigned char* m_pCurFrameY; - unsigned char* m_pCurFrameCbCr; - int m_FRCode; - int m_MBStride; - int m_MBCount; - int m_fProgSeq; - int m_fMPEG2; - int m_fRepFF; - int m_fTopFF; - int m_fFPFrmDCT; - int m_fConsMV; - int m_fSecField; - int m_fError; - int m_fDCRst; - int m_QScale; - int m_PictStruct; - int m_PictCodingType; - int m_FPFVector; - int m_FwdFCode; - int m_FPBVector; - int m_BckFCode; - int m_FCode[ 2 ][ 2 ]; - int m_CurMC; - _MPEGMotions m_MC[ 2 ]; - _MPEGMotions* m_pCurMotions; - +typedef struct _MPEGContext +{ + MPEGSequenceInfo m_SI; + s64 m_FwdPTS; + s64 m_BckPTS; + s64 m_AuxPTS; + int m_MBWidth; + int m_MBHeight; + void *m_pFrameArena; + _MPEGMacroBlock8 *m_pFwdFrame; + _MPEGMacroBlock8 *m_pBckFrame; + _MPEGMacroBlock8 *m_pAuxFrame; + _MPEGMacroBlock8 *m_pCurFrame; + _MPEGMBXY *m_pMBXY; + unsigned char *m_pCurFrameY; + unsigned char *m_pCurFrameCbCr; + int m_FRCode; + int m_MBStride; + int m_MBCount; + int m_fProgSeq; + int m_fMPEG2; + int m_fRepFF; + int m_fTopFF; + int m_fFPFrmDCT; + int m_fConsMV; + int m_fSecField; + int m_fError; + int m_fDCRst; + int m_QScale; + int m_PictStruct; + int m_PictCodingType; + int m_FPFVector; + int m_FwdFCode; + int m_FPBVector; + int m_BckFCode; + int m_FCode[2][2]; + int m_CurMC; + _MPEGMotions m_MC[2]; + _MPEGMotions *m_pCurMotions; } _MPEGContext; -extern void _MPEG_Initialize ( _MPEGContext*, int ( * ) ( void* ), void*, int* ); -extern void _MPEG_Destroy ( void ); -extern int _MPEG_CSCImage ( void*, void*, int ); -extern void _MPEG_SetDefQM ( int ); -extern void _MPEG_SetQM ( int ); -extern int _MPEG_GetMBAI ( void ); -extern int _MPEG_GetMBType ( void ); -extern int _MPEG_GetMotionCode ( void ); -extern int _MPEG_GetDMVector ( void ); -extern unsigned int _MPEG_NextStartCode ( void ); -extern void _MPEG_AlignBits ( void ); -extern unsigned int _MPEG_GetBits ( unsigned int ); -extern unsigned int _MPEG_ShowBits ( unsigned int ); -extern void _MPEG_SetIDCP ( void ); -extern void _MPEG_SetQSTIVFAS ( void ); -extern void _MPEG_SetPCT ( unsigned int ); -extern void _MPEG_BDEC ( int, int, int, int, void* ); -extern int _MPEG_WaitBDEC ( void ); -extern void _MPEG_dma_ref_image ( _MPEGMacroBlock8*, _MPEGMotion*, s64, int ); -extern void _MPEG_do_mc ( _MPEGMotion* ); -extern void _MPEG_put_luma ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_put_luma_X ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_put_luma_Y ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_put_luma_XY ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_put_chroma ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_put_chroma_X ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_put_chroma_Y ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_put_chroma_XY ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_avg_luma ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_avg_luma_X ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_avg_luma_Y ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_avg_luma_XY ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_avg_chroma ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_avg_chroma_X ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_avg_chroma_Y ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_avg_chroma_XY ( u8* a1, u16* a2, int a3, int a4, int var1, int ta ); -extern void _MPEG_put_block_fr ( _MPEGMotions* ); -extern void _MPEG_put_block_fl ( _MPEGMotions* ); -extern void _MPEG_put_block_il ( _MPEGMotions* ); -extern void _MPEG_add_block_ilfl ( _MPEGMotions* ); -extern void _MPEG_add_block_frfr ( _MPEGMotions* ); -extern void _MPEG_add_block_frfl ( _MPEGMotions* ); -extern void _MPEG_Suspend ( void ); -extern void _MPEG_Resume ( void ); -#endif /* __libmpeg_internal_H */ +extern void _MPEG_Initialize(_MPEGContext *, int (*)(void *), void *, int *); +extern void _MPEG_Destroy(void); +extern int _MPEG_CSCImage(void *, void *, int); +extern void _MPEG_SetDefQM(int); +extern void _MPEG_SetQM(int); +extern int _MPEG_GetMBAI(void); +extern int _MPEG_GetMBType(void); +extern int _MPEG_GetMotionCode(void); +extern int _MPEG_GetDMVector(void); +extern unsigned int _MPEG_NextStartCode(void); +extern void _MPEG_AlignBits(void); +extern unsigned int _MPEG_GetBits(unsigned int); +extern unsigned int _MPEG_ShowBits(unsigned int); +extern void _MPEG_SetIDCP(void); +extern void _MPEG_SetQSTIVFAS(void); +extern void _MPEG_SetPCT(unsigned int); +extern void _MPEG_BDEC(int, int, int, int, void *); +extern int _MPEG_WaitBDEC(void); +extern void _MPEG_dma_ref_image(_MPEGMacroBlock8 *, _MPEGMotion *, s64, int); +extern void _MPEG_do_mc(_MPEGMotion *); +extern void _MPEG_put_luma(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_put_luma_X(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_put_luma_Y(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_put_luma_XY(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_put_chroma(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_put_chroma_X(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_put_chroma_Y(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_put_chroma_XY(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_avg_luma(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_avg_luma_X(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_avg_luma_Y(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_avg_luma_XY(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_avg_chroma(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_avg_chroma_X(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_avg_chroma_Y(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_avg_chroma_XY(_MPEGMotion *m, u8 *a2, short *a3, int a4, int var1, int ta, int, int); +extern void _MPEG_put_block_fr(_MPEGMotions *); +extern void _MPEG_put_block_fl(_MPEGMotions *); +extern void _MPEG_put_block_il(_MPEGMotions *); +extern void _MPEG_add_block_ilfl(_MPEGMotions *); +extern void _MPEG_add_block_frfr(_MPEGMotions *); +extern void _MPEG_add_block_frfl(_MPEGMotions *); +extern void _MPEG_Suspend(void); +extern void _MPEG_Resume(void); + +#endif /* __libmpeg_internal_H */ diff --git a/ee/mpeg/src/libmpeg_core.s b/ee/mpeg/src/libmpeg_op.s similarity index 63% rename from ee/mpeg/src/libmpeg_core.s rename to ee/mpeg/src/libmpeg_op.s index c58aadae2e6..3f4d45325c8 100644 --- a/ee/mpeg/src/libmpeg_core.s +++ b/ee/mpeg/src/libmpeg_op.s @@ -6,36 +6,18 @@ # Licenced under Academic Free License version 2.0 # Review ps2sdk README & LICENSE files for further details. + .set push .set noreorder .set nomacro .set noat -.globl _MPEG_Initialize -.globl _MPEG_Destroy -.globl _MPEG_GetBits -.globl _MPEG_ShowBits -.globl _MPEG_AlignBits -.globl _MPEG_NextStartCode -.globl _MPEG_SetDefQM -.globl _MPEG_SetQM -.globl _MPEG_GetMBAI -.globl _MPEG_GetMBType -.globl _MPEG_GetMotionCode -.globl _MPEG_GetDMVector -.globl _MPEG_SetIDCP -.globl _MPEG_SetQSTIVFAS -.globl _MPEG_SetPCT -.globl _MPEG_BDEC -.globl _MPEG_WaitBDEC .globl _MPEG_put_block_fr .globl _MPEG_put_block_fl .globl _MPEG_put_block_il .globl _MPEG_add_block_frfr .globl _MPEG_add_block_ilfl .globl _MPEG_add_block_frfl -.globl _MPEG_dma_ref_image -.globl _MPEG_do_mc .globl _MPEG_put_luma .globl _MPEG_put_chroma .globl _MPEG_put_luma_X @@ -52,824 +34,6 @@ .globl _MPEG_avg_chroma_Y .globl _MPEG_avg_luma_XY .globl _MPEG_avg_chroma_XY -.globl _MPEG_CSCImage -.globl _MPEG_Suspend -.globl _MPEG_Resume - -.sdata -.align 4 -s_DefQM: .word 0x13101008, 0x16161310, 0x16161616, 0x1B1A181A - .word 0x1A1A1B1B, 0x1B1B1A1A, 0x1D1D1D1B, 0x1D222222 - .word 0x1B1B1D1D, 0x20201D1D, 0x26252222, 0x22232325 - .word 0x28262623, 0x30302828, 0x38382E2E, 0x5345453A - .word 0x10101010, 0x10101010, 0x10101010, 0x10101010 - -.section ".sbss" -.align 6 -s_DMAPack : .space 128 -s_DataBuf : .space 8 -s_SetDMA : .space 8 -s_IPUState: .space 32 -s_pEOF : .space 4 -s_Sema : .space 4 -s_CSCParam: .space 12 -s_CSCID : .space 4 -s_CSCFlag : .space 1 - -.text - -_MPEG_Initialize: - addiu $sp, $sp, -48 - lui $v0, 0x1000 - lui $v1, 0x4000 -.set at - sw $a1, s_SetDMA + 0 - sw $v1, 0x2010($v0) - sw $a2, s_SetDMA + 4 - sw $a3, s_pEOF -.set noat -1: - lw $v1, 0x2010($v0) - bltz $v1, 1b - nop - sw $zero, 0x2000($v0) -1: - lw $v1, 0x2010($v0) - bltz $v1, 1b - nop - lui $at, 0x0080 - sw $ra, 0($sp) - or $v1, $v1, $at - sw $v1, 0x2010($v0) - lui $v0, 0x1001 - sw $zero, -20448($v0) - sw $zero, -19424($v0) - sw $zero, 0($a3) - sw $zero, 12($sp) - addiu $v1, $zero, 64 - addu $a0, $sp, 4 - syscall -.set at - sw $v0, s_Sema -.set noat - addiu $a0, $zero, 3 - addiu $v1, $zero, 18 - lui $a1, %hi( _mpeg_dmac_handler ) - la $a3, s_CSCParam - xor $a2, $a2, $a2 - addiu $a1, %lo( _mpeg_dmac_handler ) - lw $ra, 0($sp) - syscall - addiu $sp, $sp, 48 -.set at - sw $v0, s_CSCID - sd $zero, s_DataBuf -.set noat - jr $ra - nop - - -_MPEG_Destroy: -1: - lb $v1, s_CSCFlag - bne $v1, $zero, 1b - lw $a1, s_CSCID - addiu $a0, $zero, 3 - addiu $v1, $zero, 19 - syscall - addiu $v1, $zero, 65 - lw $a0, s_Sema - syscall - jr $ra - -_MPEG_Suspend: -1: - lb $v0, s_CSCFlag - bne $v0, $zero, 1b -_ipu_suspend: - lui $a1, 0x1001 - lui $v0, 0x0001 -1: - di - sync.p - mfc0 $at, $12 - and $at, $at, $v0 - bne $at, $zero, 1b - lui $v0, 0x0001 - lw $a2, -2784($a1) - nor $v1, $v0, $zero - or $a2, $a2, $v0 - sw $a2, -2672($a1) - lw $t8, -19456($a1) - sra $a3, $v1, 8 - subu $a5, $a1, $v0 - and $t8, $t8, $a3 - sw $t8, -19456($a1) - lw $a2, -2784($a1) -.set at - sw $t8, s_IPUState + 0 -.set noat - and $a2, $a2, $v1 - sw $a2, -2672($a1) - ei - lw $t8, -19440($a1) - lw $a2, -19424($a1) -.set at - sw $t8, s_IPUState + 4 - sw $a2, s_IPUState + 8 -.set noat -1: - lw $at, 0x2010($a5) - andi $at, $at, 0x00F0 - bne $at, $zero, 1b - nop -1: - di - sync.p - mfc0 $at, $12 - and $at, $at, $v0 - bne $at, $zero, 1b - nop - lw $a2, -2784($a1) - or $a2, $a2, $v0 - sw $a2, -2672($a1) - lw $t8, -20480($a1) - and $t8, $t8, $a3 - sw $t8, -20480($a1) - lw $a2, -2784($a1) -.set at - sw $t8, s_IPUState + 12 - and $a2, $a2, $v1 - sw $a2, -2672($a1) - ei - lw $t8, -20464($a1) - lw $a2, -20448($a1) - sw $t8, s_IPUState + 16 - sw $a2, s_IPUState + 20 - lw $t8, 0x2010($a5) - lw $a2, 0x2020($a5) - sw $t8, s_IPUState + 24 - sw $a2, s_IPUState + 28 -.set noat - jr $ra - nop - -_MPEG_Resume: -_ipu_resume: - lw $v1, s_IPUState + 20 - lui $a0, 0x1001 - lui $a1, 0x1000 - addiu $a2, $zero, 0x0100 - beq $v1, $zero, 1f - lw $at, s_IPUState + 28 - lw $a3, s_IPUState + 12 - lw $v0, s_IPUState + 16 - sw $v0, -20464($a0) - or $a3, $a3, $a2 - sw $v1, -20448($a0) - sw $a3, -20480($a0) -1: - lw $a3, s_IPUState + 8 - andi $v0, $at, 0x007F - srl $v1, $at, 16 - srl $at, $at, 8 - andi $v1, $v1, 0x0003 - andi $at, $at, 0x000F - addu $v1, $v1, $at - lw $at, s_IPUState + 4 - addu $a3, $a3, $v1 - beq $a3, $zero, 2f - sll $v1, $v1, 4 - subu $at, $at, $v1 - sw $v0, 0x2000($a1) - lw $v1, s_IPUState + 0 -1: - lw $v0, 0x2010($a1) - bltz $v0, 1b - nop - lw $v0, s_IPUState + 24 - or $v1, $v1, $a2 - sw $v0, 0x2010($a1) - sw $at, -19440($a0) - sw $a3, -19424($a0) - sw $v1, -19456($a0) -2: - jr $ra - addiu $v0, $v0, 1 - -_mpeg_dmac_handler: - lw $at, 8($a1) - beql $at, $zero, 1f - addiu $v1, $zero, -29 - lw $a0, 0($a1) - lw $a2, 4($a1) - addiu $a3, $zero, 1023 - addiu $v1, $zero, 384 - pminw $a3, $a3, $at - lui $a5, 0x1001 - sll $v0, $a3, 10 - mult $v1, $v1, $a3 - subu $at, $at, $a3 - sw $a2, -20464($a5) - sw $a0, -19440($a5) - addu $a2, $a2, $v0 - srl $v0, $v0, 4 - addu $a0, $a0, $v1 - sw $a0, 0($a1) - srl $v1, $v1, 4 - sw $a2, 4($a1) - lui $a4, 0x1000 - sw $at, 8($a1) - sw $v0, -20448($a5) - lui $v0, 0x7000 - sw $v1, -19424($a5) - addiu $v1, $zero, 0x0101 - or $v0, $v0, $a3 - sw $v1, -19456($a5) - andi $v1, 0x0100 - sw $v0, 0x2000($a4) - sw $v1, -20480($a5) - jr $ra - nor $v0, $zero, $zero -1: - addiu $a0, $zero, 3 - syscall - lw $a0, s_Sema - addiu $v1, $zero, -67 - syscall -.set at - sb $zero, s_CSCFlag -.set noat - jr $ra - nor $v0, $zero, $zero - -_MPEG_CSCImage: - addiu $sp, $sp, -16 - sw $ra, 0($sp) - sw $a0, 4($sp) - sw $a1, 8($sp) - bgezal $zero, _ipu_suspend - sw $a2, 12($sp) - sw $zero, 0x2000($a5) - addiu $a4, $zero, 1023 - addiu $v0, $zero, 8 - addiu $a0, $zero, 3 - addiu $v1, $zero, 22 - lw $a2, 12($sp) - addiu $a7, $zero, 384 - sw $v0, -8176($a1) - pminw $a4, $a4, $a2 - lw $t0, 4($sp) - lw $a3, 8($sp) - subu $a2, $a2, $a4 - mult $a7, $a7, $a4 - sll $t1, $a4, 10 - sw $a3, -20464($a1) - sw $t0, -19440($a1) -.set at - sw $a2, s_CSCParam + 8 - addu $t0, $t0, $a7 - addu $a3, $a3, $t1 - sw $t0, s_CSCParam - srl $a7, $a7, 4 - sw $a3, s_CSCParam + 4 -.set noat - srl $t1, $t1, 4 - sw $a7, -19424($a1) - sw $t1, -20448($a1) - sw $a4, 4($sp) - syscall - lw $a4, 4($sp) - addiu $v1, $zero, 0x0101 - lui $at, 0x1001 - lui $v0, 0x7000 - lui $a0, 0x1000 - or $v0, $v0, $a4 - sw $v1, -19456($at) - andi $v1, $v1, 0x0100 - sw $v0, 0x2000($a0) - sw $v1, -20480($at) - lw $a0, s_Sema - addiu $v1, $zero, 68 -.set at - sb $v1, s_CSCFlag -.set noat - syscall - lw $ra, 0($sp) - beq $zero, $zero, _ipu_resume - addiu $sp, $sp, 16 -1: - lw $v1, 0x2010($at) -_ipu_sync: - lui $a1, 0x0003 - andi $a2, $a0, 0xFF00 - and $v0, $a0, $a1 - andi $a0, $a0, 0x007F - addiu $a1, $zero, 0x4000 - srl $a2, $a2, 1 - srl $v0, $v0, 9 - and $a1, $a1, $v1 - addu $a2, $a2, $v0 - subu $a2, $a2, $a0 - bne $a1, $zero, 3f - slti $a2, $a2, 32 - beq $a2, $zero, 2f - lui $a2, 0x1001 - lw $a2, -19424($a2) - bgtzl $a2, 1b - lw $a0, 0x2020($at) - addiu $sp, $sp, -16 - lw $a2, s_SetDMA + 0 - sw $ra, 0($sp) - jalr $a2 - lw $a0, s_SetDMA + 4 - lw $ra, 0($sp) - addiu $sp, $sp, 16 - beql $v0, $zero, 4f - lw $v1, s_pEOF - lui $at, 0x1000 -2: - lw $v1, 0x2010($at) - bltzl $v1, _ipu_sync - lw $a0, 0x2020($at) -3: - jr $ra -4: - addiu $a0, $zero, 32 - addiu $v0, $zero, 0x01B7 -.set at - sw $a0, s_DataBuf - sw $v0, s_DataBuf + 4 -.set noat - jr $ra - sw $a0, 0($v1) - -_ipu_sync_data: - lui $at, 0x1000 - ld $v0, 0x2000($at) - bltzl $v0, 1f - lw $a0, 0x2020($at) - jr $ra -1: - lui $a1, 0x0003 - andi $v1, $a0, 0xFF00 - and $v0, $a0, $a1 - srl $v1, $v1, 1 - srl $v0, $v0, 9 - addu $v1, $v1, $v0 - andi $a0, $a0, 0x7F - subu $v0, $v1, $a0 - sltiu $v0, $v0, 32 - beq $v0, $zero, 2f - lui $v0, 0x1001 - lw $v0, -19424($v0) - bgtzl $v0, 1b - lw $a0, 0x2020($at) - lw $v0, s_SetDMA + 0 - addiu $sp, $sp, -16 - sw $ra, 0($sp) - jalr $v0 - lw $a0, s_SetDMA + 4 - lw $ra, 0($sp) - addiu $sp, $sp, 16 - beql $v0, $zero, 4b - lw $v1, s_pEOF - lui $at, 0x1000 -2: - ld $v0, 0x2000($at) - bltzl $v0, 1b - lw $a0, 0x2020($at) - jr $ra - -_MPEG_GetBits: -_ipu_get_bits: - lui $at, 0x1000 - addiu $sp, $sp, -16 - lw $v1, 0x2010($at) - sd $ra, 0($sp) - sd $s0, 8($sp) - addu $s0, $zero, $a0 - bltzall $v1, _ipu_sync - lw $a0, 0x2020($at) - lw $v1, s_DataBuf + 0 - slt $v0, $v1, $s0 - beqzl $v0, 1f - lw $v0, s_DataBuf + 4 - lui $at, 0x1000 - lui $a1, 0x4000 - bgezal $zero, _ipu_sync_data - sw $a1, 0x2000($at) - addiu $v1, $zero, 32 -1: - lui $a1, 0x4000 - or $a1, $a1, $s0 - subu $v1, $v1, $s0 - sw $a1, 0x2000($at) -.set at - sw $v1, s_DataBuf + 0 - subu $a2, $zero, $s0 - sllv $v1, $v0, $s0 - srlv $v0, $v0, $a2 - sw $v1, s_DataBuf + 4 -.set noat - ld $ra, 0($sp) - ld $s0, 8($sp) - jr $ra - addiu $sp, $sp, 16 - -_MPEG_ShowBits: -_ipu_show_bits: - lw $v1, s_DataBuf + 0 - slt $v0, $v1, $a0 - beqzl $v0, 1f - lw $v0, s_DataBuf + 4 - lui $at, 0x1000 - addiu $sp, $sp, -16 - lw $v1, 0x2010($at) - sw $ra, 0($sp) - sw $a0, 4($sp) - bltzall $v1, _ipu_sync - lw $a0, 0x2020($at) - lui $at, 0x1000 - lui $a1, 0x4000 - bgezal $zero, _ipu_sync_data - sw $a1, 0x2000($at) - addiu $v1, $zero, 32 -.set at - sw $v1, s_DataBuf + 0 - sw $v0, s_DataBuf + 4 -.set noat - lw $ra, 0($sp) - lw $a0, 4($sp) - addiu $sp, $sp, 16 -1: - subu $a0, $zero, $a0 - jr $ra - srlv $v0, $v0, $a0 - -_MPEG_AlignBits: -_ipu_align_bits: - lui $at, 0x1000 - addiu $sp, $sp, -16 - lw $v1, 0x2010($at) - sw $ra, 0($sp) - bltzall $v1, _ipu_sync - lw $a0, 0x2020($at) - lw $a0, 0x2020($at) - andi $a0, $a0, 7 - subu $a0, $zero, $a0 - andi $a0, $a0, 7 - beq $a0, $zero, 1f - lw $ra, 0($sp) - beq $zero, $zero, _ipu_get_bits -1: - addiu $sp, $sp, 16 - jr $ra - nop - -_MPEG_NextStartCode: - addiu $sp, $sp, -16 - sw $ra, 0($sp) - bgezal $zero, _ipu_align_bits - nop -1: - bgezal $zero, _ipu_show_bits - addiu $a0, $zero, 24 - addiu $v1, $zero, 1 -4: - bne $v0, $v1, 5f - addiu $a0, $zero, 32 - lw $ra, 0($sp) - beq $zero, $zero, _ipu_show_bits - addiu $sp, $sp, 16 -5: - bgezal $zero, _ipu_get_bits - addiu $a0, $zero, 8 - beq $zero, $zero, 1b - nop - -_MPEG_SetDefQM: - addiu $sp, $sp, -16 - sw $ra, 0($sp) - bgezal $zero, _ipu_suspend - nop - lui $v1, 0x1000 - la $at, s_DefQM - sw $zero, 0x2000($v1) - lq $a0, 0($at) - lq $a1, 16($at) - lq $a2, 32($at) - lq $a3, 48($at) - lq $a4, 64($at) - lui $v0, 0x5000 -1: - lw $at, 0x2010($v1) - bltz $at, 1b - nop - sq $a0, 0x7010($v1) - sq $a1, 0x7010($v1) - sq $a2, 0x7010($v1) - sq $a3, 0x7010($v1) - sw $v0, 0x2000($v1) - lui $v0, 0x5800 -1: - lw $at, 0x2010($v1) - bltz $at, 1b - nop - sq $a4, 0x7010($v1) - sq $a4, 0x7010($v1) - sq $a4, 0x7010($v1) - sq $a4, 0x7010($v1) - sw $v0, 0x2000($v1) -1: - lw $at, 0x2010($v1) - bltz $at, 1b - nop - lw $ra, 0($sp) - beq $zero, $zero, _ipu_resume - addiu $sp, $sp, 16 - -_MPEG_SetQM: - lui $at, 0x1000 - addiu $sp, $sp, -16 - lw $v1, 0x2010($at) - sw $ra, 0($sp) - sd $s0, 8($sp) - sll $s0, $a0, 27 - bltzall $v1, _ipu_sync - lw $a0, 0x2020($at) - lui $a0, 0x5000 - or $a0, $a0, $s0 - sw $a0, 0x2000($at) - lw $ra, 0($sp) - ld $s0, 8($sp) - addiu $sp, $sp, 16 -.set at - sd $zero, s_DataBuf -.set noat - jr $ra - nop - -_MPEG_GetMBAI: - lui $at, 0x1000 - addiu $sp, $sp, -16 - lw $v1, 0x2010($at) - sw $ra, 0($sp) - sd $s0, 8($sp) - addu $s0, $zero, $zero - bltzall $v1, _ipu_sync - lw $a0, 0x2020($at) -3: - lui $v0, 0x3000 -4: - bgezal $zero, _ipu_sync_data - sw $v0, 0x2000($at) - beql $v0, $zero, 1f - addu $s0, $zero, $zero - andi $v0, $v0, 0xFFFF - slti $v1, $v0, 0x0022 - bnel $v1, $zero, 2f - addu $s0, $s0, $v0 - addiu $v1, $zero, 0x0023 - beql $v0, $v1, 3b - addiu $s0, $s0, 0x0021 - beq $zero, $zero, 4b - lui $v0, 0x3000 -2: - addiu $v1, $zero, 32 - ld $a0, 0x2030($at) -.set at - sw $v1, s_DataBuf + 0 - sw $a0, s_DataBuf + 4 -.set noat -1: - addu $v0, $zero, $s0 - lw $ra, 0($sp) - ld $s0, 8($sp) - jr $ra - addiu $sp, $sp, 16 - -_MPEG_GetMBType: - lui $at, 0x1000 - addiu $sp, $sp, -16 - lw $v1, 0x2010($at) - sw $ra, 0($sp) - bltzall $v1, _ipu_sync - lw $a0, 0x2020($at) - lui $a2, 0x3400 - bgezal $zero, _ipu_sync_data - sw $a2, 0x2000($at) - beq $v0, $zero, 1f - addiu $v1, $zero, 32 - ld $a1, 0x2030($at) - andi $v0, $v0, 0xFFFF -.set at - sw $v1, s_DataBuf + 0 - sw $a1, s_DataBuf + 4 -.set noat -1: - lw $ra, 0($sp) - jr $ra - addiu $sp, $sp, 16 - -_MPEG_GetMotionCode: - lui $at, 0x1000 - addiu $sp, $sp, -16 - lw $v1, 0x2010($at) - sw $ra, 0($sp) - bltzall $v1, _ipu_sync - lw $a0, 0x2020($at) - lui $a2, 0x3800 - bgezal $zero, _ipu_sync_data - sw $a2, 0x2000($at) - beql $v0, $zero, 1f - addiu $v0, $zero, 0x8000 - addiu $v1, $zero, 32 - ld $a1, 0x2030($at) - andi $v0, $v0, 0xFFFF -.set at - sw $v1, s_DataBuf + 0 - sw $a1, s_DataBuf + 4 -.set noat -1: - dsll32 $v0, $v0, 16 - lw $ra, 0($sp) - dsra32 $v0, $v0, 16 - jr $ra - addiu $sp, $sp, 16 - -_MPEG_GetDMVector: - lui $at, 0x1000 - addiu $sp, $sp, -16 - lw $v1, 0x2010($at) - sw $ra, 0($sp) - bltzall $v1, _ipu_sync - lw $a0, 0x2020($at) - lui $a2, 0x3C00 - bgezal $zero, _ipu_sync_data - sw $a2, 0x2000($at) - addiu $v1, $zero, 32 - ld $a1, 0x2030($at) - dsll32 $v0, $v0, 16 -.set at - sw $v1, s_DataBuf + 0 - sw $a1, s_DataBuf + 4 -.set noat - lw $ra, 0($sp) - dsra32 $v0, $v0, 16 - jr $ra - addiu $sp, $sp, 16 - -_MPEG_SetIDCP: - addiu $sp, $sp, -16 - sw $ra, 0($sp) - bgezal $zero, _ipu_get_bits - addiu $a0, $zero, 2 - lui $v1, 0xFFFC - sll $v0, $v0, 16 - lw $a0, 0x2010($at) - ori $v1, $v1, 0xFFFF - lw $ra, 0($sp) - and $a0, $a0, $v1 - addiu $sp, $sp, 16 - or $a0, $a0, $v0 - jr $ra - sw $a0, 0x2010($at) - -_MPEG_SetQSTIVFAS: - addiu $sp, $sp, -16 - sd $ra, 0($sp) - sd $s0, 8($sp) - bgezal $zero, _ipu_get_bits - addiu $a0, $zero, 1 - sll $s0, $v0, 22 - bgezal $zero, _ipu_get_bits - addiu $a0, $zero, 1 - sll $v0, $v0, 21 - addiu $a0, $zero, 1 - bgezal $zero, _ipu_get_bits - or $s0, $s0, $v0 - sll $v0, $v0, 20 - lw $a0, 0x2010($at) - lui $v1, 0xFF8F - or $s0, $s0, $v0 - ori $v1, $v1, 0xFFFF - ld $ra, 0($sp) - and $a0, $a0, $v1 - addiu $sp, $sp, 16 - or $a0, $a0, $s0 - ld $s0, -8($sp) - jr $ra - sw $a0, 0x2010($at) - -_MPEG_SetPCT: - sll $a0, $a0, 24 - addiu $sp, $sp, -16 - lui $at, 0x1000 - sw $ra, 0($sp) - sw $a0, 4($sp) - lw $v1, 0x2010($at) - bltzl $v1, _ipu_sync - lw $a0, 0x2020($at) - lw $v0, 4($sp) - lui $a0, 0xF8FF - ori $a0, $a0, 0xFFFF - and $v1, $v1, $a0 - or $v1, $v1, $v0 - lw $ra, 0($sp) - addiu $sp, $sp, 16 - jr $ra - sw $v1, 0x2010($at) - -_MPEG_BDEC: - addiu $sp, $sp, -16 - sll $a0, $a0, 27 - sd $ra, 0($sp) - sll $a1, $a1, 26 - sd $s0, 8($sp) - lui $s0, 0x2000 - sll $a2, $a2, 25 - or $s0, $s0, $a0 - sll $a3, $a3, 16 - or $s0, $s0, $a1 - lui $a0, 0x8000 - or $s0, $s0, $a2 - sll $a4, $a4, 4 - or $s0, $s0, $a3 - srl $a4, $a4, 4 - lui $a1, 0x1001 - lui $at, 0x1000 - or $a4, $a4, $a0 - lw $v1, 0x2010($at) - addiu $a0, $zero, 48 - addiu $a2, $zero, 0x0100 - sw $a4, -20464($a1) - sw $a0, -20448($a1) - sw $a2, -20480($a1) - bltzall $v1, _ipu_sync - lw $a0, 0x2020($at) - ld $ra, 0($sp) - sw $s0, 0x2000($at) - ld $s0, 8($sp) - jr $ra - addiu $sp, $sp, 16 - -_MPEG_WaitBDEC: - addiu $sp, $sp, -16 - lui $at, 0x1000 - lw $v1, 0x2010($at) - sw $ra, 0($sp) -1: - bltzall $v1, _ipu_sync - lw $a0, 0x2020($at) - lw $v1, s_pEOF - addiu $a0, $zero, 0x4000 - lw $v1, 0($v1) - lui $a2, 0x1001 - bne $v1, $zero, 3f - lw $v0, 0x2010($at) - and $v0, $v0, $a0 - bne $v0, $zero, 3f - lw $a2, -20448($a2) - addiu $v0, $zero, 1 - bnel $a2, $zero, 1b - lw $v1, 0x2010($at) - ld $v1, 0x2030($at) - addiu $ra, $zero, 32 - addiu $v0, $zero, 1 - pextlw $v1, $v1, $ra -2: - lw $ra, 0($sp) -.set at - sd $v1, s_DataBuf -.set noat - jr $ra - addiu $sp, $sp, 16 -3: - bgezal $zero, _ipu_suspend - lui $a4, 0x4000 - bgezal $zero, _ipu_resume - sw $a4, 0x2010($a5) - lui $v0, 0x0001 -4: - di - sync.p - mfc0 $at, $12 - and $at, $at, $v0 - nor $a2, $v0, $zero - bne $at, $zero, 4b - lw $at, -2784($a0) - xor $v1, $v1, $v1 - or $at, $at, $v0 - sw $at, -2672($a0) - sw $zero, -20480($a0) - lw $at, -2784($a0) - xor $v0, $v0, $v0 - and $at, $at, $a2 - sw $at, -2672($a0) - ei - beq $zero, $zero, 2b - sw $zero, -20448($a0) _MPEG_put_block_fr: lw $a2, 0($a0) @@ -915,6 +79,7 @@ _MPEG_put_block_fr: bgtzl $v1, 1b addiu $a2, $a2, 64 jr $ra + nop _MPEG_put_block_fl: pnor $v0, $zero, $zero @@ -998,6 +163,7 @@ _MPEG_put_block_fl: bgtzl $v1, 2b addiu $a2, $a2, 64 jr $ra + nop _MPEG_put_block_il: pnor $v0, $zero, $zero @@ -1096,6 +262,7 @@ _MPEG_put_block_il: bgtzl $v1, 2b addiu $at, $at, 64 jr $ra + nop _MPEG_add_block_frfr: pnor $v0, $zero, $zero @@ -1159,6 +326,7 @@ _MPEG_add_block_frfr: bgtzl $v1, 1b addiu $a2, $a2, 64 jr $ra + nop _MPEG_add_block_ilfl: pnor $v0, $zero, $zero @@ -1292,6 +460,7 @@ _MPEG_add_block_ilfl: bgtzl $v1, 2b addiu $a1, $a1, 128 jr $ra + nop _MPEG_add_block_frfl: pnor $v0, $zero, $zero @@ -1411,95 +580,7 @@ _MPEG_add_block_frfl: bgtzl $v1, 2b addiu $a1, $a1, 128 jr $ra - -_MPEG_dma_ref_image: - addiu $at, $zero, 4 - pminw $a2, $a2, $at - bgtzl $a2, 1f - addiu $at, $at, 380 - jr $ra -1: - lui $v0, 0x1001 - mult $a3, $a3, $at - sll $at, $a0, 4 - lui $a5, 0x2000 - la $a4, s_DMAPack -1: - lw $v1, -11264($v0) - andi $v1, $v1, 0x0100 - bne $v1, $zero, 1b nop - srl $at, $at, 4 - sw $zero, -11232($v0) - or $a5, $a5, $a4 - sw $at, -11136($v0) - lui $v1, 0x3000 - sw $a4, -11216($v0) - ori $v1, $v1, 0x0030 -1: - lw $a4, 0($a1) - addiu $a2, $a2, -1 - sw $v1, 0($a5) - sw $a4, 4($a5) - addu $a4, $a4, $a3 - sw $v1, 16($a5) - sw $a4, 20($a5) - sw $a0, 0($a1) - addiu $a1, $a1, 40 - addiu $a5, $a5, 32 - bgtz $a2, 1b - addiu $a0, $a0, 1536 - andi $v1, $v1, 0xFFFF - addiu $at, $zero, 0x0105 - sw $v1, -16($a5) - sw $zero, 32($a1) - sync.l - jr $ra - sw $at, -11264($v0) - -_MPEG_do_mc: - addiu $v0, $zero, 16 - lw $a1, 0($a0) - addiu $sp, $sp, -16 - lw $a2, 4($a0) - lw $a3, 12($a0) - lw $a4, 16($a0) - lw $a5, 20($a0) - lw $a6, 24($a0) - lw $t0, 28($a0) - subu $a4, $a4, $t0 - lw $t1, 32($a0) - sll $t0, $t0, 4 - addu $a1, $a1, $t0 - subu $v1, $v0, $a4 - sllv $a7, $v0, $a6 - srlv $v1, $v1, $a6 - sll $at, $a4, 4 - sw $ra, 0($sp) - addu $a1, $a1, $at - jalr $t1 - subu $at, $a5, $v1 - lw $a1, 0($a0) - lw $a2, 8($a0) - lw $t1, 36($a0) - addiu $a1, $a1, 256 - srl $t0, $t0, 1 - srl $a3, $a3, 1 - srl $a4, $a4, 1 - srl $a5, $a5, 1 - lw $ra, 0($sp) - srlv $a4, $a4, $a6 - addu $a1, $a1, $t0 - addiu $v0, $zero, 8 - sllv $a4, $a4, $a6 - subu $v1, $v0, $a4 - sllv $a7, $v0, $a6 - srlv $v1, $v1, $a6 - sll $at, $a4, 3 - addu $a1, $a1, $at - subu $at, $a5, $v1 - jr $t1 - addiu $sp, $sp, 16 _MPEG_put_luma: mtsab $a3, 0 @@ -1520,6 +601,7 @@ _MPEG_put_luma: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_put_chroma: mtsab $a3, 0 @@ -1545,6 +627,7 @@ _MPEG_put_chroma: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_put_luma_X: pnor $v0, $zero, $zero @@ -1578,6 +661,7 @@ _MPEG_put_luma_X: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_put_chroma_X: pnor $v0, $zero, $zero @@ -1617,6 +701,7 @@ _MPEG_put_chroma_X: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_put_luma_Y: mtsab $a3, 0 @@ -1657,6 +742,7 @@ _MPEG_put_luma_Y: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_put_chroma_Y: mtsab $a3, 0 @@ -1707,6 +793,7 @@ _MPEG_put_chroma_Y: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_put_luma_XY: mtsab $a3, 0 @@ -1763,6 +850,7 @@ _MPEG_put_luma_XY: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_put_chroma_XY: mtsab $a3, 0 @@ -1830,6 +918,7 @@ _MPEG_put_chroma_XY: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_avg_luma: mtsab $a3, 0 @@ -1868,6 +957,7 @@ _MPEG_avg_luma: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_avg_chroma: mtsab $a3, 0 @@ -1911,6 +1001,7 @@ _MPEG_avg_chroma: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_avg_luma_X: pnor $v0, $zero, $zero @@ -1962,6 +1053,7 @@ _MPEG_avg_luma_X: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_avg_chroma_X: pnor $v0, $zero, $zero @@ -2019,6 +1111,7 @@ _MPEG_avg_chroma_X: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_avg_luma_Y: mtsab $a3, 0 @@ -2077,6 +1170,7 @@ _MPEG_avg_luma_Y: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_avg_chroma_Y: mtsab $a3, 0 @@ -2145,6 +1239,7 @@ _MPEG_avg_chroma_Y: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_avg_luma_XY: mtsab $a3, 0 @@ -2219,6 +1314,7 @@ _MPEG_avg_luma_XY: bgtzl $v1, 1b addu $at, $zero, $zero jr $ra + nop _MPEG_avg_chroma_XY: mtsab $a3, 0 @@ -2306,4 +1402,49 @@ _MPEG_avg_chroma_XY: jr $ra nop + .globl _MPEG_do_mc +_MPEG_do_mc: + addiu $v0, $zero, 16 + lw $a1, 0($a0) + addiu $sp, $sp, -16 + lw $a2, 4($a0) + lw $a3, 12($a0) + lw $a4, 16($a0) + lw $a5, 20($a0) + lw $a6, 24($a0) + lw $t0, 28($a0) + subu $a4, $a4, $t0 + lw $t1, 32($a0) + sll $t0, $t0, 4 + addu $a1, $a1, $t0 + subu $v1, $v0, $a4 + sllv $a7, $v0, $a6 + srlv $v1, $v1, $a6 + sll $at, $a4, 4 + sw $ra, 0($sp) + addu $a1, $a1, $at + jalr $t1 + subu $at, $a5, $v1 + lw $a1, 0($a0) + lw $a2, 8($a0) + lw $t1, 36($a0) + addiu $a1, $a1, 256 + srl $t0, $t0, 1 + srl $a3, $a3, 1 + srl $a4, $a4, 1 + srl $a5, $a5, 1 + lw $ra, 0($sp) + srlv $a4, $a4, $a6 + addu $a1, $a1, $t0 + addiu $v0, $zero, 8 + sllv $a4, $a4, $a6 + subu $v1, $v0, $a4 + sllv $a7, $v0, $a6 + srlv $v1, $v1, $a6 + sll $at, $a4, 3 + addu $a1, $a1, $at + subu $at, $a5, $v1 + jr $t1 + addiu $sp, $sp, 16 + .set pop