📄 digest.c
字号:
#define VIEWTIME 225L // The default starting point from Track// The file "winav.h" must be included in first line// LLY.045-1, porting for new define depending on 22QF055.DOC// all original include file will be put in "winav.h"#include "winav.h"#include "ctkav.h"// LLY.045-1 end ...#include "parser.h" #include "digest.h"#include "initial.h"//LJY1.20, support 4M flash, remove digest#ifndef NO_DIGEST#include "cc.h"#include "infofilter.h"#include "utl.h"#include "hal.h"#include "SrcFilter.h"#include "input.h"#include "chips.h"#include "osd.h"#include "linear.h"#include "osddg.h" #include "disp.h" #include "gdi.h"#include "jpegdec.h"DIGESTUI __DigestUIAttr;DWORD __dwIFrames; //the I Frame decteced number// wyc.100 dvd digestBYTE __bDVDDigest;DWORD _dwDigestTime; // the sector time to show in one trackextern DWORD __dwGoToTime;extern BYTE __bFrames;extern BIT __btDIGEST; // means Digest Modeextern DWORD __dwTimeDiscEnd; // The end of the disc timeBYTE _bDigestFirstPlay; // record the repeat time in one trackBIT __btDigestEnableAudio; // control Audio O/P when ] () // enter track mode// indicate the DIGEST mode will start from a CD-DA trackBIT __btCDDADigest;extern DWORD __dwTimeTorelence;WORD _aDigestFrmPosX[3];WORD _aDigestFrmPosY[2];#ifdef NO_PIP#define FRAME_THICKNESS 2JPU_OPZONE _Digest_Source;JPU_OPZONE _Digest_Destination;URECT _DIGEST_Rect;void _DIGEST_ShowFrame(BOOL bShow);void _DIGEST_EnterDisplayMode(PBYTE pbKeyNo);extern void _InitRect(PURECT pRect, WORD wLeft, WORD wTop, WORD wRight, WORD wBottom);#else // ifdef NO_PIPVOID _DigestFrameCopy(DWORD dwX, DWORD dwY){ DWORD dwHStep; DWORD dwVStep; DWORD dwCurrentFrame; DWORD dwSrcAddress; DWORD dwSrcWidth, dwSrcHeight; DWORD dwDigestFrameSize; HAL_ReadInfo(HAL_INFO_HSIZE, &dwSrcWidth); HAL_ReadInfo(HAL_INFO_VSIZE, &dwSrcHeight); if(MainVideoInfo.wVWidth == 480) { dwDigestFrameSize = DIGEST_FRAME_SIZE_V_480; } else { dwDigestFrameSize = DIGEST_FRAME_SIZE_V_576; } OS_LockMutex(&__mutexGDIIdle); //LJY0.75, prevent confliting with GDI when uses JPU. REG_JPU_CTRL = (((dwY & 0x0F)!=FALSE)<< 14) | (0 << 12) | (1 << 4) | (0 << 3); REG_JPU_HEIWID_SRC = (dwSrcWidth << 12) | dwSrcHeight; REG_JPU_HEIWID_DST = (DIGEST_FRAME_SIZE_H << 12) | dwDigestFrameSize; dwHStep = ((dwSrcWidth-1)*0x2000)/(DIGEST_FRAME_SIZE_H-1); dwVStep = ((dwSrcHeight-1)*0x2000)/(dwDigestFrameSize-1); REG_JPU_HVSC_FACTOR = (dwVStep << 16) | dwHStep; REG_JPU_STRIPE_RW = (((REG_DISP_PIP_STRIP>>24)*16) << 16) | ((REG_DISP_MAIN1_CR&0xFF)*32); // FORWARD_REFERENCE_FRAME or BACKWARD_REFERENCE_FRAME HAL_ReadInfo(HAL_INFO_PIPFRAME, &dwCurrentFrame); if (dwCurrentFrame == 1) { REG_JPU_ADDR_R_ST = FORWARD_REFERENCE_FRAME*8; } else { REG_JPU_ADDR_R_ST = BACKWARD_REFERENCE_FRAME*8; } dwSrcAddress = DS_FRAMEBUF_ST + (((dwY&0xFFF0)>>4)*((REG_DISP_MAIN1_CR&0xFF)*32))*8 + (dwX<<4); REG_JPU_ADDR_W_ST = ((dwY % 16)<< 27) | (dwSrcAddress&0x07FFFFFF); REG_JPU_CTRL |= JPU_GO; while (REG_JPU_CTRL & 1) { OS_YieldThread(); } REG_JPU_CTRL = (((dwY & 0x1F)!=FALSE)<< 14) | (0 << 12) | (1 << 4) | (1 << 3); REG_JPU_ADDR_R_ST += Y_MAXSIZE_CB00*8; dwSrcAddress = DS_FRAMEBUF_ST + Y_MAXSIZE_CB00*8 + (((dwY&0xFFE0)>>5)*((REG_DISP_MAIN2_CR&0xFF)*32))*8 + (dwX<<4); REG_JPU_ADDR_W_ST = (((dwY % 32)/2)<< 27) | (dwSrcAddress&0x07FFFFFF); REG_JPU_CTRL |= JPU_GO; while (REG_JPU_CTRL & 1) { OS_YieldThread(); } OS_UnlockMutex(&__mutexGDIIdle); //LJY0.75, prevent confliting with GDI when uses JPU. }#endif// *********************************************************************// Function : _DigestPlayInit// Description : Enter the DIGEST mode and reorcd the Page NO.// Arguments : None// Return :// Side Effect : when it's called, it will always enter digest mode// *********************************************************************void _DigestPlayInit (void){#ifndef NO_PIP WIN_COLOR PIPColor; #endif HAL_PlayCommand(COMMAND_STOP, 0); // wyc2.53-909P, SrcFilter_Stop(__dwSFStreamID); HAL_ControlParser(HAL_PARSER_STOP, 0); HAL_Reset(HAL_RESET_AUDIO);//Alan1.05 for nosound bug HAL_ControlParser(HAL_PARSER_AUDIO_ID, HAL_THROW_AUDIO); UTL_ModeInitial ( MODE_LINEAR ); //LJY0.68, disable frame 0 video output. // DISP_Display(0, DISP_MAINVIDEO); DISP_DisplayCtrl(DISP_MAINVIDEO, FALSE); DISP_ForceDisplay(0, DISP_MAINVIDEO); HAL_ClearScreen(HAL_COLOR_DIGEST, HAL_CLEAR_SCREEN_MPEG, HAL_DISP_CURRENTFRAME); DISP_MainVideoSet(&MainVideoInfo, MainVideoInfo.wHWidth, MainVideoInfo.wVWidth, 0);#ifdef NO_PIP _Digest_Source.wPosCoordH = 0; _Digest_Source.wPosCoordV = 0; _Digest_Destination.wWidth = DIGEST_FRAME_SIZE_H; if(MainVideoInfo.wVWidth == 480) { _Digest_Destination.wHeight = DIGEST_FRAME_SIZE_V_480; } else { _Digest_Destination.wHeight = DIGEST_FRAME_SIZE_V_576; } GDI_ChangePALEntry(DIGEST_ENTRY_COLOR_BRIGHT_FRAME, DIGEST_VALUE_COLOR_BRIGHT_FRAME, TRUE); GDI_ChangePALEntry(DIGEST_ENTRY_COLOR_DARK_FRAME, DIGEST_VALUE_COLOR_DARK_FRAME, TRUE); HAL_ClearScreen(HAL_COLOR_BLACK, HAL_CLEAR_SCREEN_MPEG, 0);#else //set PIP border PIPColor.Color.bWeight = 0x3f; PIPColor.Color.bY = 0x97; PIPColor.Color.bU = 0x28; PIPColor.Color.bV = 0xCB; DISP_BGColorSet(PIPColor, DISP_PIP_BORDER); DISP_PIPBorderSet(5, 5, TRUE); __DISPFrameInfo[0].bSrcFrame = 1;; __DISPFrameInfo[0].bDispFrame = 1; PIPVideoInfo.wHWidth = DIGEST_FRAME_SIZE_H; if(MainVideoInfo.wVWidth == 480) { PIPVideoInfo.wVWidth = DIGEST_FRAME_SIZE_V_480; } else { PIPVideoInfo.wVWidth = DIGEST_FRAME_SIZE_V_576; } PIPVideoInfo.bEnable = TRUE;#endif // #ifdef NO_PIP __bModePlay= MODE_PLAYUNKNOW;#ifndef NO_CDDADIGEST if (__wDiscType & BOOK_CDDA) __btCDDADigest=TRUE;#endif UTL_SetPlayMode ( MODE_PLAYMOTION ); // Restore normal audio
/* --CoCo2.33?
if (__btMute) { OSD_OUTPUT_MACRO ( MSG_MUTE, FALSE, 1 );
}
*/
__btMute= FALSE; // digest default not mute// f/w 0.45, cancel 3D in DIGEST mode if (__bModeChannel==AUDIO_3D) { __bModeChannel=AUDIO_STEREO; OSD_OUTPUT_MACRO(MSG_AUDIO, __bModeChannel, 1); }//Alan1.05 for nosound bug CHIPS_OpenAudio( FALSE ); // First time setting _bDigestFirstPlay = TRUE; // must put after DigestInitial// HAL_AdjustTVMode(DISP_NEXTVSYNC); __btPlaying= FALSE; __btPause= FALSE; __bModeCmd= KEY_STOP; _DigestFrmPosInit(); //LJY0.68, enable frame 0 video output. DISP_DisplayCtrl(DISP_MAINVIDEO, TRUE); PARSER_ActionFilter( 0, PARSER_ENABLE_SP1, FALSE ); CHIPS_OpenAudio( TRUE );} void DIGEST_Trigger(void){ if(__DigestUIAttr.bDigestMode <= DIGEST_MODE_DIALOG) return; _DIGEST_DisplayFrame();}void _DIGEST_DisplayFrame (void){ static DWORD dwDigestPlayTime; DWORD dwTmp1, dwTmp2;#ifdef NO_PIP DWORD dwDecFrame; DWORD dwSrcAddress = 0; DWORD dwDesAddress;#endif if(_bDigestFirstPlay) { if(__DigestUIAttr.bDigestMode == DIGEST_MODE_TRACK) { if (__DigestUIAttr.bCurTrackNo >= (__wTrackEnd - __wTrackBegin + 1)) __DigestUIAttr.bCurFrameNo = 0; if(__DigestUIAttr.bCurFrameNo == 0) { __DigestUIAttr.bCurTrackNo = (__DigestUIAttr.bCurPageNo)*(DIGEST_FRAME_COUNT); } __wPlayItem = __DigestUIAttr.bCurTrackNo + __wTrackBegin; } else { if((_dwDigestTime + DIGEST_DISCVIEW_TIMEINTERVAL) < __dwTimeDiscEnd) { _dwDigestTime = __dwTimeDiscBegin + (__DigestUIAttr.bCurPageNo*(DIGEST_FRAME_COUNT) + __DigestUIAttr.bCurFrameNo)*(DIGEST_DISCVIEW_TIMEINTERVAL); } else { __DigestUIAttr.bCurFrameNo = 0; __DigestUIAttr.bCurTrackNo = 0; } } OSDDG_Update(OSDDG_MSG_UPDATE_UI_INFO); UTL_GetPlayRange ( __wPlayItem ); UTL_SetPlayItemMode ( __wPlayItem ); if(__DigestUIAttr.bDigestMode == DIGEST_MODE_DISCINTERVAL) { _dwDigestTime = __dwTimeDiscBegin + (__DigestUIAttr.bCurPageNo*(DIGEST_FRAME_COUNT) + __DigestUIAttr.bCurFrameNo)*(DIGEST_DISCVIEW_TIMEINTERVAL); } else if(__DigestUIAttr.bDigestMode == DIGEST_MODE_TRACK) { _dwDigestTime = __dwTimeBegin; // for track view } __dwTimeEnd = _dwDigestTime + 750; HAL_ReadInfo(HAL_INFO_HSIZE, &dwTmp1); HAL_ReadInfo(HAL_INFO_VSIZE, &dwTmp2);#ifdef NO_PIP _DIGEST_ShowFrame(FALSE); _Digest_Source.wWidth = dwTmp1; _Digest_Source.wHeight = dwTmp2; _Digest_Source.wFrameStripe = _Digest_Source.wWidth;/* _Digest_Destination.wPosCoordH = 0; _Digest_Destination.wPosCoordV = 0;*/ _Digest_Destination.wPosCoordH = _aDigestFrmPosX[(__DigestUIAttr.bCurFrameNo%DIGEST_FRAME_COUNT_PER_ROW)]; _Digest_Destination.wPosCoordV = _aDigestFrmPosY[(__DigestUIAttr.bCurFrameNo/DIGEST_FRAME_COUNT_PER_ROW)];/* _Digest_Destination.wWidth = DIGEST_FRAME_SIZE_H; _Digest_Destination.wHeight = DIGEST_FRAME_SIZE_V_576;*/ _Digest_Destination.wFrameStripe = 720;/* _Digest_Destination.wWidth = dwTmp1; _Digest_Destination.wHeight = dwTmp2; _Digest_Destination.wFrameStripe = 720;*/ _DIGEST_ShowFrame(TRUE);#else PIPVideoInfo.sHStart = _aDigestFrmPosX[(__DigestUIAttr.bCurFrameNo%DIGEST_FRAME_COUNT_PER_ROW)]; PIPVideoInfo.sVStart = _aDigestFrmPosY[(__DigestUIAttr.bCurFrameNo/DIGEST_FRAME_COUNT_PER_ROW)]; DISP_PIPSet(&PIPVideoInfo, dwTmp1, dwTmp2, DISP_NEXTVSYNC);#endif // #ifdef NO_PIP HAL_PlayCommand(COMMAND_DIGEST, 0); // LLY2.35, give start and end time for UTL_PlayFromTime() since the API is updated UTL_PlayFromTime ( _dwDigestTime, __dwTimeEnd ); _bDigestFirstPlay = FALSE; dwDigestPlayTime = OS_GetSysTimer(); } else { if((OS_GetSysTimer() - dwDigestPlayTime) > COUNT_5_SEC) { //HAL_PlayCommand(COMMAND_STOP, 0); SrcFilter_Stop(__dwSFStreamID); HAL_ControlParser(HAL_PARSER_STOP, 0); HAL_Reset(HAL_RESET_AUDIO);//Alan1.05 for nosound bug HAL_ControlParser(HAL_PARSER_AUDIO_ID, HAL_THROW_AUDIO); // Scale down and Copy the PIP data to Frame 0.#ifndef NO_PIP _DigestFrameCopy(PIPVideoInfo.sHStart, PIPVideoInfo.sVStart);#endif // #ifdef NO_PIP _bDigestFirstPlay = TRUE; if(__DigestUIAttr.bDisplayedFrameNo< DIGEST_FRAME_COUNT) { __DigestUIAttr.bDisplayedFrameNo++; } __DigestUIAttr.bCurFrameNo = (++__DigestUIAttr.bCurFrameNo) % (DIGEST_FRAME_COUNT); __DigestUIAttr.bCurTrackNo++;#ifdef NO_PIP#else DISP_DisplayCtrl(DISP_PIP, FALSE);#endif // #ifdef NO_PIP HAL_Reset(HAL_RESET_VIDEO); }#ifdef NO_PIP HAL_ReadInfo(HAL_INFO_DECCMD_ACK, &__dwTemp); if (MODE_SCAN_DONE != __dwTemp) return; if (FALSE == HAL_ReadInfo(HAL_INFO_DECFRAME, &dwDecFrame)) return; MACRO_RESET_JPU(); // Scale Y if (1 == dwDecFrame) { dwSrcAddress = DS_FRAMEBUF1_ADDR_ST; } else if (2 == dwDecFrame) { dwSrcAddress = DS_FRAMEBUF2_ADDR_ST; } dwDesAddress = DS_FRAMEBUF0_ADDR_ST + _JPUUTIL_GetDispFrameOffset_SCFR(((PJPU_OPZONE)&_Digest_Destination), BLOCK_Y, 0); _JPUUTIL_Scale(dwSrcAddress, dwDesAddress, ((PJPU_OPZONE)&_Digest_Source), ((PJPU_OPZONE)&_Digest_Destination), BLOCK_Y); // Scale U dwSrcAddress += 720 * 576; dwDesAddress = DS_FRAMEBUF0_ADDR_ST + 720 * 576 + _JPUUTIL_GetDispFrameOffset_SCFR(((PJPU_OPZONE)&_Digest_Destination), BLOCK_UV, 0); _JPUUTIL_Scale(dwSrcAddress, dwDesAddress, ((PJPU_OPZONE)&_Digest_Source), ((PJPU_OPZONE)&_Digest_Destination), BLOCK_UV); // Scale V dwSrcAddress += 128; dwDesAddress += 128; _JPUUTIL_Scale(dwSrcAddress, dwDesAddress, ((PJPU_OPZONE)&_Digest_Source), ((PJPU_OPZONE)&_Digest_Destination), BLOCK_UV); HAL_PlayCommand(COMMAND_DIGEST, 0);#endif // LJY0.76, let it resume from current playback time when digest->NPF. // LLY2.05, call API to get current decoded time __dwResumeTime = UTL_GetDecodedTime(); }}// *********************************************************************// Function : DIGEST_Digest2Linear// Description : Exit the DIGEST mode, and enter linear playing mode// Return : NONE// Side Effect :// *********************************************************************void DIGEST_Digest2Linear(void){ CC_KeyCommand(KEY_STOP); if(__DigestUIAttr.bDigestMode == DIGEST_MODE_DISCINTERVAL) { __dwGoToTime = __dwTimeDiscBegin + (__DigestUIAttr.bCurPageNo*(DIGEST_FRAME_COUNT) + __DigestUIAttr.bCurFrameNo)*(DIGEST_FRAME_PLAYTIME); __dwTemp = __dwGoToTime; // Get track number for this entry point
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -