avslot.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:7k
源码类别:

DVD

开发平台:

C/C++

  1. #include <string.h>
  2. #include "stevt.h"
  3. #include "stsys.h"
  4. #include "stcommon.h"
  5. #include "stpti.h"
  6. #include "errors.h"
  7. #include "osp.h"
  8. #include "stpti_hal.h"
  9. #include "avslot.h"
  10. /*********************** Use for video, audio and pcr slot *********************/
  11. STPTI_Slot_t   PTI_SlotHandle_Multiple[KB_PTI_MAX_NUM][NUM_PTI_SLOTS];
  12. /* Keep audio and video buffer handle */
  13. STPTI_Buffer_t PTI_AudioBufferHandle, PTI_VideoBufferHandle_Multiple[KB_PTI_MAX_NUM];
  14. const STPTI_SlotType_t STPTI_AVSlotTypes[] =
  15. {
  16.     STPTI_SLOT_TYPE_PES,    /* VIDEO */
  17.     STPTI_SLOT_TYPE_PES,    /* AUDIO */
  18.     STPTI_SLOT_TYPE_PCR,    /* PCR */
  19. };
  20. /* For each slot we need to keep this information                             */
  21. typedef struct Pti_SlotKeepInfo_s
  22. {
  23.     STPTI_Slot_t    SlotHandle;     /* Slot handle */
  24.     STPTI_Pid_t     Pid;            /* PID */
  25.     STPTI_Filter_t  FilterHandle;   /* Filter handle */
  26.     STPTI_Buffer_t  BufferHandle;   /* PTI Destination Buffer handle */
  27.     U32             BufferSize;     /* PTI Destination Buffer size   */
  28.     STPTI_Signal_t  SignalHandle;   /* PTI Destination Signal handle */
  29.     U8              *UserBuffer_p;  /* User Buffer */
  30.     U32             UserBufferSize; /* User Buffer */
  31.     BOOL            InUse;          /* In use ? */
  32. } Pti_SlotKeepInfo_t;
  33. Pti_SlotKeepInfo_t Pti_SlotKeepInfo[NUM_PTI_SLOTS];
  34. /* Semaphore to ensure correct multi thread */
  35. static BOOL     pti_SemInit = FALSE;
  36. static UINT32  pti_SemLock;
  37. /*-----------------------------------------------------------------------------
  38.  * Function : PTI_Protect
  39.  *            Protect by semaphore shared data
  40.  *            Do the initialisation if needed.
  41.  * Input    : N/A
  42.  * Output   : N/A
  43.  * Return   : ErrCode
  44.  * -------------------------------------------------------------------------- */
  45. static ST_ErrorCode_t PTI_Protect(void)
  46. {
  47.     /* First check if init of the semaphore is already done                   */
  48.     if (pti_SemInit == FALSE)
  49.     {
  50.         /* Init the semaphore to 1 and wait on the semaphore is the same as   */
  51.         /* setting directly the semaphore to 0.                               */
  52. KB_OSPSemInit("DMXS", 0, J_OSP_WAIT_FIFO, &pti_SemLock);
  53.         /* We are now in critical section                                     */
  54.         pti_SemInit = TRUE;
  55.     }
  56.     else
  57.     {
  58.         KB_OSPSemGet(pti_SemLock, KB_Wait, 0);
  59.     }
  60.     return ST_NO_ERROR;
  61. } /* PTI_Proctect */
  62. /*------------------------------------------------------------------------------
  63.  * Function : PTI_UnProtect
  64.  *            Protect by semaphore shared data
  65.  * Input    : N/A
  66.  * Output   : N/A
  67.  * Return   : ErrCode
  68.  * -------------------------------------------------------------------------- */
  69. static ST_ErrorCode_t PTI_UnProtect(void)
  70. {
  71.     /* Wake up locked task on semaphore (if any)                              */
  72. KB_OSPSemSet(pti_SemLock);
  73.     return ST_NO_ERROR;
  74. } /* PTI_UnProctect */
  75. ST_ErrorCode_t AVSlotInit(void)
  76. {
  77. STPTI_SlotData_t       STPTI_SlotData;
  78. int                    pti_slot;
  79. ST_ErrorCode_t    ST_ErrorCode = ST_NO_ERROR;
  80. //Allocate Video, Audio and PCR slot
  81. for (pti_slot = SLOTVID; pti_slot < NUM_PTI_SLOTS; pti_slot++)
  82.     {
  83.         STPTI_SlotData.SlotType = STPTI_AVSlotTypes[pti_slot];
  84.         STPTI_SlotData.SlotFlags.SignalOnEveryTransportPacket   = FALSE;
  85.         STPTI_SlotData.SlotFlags.CollectForAlternateOutputOnly  = FALSE;
  86.         STPTI_SlotData.SlotFlags.AlternateOutputInjectCarouselPacket = FALSE;
  87.         STPTI_SlotData.SlotFlags.StoreLastTSHeader  = FALSE;
  88.         STPTI_SlotData.SlotFlags.InsertSequenceError    = FALSE;
  89.         STPTI_SlotData.SlotFlags.OutPesWithoutMetadata  = FALSE;
  90.         STPTI_SlotData.SlotFlags.ForcePesLengthToZero   = FALSE;
  91.         STPTI_SlotData.SlotFlags.AppendSyncBytePrefixToRawData = FALSE;
  92.         if (pti_slot == SLOTVID || pti_slot == SLOTAUD)
  93.         {
  94.             STPTI_SlotData.SlotFlags.SoftwareCDFifo = TRUE; /*Should be set to TRUE for 5105 device type*/
  95.         }
  96.         else
  97.         {
  98.             STPTI_SlotData.SlotFlags.SoftwareCDFifo = FALSE;
  99.         }
  100.         /* Allocates free slots */
  101.         ST_ErrorCode = STPTI_SlotAllocate( g_KB_PTIHandleMultiple[0],
  102.                                            &PTI_SlotHandle[pti_slot],
  103.                                            &STPTI_SlotData);
  104.         if (ST_ErrorCode != ST_NO_ERROR)
  105.         {
  106.             //STTBX_Print((" ***PTI_SlotAllocate(%d)=%s %08X *** ", pti_slot, KB_ErrorGetText(ST_ErrorCode), ST_ErrorCode ));
  107.             return( ST_ErrorCode );
  108.         }
  109.         /* Clears slot PID */
  110.         ST_ErrorCode = STPTI_SlotClearPid(PTI_SlotHandle[pti_slot]);
  111.         if (ST_ErrorCode != ST_NO_ERROR)
  112.         {
  113.             //STTBX_Print((" ***PTI_SlotClearPid(%d)=%s*** ", pti_slot, KB_ErrorGetText(ST_ErrorCode) ));
  114.             return( ST_ErrorCode );
  115.         }
  116.     }
  117. return( ST_ErrorCode );
  118. }
  119. UINT32 StartAud(UINT16 AudioPid)
  120. {
  121. ST_ErrorCode_t ST_ErrorCode;
  122. ST_ErrorCode = STPTI_SlotSetPid(PTI_SlotHandle[SLOTAUD], AudioPid);
  123. if(ST_ErrorCode != ST_NO_ERROR)  //no harm doing again
  124. {
  125. ST_ErrorCode = STPTI_SlotClearPid(PTI_SlotHandle[SLOTAUD]);
  126. ST_ErrorCode |= STPTI_SlotSetPid(PTI_SlotHandle[SLOTAUD], AudioPid);
  127. if(ST_ErrorCode != ST_NO_ERROR)
  128. {
  129. STTBX_Print(("nn 2x STPTI_SlotSetPid(SLOTAUD,%d)=%snn", AudioPid, KB_ErrorGetText(ST_ErrorCode) ));
  130. }
  131. }
  132. return ST_ErrorCode;
  133. }
  134. UINT32 StopAud(void)
  135. {
  136. ST_ErrorCode_t  ErrCode;
  137.     /* Enter Critical section                                                 */
  138.     PTI_Protect();
  139. ErrCode = STPTI_SlotClearPid(PTI_SlotHandle[SLOTAUD]);
  140.     /* Leave Critical section                                                 */
  141.     PTI_UnProtect();
  142.     return ( ErrCode );
  143. }
  144. UINT32 StartVid(UINT16 VideoPid)
  145. {
  146. ST_ErrorCode_t ST_ErrorCode;
  147. ST_ErrorCode = STPTI_SlotSetPid(PTI_SlotHandle[SLOTVID], VideoPid);
  148. if(ST_ErrorCode != ST_NO_ERROR)  //no harm doing again
  149. {
  150. ST_ErrorCode = STPTI_SlotClearPid(PTI_SlotHandle[SLOTVID]);
  151. ST_ErrorCode |= STPTI_SlotSetPid(PTI_SlotHandle[SLOTVID], VideoPid);
  152. if(ST_ErrorCode != ST_NO_ERROR)
  153. {
  154. STTBX_Print(("nn 2x STPTI_SlotSetPid(SLOTVID,%d)=%snn", VideoPid, KB_ErrorGetText(ST_ErrorCode) ));
  155. }
  156. }
  157. return ST_ErrorCode;
  158. }
  159. UINT32 StopVid(void)
  160. {
  161. ST_ErrorCode_t      ErrCode;
  162. ErrCode = STPTI_SlotClearPid(PTI_SlotHandle[SLOTVID]);
  163.     return ErrCode;
  164. }
  165. UINT32 StartPCR(UINT16 PCRPid)
  166. {
  167. ST_ErrorCode_t      ST_ErrorCode;
  168.     /* Enter Critical section */
  169.     PTI_Protect();
  170. ST_ErrorCode = STPTI_SlotSetPid(PTI_SlotHandle[SLOTPCR], PCRPid);
  171. if(ST_ErrorCode != ST_NO_ERROR)  //no harm doing again
  172. {
  173. ST_ErrorCode = STPTI_SlotClearPid(PTI_SlotHandle[SLOTPCR]);
  174. ST_ErrorCode |= STPTI_SlotSetPid(PTI_SlotHandle[SLOTPCR], PCRPid);
  175. if(ST_ErrorCode != ST_NO_ERROR)
  176. {
  177. STTBX_Print(("nn 2x STPTI_SlotSetPid(SLOTAUD,%d)=%snn", PCRPid, KB_ErrorGetText(ST_ErrorCode) ));
  178. }
  179. }
  180.     /* Leave Critical section */
  181.     PTI_UnProtect();
  182.     return ST_ErrorCode;
  183. }
  184. UINT32 StopPCR(void)
  185. {
  186.     ST_ErrorCode_t      ErrCode;
  187.     /* Enter Critical section */
  188.     PTI_Protect();
  189. ErrCode = STPTI_SlotClearPid(PTI_SlotHandle[SLOTPCR]);
  190.     /* Leave Critical section */
  191.     PTI_UnProtect();
  192.     return ( ErrCode );
  193. }