📄 dvdcmd.c
字号:
}
}
/*
** AudioEvent ()
**
** receives notification for audio clock enable / disable events
**
** Arguments:
**
**
**
** Returns:
**
** Side Effects:
*/
NTSTATUS STREAMAPI AudioEvent( PHW_EVENT_DESCRIPTOR pEvent )
{
PUCHAR pCopy = (PUCHAR)( pEvent->EventEntry + 1 );
PMYTIME pmyt = (PMYTIME)pCopy;
PUCHAR pSrc = (PUCHAR)pEvent->EventData;
ULONG cCopy;
DebugPrint(( DebugLevelVerbose, "DVDTS:AudioEvent\r\n" ));
if( pEvent->Enable ) {
switch( pEvent->EventEntry->EventItem->EventId ) {
case KSEVENT_CLOCK_POSITION_MARK:
cCopy = sizeof( KSEVENT_TIME_MARK );
break;
case KSEVENT_CLOCK_INTERVAL_MARK:
cCopy = sizeof( KSEVENT_TIME_INTERVAL );
break;
default:
TRAP;
return( STATUS_NOT_IMPLEMENTED );
}
if( pEvent->EventEntry->EventItem->DataInput != cCopy ) {
TRAP;
return( STATUS_INVALID_BUFFER_SIZE );
}
//
// copy the input buffer
//
for( ; cCopy > 0; cCopy-- ) {
*pCopy++ = *pSrc++;
}
if( pEvent->EventEntry->EventItem->EventId == KSEVENT_CLOCK_INTERVAL_MARK) {
pmyt->LastTime = 0;
}
}
return( STATUS_SUCCESS );
}
/*
** CycEvent ()
**
** receives notification for stream event enable/ disable
**
** Arguments:}
**
**
**
** Returns:
**
** Side Effects:
*/
NTSTATUS STREAMAPI CycEvent( PHW_EVENT_DESCRIPTOR pEvent )
{
PSTREAMEX pstrm = (PSTREAMEX)( pEvent->StreamObject->HwStreamExtension );
DebugPrint( (DebugLevelTrace, "DVDTS:CycEvent\r\n") );
if( pEvent->Enable ) {
pstrm->EventCount++;
}
else {
pstrm->EventCount--;
}
return( STATUS_SUCCESS );
}
/*
** VideoReceiveDataPacket()
*/
VOID STREAMAPI VideoReceiveDataPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
PULONG pCount = &(pHwDevExt->XferStartCount);
DebugPrint( (DebugLevelVerbose, "DVDTS:VideoReceiveDataPacket---------\r\n") );
switch( pSrb->Command ){
case SRB_WRITE_DATA:
DebugPrint( (DebugLevelVerbose, "DVDTS: SRB_WRITE_DATA\r\n") );
{ // Temporary
ULONG i;
PKSSTREAM_HEADER pStruc;
for( i = 0; i < pSrb->NumberOfBuffers; i++ ) {
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[i];
if( !( pStruc->OptionsFlags & (KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY |
KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY |
KSSTREAM_HEADER_OPTIONSF_TYPECHANGED ))) {
// DebugPrint(( DebugLevelTrace, "DVDTS: *** Video # 0x%x\r\n",
// pStruc->xHdr.MediaSpecificFlags >> 16 ));
}
if( pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY ) {
DebugPrint(( DebugLevelTrace, "DVDTS: DATADISCONTINUITY(Video)\r\n" ));
VideoDataDiscontinuity( pHwDevExt );
pHwDevExt->bStopCC = TRUE;
decClosedCaptionOff( pHwDevExt );
}
if( pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY ) {
DebugPrint(( DebugLevelTrace, "DVDTS: TIMEDISCONTINUITY(Video)\r\n" ));
pHwDevExt->TimeDiscontFlagCount++;
DebugPrint(( DebugLevelTrace, "DVDTS: TimeDiscontFlagCount=%ld\r\n", pHwDevExt->TimeDiscontFlagCount ));
if( pHwDevExt->TimeDiscontFlagCount >= pHwDevExt->cOpenInputStream ) {
StreamClassScheduleTimer(
NULL,
pHwDevExt,
1,
(PHW_TIMER_ROUTINE)MenuDecodeStart,
pHwDevExt
);
}
}
if( pStruc->TypeSpecificFlags & KS_AM_UseNewCSSKey ) {
pHwDevExt->CppFlagCount++;
DebugPrint(( DebugLevelTrace, "DVDTS: CppFlagCount=%ld\r\n", pHwDevExt->CppFlagCount ));
if( pHwDevExt->CppFlagCount >= pHwDevExt->cOpenInputStream + 1 )
SetCppFlag( pHwDevExt );
}
}
for( i = 0; i < pSrb->NumberOfBuffers; i++ ) {
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[i];
DebugPrint( (DebugLevelVerbose, "DVDTS: VideoPacet Flag = 0x%x\r\n", pStruc->OptionsFlags ));
if( pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TYPECHANGED ) {
DebugPrint(( DebugLevelTrace, "DVDTS:TYPECHANGE(Video)\r\n" ));
if( pStruc->DataUsed >= sizeof(KSDATAFORMAT) + sizeof(KS_MPEGVIDEOINFO2) ) {
ProcessVideoFormat( (PKSDATAFORMAT)pStruc->Data, pHwDevExt );
}
else {
TRAP;
}
i = pSrb->NumberOfBuffers;
break;
}
if( pStruc->DataUsed )
break;
}
if( i == pSrb->NumberOfBuffers ) {
pSrb->Status = STATUS_SUCCESS;
break;
}
}
// DebugDumpKSTIME( pSrb );
// if( pHwDevExt->Rate < 10000 ) {
// DebugPrint( (DebugLevelTrace, "DVDTS: Change PTS for F.F. (Video)\r\n" ) );
// }
FastSlowControl( pSrb );
if( pHwDevExt->bVideoQueue == TRUE ) {
pHwDevExt->bStopCC = FALSE;
DeviceQueue_put_video( pHwDevExt, pSrb );
}
else {
pSrb->Status = STATUS_SUCCESS;
DebugPrint( (DebugLevelTrace, "DVDTS: VideoData was Discarded\r\n" ) );
break;
}
// if( *pCount <= 24 )
// (*pCount)++;
// if( *pCount == 24 )
// DMAxfer( pHwDevExt, 0x03 );
// else if( (*pCount) == 25 ) {
if( pHwDevExt->pSrbDMA0 == NULL && pHwDevExt->pSrbDMA1 == NULL )
PreDMAxfer( pHwDevExt/*, 0x03 */);
// }
// for Debug
// if( pHwDevExt->Rate < 10000 ) {
// DebugPrint( (DebugLevelTrace, "DVDTS: ReadyForNextStreamDataRequest(Video)\r\n" ) );
// }
// end
StreamClassStreamNotification( ReadyForNextStreamDataRequest,
pSrb->StreamObject );
return;
default:
DebugPrint( (DebugLevelTrace, "DVDTS: default %d(0x%x)\r\n", pSrb->Command, pSrb->Command ) );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
}
DebugPrint(( DebugLevelTrace, "DVDTS:---------VideoReceiveDataPacket( SRB has no data)\r\n" ));
StreamClassStreamNotification( ReadyForNextStreamDataRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
/*
** VideoReceiveCtrlPacket()
*/
VOID STREAMAPI VideoReceiveCtrlPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
DebugPrint( (DebugLevelTrace, "DVDTS:VideoReceiveCtrlPacket---------\r\n") );
switch( pSrb->Command ){
case SRB_SET_STREAM_STATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_SET_STREAM_STATE\r\n") );
switch( pSrb->CommandData.StreamState ) {
case KSSTATE_STOP:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_STOP\r\n") );
StopData( pHwDevExt );
SetVideoRateDefault( pHwDevExt );
pHwDevExt->bVideoQueue = FALSE;
pHwDevExt->bAudioQueue = FALSE;
pHwDevExt->bSubpicQueue = FALSE;
break;
case KSSTATE_PAUSE:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_PAUSE\r\n") );
PauseTime = GetSystemTime();
if( !fStarted ) {
fStarted = TRUE;
LastStamp = 0;
StartSys = LastSysTime = PauseTime;
}
fClkPause = TRUE;
SetPlayMode( pHwDevExt, PLAY_MODE_FREEZE );
break;
case KSSTATE_RUN:
DebugPrint( (DebugLevelTrace, "DVDTS: KSSTATE_RUN\r\n") );
if( !fStarted && !fProgrammed ) {
LastStamp = 0;
StartSys = LastSysTime = GetSystemTime();
}
fStarted = TRUE;
fClkPause = FALSE;
SetPlayMode( pHwDevExt, decGetVideoRunMode( pHwDevExt ) );
break;
}
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_GET_STREAM_STATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_GET_STREAM_STATE\r\n") );
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_GET_STREAM_PROPERTY:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_GET_STREAM_PROPERTY\r\n") );
GetVideoProperty( pSrb );
if( pSrb->Status != STATUS_PENDING ) {
StreamClassStreamNotification( ReadyForNextStreamControlRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
return;
case SRB_SET_STREAM_PROPERTY:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_SET_STREAM_PROPERTY\r\n") );
SetVideoProperty( pSrb );
if( pSrb->Status != STATUS_PENDING ) {
StreamClassStreamNotification( ReadyForNextStreamControlRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
return;
case SRB_OPEN_MASTER_CLOCK:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_OPEN_MASTER_CLOCK\r\n") );
hMaster = pSrb->CommandData.MasterClockHandle;
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_CLOSE_MASTER_CLOCK:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_CLOSE_MASTER_CLOCK\r\n") );
hMaster = pSrb->CommandData.MasterClockHandle;
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_INDICATE_MASTER_CLOCK:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_INDICATE_MASTER_CLOCK\r\n") );
hClk = pSrb->CommandData.MasterClockHandle;
pSrb->Status = STATUS_SUCCESS;
break;
case SRB_UNKNOWN_STREAM_COMMAND:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_UNKNOWN_STREAM_COMMAND\r\n") );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
case SRB_SET_STREAM_RATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_SET_STREAM_RATE\r\n") );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
case SRB_PROPOSE_DATA_FORMAT:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_PROPOSE_DATA_FORMAT\r\n") );
VideoQueryAccept( pSrb );
break;
case SRB_PROPOSE_STREAM_RATE:
DebugPrint( (DebugLevelTrace, "DVDTS: SRB_PROPOSE_STREAM_RATE\r\n") );
pSrb->Status = STATUS_NOT_IMPLEMENTED;
// SetRateChange( pSrb );
break;
default:
DebugPrint( (DebugLevelTrace, "DVDTS: default %d(0x%x)\r\n", pSrb->Command, pSrb->Command ) );
TRAP;
pSrb->Status = STATUS_NOT_IMPLEMENTED;
break;
}
StreamClassStreamNotification( ReadyForNextStreamControlRequest,
pSrb->StreamObject );
StreamClassStreamNotification( StreamRequestComplete,
pSrb->StreamObject,
pSrb );
}
/*
** AudioReceiveDataPacket()
*/
VOID STREAMAPI AudioReceiveDataPacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
DebugPrint( (DebugLevelVerbose, "DVDTS:AudioReceiveDataPacket---------\r\n") );
switch( pSrb->Command ){
case SRB_WRITE_DATA:
DebugPrint( (DebugLevelVerbose, "DVDTS: SRB_WRITE_DATA\r\n") );
{ // Temporary
ULONG i;
PKSSTREAM_HEADER pStruc;
for( i = 0; i < pSrb->NumberOfBuffers; i++ ) {
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[i];
if( !( pStruc->OptionsFlags & (KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY |
KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY |
KSSTREAM_HEADER_OPTIONSF_TYPECHANGED ))) {
// DebugPrint(( DebugLevelTrace, "DVDTS: *** Audio # 0x%x\r\n",
// pStruc->xHdr.MediaSpecificFlags >> 16 ));
}
if( pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY ) {
DebugPrint(( DebugLevelTrace, "DVDTS: DATADISCONTINUITY(Audio)\r\n" ));
AudioDataDiscontinuity( pHwDevExt );
}
if( pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY ) {
DebugPrint(( DebugLevelTrace, "DVDTS: TIMEDISCONTINUITY(Audio)\r\n" ));
pHwDevExt->TimeDiscontFlagCount++;
DebugPrint(( DebugLevelTrace, "DVDTS: TimeDiscontFlagCount=%ld\r\n", pHwDevExt->TimeDiscontFlagCount ));
if( pHwDevExt->TimeDiscontFlagCount >= pHwDevExt->cOpenInputStream ) {
StreamClassScheduleTimer(
NULL,
pHwDevExt,
1,
(PHW_TIMER_ROUTINE)MenuDecodeStart,
pHwDevExt
);
}
}
if( pStruc->TypeSpecificFlags & KS_AM_UseNewCSSKey ) {
pHwDevExt->CppFlagCount++;
DebugPrint(( DebugLevelTrace, "DVDTS: CppFlagCount=%ld\r\n", pHwDevExt->CppFlagCount ));
if( pHwDevExt->CppFlagCount >= pHwDevExt->cOpenInputStream + 1 )
SetCppFlag( pHwDevExt );
}
}
for( i = 0; i < pSrb->NumberOfBuffers; i++ ) {
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[i];
DebugPrint( (DebugLevelVerbose, "DVDTS: AudioPacket Flag = 0x%x\r\n", pStruc->OptionsFlags ));
if( pStruc->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TYPECHANGED ) {
DebugPrint(( DebugLevelTrace, "DVDTS:TYPECHANGE(Audio)\r\n" ));
// if( pStruc->DataUsed >= sizeof(KSDATAFORMAT) + sizeof(KS_MPEGVIDEOINFO2) ) {
if( pStruc->DataUsed ) {
ProcessAudioFormat( (PKSDATAFORMAT)pStruc->Data, pHwDevExt );
}
else {
TRAP;
}
i = pSrb->NumberOfBuffers;
break;
}
if( pStruc->DataUsed )
break;
}
if( i == pSrb->NumberOfBuffers ) {
pSrb->Status = STATUS_SUCCESS;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -