IPU hack removal - Well, still one bit i'm not sure on, but everything else should be correct. Hack was due to differences between IPU and the MPEG standard.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@4074 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
refraction 2010-12-03 23:36:51 +00:00
parent f2c0ff23a9
commit a7676a2b26
2 changed files with 13 additions and 14 deletions

View File

@ -440,10 +440,9 @@ static __fi bool ipuVDEC(u32 val)
// very choppy (basically only decoding/updating every 30th frame or so). So yeah, // very choppy (basically only decoding/updating every 30th frame or so). So yeah,
// someone with knowledge on the subject please feel free to explain this one. :) --air // someone with knowledge on the subject please feel free to explain this one. :) --air
ipuRegs.cmd.DATA &= 0xFFFF; // The upper bits are the "length" of the decoded command, where the lower is the address.
ipuRegs.cmd.DATA |= 0x10000; // This is due to differences with IPU and the MPEG standard. See get_macroblock_address_increment().
//ipuRegs.cmd.DATA = (ipuRegs.cmd.DATA & 0xFFFF) | ((decoder.bitstream_bits + 16) << 16);
ipuRegs.ctrl.ECD = (ipuRegs.cmd.DATA == 0); ipuRegs.ctrl.ECD = (ipuRegs.cmd.DATA == 0);
case 1: case 1:

View File

@ -135,14 +135,13 @@ int get_macroblock_modes()
{ {
macroblock_modes |= GETBITS(2) * MOTION_TYPE_BASE; macroblock_modes |= GETBITS(2) * MOTION_TYPE_BASE;
} }
return (macroblock_modes | (tab->len << 16));
return macroblock_modes;
} }
else if (decoder.frame_pred_frame_dct) else if (decoder.frame_pred_frame_dct)
{ {
/* if (! (macroblock_modes & MACROBLOCK_INTRA)) */ /* if (! (macroblock_modes & MACROBLOCK_INTRA)) */
macroblock_modes |= MC_FRAME; macroblock_modes |= MC_FRAME;
return macroblock_modes; return (macroblock_modes | (tab->len << 16));
} }
else else
{ {
@ -155,15 +154,15 @@ int get_macroblock_modes()
intra: intra:
macroblock_modes |= GETBITS(1) * DCT_TYPE_INTERLACED; macroblock_modes |= GETBITS(1) * DCT_TYPE_INTERLACED;
} }
return (macroblock_modes | (tab->len << 16));
return macroblock_modes;
} }
case D_TYPE: case D_TYPE:
macroblock_modes = GETBITS(1); macroblock_modes = GETBITS(1);
//I suspect (as this is actually a 2 bit command) that this should be getbits(2)
//additionally, we arent dumping any bits here when i think we should be, need a game to test. (Refraction)
if (macroblock_modes == 0) return 0; // error if (macroblock_modes == 0) return 0; // error
return MACROBLOCK_INTRA; return (MACROBLOCK_INTRA | (1 << 16));
default: default:
return 0; return 0;
@ -222,7 +221,8 @@ int __fi get_motion_delta(const int f_code)
sign = SBITS(1); sign = SBITS(1);
DUMPBITS(1); DUMPBITS(1);
return (delta ^ sign) - sign;
return (((delta ^ sign) - sign) | (tab->len << 16));
} }
int __fi get_dmv() int __fi get_dmv()
@ -246,13 +246,13 @@ int get_macroblock_address_increment()
{ {
case 8: /* macroblock_escape */ case 8: /* macroblock_escape */
DUMPBITS(11); DUMPBITS(11);
return 0x23; return 0xb0023;
case 15: /* macroblock_stuffing (MPEG1 only) */ case 15: /* macroblock_stuffing (MPEG1 only) */
if (decoder.mpeg1) if (decoder.mpeg1)
{ {
DUMPBITS(11); DUMPBITS(11);
return 0x22; return 0xb0022;
} }
default: default:
@ -261,7 +261,7 @@ int get_macroblock_address_increment()
DUMPBITS(mba->len); DUMPBITS(mba->len);
return mba->mba + 1; return ((mba->mba + 1) | (mba->len << 16));
} }
static __fi int get_luma_dc_dct_diff() static __fi int get_luma_dc_dct_diff()