|
|
//**************************************************************************
//
// Title : MPEvent.cpp
//
// Date : 1997.12.09 1st making
//
// Author : Toshiba [PCS](PSY) Hideki Yagi
//
// Copyright 1997 Toshiba Corporation. All Rights Reserved.
//
// -------------------------------------------------------------------------
//
// Change log :
//
// Date Revision Description
// ------------ ---------- -----------------------------------------------
// 1997.12.09 000.0000 1st making.
//
//**************************************************************************
#include "includes.h"
#include "hal.h"
#include "classlib.h"
#include "ctime.h"
#include "schdat.h"
#include "mpevent.h"
#include "wdmbuff.h"
#include "ccque.h"
#include "userdata.h"
#include "wdmkserv.h"
#include "ctvctrl.h"
#include "hlight.h"
#include "hwdevex.h"
#include "dvdinit.h"
#define USCC_BuffSize 0x200 // OK?
////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////
void AdviceCallBack( PHW_STREAM_REQUEST_BLOCK pSrb ) { StreamClassStreamNotification( StreamRequestComplete, pSrb->StreamObject, pSrb );
}
IMBoardListItem *CDataXferEvent::GetNext( void ) { return( m_Next ); }
void CDataXferEvent::SetNext( IMBoardListItem *item ) { m_Next = item;
return; }
HALEVENTTYPE CDataXferEvent::GetEventType( void ) { return( m_EventType ); }
void CDataXferEvent::Advice( void *pData ) { CWDMBuffer *ptr; PHW_STREAM_REQUEST_BLOCK pSrb; ptr = (CWDMBuffer *)pData; ptr->SetNext( NULL ); // 98.04.10
pSrb = ptr->GetSRB(); if( pSrb->Status != STATUS_CANCELLED ){ pSrb->Status = STATUS_SUCCESS; }
DBG_PRINTF( ("DataXfer-Advice: cuurent Irql = 0x%04x pSrb=0x%x\n\r", KeGetCurrentIrql(),pSrb ) ); // if( KeGetCurrentIrql() > PASSIVE_LEVEL ){
// StreamClassCallAtNewPriority( NULL,
// pSrb->HwDeviceExtension,
//// LowToigh,
// Low,
// (PHW_PRIORITY_ROUTINE)AdviceCallBack,
// pSrb
// );
// }else{
#ifndef REARRANGEMENT
if (ptr->m_EndFlag == FALSE) return; //non last buffer
DBG_PRINTF( ("DVDWDM:Advice()---CompleteNotification Srb=%x\n\r", pSrb)); #endif REARRANGEMENT
StreamClassStreamNotification( StreamRequestComplete, pSrb->StreamObject, pSrb ); // }
return; }
////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////
void CUserDataEvent::Init( HW_DEVICE_EXTENSION *pHwDevExt ) { m_Next = NULL; m_EventType = WrapperEvent_UserData;
m_pHwDevExt = pHwDevExt; }
IMBoardListItem *CUserDataEvent::GetNext( void ) {
return( m_Next ); }
void CUserDataEvent::SetNext( IMBoardListItem *item ) { m_Next = item;
return; }
HALEVENTTYPE CUserDataEvent::GetEventType( void ) { return( m_EventType ); }
void CUserDataEvent::Advice( void *pData ) { HW_DEVICE_EXTENSION *pHwDevExt; pHwDevExt = m_pHwDevExt; LONG cp; UCHAR field; CUserData *pUData; DWORD dwSizeUData; UCHAR ccbuff[ USCC_BuffSize ]; // tmp buff for USCC data
PUCHAR pDest;
// If FF or FR play mode now, no process for Closed Caption.
if( pHwDevExt->Rate < 10000 ) return;
pUData = (CUserData *)pData; // pointer to user data
dwSizeUData = pUData->GetDataSize();
PHW_STREAM_REQUEST_BLOCK pSrb; // pointer to SRB included
// SRB_READ_DATA for C.C.
// Copy User Data to temp buffer.
pUData->DataCopy( ccbuff, dwSizeUData );
// Get SRB included SRB_READ_DATA.
pSrb = pHwDevExt->ccque.get();
cp = 0; if( pSrb!=NULL ){ if( pSrb->CommandData.DataBufferArray->FrameExtent < sizeof( KSGOP_USERDATA ) ){ pSrb->Status = STATUS_INVALID_BUFFER_SIZE; pSrb->ActualBytesTransferred = 0; StreamClassStreamNotification( StreamRequestComplete, pSrb->StreamObject, pSrb ); return; } pDest = (PUCHAR)(pSrb->CommandData.DataBufferArray->Data);
*(PULONG)pDest = 0xB2010000; // user_data_start_code
pDest += 4;
*pDest++ = ccbuff[cp++]; // line21_indicator
*pDest++ = ccbuff[cp++]; *pDest++ = ccbuff[cp++]; // reserved
*pDest++ = ccbuff[cp++];
field = *pDest++ = ccbuff[cp++]; // top_field_flag_of_gop &
field &= 0x3f; // number_of_displayed_field
if( pSrb->CommandData.DataBufferArray->FrameExtent < (field-1)*3 + sizeof(KSGOP_USERDATA) ){ pSrb->Status = STATUS_INVALID_BUFFER_SIZE; pSrb->ActualBytesTransferred = 0; StreamClassStreamNotification( StreamRequestComplete, pSrb->StreamObject, pSrb ); return; } pSrb->CommandData.DataBufferArray->DataUsed = pSrb->ActualBytesTransferred = (field-1)*3 + sizeof(KSGOP_USERDATA);
//
// copy line21_data()
//
for( ;field ; field-- ){ *pDest++ = ccbuff[cp++]; // marker_bits & line21_switch
*pDest++ = ccbuff[cp++]; // line21_data1
*pDest++ = ccbuff[cp++]; // line21_data2
}
PKSSTREAM_HEADER pPacket;
pPacket = pSrb->CommandData.DataBufferArray; pPacket->OptionsFlags = KSSTREAM_HEADER_OPTIONSF_TIMEVALID | KSSTREAM_HEADER_OPTIONSF_DURATIONVALID; pSrb->NumberOfBuffers = 1;
pPacket->PresentationTime.Time = pHwDevExt->ticktime.GetStreamTime(); pPacket->Duration = 1000;
pSrb->Status = STATUS_SUCCESS; StreamClassStreamNotification( StreamRequestComplete, pSrb->StreamObject, pSrb );
} return; }
////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////
void CVSyncEvent::Init( HW_DEVICE_EXTENSION *pHwDevExt ) { m_Next = NULL; m_EventType = WrapperEvent_VSync;
m_pHwDevExt = pHwDevExt; m_Vcount = 0; }
IMBoardListItem *CVSyncEvent::GetNext( void ) { return( m_Next ); }
void CVSyncEvent::SetNext( IMBoardListItem *item ) { m_Next = item;
return; }
HALEVENTTYPE CVSyncEvent::GetEventType( void ) { return( m_EventType ); }
void CVSyncEvent::Advice( void *pData ) { HW_DEVICE_EXTENSION *pHwDevExt; pHwDevExt = m_pHwDevExt; PKSEVENT_ENTRY pEvent, pLast; PMYTIME pTim;
LONGLONG MinIntTime; LONGLONG strmTime; ULONGLONG sysTime;
// do this process every 5 Vsyncs.
if( m_Vcount<=5 ){ m_Vcount++; return; } m_Vcount = 0;
sysTime = pHwDevExt->ticktime.GetSystemTime(); if( !pHwDevExt || !pHwDevExt->pstroAud || !pHwDevExt->pstroSP ){ return; }
strmTime = pHwDevExt->ticktime.GetStreamTime();
//
// loop through all time_mark events
//
pEvent = NULL; pLast = NULL;
while((pEvent = StreamClassGetNextEvent( pHwDevExt, pHwDevExt->pstroAud, (GUID *)&KSEVENTSETID_Clock, KSEVENT_CLOCK_POSITION_MARK, pLast)) != NULL ) { if( ((PKSEVENT_TIME_MARK)(pEvent+1))->MarkTime <= strmTime ){ //
// signal the event here
//
StreamClassStreamNotification( SignalStreamEvent, pHwDevExt->pstroAud, pEvent ); } pLast = pEvent; }
//
// loop through all time_interval events
//
pEvent = NULL; pLast = NULL;
while( (pEvent = StreamClassGetNextEvent( pHwDevExt, pHwDevExt->pstroAud, (GUID *)&KSEVENTSETID_Clock, KSEVENT_CLOCK_INTERVAL_MARK, pLast)) !=NULL ) { //
// check if this event has been used for this interval yet
//
pTim = ((PMYTIME)(pEvent + 1 ));
if( pTim && pTim->tim.Interval ){ if( pTim->tim.TimeBase <= strmTime){ MinIntTime = (strmTime - pTim->tim.TimeBase)/pTim->tim.Interval; MinIntTime *= pTim->tim.Interval; MinIntTime += pTim->tim.TimeBase;
if( MinIntTime > pTim->LastTime ){ //
// signal the event here
//
StreamClassStreamNotification( SignalStreamEvent, pHwDevExt->pstroAud, pEvent ); pTim->LastTime = strmTime; } } }else{ ; DBG_BREAK(); } pLast = pEvent; } }
|