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

📄 mv_dec.c

📁 tuner扫描
💻 C
📖 第 1 页 / 共 4 页
字号:
   MV_DEC_PIP_MODE in_pip_mode
   )
/*EMP=======================================================================*/
{
   UInt32 lv_protection_level;
    
   tmosalDisableInterruptsNoSysCall(&lv_protection_level);
   
   if(in_pip_mode == MV_DEC_PIP_MODE_ENABLED)
   {
      GV_MV_DEC_status.dec_pip_enabled = TRUE;
      MV_drv_set_video_int_clear(MV_VIDEO_EVENT_SEQUENCE_HEADER_START_CODE);
      MV_drv_set_video_event_enable(MV_drv_video_event_enable() | MV_VIDEO_EVENT_SEQUENCE_HEADER_START_CODE);
   }
   else
   {
      GV_MV_DEC_status.dec_pip_enabled = FALSE;
   }
   
   tmosalEnableInterruptsNoSysCall(lv_protection_level);
   
} /* End of MV_DEC_set_pip_mode */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_set_low_delay_mode

    PACKAGE:           MV_DEC

    SCOPE:             PLATFORM

    DESCRIPTION:
    Prepare decoding of a still picture in low delay mode, which mean that
    each time a picture is decoded (in 2 or more Vs) each time it is
    displayed.

    PRECONDITIONS:
    None

    POSTCONDITIONS:
    None

    CALLING SEQUENCE:    
    */
extern void
MV_DEC_set_low_delay_mode(    
   MV_DEC_LOW_DELAY_MODE in_low_delay_mode
   )
/*EMP=======================================================================*/
{
   UInt32 lv_protection_level;
    
   tmosalDisableInterruptsNoSysCall(&lv_protection_level);
   
   if(in_low_delay_mode == MV_DEC_LOW_DELAY_MODE_ENABLED)
   {
      GV_MV_DEC_status.dec_low_delay_forced_by_application = TRUE;
   }
   else
   {
      GV_MV_DEC_status.dec_low_delay_forced_by_application = FALSE;
   }
   
   tmosalEnableInterruptsNoSysCall(lv_protection_level);
   
} /* End of MV_DEC_set_pip_mode */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_soft_reset

    PACKAGE:           MV_DEC

    SCOPE:             PLATFORM

    DESCRIPTION:
    Performs a software reset of the video decoder core.

    PRECONDITIONS:
    None

    POSTCONDITIONS:
    None

    CALLING SEQUENCE:
*/
extern void
MV_DEC_soft_reset(    
   void
   )
/*EMP=======================================================================*/
{
   MV_ITV_enable_irpt(MV_ITV_RESET_DONE);
   MV_FBM_soft_reset();
   
} /* End of MV_DEC_soft_reset */


/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_abort_decoding_by_user

    PACKAGE:           MV_DEC

    SCOPE:             PLATFORM

    DESCRIPTION:
    Allows application to abort decoding.

    PRECONDITIONS:
    None

    POSTCONDITIONS:
    None

    CALLING SEQUENCE:
*/
extern void
MV_DEC_abort_decoding_by_user(    
void
)
/*EMP=======================================================================*/
{
   MV_FBM_api_abort_decoding();
   
} /* End of MV_DEC_abort_decoding_by_user */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_get_dec_delay

    PACKAGE:           MV_DEC

    SCOPE:             PLATFORM

    DESCRIPTION:
    Give the MPEG video decoder latency.
    It gives the difference between the real PTS and the theorical PTS of
    a picture.
    This difference is given in unit of ticks (at 90000Hz)
    ou_dec_delay_ptr = real PTS - theorical PTS

    Drivers notify MV_DEC_PTS_DELAY_AVAILABLE_EVENT to application when
    delay information is available.
    
    NOTES:
    MV_DEC_get_dec_delay() can be call in an ISR.

    PRECONDITIONS:
    Before calling this routine, application must enable notification of
    MV_DEC_PTS_DELAY_AVAILABLE_EVENT via
    MV_DEC_enable_notification(MV_DEC_PTS_DELAY_AVAILABLE_EVENT) routine.

    POSTCONDITIONS:
    None

    CALLING SEQUENCE:
*/
extern void
MV_DEC_get_dec_delay(    
MV_DEC_STC *ou_dec_delay_ptr
)
/*EMP=======================================================================*/
{
   
   *ou_dec_delay_ptr = GV_MV_DEC_status.dec_pts_delay;
         
} /* End of MV_DEC_get_dec_delay */

/*==========================================================================*/
/*       L O C A L  F U N C T I O N S                                       */ 
/*==========================================================================*/
/*LPF=======================================================================*/
/*
    FUNCTION NAME: LF_VIDEO_EVENT_handler       

    DESCRIPTION:

    NOTES:

    CALLING SEQUENCE:
*/
static void 
LF_VIDEO_EVENT_handler(
   void
   )
/*EMP=======================================================================*/
{  
   UInt32          lv_protection_level;
   unsigned long   lv_video_event;

#ifdef DV_DEBUG
   unsigned long lv_info1 = 0;
   unsigned long lv_info2 = 0;
   unsigned long lv_info3 = 0;
#endif
   
   DV_DBG_STORE_EVENT(IPVD_DBG_EV_ISR, IPVD_DBG_ISR_BEGIN_LEVEL,IPVD_VIDEO_EVENT_ISR, lv_info1, lv_info2, lv_info3);

   lv_video_event = GV_itv_video_event;

#ifdef DV_DEBUG
   lv_info1 = MV_drv_video_event_enable();
#endif
   
   DV_DBG_STORE_EVENT(IPVD_DBG_EV_VIDEO_EVENT, IPVD_DBG_MAJOR_BEHAVIOR_LEVEL,lv_video_event,lv_info1,0,0);

   /* mechanism to avoid to loose GOP_SC event which is used in EOPH ISR */
   tmosalDisableInterruptsNoSysCall(&lv_protection_level);
   
   if ((lv_video_event & MV_DEC_VIDEO_EVENT_GOP_SC) != 0)
   {
      GV_MV_DEC_status.dec_gop_sc_found = TRUE;
   }

   if ( (lv_video_event & MV_DEC_VIDEO_EVENT_PES_H_SC1) != 0 )
   {
      /* flag to prevent user data parser that a PES header 1 has been found start code */
      GV_MV_DEC_status.dec_pes_sc1_found = TRUE;
   }

   if ( (lv_video_event & MV_DEC_VIDEO_EVENT_PES_H_SC2) != 0 )
   {
      /* flag to prevent user data parser that a PES header 1 has been found start code */
      GV_MV_DEC_status.dec_pes_sc2_found = TRUE;
   }
      
   if((GV_MV_DEC_ud_status.dec_ud_parsing_done == TRUE) && (GV_MV_DEC_ud_status.dec_ud_request != 0))   
   {
      /* look what start code is in video_event */
      
      if (((lv_video_event & MV_DEC_VIDEO_EVENT_GOP_SC) != 0) && (GV_MV_DEC_ud_status.dec_ud_request & MV_DEC_SEQ_UD))
      {
         /* flag to prevent user data parser to parse sequence user data up to
            next gop start code or up to next picture start code */
         GV_MV_DEC_ud_status.dec_gop_sc_found = TRUE;
      }
      
      if ( (lv_video_event & MV_DEC_VIDEO_EVENT_PES_H_SC1) != 0 )
      {
         /* flag to prevent user data parser that a PES header 1 has been found start code */
         GV_MV_DEC_ud_status.dec_pes_sc1_found = TRUE;
      }

      if ( (lv_video_event & MV_DEC_VIDEO_EVENT_PES_H_SC2) != 0 )
      {
         /* flag to prevent user data parser that a PES header 1 has been found start code */
         GV_MV_DEC_ud_status.dec_pes_sc2_found = TRUE;
      }
      
      if (((lv_video_event & MV_DEC_VIDEO_EVENT_SEQ_UD_SC) != 0) && (GV_MV_DEC_ud_status.dec_ud_request & MV_DEC_SEQ_UD))
      {
         /* Add UD type found */
         GV_MV_DEC_ud_status.dec_ud_found |= MV_DEC_SEQ_UD;
      }
      if (((lv_video_event & MV_DEC_VIDEO_EVENT_GOP_UD_SC) != 0) && (GV_MV_DEC_ud_status.dec_ud_request & MV_DEC_GOP_UD))
      {
         /* Add UD type found */
         GV_MV_DEC_ud_status.dec_ud_found |= MV_DEC_GOP_UD;
      }
      if (((lv_video_event & MV_DEC_VIDEO_EVENT_PICT_UD_SC) != 0) && (GV_MV_DEC_ud_status.dec_ud_request & MV_DEC_PICT_UD))
      {
         /* Add UD type found */
         GV_MV_DEC_ud_status.dec_ud_found |= MV_DEC_PICT_UD;
      }
   }
   tmosalEnableInterruptsNoSysCall(lv_protection_level);
   
   if(lv_video_event & MV_VIDEO_EVENT_SEQUENCE_HEADER_START_CODE)
   {
      /* a new sequence has been found,
         update sequence informations fields in GV_MV_DEC_status */
      GV_MV_DEC_status.dec_seq_info.seq_width = MV_drv_seq_hor_size();
      GV_MV_DEC_status.dec_seq_info.seq_height =MV_drv_seq_ver_size();
      GV_MV_DEC_status.dec_seq_info.aspect_ratio = MV_drv_aspect_ratio();
      GV_MV_DEC_status.dec_seq_info.frame_rate = MV_drv_frame_rate();
      
      /* Notify to application MV_DEC_NEW_SEQ_FOUND_EVENT
         this event is used to aware application that it can call
         MV_DEC_get_seq_info() */
      if (GV_MV_DEC_status.dec_event_enabled & MV_DEC_NEW_SEQ_FOUND_EVENT)
      {
         /* Notify the application. */
         GV_MV_DEC_status.function_ptr(MV_DEC_NEW_SEQ_FOUND_EVENT);
      }

      /* PR903 : 50Hz decoding -> 60 TV : update automatically setup_buffer_number */
      /* in case of zapping for exemple */

      /* tv_standard = MV_DEC_STANDARD_60HZ */   
      if(GV_MV_DEC_config_status.dec_bufcfg.tv_standard == MV_DEC_STANDARD_60HZ)
      {
         if((GV_MV_DEC_status.dec_seq_info.frame_rate == MV_DEC_FRAME_RATE_25) ||
            (GV_MV_DEC_status.dec_seq_info.frame_rate == MV_DEC_FRAME_RATE_50))
         {
            if(GV_MV_DEC_config_status.dec_bufcfg.fs_memory_mapping == MV_DEC_FS_MAPPING_2_6)
            {
               MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_50HZ_2_6FS);
            }
            else
            {
               MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_50HZ_3_0FS);
            }
         }
         else
         {
            MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_60HZ);
         }
      }
      else
      /* tv_standard = MV_DEC_STANDARD_50HZ */
      {
         if((GV_MV_DEC_status.dec_seq_info.frame_rate == MV_DEC_FRAME_RATE_25) ||
            (GV_MV_DEC_status.dec_seq_info.frame_rate == MV_DEC_FRAME_RATE_50))
         {
            if(GV_MV_DEC_config_status.dec_bufcfg.fs_memory_mapping == MV_DEC_FS_MAPPING_2_6)
            {
               MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_50HZ_2_6FS);
            }
            else
            {
               MV_drv_set_setup_buffer_number(MV_DEC_SETUP_BUFFER_NUMBER_50HZ_3_0FS);
            }
         }
         /* else not implement, that is to say don't handle 60 -> 50Hz conversion */
      }
      
      /* Used in case of PIP mode enabled */
      if (GV_MV_DEC_status.dec_pip_enabled == TRUE)
      {
         GV_MV_DEC_status.dec_shc_found = TRUE;
      }

      /* New seq header found, a immediately following P picture type could
         be decoded according to GI standard */
      tmosalDisableInterruptsNoSysCall(&lv_protection_level);
      GV_MV_DEC_status.dec_new_shc_decode_GI_P_possible = TRUE;
      tmosalEnableInterruptsNoSysCall(lv_protection_level);
   }

   DV_DBG_STORE_EVENT(IPVD_DBG_EV_ISR, IPVD_DBG_ISR_END_LEVEL,IPVD_VIDEO_EVENT_ISR, 0, 0, 0);
   
} /* End of LF_VIDEO_EVENT_handler */

/*LPF=======================================================================*/
/*
    FUNCTION NAME: LF_RESET_DONE_handler       

    DESCRIPTION:

    NOTES:

    CALLING SEQUENCE:
*/
static void 
LF_RESET_DONE_handler(
   void
   )
/*EMP=======================================================================*/
{
   DV_DBG_STORE_EVENT(IPVD_DBG_EV_ISR, IPVD_DBG_ISR_BEGIN_LEVEL,IPVD_RESET_DONE_ISR, 0, 0, 0);
   DV_DBG_STORE_EVENT(IPVD_DBG_EV_RESET_DONE,IPVD_DBG_MAJOR_BEHAVIOR_LEVEL,0,0,0,0);


   GV_Delta_VIDEO_DTS_PTS = 0;//JI

   if (GV_MV_DEC_status.dec_event_enabled & MV_DEC_RESET_DONE_EVENT)
   {
      /* Notify the application. */
      GV_MV_DEC_status.function_ptr(MV_DEC_RESET_DONE_EVENT);
   }

   MV_drv_set_video_int_clear((1<<MV_ITV_VIDEO_FIFO_OVER)
                              ||(1<<MV_ITV_VIDEO_FIFO_UNDER)
                              ||(1<<MV_ITV_VIDEO_FIFO_FULL)
                              ||(1<<MV_ITV_VIDEO_FIFO_EMPTY)
                              );
   
   /* PR530 : only notify HW reset when API is called, not in case of internal HW
      reset due to hangup */
   MV_ITV_isr_disable_irpt(MV_ITV_RESET_DONE);

   DV_DBG_STORE_EVENT(IPVD_DBG_EV_ISR, IPVD_DBG_ISR_END_LEVEL,IPVD_RESET_DONE_ISR, 0, 0, 0);
   
} /* End of LF_RESET_DONE_handler */

⌨️ 快捷键说明

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