📄 thumb.c
字号:
#define THUMB_MAIN_FILE
#include "winav.h"
#include <string.h>
#include "input.h"
#include "hal.h"
#include "setup.h"
#include "servo.h"
#include "utl.h"
#include "FManager.h"
#include "cc.h"
#include "linear.h"
#include "gdi.h"
#include "OSDFM.h"
#include "thumb.h"
#include "cdinfo.h"
#include "osdvp.h"
#include "String.lan"
#ifdef SUPPORT_FM_BUTTONS
#define MAX_THUB_BTN_NO 6
CTL_BUTTON __ThumbCtlBTNList[MAX_THUB_BTN_NO];
//constant definition
BYTE code _bThumbnailTotalNum[] = {TOTAL_NUM_IN_PAGE, TOTAL_NUM_IN_PAGE, TOTAL_NUM_IN_PAGE, PROGRAM_LIST_TOTAL_NUM_IN_PAGE};
BYTE code aThumbButtonShape[] = {BUTTON_ID_40x40, BUTTON_ID_40x40, BUTTON_ID_40x40, BUTTON_ID_120x40, BUTTON_ID_120x40, BUTTON_ID_120x40, BUTTON_ID_120x40, BUTTON_ID_120x40, BUTTON_ID_120x40, BUTTON_ID_120x40};
BYTE code aThumbButtonGeneralMode[]= // Control button list for normal mode
{
THUMBNAIL_BUTTON_PREVIOUS, THUMBNAIL_BUTTON_NEXT, THUMBNAIL_BUTTON_PLAY, THUMBNAIL_BUTTON_ROTATE,
#ifdef SUPPORT_FM_PROGRAM
THUMBNAIL_BUTTON_PROGRAM,
#endif
THUMBNAIL_BUTTON_FILEMGR
};
BYTE code aThumbButtonRotateMode[] = {THUMBNAIL_BUTTON_PREVIOUS, THUMBNAIL_BUTTON_NEXT, THUMBNAIL_BUTTON_PLAY, THUMBNAIL_BUTTON_RETURN, THUMBNAIL_BUTTON_RESET, THUMBNAIL_BUTTON_FILEMGR};
BYTE code aThumbButtonProgramMode[] = {
THUMBNAIL_BUTTON_PREVIOUS, THUMBNAIL_BUTTON_NEXT, THUMBNAIL_BUTTON_PLAY, THUMBNAIL_BUTTON_RETURN,
#ifdef SUPPORT_FM_PROGRAM_LIST
THUMBNAIL_BUTTON_PROGRAM_LIST,
#endif
THUMBNAIL_BUTTON_FILEMGR
};
BYTE code aThumbButtonProgramListMode[] = {THUMBNAIL_BUTTON_PREVIOUS, THUMBNAIL_BUTTON_NEXT, THUMBNAIL_BUTTON_PLAY, THUMBNAIL_BUTTON_CLEAR_ALL, THUMBNAIL_BUTTON_RETURN};
BYTE* code aThumbButtonID[] = {aThumbButtonGeneralMode, aThumbButtonRotateMode, aThumbButtonProgramMode, aThumbButtonProgramListMode};
//***************************************************************************
//Note: Don't translate the following strings.
//display the extention of the file in the program list if it is not a JPEG.
WORD code aThumbButtonPreviousName[] = {1, CHAR_PREV_26};
WORD code aThumbButtonNextName[] = {1, CHAR_NEXT_26};
WORD code aThumbButtonPlayName[] = {1, CHAR_N_PLAY_26};
WORD code aThumbMP3[] = {3, CHAR_M, CHAR_P, CHAR_3};
WORD code aThumbAC3[] = {3, CHAR_A, CHAR_C, CHAR_3};
WORD code aThumbWMA[] = {3, CHAR_W, CHAR_M, CHAR_A};
WORD code aThumbDAT[] = {3, CHAR_D, CHAR_A, CHAR_T};
WORD code aThumbVOB[] = {3, CHAR_V, CHAR_O, CHAR_B};
WORD code aThumbMPG[] = {3, CHAR_M, CHAR_P, CHAR_G};
//***************************************************************************
#endif //SUPPORT_FM_BUTTONS
//delcare global variables
BYTE __bThumbnailMode;
WORD _wThumbnailIndex; //current index that user want to play
WORD _wThumbnailPlayIndex;
BYTE _bStop;
BYTE _bTHUMBNAILTemp;
WORD _wTHUMBNAILTemp;
BYTE _bTHUMBNAILStage;
BYTE _bRetryTimes;
BYTE _bCheckHangTimes;
WORD _wThumbTotalFiles;
WORD _wThumbStartPlayItem; //Use it to record the first JPEG in this folder.
//CoCo280-2, for CT908 JPEG
WORD _wHPos;
#ifdef SUPPORT_FM_BUTTONS
BYTE _bCursorType;
BYTE _bButtonIndex;
BYTE _bThumbnailSubMode;
BYTE _bThumbnailDecodeMode;
BYTE _bProgramPageNo;
#endif //SUPPORT_FM_BUTTONS
BYTE _bTuneThumbFrame_H;
BYTE _bTuneThumbFrame_V;
//LJY1.20, declare __bPageNo here instead of digest.c(support 4M flash, remove digest)
BYTE __bPageNO;
extern BYTE __bZoomFactor;
extern BYTE __bPageNO;
extern BYTE DATA _bOSDLang;
//OSD global variables
extern BYTE __bOSDFg;
extern BYTE __bOSDBg;
extern WORD __wOSDUpVPos;
extern WORD __wOSDUpHPos;
extern WORD __wOSDBottomVPos;
extern WORD __wOSDBottomHPos;
extern BYTE _bCurrentUI;
extern WORD _wHALTemp, _wHALTemp1;
extern BYTE __bDumpPage;
extern PFILE_RECORD __pFMFileRecord; //CoCo1.25, New structure of File Manager
//***************************************************************************
// Function : _THUMBNAIL_Initial
// Abstract : This function will initialize all global variables.
// Arguments : none.
// Return : none.
// Side Effect : none.
// Notes :
//***************************************************************************
void _THUMBNAIL_Initial(void)
{
#ifndef NO_PICTURECD
__bThumbnailMode = TRUE;
#ifdef SUPPORT_JPEG_3_FRAMES
if (!__bDVDROM)
GDI_SetFonTableAddr(FONT_TABLE_JPEG);
#endif
//calculate the number of JPEG files.
_THUMBNAIL_GetTotalFiles();
//_wThumbnailIndex = __wPlayItem - 1;
_wThumbnailIndex = __wPlayItem - 1 - _wThumbStartPlayItem; //CoCo1.25, Fix the bug about Thumbnail's highlight is incorrect when mix title.
__bPageNO = _wThumbnailIndex / TOTAL_NUM_IN_PAGE;
_wThumbnailPlayIndex = __bPageNO * TOTAL_NUM_IN_PAGE;
__bZoomFactor = VIEW_NORMAL;
__bFMStage=STAGE_IDLE;
_bRetryTimes = THUMBNAIL_REDECODE_TIMES;
_bCheckHangTimes = 0;
_THUMBNAIL_InitialStage();
//Set the width and height for displaying rectangle.
__wWidth = THUMBNAIL_DISPLAY_WIDTH;
__wHeight = THUMBNAIL_DISPLAY_HEIGHT_NTSC;
#ifdef SUPPORT_FM_BUTTONS
if (__btProgram)
_bThumbnailSubMode = THUMBNAIL_SUBMODE_PROGRAM; //Enter "Program" mode directly
else
_bThumbnailSubMode = THUMBNAIL_SUBMODE_GENERAL; //Enter "General" mode
_bThumbnailDecodeMode = THUMBNAIL_DECODE_PAGE;
#endif //SUPPORT_FM_BUTTONS
_THUMBNAIL_InitializeGDI();
//Set the color of the background, color of the text, and vertical starting position for upper right message.
__bOSDBg = PAL_ENTRY_COLOR_TRANSPARENT;
__bOSDFg = THUMBNAIL_PALETTE_ENTRY_TITLE_STRING;
__wOSDUpVPos = THUMBNAIL_DISPLAY_PAGE_START_V-_THUMBNAIL_TuneForTVType(THUMBNAIL_TUNE_POS_TYPE_TITLE);
__wOSDUpHPos = THUMBNAIL_DISPLAY_PAGE_END_H;
__wOSDBottomVPos = THUMBNAIL_DISPLAY_HELP_START_V-_THUMBNAIL_TuneForTVType(THUMBNAIL_TUNE_POS_TYPE_HELP);
__wOSDBottomHPos = THUMBNAIL_DISPLAY_HELP_START_H;
__bJPEGEffect = HAL_JPEG_EFFECT_NO_EFFECT;
__bDoJPEGEffect = FALSE;
// Brian1.10, set variables of frame position
_THUMBNAIL_TuneFramePosition();
#endif
}
//***************************************************************************
// Function : THUMBNAIL_Trigger
// Abstract : Call this function in main loop.
// Arguments : none.
// Return : none.
// Side Effect : none.
// Notes :
//***************************************************************************
void THUMBNAIL_Trigger(void)
{
#ifndef NO_PICTURECD
if (__bThumbnailMode)
{
#ifdef SUPPORT_SIMPLE_FM_PROGRAM
//Don't decoding because the frame will influence the Program UI.
if (__btInputProgram)
return;
#endif //SUPPORT_SIMPLE_FM_PROGRAM
if (_bStop || __btPause)
{
__btPlaying = FALSE;
return;
}
switch (_bTHUMBNAILStage)
{
case THUMBNAIL_STAGE_START:
_bRetryTimes = THUMBNAIL_REDECODE_TIMES;
#ifdef SUPPORT_FM_BUTTONS
if (_bThumbnailDecodeMode == THUMBNAIL_DECODE_ONE) //decode only one thumbnail
{
_THUMBNAIL_Start();
}
else
#endif //SUPPORT_FM_BUTTONS
{
if (!_THUMBNAIL_CheckPlayEnd())
_THUMBNAIL_Start();
else //All thumbnails has been decoded. Stop!
{
_bStop = TRUE;
_THUMBNAIL_UpdateHighlight(THUMBNAIL_UPDATE_HIGHLIGHT_DRAW);
}
}
break;
case THUMBNAIL_STAGE_PARSEHEADER:
if ((__dwCountSystem - dwPreTime) < THUMBNAIL_MAX_PARSEHEADER_TIME)
{
_bTHUMBNAILTemp = HAL_QueryStatus(HAL_JPEG_PARSE_HEADER);
if (_bTHUMBNAILTemp == HAL_QUERY_RESULT_OK)
{
#ifdef SUPPORT_FM_BUTTONS
_THUMBNAIL_GetPosition((BYTE)(_wThumbnailPlayIndex % _bThumbnailTotalNum[_bThumbnailSubMode]));
#else
_THUMBNAIL_GetPosition((BYTE)(_wThumbnailPlayIndex % TOTAL_NUM_IN_PAGE));
#endif //SUPPORT_FM_BUTTONS
HAL_JPEGDecode(HAL_JPEG_DECODE);
_bTHUMBNAILStage = THUMBNAIL_STAGE_DECODE;
dwPreTime = __dwCountSystem;
}
else if (_bTHUMBNAILTemp == HAL_QUERY_RESULT_UNSUPPORT)
{
_bRetryTimes = 0;
_THUMBNAIL_ProcessError();
return;
}
else if (_bTHUMBNAILTemp == HAL_QUERY_RESULT_FAIL) //CoCo0.90a, judge the "fail" case.
{
_THUMBNAIL_ProcessError();
return;
}
else //unfinish
{
_THUMBNAIL_PlayEnd();
return;
}
}
else
{
_THUMBNAIL_ProcessError();
return;
}
#ifdef SUPPORT_FM_BUTTONS
_THUMBNAIL_GetPosition((BYTE)(_wThumbnailPlayIndex % _bThumbnailTotalNum[_bThumbnailSubMode]));
#else
_THUMBNAIL_GetPosition((BYTE)(_wThumbnailPlayIndex % TOTAL_NUM_IN_PAGE));
#endif
_bTHUMBNAILStage = THUMBNAIL_STAGE_DECODE;
break;
case THUMBNAIL_STAGE_DECODE:
if ((__dwCountSystem - dwPreTime) < THUMBNAIL_MAX_DECODE_TIME)
{
_bTHUMBNAILTemp = HAL_QueryStatus(HAL_JPEG_DECODE_STATUS);
if (_bTHUMBNAILTemp == HAL_QUERY_RESULT_OK)
{
HAL_ControlCDIF(HAL_CDIF_CLOSE);
__btPlayEnd=TRUE; //data input end, but not playing end
HAL_Display(HAL_DISPLAY_JPEG, HAL_JPEG_DECODE);
#ifdef SUPPORT_FM_BUTTONS
if (_bThumbnailDecodeMode == THUMBNAIL_DECODE_PAGE)
{
if (_bThumbnailSubMode == THUMBNAIL_SUBMODE_PROGRAM)
{
if (LINEAR_ProgramEntryOperation(LINEAR_QUERY_INDEX, 0, __bFMActiveDir, (WORD)(_wThumbStartPlayItem+_wThumbnailPlayIndex+1)) == 0xFF) //not found
_THUMBNAIL_DrawThumbnailFrame((BYTE)(_wThumbnailPlayIndex%_bThumbnailTotalNum[_bThumbnailSubMode]), THUMBNAIL_FRAME_NORMAL);
else
_THUMBNAIL_DrawThumbnailFrame((BYTE)(_wThumbnailPlayIndex%_bThumbnailTotalNum[_bThumbnailSubMode]), THUMBNAIL_FRAME_SELECT);
}
else
_THUMBNAIL_DrawThumbnailFrame((BYTE)(_wThumbnailPlayIndex%_bThumbnailTotalNum[_bThumbnailSubMode]), THUMBNAIL_FRAME_NORMAL);
#else
_THUMBNAIL_DrawThumbnailFrame((BYTE)(_wThumbnailPlayIndex%TOTAL_NUM_IN_PAGE), THUMBNAIL_FRAME_NORMAL);
#endif //SUPPORT_FM_BUTTONS
_THUMBNAIL_ChangeToNextPic();
#ifdef SUPPORT_FM_BUTTONS
}
else if (_bThumbnailDecodeMode == THUMBNAIL_DECODE_UNDETERMINED)
{
//Search next picture to be decoded.
_wThumbnailPlayIndex++;
if (!_THUMBNAIL_SearchNextValidPic())
_bStop = TRUE;
}
else //decode only one thumbnail
{
_bStop = TRUE;
_bThumbnailDecodeMode = THUMBNAIL_DECODE_PAGE;
}
#endif //SUPPORT_FM_BUTTONS
}
else if (_bTHUMBNAILTemp == HAL_QUERY_RESULT_FAIL)
_THUMBNAIL_ProcessError();
else //unfinish
{
W99AV_ReadDRAMData(W99AV_DRAM_JPEG_CHECK_HANG, &__dwTemp);
if (HIWORD(__dwTemp) == __wCheckDecodeHang)
{
_bCheckHangTimes++;
UTL_DelayTime(COUNT_50_MSEC, FALSE);
if (_bCheckHangTimes == THUMBNAIL_CHECK_HANG_TIMES)
{
_THUMBNAIL_ProcessError();
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -