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 + -
显示快捷键?