⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mv_dec.c

📁 tuner扫描
💻 C
📖 第 1 页 / 共 4 页
字号:
   
   GV_MV_DEC_status = GV_MV_DEC_status_init;
   GV_MV_DEC_ud_status = GV_MV_DEC_ud_status_init;

   /* restore address and size of UD buffer */
   GV_MV_DEC_status.dec_pip_buf_addr = lv_seq_adr;
   GV_MV_DEC_status.dec_pip_buf_size = lv_seq_buf_size;
   GV_MV_DEC_ud_status.dec_ud_adr = lv_ud_adr;
   GV_MV_DEC_ud_status.dec_ud_buffer_size = lv_ud_buf_size;
   GV_MV_DEC_ud_status.ptr_sync_semaphore = lv_new_semaphore;
   
   GV_MV_DEC_status.dec_watchdog_vs_nb_threshold = GV_MV_DEC_config_status.dec_bufcfg.threshold_error_param;
   GV_MV_DEC_status.dec_video_event_mask |= (MV_VIDEO_EVENT_SEQUENCE_HEADER_START_CODE | MV_DEC_VIDEO_EVENT_GOP_SC);

   tmosalDisableInterruptsNoSysCall(&lv_protection_level);
   GV_MV_DEC_status.dec_state = MV_DEC_DECODING_STATE_READY;
   tmosalEnableInterruptsNoSysCall(lv_protection_level);
   
} /* End of MV_DEC_set_defaults */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_term

    PACKAGE:           DEC

    SCOPE:             PLATEFORM

    DESCRIPTION:
    Deinitialise the video decoding package.
    Frees all resources allocated by MV_DEC_init call.

    PRECONDITIONS:
    None

    POSTCONDITIONS:
    After calling to this API, only MV_DEC_bufuse() and MV_IDEC_init()
    can be called.
    Video Decoder is in state MV_DEC_DECODING_STATE_IDLE
    
    CALLING SEQUENCE:
*/
extern void
MV_DEC_term(    
   void
   )
/*EMP=======================================================================*/
{
   UInt32 lv_protection_level;
   tmErrorCode_t returnVal;
   
   MV_FBM_release_resources();
   
   tmosalDisableInterruptsNoSysCall(&lv_protection_level);
   GV_MV_DEC_status.dec_state = MV_DEC_DECODING_STATE_IDLE;
   tmosalEnableInterruptsNoSysCall(lv_protection_level);

   /* Deinstall VIDEO_EVENT_handler */
   MV_ITV_deinstall_isr(MV_ITV_VIDEO_EVENT);  

   /* Deinstall RESET_DONE_handler */
   MV_ITV_deinstall_isr(MV_ITV_RESET_DONE);  

   /* Delete the synchronisation semaphore */
   returnVal = tmosalSemDestroy(GV_MV_DEC_ud_status.ptr_sync_semaphore);
   if (returnVal != TM_OK)
   {
      DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_SEMAPHORE_ERROR,IPVD_DBG_UD_LEVEL,IPVD_SEMAPHORE_DESTROY,0,0,0);
   }
      
   MV_ITV_term();
   
} /* End of MV_DEC_term */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_set_sync_mode

    PACKAGE:           MV_DEC

    SCOPE:             PLATFORM

    DESCRIPTION:
    Select the video decoder synchronisation mode.
    4 different synchronisation mode can be choosen :

    MV_DEC_SYNC_MODE_DTS_LOCKED
    - Decoding of each picture is done when the corresponding DTS value
    matches the STC value.

    MV_DEC_SYNC_MODE_DTS_FREE_RUNNING
    - Decoding of the first picture is done when the corresponding DTS
    value matches the STC value. Consecutive pictures are decoded
    without further checks.

    MV_DEC_SYNC_MODE_BUF_CONTROLLED
    - In the buffer controlled play mode, decoding of pictures is started
    when the video input buffer fullness reaches the video input buffer
    overflow warning level.
    The video input buffer overflow and underflow levels can
    be configured using MV_INP_set_warning_levels() API.

    MV_DEC_SYNC_MODE_SW_CONTROLLED
    - In the software controlled play mode, decoding of pictures is started
    when the MV_DEC_play() API is called.

    Initially the play sync is MV_DEC_SYNC_MODE_DTS_LOCKED.
    
    Changing the video play mode takes effect the next time MV_DEC_play is
    called if it's the first time or if video decoder is stopped,
    otherwise if MV_DEC_play has been already called (video decoder is still
    running) synchronisation mode will be changed on the fly.

    PRECONDITIONS:
    None

    POSTCONDITIONS:
    None
    
    CALLING SEQUENCE:
*/
extern void
MV_DEC_set_sync_mode(    
   MV_DEC_SYNC_MODE in_sync_mode         /* In: New video sync mode           */
   )
/*EMP=======================================================================*/
{
#ifdef DV_DEBUG
   register unsigned long lv_info0 = MV_drv_video_fifo_bfmo_cur();
   register unsigned long lv_info1 = MV_drv_video_fifo_bfmu_cur();
   register unsigned long lv_info2 = MV_drv_video_fifo_over();
   register unsigned long lv_info3 = 0;
#endif
   
   GV_MV_DEC_status.dec_sync_mode = in_sync_mode;

   /* if video decoder is already started, allows possibility to change
      synchronisation mode on the fly */
   if ((GV_MV_DEC_status.dec_state == MV_DEC_DECODING_STATE_STARTING) ||(GV_MV_DEC_status.dec_state == MV_DEC_DECODING_STATE_STARTED))
   {
      
      if((GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_DTS_LOCKED) || (GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_DTS_FREE_RUNNING))
      {
         MV_drv_set_video_fifo_disable(MV_BIT_OFF);
         MV_drv_set_video_synchronisation_mode(MV_VIDEO_BUF_CTRL_DTS_LOCKED);
         MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
         MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);   
         MV_ITV_enable_irpt(MV_ITV_NEW_VIDEO_DTS);
      }

      if(GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_BUF_CONTROLLED)
      {
         /* now enable VIDEO_FIFO_UNDER, VIDEO_FIFO_OVER irpts and disable
            NEW_VIDEO_DTS irpts */
         MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
         MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);   
         MV_ITV_disable_irpt(MV_ITV_NEW_VIDEO_DTS);      
      }

      if(GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_SW_CONTROLLED)
      {
         /* now enable VIDEO_FIFO_UNDER, VIDEO_FIFO_OVER irpts and disable
            NEW_VIDEO_DTS irpts */
         MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
         MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);   
         MV_ITV_disable_irpt(MV_ITV_NEW_VIDEO_DTS);
         
         MV_drv_set_video_fifo_disable(MV_BIT_OFF);
         MV_drv_set_video_synchronisation_mode(MV_VIDEO_BUF_CTRL_START);
         GV_cmd_buf_start = TRUE;

         DV_DBG_STORE_EVENT(IPVD_DBG_EV_BUF_CMD_START, IPVD_DBG_MAJOR_BEHAVIOR_LEVEL,lv_info0,lv_info1,lv_info2,__LINE__);

         if (GV_MV_INP_status.inp_event_enabled & MV_INP_BUFFER_CMD_START_EVENT != 0)
         {
            /* Notify the application. */
            GV_MV_INP_status.function_ptr(MV_INP_BUFFER_CMD_START_EVENT);
         }
      }
   }
   
} /* End of MV_DEC_set_sync_mode */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_freeze

    PACKAGE:           MV_DEC

    SCOPE:             PLATFORM

    DESCRIPTION:
    Freeze on the next decoded picture.

    Freeze modes can be :
    
    - MV_DEC_FREEZE_MODE_B : The displays freezes on the next correctly
                             decoded B picture
    - MV_DEC_FREEZE_MODE_IP : The displays freezes on the next correctly
                              decoded I or P picture
    - MV_DEC_FREEZE_MODE_NONE : Freeze mode is desactivated
                                  
    Normal decoding and display can be resumed by calling MV_DEC_play() API.

    NOTES:
    MV_DEC_freeze() can be call in an ISR.

    PRECONDITIONS:
    None

    POSTCONDITIONS:
    Video Decoder is in state MV_DEC_DECODING_STATE_FREEZING
    
    CALLING SEQUENCE:
    */
extern void
MV_DEC_freeze(    
   MV_DEC_FREEZE_MODE in_freeze_mode /* In: The desired freeze mode */
   )
/*EMP=======================================================================*/
{
   UInt32 lv_protection_level;

   if(in_freeze_mode == MV_DEC_FREEZE_MODE_B)
   {
      MV_FBM_freeze(MV_DEC_FREEZE_MODE_B);
   }
   
   if(in_freeze_mode == MV_DEC_FREEZE_MODE_IP)
   {
      MV_FBM_freeze(MV_DEC_FREEZE_MODE_IP);
   }

   if(in_freeze_mode == MV_DEC_FREEZE_MODE_NONE)
   {
      MV_FBM_freeze(MV_DEC_FREEZE_MODE_NONE);
   }
   
   tmosalDisableInterruptsNoSysCall(&lv_protection_level);
   GV_MV_DEC_status.dec_state = MV_DEC_DECODING_STATE_FREEZING;
   tmosalEnableInterruptsNoSysCall(lv_protection_level);
   
} /* End of MV_DEC_freeze */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_play

    PACKAGE:           MV_DEC

    SCOPE:             PLATFORM

    DESCRIPTION:
    Launch the video decoding process.

    PRECONDITIONS:
    Before calling this API, application must have called
    MV_DEC_set_sync_mode().

    POSTCONDITIONS:
    Video Decoder is in state MV_DEC_DECODING_STATE_STARTING. It will
    change to MV_DEC_DECODING_STATE_STARTED once the first picture is
    decoded
    
    CALLING SEQUENCE:

*/
extern void
MV_DEC_play(    
   void
   )
/*EMP=======================================================================*/
{
   UInt32 lv_protection_level;
   
#ifdef DV_DEBUG
   register unsigned long lv_info0 = MV_drv_video_fifo_bfmo_cur();
   register unsigned long lv_info1 = MV_drv_video_fifo_bfmu_cur();
   register unsigned long lv_info2 = MV_drv_video_fifo_over();
   register unsigned long lv_info3 = 0;   
#endif

   MV_FBM_play();

   tmosalDisableInterruptsNoSysCall(&lv_protection_level);
   GV_MV_DEC_status.dec_state = MV_DEC_DECODING_STATE_STARTING;
   tmosalEnableInterruptsNoSysCall(lv_protection_level);

   if((GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_DTS_LOCKED) || (GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_DTS_FREE_RUNNING))
   {      
      MV_drv_set_video_fifo_disable(MV_BIT_OFF);
      MV_drv_set_video_synchronisation_mode(MV_VIDEO_BUF_CTRL_DTS_LOCKED);
      MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
      MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);   
      MV_ITV_enable_irpt(MV_ITV_NEW_VIDEO_DTS);
   }

   if(GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_BUF_CONTROLLED)
   {
      /* now enable VIDEO_FIFO_UNDER, VIDEO_FIFO_OVER irpts and disable
         NEW_VIDEO_DTS irpts */
      MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
      MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);   
      MV_ITV_disable_irpt(MV_ITV_NEW_VIDEO_DTS);      
   }

   if(GV_MV_DEC_status.dec_sync_mode == MV_DEC_SYNC_MODE_SW_CONTROLLED)
   {
      /* now enable VIDEO_FIFO_UNDER, VIDEO_FIFO_OVER irpts and disable
         NEW_VIDEO_DTS irpts */
      MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
      MV_ITV_enable_irpt(MV_ITV_VIDEO_FIFO_OVER);   
      MV_ITV_disable_irpt(MV_ITV_NEW_VIDEO_DTS);
         
      MV_drv_set_video_fifo_disable(MV_BIT_OFF);
      MV_drv_set_video_synchronisation_mode(MV_VIDEO_BUF_CTRL_START);
      GV_cmd_buf_start = TRUE;
      
      DV_DBG_STORE_EVENT(IPVD_DBG_EV_BUF_CMD_START, IPVD_DBG_MAJOR_BEHAVIOR_LEVEL,lv_info0,lv_info1,lv_info2,__LINE__);

      if (GV_MV_INP_status.inp_event_enabled & MV_INP_BUFFER_CMD_START_EVENT != 0)
      {
         /* Notify the application. */
         GV_MV_INP_status.function_ptr(MV_INP_BUFFER_CMD_START_EVENT);
      }
   }
   
} /* End of MV_DEC_play */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_stop

    PACKAGE:           MV_DEC

    SCOPE:             PLATFORM

    DESCRIPTION:
    Freeze on the next decoded picture and stop decoding video data from
    the video input buffer.

    PRECONDITIONS:
    None

    POSTCONDITIONS:
    Video Decoder is in state MV_DEC_DECODING_STATE_STOPPED.

    CALLING SEQUENCE:
*/
extern void 
MV_DEC_stop(    
   void
   )
/*EMP=======================================================================*/
{
   UInt32 lv_protection_level;

   tmosalDisableInterruptsNoSysCall(&lv_protection_level);
   GV_MV_DEC_status.dec_state = MV_DEC_DECODING_STATE_STOPPED;
   GV_MV_DEC_status.dec_discontinuity_detected = FALSE;
   tmosalEnableInterruptsNoSysCall(lv_protection_level);

   GV_cmd_buf_start = FALSE;

   MV_ITV_disable_irpt(MV_ITV_VIDEO_FIFO_UNDER);
   MV_ITV_disable_irpt(MV_ITV_VIDEO_FIFO_OVER);   

   MV_FBM_change_channel();
   
} /* End of MV_DEC_stop */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_scan

    PACKAGE:           MV_DEC

    SCOPE:             PLATFORM

    DESCRIPTION:
    Decode and display only the I or the I&P pictures.

    When the play mode requires waiting for the system time counter to
    reach the video decoding time stamp (DTS), or for the video input
    buffer contents to reach the over level, this is done asynchronously.
    This function returns immediately.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -