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

📄 dvb_movie.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************************************

        (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 + -