windows-nt/Source/XPSP1/NT/drivers/wdm/dvd/mini/tecra/schdat.cpp
2020-09-26 16:20:57 +08:00

830 lines
25 KiB
C++

//**************************************************************************
//
// Title : SchDat.cpp
//
// Date : 1998.03.10 1st making
//
// Author : Toshiba [PCS](PSY) Hideki Yagi
//
// Copyright 1997 Toshiba Corporation. All Rights Reserved.
//
// -------------------------------------------------------------------------
//
// Change log :
//
// Date Revision Description
// ------------ ---------- -----------------------------------------------
// 1998.03.10 000.0000 1st making.
//
//**************************************************************************
#include "includes.h"
#include "hal.h"
#include "wdmkserv.h"
#include "mpevent.h"
#include "classlib.h"
#include "ctime.h"
#include "schdat.h"
#include "ccque.h"
#include "ctvctrl.h"
#include "hlight.h"
#include "hwdevex.h"
#include "wdmbuff.h"
#include "dvdinit.h"
VOID ScanCallBack( PHW_DEVICE_EXTENSION pHwDevExt );
CScheduleData::CScheduleData( void )
{
count = 0;
pTopSrb = pBottomSrb = NULL;
fScanCallBack = FALSE;
#ifndef REARRANGEMENT
InitRearrangement();
#endif REARRANGEMENT
}
CScheduleData::~CScheduleData( void )
{
count = 0;
pTopSrb = pBottomSrb = NULL;
fScanCallBack = FALSE;
}
BOOL CScheduleData::Init( void )
{
count = 0;
pTopSrb = pBottomSrb = NULL;
fScanCallBack = FALSE;
KeInitializeEvent( &m_Event,
SynchronizationEvent,
FALSE //TRUE,
);
#ifndef REARRANGEMENT
InitRearrangement();
#endif REARRANGEMENT
return( TRUE );
}
BOOL CScheduleData::SendData( PHW_STREAM_REQUEST_BLOCK pSrb )
//------------------------------------packet rearrangement code--------------------------------
#ifndef REARRANGEMENT
{
KSSTREAM_HEADER * pHeader;
WORD wOrderNumber = 0;
WORD wReadPacketNumber = 0, wWdmBuffptr = 0, wDvdDataptr = 0, wSrbCounter = 0;
WORD wLateNumber = 0;
BOOL bLateData = FALSE;
ULONG ulNumber = 0;
ASSERT( pSrb != NULL );
ASSERT( pSrb->SRBExtension != NULL );
//------------------packet partition---------------
for( ulNumber = 0; ulNumber < pSrb->NumberOfBuffers; ulNumber++ )
{
pHeader = ((PKSSTREAM_HEADER)pSrb->CommandData.DataBufferArray) + ulNumber;
wOrderNumber = (WORD)(pHeader->TypeSpecificFlags >> 16); //get packet number
DBG_PRINTF( ("DVDWDM:ScheduleData::SendData-Start--- pSrb=%x m_SendPacketNumber=%x wOrderNumber=%x\n\r", pSrb,m_SendPacketNumber,wOrderNumber));
if ((ulNumber == 0) && (pSrb->Status == STATUS_PENDING))
{
if (m_SendPacketNumber == 0)
{
m_SendPacketNumber = wOrderNumber;
if (wOrderNumber != 0)
{
WORD InvalidDataCnt;
for(InvalidDataCnt = 0; InvalidDataCnt < wOrderNumber; InvalidDataCnt++)
{
if( m_bDvdDataTable[InvalidDataCnt] == INVALID_DVD_DATA)
m_bDvdDataTable[InvalidDataCnt] = INIT_DVD_DATA;
}
}
}
wReadPacketNumber = wOrderNumber; //set original data
wWdmBuffptr = 0; //init packet partition counter
SetWdmBuff(pSrb, wWdmBuffptr, wReadPacketNumber, ulNumber);
//---------------Late data check-----------
if (((m_SendPacketNumber < 0x1000) && ((wOrderNumber < m_SendPacketNumber) || (wOrderNumber > (m_SendPacketNumber + 0xf000))))
|| ((m_SendPacketNumber >= 0x1000) && (((m_SendPacketNumber - 0x1000) < wOrderNumber) && (wOrderNumber < m_SendPacketNumber))))
{
wLateNumber = wOrderNumber;
bLateData = TRUE;
}
}
//---------------Set DVD data table--------
if (pSrb->Status == STATUS_PENDING)
m_bDvdDataTable[wOrderNumber] = VALID_DVD_DATA; //valid DVD data receive
else
{
if (((m_SendPacketNumber < 0x1000) && ((wOrderNumber < m_SendPacketNumber) || (wOrderNumber > (m_SendPacketNumber + 0xf000))))
|| ((m_SendPacketNumber >= 0x1000) && (((m_SendPacketNumber - 0x1000) < wOrderNumber) && (wOrderNumber < m_SendPacketNumber))))
{
m_bDvdDataTable[wOrderNumber] = INIT_DVD_DATA; //invalid DVD data(Late) receive
}
else
{
m_bDvdDataTable[wOrderNumber] = INVALID_DVD_DATA; //invalid DVD data receive
}
DBG_PRINTF( ("DVDWDM:ScheduleData::SendData---InvalidData wOrderNumber = %x\n\r", wOrderNumber));
return(TRUE);
}
if (wReadPacketNumber != wOrderNumber) //packet number continuity check
{ //packet partition
(((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_EndFlag = FALSE;
(((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_PacketNum =
(WORD)(wReadPacketNumber - (((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_StartPacketNumber);
wWdmBuffptr++; //packet partition counter up
wReadPacketNumber = wOrderNumber; //set original data
SetWdmBuff(pSrb, wWdmBuffptr, wReadPacketNumber, ulNumber);
}
if (wReadPacketNumber == (DVD_DATA_MAX - 1)) wReadPacketNumber = 0;
else wReadPacketNumber++;
ASSERT (wWdmBuffptr != WDM_BUFFER_MAX);
}
//last packet number institution
(((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_PacketNum =
(WORD)(wReadPacketNumber - (((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_StartPacketNumber);
//--------------save srb pointer----------------
wSrbCounter = SetSrbPointerTable( pSrb );
ASSERT (wSrbCounter != SRB_POINTER_MAX);
if (wSrbCounter == SRB_POINTER_MAX)
return(FALSE);
//--------------------------------receive-end------------------------------------
//--------------------------------send-start-------------------------------------
for(;;) //send packet
{
if ((wSrbCounter > 0x20) && (m_bDvdDataTable[m_SendPacketNumber] == INIT_DVD_DATA))
{
DBG_PRINTF( ("DVDWDM:ScheduleData::wSrbCounter > 3\n\r"));
for( wDvdDataptr = 0; wDvdDataptr < DVD_DATA_MAX; wDvdDataptr++)
{
if (m_bDvdDataTable[m_SendPacketNumber] != INIT_DVD_DATA)
break;
IncSendPacketNumber();
}
}
wSrbCounter = 0;
SkipInvalidDvdData();
//-----------------LateData Send ---------------------------
if (bLateData == TRUE)
{
WORD CheckMax;
DBG_PRINTF( ("DVDWDM:ScheduleData::LateData Start\n\r"));
if (m_SendPacketNumber == 0) CheckMax = (WORD)(DVD_DATA_MAX - 1);
else CheckMax = (WORD)(m_SendPacketNumber - 1);
for( ;wLateNumber != CheckMax;)
{
if( m_bDvdDataTable[wLateNumber] == VALID_DVD_DATA)
SendPacket(wLateNumber);
if (wLateNumber == (DVD_DATA_MAX - 1)) wLateNumber = 0;
else wLateNumber++;
}
bLateData = FALSE;
DBG_PRINTF( ("DVDWDM:ScheduleData::LateData End\n\r"));
}
//-----------
if( m_bDvdDataTable[m_SendPacketNumber] != VALID_DVD_DATA)
break;
//-----------------search send packet & SendData------------
BOOL ret = SendPacket(m_SendPacketNumber);
ASSERT (ret != FALSE);
if (ret == FALSE)
{
IncSendPacketNumber();
return(FALSE);
}
} //End For
return( TRUE );
}
#else
//------------------------------------before code--------------------------------
{
PHW_DEVICE_EXTENSION pHwDevExt;
PKSSTREAM_HEADER pStruc;
IMPEGBuffer *MPBuff;
// PHW_STREAM_REQUEST_BLOCK pTmpSrb;
DWORD WaitTime=0;
ASSERT( pSrb != NULL );
ASSERT( pSrb->SRBExtension != NULL );
pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[0];
MPBuff = &(((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff);
ASSERT( pHwDevExt != NULL );
ASSERT( pStruc != NULL );
ASSERT( MPBuff );
DBG_PRINTF( ("DVDWDM:ScheduleData--- pHwDevExt->Rate=%d\n\r", pHwDevExt->Rate ));
// F.F. or F.R.
if( pHwDevExt->Rate < 10000 ){
// FastSlowControl( pSrb ); // Modify PTS/DTS
putSRB( pSrb );
if( fScanCallBack==FALSE ){ // 1st time putting SRB?
DWORD pts = GetDataPTS( pStruc );
if( pts!=0xffffffff )
{
// pHwDevExt->ticktime.SetStreamTime( (ULONGLONG)pts * 1000 / 9 );
WaitTime = pHwDevExt->scheduler.calcWaitTime( pSrb );
if( WaitTime==0 ){
WaitTime = 1;
}
//--- 98.09.17 S.Watanabe
}
else {
WaitTime = 1;
}
//--- End.
StreamClassScheduleTimer( pHwDevExt->pstroVid,
pHwDevExt,
WaitTime*1000,
(PHW_TIMER_ROUTINE)ScanCallBack,
pHwDevExt
);
fScanCallBack = TRUE;
//--- 98.09.17 S.Watanabe
// };
// return( TRUE );
//--- End.
}
}else{
pHwDevExt->dvdstrm.SendData( MPBuff );
}
return( TRUE );
}
#endif REARRANGEMENT
DWORD CScheduleData::GetDataPTS( PKSSTREAM_HEADER pStruc )
{
PUCHAR pDat;
DWORD pts = 0xffffffff;
if( pStruc->DataUsed ){
pDat = (PUCHAR)pStruc->Data;
if( *(pDat+21) & 0x80 ){
pts = 0;
pts += ((DWORD)(*(pDat+23)& 0x0E) ) << 29;
pts += ((DWORD)(*(pDat+24)& 0xFF) ) << 22;
pts += ((DWORD)(*(pDat+25)& 0xFE) ) << 14;
pts += ((DWORD)(*(pDat+26)& 0xFF) ) << 7;
pts += ((DWORD)(*(pDat+27)& 0xFE) ) >> 1;
}
}
return( pts );
}
DWORD CScheduleData::calcWaitTime( PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt;
PKSSTREAM_HEADER pStruc;
pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[0];
DWORD WaitTime, pts, DataStrm;
WaitTime = DataStrm= 0;
// Get PTS value from data.
pts = GetDataPTS( pStruc );
if( pts!=0xffffffff ){
DBG_PRINTF( ("DVDWDM: Data PTS = 0x%08x\n\r", pts) );
DWORD dwstc;
if( pHwDevExt->ticktime.GetStreamSTC( &dwstc ) ){
DBG_PRINTF( ("DVDWDM: Borad STC = 0x%08x\n\r", dwstc) );
if( dwstc < pts ){
WaitTime = (pts - dwstc)/90; // ms unit
WaitTime = WaitTime / (10000 / pHwDevExt->Rate );
}
}else{
WaitTime = 0;
}
DBG_PRINTF( ("DVDWDM: Schedule Data---- WaitTime =0x%08x WaitTime(ms)=%0d\n\r", WaitTime, WaitTime ) );
}
//--- 98.09.07 S.Watanabe
//--- 98.09.17 S.Watanabe
// if( WaitTime > 300 ) {
if( WaitTime > 500 ) {
//--- End.
DBG_PRINTF( ("DVDWDM: Invalid WaitTime!! change to 1ms!!\n\r" ) );
WaitTime = 1;
}
//--- End.
return( WaitTime );
}
void CScheduleData::putSRB( PHW_STREAM_REQUEST_BLOCK pSrb )
{
pSrb->NextSRB = NULL;
if( pTopSrb == NULL ){
pTopSrb = pBottomSrb = pSrb;
count++;
return;
}
pBottomSrb->NextSRB = pSrb;
pBottomSrb = pSrb;
count++;
return;
}
PHW_STREAM_REQUEST_BLOCK CScheduleData::getSRB( void )
{
PHW_STREAM_REQUEST_BLOCK pTmp;
if( pTopSrb==NULL ){
return( NULL );
}
pTmp = pTopSrb;
pTopSrb = pTopSrb->NextSRB;
count--;
if( count==0 ){
pTopSrb = pBottomSrb = NULL;
fScanCallBack = FALSE;
}
return( pTmp );
}
PHW_STREAM_REQUEST_BLOCK CScheduleData::checkTopSRB( void )
{
return( pTopSrb );
}
void CScheduleData::flushSRB()
{
PHW_STREAM_REQUEST_BLOCK pTmp;
if( pTopSrb==NULL){
return;
}
pTmp = getSRB();
while( pTmp != NULL ){
pTmp = getSRB();
}
//--- 98.09.17 S.Watanabe
// fScanCallBack = TRUE;
fScanCallBack = FALSE;
//--- End.
}
void CScheduleData::FastSlowControl( PHW_STREAM_REQUEST_BLOCK pSrb )
{
PHW_DEVICE_EXTENSION pHwDevExt;
ULONG i;
PKSSTREAM_HEADER pStruc;
PUCHAR pDat;
LONGLONG pts, dts, tmp;
LONG Rate;
LONGLONG start;
REFERENCE_TIME InterceptTime;
pts = dts = tmp = 0;
pHwDevExt = (PHW_DEVICE_EXTENSION)pSrb->HwDeviceExtension;
for( i=0; i<pSrb->NumberOfBuffers; i++ ){
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[i];
if( pStruc->DataUsed ){
pDat = (PUCHAR)pStruc->Data;
if( *(pDat+21) & 0x80 ){
pts += ((DWORD)(*(pDat+23) & 0x0E)) << 29;
pts += ((DWORD)(*(pDat+24) & 0xFF)) << 22;
pts += ((DWORD)(*(pDat+25) & 0xFE)) << 14;
pts += ((DWORD)(*(pDat+26) & 0xFF)) << 7;
pts += ((DWORD)(*(pDat+27) & 0xFE)) >> 1;
}
}
}
pts = 0;
if( pHwDevExt->Rate < 10000 ){
Rate = pHwDevExt->Rate;
InterceptTime = pHwDevExt->InterceptTime;
start = pHwDevExt->StartTime * 9 / 1000;
for( i=0; i<pSrb->NumberOfBuffers; i++ ){
pStruc = &((PKSSTREAM_HEADER)(pSrb->CommandData.DataBufferArray))[i];
if( pStruc->DataUsed ){
pDat = (PUCHAR)pStruc->Data;
// PTS modify
if( *(pDat+21) & 0x80 ){
pts += ((DWORD)(*(pDat+23) & 0x0E)) << 29;
pts += ((DWORD)(*(pDat+24) & 0xFF)) << 22;
pts += ((DWORD)(*(pDat+25) & 0xFE)) << 14;
pts += ((DWORD)(*(pDat+26) & 0xFF)) << 7;
pts += ((DWORD)(*(pDat+27) & 0xFE)) >> 1;
tmp = pts;
pts = Rate * ( pts-(InterceptTime * 9/ 1000) )/10000;
*(pDat+23) = (UCHAR)(((pts & 0xC0000000) >> 29 ) | 0x11);
*(pDat+24) = (UCHAR)(((pts & 0x3FC00000) >> 22 ) | 0x00);
*(pDat+25) = (UCHAR)(((pts & 0x003F8000) >> 14 ) | 0x01);
*(pDat+26) = (UCHAR)(((pts & 0x00007F80) >> 7 ) | 0x00);
*(pDat+27) = (UCHAR)(((pts & 0x0000007F) << 1 ) | 0x01);
}
// DTS modify
if( *(pDat+17) == 0xE0 ){
if( (*(pDat+21) & 0xC0) == 0xC0 ){
dts += ((DWORD)(*(pDat+28) & 0x0E)) << 29;
dts += ((DWORD)(*(pDat+29) & 0xFF)) << 22;
dts += ((DWORD)(*(pDat+30) & 0xFE)) << 14;
dts += ((DWORD)(*(pDat+31) & 0xFF)) << 7;
dts += ((DWORD)(*(pDat+32) & 0xFE)) >> 1;
dts = pts - (tmp - dts);
*(pDat+28) = (UCHAR)(((dts & 0xC0000000) >> 29 ) | 0x11);
*(pDat+29) = (UCHAR)(((dts & 0x3FC00000) >> 22 ) | 0x00);
*(pDat+30) = (UCHAR)(((dts & 0x003F8000) >> 14 ) | 0x01);
*(pDat+31) = (UCHAR)(((dts & 0x00007F80) >> 7 ) | 0x00);
*(pDat+32) = (UCHAR)(((dts & 0x0000007F) << 1 ) | 0x01);
}
}
}
}
}
}
BOOL CScheduleData::removeSRB( PHW_STREAM_REQUEST_BLOCK pSrb )
{
if( pTopSrb==NULL ){
return( FALSE );
}
if( pTopSrb == pSrb ){
pTopSrb = pTopSrb->NextSRB;
count--;
// 1998.8.21 S.Watanabe
// if( count==0 )
// pTopSrb = pBottomSrb = NULL;
if( count==0 ) {
pTopSrb = pBottomSrb = NULL;
fScanCallBack = FALSE;
}
// End
return( TRUE );
}
PHW_STREAM_REQUEST_BLOCK srbPrev;
PHW_STREAM_REQUEST_BLOCK srb;
srbPrev = pTopSrb;
srb = srbPrev->NextSRB;
while( srb!=NULL ){
if( srb==pSrb ){
srbPrev->NextSRB = srb->NextSRB;
// 1998.8.21 S.Watanabe
// if( srbPrev->NextSRB == pBottomSrb ){
if( srb == pBottomSrb ){
// End
pBottomSrb = srbPrev;
}
count--;
return( TRUE );
}
srbPrev = srb;
srb = srbPrev->NextSRB;
}
return( FALSE );
}
void ScanCallBack( PHW_DEVICE_EXTENSION pHwDevExt )
{
DBG_PRINTF( ("DVDWDM: ScanCallBack\n\r") );
PKSSTREAM_HEADER pStruc = NULL;
IMPEGBuffer *MPBuff = NULL;
PHW_STREAM_REQUEST_BLOCK pTmpSrb = NULL;
DWORD WaitTime=0;
LIBSTATE strmState;
DWORD pts;
#ifndef REARRANGEMENT
WORD wWdmBuffptr;
#endif REARRANGEMENT
ASSERT( pHwDevExt != NULL );
pHwDevExt->kserv.DisableHwInt();
pTmpSrb = pHwDevExt->scheduler.getSRB();
if( pTmpSrb == NULL ){
pHwDevExt->scheduler.fScanCallBack = FALSE;
pHwDevExt->kserv.EnableHwInt();
return;
}else{
pStruc = &((PKSSTREAM_HEADER)(pTmpSrb->CommandData.DataBufferArray))[0];
pts = pHwDevExt->scheduler.GetDataPTS( pStruc );
if( pts!=0xffffffff )
pHwDevExt->ticktime.SetStreamTime( (ULONGLONG)pts * 1000 / 9 );
#ifndef REARRANGEMENT
for( wWdmBuffptr = 0; wWdmBuffptr < WDM_BUFFER_MAX; wWdmBuffptr++)
{
MPBuff = &(((PSRB_EXTENSION)(pTmpSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]);
ASSERT( MPBuff );
strmState = pHwDevExt->dvdstrm.GetState();
if( strmState!=Stop && strmState!=PowerOff )
{
if ((((PSRB_EXTENSION)(pTmpSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_Enable == TRUE)
{
pHwDevExt->dvdstrm.SendData( MPBuff );
(((PSRB_EXTENSION)(pTmpSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_Enable = FALSE;
break;
}
}
if ((((PSRB_EXTENSION)(pTmpSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_EndFlag == TRUE)
{
break; //last buffer
}
}
#else
MPBuff = &(((PSRB_EXTENSION)(pTmpSrb->SRBExtension))->m_wdmbuff);
ASSERT( MPBuff );
strmState = pHwDevExt->dvdstrm.GetState();
if( strmState!=Stop && strmState!=PowerOff ){
pHwDevExt->dvdstrm.SendData( MPBuff );
}
#endif REARRANGEMENT
}
while( (pTmpSrb = pHwDevExt->scheduler.checkTopSRB())!=NULL ){
pStruc = &((PKSSTREAM_HEADER)(pTmpSrb->CommandData.DataBufferArray))[0];
// Check PTS is valid
pts = pHwDevExt->scheduler.GetDataPTS( pStruc );
if( pts!=0xffffffff ){
WaitTime = pHwDevExt->scheduler.calcWaitTime( pTmpSrb );
if( WaitTime==0 ){
WaitTime = 1;
}
StreamClassScheduleTimer( pHwDevExt->pstroVid,
pHwDevExt,
WaitTime*1000,
(PHW_TIMER_ROUTINE)ScanCallBack,
pHwDevExt
);
pHwDevExt->kserv.EnableHwInt();
return;
}else{
pTmpSrb = pHwDevExt->scheduler.getSRB();
#ifndef REARRANGEMENT
for( wWdmBuffptr = 0; wWdmBuffptr < WDM_BUFFER_MAX; wWdmBuffptr++)
{
MPBuff = &(((PSRB_EXTENSION)(pTmpSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]);
ASSERT( MPBuff );
strmState = pHwDevExt->dvdstrm.GetState();
if( strmState!=Stop && strmState!=PowerOff )
{
if ((((PSRB_EXTENSION)(pTmpSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_Enable == TRUE)
{
pHwDevExt->dvdstrm.SendData( MPBuff );
(((PSRB_EXTENSION)(pTmpSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_Enable = FALSE;
break;
}
}
if ((((PSRB_EXTENSION)(pTmpSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_EndFlag == TRUE)
{
break; //last buffer
}
}
#else
MPBuff = &(((PSRB_EXTENSION)(pTmpSrb->SRBExtension))->m_wdmbuff);
ASSERT( MPBuff );
strmState = pHwDevExt->dvdstrm.GetState();
if( strmState!=Stop && strmState!=PowerOff ){
pHwDevExt->dvdstrm.SendData( MPBuff );
}
#endif REARRANGEMENT
}
}
pHwDevExt->scheduler.fScanCallBack = FALSE;
pHwDevExt->kserv.EnableHwInt();
}
#ifndef REARRANGEMENT
void CScheduleData::InitRearrangement(void)
{
memset(m_bDvdDataTable, INIT_DVD_DATA, DVD_DATA_MAX);
memset(m_SrbPointerTable, NULL, SRB_POINTER_MAX * 4);
m_SendPacketNumber = 0;
}
WORD CScheduleData::SetSrbPointerTable( PHW_STREAM_REQUEST_BLOCK pSrb )
{
WORD wSrbptr;
for( wSrbptr = 0; wSrbptr < SRB_POINTER_MAX; wSrbptr++) //search empty for SRB pointer table
{
if (m_SrbPointerTable[wSrbptr] == NULL)
{
m_SrbPointerTable[wSrbptr] = (LONG)pSrb; //set SRB pointer
break;
}
}
DBG_PRINTF( ("DVDWDM:ScheduleData::SetSrbPointerTable--- m_SrbPointerTable[%x]=%x\n\r", wSrbptr,pSrb));
ASSERT(wSrbptr != SRB_POINTER_MAX);
return(wSrbptr);
}
void CScheduleData::SkipInvalidDvdData(void)
{
WORD wDvdDataptr;
for( wDvdDataptr = 0; wDvdDataptr < DVD_DATA_MAX; wDvdDataptr++)
{
if (m_bDvdDataTable[m_SendPacketNumber] != INVALID_DVD_DATA)
break;
m_bDvdDataTable[m_SendPacketNumber] = INIT_DVD_DATA;
IncSendPacketNumber();
DBG_PRINTF( ("DVDWDM:ScheduleData::SkipInvalidDvdData--- SKIP\n\r"));
}
DBG_PRINTF( ("DVDWDM:ScheduleData::SkipInvalidDvdData--- m_SendPacketNumber=%x\n\r", m_SendPacketNumber));
}
void CScheduleData::SetWdmBuff(PHW_STREAM_REQUEST_BLOCK pSrb, WORD wWdmBuffptr, WORD wReadPacketNumber, ULONG ulNumber)
{
(((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_BuffNumber = wWdmBuffptr;
(((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_EndFlag = TRUE;
(((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_StartPacketNumber = wReadPacketNumber;
(((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_BeforePacketNum = (WORD)ulNumber;
(((PSRB_EXTENSION)(pSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_Enable = TRUE;
DBG_PRINTF( ("DVDWDM:ScheduleData::SetWdmBuff--- Srb = %x m_wdmbuff[%x].m_StartPacketNumber=%x\n\r", pSrb,wWdmBuffptr,wReadPacketNumber));
}
void CScheduleData::IncSendPacketNumber(void)
{
m_SendPacketNumber++;
if (m_SendPacketNumber >= DVD_DATA_MAX)
m_SendPacketNumber = 0;
}
void CScheduleData::SendWdmBuff(PHW_STREAM_REQUEST_BLOCK pWorkSrb, IMPEGBuffer *MPBuff)
{
PHW_DEVICE_EXTENSION pHwDevExt;
PKSSTREAM_HEADER pStruc;
DWORD WaitTime = 0;
pHwDevExt = (PHW_DEVICE_EXTENSION)pWorkSrb->HwDeviceExtension;
pStruc = &((PKSSTREAM_HEADER)(pWorkSrb->CommandData.DataBufferArray))[0];
ASSERT( pHwDevExt != NULL );
ASSERT( pStruc != NULL );
ASSERT( MPBuff );
DBG_PRINTF( ("DVDWDM:ScheduleData--- pHwDevExt->Rate=%d\n\r", pHwDevExt->Rate )); // F.F. or F.R.
if( pHwDevExt->Rate < 10000 )
{
putSRB( pWorkSrb );
if( fScanCallBack==FALSE ) // 1st time putting SRB?
{
DWORD pts = GetDataPTS( pStruc );
if( pts!=0xffffffff )
{
WaitTime = pHwDevExt->scheduler.calcWaitTime( pWorkSrb );
if( WaitTime==0 )
WaitTime = 1;
}
else
WaitTime = 1;
StreamClassScheduleTimer( pHwDevExt->pstroVid,
pHwDevExt,
WaitTime*1000,
(PHW_TIMER_ROUTINE)ScanCallBack,
pHwDevExt
);
DBG_PRINTF( ("DVDWDM:ScheduleData::SendWdmBuff-StreamClassScheduleTimer()--- Srb=%x\n\r", pWorkSrb));
fScanCallBack = TRUE;
}
}
else
{
pHwDevExt->dvdstrm.SendData( MPBuff );
DBG_PRINTF( ("DVDWDM:ScheduleData::SendWdmBuff-SendData()--- Srb=%x\n\r", pWorkSrb));
}
}
BOOL CScheduleData::SendPacket(INT SendNumber)
{
PHW_STREAM_REQUEST_BLOCK pWorkSrb = 0L;
IMPEGBuffer *MPBuff = 0;
WORD wSrbptr = 0, wWdmBuffptr = 0;
BOOL Find = FALSE;
for( wSrbptr = 0; wSrbptr < SRB_POINTER_MAX; wSrbptr++)
{
if (m_SrbPointerTable[wSrbptr] != NULL)
{
pWorkSrb = (PHW_STREAM_REQUEST_BLOCK)m_SrbPointerTable[wSrbptr]; //get SRB pointer
for( wWdmBuffptr = 0; wWdmBuffptr < WDM_BUFFER_MAX; wWdmBuffptr++)
{
MPBuff = &(((PSRB_EXTENSION)(pWorkSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]);
if (SendNumber == (((PSRB_EXTENSION)(pWorkSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_StartPacketNumber)
{
DBG_PRINTF( ("DVDWDM:ScheduleData::SendPacket-Find--- Srb=%x m_wdmbuff[%x]\n\r", pWorkSrb,wWdmBuffptr));
DBG_PRINTF( ("DVDWDM:ScheduleData::SendPacket-Find--- SendNumber=%x\n\r", SendNumber));
Find = TRUE; //find send packet
break;
}
if ((((PSRB_EXTENSION)(pWorkSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_EndFlag == TRUE)
break; //last buffer
}
if (Find == TRUE)
{
if((((PSRB_EXTENSION)(pWorkSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_EndFlag == TRUE)
m_SrbPointerTable[wSrbptr] = NULL;
break;
}
}
}
if (wSrbptr == SRB_POINTER_MAX)
{
ASSERT (wSrbptr != SRB_POINTER_MAX);
IncSendPacketNumber();
return(FALSE);
}
if (SendNumber == m_SendPacketNumber)
{
for(int cnt1 = 0; cnt1 < (((PSRB_EXTENSION)(pWorkSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_PacketNum; cnt1++)
{
IncSendPacketNumber();
}
DBG_PRINTF( ("DVDWDM:ScheduleData::SendPacket--- m_PacketNum=%x\n\r", (((PSRB_EXTENSION)(pWorkSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_PacketNum));
}
for(int cnt2 = 0; cnt2 < (((PSRB_EXTENSION)(pWorkSrb->SRBExtension))->m_wdmbuff[wWdmBuffptr]).m_PacketNum; cnt2++)
{
m_bDvdDataTable[SendNumber] = INIT_DVD_DATA;
if (SendNumber == (DVD_DATA_MAX - 1)) SendNumber = 0;
else SendNumber++;
}
DBG_PRINTF( ("DVDWDM:ScheduleData::SendPacket--- m_SendPacketNumber=%x\n\r", m_SendPacketNumber));
SendWdmBuff(pWorkSrb, MPBuff); // call SendData()
return (TRUE);
}
#endif REARRANGEMENT