mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
204 lines
5.9 KiB
204 lines
5.9 KiB
//***************************************************************************
|
|
// Decoder process
|
|
//
|
|
//***************************************************************************
|
|
|
|
#include "common.h"
|
|
#include "regs.h"
|
|
|
|
void decStopData( PHW_DEVICE_EXTENSION pHwDevExt, BOOL bKeep )
|
|
{
|
|
DebugPrint(( DebugLevelTrace, "TOSDVD:decStopData()\r\n" ));
|
|
|
|
pHwDevExt->ADec.AUDIO_ZR38521_STOPF();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_MUTE_ON();
|
|
|
|
if( !bKeep ) {
|
|
pHwDevExt->VPro.VPRO_VIDEO_MUTE_ON();
|
|
pHwDevExt->CPgd.CPGD_VIDEO_MUTE_ON();
|
|
}
|
|
|
|
pHwDevExt->VDec.VIDEO_DECODE_STOP();
|
|
pHwDevExt->VDec.VIDEO_SYSTEM_STOP();
|
|
pHwDevExt->VPro.SUBP_STC_OFF();
|
|
|
|
// pHwDevExt->DAck.PCIF_DMA_ABORT();
|
|
|
|
pHwDevExt->VDec.VIDEO_STD_CLEAR();
|
|
pHwDevExt->VPro.SUBP_BUFF_CLEAR();
|
|
pHwDevExt->VDec.VIDEO_SYSTEM_STOP();
|
|
pHwDevExt->VDec.VIDEO_DECODE_INT_OFF();
|
|
|
|
if( pHwDevExt->AudioMode == AUDIO_TYPE_AC3 )
|
|
pHwDevExt->ADec.AUDIO_TC6800_INIT_AC3();
|
|
else if( pHwDevExt->AudioMode == AUDIO_TYPE_PCM )
|
|
pHwDevExt->ADec.AUDIO_TC6800_INIT_PCM();
|
|
else
|
|
TRAP;
|
|
}
|
|
|
|
void decHighlight( PHW_DEVICE_EXTENSION pHwDevExt, PKSPROPERTY_SPHLI phli )
|
|
{
|
|
//h DebugPrint(( DebugLevelTrace, "TOSDVD:decHighlight\r\n" ));
|
|
|
|
UCHAR ln_ctli[4];
|
|
UCHAR px_ctlis[6];
|
|
UCHAR px_ctlie[6];
|
|
|
|
if( phli->StartX == phli->StopX && phli->StartY == phli->StopY ) {
|
|
DebugPrint(( DebugLevelTrace, "TOSDVD: Highlight Off\r\n" ));
|
|
pHwDevExt->VPro.SUBP_HLITE_OFF();
|
|
}
|
|
else {
|
|
pHwDevExt->VPro.SUBP_HLITE_ON();
|
|
ln_ctli[3] = (UCHAR)(( phli->StartY >> 8 ) & 0x03);
|
|
ln_ctli[2] = (UCHAR)(phli->StartY & 0xff);
|
|
ln_ctli[1] = (UCHAR)(( phli->StopY >> 8 ) & 0x03 | 0x20);
|
|
ln_ctli[0] = (UCHAR)(phli->StopY & 0xff);
|
|
|
|
px_ctlis[5] = (UCHAR)(( phli->StartX >> 8 ) & 0x03);
|
|
px_ctlis[4] = (UCHAR)(phli->StartX & 0xff);
|
|
px_ctlis[3] = (UCHAR)(phli->ColCon.emph2col << 4 | phli->ColCon.emph1col);
|
|
px_ctlis[2] = (UCHAR)(phli->ColCon.patcol << 4 | phli->ColCon.backcol);
|
|
px_ctlis[1] = (UCHAR)(phli->ColCon.emph2con << 4 | phli->ColCon.emph1con);
|
|
px_ctlis[0] = (UCHAR)(phli->ColCon.patcon << 4 | phli->ColCon.backcon);
|
|
|
|
px_ctlie[5] = (UCHAR)(( phli->StopX >> 8 ) & 0x03 | 0x08);
|
|
px_ctlie[4] = (UCHAR)(phli->StopX & 0xff);
|
|
px_ctlie[3] = 0;
|
|
px_ctlie[2] = 0;
|
|
px_ctlie[1] = 0;
|
|
px_ctlie[0] = 0;
|
|
|
|
//h DebugPrint( (DebugLevelTrace, "TOSDVD: %d, %d - %d, %d : %02x%02x%02x%02x\r\n",
|
|
//h phli->StartX, phli->StartY, phli->StopX, phli->StopY,
|
|
//h px_ctlis[3], px_ctlis[2], px_ctlis[1], px_ctlis[0]
|
|
//h ) );
|
|
|
|
pHwDevExt->VPro.SUBP_SET_PXCTLIE( px_ctlie );
|
|
pHwDevExt->VPro.SUBP_SET_PXCTLIS( px_ctlis );
|
|
pHwDevExt->VPro.SUBP_SET_LNCTLI( ln_ctli );
|
|
}
|
|
}
|
|
|
|
void decDisableInt( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
pHwDevExt->VDec.VIDEO_ALL_INT_OFF();
|
|
pHwDevExt->DAck.PCIF_VSYNC_OFF();
|
|
}
|
|
|
|
void decGenericNormal( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: decGenericNormal\r\n") );
|
|
|
|
ULONG TrickMode;
|
|
ULONG dwSTC;
|
|
|
|
if( pHwDevExt->AudioMode == AUDIO_TYPE_AC3 )
|
|
pHwDevExt->ADec.AUDIO_TC6800_INIT_AC3();
|
|
else if( pHwDevExt->AudioMode == AUDIO_TYPE_PCM )
|
|
pHwDevExt->ADec.AUDIO_TC6800_INIT_PCM();
|
|
else
|
|
TRAP;
|
|
|
|
pHwDevExt->ADec.AUDIO_ZR38521_STOPF();
|
|
pHwDevExt->VDec.VIDEO_PRSO_PS1();
|
|
pHwDevExt->VDec.VIDEO_PLAY_NORMAL();
|
|
|
|
// Bad loop !!
|
|
DWORD st, et;
|
|
|
|
st = GetCurrentTime_ms();
|
|
for( ; ; ) {
|
|
KeStallExecutionProcessor( 1 );
|
|
et = GetCurrentTime_ms();
|
|
|
|
TrickMode = pHwDevExt->VDec.VIDEO_GET_TRICK_MODE();
|
|
if( TrickMode == 0x07 )
|
|
break;
|
|
|
|
if( st + 2000 < et ) {
|
|
TRAP;
|
|
break;
|
|
}
|
|
}
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: wait %dms\r\n", et - st ) );
|
|
|
|
dwSTC = pHwDevExt->VDec.VIDEO_GET_STCA();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_VDSCR_ON( dwSTC );
|
|
pHwDevExt->ADec.AUDIO_ZR38521_PLAY();
|
|
pHwDevExt->VDec.VIDEO_UFLOW_INT_ON();
|
|
|
|
DebugPrint(( DebugLevelTrace, "TOSDVD: STC 0x%x( %d )\r\n", dwSTC, dwSTC ));
|
|
}
|
|
|
|
void decGenericFreeze( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
DebugPrint(( DebugLevelTrace, "TOSDVD: decGenericFreeze\r\n" ));
|
|
pHwDevExt->VDec.VIDEO_PLAY_FREEZE();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_MUTE_ON();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_STOP();
|
|
}
|
|
|
|
void decGenericSlow( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: decGenericSlow\r\n") );
|
|
pHwDevExt->VDec.VIDEO_PRSO_PS1();
|
|
pHwDevExt->VPro.SUBP_SET_AUDIO_NON();
|
|
pHwDevExt->VDec.VIDEO_PLAY_SLOW( (UCHAR)(pHwDevExt->Rate/10000) );
|
|
pHwDevExt->ADec.AUDIO_ZR38521_STOP();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_MUTE_ON();
|
|
pHwDevExt->VDec.VIDEO_UFLOW_INT_ON();
|
|
}
|
|
|
|
void decStopForFast( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
DebugPrint(( DebugLevelTrace, "TOSDVD: decGenericFast\r\n" ));
|
|
pHwDevExt->VDec.VIDEO_UFLOW_INT_OFF();
|
|
pHwDevExt->VDec.VIDEO_SET_STCA( (ULONG)(pHwDevExt->StartTime / 1000 * 9) );
|
|
pHwDevExt->VDec.VIDEO_PRSO_NON();
|
|
pHwDevExt->VDec.VIDEO_PLAY_FAST( FAST_ONLYI );
|
|
pHwDevExt->ADec.AUDIO_ZR38521_MUTE_ON();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_STOP();
|
|
pHwDevExt->VPro.SUBP_MUTE_ON();
|
|
pHwDevExt->VPro.SUBP_STC_OFF();
|
|
pHwDevExt->VDec.VIDEO_DECODE_STOP();
|
|
}
|
|
|
|
void decResumeForFast( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
pHwDevExt->VDec.VIDEO_STD_CLEAR();
|
|
pHwDevExt->ADec.AUDIO_ZR38521_STOPF();
|
|
pHwDevExt->VPro.SUBP_BUFF_CLEAR();
|
|
pHwDevExt->VDec.VIDEO_DECODE_START();
|
|
}
|
|
|
|
void decFastNormal( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: decFastNormal\r\n") );
|
|
pHwDevExt->VDec.VIDEO_PRSO_PS1();
|
|
pHwDevExt->dwSTCtemp = pHwDevExt->VDec.VIDEO_GET_STCA();
|
|
}
|
|
|
|
void decFastSlow( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
DebugPrint( (DebugLevelTrace, "TOSDVD: decFastSlow\r\n") );
|
|
pHwDevExt->VDec.VIDEO_PRSO_PS1();
|
|
pHwDevExt->VPro.SUBP_SET_AUDIO_NON();
|
|
pHwDevExt->dwSTCtemp = pHwDevExt->VDec.VIDEO_GET_STCA();
|
|
}
|
|
|
|
void decFastFreeze( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
DebugPrint(( DebugLevelTrace, "TOSDVD: decFastFreeze\r\n" ));
|
|
|
|
pHwDevExt->dwSTCinPause = pHwDevExt->VDec.VIDEO_GET_STCA();
|
|
pHwDevExt->VDec.VIDEO_PLAY_FREEZE();
|
|
}
|
|
|
|
void decFreezeFast( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
DebugPrint(( DebugLevelTrace, "TOSDVD: decFreezeFast\r\n" ));
|
|
pHwDevExt->VDec.VIDEO_SET_STCA( pHwDevExt->dwSTCinPause );
|
|
pHwDevExt->VDec.VIDEO_PLAY_FAST( FAST_ONLYI );
|
|
}
|