429 lines
13 KiB
C
429 lines
13 KiB
C
|
/*****************************************************************************
|
||
|
*
|
||
|
* This program is free software ; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU General Public License
|
||
|
* along with this program; if not, write to the Free Software
|
||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||
|
*
|
||
|
* $Id: intel2700g_idct420.h 271 2005-08-09 08:31:35Z picard $
|
||
|
*
|
||
|
* The Core Pocket Media Player
|
||
|
* Copyright (c) 2004-2005 Gabor Kovacs
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
static void FUNC(IDCTProcess)(void* p,int x,int y)
|
||
|
{
|
||
|
int Pos;
|
||
|
|
||
|
x <<= 4;
|
||
|
y <<= 4;
|
||
|
MIRRORXY
|
||
|
|
||
|
Pos = (x << IW_XSHIFT) | (y << IW_YSHIFT);
|
||
|
|
||
|
PVR(p)->mx = x;
|
||
|
PVR(p)->my = y;
|
||
|
PVR(p)->SubPos = 0;
|
||
|
|
||
|
PVR(p)->ImageWrite[1] =
|
||
|
PVR(p)->ImageWrite[2] = (Pos >> 1) |
|
||
|
GXVA_CMD_IMAGE_WRITE |
|
||
|
GXVA_IMAGE_WRITE_WIDTH_8 |
|
||
|
GXVA_IMAGE_WRITE_HGHT_8;
|
||
|
|
||
|
PVR(p)->ImageWrite[0] = Pos |
|
||
|
GXVA_CMD_IMAGE_WRITE |
|
||
|
GXVA_IMAGE_WRITE_WIDTH_16 |
|
||
|
GXVA_IMAGE_WRITE_HGHT_16;
|
||
|
}
|
||
|
|
||
|
static INLINE void FUNC(IDCT8x8)(pvr* p,idct_block_t *Block,int Length,const uint8_t* Scan)
|
||
|
{
|
||
|
const uint8_t *ScanEnd = Scan + Length;
|
||
|
int16_t* Data = p->IZZ;
|
||
|
int v;
|
||
|
int d;
|
||
|
for (;;Data+=2)
|
||
|
{
|
||
|
do
|
||
|
{
|
||
|
if (Scan == ScanEnd) goto end;
|
||
|
v = *(Scan++);
|
||
|
d = Block[v];
|
||
|
} while (!d);
|
||
|
|
||
|
IZZDATA
|
||
|
Data[0] = (int16_t)v;
|
||
|
Data[1] = (int16_t)d;
|
||
|
}
|
||
|
|
||
|
end:
|
||
|
if (Data == p->IZZ)
|
||
|
{
|
||
|
*(int32_t*)Data = 0;
|
||
|
Data += 2;
|
||
|
}
|
||
|
Data[-2] |= 1;
|
||
|
p->M24VA_WriteIZZBlock((gx_int32*)p->IZZ,(gx_int32*)Data - (gx_int32*)p->IZZ);
|
||
|
}
|
||
|
|
||
|
static void FUNC(IDCTCopy16x16)(void* p,int x,int y,int No)
|
||
|
{
|
||
|
int FetchA,FetchB,ImageWrite;
|
||
|
|
||
|
x <<= 4;
|
||
|
y <<= 4;
|
||
|
MIRRORXY
|
||
|
|
||
|
FetchA =
|
||
|
(x << (FA_XSHIFT+1)) |
|
||
|
(y << (FA_YSHIFT+1)) |
|
||
|
GXVA_CMD_FETCH_PRED_A |
|
||
|
GXVA_FETCH_A_FIRST_PRED |
|
||
|
(No ? GXVA_FETCH_A_SRC_SEL_REF2 : GXVA_FETCH_A_SRC_SEL_REF1);
|
||
|
|
||
|
FetchB =
|
||
|
GXVA_CMD_FETCH_PRED_B |
|
||
|
GXVA_FETCH_B_ACC_Y_POS_0 |
|
||
|
GXVA_FETCH_B_ACC_X_POS_0;
|
||
|
|
||
|
ImageWrite =
|
||
|
(x << IW_XSHIFT) |
|
||
|
(y << IW_YSHIFT) |
|
||
|
GXVA_CMD_IMAGE_WRITE |
|
||
|
GXVA_IMAGE_WRITE_WIDTH_16 |
|
||
|
GXVA_IMAGE_WRITE_HGHT_16;
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(
|
||
|
GXVA_CMD_MC_OPP_TYPE |
|
||
|
GXVA_MC_TYPE_COL_PLANE_Y |
|
||
|
GXVA_MC_TYPE_BLK_WIDTH_16 |
|
||
|
GXVA_MC_TYPE_BLK_HGHT_16);
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FetchB);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FetchA);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(ImageWrite);
|
||
|
|
||
|
FetchA &= ~(GXVA_FETCH_A_PREDX_MASK|GXVA_FETCH_A_PREDY_MASK);
|
||
|
FetchA |=
|
||
|
(x << FA_XSHIFT) |
|
||
|
(y << FA_YSHIFT);
|
||
|
|
||
|
ImageWrite =
|
||
|
((x >> 1) << IW_XSHIFT) |
|
||
|
((y >> 1) << IW_YSHIFT) |
|
||
|
GXVA_CMD_IMAGE_WRITE |
|
||
|
GXVA_IMAGE_WRITE_WIDTH_8 |
|
||
|
GXVA_IMAGE_WRITE_HGHT_8;
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(
|
||
|
GXVA_CMD_MC_OPP_TYPE |
|
||
|
GXVA_MC_TYPE_COL_PLANE_U |
|
||
|
GXVA_MC_TYPE_BLK_WIDTH_8 |
|
||
|
GXVA_MC_TYPE_BLK_HGHT_8);
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FetchB);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FetchA);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(ImageWrite);
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(
|
||
|
GXVA_CMD_MC_OPP_TYPE |
|
||
|
GXVA_MC_TYPE_COL_PLANE_V |
|
||
|
GXVA_MC_TYPE_BLK_WIDTH_8 |
|
||
|
GXVA_MC_TYPE_BLK_HGHT_8);
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FetchB);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FetchA);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(ImageWrite);
|
||
|
}
|
||
|
|
||
|
static INLINE int FUNC(MVConvert)(const int16_t* MV,int x,int y)
|
||
|
{
|
||
|
return
|
||
|
(((x MVDIRX MV[MVXIDX]) << FA_XSHIFT) & FA_XMASK) |
|
||
|
(((y MVDIRY MV[MVYIDX]) << FA_YSHIFT) & FA_YMASK);
|
||
|
}
|
||
|
|
||
|
static void FUNC(IDCTMComp16x16Back)(void* p,const int16_t* MVBack,const int16_t* MVFwd)
|
||
|
{
|
||
|
int mx,my,cmd;
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(PVR(p)->MCompType|GXVA_MC_TYPE_COL_PLANE_Y|GXVA_MC_TYPE_BLK_WIDTH_16|GXVA_MC_TYPE_BLK_HGHT_16);
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|GXVA_FETCH_B_ACC_Y_POS_0|GXVA_FETCH_B_ACC_X_POS_0);
|
||
|
|
||
|
mx = PVR(p)->mx;
|
||
|
my = PVR(p)->my;
|
||
|
cmd = GXVA_CMD_FETCH_PRED_A | GXVA_FETCH_A_FIRST_PRED | GXVA_FETCH_A_SRC_SEL_REF1;
|
||
|
|
||
|
PVR(p)->FetchA[0][0] = FUNC(MVConvert)(MVBack+8,mx,my) | cmd;
|
||
|
PVR(p)->FetchA[0][1] = FUNC(MVConvert)(MVBack+10,mx,my) | cmd;
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+0,mx*2,my*2) | cmd);
|
||
|
}
|
||
|
|
||
|
static void FUNC(IDCTMComp16x16BackFwd)(void* p,const int16_t* MVBack,const int16_t* MVFwd)
|
||
|
{
|
||
|
int mx,my,cmd;
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(PVR(p)->MCompType|GXVA_MC_TYPE_COL_PLANE_Y|GXVA_MC_TYPE_BLK_WIDTH_16|GXVA_MC_TYPE_BLK_HGHT_16);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|GXVA_FETCH_B_ACC_Y_POS_0|GXVA_FETCH_B_ACC_X_POS_0);
|
||
|
|
||
|
PVR(p)->FetchA[0][0] = 0;
|
||
|
PVR(p)->FetchA[0][1] = 0;
|
||
|
PVR(p)->FetchA[1][0] = 0;
|
||
|
PVR(p)->FetchA[1][1] = 0;
|
||
|
|
||
|
mx = PVR(p)->mx;
|
||
|
my = PVR(p)->my;
|
||
|
cmd = GXVA_FETCH_A_FIRST_PRED;
|
||
|
|
||
|
if (MVBack)
|
||
|
{
|
||
|
cmd |= GXVA_CMD_FETCH_PRED_A|GXVA_FETCH_A_SRC_SEL_REF1;
|
||
|
|
||
|
PVR(p)->FetchA[0][0] = FUNC(MVConvert)(MVBack+8,mx,my) | cmd;
|
||
|
PVR(p)->FetchA[0][1] = FUNC(MVConvert)(MVBack+10,mx,my) | cmd;
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+0,mx*2,my*2) | cmd);
|
||
|
|
||
|
cmd = 0;
|
||
|
}
|
||
|
if (MVFwd)
|
||
|
{
|
||
|
cmd |= GXVA_CMD_FETCH_PRED_A|GXVA_FETCH_A_SRC_SEL_REF2;
|
||
|
|
||
|
PVR(p)->FetchA[1][0] = FUNC(MVConvert)(MVFwd+8,mx,my) | cmd;
|
||
|
PVR(p)->FetchA[1][1] = FUNC(MVConvert)(MVFwd+10,mx,my) | cmd;
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVFwd+0,mx*2,my*2) | cmd);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void FUNC(IDCTMComp8x8Back)(void* p,const int16_t* MVBack,const int16_t* MVFwd)
|
||
|
{
|
||
|
int mx = PVR(p)->mx;
|
||
|
int my = PVR(p)->my;
|
||
|
int cmd = GXVA_CMD_FETCH_PRED_A | GXVA_FETCH_A_FIRST_PRED | GXVA_FETCH_A_SRC_SEL_REF1;
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(PVR(p)->MCompType|GXVA_MC_TYPE_COL_PLANE_Y|GXVA_MC_TYPE_BLK_WIDTH_8|GXVA_MC_TYPE_BLK_HGHT_8);
|
||
|
|
||
|
PVR(p)->FetchA[0][0] = FUNC(MVConvert)(MVBack+8,mx,my) | cmd;
|
||
|
PVR(p)->FetchA[0][1] = FUNC(MVConvert)(MVBack+10,mx,my) | cmd;
|
||
|
|
||
|
mx <<= 1;
|
||
|
my <<= 1;
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_00);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_00,mx,my) | cmd);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_01);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_01,mx+16,my) | cmd);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_10);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_10,mx,my+16) | cmd);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_11);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_11,mx+16,my+16) | cmd);
|
||
|
}
|
||
|
|
||
|
static void FUNC(IDCTMComp8x8BackFwd)(void* p,const int16_t* MVBack,const int16_t* MVFwd)
|
||
|
{
|
||
|
int mx = PVR(p)->mx;
|
||
|
int my = PVR(p)->my;
|
||
|
int cmd = GXVA_FETCH_A_FIRST_PRED;
|
||
|
|
||
|
PVR(p)->FetchA[0][0] = 0;
|
||
|
PVR(p)->FetchA[0][1] = 0;
|
||
|
PVR(p)->FetchA[1][0] = 0;
|
||
|
PVR(p)->FetchA[1][1] = 0;
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(PVR(p)->MCompType|GXVA_MC_TYPE_COL_PLANE_Y|GXVA_MC_TYPE_BLK_WIDTH_8|GXVA_MC_TYPE_BLK_HGHT_8);
|
||
|
|
||
|
if (MVBack)
|
||
|
{
|
||
|
cmd |= GXVA_CMD_FETCH_PRED_A|GXVA_FETCH_A_SRC_SEL_REF1;
|
||
|
|
||
|
PVR(p)->FetchA[0][0] = FUNC(MVConvert)(MVBack+8,mx,my) | cmd;
|
||
|
PVR(p)->FetchA[0][1] = FUNC(MVConvert)(MVBack+10,mx,my) | cmd;
|
||
|
|
||
|
mx <<= 1;
|
||
|
my <<= 1;
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_00);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_00,mx,my) | cmd);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_01);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_01,mx+16,my) | cmd);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_10);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_10,mx,my+16) | cmd);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_11);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVBack+MVIDX_11,mx+16,my+16) | cmd);
|
||
|
|
||
|
mx >>= 1;
|
||
|
my >>= 1;
|
||
|
cmd = 0;
|
||
|
}
|
||
|
|
||
|
if (MVFwd)
|
||
|
{
|
||
|
cmd |= GXVA_CMD_FETCH_PRED_A|GXVA_FETCH_A_SRC_SEL_REF2;
|
||
|
|
||
|
PVR(p)->FetchA[1][0] = FUNC(MVConvert)(MVFwd+8,mx,my) | cmd;
|
||
|
PVR(p)->FetchA[1][1] = FUNC(MVConvert)(MVFwd+10,mx,my) | cmd;
|
||
|
|
||
|
mx <<= 1;
|
||
|
my <<= 1;
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_00);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVFwd+MVIDX_00,mx,my) | cmd);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_01);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVFwd+MVIDX_01,mx+16,my) | cmd);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_10);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVFwd+MVIDX_10,mx,my+16) | cmd);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(GXVA_CMD_FETCH_PRED_B|MVPOS_11);
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(MVConvert)(MVFwd+MVIDX_11,mx+16,my+16) | cmd);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static const int FUNC(Intra420)[6] =
|
||
|
{
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_00,
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_01,
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_10,
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_11,
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|GXVA_IDCT_MODE_BLK_TOP_LEFT,
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_MODE_INTRA|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|GXVA_IDCT_MODE_BLK_TOP_LEFT
|
||
|
};
|
||
|
|
||
|
static const int FUNC(Inter420)[6] =
|
||
|
{
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_00,
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_01,
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_10,
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|IDCT_11,
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|GXVA_IDCT_MODE_BLK_TOP_LEFT,
|
||
|
GXVA_CMD_IDCT_MODE|GXVA_IDCT_BLK_SIZEX_8|GXVA_IDCT_BLK_SIZEY_8|GXVA_IDCT_MODE_BLK_TOP_LEFT
|
||
|
};
|
||
|
|
||
|
static void FUNC(IDCTIntra8x8)(void* p,idct_block_t *Block,int Length,int ScanType)
|
||
|
{
|
||
|
int SubPos = PVR(p)->SubPos++;
|
||
|
if (!SubPos)
|
||
|
PVR(p)->M24VA_WriteMCCmdData(
|
||
|
GXVA_CMD_MC_OPP_TYPE|
|
||
|
GXVA_MC_TYPE_COL_PLANE_Y |
|
||
|
GXVA_MC_TYPE_BLK_WIDTH_16 |
|
||
|
GXVA_MC_TYPE_BLK_HGHT_16);
|
||
|
else
|
||
|
if (SubPos >= 4)
|
||
|
PVR(p)->M24VA_WriteMCCmdData(
|
||
|
(SubPos - 3)| // GXVA_MC_TYPE_COL_PLANE_U, GXVA_MC_TYPE_COL_PLANE_V
|
||
|
GXVA_CMD_MC_OPP_TYPE|
|
||
|
GXVA_MC_TYPE_BLK_WIDTH_8 |
|
||
|
GXVA_MC_TYPE_BLK_HGHT_8);
|
||
|
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(Intra420)[SubPos]);
|
||
|
FUNC(IDCT8x8)(PVR(p),Block,Length,ScanTable[ScanType]);
|
||
|
|
||
|
SubPos -= 3;
|
||
|
if (SubPos >= 0)
|
||
|
PVR(p)->M24VA_WriteMCCmdData(PVR(p)->ImageWrite[SubPos]);
|
||
|
}
|
||
|
|
||
|
static void FUNC(IDCTInter8x8Back)(void* p,idct_block_t *Block,int Length)
|
||
|
{
|
||
|
int SubPos = PVR(p)->SubPos++;
|
||
|
if (SubPos >= 4)
|
||
|
{
|
||
|
PVR(p)->M24VA_WriteMCCmdData(
|
||
|
PVR(p)->MCompType |
|
||
|
GXVA_MC_TYPE_BLK_WIDTH_8 |
|
||
|
GXVA_MC_TYPE_BLK_HGHT_8 |
|
||
|
(SubPos - 3)); // GXVA_MC_TYPE_COL_PLANE_U, GXVA_MC_TYPE_COL_PLANE_V
|
||
|
|
||
|
//FetchB
|
||
|
PVR(p)->M24VA_WriteMCCmdData(
|
||
|
GXVA_CMD_FETCH_PRED_B |
|
||
|
GXVA_FETCH_B_ACC_Y_POS_0 |
|
||
|
GXVA_FETCH_B_ACC_X_POS_0);
|
||
|
|
||
|
//FetchA
|
||
|
PVR(p)->M24VA_WriteMCCmdData(PVR(p)->FetchA[0][SubPos-4]);
|
||
|
}
|
||
|
|
||
|
if (Length)
|
||
|
{
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(Inter420)[SubPos]);
|
||
|
FUNC(IDCT8x8)(PVR(p),Block,Length,ScanTable[0]);
|
||
|
}
|
||
|
|
||
|
SubPos -= 3;
|
||
|
if (SubPos >= 0)
|
||
|
PVR(p)->M24VA_WriteMCCmdData(PVR(p)->ImageWrite[SubPos]);
|
||
|
}
|
||
|
|
||
|
static void FUNC(IDCTInter8x8BackFwd)(void* p,idct_block_t *Block,int Length)
|
||
|
{
|
||
|
int* FetchA;
|
||
|
int SubPos = PVR(p)->SubPos++;
|
||
|
if (SubPos >= 4)
|
||
|
{
|
||
|
PVR(p)->M24VA_WriteMCCmdData(
|
||
|
PVR(p)->MCompType |
|
||
|
GXVA_MC_TYPE_BLK_WIDTH_8 |
|
||
|
GXVA_MC_TYPE_BLK_HGHT_8 |
|
||
|
(SubPos - 3)); // GXVA_MC_TYPE_COL_PLANE_U, GXVA_MC_TYPE_COL_PLANE_V
|
||
|
|
||
|
//FetchB
|
||
|
PVR(p)->M24VA_WriteMCCmdData(
|
||
|
GXVA_CMD_FETCH_PRED_B |
|
||
|
GXVA_FETCH_B_ACC_Y_POS_0 |
|
||
|
GXVA_FETCH_B_ACC_X_POS_0);
|
||
|
|
||
|
//FetchA
|
||
|
FetchA = &PVR(p)->FetchA[0][SubPos-4];
|
||
|
if (FetchA[0])
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FetchA[0]);
|
||
|
if (FetchA[2])
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FetchA[2]);
|
||
|
}
|
||
|
|
||
|
if (Length)
|
||
|
{
|
||
|
PVR(p)->M24VA_WriteMCCmdData(FUNC(Inter420)[SubPos]);
|
||
|
FUNC(IDCT8x8)(PVR(p),Block,Length,ScanTable[0]);
|
||
|
}
|
||
|
|
||
|
SubPos -= 3;
|
||
|
if (SubPos >= 0)
|
||
|
PVR(p)->M24VA_WriteMCCmdData(PVR(p)->ImageWrite[SubPos]);
|
||
|
}
|
||
|
|
||
|
#undef FUNC
|
||
|
#undef FA_XMASK
|
||
|
#undef FA_YMASK
|
||
|
#undef FA_XSHIFT
|
||
|
#undef FA_YSHIFT
|
||
|
#undef IW_XSHIFT
|
||
|
#undef IW_YSHIFT
|
||
|
#undef MIRRORXY
|
||
|
#undef IZZDATA
|
||
|
#undef MVDIRX
|
||
|
#undef MVDIRY
|
||
|
#undef MVPOS_00
|
||
|
#undef MVIDX_00
|
||
|
#undef MVPOS_01
|
||
|
#undef MVIDX_01
|
||
|
#undef MVPOS_10
|
||
|
#undef MVIDX_10
|
||
|
#undef MVPOS_11
|
||
|
#undef MVIDX_11
|
||
|
#undef IDCT_00
|
||
|
#undef IDCT_01
|
||
|
#undef IDCT_10
|
||
|
#undef IDCT_11
|