Are you using the VI_H_START_REG and VI_V_START_REG registers? This is the current code from daedalus - it seems to work pretty well for all the roms I've tested - both pal and ntsc.
Code:
u32 dwScaleX = *g_GraphicsInfo.xVI_X_SCALE_REG & 0xFFF;
u32 dwScaleY = *g_GraphicsInfo.xVI_Y_SCALE_REG & 0xFFF;
f32 fScaleX = (float)dwScaleX / (1<<10);
f32 fScaleY = (float)dwScaleY / (1<<10);
u32 dwHStartReg = *g_GraphicsInfo.xVI_H_START_REG;
u32 dwVStartReg = *g_GraphicsInfo.xVI_V_START_REG;
u32 hstart = dwHStartReg >> 16;
u32 hend = dwHStartReg & 0xffff;
//DBGConsole_Msg( 0, "h start/end %d %d", hstart, hend ); // 128 725 - 597
u32 vstart = dwVStartReg >> 16;
u32 vend = dwVStartReg & 0xffff;
//DBGConsole_Msg( 0, "v start/end %d %d", vstart, vend ); // 56 501 - 445
mViWidth = (hend-hstart) * fScaleX;
mViHeight = ((vend-vstart)/2) * fScaleY; // /2 is because vertical is measured in half-lines