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

📄 mv_dec.c

📁 tuner扫描
💻 C
📖 第 1 页 / 共 4 页
字号:
/*==========================================================================*/
/*     (Copyright (C) 2003 Koninklijke Philips Electronics N.V.             */
/*     All rights reserved.                                                 */
/*     This source code and any compilation or derivative thereof is the    */
/*     proprietary information of Koninklijke Philips Electronics N.V.      */
/*     and is confidential in nature.                                       */
/*     Under no circumstances is this software to be exposed to or placed   */
/*     under an Open Source License of any type without the expressed       */
/*     written permission of Koninklijke Philips Electronics N.V.           */
/*==========================================================================*/
/*==========================================================================*/
/*                                                                          
       SOURCE_FILE:    MV_DEC.C

       PACKAGE:        DEC
       COMPONENT:      MV      
                                                                            
       (C) 1998: Philips Semiconductors                                
                                                                            */ 
/*==========================================================================*/
/*MPP:::DEC======================================================*/

/* PACKAGE NAME:       DEC

   SCOPE:              PLATEFORM
      
   ORIGINAL AUTHOR:    M.IGUENANE

   DESCRIPTION :  
   Basic functionality of the video decoding package.

   DATA TYPES:

   FUNCTIONS:
   MV_DEC_bufuse
   MV_DEC_init
   MV_DEC_set_defaults
   MV_DEC_term
   MV_DEC_set_sync_mode
   MV_DEC_freeze
   MV_DEC_play
   MV_DEC_stop
   MV_DEC_scan
   MV_DEC_step
   MV_DEC_display_picture
   MV_DEC_set_dts
   MV_DEC_set_stc
   MV_DEC_get_stc
   MV_DEC_discontinuity
   MV_DEC_decode_picture_in_picture
   MV_DEC_set_pip_mode
   MV_DEC_soft_reset
   MV_DEC_abort_decoding_by_user
   MV_DEC_get_dec_delay
   MV_DEC_enable_user_data
   MV_DEC_disable_user_data
   MV_DEC_get_user_data
   MV_DEC_user_data_process
   MV_DEC_install_notify
   MV_DEC_enable_notification
   MV_DEC_disable_notification
   MV_DEC_get_seq_info
   MV_DEC_get_picture_info
   MV_DEC_get_decoding_state
                                                                            */
/*EMP=======================================================================*/

/*==========================================================================*/
/*       I N C L U D E S                                                    */ 
/*==========================================================================*/

#include "standard.h"
#include "tmosal.h"
#include "mv_dec.h"
#include "fbm_sw.h"
#include "fbm_api.h"
#include "mv_decl.h"
#include "mv_inpl.h"
#include "mv_decp.h"
#include "mv_itvl.h"
#include "dv_dbg.h"
#include "ipvd_dbgl.h"
#include "mv_drv.h"

/*==========================================================================*/
/*       G L O B A L   D A T A   D E C L A R A T I O N S                    */
/*==========================================================================*/

MV_DEC_CONFIG_STATUS GV_MV_DEC_config_status;

MV_DEC_STATUS GV_MV_DEC_status;
static const MV_DEC_STATUS GV_MV_DEC_status_init = MV_DEC_STATUS_INIT;

MV_DEC_UD_STATUS GV_MV_DEC_ud_status;
static const MV_DEC_UD_STATUS GV_MV_DEC_ud_status_init = MV_DEC_UD_STATUS_INIT;

extern BOOLEAN GV_cmd_buf_start;

/*==========================================================================*/
/*       L O C A L   S Y M B O L   D E F I N I T I O N S                    */
/*==========================================================================*/

/*==========================================================================*/
/*       L O C A L   D A T A   D E C L A R A T I O N S                      */
/*==========================================================================*/

/*==========================================================================*/
/*       L O C A L   F U N C T I O N S   P R O T O T Y P E S                */
/*==========================================================================*/
static void  LF_VIDEO_EVENT_handler    (void);
static void  LF_RESET_DONE_handler    (void);

/*==========================================================================*/
/*       G L O B A L  F U N C T I O N S                                     */ 
/*==========================================================================*/
/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_bufuse

    PACKAGE:           DEC

    SCOPE:             PLATEFORM

    DESCRIPTION:
    Depending on some (run-time) configuration parameters, the sizes (and
    alignments) of the buffers required by the package are computed.
    With this information the application can allocate these buffers and pass
    them to the package upon initialization.


    It's up to application to set following parameters as input:
    - in_bufcfg_ptr->max_hor_dec_picture:
    in pixels
                       
    - in_bufcfg_ptr->max_ver_dec_picture:
    in pixels
                       
    - in_bufcfg_ptr->fs_memory_mapping :
    MV_DEC_FS_MAPPING_2_6
    MV_DEC_FS_MAPPING_3_0
    MV_DEC_FS_MAPPING_4_0

    - in_bufcfg_ptr->ud_buf_size:
    size of User Data buffer in bytes
         
    - in_bufcfg_ptr->dec_to_disp:
    1
    2
                       
    PRECONDITIONS:
    This function may be called before MV_DEC_init().
    
    POSTCONDITIONS:
    
    CALLING SEQUENCE:
    */
extern void
MV_DEC_bufuse(
   MV_DEC_BUFCFG * in_bufcfg_ptr, /* In: run-time config. parameters */
   MV_DEC_BUFFERS * ou_bufuse_ptr /* Out: required sizes and alignment */
   )
/*EMP=======================================================================*/
{
   /* 256*32 bits alignement */
   ou_bufuse_ptr->FS0_y_odd_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS0_y_even_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS0_c_odd_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS0_c_even_buf_addr = (void *)(0xFFFFFC00);

   ou_bufuse_ptr->FS1_y_odd_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS1_y_even_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS1_c_odd_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS1_c_even_buf_addr = (void *)(0xFFFFFC00);

   ou_bufuse_ptr->FS2_y_odd_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS2_y_even_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS2_c_odd_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS2_c_even_buf_addr = (void *)(0xFFFFFC00);
 
   ou_bufuse_ptr->FS3_y_odd_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS3_y_even_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS3_c_odd_buf_addr = (void *)(0xFFFFFC00);
   ou_bufuse_ptr->FS3_c_even_buf_addr = (void *)(0xFFFFFC00);

   
   ou_bufuse_ptr->FS0_y_odd_buf_size =
      (((in_bufcfg_ptr->max_hor_dec_picture * in_bufcfg_ptr->max_ver_dec_picture)
        * NB_LUMA_BITS_PER_PELS)
       /2 /BYTE_2_BIT);

   ou_bufuse_ptr->FS0_y_even_buf_size = ou_bufuse_ptr->FS0_y_odd_buf_size ;
   
   ou_bufuse_ptr->FS0_c_odd_buf_size =
      (((in_bufcfg_ptr->max_hor_dec_picture * in_bufcfg_ptr->max_ver_dec_picture)
        * NB_CHROMA_BITS_PER_PELS)
       /2 /BYTE_2_BIT);

   ou_bufuse_ptr->FS0_c_even_buf_size = ou_bufuse_ptr->FS0_c_odd_buf_size ;
   
   
   ou_bufuse_ptr->FS1_y_odd_buf_size = ou_bufuse_ptr->FS0_y_odd_buf_size;
   ou_bufuse_ptr->FS1_y_even_buf_size = ou_bufuse_ptr->FS0_y_even_buf_size;
   ou_bufuse_ptr->FS1_c_odd_buf_size = ou_bufuse_ptr->FS0_c_odd_buf_size;
   ou_bufuse_ptr->FS1_c_even_buf_size = ou_bufuse_ptr->FS0_c_even_buf_size;

   ou_bufuse_ptr->FS2_y_odd_buf_size = ou_bufuse_ptr->FS0_y_odd_buf_size;
   ou_bufuse_ptr->FS2_y_even_buf_size = ou_bufuse_ptr->FS0_y_even_buf_size;
   ou_bufuse_ptr->FS2_c_odd_buf_size = ou_bufuse_ptr->FS0_c_odd_buf_size;
   ou_bufuse_ptr->FS2_c_even_buf_size = ou_bufuse_ptr->FS0_c_even_buf_size;

   /* if -> 2.6 frames stores memory mapping FS2 is 0.6 frame size (22/36) and there is no FS3 */
   if (in_bufcfg_ptr->fs_memory_mapping == MV_DEC_FS_MAPPING_2_6)
   {
      ou_bufuse_ptr->FS2_y_odd_buf_size = (ou_bufuse_ptr->FS0_y_odd_buf_size*22)/36;
      ou_bufuse_ptr->FS2_y_even_buf_size = (ou_bufuse_ptr->FS0_y_even_buf_size*22)/36;
      ou_bufuse_ptr->FS2_c_odd_buf_size = (ou_bufuse_ptr->FS0_c_odd_buf_size*22)/36;
      ou_bufuse_ptr->FS2_c_even_buf_size = (ou_bufuse_ptr->FS0_c_even_buf_size*22)/36;

      ou_bufuse_ptr->FS3_y_odd_buf_size = 0;
      ou_bufuse_ptr->FS3_y_even_buf_size = 0;
      ou_bufuse_ptr->FS3_c_odd_buf_size = 0;
      ou_bufuse_ptr->FS3_c_even_buf_size = 0;      
   }

   /* else if -> 3.0 frames stores memory mapping. there is no FS3, so size = 0 */
   else if(in_bufcfg_ptr->fs_memory_mapping == MV_DEC_FS_MAPPING_3_0)
   {
      ou_bufuse_ptr->FS3_y_odd_buf_size = 0;
      ou_bufuse_ptr->FS3_y_even_buf_size = 0;
      ou_bufuse_ptr->FS3_c_odd_buf_size = 0;
      ou_bufuse_ptr->FS3_c_even_buf_size = 0;
   }
   
   /* else if -> 4.0 frames stores memory mapping. FS3 is full frame size */
   if(in_bufcfg_ptr->fs_memory_mapping == MV_DEC_FS_MAPPING_4_0)
   {
      ou_bufuse_ptr->FS3_y_odd_buf_size = ou_bufuse_ptr->FS0_y_odd_buf_size;
      ou_bufuse_ptr->FS3_y_even_buf_size = ou_bufuse_ptr->FS0_y_even_buf_size;
      ou_bufuse_ptr->FS3_c_odd_buf_size = ou_bufuse_ptr->FS0_c_odd_buf_size;
      ou_bufuse_ptr->FS3_c_even_buf_size = ou_bufuse_ptr->FS0_c_even_buf_size;
   }

   /* Data buffer used to store sequence header -> slice header which
    will be copied at the end of still fifo to restart correctly
    decoding of the main mpeg stream */
   ou_bufuse_ptr->seq_hdr_buf_size = in_bufcfg_ptr->seq_hdr_buf_size;
   ou_bufuse_ptr->seq_hdr_buf_addr = (void *)0xFFFFFFFF; /* 8 bits alignement */   

   /* User Data buffer */
   ou_bufuse_ptr->ud_buf_size = in_bufcfg_ptr->ud_buf_size;
   ou_bufuse_ptr->ud_buf_addr = (void *)0xFFFFFFFF; /* 8 bits alignement */

   GV_MV_DEC_config_status.dec_bufcfg.max_hor_dec_picture = in_bufcfg_ptr->max_hor_dec_picture;
   GV_MV_DEC_config_status.dec_bufcfg.max_ver_dec_picture = in_bufcfg_ptr->max_ver_dec_picture;
   GV_MV_DEC_config_status.dec_bufcfg.fs_memory_mapping = in_bufcfg_ptr->fs_memory_mapping;
   GV_MV_DEC_config_status.dec_bufcfg.dec_to_disp = in_bufcfg_ptr->dec_to_disp;
   GV_MV_DEC_config_status.dec_bufcfg.tv_standard = in_bufcfg_ptr->tv_standard;
   GV_MV_DEC_config_status.dec_bufcfg.threshold_error_param = in_bufcfg_ptr->threshold_error_param;
   
} /* End of MV_DEC_bufuse */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_init

    PACKAGE:           DEC

    SCOPE:             PLATEFORM

    DESCRIPTION:
    This function initializes the video decoding package.
    It claims all resources needed by the package and subsequently sets it
    to its default state as specified for the MV_DEC_set_defaults() function. 

    The required buffers are passed as parameters.
    This function must be called before any other function of the MV_DEC
    package (except MV_DEC_bufuse())

    !!! MV_DEC_init must be called before MV_INP_init

    PRECONDITIONS:
    This function may be called after MV_DEC_bufuse().

    POSTCONDITIONS:
    The drivers are set in the same mode than after call to
    MV_DEC_set_defaults(). Video Decoder is in state
    MV_DEC_DECODING_STATE_READY
    
    CALLING SEQUENCE:
    */
extern void
MV_DEC_init(    
   MV_DEC_BUFFERS * in_buffers_ptr /* In: application allocated buffers */
   )
/*EMP=======================================================================*/
{   
   tmosalSemHandle_t     lv_new_semaphore;
   tmErrorCode_t returnVal;
   
   MV_drv_init();
   
   MV_drv_set_video_int_clear(0xffffffff);

   MV_drv_set_fbm_event_clear(0xffffffff);
   MV_drv_set_video_event_clear(0xffffffff);
   MV_drv_set_error_event_clear(0xffffffff);
   MV_drv_set_system_event_clear(0xffffffff);
   
   MV_ITV_init();
   
   MV_FBM_init(in_buffers_ptr);

   /* store address and size of User Data buffer in status structure */
   GV_MV_DEC_ud_status.dec_ud_adr = (unsigned long)in_buffers_ptr->ud_buf_addr;
   GV_MV_DEC_ud_status.dec_ud_buffer_size = in_buffers_ptr->ud_buf_size;

   /* store address and size of Seq Hdr Data buffer in status structure */
   GV_MV_DEC_status.dec_pip_buf_addr = (unsigned long)in_buffers_ptr->seq_hdr_buf_addr;
   GV_MV_DEC_status.dec_pip_buf_size = in_buffers_ptr->seq_hdr_buf_size;
      
   /* Install VIDEO_EVENT_handler */
   MV_ITV_install_isr(LF_VIDEO_EVENT_handler, MV_ITV_VIDEO_EVENT, TRUE);
   MV_drv_set_video_event_enable( MV_VIDEO_EVENT_SEQUENCE_HEADER_START_CODE | MV_DEC_VIDEO_EVENT_GOP_SC
                                  | MV_DEC_VIDEO_EVENT_PES_H_SC1 | MV_DEC_VIDEO_EVENT_PES_H_SC2
                                  | MV_drv_video_event_enable() );
   GV_MV_DEC_status.dec_video_event_mask |= (MV_VIDEO_EVENT_SEQUENCE_HEADER_START_CODE | MV_DEC_VIDEO_EVENT_GOP_SC);

   /* Install RESET_DONE_handler */
   MV_ITV_install_isr(LF_RESET_DONE_handler, MV_ITV_RESET_DONE, FALSE);
   
   /* Create the synchronisation semaphore */
   
   returnVal = tmosalSemCreate(1, &lv_new_semaphore, tmosalSemCreateFlagNone);
   if (returnVal != TM_OK)
   {
      DV_DBG_STORE_EVENT(IPVD_DBG_EV_UD_SEMAPHORE_ERROR,IPVD_DBG_UD_LEVEL,IPVD_SEMAPHORE_CREATE,0,0,0);
   }
      
   GV_MV_DEC_ud_status.ptr_sync_semaphore = lv_new_semaphore;
   
   MV_DEC_set_defaults();
   
} /* End of MV_DEC_init */

/*MPF=======================================================================*/
/*  
    FUNCTION NAME:     MV_DEC_set_defaults

    PACKAGE:           MV_DEC

    SCOPE:             PLATFORM

    DESCRIPTION:
    Sets the video decoding package to its default settings.
    All status variables are reset to its init values.

    PRECONDITIONS:
    None

    POSTCONDITIONS:
    Video Decoder is in state MV_DEC_DECODING_STATE_READY
    
    CALLING SEQUENCE:
*/
extern void
MV_DEC_set_defaults(    
   void
   )
/*EMP=======================================================================*/
{
   unsigned long          lv_ud_adr;
   MV_DEC_MEM_SIZE        lv_ud_buf_size; /* in bytes */
   unsigned long          lv_seq_adr;
   MV_DEC_MEM_SIZE        lv_seq_buf_size; /* in bytes */   
   tmosalSemHandle_t      lv_new_semaphore;
   UInt32                 lv_protection_level;   

   MV_FBM_set_defaults();

   /* retrieve address and size of UD and SEQ Hdr buffer because it is only initialized
      in MV_DEC_init() */
   lv_seq_adr = GV_MV_DEC_status.dec_pip_buf_addr;
   lv_seq_buf_size = GV_MV_DEC_status.dec_pip_buf_size;
   lv_ud_adr = GV_MV_DEC_ud_status.dec_ud_adr;
   lv_ud_buf_size = GV_MV_DEC_ud_status.dec_ud_buffer_size;
   lv_new_semaphore = GV_MV_DEC_ud_status.ptr_sync_semaphore;

⌨️ 快捷键说明

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