📄 dvb_movie.c
字号:
/**************************************************************************
(C)Copyright Cheertek Inc.
K000, all right reserved.
Date : 2007.09.11
Author : Cheertek (k000)
Purpose : Image API for UI Layer
****************************************************************************/
#include <stdio.h>
#ifndef CT216T_ELGIST_MM
#include "dvb_av.h"
#endif
#include "dvb_file.h"
#include "dvb_movie.h"
#include "dvb_device.h"
#include "ct_movie.h"
#include "ct_fd.h"
#include "ct_video.h"
#include "ct_osd.h"
#include "ct_audio.h"
#include "ct_adac.h"
#if 1
#define MOV_DBG(p)
#else
#define MOV_DBG(p) printf p
#endif
#if 1
#define MOV_MSG(p)
#else
#define MOV_MSG(p) printf p
#endif
typedef struct
{
EN_MOV_DATA_SRC enDataSrc;
u32 u32FillDataHandle;
u32 u32MovDataLen;
u32 u32FileHandle;
u8* pu8DataBuff;
u32 u32PrePcmScaler;
u32 u32SamplePerFrame;
u32 u32TotalTime;
u32 u32CurrentTime;
u32 u32ProcessTimeOut;
u32 u32ProgressFillTimeOut;
u32 u32LastProgress;
u32 u32FinishDetectCount;
EN_CT_AUDIO_FREQ enAudioFreq;
EN_CT_AUDIO_MEDIA_ATTR enPrvAudioMediaAttr;
EN_CT_AUDIO_MODE enPrvAudioType;
EN_CT_AUDIO_MODE enActAudioType;
bool8 b8PlayStart;
bool8 b8PauseStatus;
bool8 b8FrameCountDetect;
bool8 b8TotatTimeDetect;
bool8 b8PlayInfoDetect;
u32 u32PreFrameCount;
u32 u32DetectFrameCount;
u8* pu8MovieDataBuff;
} MOVIE_Handle;
extern char *strupr(char *string);
extern bool8 DVB_DEVCTRL_HoldFs(bool8 b8Hold, EN_MEDIA_TYPE enMediaType);
/*******************************************************************************************/
//Global variable
#ifdef USB_ENABLE
static EN_DEVICE_TYPE _enDeviceType = EN_USB_DEVICE;
#else
static EN_DEVICE_TYPE _enDeviceType = EN_CARDREADER_DEVICE;
#endif
MOVIE_Handle *_pstMovieHandle = NULL;
bool8 _b8MovDecodingMode = FALSE;
EN_DVB_MOVIE_TYPE _enCurMovType = EN_DVB_MOVIE_TYPE_AVI;
void DVB_Movie_SetFiletype(EN_DVB_MOVIE_TYPE enFiletype)
{
_enCurMovType = enFiletype;
}
EN_DVB_MOVIE_TYPE DVB_Movie_GetFiletype(void)
{
return _enCurMovType;
}
EN_DEVICE_TYPE DVB_Movie_GetDeviceType(void)
{
return _enDeviceType;
}
void DVB_Movie_SetDeviceType(EN_DEVICE_TYPE enDeviceType)
{
_enDeviceType = enDeviceType;
}
bool8 DVB_Movie_ReadInfoFromFs(u32 u32FileIndex, DVB_MOVIE_INFO *pstMovieInfo)
{
EN_CT_MOVIE_STAGE enMovieStage = EN_CT_MOVIE_PREPARE_INFO;
u8 au8FileName[13] = {0};
u8 u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_AVI;
ST_PENDEV_HANDLEINFO stMovieDeviceInfo;
DVB_DEVCTRL_HoldFs(TRUE, EN_MEDIA_MOVIE);
DVB_FILECTRL_GetFilenameWithIndex(_enDeviceType, EN_FILE_TYPE_MOVIE, u32FileIndex, &au8FileName[0]);
_pstMovieHandle->u32FileHandle = DVB_FILECTRL_FileOpen(_enDeviceType, &au8FileName[0], 'r');
DVB_DEVCTRL_HoldFs(FALSE, EN_MEDIA_MOVIE);
if(_pstMovieHandle->u32FileHandle == 0)
{
MOV_DBG(("\n>> open %s fail\n,_enDeviceType(%d),u32FileIndex(%lu)", &au8FileName[0], _enDeviceType, u32FileIndex));
return FALSE;
}
DVB_DEVCTRL_HoldFs(TRUE, EN_MEDIA_MOVIE);
_pstMovieHandle->u32MovDataLen = DVB_FILECTRL_GetFileSize(_enDeviceType, _pstMovieHandle->u32FileHandle);
DVB_DEVCTRL_HoldFs(FALSE, EN_MEDIA_MOVIE);
switch(_enCurMovType)
{
case EN_DVB_MOVIE_TYPE_DAT:
u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_DAT;
break;
case EN_DVB_MOVIE_TYPE_MPG:
u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_MPG;
break;
case EN_DVB_MOVIE_TYPE_VOB:
u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_VOB;
break;
case EN_DVB_MOVIE_TYPE_AVI:
u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_AVI;
break;
case EN_DVB_MOVIE_TYPE_MP4:
u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_MP4;
break;
default:
break;
}
if(CT_FillData_SetType(_pstMovieHandle->u32FillDataHandle, u8FillDataType) != DRV_OK)
{
DVB_FILECTRL_FileClose(_enDeviceType, _pstMovieHandle->u32FileHandle);
return FALSE;
}
if (CT_FillData_Start(_pstMovieHandle->u32FillDataHandle, _pstMovieHandle->u32MovDataLen)!=DRV_OK)
{
CT_FillData_Stop(_pstMovieHandle->u32FillDataHandle);
DVB_FILECTRL_FileClose(_enDeviceType, _pstMovieHandle->u32FileHandle);
return FALSE;
}
while (1)
{
switch (enMovieStage)
{
case EN_CT_MOVIE_PREPARE_INFO:
enMovieStage = CT_Movie_PrepareInfo(_enCurMovType);
break;
case EN_CT_MOVIE_START_PRESCAN:
enMovieStage = CT_Movie_StartPrescan(_enCurMovType);
break;
case EN_CT_MOVIE_POLLING_1ST_PRESCAN_DONE:
enMovieStage = CT_Movie_Polling1stPrescanDone(_enCurMovType);
CT_OS_Delay(10);
break;
case EN_CT_MOVIE_POLLING_SP_PARSING_DONE:
enMovieStage = CT_Movie_PollingSpParsingDone();
break;
case EN_CT_MOVIE_POLLING_IDXTBL_PRESCAN_DONE:
enMovieStage = EN_CT_MOVIE_SET_PLAYMODE;
break;
case EN_CT_MOVIE_STAGE_PRESCAN_LAST_SCR:
enMovieStage = CT_Movie_PrescanLastScr(_enCurMovType);
break;
case EN_CT_MOVIE_POLLING_LAST_SCR_PRESCAN_DONE:
enMovieStage = CT_Movie_PollingLastScrPrescanDone(_enCurMovType);
CT_OS_Delay(10);
break;
case EN_CT_MOVIE_SET_PLAYMODE:
CT_Movie_GetMovieInfo((CT_MOVIE_INFO *)pstMovieInfo);
CT_FillData_Stop(_pstMovieHandle->u32FillDataHandle);
DVB_FILECTRL_FileClose(_enDeviceType, _pstMovieHandle->u32FileHandle);
return TRUE;
default:
CT_FillData_Stop(_pstMovieHandle->u32FillDataHandle);
DVB_FILECTRL_FileClose(_enDeviceType, _pstMovieHandle->u32FileHandle);
return FALSE;
}
DVB_DEVCTRL_LookupByMedia(EN_MEDIA_MOVIE, &stMovieDeviceInfo);
if (FALSE == stMovieDeviceInfo.b8Ready)
{
CT_FillData_Stop(_pstMovieHandle->u32FillDataHandle);
DVB_FILECTRL_FileClose(_enDeviceType, _pstMovieHandle->u32FileHandle);
return FALSE;
}
}
CT_FillData_Stop(_pstMovieHandle->u32FillDataHandle);
DVB_FILECTRL_FileClose(_enDeviceType, _pstMovieHandle->u32FileHandle);
return TRUE;
}
EN_MOV_PLAY_STATUS DVB_Movie_PlayFromFs(u32 u32FileIndex)
{
EN_CT_MOVIE_STAGE enMovieStage = EN_CT_MOVIE_PREPARE_INFO;
u8 au8FileName[13] = {0};
u8 u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_AVI;
ST_PENDEV_HANDLEINFO stMovieDeviceInfo;
u32 u32Status;
CT_MPG_FrameBuffClear(EN_CT_FRAME_BUFFER_VIDEO, COLOR_YCbCrCOLOR_BLACK);
_pstMovieHandle->b8PlayStart = TRUE;
DVB_DEVCTRL_HoldFs(TRUE, EN_MEDIA_MOVIE);
DVB_FILECTRL_GetFilenameWithIndex(_enDeviceType, EN_FILE_TYPE_MOVIE, u32FileIndex, &au8FileName[0]);
_pstMovieHandle->u32FileHandle = DVB_FILECTRL_FileOpen(_enDeviceType, &au8FileName[0], 'r');
DVB_DEVCTRL_HoldFs(FALSE, EN_MEDIA_MOVIE);
if(_pstMovieHandle->u32FileHandle == 0)
{
MOV_DBG(("\n>> open %s fail\n,_enDeviceType(%d),u32FileIndex(%lu)", &au8FileName[0], _enDeviceType, u32FileIndex));
return EN_MOV_STATUS_OPEN_FILE_FAIL;
}
DVB_DEVCTRL_HoldFs(TRUE, EN_MEDIA_MOVIE);
_pstMovieHandle->u32MovDataLen = DVB_FILECTRL_GetFileSize(_enDeviceType, _pstMovieHandle->u32FileHandle);
DVB_DEVCTRL_HoldFs(FALSE, EN_MEDIA_MOVIE);
switch(_enCurMovType)
{
case EN_DVB_MOVIE_TYPE_DAT:
u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_DAT;
break;
case EN_DVB_MOVIE_TYPE_MPG:
u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_MPG;
break;
case EN_DVB_MOVIE_TYPE_VOB:
u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_VOB;
break;
case EN_DVB_MOVIE_TYPE_AVI:
u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_AVI;
break;
case EN_DVB_MOVIE_TYPE_MP4:
u8FillDataType = CT_FILL_DATA_TYPE_MOVIE_MP4;
break;
default:
break;
}
if(CT_FillData_SetType(_pstMovieHandle->u32FillDataHandle, u8FillDataType) != DRV_OK)
{
DVB_FILECTRL_FileClose(_enDeviceType, _pstMovieHandle->u32FileHandle);
return EN_MOV_STATUS_DECODE_FAIL;
}
if (CT_FillData_Start(_pstMovieHandle->u32FillDataHandle, _pstMovieHandle->u32MovDataLen)!=DRV_OK)
{
CT_FillData_Stop(_pstMovieHandle->u32FillDataHandle);
DVB_FILECTRL_FileClose(_enDeviceType, _pstMovieHandle->u32FileHandle);
return EN_MOV_STATUS_DECODE_FAIL;
}
while (1)
{
switch (enMovieStage)
{
case EN_CT_MOVIE_PREPARE_INFO:
enMovieStage = CT_Movie_PrepareInfo(_enCurMovType);
break;
case EN_CT_MOVIE_START_PRESCAN:
enMovieStage = CT_Movie_StartPrescan(_enCurMovType);
break;
case EN_CT_MOVIE_POLLING_1ST_PRESCAN_DONE:
enMovieStage = CT_Movie_Polling1stPrescanDone(_enCurMovType);
CT_OS_Delay(10);
break;
case EN_CT_MOVIE_POLLING_SP_PARSING_DONE:
enMovieStage = CT_Movie_PollingSpParsingDone();
break;
case EN_CT_MOVIE_POLLING_IDXTBL_PRESCAN_DONE:
enMovieStage = CT_Movie_PollingIDXTBLPrescanDone(_enCurMovType);
CT_OS_Delay(10);
break;
case EN_CT_MOVIE_STAGE_PRESCAN_LAST_SCR:
enMovieStage = CT_Movie_PrescanLastScr(_enCurMovType);
break;
case EN_CT_MOVIE_POLLING_LAST_SCR_PRESCAN_DONE:
enMovieStage = CT_Movie_PollingLastScrPrescanDone(_enCurMovType);
CT_OS_Delay(10);
break;
case EN_CT_MOVIE_SET_PLAYMODE:
CT_MPG_ProcessIFrameDetectDisable();
CT_MPG_ProcessIPBFrameReadyDisable();
CT_MPG_ProcessAvSyncReadyDisable();
enMovieStage = CT_Movie_StageSetPlayMode(_enCurMovType);
#ifdef CT216T_ELGIST_MM
AV_SetVideoWeight(15);
#else
DVB_VideoScreenEnable (FALSE);
DVB_VideoScreenShow (FALSE);
DVB_VideoWeight(15);
DVB_VideoScreenShow (TRUE);
DVB_VideoScreenEnable (TRUE);
#endif
CT_MPG_ProcessIFrameDetectEnable();
CT_MPG_ProcessIPBFrameReadyEnable();
if (EN_CT_AUDIO_MODE_PCM != CT_MPG_AudioGetAudioMode())
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -