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.
2203 lines
58 KiB
2203 lines
58 KiB
/******************************************************************************\
|
|
* *
|
|
* ADAPTER.C - Adapter control related code. *
|
|
* *
|
|
* Copyright (c) C-Cube Microsystems 1996 - 1999 *
|
|
* All Rights Reserved. *
|
|
* *
|
|
* Use of C-Cube Microsystems code is governed by terms and conditions *
|
|
* stated in the accompanying licensing statement. *
|
|
* *
|
|
\******************************************************************************/
|
|
|
|
|
|
#include "Headers.h"
|
|
|
|
#pragma hdrstop
|
|
#include "vidstrm.h"
|
|
#include "audstrm.h"
|
|
#include "sbpstrm.h"
|
|
#include "ccaption.h"
|
|
|
|
#ifdef ENCORE
|
|
#include "avwinwdm.h"
|
|
#include "anlgstrm.h"
|
|
#else
|
|
#include "vpestrm.h"
|
|
#include "dataXfer.h"
|
|
#endif
|
|
|
|
#include "zivaguid.h"
|
|
#include "boardio.h"
|
|
#include "bmaster.h"
|
|
#include "cl6100.h"
|
|
|
|
#include "Hwif.h"
|
|
|
|
static VOID HwInitialize( IN PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
static VOID HwUninitialize( IN PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
static VOID AdapterOpenStream( PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
static VOID AdapterCloseStream( PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
static VOID AdapterStreamInfo( PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
static VOID AdapterGetDataIntersection( PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
|
|
static VOID BeginHwInitialize( IN PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
static VOID HighPriorityInit( IN PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
static VOID PassiveInit( IN PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
static VOID HighPriorityInit( IN PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
|
|
VOID STREAMAPI AdapterReleaseCurrentSrb( PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
|
|
#pragma alloc_text( page, HwInitialize )
|
|
#pragma alloc_text( page, HwUninitialize )
|
|
|
|
|
|
#if 0
|
|
static void STREAMAPI CreateFile(PHW_STREAM_REQUEST_BLOCK pSrb );
|
|
OBJECT_ATTRIBUTES InitializedAttributes;
|
|
IO_STATUS_BLOCK IOStatusBlock;
|
|
HANDLE Handle;
|
|
WCHAR wPath[] = L"ohm.dat";
|
|
UNICODE_STRING pathUnicodeString;
|
|
LARGE_INTEGER AllocSize ;
|
|
long dwCountTotal=0;
|
|
#endif
|
|
|
|
PHW_DEVICE_EXTENSION pDevEx;
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
Adapter Based Request Handling Routines
|
|
|
|
******************************************************************************/
|
|
|
|
/*
|
|
** AdapterReceivePacket()
|
|
**
|
|
** Main entry point for receiving adapter based request SRBs. This routine
|
|
** will always be called at High Priority.
|
|
**
|
|
** Note: This is an asyncronous entry point. The request does not complete
|
|
** on return from this function, the request only completes when a
|
|
** StreamClassDeviceNotification on this request block, of type
|
|
** DeviceRequestComplete, is issued.
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - Pointer to the STREAM_REQUEST_BLOCK
|
|
** pSrb->HwDeviceExtension - will be the hardware device extension for
|
|
** as initialised in HwInitialise
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
VOID STREAMAPI AdapterReceivePacket( IN PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->CommandData.ConfigInfo->HwDeviceExtension;
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: Begin AdapterReceivePacket->" ));
|
|
|
|
#ifdef DEBUG
|
|
if( KeGetCurrentIrql() <= DISPATCH_LEVEL )
|
|
{
|
|
DebugPrint(( DebugLevelError, "IRQL is screwed!\n" ));
|
|
ASSERT( FALSE );
|
|
MonoOutSetBlink( TRUE );
|
|
MonoOutStr( "IRQL" );
|
|
MonoOutSetBlink( FALSE );
|
|
}
|
|
#endif
|
|
|
|
switch( pSrb->Command )
|
|
{
|
|
case SRB_INITIALIZE_DEVICE:
|
|
DebugPrint(( DebugLevelVerbose, "SRB_INITIALIZE_DEVICE\n" ));
|
|
|
|
// HwInitialize( pSrb );
|
|
// break;
|
|
BeginHwInitialize( pSrb ); //MS update
|
|
return;
|
|
|
|
|
|
case SRB_UNINITIALIZE_DEVICE:
|
|
DebugPrint(( DebugLevelVerbose, "SRB_UNINITIALIZE_DEVICE\n" ));
|
|
HwUninitialize( pSrb );
|
|
break;
|
|
|
|
case SRB_OPEN_STREAM:
|
|
DebugPrint(( DebugLevelVerbose, "SRB_OPEN_STREAM\n" ));
|
|
AdapterOpenStream( pSrb );
|
|
break;
|
|
|
|
case SRB_CLOSE_STREAM:
|
|
DebugPrint(( DebugLevelVerbose, "SRB_CLOSE_STREAM\n" ));
|
|
AdapterCloseStream( pSrb );
|
|
break;
|
|
|
|
case SRB_GET_STREAM_INFO:
|
|
DebugPrint(( DebugLevelVerbose, "SRB_GET_STREAM_INFO\n" ));
|
|
AdapterStreamInfo( pSrb );
|
|
break;
|
|
|
|
case SRB_GET_DATA_INTERSECTION:
|
|
DebugPrint(( DebugLevelVerbose, "SRB_GET_DATA_INTERSECTION\n" ));
|
|
AdapterGetDataIntersection( pSrb );
|
|
break;
|
|
|
|
|
|
case SRB_GET_DEVICE_PROPERTY:
|
|
AdapterGetProperty( pSrb );
|
|
MonoOutStr("SRB_GET_DEVICE_PROPERTY");
|
|
break;
|
|
|
|
case SRB_SET_DEVICE_PROPERTY:
|
|
AdapterSetProperty( pSrb );
|
|
MonoOutStr("SRB_SET_DEVICE_PROPERTY");
|
|
break;
|
|
|
|
|
|
|
|
case SRB_CHANGE_POWER_STATE:
|
|
DebugPrint(( DebugLevelVerbose, "SRB_CHANGE_POWER_STATE\n" ));
|
|
#if defined(DECODER_DVDPC)
|
|
if (pSrb->CommandData.DeviceState == PowerDeviceD0)
|
|
{
|
|
//
|
|
// bugbug - need to turn power back on here.
|
|
//
|
|
// Vinod.
|
|
//sri ZivaHw_Initialize(pHwDevExt);
|
|
// Commented for bug fix on GateWay Chameleon
|
|
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// bugbug - need to turn power off here, as well as disabling
|
|
// interrupts.
|
|
//
|
|
//DisableIT();
|
|
}
|
|
#endif
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
break;
|
|
|
|
case SRB_PAGING_OUT_DRIVER:
|
|
DebugPrint(( DebugLevelVerbose, "SRB_PAGING_OUT_DRIVER\n" ));
|
|
//TRAP
|
|
//DisableIT();
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
break;
|
|
|
|
|
|
default:
|
|
DebugPrint(( DebugLevelInfo, "!!!! UNKNOWN COMMAND !!!! :::> %X\n", pSrb->Command ));
|
|
// This is a request that we do not understand. Indicate invalid
|
|
// command and complete the request
|
|
pSrb->Status = STATUS_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
AdapterReleaseRequest( pSrb );
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: End AdapterReceivePacket\n" ));
|
|
}
|
|
|
|
/******************************************************************************/
|
|
/******************* Adapter Initialization Section *************************/
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
/*
|
|
** BeginHwInitialize()
|
|
**
|
|
** Stub for the init sequence
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSRB - pointer to the request packet for the initialise command
|
|
**
|
|
** ->ConfigInfo - provides the I/O port, memory windows, IRQ, and DMA levels
|
|
** that should be used to access this instance of the device
|
|
**
|
|
** Returns:
|
|
**
|
|
**
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
static VOID BeginHwInitialize( IN PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PPORT_CONFIGURATION_INFORMATION ConfigInfo = pSrb->CommandData.ConfigInfo;
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)ConfigInfo->HwDeviceExtension;
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: BeginHwInitialize()\n" ));
|
|
StreamClassCallAtNewPriority(NULL, pHwDevExt, Low, PassiveInit, pSrb);
|
|
return;
|
|
|
|
}
|
|
/*
|
|
** PassiveInit()
|
|
**
|
|
** Passive level callback for the init sequence
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSRB - pointer to the request packet for the initialise command
|
|
**
|
|
** ->ConfigInfo - provides the I/O port, memory windows, IRQ, and DMA levels
|
|
** that should be used to access this instance of the device
|
|
**
|
|
** Returns:
|
|
**
|
|
**
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
static VOID PassiveInit( IN PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PPORT_CONFIGURATION_INFORMATION ConfigInfo = pSrb->CommandData.ConfigInfo;
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)ConfigInfo->HwDeviceExtension;
|
|
|
|
InitializeHost(pSrb);
|
|
StreamClassCallAtNewPriority(NULL, pHwDevExt, LowToHigh, HighPriorityInit, pSrb);
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
** HighPriorityInit()
|
|
**
|
|
** High priority callback for the init sequence
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSRB - pointer to the request packet for the initialise command
|
|
**
|
|
** ->ConfigInfo - provides the I/O port, memory windows, IRQ, and DMA levels
|
|
** that should be used to access this instance of the device
|
|
**
|
|
** Returns:
|
|
**
|
|
**
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
static VOID HighPriorityInit( IN PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
|
|
HwInitialize(pSrb);
|
|
|
|
AdapterReleaseRequest( pSrb );
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
** HwInitialize()
|
|
**
|
|
** Initializes an adapter accessed through the information provided in the
|
|
** ConfigInfo structure
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSRB - pointer to the request packet for the initialise command
|
|
**
|
|
** ->ConfigInfo - provides the I/O port, memory windows, IRQ, and DMA levels
|
|
** that should be used to access this instance of the device
|
|
**
|
|
** Returns:
|
|
**
|
|
** STATUS_SUCCESS - if the card initializes correctly
|
|
** STATUS_NO_SUCH_DEVICE - or other if the card is not found, or does
|
|
** not initialize correctly.
|
|
**
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
static VOID HwInitialize( IN PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PPORT_CONFIGURATION_INFORMATION ConfigInfo = pSrb->CommandData.ConfigInfo;
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)ConfigInfo->HwDeviceExtension;
|
|
ULONG dwSize;
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: Begin HwInitialize()\n" ));
|
|
|
|
// InitializeHost(pSrb);
|
|
|
|
pHwDevExt->bVideoStreamOpened = FALSE;
|
|
pHwDevExt->bAudioStreamOpened = FALSE;
|
|
pHwDevExt->bSubPictureStreamOpened = FALSE;
|
|
pHwDevExt->bOverlayInitialized = FALSE;
|
|
pHwDevExt->nAnalogStreamOpened = 0;
|
|
pHwDevExt->iTotalOpenedStreams = 0;
|
|
|
|
pHwDevExt->bVideoCanAuthenticate = FALSE;
|
|
pHwDevExt->bAudioCanAuthenticate = FALSE;
|
|
pHwDevExt->bSubPictureCanAuthenticate = FALSE;
|
|
pHwDevExt->iStreamToAuthenticateOn = -1;
|
|
|
|
pHwDevExt->bValidSPU = FALSE;
|
|
pHwDevExt->hli.StartPTM = 0;
|
|
|
|
pHwDevExt->pCurrentVideoSrb = NULL;
|
|
pHwDevExt->dwCurrentVideoSample = 0;
|
|
pHwDevExt->pCurrentAudioSrb = NULL;
|
|
pHwDevExt->dwCurrentAudioSample = 0;
|
|
pHwDevExt->pCurrentSubPictureSrb = NULL;
|
|
pHwDevExt->dwCurrentSubPictureSample = 0;
|
|
pHwDevExt->CurrentlySentStream = ZivaNumberOfStreams; // Just make sure it is none of them
|
|
pHwDevExt->wNextSrbOrderNumber = 0;
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
pHwDevExt->bPlayCommandPending = FALSE;
|
|
pHwDevExt->bScanCommandPending = FALSE;
|
|
pHwDevExt->bSlowCommandPending = FALSE;
|
|
|
|
pHwDevExt->nStopCount = 0;
|
|
pHwDevExt->nPauseCount = 0;
|
|
pHwDevExt->nPlayCount = 0;
|
|
pHwDevExt->nTimeoutCount = AUTHENTICATION_TIMEOUT_COUNT;
|
|
|
|
pHwDevExt->NewRate = 10000;
|
|
pHwDevExt->bToBeDiscontinued = FALSE;
|
|
pHwDevExt->bDiscontinued = FALSE;
|
|
pHwDevExt->bAbortAtPause = FALSE;
|
|
pHwDevExt->bRateChangeFromSlowMotion = FALSE;
|
|
pHwDevExt->dwVideoDataUsed =0;
|
|
pHwDevExt->dwAudioDataUsed =0;
|
|
pHwDevExt->dwSubPictureDataUsed =0;
|
|
|
|
pHwDevExt->bEndFlush = FALSE;
|
|
pHwDevExt->bTimerScheduled = FALSE;
|
|
|
|
pHwDevExt->dwCurrentVideoPage = 0;
|
|
pHwDevExt->dwCurrentAudioPage = 0;
|
|
pHwDevExt->dwCurrentSubPicturePage = 0;
|
|
|
|
pHwDevExt->bStreamNumberCouldBeChanged = FALSE;
|
|
pHwDevExt->wCurrentStreamNumber = -1;
|
|
|
|
pHwDevExt->bSwitchDecryptionOn = FALSE;
|
|
pHwDevExt->zInitialState = ZIVA_STATE_STOP;
|
|
|
|
pHwDevExt->bHliPending = FALSE;
|
|
|
|
|
|
pHwDevExt->gdwCount = 0;
|
|
|
|
pHwDevExt->dwFirstVideoOrdNum = -1;
|
|
pHwDevExt->dwFirstAudioOrdNum = -1;
|
|
pHwDevExt->dwFirstSbpOrdNum = -1;
|
|
|
|
pHwDevExt->dwVSyncCount =0;
|
|
pHwDevExt->nApsMode = -1;
|
|
pHwDevExt->VidSystem = -1;
|
|
pHwDevExt->ulLevel =0;
|
|
pHwDevExt->fAtleastOne = TRUE;
|
|
|
|
pHwDevExt->dwPrevSTC = 0;
|
|
pHwDevExt->bTrickModeToPlay =FALSE;
|
|
pHwDevExt->prevStrm =0;
|
|
pHwDevExt->fFirstSTC = FALSE;
|
|
|
|
|
|
pHwDevExt->cCCRec=0;
|
|
pHwDevExt->cCCDeq=0;
|
|
pHwDevExt->cCCCB=0;
|
|
pHwDevExt->cCCQ=0;
|
|
pHwDevExt->pstroCC = NULL;
|
|
|
|
|
|
pHwDevExt->dwUserDataSize=0;
|
|
pHwDevExt->fReSync = FALSE;
|
|
|
|
pHwDevExt->bInitialized = TRUE;
|
|
|
|
pDevEx = pHwDevExt ;
|
|
|
|
|
|
|
|
pHwDevExt->pPhysicalDeviceObj = ConfigInfo->PhysicalDeviceObject;
|
|
pHwDevExt->pDiscKeyBufferLinear = (PUCHAR)StreamClassGetDmaBuffer( pHwDevExt );
|
|
pHwDevExt->pDiscKeyBufferPhysical = StreamClassGetPhysicalAddress(
|
|
pHwDevExt,
|
|
NULL,
|
|
pHwDevExt->pDiscKeyBufferLinear,
|
|
DmaBuffer,
|
|
&dwSize );
|
|
|
|
// Indicate the size of the structure necessary to describe all streams
|
|
// that are supported by this hardware
|
|
ConfigInfo->StreamDescriptorSize = sizeof( HW_STREAM_HEADER )+ // Stream header and
|
|
ZivaNumberOfStreams * sizeof( HW_STREAM_INFORMATION ); // stream descriptors
|
|
|
|
|
|
pHwDevExt->pCCDevEx = pHwDevExt;
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
#if defined (LOAD_UCODE_FROM_FILE)
|
|
// Do nothing.
|
|
#else
|
|
if( !ZivaHw_Initialize( pHwDevExt ) || !InitializeOutputStream( pSrb ))
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
#endif
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: End HwInitialize()\n" ));
|
|
}
|
|
|
|
|
|
/*
|
|
** HwUninitialize()
|
|
**
|
|
** Release all resources and clean up the hardware
|
|
**
|
|
** Arguments:
|
|
**
|
|
** DeviceExtension - pointer to the deviceextension structure for the
|
|
** the device to be free'd
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
static VOID HwUninitialize( IN PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: Begin HwUninitialize()\n" ));
|
|
#ifdef ENCORE
|
|
AnalogUninitialize( pSrb );
|
|
#else
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
#endif
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: End HwUninitialize()\n" ));
|
|
}
|
|
|
|
/*
|
|
** AdapterOpenStream()
|
|
**
|
|
** This routine is called when an OpenStream SRB request is received
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - pointer to stream request block for the Open command
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
static VOID AdapterOpenStream( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
int i;
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: Begin AdapterOpenStream\n" ));
|
|
pSrb->Status = STATUS_TOO_MANY_NODES;
|
|
|
|
for( i = 0; i < SIZEOF_ARRAY( infoStreams ); i++ )
|
|
{
|
|
if( infoStreams[i].hwStreamObject.StreamNumber == pSrb->StreamObject->StreamNumber )
|
|
{ // This is the stream we're interested in.
|
|
// Then copy stream object structure into passed buffer
|
|
PVOID pHwStreamExtension = pSrb->StreamObject->HwStreamExtension;
|
|
*(pSrb->StreamObject) = infoStreams[i].hwStreamObject;
|
|
pSrb->StreamObject->HwStreamExtension = pHwStreamExtension;
|
|
pSrb->StreamObject->HwDeviceExtension = pHwDevExt;
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if( pSrb->Status == STATUS_SUCCESS )
|
|
{
|
|
++pHwDevExt->iTotalOpenedStreams;
|
|
++pHwDevExt->nStopCount;
|
|
++pHwDevExt->nPauseCount;
|
|
++pHwDevExt->nPlayCount;
|
|
|
|
switch( pSrb->StreamObject->StreamNumber )
|
|
{
|
|
case ZivaVideo:
|
|
pHwDevExt->bVideoStreamOpened = TRUE;
|
|
#if defined(DECODER_DVDPC) || defined(EZDVD)
|
|
ProcessVideoFormat( pSrb->CommandData.OpenFormat, pHwDevExt );
|
|
#endif
|
|
|
|
|
|
break;
|
|
|
|
case ZivaAudio:
|
|
pHwDevExt->bAudioStreamOpened = TRUE;
|
|
pHwDevExt->pstroAud = pSrb->StreamObject;
|
|
break;
|
|
|
|
case ZivaSubpicture:
|
|
pHwDevExt->bSubPictureStreamOpened = TRUE;
|
|
break;
|
|
|
|
#ifdef ENCORE
|
|
case ZivaAnalog:
|
|
++pHwDevExt->nAnalogStreamOpened;
|
|
AnalogOpenStream( pSrb );
|
|
|
|
break;
|
|
#endif
|
|
|
|
#if defined(DECODER_DVDPC) || defined(EZDVD)
|
|
case ZivaYUV:
|
|
pHwDevExt->pstroYUV = pSrb->StreamObject;
|
|
pSrb->StreamObject->HwEventRoutine = (PHW_EVENT_ROUTINE) CycEvent;
|
|
break;
|
|
#endif
|
|
|
|
case ZivaCCOut:
|
|
pHwDevExt->pstroCC = pSrb->StreamObject;
|
|
break;
|
|
|
|
default:
|
|
ASSERT( FALSE );
|
|
}
|
|
}
|
|
else
|
|
DebugPrint(( DebugLevelWarning, "ZiVA: !!! Strange Stream Number\n" ));
|
|
|
|
if ( pHwDevExt->iTotalOpenedStreams == 1 )
|
|
{
|
|
pHwDevExt->dwVideoDataUsed = 0;
|
|
pHwDevExt->dwAudioDataUsed = 0;
|
|
pHwDevExt->dwSubPictureDataUsed = 0;
|
|
pHwDevExt->bStreamNumberCouldBeChanged = FALSE;
|
|
pHwDevExt->wCurrentStreamNumber = -1;
|
|
pHwDevExt->bSwitchDecryptionOn = FALSE;
|
|
pHwDevExt->zInitialState = ZIVA_STATE_STOP;
|
|
|
|
|
|
pHwDevExt->bEndFlush = FALSE;
|
|
pHwDevExt->bTimerScheduled = FALSE;
|
|
|
|
if ( !ZivaHw_Initialize( pHwDevExt ) )
|
|
{
|
|
DebugPrint((DebugLevelFatal,"ZiVA: Could not Initialize the HW on first Stream Open\n"));
|
|
pSrb->Status = STATUS_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: End AdapterOpenStream\n" ));
|
|
}
|
|
|
|
|
|
/*
|
|
** AdapterCloseStream()
|
|
**
|
|
** Close the requested data stream
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb the request block requesting to close the stream
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
|
|
static VOID AdapterCloseStream( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: Begin AdapterCloseStream\n" ));
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
|
|
ASSERT( pHwDevExt->nStopCount == pHwDevExt->iTotalOpenedStreams );
|
|
ASSERT( pHwDevExt->nPauseCount == pHwDevExt->iTotalOpenedStreams );
|
|
ASSERT( pHwDevExt->nPlayCount == pHwDevExt->iTotalOpenedStreams );
|
|
--pHwDevExt->iTotalOpenedStreams;
|
|
--pHwDevExt->nStopCount;
|
|
--pHwDevExt->nPauseCount;
|
|
--pHwDevExt->nPlayCount;
|
|
// Determine which stream number is being closed. This number indicates
|
|
// the offset into the array of streaminfo structures that was filled out
|
|
// in the AdapterStreamInfo call.
|
|
switch( pSrb->StreamObject->StreamNumber )
|
|
{
|
|
case ZivaVideo:
|
|
pHwDevExt->bVideoStreamOpened = FALSE;
|
|
break;
|
|
|
|
case ZivaAudio:
|
|
pHwDevExt->bAudioStreamOpened = FALSE;
|
|
pHwDevExt->pstroAud = NULL;
|
|
break;
|
|
|
|
case ZivaSubpicture:
|
|
pHwDevExt->bSubPictureStreamOpened = FALSE;
|
|
break;
|
|
#ifdef ENCORE
|
|
case ZivaAnalog:
|
|
--pHwDevExt->nAnalogStreamOpened;
|
|
AnalogCloseStream( pSrb );
|
|
break;
|
|
#endif
|
|
#if defined(DECODER_DVDPC) || defined(EZDVD)
|
|
case ZivaYUV:
|
|
pHwDevExt->pstroYUV = NULL;
|
|
pHwDevExt->VideoPort = 0; // Disable
|
|
break;
|
|
#endif
|
|
|
|
|
|
case ZivaCCOut:
|
|
CleanCCQueue(pHwDevExt);
|
|
pHwDevExt->pstroCC = NULL;
|
|
|
|
break;
|
|
|
|
default:
|
|
++pHwDevExt->iTotalOpenedStreams;
|
|
++pHwDevExt->nStopCount;
|
|
++pHwDevExt->nPauseCount;
|
|
++pHwDevExt->nPlayCount;
|
|
DebugPrint(( DebugLevelWarning, "ZiVA: !!! Strange Stream Number\n" ));
|
|
ASSERT( FALSE );
|
|
pSrb->Status = STATUS_NOT_IMPLEMENTED;
|
|
//TRAP
|
|
}
|
|
|
|
//
|
|
// Reset the Authenticated Stream if anyone is being closed
|
|
//
|
|
pHwDevExt->iStreamToAuthenticateOn = -1;
|
|
|
|
//
|
|
// Reset the HW on last Stream Close
|
|
//
|
|
if( pHwDevExt->iTotalOpenedStreams == 0 )
|
|
{
|
|
pHwDevExt->wNextSrbOrderNumber = 0;
|
|
// Make sure next Authentication request will be postponed
|
|
// until "last packet" flag has come on each stream.
|
|
AdapterClearAuthenticationStatus( pHwDevExt );
|
|
|
|
|
|
// Clean up the hardware
|
|
if( !ZivaHw_Reset() )
|
|
{
|
|
DebugPrint(( DebugLevelError, "ZiVA: Could not Reset the HW on last Stream Closed\n" ));
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
}
|
|
#if defined(ENCORE)
|
|
else
|
|
AnalogCloseStream( pSrb );
|
|
#endif
|
|
}
|
|
#ifdef DEBUG
|
|
if( pHwDevExt->iTotalOpenedStreams < 0 )
|
|
DebugPrint(( DebugLevelWarning, "ZiVA: !!!!!!!!!!!!!!!!!! Open/Close streams mismatch !!!!!!!!!!!!!!!!\n" ));
|
|
#endif
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: End AdapterCloseStream\n" ));
|
|
}
|
|
|
|
void AdapterInitLocals(PHW_DEVICE_EXTENSION pHwDevExt)
|
|
{
|
|
pHwDevExt->pCurrentVideoSrb = NULL;
|
|
pHwDevExt->dwCurrentVideoSample = 0;
|
|
|
|
pHwDevExt->pCurrentAudioSrb = NULL;
|
|
pHwDevExt->dwCurrentAudioSample = 0;
|
|
|
|
pHwDevExt->pCurrentSubPictureSrb = NULL;
|
|
pHwDevExt->dwCurrentSubPictureSample = 0;
|
|
pHwDevExt->CurrentlySentStream = ZivaNumberOfStreams; // Just make sure it is none of them
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
pHwDevExt->bPlayCommandPending = FALSE;
|
|
pHwDevExt->bScanCommandPending = FALSE;
|
|
pHwDevExt->bSlowCommandPending = FALSE;
|
|
pHwDevExt->bHliPending = FALSE;
|
|
pHwDevExt->NewRate = 10000;
|
|
|
|
pHwDevExt->dwVideoDataUsed = 0;
|
|
|
|
pHwDevExt->dwCurrentVideoPage = 0;
|
|
pHwDevExt->dwCurrentAudioPage = 0;
|
|
pHwDevExt->dwCurrentSubPicturePage = 0;
|
|
|
|
pHwDevExt->dwAudioDataUsed = 0;
|
|
pHwDevExt->dwSubPictureDataUsed = 0;
|
|
|
|
pHwDevExt->bToBeDiscontinued = FALSE;
|
|
pHwDevExt->bDiscontinued = FALSE;
|
|
pHwDevExt->bAbortAtPause = FALSE;
|
|
pHwDevExt->bRateChangeFromSlowMotion = FALSE;
|
|
|
|
pHwDevExt->gdwCount = 0;
|
|
pHwDevExt->dwFirstVideoOrdNum = -1;
|
|
pHwDevExt->dwFirstAudioOrdNum = -1;
|
|
pHwDevExt->dwFirstSbpOrdNum = -1;
|
|
pHwDevExt->dwVSyncCount =0;
|
|
pHwDevExt->nApsMode = -1;
|
|
pHwDevExt->VidSystem = -1;
|
|
pHwDevExt->ulLevel =0;
|
|
pHwDevExt->fAtleastOne = TRUE;
|
|
|
|
//temp pHwDevExt->dwPrevSTC = 0;
|
|
pHwDevExt->bTrickModeToPlay =FALSE;
|
|
pHwDevExt->prevStrm =0;
|
|
pHwDevExt->fFirstSTC = TRUE;
|
|
|
|
pHwDevExt->cCCRec=0;
|
|
pHwDevExt->cCCDeq=0;
|
|
pHwDevExt->cCCCB=0;
|
|
pHwDevExt->cCCQ=0;
|
|
|
|
// pHwDevExt->pstroCC = NULL;
|
|
// pHwDevExt->dwUserDataBuffer[]={0};
|
|
pHwDevExt->dwUserDataSize=0;
|
|
pHwDevExt->fReSync = FALSE;
|
|
CleanCCQueue(pHwDevExt);
|
|
|
|
|
|
#ifdef EZDVD
|
|
ZivaHw_Initialize(pHwDevExt);
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
** AdapterStreamInfo()
|
|
**
|
|
** Returns the information of all streams that are supported by the
|
|
** mini-driver
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - Pointer to the STREAM_REQUEST_BLOCK
|
|
** pSrb->HwDeviceExtension - will be the hardware device extension for
|
|
** as initialised in HwInitialise
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
static VOID AdapterStreamInfo( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
int i;
|
|
PHW_DEVICE_EXTENSION pdevext = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
PHW_STREAM_HEADER pStrHdr = &(pSrb->CommandData.StreamBuffer->StreamHeader);
|
|
PHW_STREAM_INFORMATION pstrinfo = &(pSrb->CommandData.StreamBuffer->StreamInfo);
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: Begin AdapterStreamInfo\n" ));
|
|
|
|
// Fill stream header structure
|
|
pStrHdr->NumberOfStreams = ZivaNumberOfStreams;
|
|
pStrHdr->SizeOfHwStreamInformation = sizeof( HW_STREAM_INFORMATION );
|
|
pStrHdr->Topology = (PKSTOPOLOGY)&Topology;
|
|
#ifdef ENCORE
|
|
pStrHdr->NumDevPropArrayEntries = SIZEOF_ARRAY( psEncore );
|
|
pStrHdr->DevicePropertiesArray = (PKSPROPERTY_SET)psEncore;
|
|
#else
|
|
pStrHdr->NumDevPropArrayEntries = 0;
|
|
pStrHdr->DevicePropertiesArray = NULL;
|
|
#endif
|
|
|
|
for( i = 0; i < SIZEOF_ARRAY( infoStreams ); i++, pstrinfo++ )
|
|
{ // Copy stream information structure into passed buffer
|
|
*pstrinfo = infoStreams[i].hwStreamInfo;
|
|
}
|
|
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: End AdapterStreamInfo\n" ));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
** AdapterGetDataIntersection()
|
|
**
|
|
**
|
|
**
|
|
** Arguments:
|
|
**
|
|
**
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects:
|
|
*/
|
|
static VOID AdapterGetDataIntersection( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PSTREAM_DATA_INTERSECT_INFO IntersectInfo = pSrb->CommandData.IntersectInfo;
|
|
PKSDATARANGE DataRange = IntersectInfo->DataRange;
|
|
PKSDATAFORMAT* pFormat;
|
|
ULONG i, formatSize;
|
|
|
|
if( IntersectInfo->StreamNumber >= ZivaNumberOfStreams )
|
|
{ // Incorrect stream number
|
|
pSrb->Status = STATUS_NOT_IMPLEMENTED;
|
|
return;
|
|
}
|
|
|
|
pSrb->Status = STATUS_NO_MATCH;
|
|
#if defined (ENCORE)
|
|
if( IntersectInfo->StreamNumber == ZivaAnalog )
|
|
{
|
|
PKSDATAFORMAT pFrmt = (PKSDATAFORMAT)&ZivaFormatAnalogOverlayOut;
|
|
pFormat = &pFrmt;
|
|
}
|
|
|
|
|
|
|
|
/* else if(IntersectInfo->StreamNumber == ZivaCCOut)
|
|
{
|
|
// *pFormat = &hwfmtiCCOut;
|
|
// formatSize = sizeof hwfmtiCCOut;
|
|
MonoOutStr("CCOut");
|
|
pFormat = infoStreams[IntersectInfo->StreamNumber].hwStreamInfo.StreamFormatsArray;
|
|
}*/
|
|
else
|
|
#endif
|
|
pFormat = infoStreams[IntersectInfo->StreamNumber].hwStreamInfo.StreamFormatsArray;
|
|
|
|
for( i = 0; i < infoStreams[IntersectInfo->StreamNumber].hwStreamInfo.NumberOfFormatArrayEntries;
|
|
pFormat++, i++ )
|
|
{ // Check format
|
|
formatSize = (*pFormat)->FormatSize;
|
|
#if defined (ENCORE)
|
|
if( IntersectInfo->StreamNumber != ZivaAnalog && DataRange->FormatSize != formatSize )
|
|
continue;
|
|
#endif
|
|
if( IsEqualGUID( &DataRange->MajorFormat, &((*pFormat)->MajorFormat) ) &&
|
|
IsEqualGUID( &DataRange->SubFormat, &((*pFormat)->SubFormat) ) &&
|
|
IsEqualGUID( &DataRange->Specifier, &((*pFormat)->Specifier) ) )
|
|
{
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
break;
|
|
}
|
|
}
|
|
if( pSrb->Status != STATUS_SUCCESS )
|
|
return;
|
|
|
|
// Check to see if the size of the passed in buffer is a ULONG.
|
|
// if so, this indicates that we are to return only the size
|
|
// needed, and not return the actual data.
|
|
if( IntersectInfo->SizeOfDataFormatBuffer != sizeof( ULONG ) )
|
|
{ //
|
|
// we are to copy the data, not just return the size
|
|
//
|
|
if( IntersectInfo->SizeOfDataFormatBuffer < formatSize )
|
|
pSrb->Status = STATUS_BUFFER_TOO_SMALL;
|
|
else
|
|
{
|
|
RtlCopyMemory( IntersectInfo->DataFormatBuffer, *pFormat, formatSize );
|
|
pSrb->ActualBytesTransferred = formatSize;
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
}
|
|
}
|
|
else // if sizeof ULONG specified
|
|
{
|
|
// Caller wants just the size of the buffer. Get that.
|
|
*(PULONG)IntersectInfo->DataFormatBuffer = formatSize;
|
|
pSrb->ActualBytesTransferred = sizeof( ULONG );
|
|
} // if sizeof ULONG
|
|
}
|
|
|
|
|
|
VOID STREAMAPI adapterUpdateNextSrbOrderNumberOnDiscardSrb( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
ULONG ulSample;
|
|
KSSTREAM_HEADER * pHeader;
|
|
WORD wMaxDiscardedOrderNumber = 0;
|
|
|
|
for( ulSample = 0; ulSample < pSrb->NumberOfBuffers; ulSample++ )
|
|
{
|
|
pHeader = ((PKSSTREAM_HEADER)pSrb->CommandData.DataBufferArray) + ulSample;
|
|
wMaxDiscardedOrderNumber = max( (WORD)((pHeader->TypeSpecificFlags) >> 16), wMaxDiscardedOrderNumber );
|
|
}
|
|
|
|
if ( wMaxDiscardedOrderNumber >= pHwDevExt->wNextSrbOrderNumber )
|
|
{
|
|
pHwDevExt->wNextSrbOrderNumber = wMaxDiscardedOrderNumber + 1;
|
|
MonoOutStr( "<<< Updating NextSrbOrderNumber to " );
|
|
MonoOutULong( pHwDevExt->wNextSrbOrderNumber );
|
|
MonoOutStr( " >>>" );
|
|
}
|
|
|
|
return ;
|
|
}
|
|
|
|
|
|
/*
|
|
** MoveToNextSample()
|
|
**
|
|
** This routine is being called when there is a need to move
|
|
** to the next Sample(buffer) in the current Srb.
|
|
**
|
|
** Arguments:
|
|
** pSrb - the request block to advance Sample Number.
|
|
**
|
|
** Returns:
|
|
** TRUE - Successfuly moved to next Sample
|
|
** FALSE - There was no more samples and current Srb was released
|
|
**
|
|
** Side Effects: unknown
|
|
*/
|
|
BOOLEAN STREAMAPI MoveToNextSample( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
DWORD* pdwCurrentSrbSample;
|
|
DWORD* pdwCurrentSrbPage;
|
|
|
|
switch( pSrb->StreamObject->StreamNumber )
|
|
{
|
|
case ZivaVideo:
|
|
pdwCurrentSrbSample = &pHwDevExt->dwCurrentVideoSample;
|
|
pdwCurrentSrbPage = &pHwDevExt->dwCurrentVideoPage;
|
|
break;
|
|
case ZivaAudio:
|
|
pdwCurrentSrbSample = &pHwDevExt->dwCurrentAudioSample;
|
|
pdwCurrentSrbPage = &pHwDevExt->dwCurrentAudioPage;
|
|
break;
|
|
case ZivaSubpicture:
|
|
pdwCurrentSrbSample = &pHwDevExt->dwCurrentSubPictureSample;
|
|
pdwCurrentSrbPage = &pHwDevExt->dwCurrentSubPicturePage;
|
|
break;
|
|
default:
|
|
MonoOutStr( "!!!!!!!!!!!!!!!!!!! WRONG STREAM # IN MoveToNextSample ROUTINE !!!!!!!!!!!!!!!!!!!!!!!!!!!" );
|
|
return FALSE;
|
|
}
|
|
// if(dwDataUsed == 0)
|
|
// {
|
|
(*pdwCurrentSrbSample)++;
|
|
// pHwDevExt->wNextSrbOrderNumber++;
|
|
// }
|
|
(*pdwCurrentSrbPage)++;
|
|
if( *pdwCurrentSrbSample >= pSrb->NumberOfBuffers)
|
|
{
|
|
if( *pdwCurrentSrbSample > pSrb->NumberOfBuffers )
|
|
{
|
|
MonoOutSetBlink( TRUE );
|
|
MonoOutStr( "<<< Current sample number is higher than the number of buffers >>>" );
|
|
MonoOutSetBlink( FALSE );
|
|
}
|
|
// MonoOutStr("MoveToNextSample()::RSRB");
|
|
AdapterReleaseCurrentSrb( pSrb );
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
|
|
|
|
VOID CancelPacket( PHW_STREAM_REQUEST_BLOCK pSrb, BOOL bCancel )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
ULONG ulSample;
|
|
PKSSTREAM_HEADER pHeader;
|
|
WORD wMaxOrder = 0, wMinOrder = 0xFFFF;
|
|
#ifdef DEBUG
|
|
LPSTR pszFuncString, pszPacketString = NULL;
|
|
|
|
pszFuncString = bCancel ? "Cancel" : "Timeout";
|
|
DebugPrint(( DebugLevelVerbose,"ZiVA: Adapter%sPacket ->", pszFuncString ));
|
|
MonoOutSetUnderscore( TRUE );
|
|
MonoOutChar( ' ' );
|
|
MonoOutStr( pszFuncString );
|
|
MonoOutStr( "->" );
|
|
#endif
|
|
|
|
if( !(pSrb->Flags & SRB_HW_FLAGS_DATA_TRANSFER) )
|
|
{
|
|
DebugPrint(( DebugLevelVerbose," As a Control\n" ));
|
|
MonoOutStr( "(Control or Device)" );
|
|
AdapterReleaseRequest( pSrb );
|
|
return;
|
|
}
|
|
|
|
|
|
// We need to find this packet, pull it off our queues, and cancel it
|
|
// Try to find this Srb in the Pending List. If it's there just
|
|
// empty the slot
|
|
if(bCancel)
|
|
{
|
|
if( pHwDevExt->pCurrentVideoSrb == pSrb )
|
|
{
|
|
#ifdef DEBUG
|
|
pszPacketString = "Video";
|
|
#endif
|
|
pHwDevExt->pCurrentVideoSrb = NULL;
|
|
pHwDevExt->dwCurrentVideoSample = 0;
|
|
pHwDevExt->dwCurrentVideoPage = 0;
|
|
pHwDevExt->dwVideoDataUsed =0;
|
|
}
|
|
else if( pHwDevExt->pCurrentAudioSrb == pSrb )
|
|
{
|
|
#ifdef DEBUG
|
|
pszPacketString = "Audio";
|
|
#endif
|
|
pHwDevExt->pCurrentAudioSrb = NULL;
|
|
pHwDevExt->dwCurrentAudioSample = 0;
|
|
pHwDevExt->dwCurrentAudioPage = 0;
|
|
pHwDevExt->dwAudioDataUsed = 0;
|
|
|
|
|
|
}
|
|
else if( pHwDevExt->pCurrentSubPictureSrb == pSrb )
|
|
{
|
|
#ifdef DEBUG
|
|
pszPacketString = "Subpicture";
|
|
#endif
|
|
pHwDevExt->pCurrentSubPictureSrb = NULL;
|
|
pHwDevExt->dwCurrentSubPictureSample = 0;
|
|
pHwDevExt->dwCurrentSubPicturePage = 0;
|
|
pHwDevExt->dwSubPictureDataUsed = 0;
|
|
}
|
|
}
|
|
else //added 11/6/98
|
|
{
|
|
if( pHwDevExt->bInterruptPending )
|
|
MoveToNextSample( pSrb );
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
if( pszPacketString )
|
|
{
|
|
DebugPrint(( DebugLevelVerbose, pszPacketString ));
|
|
MonoOutStr( pszPacketString );
|
|
}
|
|
#endif
|
|
|
|
// Reset the HW if it was the currently sending Srb.
|
|
// It usually means that hardware messed up so we'll schedule "play",
|
|
// "slow motion" or "scan" commands if one of them was in effect, reset
|
|
// hardware and cancel this packet
|
|
|
|
if( pHwDevExt->CurrentlySentStream == (ZIVA_STREAM)pSrb->StreamObject->StreamNumber )
|
|
{
|
|
ZIVA_STATE zState;
|
|
|
|
DebugPrint(( DebugLevelVerbose, "Current" ));
|
|
MonoOutStr( " Current Strm# " );
|
|
MonoOutInt( pSrb->StreamObject->StreamNumber );
|
|
|
|
// This request is in a middle of a Bus Master transferring and most likely
|
|
// that the interrupt is pending. If so we have to reset the
|
|
// Bus Master device.
|
|
if( pHwDevExt->bInterruptPending )
|
|
{
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
MonoOutStr( " Cancel pending interrupt" );
|
|
}
|
|
|
|
// Lets do a clean start (Abort->Play) for the upcoming stream
|
|
zState = ZivaHw_GetState();
|
|
if( zState != ZIVA_STATE_STOP )
|
|
{
|
|
MonoOutStr( " Aborting" );
|
|
|
|
if( !ZivaHw_Abort() )
|
|
ZivaHw_Reset();
|
|
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
|
|
pHwDevExt->bScanCommandPending = TRUE;
|
|
|
|
}
|
|
|
|
// Clean the CurrentlySentStream
|
|
pHwDevExt->CurrentlySentStream = ZivaNumberOfStreams;
|
|
}
|
|
|
|
|
|
|
|
|
|
if(bCancel)
|
|
pSrb->Status = STATUS_CANCELLED;
|
|
|
|
// It is necessary to call the request back correctly. Determine which type of
|
|
// command it is and then find all stream commands, and do stream notifications
|
|
switch( pSrb->Flags & (SRB_HW_FLAGS_DATA_TRANSFER | SRB_HW_FLAGS_STREAM_REQUEST) )
|
|
{
|
|
case SRB_HW_FLAGS_STREAM_REQUEST | SRB_HW_FLAGS_DATA_TRANSFER:
|
|
DebugPrint(( DebugLevelVerbose," As a Data\n" ));
|
|
MonoOutStr( "(Data)" );
|
|
|
|
// Find the smallest and the biggest discarded order number in this packet
|
|
for( ulSample = 0; ulSample < pSrb->NumberOfBuffers; ulSample++ )
|
|
{
|
|
pHeader = (PKSSTREAM_HEADER)pSrb->CommandData.DataBufferArray + ulSample;
|
|
wMaxOrder = max( (WORD)(pHeader->TypeSpecificFlags >> 16), wMaxOrder );
|
|
wMinOrder = min( (WORD)(pHeader->TypeSpecificFlags >> 16), wMinOrder );
|
|
}
|
|
MonoOutStr( " Min:" );
|
|
MonoOutInt( wMinOrder );
|
|
MonoOutStr( " Max:" );
|
|
MonoOutInt( wMaxOrder );
|
|
MonoOutStr( " Curr:" );
|
|
MonoOutInt( pHwDevExt->wNextSrbOrderNumber );
|
|
if(bCancel)
|
|
{
|
|
if( /*wMinOrder <= pHwDevExt->wNextSrbOrderNumber &&*/
|
|
wMaxOrder >= pHwDevExt->wNextSrbOrderNumber )
|
|
{
|
|
pHwDevExt->wNextSrbOrderNumber = wMaxOrder + 1;
|
|
MonoOutStr( "<<< Updating NextSrbOrderNumber to " );
|
|
MonoOutULong( pHwDevExt->wNextSrbOrderNumber );
|
|
MonoOutStr( " >>>" );
|
|
}
|
|
else
|
|
MonoOutChar( ' ' );
|
|
MonoOutStr("Cancel::ARR");
|
|
AdapterReleaseRequest( pSrb );
|
|
}
|
|
else
|
|
{
|
|
|
|
if(pHwDevExt->pCurrentSubPictureSrb)
|
|
{
|
|
pHeader = (PKSSTREAM_HEADER)pHwDevExt->pCurrentSubPictureSrb->CommandData.DataBufferArray ;
|
|
pHeader += pHwDevExt->dwCurrentSubPictureSample;
|
|
wMinOrder = min( (WORD)(pHeader->TypeSpecificFlags >> 16), wMinOrder );
|
|
}
|
|
if(pHwDevExt->pCurrentVideoSrb)
|
|
{
|
|
pHeader = (PKSSTREAM_HEADER)pHwDevExt->pCurrentVideoSrb->CommandData.DataBufferArray ;
|
|
pHeader += pHwDevExt->dwCurrentVideoSample;
|
|
wMinOrder = min( (WORD)(pHeader->TypeSpecificFlags >> 16), wMinOrder );
|
|
}
|
|
if(pHwDevExt->pCurrentAudioSrb)
|
|
{
|
|
pHeader = (PKSSTREAM_HEADER)pHwDevExt->pCurrentAudioSrb->CommandData.DataBufferArray ;
|
|
pHeader += pHwDevExt->dwCurrentAudioSample;
|
|
wMinOrder = min( (WORD)(pHeader->TypeSpecificFlags >> 16), wMinOrder );
|
|
}
|
|
|
|
pHwDevExt->wNextSrbOrderNumber = wMinOrder ;
|
|
AdapterSendData(pHwDevExt);
|
|
}
|
|
|
|
|
|
MonoOutStr( "(Current->" );
|
|
if( pHwDevExt->pCurrentVideoSrb )
|
|
MonoOutStr( "V" );
|
|
if( pHwDevExt->pCurrentAudioSrb )
|
|
MonoOutStr( "A" );
|
|
if( pHwDevExt->pCurrentSubPictureSrb )
|
|
MonoOutStr( "S" );
|
|
if( !pHwDevExt->pCurrentVideoSrb && !pHwDevExt->pCurrentAudioSrb && !pHwDevExt->pCurrentSubPictureSrb )
|
|
MonoOutStr( "Queue empty" );
|
|
MonoOutStr( ")" );
|
|
|
|
|
|
break;
|
|
|
|
case SRB_HW_FLAGS_STREAM_REQUEST:
|
|
DebugPrint(( DebugLevelVerbose," As a Control\n" ));
|
|
MonoOutStr( "(Control)" );
|
|
AdapterReleaseRequest( pSrb );
|
|
break;
|
|
|
|
default:
|
|
// this must be a device request. Use device notifications
|
|
DebugPrint(( DebugLevelVerbose," As a Device\n" ));
|
|
MonoOutStr( "(Device)" );
|
|
AdapterReleaseRequest( pSrb );
|
|
}
|
|
|
|
MonoOutSetUnderscore( FALSE );
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: End Adapter%sPacket\n", pszFuncString ));
|
|
}
|
|
|
|
|
|
/*** AdapterCancelPacket()
|
|
**
|
|
** Request to cancel a packet that is currently in process in the minidriver
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - pointer to request packet to cancel
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
VOID STREAMAPI AdapterCancelPacket( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
CancelPacket( pSrb, TRUE );
|
|
}
|
|
|
|
/*
|
|
** AdapterTimeoutPacket()
|
|
**
|
|
** This routine is called when a packet has been in the minidriver for
|
|
** too long. The adapter must decide what to do with the packet
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - pointer to the request packet that timed out
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
VOID STREAMAPI AdapterTimeoutPacket( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
|
|
// If this is a data request, and the device is paused (we probably have run out of
|
|
// data buffer) or busy with overlay calibration we need more time, so just reset the
|
|
// timer, and let the packet continue
|
|
if( ZivaHw_GetState() == ZIVA_STATE_PAUSE
|
|
#ifdef ENCORE
|
|
|| pHwDevExt->nVGAMode != AP_KNOWNMODE
|
|
#endif
|
|
)
|
|
{
|
|
DebugPrint(( DebugLevelVerbose, "Timeout: Stream is PAUSED\n" ));
|
|
|
|
// reset the timeout counter, and continue
|
|
pSrb->TimeoutCounter = pSrb->TimeoutOriginal;
|
|
return;
|
|
}
|
|
|
|
CleanCCQueue(pHwDevExt);
|
|
|
|
CancelPacket( pSrb, FALSE );
|
|
}
|
|
|
|
void FinishCurrentPacketAndSendNextOne( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
DWORD dwSample;
|
|
PHW_STREAM_REQUEST_BLOCK pSrb = NULL;
|
|
DWORD dwCurBuf=0;
|
|
|
|
switch( pHwDevExt->CurrentlySentStream )
|
|
{
|
|
case ZivaVideo:
|
|
pSrb = pHwDevExt->pCurrentVideoSrb;
|
|
++pHwDevExt->dwCurrentVideoPage;
|
|
if(pHwDevExt->dwVideoDataUsed <= 0)
|
|
{
|
|
pHwDevExt->wNextSrbOrderNumber++;
|
|
++pHwDevExt->dwCurrentVideoSample;
|
|
dwCurBuf = pHwDevExt->dwCurrentVideoSample;
|
|
|
|
}
|
|
dwSample = pHwDevExt->dwCurrentVideoPage;
|
|
break;
|
|
|
|
case ZivaAudio:
|
|
pSrb = pHwDevExt->pCurrentAudioSrb;
|
|
++pHwDevExt->dwCurrentAudioPage;
|
|
if(pHwDevExt->dwAudioDataUsed <= 0)
|
|
{
|
|
pHwDevExt->wNextSrbOrderNumber++;
|
|
++pHwDevExt->dwCurrentAudioSample;
|
|
dwCurBuf = pHwDevExt->dwCurrentAudioSample;
|
|
}
|
|
dwSample = pHwDevExt->dwCurrentAudioPage;
|
|
|
|
|
|
break;
|
|
|
|
case ZivaSubpicture:
|
|
pSrb = pHwDevExt->pCurrentSubPictureSrb;
|
|
++pHwDevExt->dwCurrentSubPicturePage;
|
|
if(pHwDevExt->dwSubPictureDataUsed <= 0)
|
|
{
|
|
pHwDevExt->wNextSrbOrderNumber++;
|
|
++pHwDevExt->dwCurrentSubPictureSample;
|
|
dwCurBuf = pHwDevExt->dwCurrentSubPictureSample;
|
|
}
|
|
|
|
dwSample = pHwDevExt->dwCurrentSubPicturePage;
|
|
|
|
break;
|
|
}
|
|
if( pSrb )
|
|
{
|
|
if( ( dwSample >= pSrb->NumberOfPhysicalPages) || (dwCurBuf >= pSrb->NumberOfBuffers))
|
|
{
|
|
if( dwSample > pSrb->NumberOfPhysicalPages)
|
|
{
|
|
MonoOutSetBlink( TRUE );
|
|
MonoOutStr( "<<< Current sample number is higher than the number of buffers >>>" );
|
|
MonoOutSetBlink( FALSE );
|
|
}
|
|
|
|
//tmp MonoOutStr("RSRB");
|
|
AdapterReleaseCurrentSrb( pSrb );
|
|
}
|
|
// Clean the CurrentlySentStream
|
|
pHwDevExt->CurrentlySentStream = ZivaNumberOfStreams;
|
|
// Send next chunk of data
|
|
AdapterSendData( pHwDevExt );
|
|
}
|
|
}
|
|
|
|
|
|
UINT AdapterPrepareDataForSending( PHW_DEVICE_EXTENSION pHwDevExt,
|
|
PHW_STREAM_REQUEST_BLOCK pCurrentStreamSrb,
|
|
DWORD dwCurrentStreamSample,
|
|
PHW_STREAM_REQUEST_BLOCK* ppSrb, DWORD* pdwSample,
|
|
DWORD* dwCurrentSample,DWORD dwCurrentPage,
|
|
LONG* pdwDataUsed)
|
|
{
|
|
PKSSTREAM_HEADER pHeader;
|
|
static DWORD wPrevOrderNumber=0xfff;
|
|
|
|
// Check if this guy has any data to send
|
|
pHeader = (PKSSTREAM_HEADER)pCurrentStreamSrb->CommandData.DataBufferArray+dwCurrentStreamSample;
|
|
|
|
if(pHeader == NULL)
|
|
{
|
|
MonoOutStr("PHeader NULL");
|
|
MoveToNextSample( pCurrentStreamSrb );
|
|
pHwDevExt->wNextSrbOrderNumber++;
|
|
// Sorry, but we have to start all over again...
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
if( pHeader->OptionsFlags & KSSTREAM_HEADER_OPTIONSF_TYPECHANGED )
|
|
{
|
|
MonoOutStr( "!!!! Skipping TYPECHANGED buffer !!!!" );
|
|
MoveToNextSample( pCurrentStreamSrb );
|
|
// Sorry, but we have to start all over again...
|
|
return TRUE;
|
|
}
|
|
if( (WORD)(pHeader->TypeSpecificFlags >> 16) == pHwDevExt->wNextSrbOrderNumber )
|
|
{
|
|
|
|
if( !pHeader->DataUsed )
|
|
{
|
|
MonoOutStr( "!!!! DataUsed is 0 !!!!" );
|
|
MoveToNextSample( pCurrentStreamSrb );
|
|
pHwDevExt->wNextSrbOrderNumber++;
|
|
// Sorry, but we have to start all over again...
|
|
return TRUE;
|
|
}
|
|
// Found our SRB
|
|
if((*pdwDataUsed <= 0))
|
|
{
|
|
*pdwDataUsed += pHeader->DataUsed;
|
|
if(*pdwDataUsed == 0)
|
|
{
|
|
MoveToNextSample(pCurrentStreamSrb);
|
|
pHwDevExt->wNextSrbOrderNumber++;
|
|
return TRUE;
|
|
}
|
|
}
|
|
if(pHeader->PresentationTime.Time)
|
|
pHwDevExt->VideoSTC = pHeader->PresentationTime.Time;
|
|
*ppSrb = pCurrentStreamSrb;
|
|
*pdwSample = dwCurrentPage;
|
|
*dwCurrentSample = dwCurrentStreamSample;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
UpdateOrdinalNumber(IN PHW_DEVICE_EXTENSION pHwDevExt)
|
|
{
|
|
if(( (pHwDevExt->pCurrentVideoSrb) || (pHwDevExt->pCurrentAudioSrb) || (pHwDevExt->pCurrentSubPictureSrb)) )
|
|
{
|
|
PKSSTREAM_HEADER pHeader;
|
|
WORD wMinOrder = 0xFFFF;
|
|
if( pHwDevExt->pCurrentVideoSrb )
|
|
{
|
|
pHeader = (PKSSTREAM_HEADER)(pHwDevExt->pCurrentVideoSrb->CommandData.DataBufferArray)+
|
|
pHwDevExt->dwCurrentVideoSample;
|
|
wMinOrder = (WORD)(pHeader->TypeSpecificFlags >> 16);
|
|
}
|
|
if( pHwDevExt->pCurrentAudioSrb )
|
|
{
|
|
pHeader = (PKSSTREAM_HEADER)(pHwDevExt->pCurrentAudioSrb->CommandData.DataBufferArray)+
|
|
pHwDevExt->dwCurrentAudioSample;
|
|
wMinOrder = min( (WORD)(pHeader->TypeSpecificFlags >> 16), wMinOrder );
|
|
}
|
|
if( pHwDevExt->pCurrentSubPictureSrb )
|
|
{
|
|
pHeader = (PKSSTREAM_HEADER)(pHwDevExt->pCurrentSubPictureSrb->CommandData.DataBufferArray)+
|
|
pHwDevExt->dwCurrentSubPictureSample;
|
|
wMinOrder = min( (WORD)(pHeader->TypeSpecificFlags >> 16), wMinOrder );
|
|
}
|
|
|
|
ASSERT( wMinOrder != 0xFFFF );
|
|
pHwDevExt->wNextSrbOrderNumber = wMinOrder;
|
|
MonoOutSetBlink( TRUE );
|
|
MonoOutStr( "<<< Self recovering NextSrbOrderNumber to " );
|
|
MonoOutULong( pHwDevExt->wNextSrbOrderNumber );
|
|
MonoOutStr( " >>>" );
|
|
MonoOutSetBlink( FALSE );
|
|
|
|
}
|
|
|
|
}
|
|
BOOLEAN CanUpdateOrdinalNumber(IN PHW_DEVICE_EXTENSION pHwDevExt)
|
|
{
|
|
BOOLEAN bReturn = FALSE;
|
|
if(pHwDevExt->bScanCommandPending)
|
|
{
|
|
if((pHwDevExt->NewRate == 10000) || (pHwDevExt->bRateChangeFromSlowMotion) )
|
|
{
|
|
|
|
pHwDevExt->bRateChangeFromSlowMotion = FALSE;
|
|
if(pHwDevExt->bDiscontinued)
|
|
{
|
|
pHwDevExt->bDiscontinued = FALSE;
|
|
UpdateOrdinalNumber(pHwDevExt);
|
|
bReturn = TRUE;
|
|
}
|
|
}
|
|
}
|
|
return bReturn;
|
|
}
|
|
void IssuePendingCommands(PHW_DEVICE_EXTENSION pHwDevExt)
|
|
{
|
|
pHwDevExt->bEndFlush = FALSE;
|
|
pHwDevExt->bTimerScheduled = FALSE;
|
|
DisableThresholdInt();
|
|
if( pHwDevExt->bPlayCommandPending == TRUE )
|
|
{ // If "Play" command is pending - it's time to fire it
|
|
pHwDevExt->bPlayCommandPending = FALSE;
|
|
ZivaHw_FlushBuffers( );
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
if( !ZivaHw_Play() )
|
|
DebugPrint(( DebugLevelInfo, "ZiVA: !!!!!!!!! Play command did not succeed !!!!!!!!!\n" ));
|
|
}
|
|
if( pHwDevExt->bScanCommandPending == TRUE )
|
|
{
|
|
pHwDevExt->bScanCommandPending = FALSE;
|
|
if(pHwDevExt->NewRate == 10000)
|
|
{
|
|
ZivaHw_Abort();//sri
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
ZivaHw_Play();
|
|
}
|
|
else if(pHwDevExt->NewRate < 10000)
|
|
{
|
|
ZivaHw_Abort();//sri
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
ZivaHw_Scan();
|
|
}
|
|
else
|
|
{
|
|
|
|
ZivaHw_Abort();//sri
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
ZivaHw_SlowMotion( 8 );
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void CallAdapterSendAtALaterTime( PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
|
|
// UpdateOrdinalNumber(pHwDevExt);
|
|
MonoOutStr("CallAdapterSendAtALaterTime");
|
|
if(pHwDevExt->bTimerScheduled)
|
|
{
|
|
pHwDevExt->bTimerScheduled = FALSE;
|
|
MonoOutStr("CallAdapterSend");
|
|
UpdateOrdinalNumber(pHwDevExt);
|
|
AdapterSendData(pHwDevExt);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
BOOL UpdateOrdNum_MinOfAllThree(PHW_DEVICE_EXTENSION pHwDevExt)
|
|
{
|
|
if( ((!pHwDevExt->bVideoStreamOpened || pHwDevExt->pCurrentVideoSrb) &&
|
|
(!pHwDevExt->bAudioStreamOpened || pHwDevExt->pCurrentAudioSrb) &&
|
|
(!pHwDevExt->bSubPictureStreamOpened || pHwDevExt->pCurrentSubPictureSrb))
|
|
)
|
|
{
|
|
PKSSTREAM_HEADER pHeader;
|
|
WORD wMinOrder = 0xFFFF;
|
|
|
|
|
|
if( pHwDevExt->pCurrentVideoSrb )
|
|
{
|
|
pHeader = (PKSSTREAM_HEADER)(pHwDevExt->pCurrentVideoSrb->CommandData.DataBufferArray)+
|
|
pHwDevExt->dwCurrentVideoSample;
|
|
wMinOrder = (WORD)(pHeader->TypeSpecificFlags >> 16);
|
|
}
|
|
if( pHwDevExt->pCurrentAudioSrb )
|
|
{
|
|
pHeader = (PKSSTREAM_HEADER)(pHwDevExt->pCurrentAudioSrb->CommandData.DataBufferArray)+
|
|
pHwDevExt->dwCurrentAudioSample;
|
|
wMinOrder = min( (WORD)(pHeader->TypeSpecificFlags >> 16), wMinOrder );
|
|
}
|
|
if( pHwDevExt->pCurrentSubPictureSrb )
|
|
{
|
|
pHeader = (PKSSTREAM_HEADER)(pHwDevExt->pCurrentSubPictureSrb->CommandData.DataBufferArray)+
|
|
pHwDevExt->dwCurrentSubPictureSample;
|
|
wMinOrder = min( (WORD)(pHeader->TypeSpecificFlags >> 16), wMinOrder );
|
|
}
|
|
|
|
ASSERT( wMinOrder != 0xFFFF );
|
|
pHwDevExt->wNextSrbOrderNumber = wMinOrder;
|
|
MonoOutSetBlink( TRUE );
|
|
MonoOutStr( "<<< Self recovering NextSrbOrderNumber to " );
|
|
MonoOutULong( pHwDevExt->wNextSrbOrderNumber );
|
|
MonoOutStr( " >>>" );
|
|
MonoOutSetBlink( FALSE );
|
|
return TRUE;
|
|
}
|
|
else
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/*BOOL StartUpDiscontinue(PHW_DEVICE_EXTENSION pHwDevExt)
|
|
{
|
|
if(pHwDevExt->dwFirstVideoOrdNum != -1)
|
|
wMinOrder = min( (WORD)pHwDevExt->dwFirstVideoOrdNum, wMinOrder );
|
|
if(pHwDevExt->dwFirstAudioOrdNum != -1)
|
|
wMinOrder = min( (WORD)pHwDevExt->dwFirstAudioOrdNum, wMinOrder );
|
|
if(pHwDevExt->dwFirstSbpOrdNum != -1)
|
|
wMinOrder = min( (WORD)pHwDevExt->dwFirstSbpOrdNum, wMinOrder );
|
|
if((wMinOrder != -1) && (wMinOrder > pHwDevExt->wNextSrbOrderNumber) )
|
|
{
|
|
pHwDevExt->wNextSrbOrderNumber = wMinOrder ;
|
|
return TRUE;
|
|
}
|
|
else
|
|
return FALSE;
|
|
}*/
|
|
|
|
/*
|
|
** AdapterSendData()
|
|
**
|
|
** This routine is being scheduled by the either one of the input
|
|
** streams when it receives data or by the ISR when sending of the
|
|
** previos block is completed and there still Srbs pending.
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pHwDevExt - the hardware device extension.
|
|
**
|
|
** Returns: none
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
VOID STREAMAPI AdapterSendData( IN PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
PHW_STREAM_REQUEST_BLOCK pSrb;
|
|
DWORD dwPageToSend;
|
|
DWORD dwCurrentSample;
|
|
#ifndef DECODER_DVDPC
|
|
if(pHwDevExt->bAbortAtPause)
|
|
return;
|
|
#endif
|
|
// Check if HW is not busy and there is something to send
|
|
if( pHwDevExt->bInterruptPending ||
|
|
(pHwDevExt->pCurrentVideoSrb == NULL &&
|
|
pHwDevExt->pCurrentAudioSrb == NULL && pHwDevExt->pCurrentSubPictureSrb == NULL) )
|
|
return;
|
|
|
|
// Find the next Sample by the order number
|
|
for( ;; )
|
|
{
|
|
pSrb = NULL;
|
|
|
|
if( pHwDevExt->pCurrentVideoSrb &&
|
|
AdapterPrepareDataForSending( pHwDevExt, pHwDevExt->pCurrentVideoSrb,
|
|
pHwDevExt->dwCurrentVideoSample, &pSrb, &dwPageToSend,&dwCurrentSample,
|
|
pHwDevExt->dwCurrentVideoPage,&pHwDevExt->dwVideoDataUsed) )
|
|
continue;
|
|
if( pHwDevExt->pCurrentAudioSrb && pSrb == NULL &&
|
|
AdapterPrepareDataForSending( pHwDevExt, pHwDevExt->pCurrentAudioSrb,
|
|
pHwDevExt->dwCurrentAudioSample, &pSrb, &dwPageToSend,&dwCurrentSample,
|
|
pHwDevExt->dwCurrentAudioPage,&pHwDevExt->dwAudioDataUsed) )
|
|
continue;
|
|
if( pHwDevExt->pCurrentSubPictureSrb && pSrb == NULL &&
|
|
AdapterPrepareDataForSending( pHwDevExt, pHwDevExt->pCurrentSubPictureSrb,
|
|
pHwDevExt->dwCurrentSubPictureSample, &pSrb, &dwPageToSend,&dwCurrentSample,
|
|
pHwDevExt->dwCurrentSubPicturePage,&pHwDevExt->dwSubPictureDataUsed) )
|
|
continue;
|
|
|
|
if( pSrb != NULL ) // Found the right SRB
|
|
{
|
|
pHwDevExt->CurrentlySentStream = pSrb->StreamObject->StreamNumber;
|
|
break;
|
|
}
|
|
|
|
if(CanUpdateOrdinalNumber(pHwDevExt))
|
|
{
|
|
UpdateOrdinalNumber(pHwDevExt);
|
|
continue;
|
|
}
|
|
|
|
if(pHwDevExt->bEndFlush)
|
|
{
|
|
pHwDevExt->bEndFlush = FALSE;
|
|
MonoOutStr("Timer Scheduled for AdapterSendData");
|
|
StreamClassScheduleTimer( NULL, pHwDevExt,
|
|
400000,
|
|
(PHW_TIMER_ROUTINE)CallAdapterSendAtALaterTime,
|
|
pHwDevExt );
|
|
pHwDevExt->bTimerScheduled = TRUE;
|
|
|
|
|
|
}
|
|
|
|
if(UpdateOrdNum_MinOfAllThree(pHwDevExt))
|
|
continue;
|
|
// if(StartUpDiscontinue(pHwDevExt))
|
|
// continue;
|
|
|
|
MonoOutStr( "!! CD !!" );
|
|
//MonoOutStr( "!!!!!!!!!!!!!!! COUNTER DISCONTINUITY !!!!!!!!!!!!!!!!!!!" );
|
|
|
|
// Clean the CurrentlySentStream
|
|
pHwDevExt->CurrentlySentStream = ZivaNumberOfStreams;
|
|
|
|
return;
|
|
}
|
|
|
|
XferData(pSrb,pHwDevExt,dwPageToSend,dwCurrentSample);
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
** AdapterReleaseCurrentSrb()
|
|
**
|
|
** This routine is called by the AdapterSendData() and HWInterrupt() functions
|
|
** when there is no more data in the Currently processing Srb.
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - the request block to release.
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
VOID STREAMAPI AdapterReleaseCurrentSrb( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
PKSSTREAM_HEADER pHeader;
|
|
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
|
|
// Clear the CurrentSrb and Sample count for this Srb
|
|
switch( pSrb->StreamObject->StreamNumber )
|
|
{
|
|
case ZivaVideo:
|
|
pHwDevExt->pCurrentVideoSrb = NULL;
|
|
pHwDevExt->dwCurrentVideoSample = 0;
|
|
pHwDevExt->dwCurrentVideoPage = 0;
|
|
pHwDevExt->dwVideoDataUsed=0;
|
|
break;
|
|
case ZivaAudio:
|
|
pHwDevExt->pCurrentAudioSrb = NULL;
|
|
pHwDevExt->dwCurrentAudioSample = 0;
|
|
pHwDevExt->dwCurrentAudioPage = 0;
|
|
pHwDevExt->dwAudioDataUsed=0;
|
|
break;
|
|
case ZivaSubpicture:
|
|
pHwDevExt->pCurrentSubPictureSrb = NULL;
|
|
pHwDevExt->dwCurrentSubPictureSample = 0;
|
|
pHwDevExt->dwCurrentSubPicturePage = 0;
|
|
pHwDevExt->dwSubPictureDataUsed=0;
|
|
break;
|
|
default:
|
|
MonoOutStr( "!!!!!!!! Releasing Srb for UNKNOWN stream !!!!!!!!" );
|
|
}
|
|
|
|
// Check if this is the last Srb for current title
|
|
pHeader = (PKSSTREAM_HEADER)pSrb->CommandData.DataBufferArray+pSrb->NumberOfBuffers-1;
|
|
if( pHeader->TypeSpecificFlags & KS_AM_UseNewCSSKey )
|
|
{
|
|
switch( pSrb->StreamObject->StreamNumber )
|
|
{
|
|
case ZivaVideo:
|
|
MonoOutStr( "!!! Last video Srb !!!" );
|
|
pHwDevExt->bVideoCanAuthenticate = TRUE;
|
|
break;
|
|
|
|
case ZivaAudio:
|
|
MonoOutStr( "!!! Last audio Srb !!!" );
|
|
pHwDevExt->bAudioCanAuthenticate = TRUE;
|
|
break;
|
|
|
|
case ZivaSubpicture:
|
|
MonoOutStr( "!!! Last SP Srb !!!" );
|
|
pHwDevExt->bSubPictureCanAuthenticate = TRUE;
|
|
break;
|
|
|
|
default:
|
|
MonoOutStr( "!!!!!!!! Last Srb for UNKNOWN stream !!!!!!!!" );
|
|
}
|
|
}
|
|
|
|
AdapterReleaseRequest( pSrb );
|
|
}
|
|
|
|
|
|
/*
|
|
** AdapterReleaseRequest()
|
|
**
|
|
** This routine is called when any of the open pins (streams) wants
|
|
** to dispose an used request block.
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - the request block to release.
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
VOID STREAMAPI AdapterReleaseRequest( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
if( pSrb->Status == STATUS_PENDING )
|
|
MonoOutStr( " !!! Srb is PENDING - not releasing !!! " );
|
|
else
|
|
{
|
|
if( pSrb->Flags & SRB_HW_FLAGS_STREAM_REQUEST )
|
|
{
|
|
if( pSrb->Flags & SRB_HW_FLAGS_DATA_TRANSFER )
|
|
{
|
|
StreamClassStreamNotification( ReadyForNextStreamDataRequest, pSrb->StreamObject );
|
|
// MonoOutStr(" Release D");
|
|
}
|
|
else
|
|
{
|
|
StreamClassStreamNotification( ReadyForNextStreamControlRequest, pSrb->StreamObject );
|
|
// MonoOutStr(" Release C");
|
|
}
|
|
StreamClassStreamNotification( StreamRequestComplete, pSrb->StreamObject, pSrb );
|
|
}
|
|
else
|
|
{
|
|
StreamClassDeviceNotification( ReadyForNextDeviceRequest, pSrb->HwDeviceExtension );
|
|
StreamClassDeviceNotification( DeviceRequestComplete, pSrb->HwDeviceExtension, pSrb );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
** AdapterCanAuthenticateNow()
|
|
**
|
|
** This routine is called when Authentication request was made by the
|
|
** Class Driver.
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pHwDevExt - hardware device extension.
|
|
**
|
|
** Returns:
|
|
**
|
|
** TRUE if Authentication is allowed at this moment, FALSE otherwise.
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
BOOL STREAMAPI AdapterCanAuthenticateNow( IN PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
if( (pHwDevExt->bVideoStreamOpened == FALSE ||
|
|
(pHwDevExt->bVideoStreamOpened == TRUE && pHwDevExt->bVideoCanAuthenticate == TRUE)) &&
|
|
(pHwDevExt->bAudioStreamOpened == FALSE ||
|
|
(pHwDevExt->bAudioStreamOpened == TRUE && pHwDevExt->bAudioCanAuthenticate == TRUE)) &&
|
|
(pHwDevExt->bSubPictureStreamOpened == FALSE ||
|
|
(pHwDevExt->bSubPictureStreamOpened == TRUE && pHwDevExt->bSubPictureCanAuthenticate == TRUE)) )
|
|
return TRUE;
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
/*
|
|
** AdapterClearAuthenticationStatus()
|
|
**
|
|
** This routine is called when Authentication and key exchange was
|
|
** completed.
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pHwDevExt - hardware device extension.
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
VOID STREAMAPI AdapterClearAuthenticationStatus( IN PHW_DEVICE_EXTENSION pHwDevExt )
|
|
{
|
|
pHwDevExt->bVideoCanAuthenticate = FALSE;
|
|
pHwDevExt->bAudioCanAuthenticate = FALSE;
|
|
pHwDevExt->bSubPictureCanAuthenticate = FALSE;
|
|
}
|
|
|
|
|
|
/*
|
|
** AdapterSetState()
|
|
**
|
|
** Sets the current state
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - pointer to the stream request block for properties
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
BOOL AdapterSetState( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
|
|
PHW_STREAM_EXTENSION pStreamExt = (PHW_STREAM_EXTENSION)pSrb->StreamObject->HwStreamExtension;
|
|
|
|
DebugPrint(( DebugLevelVerbose, "ZiVA: AdapterSetState() -> " ));
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
|
|
// Execute appropriate command only when it comes for every stream
|
|
switch( pSrb->CommandData.StreamState )
|
|
{
|
|
case KSSTATE_STOP:
|
|
pStreamExt->ksState = pSrb->CommandData.StreamState;
|
|
#ifdef ENCORE
|
|
if( pSrb->StreamObject->StreamNumber == ZivaAnalog && pHwDevExt->nAnalogStreamOpened > 1 )
|
|
pHwDevExt->nStopCount -= pHwDevExt->nAnalogStreamOpened-1;
|
|
#endif
|
|
if( --pHwDevExt->nStopCount == 0 )
|
|
{
|
|
// ZwClose(Handle);
|
|
pHwDevExt->nStopCount = pHwDevExt->iTotalOpenedStreams;
|
|
DebugPrint(( DebugLevelVerbose, "Stop" ));
|
|
if( !ZivaHw_Abort() )
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
else
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
AdapterInitLocals(pHwDevExt);
|
|
}
|
|
break;
|
|
|
|
case KSSTATE_PAUSE:
|
|
pStreamExt->ksState = pSrb->CommandData.StreamState;
|
|
pStreamExt->bCanBeRun = TRUE;
|
|
if( (ZivaHw_GetState( ) == ZIVA_STATE_SCAN) || (ZivaHw_GetState( ) ==ZIVA_STATE_SLOWMOTION) )//sri
|
|
pHwDevExt->bAbortAtPause = TRUE;
|
|
|
|
#ifdef ENCORE
|
|
if( pSrb->StreamObject->StreamNumber == ZivaAnalog && pHwDevExt->nAnalogStreamOpened > 1 )
|
|
pHwDevExt->nPauseCount -= pHwDevExt->nAnalogStreamOpened-1;
|
|
#endif
|
|
if( --pHwDevExt->nPauseCount == 0 )
|
|
{
|
|
|
|
pHwDevExt->nPauseCount = pHwDevExt->iTotalOpenedStreams;
|
|
DebugPrint(( DebugLevelVerbose, "Pause" ));
|
|
|
|
if( !ZivaHw_Pause() )
|
|
{
|
|
MonoOutStr("Pause Failed");
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
case KSSTATE_RUN:
|
|
pStreamExt->ksState = pSrb->CommandData.StreamState;
|
|
#ifdef ENCORE
|
|
if( pSrb->StreamObject->StreamNumber == ZivaAnalog && pHwDevExt->nAnalogStreamOpened > 1 )
|
|
pHwDevExt->nPlayCount -= pHwDevExt->nAnalogStreamOpened-1;
|
|
#endif
|
|
if( --pHwDevExt->nPlayCount == 0 )
|
|
{
|
|
|
|
pHwDevExt->nPlayCount = pHwDevExt->iTotalOpenedStreams;
|
|
DebugPrint(( DebugLevelVerbose, "Run" ));
|
|
// We could be resuming playback here after Pause mode
|
|
if(pHwDevExt->bAbortAtPause)
|
|
{
|
|
pHwDevExt->bAbortAtPause = FALSE;
|
|
|
|
ZivaHw_Abort();
|
|
|
|
#ifdef DECODER_DVDPC
|
|
|
|
if( !ZivaHw_Play() ) // Just run the hardware
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
// pHwDevExt->bPlayCommandPending = TRUE;
|
|
// AdapterSendData(pHwDevExt);
|
|
#endif
|
|
|
|
#ifndef DECODER_DVDPC
|
|
pHwDevExt->bInterruptPending = FALSE;
|
|
pHwDevExt->bPlayCommandPending = TRUE;
|
|
FinishCurrentPacketAndSendNextOne( pHwDevExt );
|
|
AdapterSendData(pHwDevExt);
|
|
#endif
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
|
|
if( pHwDevExt->bInterruptPending )
|
|
{
|
|
if( !ZivaHw_Play() ) // Just run the hardware
|
|
pSrb->Status = STATUS_IO_DEVICE_ERROR;
|
|
}
|
|
else
|
|
{
|
|
// Since Authentication and Key Exchange comes in between
|
|
// "Run" command and actual data sending and ZiVA Microcode
|
|
// cannot sustain it - postpone issuing Play command to ZiVA
|
|
// until first packet of the data arrives.
|
|
pHwDevExt->bPlayCommandPending = TRUE;
|
|
// Kick the Adapter to start transferring data
|
|
AdapterSendData( pHwDevExt );
|
|
}
|
|
}
|
|
|
|
EnableVideo(pSrb);
|
|
}
|
|
break;
|
|
}
|
|
|
|
DebugPrint(( DebugLevelVerbose, "\nZiVA: End AdapterSetState()\n" ));
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
** AdapterReleaseControlRequest()
|
|
**
|
|
** This routine is called when any of the open pins (streams) wants
|
|
** to dispose an used control request block.
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - the request block to release.
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
VOID STREAMAPI AdapterReleaseControlRequest( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
if ( pSrb->Status == STATUS_PENDING )
|
|
{
|
|
MonoOutStr( " !!! Srb is PENDING - not releasing !!! " );
|
|
}
|
|
else
|
|
{
|
|
StreamClassStreamNotification( ReadyForNextStreamControlRequest,
|
|
pSrb->StreamObject);
|
|
|
|
StreamClassStreamNotification( StreamRequestComplete,
|
|
pSrb->StreamObject,
|
|
pSrb);
|
|
// MonoOutStr(" Release ");
|
|
}
|
|
}
|
|
|
|
/*
|
|
** AdapterReleaseDataRequest()
|
|
**
|
|
** This routine is called when any of the open pins (streams) wants
|
|
** to dispose an used data request block.
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - the request block to release.
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
VOID STREAMAPI AdapterReleaseDataRequest( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
if ( pSrb->Status == STATUS_PENDING )
|
|
{
|
|
MonoOutStr( " !!! Srb is PENDING - not releasing !!! " );
|
|
}
|
|
else
|
|
{
|
|
StreamClassStreamNotification( ReadyForNextStreamDataRequest,
|
|
pSrb->StreamObject);
|
|
|
|
StreamClassStreamNotification( StreamRequestComplete,
|
|
pSrb->StreamObject,
|
|
pSrb);
|
|
// MonoOutStr(" ReleaseData ");
|
|
}
|
|
}
|
|
|
|
/*
|
|
** AdapterReleaseDeviceRequest()
|
|
**
|
|
** This routine is called when any of the open pins (streams) wants
|
|
** to dispose an used device request block.
|
|
**
|
|
** Arguments:
|
|
**
|
|
** pSrb - the request block to release.
|
|
**
|
|
** Returns:
|
|
**
|
|
** Side Effects: none
|
|
*/
|
|
VOID STREAMAPI AdapterReleaseDeviceRequest( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
StreamClassDeviceNotification( ReadyForNextDeviceRequest,
|
|
pSrb->HwDeviceExtension);
|
|
|
|
StreamClassDeviceNotification( DeviceRequestComplete,
|
|
pSrb->HwDeviceExtension,
|
|
pSrb);
|
|
}
|
|
|
|
VOID STREAMAPI AdapterReleaseCtrlDataSrb( PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
PHW_DEVICE_EXTENSION pHwDevExt = ((PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension);
|
|
KSSTREAM_HEADER *pHeader;
|
|
|
|
//
|
|
// Clear the CurrentSrb and Sample count for this Srb
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
|
|
//
|
|
// Check if this is the last Srb for current title
|
|
//
|
|
|
|
pHeader = ((KSSTREAM_HEADER *)(pSrb->CommandData.DataBufferArray)) ;
|
|
|
|
if ( pHeader->TypeSpecificFlags & KS_AM_UseNewCSSKey )
|
|
{
|
|
switch ( pSrb->StreamObject->StreamNumber )
|
|
{
|
|
case ZivaVideo:
|
|
pHwDevExt->bVideoCanAuthenticate = TRUE;
|
|
break;
|
|
|
|
case ZivaAudio:
|
|
pHwDevExt->bAudioCanAuthenticate = TRUE;
|
|
break;
|
|
|
|
case ZivaSubpicture:
|
|
pHwDevExt->bSubPictureCanAuthenticate = TRUE;
|
|
break;
|
|
|
|
default:
|
|
MonoOutStr( "!!!!!!!! Last Srb for UNKNOWN stream !!!!!!!!" );
|
|
}
|
|
}
|
|
|
|
AdapterReleaseDataRequest( pSrb );
|
|
}
|
|
|
|
|
|
BOOL CheckAndReleaseIfCtrlPkt(PHW_STREAM_REQUEST_BLOCK pSrb)
|
|
{
|
|
KSSTREAM_HEADER *pHeader;
|
|
pHeader = ((PKSSTREAM_HEADER)pSrb->CommandData.DataBufferArray);
|
|
|
|
if (pHeader->TypeSpecificFlags & KS_AM_UseNewCSSKey)
|
|
{
|
|
if (pSrb->NumberOfBuffers == 0)
|
|
{
|
|
AdapterReleaseCtrlDataSrb(pSrb);
|
|
return TRUE;
|
|
}
|
|
else if (pSrb->NumberOfBuffers == 1)
|
|
{
|
|
BYTE *pData;
|
|
DWORD dwDataUsed;
|
|
|
|
pData = pHeader->Data;
|
|
dwDataUsed = pHeader->DataUsed;
|
|
|
|
if ((dwDataUsed == 0) ||
|
|
(pData && *((DWORD*)pData) != 0xBA010000))
|
|
{
|
|
AdapterReleaseCtrlDataSrb(pSrb);
|
|
return TRUE;;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
|
|
#if 0
|
|
static void STREAMAPI CreateFile(PHW_STREAM_REQUEST_BLOCK pSrb )
|
|
{
|
|
|
|
NTSTATUS ntStatus;
|
|
|
|
ASSERT( pSrb->Status == STATUS_PENDING );
|
|
|
|
RtlInitUnicodeString (&pathUnicodeString,wPath);
|
|
|
|
|
|
|
|
InitializeObjectAttributes(&InitializedAttributes,&pathUnicodeString,OBJ_CASE_INSENSITIVE,NULL,NULL);
|
|
// InitializedAttributes.Length = 2048;
|
|
// AllocSize.QuadPart=0xffff;
|
|
// ntStatus = ZwCreateFile(&Handle,FILE_WRITE_DATA,
|
|
// &InitializedAttributes,&IOStatusBlock,
|
|
// 0,FILE_ATTRIBUTE_NORMAL,0,FILE_SUPERSEDE,
|
|
// FILE_NO_INTERMEDIATE_BUFFERING,NULL,0);
|
|
ntStatus = ZwCreateFile( &Handle,
|
|
GENERIC_WRITE,
|
|
&InitializedAttributes,
|
|
&IOStatusBlock,
|
|
NULL, // alloc size = none
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
0,
|
|
FILE_CREATE,
|
|
FILE_WRITE_THROUGH,
|
|
NULL, // eabuffer
|
|
0 ); // ealength
|
|
|
|
if(NT_SUCCESS(ntStatus))
|
|
MonoOutStr("File Creation success");
|
|
|
|
MonoOutULong(IOStatusBlock.Information);
|
|
|
|
if( (IOStatusBlock.Information == FILE_CREATED) || (IOStatusBlock.Information == FILE_OPENED) )
|
|
MonoOutStr("File Creation success");
|
|
else
|
|
MonoOutStr("File Creation failed");
|
|
|
|
pSrb->Status = STATUS_SUCCESS;
|
|
|
|
StreamClassCallAtNewPriority( pSrb->StreamObject, pSrb->HwDeviceExtension, LowToHigh,
|
|
(PHW_PRIORITY_ROUTINE)AdapterReleaseRequest, pSrb );
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*WriteFile()
|
|
{
|
|
if(STATUS_SUCCESS != ZwWriteFile(Handle,NULL,NULL,NULL,&IOStatusBlock,pdwPhysAddress ,dwCount,NULL,NULL))
|
|
MonoOutStr("WriteOperationFailed");
|
|
}*/
|