📄 mv_dec.c
字号:
/*==========================================================================*/
/* (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 + -