📄 char_subpict.c
字号:
{ CHAR_SP_ClearRegion(); }#endif if (__bTVType == SETUP_SCREEN_TV_SYSTEM_NTSC || __bTVType == SETUP_SCREEN_TV_SYSTEM_PAL_M) { _CHAR_SP_RectAttr.rect.wBottom = CHAR_SP_REG_BOTTOM; _CHAR_SP_RectAttr.rect.wTop = CHAR_SP_REG_TOP; } else {#ifndef EX_SP_POS_INDEPEND_OSDND _CHAR_SP_RectAttr.rect.wBottom = __OSDNDBottomMsgAttr.wY;#else _CHAR_SP_RectAttr.rect.wBottom = CHAR_SP_REG_BOTTOM_PAL; #endif _CHAR_SP_RectAttr.rect.wTop = CHAR_SP_REG_TOP_PAL; }}void CHAR_SP_SetOutputBuffer(DWORD dwBufferAddress, DWORD dwBufferSize){ _Char_SP_OutputInfo.dwAddr = dwBufferAddress; _Char_SP_OutputInfo.dwLen = dwBufferSize;}void CHAR_SP_ParseSPFile(void){ DWORD dwFileBytes; BYTE bSecNum; BYTE bFileType; if (!MM_GetSRTRecord(&_dwSPStartSector, &dwFileBytes, &bFileType)) { CHAR_SP_Initial(); CHAR_SP_Reset(); return; } switch (bFileType) {#ifdef PARSER_SPTXT_SRT case MP4SP_EXT_SRT: _dwSPType = PARSER_SPTXT_SRT; break;#endif#ifdef PARSER_SPTXT_SSA case MP4SP_EXT_SSA: case MP4SP_EXT_ASS: _dwSPType = PARSER_SPTXT_SSA; break;#endif#ifdef PARSER_SPTXT_SUB case MP4SP_EXT_SUB: _dwSPType = PARSER_SPTXT_SUB; break;#endif#ifdef PARSER_SPTXT_SMI case MP4SP_EXT_SMI: _dwSPType = PARSER_SPTXT_SMI; break;#endif#ifdef PARSER_SPTXT_PSB case MP4SP_EXT_PSB: _dwSPType = PARSER_SPTXT_PSB; break;#endif default: return; }/*** Alan2.36, the output buffer will be set in CHAR_SP_SetOutputBuffer().#ifdef EX_SP_SHARE_WITH_FIRMWARE_BUFFER // wyc2.21-909S, run time to update the SP output address and length by MM FW buffer usage. _Char_SP_OutputInfo.dwAddr = __dwMMSPBuffST; _Char_SP_OutputInfo.dwLen = __dwMMSPBuffSize;#else _Char_SP_OutputInfo.dwAddr = CHAR_SP_BUFFER; _Char_SP_OutputInfo.dwLen = CHAR_SP_BUFFER_SIZE;#endif*/ _Char_SP_InputInfo.dwAddr = (DWORD) NULL; _Char_SP_InputInfo.dwLen = dwFileBytes; bSecNum = (BYTE)((_Char_SP_InputInfo.dwLen + (IF_DUMP_IN_SECTOR_SIZE- 1)) / IF_DUMP_IN_SECTOR_SIZE); _dwSPEndSector = _dwSPStartSector + bSecNum - 1; SrcFilter_Stop(__dwSFStreamID); SrcFilter_ReadSectors(__dwSFStreamID, _dwSPStartSector, _dwSPEndSector); PARSER_SPTXT_initial(); __dwParResult_CharSP = PARSER_SPTXT(&_Char_SP_InputInfo, &_Char_SP_OutputInfo, 0, _dwSPType); if (PARSER_SPTXT_SUCCESS == __dwParResult_CharSP || PARSER_SPTXT_BUFFER_OVERFLOW == __dwParResult_CharSP) { _pSP_HeaderPt = (PPARSER_SPTXT_HEADER)_Char_SP_OutputInfo.dwAddr;#ifdef SUPPORT_MP4 // LLY1.50, specify different bitstream format base on file type if(MM_GetFileType(__MMPlayingItem.wDirID, __wPlayItem)==EXTNAME_MP4) { PARSER_SetDataFmt(0, PARSER_DATAFMT_NOCHANGE, PARSER_BSFMT_MP4); } else#endif // #ifdef SUPPORT_MP4 { PARSER_SetDataFmt(0, PARSER_DATAFMT_NOCHANGE, PARSER_BSFMT_AVI); } // LLY1.20, check if support char base subpicture // if yes, increase Ns by one, assign SPSTNO as 0 (1st SPST ID) // And, insert this SPST into parser SPST arrary if( PARSER_AddExtTextSP(0) ) { __bSPSTNs += 1; __bSPSTNO = 0; __bSPSTID=__bSPSTNO; }#ifdef EX_SP_USE_SPU_BUFFER _CHAR_SP_InitSPU(); #endif } else { _pSP_HeaderPt = NULL; }}void CHAR_SP_Trigger(void){ // Prevent to show subtitle in Setup Mode if (!__btPlaying) { CHAR_SP_ClearRegion(); return; } if (FALSE == (__SPUCtrl.bEnable & SPCTRL_REALPTS) || 0 == (__SPUCtrl.bEnable & SPCTRL_SP1)) { CHAR_SP_ClearRegion();//Alan1.20, reomve this code// return; } if (PARSER_ESFMT_TEXT_SP_EXT == __SP1.ESFormat) { if (!_CHAR_SP_CheckPTS_ExSP()) return; } #ifdef SUPPORT_UTF8 else if (PARSER_ESFMT_TEXT_SP == __SP1.ESFormat) { if (!_CHAR_SP_CheckPTS_MP4()) return; }#endif else { return; } // if (FALSE == (__SPUCtrl.bEnable & SPCTRL_SP1)) return;//Alan1.20, update the above code if (FALSE == (__SPUCtrl.bEnable & SPCTRL_REALPTS) || 0 == (__SPUCtrl.bEnable & SPCTRL_SP1)) return;#ifndef EX_SP_USE_SPU_BUFFER if (FALSE == __bOSDDynamicRegion) { OSD_NewDynamicRegion(_CHAR_SP_RecoverFunc); } if (OSD_CanUpdateDynamicRegionInfo() == FALSE) return;#endif if (_blAlreadyDisplay) return; _CHAR_SP_DrawStrings();}BOOL _CHAR_SP_CheckPTS_ExSP(void){ if ( ! (PARSER_SPTXT_SUCCESS == __dwParResult_CharSP || PARSER_SPTXT_BUFFER_OVERFLOW == __dwParResult_CharSP) ) return FALSE; if (PARSER_SPTXT_END == _pSP_HeaderPt->dwStart) { CHAR_SP_ClearRegion(); _CHAR_SP_LoadSP(); return FALSE; } HAL_ReadInfo(HAL_INFO_STC_UPDATED, &__dwTemp); if (FALSE == __dwTemp) return FALSE; HAL_ReadInfo(HAL_INFO_STC, &__dwTemp); if (__dwTemp < _pSP_HeaderPt->dwStart) // PTS < start time return FALSE; if (__dwTemp > _pSP_HeaderPt->dwEnd) // PTS > end time { CHAR_SP_ClearRegion(); _pSP_HeaderPt = (PPARSER_SPTXT_HEADER) ((PBYTE)_pSP_HeaderPt + (((_pSP_HeaderPt->bLen + PARSER_SPTXT_HEADER_SIZE + 3) >> 2) << 2)); _blAlreadyDisplay = FALSE; return FALSE; } if (PARSER_SPTXT_END == _pSP_HeaderPt->dwStart) { return FALSE; } return TRUE;}#ifdef SUPPORT_UTF8 BOOL _CHAR_SP_CheckPTS_MP4(){ // Check whether it is the end of all the subtitle if ( __SP1.dwRead_Counter == __SP1.dwWrite_Counter) return FALSE; _pSP_HeaderPt = (PPARSER_SPTXT_HEADER)__SP1.dwReadPtr; // Check SP ID if (__bSPSTID != _pSP_HeaderPt->bID) return FALSE; HAL_ReadInfo(HAL_INFO_STC, &__dwTemp); if (__dwTemp < _pSP_HeaderPt->dwStart) // PTS < start time return FALSE; if (__dwTemp > _pSP_HeaderPt->dwEnd) // PTS > end time { CHAR_SP_ClearRegion(); __SP1.dwReadPtr = __SP1.dwSPU_NextAddress[__SP1.dwRead_Counter & SPU_MASK]; __SP1.dwRead_Counter++; return FALSE; } return TRUE;}#endifvoid _CHAR_SP_DrawStrings(void){ BYTE bLineIndex; if (PARSER_ESFMT_TEXT_SP_EXT == __SP1.ESFormat) { switch (__bEnCodeType) { #ifdef SUPPORT_UNICODE_CODING case CHAR_ENCODE_UNICODE: _Convert_UTF8_To_Unicode(); break;#ifdef SUPPORT_CHAR_ENCODING_BIG5 case CHAR_ENCODE_OTHER: _Convert_Big5_To_Unicode(); break;#endif#ifdef SUPPORT_CHAR_ENCODING_SHIFT_JIS case CHAR_ENCODE_OTHER: _Convert_Shift_JIS_To_Unicode(); break;#endif#endif case CHAR_ENCODE_ISO_CP: default: _Convert_Locale_To_CTK_Strings();#ifdef ISO_8859_8_FONT//#ifdef SUPPORT_CHAR_ENCODING_SWITCH // Damon2.56, Hebrew language need to change word direction if (__SetupInfo.bExSPSTLanguage == SETUP_LANGUAGE_ENCODING_HEBREW)//#endif { _Change_Word_Direction(); }#endif break; } }#ifdef SUPPORT_UTF8 else if (PARSER_ESFMT_TEXT_SP == __SP1.ESFormat) { _Convert_UTF8_To_CTK_Strings(); }#endif bLineIndex = _SP_Autowrap();#ifdef EX_SP_USE_SPU_BUFFER // Use the SP buffer SPU_BMP_SetDisplay(0, FALSE); SPU_BMP_SetDisplayArea(0, 51, CHAR_SP_REG_TOP, __RegionList[GDI_SP_REGION_ID].wWidth, __RegionList[GDI_SP_REGION_ID].wHeight, (const BYTE*)__RegionList[GDI_SP_REGION_ID].dwTAddr); if (__bTVType == SETUP_SCREEN_TV_SYSTEM_NTSC || __bTVType == SETUP_SCREEN_TV_SYSTEM_PAL_M) { _CHAR_SP_StrAttr.wY = (CHAR_SP_MAX_LINE_NUM - bLineIndex) * CHAR_SP_LINE_HEIGHT; } else { _CHAR_SP_StrAttr.wY = (CHAR_SP_MAX_LINE_NUM - bLineIndex) * CHAR_SP_LINE_HEIGHT; }#else // #ifdef EX_SP_USE_SPU_BUFFER // Use the OSD buffer if (__bTVType == SETUP_SCREEN_TV_SYSTEM_NTSC || __bTVType == SETUP_SCREEN_TV_SYSTEM_PAL_M) { _CHAR_SP_StrAttr.wY = CHAR_SP_REG_BOTTOM - (bLineIndex * CHAR_SP_LINE_HEIGHT); } else {#ifndef EX_SP_POS_INDEPEND_OSDND _CHAR_SP_StrAttr.wY = __OSDNDBottomMsgAttr.wY - (bLineIndex * CHAR_SP_LINE_HEIGHT);#else _CHAR_SP_StrAttr.wY = CHAR_SP_REG_BOTTOM_PAL - (bLineIndex * CHAR_SP_LINE_HEIGHT);#endif }#endif bLineIndex = 0;//#ifndef SUPPORT_UNICODE_CODING //GDI_SetFontHeightInTable(_bSPFontHeight); //#endif/*#if (FONT_TABLE_METHOD == CREATE_DYNAMICALLY) _CHAR_SP_UseExSPFontTable(TRUE);#endif */ while (_aLinePtr[bLineIndex] && bLineIndex < CHAR_SP_MAX_LINE_NUM) { if (__bEnCodeType == CHAR_ENCODE_ISO_CP) { __dwTemp = GDI_GetStringWidth_909(_aLinePtr[bLineIndex]); }#ifdef SUPPORT_UNICODE_CODING else // CHAR_SP_CODE_UNICODE { __dwTemp = GDI_GetUniStringWidth(_aLinePtr[bLineIndex]); }#endif _CHAR_SP_StrAttr.wX = CHAR_SP_REG_LEFT + (CHAR_SP_REG_WIDTH -__dwTemp) / 2; if (__bEnCodeType == CHAR_ENCODE_ISO_CP) {#ifdef EX_SP_USE_SPU_BUFFER GDI_DrawString_909(GDI_SP_REGION_ID, &_CHAR_SP_StrAttr, _aLinePtr[bLineIndex]);#else GDI_DrawString_909(0, &_CHAR_SP_StrAttr, _aLinePtr[bLineIndex]);#endif }#ifdef SUPPORT_UNICODE_CODING else // CHAR_SP_CODE_UNICODE {#ifdef EX_SP_USE_SPU_BUFFER GDI_DrawStringByUnicode(GDI_SP_REGION_ID, &_CHAR_SP_StrAttr, _aLinePtr[bLineIndex]);#else GDI_DrawStringByUnicode(0, &_CHAR_SP_StrAttr, _aLinePtr[bLineIndex]);#endif }#endif // #ifdef SUPPORT_UNICODE_CODING _CHAR_SP_StrAttr.wY += CHAR_SP_LINE_HEIGHT; bLineIndex++; }/*#ifdef SUPPORT_UNICODE_CODING OSD_SetCurFontTable(FONTABLE_OSD);#endif*/ //GDI_SetFontHeightInTable(OSD_FONT_HEIGHT); /*#if (FONT_TABLE_METHOD == CREATE_DYNAMICALLY) _CHAR_SP_UseExSPFontTable(FALSE);#endif */#ifdef EX_SP_USE_SPU_BUFFER SPU_BMP_SetDisplay(0, TRUE);#endif _blAlreadyDisplay = TRUE;}void _Convert_Locale_To_CTK_Strings(void){ WORD wReadByteNum; BYTE bCharNum, bLineIndex, bBufferIndex; PBYTE pString; // Point to the current translated character#ifdef ISO_8859_8_FONT#ifdef HEBREW_IE_FORMAT BYTE bHebCharNum; // save the character numbers of a word BYTE bHebNewSentence; BYTE bHebNumberWord; BYTE bHebCharStart; BYTE bSpaceIndex; // initial variables bHebCharNum = 0; bHebNewSentence = TRUE; bHebNumberWord = FALSE; bHebCharStart = 0; bSpaceIndex = 0; _bHebSentenceIndex = 0; _bHebNumberIndex = 0;#elif defined(HEBREW_WORD_FORMAT) BYTE bHebCharNum; // save the character numbers of a word BYTE bHebChar; // initial variables bHebCharNum = 0; bHebChar = FALSE; _bHebWordIndex = 0;#endif#endif /* if (_pSP_LastHeaderPt == _pSP_HeaderPt) return ; */ for (bLineIndex = 0; bLineIndex < CHAR_SP_MAX_LINE_NUM; bLineIndex++) _aLinePtr[bLineIndex] = NULL; pString = ((PBYTE)_pSP_HeaderPt) + PARSER_SPTXT_HEADER_SIZE; wReadByteNum = 0; bCharNum = 0; bBufferIndex = 1; bLineIndex = 0; _aLinePtr[bLineIndex] = _aString;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -