st_pti.c
来自「ST5100 driver files for ST chipset」· C语言 代码 · 共 1,961 行 · 第 1/5 页
C
1,961 行
"TP SCRAMBLING",
"PES SCRAMBLING" };
ErrCode = ST_NO_ERROR;
/* Get info for each pti */
/*for ( ii = 0 ; ii < PTI_MAXDEVICE ; ii++ )*/
ii = 1; /* PTI_1 only */
{
ErrCode = STPTI_GetInputPacketCount(PTI_GET_DEVICENAME(ii), &Count16);
if ( ErrCode == ST_NO_ERROR )
{
STTBX_Report((STTBX_REPORT_LEVEL_INFO,
"STPTI_GetInputPacketCount()=%s : Count %d",
GetErrorText(ErrCode),Count16 ));
}
else
{
STTBX_Report((STTBX_REPORT_LEVEL_ERROR,
"STPTI_GetInputPacketCount()=%s",
GetErrorText(ErrCode)));
RetErr = TRUE;
}
if ( PTI_SERVICE_DTV != PTI_GET_SERVICE(ii) )
{
ErrCode = STPTI_GetPacketErrorCount(PTI_GET_DEVICENAME(ii), &Count);
if ( ErrCode == ST_NO_ERROR )
{
STTBX_Report((STTBX_REPORT_LEVEL_INFO,
"STPTI_GetPacketErrorCount()=%s : Count %d",
GetErrorText(ErrCode),Count ));
}
else
{
STTBX_Report((STTBX_REPORT_LEVEL_ERROR,
"STPTI_GetPacketErrorCount()=%s",
GetErrorText(ErrCode)));
RetErr = TRUE;
}
}
/* Enter Critical section */
PTI_Protect();
/* Get info for each ProcessStream */
for ( jj = 0 ; jj < PTI_MAXOPEN ; jj++ )
{
/* For each slot/filter/buffer */
for ( kk = 0 ; kk < PTI_SLOT_TYPE_MAXID ; kk++ )
{
if ( Pti_SlotKeepInfo[ii][jj][kk].InUse == FALSE )
{
/* Not used, stop action here for this slot ! */
break;
}
if ( Pti_SlotKeepInfo[ii][jj][kk].SlotHandle
!= (STPTI_Slot_t)NULL )
{
ErrCode = STPTI_SlotState(Pti_SlotKeepInfo[ii][jj][kk].SlotHandle,
&Count, &ScrambleState, &Pid);
STTBX_Print(("STPTI_SlotState() : %s PS=%d slot=%d Cnt=%08d Pid=%d (0x%x) %s\n",
PTI_GET_DEVICENAME(ii), jj, kk, Count,
Pid, Pid, Scrambled[ScrambleState]));
}
} /* for ( kk = 0 ; kk < PTI_SLOT_TYPE_MAXID ; kk++ ) */
} /* for ( jj = 0 ; jj < PTI_MAXOPEN ; jj++ ) */
/* Leave Critical section */
PTI_UnProtect();
} /* for ( ii = 0 ; ii < PTI_MAXDEVICE ; ii++ ) */
if (RetErr == TRUE)
{
API_ErrorCount++;
}
STTST_AssignInteger(result_sym_p, RetErr, FALSE);
return ( API_EnableError ? RetErr : FALSE );
} /* TTPTI_GetCountInf () */
/* -----------------------------------------------------------------------------
Name : TTPTI_GetBufferInf
Description : Get Buffer information for each open slot
Parameters : *pars_p, *result_sym_p
Assumptions :
Limitations :
Returns : TRUE if error, FALSE if success
* -------------------------------------------------------------------------- */
static BOOL TTPTI_GetBufferInf( parse_t *pars_p, char *result_sym_p )
{
ST_ErrorCode_t ErrCode;
BOOL RetErr;
U8 PesFlags;
U8 TrickModeFlags;
U32 PESPacketLength;
STPTI_TimeStamp_t PTSValue;
STPTI_TimeStamp_t DTSValue;
U32 DataSize;
U32 ii, jj, kk;
PTI_DeviceId_t DeviceId;
DeviceId = 0;
RetErr = FALSE;
ErrCode = ST_NO_ERROR;
#if (TTPTI_MULTI_INSTANCE == TRUE)
/* get DeviceId */
RetErr = PtiGetParamDeviceId(pars_p, &DeviceId);
if (RetErr == TRUE)
{
STTST_TagCurrentLine(pars_p, "expected Device Id");
}
#endif
/* Get info for each ProcessStream */
if (RetErr == FALSE)
{
/* Enter Critical section */
PTI_Protect();
for ( ii = 0 ; ii < PTI_MAXOPEN ; ii++ )
{
/* For each slot/filter/buffer */
for ( jj = 0 ; jj < PTI_SLOT_TYPE_MAXID ; jj++ )
{
if ( Pti_SlotKeepInfo[DeviceId][ii][jj].BufferHandle
!= (STPTI_Buffer_t)NULL )
{
ErrCode = STPTI_BufferExtractPesPacketData
(Pti_SlotKeepInfo[DeviceId][ii][jj].BufferHandle,
&PesFlags, &TrickModeFlags,
&PESPacketLength, &PTSValue, &DTSValue);
if ( ErrCode != ST_NO_ERROR )
{
STTBX_Report((STTBX_REPORT_LEVEL_ERROR,
"STPTI_BufferExtractPesPacketData()=%s",
GetErrorText(ErrCode)));
RetErr = TRUE;
}
else
{
DataSize = 0;
ErrCode = STPTI_BufferReadPes
(Pti_SlotKeepInfo[DeviceId][ii][jj].BufferHandle,
Pti_SlotKeepInfo[DeviceId][ii][jj].UserBuffer_p,
Pti_SlotKeepInfo[DeviceId][ii][jj].UserBufferSize,
0, 0, &DataSize, STPTI_COPY_TRANSFER_BY_MEMCPY);
if ( ErrCode != ST_NO_ERROR )
{
STTBX_Report((STTBX_REPORT_LEVEL_ERROR,
"STPTI_BufferReadPes()=%s",
GetErrorText(ErrCode)));
RetErr = TRUE;
}
STTBX_Print(("PS %d ID %d : PesFlag %3d TrickModeFlags %3d ",
ii, jj ,PesFlags ,TrickModeFlags));
STTBX_Print(("PESPacketLength %4d PTS %01x%08x DTS %01x%08x DataSize %08d\n",
PESPacketLength, PTSValue.Bit32, PTSValue.LSW,
DTSValue.Bit32, DTSValue.LSW ,DataSize));
for ( kk = 0 ; kk < 32; kk++ )
{
STTBX_Print(("%02x ",
Pti_SlotKeepInfo[DeviceId][ii][jj].UserBuffer_p[kk]));
}
STTBX_Print(("\n\n"));
}
}
} /* for ( jj = 0 ; jj < PTI_SLOT_TYPE_MAXID ; jj++ ) */
} /* for ( ii = 0 ; ii < PTI_MAXOPEN ; ii++ ) */
/* Leave Critical section */
PTI_UnProtect();
}
if (RetErr == TRUE)
{
API_ErrorCount++;
}
STTST_AssignInteger(result_sym_p, RetErr, FALSE);
return ( API_EnableError ? RetErr : FALSE );
} /* TTPTI_GetBufferInf () */
/* -----------------------------------------------------------------------------
Name : TTPTI_Decode
Description : Start Audio, Video decode (Manage PCR)
Parameters : *pars_p, *result_sym_p
Assumptions :
Limitations :
Returns : TRUE if error, FALSE if success
* -------------------------------------------------------------------------- */
static BOOL TTPTI_Decode (parse_t *pars_p, char *result_sym_p)
{
BOOL RetErr;
ST_ErrorCode_t ErrCode;
PTI_DeviceId_t DeviceId;
PTI_HandleId_t HandleId;
S32 Lvar;
STPTI_Pid_t VidPid;
STPTI_Pid_t AudPid;
STPTI_Pid_t PCRPid;
DeviceId = 0;
HandleId = 0;
RetErr = FALSE;
ErrCode = ST_NO_ERROR;
VidPid = STPTI_InvalidPid();
AudPid = STPTI_InvalidPid();
PCRPid = STPTI_InvalidPid();
#if (TTPTI_MULTI_INSTANCE == TRUE)
/* get DeviceId */
RetErr = PtiGetParamDeviceId(pars_p, &DeviceId);
if (RetErr == TRUE)
{
STTST_TagCurrentLine(pars_p, "expected Device Id");
}
/* get HandleId */
if (RetErr == FALSE)
{
RetErr = PtiGetParamHandleId(pars_p, &HandleId);
if (RetErr == TRUE)
{
STTST_TagCurrentLine(pars_p,
"expected HandleId (from 0 to PTI_MAXOPEN)");
}
}
#endif /* (TTPTI_MULTI_INSTANCE == TRUE) */
/* default PIDs set for MUX2_204.TS */
/* get the Pid */
if (RetErr == FALSE)
{
RetErr = STTST_GetInteger(pars_p, 0x200, &Lvar);
if (RetErr == TRUE)
{
STTST_TagCurrentLine(pars_p, "expected Video Pid");
}
VidPid = (STPTI_Pid_t)Lvar;
}
/* get the Pid */
if (RetErr == FALSE)
{
RetErr = STTST_GetInteger(pars_p, 0x280, &Lvar);
if (RetErr == TRUE)
{
STTST_TagCurrentLine(pars_p, "expected Audio Pid");
}
AudPid = (STPTI_Pid_t)Lvar;
}
/* get the Pid */
if (RetErr == FALSE)
{
RetErr = STTST_GetInteger(pars_p, 0x1FFE, &Lvar);
if (RetErr == TRUE)
{
STTST_TagCurrentLine(pars_p, "expected PCR Pid");
}
PCRPid = (STPTI_Pid_t)Lvar;
}
/* call pti function */
if ( ( !RetErr ) && ( HandleId < PTI_MAXOPEN ) )
{
ErrCode = PTI_Do_AV_Start(DeviceId, HandleId, VidPid, AudPid, PCRPid);
if ( ErrCode != ST_NO_ERROR)
{
RetErr = TRUE;
}
}
if (RetErr == TRUE)
{
API_ErrorCount++;
}
STTST_AssignInteger(result_sym_p, RetErr, FALSE);
return ( API_EnableError ? RetErr : FALSE );
} /* TTPTI_Decode () */
#endif /* TESTTOOL */
/* Functions ---------------------------------------------------------------- */
/*-------------------------------------------------------------------------
* Function : PTITSmergeInput_ToStr
* Input : event data
* Output :
* Return : string
* ----------------------------------------------------------------------*/
static char *PTITSmergeInput_ToStr(STPTI_StreamID_t TSInput)
{
switch(TSInput)
{
case STPTI_STREAM_ID_TSIN0:
return("STPTI_STREAM_ID_TSIN0");
case STPTI_STREAM_ID_TSIN1:
return("STPTI_STREAM_ID_TSIN1");
case STPTI_STREAM_ID_TSIN2:
return("STPTI_STREAM_ID_TSIN2");
case STPTI_STREAM_ID_SWTS0:
return("STPTI_STREAM_ID_SWTS0");
case STPTI_STREAM_ID_ALTOUT:
return("STPTI_STREAM_ID_ALTOUT");
case STPTI_STREAM_ID_NOTAGS:
return("STPTI_STREAM_ID_NOTAGS");
case STPTI_STREAM_ID_NONE:
return("STPTI_STREAM_ID_NONE");
default:
break;
}
return("AUD?");
}
void ResetSlotParams(PTI_DeviceId_t DeviceId, PTI_HandleId_t HandleId, PTI_SlotTypeId_t SlotType)
{
Pti_SlotKeepInfo[DeviceId][HandleId][SlotType].SlotHandle = (STPTI_Slot_t)NULL;
Pti_SlotKeepInfo[DeviceId][HandleId][SlotType].Pid = STPTI_InvalidPid();
Pti_SlotKeepInfo[DeviceId][HandleId][SlotType].FilterHandle = (STPTI_Filter_t)NULL;
Pti_SlotKeepInfo[DeviceId][HandleId][SlotType].BufferHandle = (STPTI_Buffer_t)NULL;
Pti_SlotKeepInfo[DeviceId][HandleId][SlotType].BufferSize = 0;
Pti_SlotKeepInfo[DeviceId][HandleId][SlotType].SignalHandle = (STPTI_Signal_t)NULL;
Pti_SlotKeepInfo[DeviceId][HandleId][SlotType].UserBuffer_p = NULL;
Pti_SlotKeepInfo[DeviceId][HandleId][SlotType].UserBufferSize = 0;
Pti_SlotKeepInfo[DeviceId][HandleId][SlotType].InUse = FALSE;
}
/* ----------------------------------------------------------------------------
* Name : PTI_Init
* Description : Initialize a STPTI for a DeviceId
* Parameters : PTI_DeviceId_t DeviceId, SERVICE_Mode_t SERVICE_Mode
* Assumptions :
* Limitations :
* Returns : ErrCode
* ST_ERROR_BAD_PARAMETER Bad param
* ST_ERROR_NO_MEMORY Unable to allocate memory
* ST_ERROR_BAD_PARAMETER One or more of the parameters were invalid.
* ST_ERROR_FEATURE_NOT_SUPPORTED The device type is not supported
* ST_ERROR_ALREADY_INITIALIZED Self-explanatory - refers to driver instance
* ST_ERROR_DEVICE_BUSY Self-explanatory - refers to PTI device
* ST_NO_ERROR Success.
* ------------------------------------------------------------------------- */
ST_ErrorCode_t PTI_Init(PTI_DeviceId_t DeviceId, SERVICE_Mode_t SERVICE_Mode)
{
ST_ErrorCode_t ErrCode;
STPTI_InitParams_t InitParams;
U32 ii, jj, i;
STPTI_SlotType_t *STPTI_SlotTypes_p;
ErrCode = ST_NO_ERROR;
/* Init struct InitParams */
memset((void *)&InitParams, 0, sizeof(STPTI_InitParams_t));
/* Test input parameters */
if ( DeviceId >= PTI_MAXDEVICE )
{
ErrCode = ST_ERROR_BAD_PARAMETER;
}
if (ErrCode == ST_NO_ERROR)
{
/* Set Init param */
InitParams.InterruptLevel = PTI_INTERRUPT_LEVEL;
InitParams.InterruptNumber = PTI_GET_TCINTERRUPT(DeviceId);
InitParams.SyncLock = 0;
InitParams.SyncDrop = 0;
InitParams.NCachePartition_p = NcachePartition;
InitParams.SectionFilterOperatingMode = PTI_GET_FILTERMODE(DeviceId);
InitParams.Device = PTI_GET_DEVICE(DeviceId);
InitParams.TCDeviceAddress_p = (STPTI_DevicePtr_t) PTI_GET_TCADDRESS(DeviceId);
InitParams.DescramblerAssociation = STPTI_DESCRAMBLER_ASSOCIATION_ASSOCIATE_WITH_SLOTS;
InitParams.Partition_p = DriverPartition;
InitParams.EventProcessPriority = MIN_USER_PRIORITY+1;
InitParams.InterruptProcessPriority = MAX_USER_PRIORITY-1;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?