├── src ├── Icon.bmp ├── rom │ ├── 00.wav │ ├── 01.wav │ ├── 02.wav │ ├── 03.wav │ ├── 04.wav │ ├── 05.wav │ ├── 06.wav │ ├── 07.wav │ ├── 08.wav │ ├── 09.wav │ ├── 10.wav │ ├── 11.wav │ ├── 12.wav │ └── 13.wav ├── TVCaption2.rc ├── Exports.def ├── SwitchLang.bmp ├── SwitchSetting.bmp ├── TVCaption2.sln ├── ViewerClockEstimator.h ├── CaptionManager.h ├── Caption.cpp ├── TVCaption2.vcxproj.filters ├── Caption.h ├── resource.h ├── OsdCompositor.h ├── PseudoOSD.h ├── GaijiTable_typebank.h ├── Util.h ├── TVCaption2.h ├── ViewerClockEstimator.cpp ├── CaptionManager.cpp └── TVCaption2.vcxproj ├── Readme.txt ├── gaiji ├── TVCaptionMod2_Gaiji_dyna.txt ├── TVCaptionMod2_Gaiji_ricoh.txt ├── TVCaptionMod2_Gaiji_ryobi.txt ├── TVCaptionMod2_Gaiji_std.txt ├── TVCaptionMod2_Gaiji_std19.txt ├── TVCaptionMod2_Gaiji_arphic.txt ├── TVCaptionMod2_Gaiji_estima.txt ├── TVCaptionMod2_Gaiji_stdpua.txt ├── TVCaptionMod2_Gaiji_typebank.txt ├── GaijiTable_estima.c ├── GaijiTable_ryobi.c ├── GaijiTable_ricoh.c ├── GaijiTable_arphic.c ├── GaijiTable_dyna.c ├── GaijiTable_std19.c ├── GaijiTable_stdpua.c ├── GaijiTable_typebank.c └── GaijiTable_std.c ├── Caption_src ├── Caption.def ├── Caption.vcxproj.filters ├── CaptionLib.vcxproj.filters ├── Caption.sln ├── CaptionMain.h ├── CaptionDef.h ├── ColorDef.h ├── Caption.h ├── Caption.cpp ├── ARIB8CharDecode.h ├── GaijiTable.h ├── CaptionLib.vcxproj └── Caption.vcxproj ├── _pubkey.asc ├── .gitignore └── TVCaptionMod2_Readme.txt /src/Icon.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/Icon.bmp -------------------------------------------------------------------------------- /src/rom/00.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/00.wav -------------------------------------------------------------------------------- /src/rom/01.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/01.wav -------------------------------------------------------------------------------- /src/rom/02.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/02.wav -------------------------------------------------------------------------------- /src/rom/03.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/03.wav -------------------------------------------------------------------------------- /src/rom/04.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/04.wav -------------------------------------------------------------------------------- /src/rom/05.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/05.wav -------------------------------------------------------------------------------- /src/rom/06.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/06.wav -------------------------------------------------------------------------------- /src/rom/07.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/07.wav -------------------------------------------------------------------------------- /src/rom/08.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/08.wav -------------------------------------------------------------------------------- /src/rom/09.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/09.wav -------------------------------------------------------------------------------- /src/rom/10.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/10.wav -------------------------------------------------------------------------------- /src/rom/11.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/11.wav -------------------------------------------------------------------------------- /src/rom/12.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/12.wav -------------------------------------------------------------------------------- /src/rom/13.wav: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/rom/13.wav -------------------------------------------------------------------------------- /src/TVCaption2.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/TVCaption2.rc -------------------------------------------------------------------------------- /Readme.txt: -------------------------------------------------------------------------------- 1 | TVTestの字幕プラグインです。 2 | 使い方などはTVCaptionMod2_Readme.txtを参照してください。 3 | バイナリはReleases欄。 4 | -------------------------------------------------------------------------------- /src/Exports.def: -------------------------------------------------------------------------------- 1 | EXPORTS 2 | TVTGetVersion 3 | TVTGetPluginInfo 4 | TVTInitialize 5 | TVTFinalize -------------------------------------------------------------------------------- /src/SwitchLang.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/SwitchLang.bmp -------------------------------------------------------------------------------- /src/SwitchSetting.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/src/SwitchSetting.bmp -------------------------------------------------------------------------------- /gaiji/TVCaptionMod2_Gaiji_dyna.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/gaiji/TVCaptionMod2_Gaiji_dyna.txt -------------------------------------------------------------------------------- /gaiji/TVCaptionMod2_Gaiji_ricoh.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/gaiji/TVCaptionMod2_Gaiji_ricoh.txt -------------------------------------------------------------------------------- /gaiji/TVCaptionMod2_Gaiji_ryobi.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/gaiji/TVCaptionMod2_Gaiji_ryobi.txt -------------------------------------------------------------------------------- /gaiji/TVCaptionMod2_Gaiji_std.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/gaiji/TVCaptionMod2_Gaiji_std.txt -------------------------------------------------------------------------------- /gaiji/TVCaptionMod2_Gaiji_std19.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/gaiji/TVCaptionMod2_Gaiji_std19.txt -------------------------------------------------------------------------------- /gaiji/TVCaptionMod2_Gaiji_arphic.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/gaiji/TVCaptionMod2_Gaiji_arphic.txt -------------------------------------------------------------------------------- /gaiji/TVCaptionMod2_Gaiji_estima.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/gaiji/TVCaptionMod2_Gaiji_estima.txt -------------------------------------------------------------------------------- /gaiji/TVCaptionMod2_Gaiji_stdpua.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/gaiji/TVCaptionMod2_Gaiji_stdpua.txt -------------------------------------------------------------------------------- /gaiji/TVCaptionMod2_Gaiji_typebank.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tsukumijima/TVCaptionMod2/master/gaiji/TVCaptionMod2_Gaiji_typebank.txt -------------------------------------------------------------------------------- /Caption_src/Caption.def: -------------------------------------------------------------------------------- 1 | EXPORTS 2 | InitializeCP @1 3 | UnInitializeCP @2 4 | AddTSPacketCP @3 5 | ClearCP @4 6 | GetTagInfoCP @5 7 | GetCaptionDataCP @6 8 | InitializeUNICODE @7 9 | InitializeCPW @8 10 | GetCaptionDataCPW @9 11 | GetDRCSPatternCP @10 12 | SetGaijiCP @11 13 | GetGaijiCP @12 14 | SwitchStreamCP @13 15 | GetBitmapDataCP @14 16 | -------------------------------------------------------------------------------- /src/TVCaption2.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30330.147 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TVCaption2", "TVCaption2.vcxproj", "{4BE74EE2-B6D0-427D-9DA4-652737CA71DE}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Win32 = Debug|Win32 11 | Debug|x64 = Debug|x64 12 | Release|Win32 = Release|Win32 13 | Release|x64 = Release|x64 14 | EndGlobalSection 15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 16 | {4BE74EE2-B6D0-427D-9DA4-652737CA71DE}.Debug|Win32.ActiveCfg = Debug|Win32 17 | {4BE74EE2-B6D0-427D-9DA4-652737CA71DE}.Debug|Win32.Build.0 = Debug|Win32 18 | {4BE74EE2-B6D0-427D-9DA4-652737CA71DE}.Debug|x64.ActiveCfg = Debug|x64 19 | {4BE74EE2-B6D0-427D-9DA4-652737CA71DE}.Debug|x64.Build.0 = Debug|x64 20 | {4BE74EE2-B6D0-427D-9DA4-652737CA71DE}.Release|Win32.ActiveCfg = Release|Win32 21 | {4BE74EE2-B6D0-427D-9DA4-652737CA71DE}.Release|Win32.Build.0 = Release|Win32 22 | {4BE74EE2-B6D0-427D-9DA4-652737CA71DE}.Release|x64.ActiveCfg = Release|x64 23 | {4BE74EE2-B6D0-427D-9DA4-652737CA71DE}.Release|x64.Build.0 = Release|x64 24 | EndGlobalSection 25 | GlobalSection(SolutionProperties) = preSolution 26 | HideSolutionNode = FALSE 27 | EndGlobalSection 28 | GlobalSection(ExtensibilityGlobals) = postSolution 29 | SolutionGuid = {516A7642-7B7A-4EFA-B6E7-75E6845B4BF3} 30 | EndGlobalSection 31 | EndGlobal 32 | -------------------------------------------------------------------------------- /_pubkey.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP PUBLIC KEY BLOCK----- 2 | Version: GnuPG v1.4.11 (MingW32) 3 | 4 | mQENBE5gp7MBCAC7zq4J2hQILw5nCLIrYFJ2Y3Xcw6Xd/gqO2yEURbP5X2M3jy9Q 5 | 8UoFNXbruZYanTGcNkLG2IE1EAoF9lICrOqxSezHgayLrPlOLQQ1QVf+/U/xCsE5 6 | k8DVgHQq+uv0ISHVk9QE3Lqeb0OxMcd1Ff/pBK31lRMbCsrmoZQSRZhRbgTZ+8f8 7 | sqoNL8wT0frzV+9siwNIKgaEcrYNXNRIO3d9SErOeZuuitSof+MoEVrTbmHiulmb 8 | /MxADHc86j+rIxKlTjX4ndZuRWxvWIIbE/nJ0WTMqpyBx1l+I8p8wSKD2MNeJXYu 9 | RaIvWj5wKS6/wOu4yH7jW6SsOrz8xPzv4995ABEBAAG0G1R2dFBsYXkgQXV0aG9y 10 | ICgyMDExLTA5LTAyKYkBOAQTAQIAIgUCTmCnswIbAwYLCQgHAwIGFQgCCQoLBBYC 11 | AwECHgECF4AACgkQ4JELUlG6OO1/ogf/RvUhdQ2PTb3vTs0Cg5YuaP8Q0mTGhNyn 12 | iYXsjLw8sw98sTlG5H5MZpfrK96KsxiXCTKY+vCloQcVqj2jtf06R/VOSl1n2zC+ 13 | rlcOuds1E6rLip+xTUYIPs30XnCYrpv6wSkOrEN8PtSdyaxfRTTbgU+5DKuP6sc7 14 | Q2gcRBM99/FVksS3gdnvbYJlhh6NBu2+zzbYKQ8QVl9ktizLLNMLYD5M3ZW05UiI 15 | Rt+hdrGsycy4Rvuovqi9SUuZcWhHQoxSTAMBVR3LIhxtOxjfyeRl4gcz7IWFAo2T 16 | mmL6w20XHA/TBK9apE8eK36PPhU4zkA/iLSLvvvjmw+W3khxF+C8MrkBDQROYKez 17 | AQgAyHAz9M31s5zYONFsT1KYsg6VKqLQhwA29X4smarI3R1dRFTRQOHW0SP2wI9v 18 | vjRFe7Y/yneOnaHs3zHk45A0cjAvlsLgq6G/ARNvIMcL5IorIvivG4i1c0oMWxSC 19 | bqKDOEm1EU+1dbwz8zSNwqBvT3cv4zec1Cn1f1LL2IbS73tBUZ7NO9NxWgpNKzmm 20 | 9zMivmY0beWSmB6DFdngKfyyV84fswjjEq2xFrUs/877QxQfmJz+/v1plvhLYEAZ 21 | 1J/Yf8kfIQYnjLcPVipNmsBM+trY4DjoR9QczaWLugG4TuEAkQg9wYzRH2x8VrZI 22 | WtbFbgRNytaQGmcKLUPukAXZgQARAQABiQEfBBgBAgAJBQJOYKezAhsMAAoJEOCR 23 | C1JRujjt6P8H/RtkgBnarwI7jgvWBeRdomZ5N0K9eWXCdXJivF9V3uQAuYeO6WLw 24 | 8b/FvTlf34cvYdMtru/tbx5lQNyI6S/1fibjabWbzo8WrANkrYjaUEC/zmn3+cCg 25 | D2Cjf4ub5ElMr+XO45b8a7iXaf+3pC473p75GrizxtsMiRT4A4Wox+G51R4MBute 26 | mpo1oLPpx+hRCGoXb6uR+1uS5hm58Bug0AQyP9Dz5J/ufbUANR0VE3lDkqU0YUOl 27 | K54YWVtDCF2Au1EjvSZ0SN0mpcjSsOFwuZzIBQ911PDZxcAdq3YKYnWcjMXKGpyg 28 | /Z9Nhv/dR0Ua0laXzx+P04BIAodf824P8s4= 29 | =rpHW 30 | -----END PGP PUBLIC KEY BLOCK----- 31 | -------------------------------------------------------------------------------- /Caption_src/Caption.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | ヘッダー ファイル 20 | 21 | 22 | ヘッダー ファイル 23 | 24 | 25 | ヘッダー ファイル 26 | 27 | 28 | ヘッダー ファイル 29 | 30 | 31 | ヘッダー ファイル 32 | 33 | 34 | ヘッダー ファイル 35 | 36 | 37 | 38 | 39 | ソース ファイル 40 | 41 | 42 | ソース ファイル 43 | 44 | 45 | ソース ファイル 46 | 47 | 48 | -------------------------------------------------------------------------------- /Caption_src/CaptionLib.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | ヘッダー ファイル 20 | 21 | 22 | ヘッダー ファイル 23 | 24 | 25 | ヘッダー ファイル 26 | 27 | 28 | ヘッダー ファイル 29 | 30 | 31 | ヘッダー ファイル 32 | 33 | 34 | ヘッダー ファイル 35 | 36 | 37 | 38 | 39 | ソース ファイル 40 | 41 | 42 | ソース ファイル 43 | 44 | 45 | ソース ファイル 46 | 47 | 48 | -------------------------------------------------------------------------------- /src/ViewerClockEstimator.h: -------------------------------------------------------------------------------- 1 | // TVTestのストリームコールバックから表示までの遅延を推定する 2 | #ifndef INCLUDE_VIEWER_CLOCK_ESTIMATOR_H 3 | #define INCLUDE_VIEWER_CLOCK_ESTIMATOR_H 4 | 5 | #include "Util.h" 6 | #include 7 | #include 8 | 9 | class CViewerClockEstimator 10 | { 11 | public: 12 | static const int PCR_PER_MSEC = 90; 13 | 14 | CViewerClockEstimator(); 15 | void SetEnabled(bool fEnabled); 16 | bool GetEnabled() const; 17 | void SetStreamPcr(LONGLONG pcr); 18 | LONGLONG GetStreamPcr() const; 19 | void Reset(); 20 | void SetVideoPes(bool fViewer, bool fUnitStart, const BYTE *data, size_t len); 21 | void SetVideoStream(bool fViewer, const BYTE *data, size_t len); 22 | LONGLONG GetViewerPcr() const; 23 | 24 | private: 25 | DWORD CalcCrc32(BYTE b, DWORD crc = 0xffffffff) const { 26 | return (crc << 8) ^ m_crcTable[(crc >> 24) ^ b]; 27 | } 28 | 29 | // 遅延量の推定の既定値 30 | static const DWORD DEFAULT_PCR_DIFF = 450 * PCR_PER_MSEC; 31 | // PCRに対して表示が先行する予想値 32 | // おそらく環境によって差がある。一般的なPCRに対する音声PTSの差(200msec程度)より大きくなることはないはず 33 | // TODO: 音声の遅延がないと仮定してPCRに対する音声PTSの差を使うとよりよいかもしれない 34 | static const DWORD ADJUST_PCR_DIFF = 100 * PCR_PER_MSEC; 35 | // 遅延量の推定の最大値 36 | static const DWORD STREAM_PCR_QUEUE_DIFF = 10000 * PCR_PER_MSEC; 37 | // 表示に近い側のストリームの観測範囲 38 | static const DWORD VIEWER_PCR_QUEUE_DIFF = 1000 * PCR_PER_MSEC; 39 | 40 | mutable recursive_mutex_ m_streamLock; 41 | bool m_fEnabled; 42 | LONGLONG m_streamPcr; 43 | LONGLONG m_updateDiffPcr; 44 | int m_pesHeaderRemain[2]; 45 | int m_unitState[2]; 46 | size_t m_unitSize[2]; 47 | DWORD m_crc[2]; 48 | std::deque> m_crcPcrDeq[2]; 49 | std::vector> m_pcrDiffs; 50 | DWORD m_pcrDiff; 51 | DWORD m_crcTable[256]; 52 | }; 53 | 54 | #endif // INCLUDE_VIEWER_CLOCK_ESTIMATOR_H 55 | -------------------------------------------------------------------------------- /Caption_src/Caption.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio Version 16 4 | VisualStudioVersion = 16.0.30330.147 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Caption", "Caption.vcxproj", "{60BC8339-018F-4AF1-A09C-EDAF70A007B7}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CaptionLib", "CaptionLib.vcxproj", "{671D1C97-C4DA-45B9-A9DC-C1925FE03603}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|Win32 = Debug|Win32 13 | Debug|x64 = Debug|x64 14 | Release|Win32 = Release|Win32 15 | Release|x64 = Release|x64 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {60BC8339-018F-4AF1-A09C-EDAF70A007B7}.Debug|Win32.ActiveCfg = Debug|Win32 19 | {60BC8339-018F-4AF1-A09C-EDAF70A007B7}.Debug|x64.ActiveCfg = Debug|x64 20 | {60BC8339-018F-4AF1-A09C-EDAF70A007B7}.Release|Win32.ActiveCfg = Release|Win32 21 | {60BC8339-018F-4AF1-A09C-EDAF70A007B7}.Release|x64.ActiveCfg = Release|x64 22 | {671D1C97-C4DA-45B9-A9DC-C1925FE03603}.Debug|Win32.ActiveCfg = Debug|Win32 23 | {671D1C97-C4DA-45B9-A9DC-C1925FE03603}.Debug|Win32.Build.0 = Debug|Win32 24 | {671D1C97-C4DA-45B9-A9DC-C1925FE03603}.Debug|x64.ActiveCfg = Debug|x64 25 | {671D1C97-C4DA-45B9-A9DC-C1925FE03603}.Debug|x64.Build.0 = Debug|x64 26 | {671D1C97-C4DA-45B9-A9DC-C1925FE03603}.Release|Win32.ActiveCfg = Release|Win32 27 | {671D1C97-C4DA-45B9-A9DC-C1925FE03603}.Release|Win32.Build.0 = Release|Win32 28 | {671D1C97-C4DA-45B9-A9DC-C1925FE03603}.Release|x64.ActiveCfg = Release|x64 29 | {671D1C97-C4DA-45B9-A9DC-C1925FE03603}.Release|x64.Build.0 = Release|x64 30 | EndGlobalSection 31 | GlobalSection(SolutionProperties) = preSolution 32 | HideSolutionNode = FALSE 33 | EndGlobalSection 34 | GlobalSection(ExtensibilityGlobals) = postSolution 35 | SolutionGuid = {3359BE12-F74E-479D-A639-03B2797426CB} 36 | EndGlobalSection 37 | EndGlobal 38 | -------------------------------------------------------------------------------- /src/CaptionManager.h: -------------------------------------------------------------------------------- 1 | #ifndef INCLUDE_CAPTION_MANAGER_H 2 | #define INCLUDE_CAPTION_MANAGER_H 3 | 4 | class CCaptionManager 5 | { 6 | static const int PACKET_QUEUE_SIZE = 1024; 7 | public: 8 | CCaptionManager(); 9 | void SetCaptionDll(const CCaptionDll *pCaptionDll, DWORD dwIndexToUse); 10 | void Clear(); 11 | void AddPacket(LPCBYTE pPacket); 12 | void Analyze(DWORD currentPcr); 13 | bool PopCaptionOrBitmap(const CAPTION_DATA_DLL **ppCaption, const BITMAP_DATA_DLL **ppBitmapData, 14 | DWORD currentPcr, bool fIgnorePts); 15 | bool GetCaptionOrBitmap(const CAPTION_DATA_DLL **ppCaption, const BITMAP_DATA_DLL **ppBitmapData, 16 | DWORD currentPcr, bool fIgnorePts, DWORD index) const; 17 | bool IsSuperimpose() const { return m_fSuperimpose; } 18 | bool IsEmpty() const { return m_popCount >= m_capCount && 19 | (m_bitmapPopCount >= m_bitmapDataCount || 20 | m_pBitmapDataList[m_bitmapPopCount].wAppearanceOrder != m_popCount); } 21 | void GetDrcsList(const DRCS_PATTERN_DLL **ppList, DWORD *pCount) const { *ppList=m_pDrcsList; *pCount=m_drcsCount; } 22 | bool IsShowLang2() const { return m_fShowLang2; } 23 | void ShowLang2(bool fShowLang2) { m_fShowLang2 = fShowLang2; } 24 | const LANG_TAG_INFO_DLL *GetLangTag() const { 25 | return m_fShowLang2 && m_lang2.ucLangTag!=0xFF ? &m_lang2 : m_lang1.ucLangTag!=0xFF ? &m_lang1 : nullptr; 26 | } 27 | void SetProfileC(bool fProfileC) { m_fProfileC = fProfileC; } 28 | private: 29 | const CCaptionDll *m_pCaptionDll; 30 | DWORD m_dwIndex; 31 | bool m_fProfileC; 32 | bool m_fShowLang2; 33 | bool m_fSuperimpose; 34 | bool m_fEnPts; 35 | DWORD m_pcr; 36 | DWORD m_pts; 37 | CAPTION_DATA_DLL *m_pCapList; 38 | DRCS_PATTERN_DLL *m_pDrcsList; 39 | BITMAP_DATA_DLL *m_pBitmapDataList; 40 | DWORD m_capCount; 41 | DWORD m_popCount; 42 | DWORD m_drcsCount; 43 | DWORD m_bitmapDataCount; 44 | DWORD m_bitmapPopCount; 45 | LANG_TAG_INFO_DLL m_lang1, m_lang2; 46 | bool m_fEnLastTagInfoPcr; 47 | DWORD m_lastTagInfoPcr; 48 | BYTE m_queue[PACKET_QUEUE_SIZE][188]; 49 | int m_queueFront; 50 | int m_queueRear; 51 | }; 52 | 53 | #endif // INCLUDE_CAPTION_MANAGER_H 54 | -------------------------------------------------------------------------------- /Caption_src/CaptionMain.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | //運用規定により2言語まで 4 | #define LANG_TAG_MAX 2 5 | 6 | class CCaptionMain 7 | { 8 | public: 9 | CCaptionMain(void); 10 | 11 | DWORD AddTSPacket(LPCBYTE pbPacket); 12 | DWORD Clear(); 13 | 14 | DWORD GetTagInfo(LANG_TAG_INFO_DLL** ppList, DWORD* pdwListCount); 15 | DWORD GetCaptionData(unsigned char ucLangTag, CAPTION_DATA_DLL** ppList, DWORD* pdwListCount); 16 | BOOL GetDRCSPattern(unsigned char ucLangTag, DRCS_PATTERN_DLL** ppList, DWORD* pdwListCount); 17 | BOOL GetBitmapData(unsigned char ucLangTag, BITMAP_DATA_DLL** ppList, DWORD* pdwListCount); 18 | BOOL GetGaijiTable(WCHAR* pTable, DWORD* pdwTableSize) const { return m_cDec.GetGaijiTable(pTable, pdwTableSize); } 19 | BOOL SetGaijiTable(const WCHAR* pTable, DWORD* pdwTableSize) { return m_cDec.SetGaijiTable(pTable, pdwTableSize); } 20 | BOOL ResetGaijiTable(DWORD* pdwTableSize) { return m_cDec.ResetGaijiTable(pdwTableSize); } 21 | 22 | protected: 23 | struct PAYLOAD_DATA{ 24 | BYTE bBuff[188]; 25 | WORD wSize; 26 | PAYLOAD_DATA() {} 27 | }; 28 | vector m_PayloadList; 29 | 30 | struct BITMAP_DATA{ 31 | WORD wAppearanceOrder; 32 | WORD wSWFMode; 33 | WORD wClientX; 34 | WORD wClientY; 35 | WORD wClientW; 36 | WORD wClientH; 37 | int iPosX; 38 | int iPosY; 39 | vector FlushColor; 40 | vector Image; 41 | }; 42 | 43 | struct LANG_CONTEXT{ 44 | LANG_TAG_INFO_DLL LangTag; 45 | vector CaptionList; 46 | BOOL bHasStatementBody; 47 | CAPTION_DATA LastCaptionDataFields; 48 | vector DRCList; 49 | CDRCMap DRCMap; 50 | vector BitmapDataList; 51 | }; 52 | LANG_CONTEXT m_LangContext[LANG_TAG_MAX]; 53 | LANG_CONTEXT m_ManagementContext; 54 | 55 | unsigned char m_ucDgiGroup; 56 | 57 | int m_iLastCounter; 58 | BOOL m_bAnalyz; //PES解析中はFALSE 59 | DWORD m_dwNowReadSize; //読み込んだペイロード長 60 | DWORD m_dwNeedSize; //PESの解析に必要なペイロード長 61 | 62 | LANG_TAG_INFO_DLL m_LangTagDllList[LANG_TAG_MAX]; 63 | vector m_pCapList; 64 | vector m_pCapCharPool; 65 | vector m_pDRCList; 66 | vector m_pBitmapDataList; 67 | vector m_pbBuff; 68 | 69 | CARIB8CharDecode m_cDec; 70 | 71 | protected: 72 | DWORD ParseListData(); 73 | DWORD ParseCaption(LPCBYTE pbBuff, DWORD dwSize); 74 | DWORD ParseCaptionManagementData(LPCBYTE pbBuff, DWORD dwSize); 75 | DWORD ParseCaptionData(LPCBYTE pbBuff, DWORD dwSize, LANG_CONTEXT* pLangContext); 76 | DWORD ParseUnitData(LPCBYTE pbBuff, DWORD dwSize, DWORD* pdwReadSize, LANG_CONTEXT* pLangContext); 77 | }; 78 | -------------------------------------------------------------------------------- /src/Caption.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include "Caption.h" 3 | 4 | BOOL CalcMD5FromDRCSPattern(BYTE (&bHash)[16], const DRCS_PATTERN_DLL &drcs, int nIndex) 5 | { 6 | int nWidth = drcs.bmiHeader.biWidth; 7 | int nHeight = drcs.bmiHeader.biHeight; 8 | int nShift = 0; 9 | int nExpand = 1; 10 | int nPaddingL = 0; 11 | int nPaddingR = 0; 12 | int nGradationBits = 2; 13 | if( nIndex < 0 || (drcs.wGradation != 2 && drcs.wGradation != 4) || nWidth > DRCS_SIZE_MAX || nHeight > DRCS_SIZE_MAX ){ 14 | return FALSE; 15 | }else if( nIndex == 0 ){ 16 | // 無変換 17 | nGradationBits = (drcs.wGradation == 4 ? 2 : 1); 18 | }else if( nIndex >= 1 && nIndex <= 3 && drcs.wGradation == 2 && nWidth == DRCS_SIZE_MAX / 2 - 2 && nHeight == DRCS_SIZE_MAX / 2 ){ 19 | // (Cプロファイル向け)標準サイズを縦横2倍角に拡大(横に-2,0,2ずれ)した値も返す 20 | nExpand = 2; 21 | nPaddingL = 2 * (nIndex - 1); 22 | nPaddingR = 4 - nPaddingL; 23 | }else if( nIndex >= 1 && nIndex <= 2 && drcs.wGradation == 4 && nWidth >= 2 ){ 24 | // (Aプロファイル向け)横に2,-2ずらした値も返す 25 | if( nIndex == 1 ){ 26 | nShift = 2; 27 | nPaddingL = 2; 28 | }else{ 29 | nShift = -2; 30 | nPaddingR = 2; 31 | } 32 | }else{ 33 | return FALSE; 34 | } 35 | BYTE bData[(DRCS_SIZE_MAX*DRCS_SIZE_MAX + 3) / 4] = {}; 36 | 37 | DWORD dwDataBits = 0; 38 | for( int y=nHeight-1; y>=0; y-- ){ 39 | for( int j=0; j> (x % 2 ? 0 : 4) & 0x0F; 44 | if( x >= nWidth - nShift ){ 45 | if( nPix != 0 ){ 46 | // 右端が黒でないのでずらせない 47 | return CalcMD5FromDRCSPattern(bHash, drcs, 0); 48 | } 49 | }else if( x < -nShift ){ 50 | if( nPix != 0 ){ 51 | // 左端が黒でないのでずらせない 52 | return FALSE; 53 | } 54 | }else{ 55 | if( nGradationBits == 1 ){ 56 | bData[dwDataBits / 8] |= (BYTE)((nPix / 3) << (7 - dwDataBits % 8)); 57 | }else{ 58 | bData[dwDataBits / 8] |= (BYTE)(nPix << (6 - dwDataBits % 8)); 59 | } 60 | dwDataBits += nGradationBits; 61 | } 62 | } 63 | } 64 | dwDataBits += nGradationBits * nPaddingR; 65 | } 66 | } 67 | 68 | HCRYPTPROV hProv; 69 | BOOL bRet = FALSE; 70 | if( ::CryptAcquireContext(&hProv, nullptr, nullptr, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) ){ 71 | HCRYPTHASH hHash; 72 | if( ::CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash) ){ 73 | DWORD dwHashLen = sizeof(bHash); 74 | if( ::CryptHashData(hHash, bData, (dwDataBits + 7) / 8, 0) && 75 | ::CryptGetHashParam(hHash, HP_HASHVAL, bHash, &dwHashLen, 0) ){ 76 | bRet = TRUE; 77 | } 78 | ::CryptDestroyHash(hHash); 79 | } 80 | ::CryptReleaseContext(hProv, 0); 81 | } 82 | return bRet; 83 | } 84 | -------------------------------------------------------------------------------- /src/TVCaption2.vcxproj.filters: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | ソース ファイル 20 | 21 | 22 | ソース ファイル 23 | 24 | 25 | ソース ファイル 26 | 27 | 28 | ソース ファイル 29 | 30 | 31 | ソース ファイル 32 | 33 | 34 | ソース ファイル 35 | 36 | 37 | ソース ファイル 38 | 39 | 40 | 41 | 42 | ヘッダー ファイル 43 | 44 | 45 | ヘッダー ファイル 46 | 47 | 48 | ヘッダー ファイル 49 | 50 | 51 | ヘッダー ファイル 52 | 53 | 54 | ヘッダー ファイル 55 | 56 | 57 | ヘッダー ファイル 58 | 59 | 60 | ヘッダー ファイル 61 | 62 | 63 | ヘッダー ファイル 64 | 65 | 66 | ヘッダー ファイル 67 | 68 | 69 | ヘッダー ファイル 70 | 71 | 72 | 73 | 74 | リソース ファイル 75 | 76 | 77 | -------------------------------------------------------------------------------- /Caption_src/CaptionDef.h: -------------------------------------------------------------------------------- 1 | #ifndef INCLUDE_CAPTION_DEF_H 2 | #define INCLUDE_CAPTION_DEF_H 3 | 4 | #define CP_ERR_INIT 10 5 | #define CP_ERR_NOT_INIT 11 6 | #define CP_ERR_NEED_NEXT_PACKET 13 //次のTSパケット入れないと解析できない 7 | #define CP_ERR_CAN_NOT_ANALYZ 14 //本当にTSパケット?解析不可能 8 | #define CP_ERR_NOT_FIRST 15 //最初のTSパケット未入力 9 | #define CP_ERR_INVALID_PACKET 16 //本当にTSパケット?パケット飛んで壊れてるかも 10 | #define CP_CHANGE_VERSION 20 11 | #define CP_NO_ERR_TAG_INFO 21 12 | #define CP_NO_ERR_CAPTION_1 22 13 | #define CP_NO_ERR_CAPTION_8 29 14 | 15 | #define G_CELL_SIZE 94 16 | 17 | //DRCS図形の縦横最大サイズ(運用規定より) 18 | #define DRCS_SIZE_MAX 36 19 | 20 | //文字サイズ 21 | typedef enum { 22 | CP_STR_SMALL = 0, //SSZ 23 | CP_STR_MEDIUM, //MSZ 24 | CP_STR_NORMAL, //NSZ 25 | CP_STR_MICRO, //SZX 0x60 26 | CP_STR_HIGH_W, //SZX 0x41 27 | CP_STR_WIDTH_W, //SZX 0x44 28 | CP_STR_W, //SZX 0x45 29 | CP_STR_SPECIAL_1, //SZX 0x6B 30 | CP_STR_SPECIAL_2, //SZX 0x64 31 | } CP_STRING_SIZE; 32 | 33 | typedef struct { 34 | unsigned char ucR; 35 | unsigned char ucG; 36 | unsigned char ucB; 37 | unsigned char ucAlpha; 38 | } CLUT_DAT_DLL; 39 | 40 | typedef struct { 41 | const void* pszDecode; //char* or WCHAR* 42 | DWORD wCharSizeMode; 43 | 44 | CLUT_DAT_DLL stCharColor; 45 | CLUT_DAT_DLL stBackColor; 46 | CLUT_DAT_DLL stRasterColor; 47 | 48 | BOOL bUnderLine; 49 | CLUT_DAT_DLL stORNColor; 50 | BOOL bBold; 51 | BOOL bItalic; 52 | BYTE bFlushMode; 53 | BYTE bHLC; //must ignore low 4bits 54 | 55 | WORD wCharW; 56 | WORD wCharH; 57 | WORD wCharHInterval; 58 | WORD wCharVInterval; 59 | BYTE bPRA; //PRA+1 60 | BYTE bORN; 61 | } CAPTION_CHAR_DATA_DLL; 62 | 63 | typedef struct { 64 | BOOL bClear; 65 | WORD wSWFMode; 66 | WORD wClientX; 67 | WORD wClientY; 68 | WORD wClientW; 69 | WORD wClientH; 70 | WORD wPosX; 71 | WORD wPosY; 72 | WORD wAlignment; //zero cleared 73 | DWORD dwListCount; 74 | CAPTION_CHAR_DATA_DLL* pstCharList; 75 | DWORD dwWaitTime; 76 | } CAPTION_DATA_DLL; 77 | 78 | typedef struct { 79 | unsigned char ucLangTag; 80 | unsigned char ucDMF; 81 | unsigned char ucDC; 82 | char szISOLangCode[4]; 83 | unsigned char ucFormat; 84 | unsigned char ucTCS; 85 | unsigned char ucRollupMode; 86 | }LANG_TAG_INFO_DLL; 87 | 88 | typedef struct { 89 | DWORD dwDRCCode; 90 | DWORD dwUCS; 91 | WORD wGradation; 92 | WORD wReserved; //zero cleared 93 | DWORD dwReserved; //zero cleared 94 | BITMAPINFOHEADER bmiHeader; 95 | const BYTE* pbBitmap; 96 | }DRCS_PATTERN_DLL; 97 | 98 | typedef struct { 99 | WORD wAppearanceOrder; 100 | WORD wSWFMode; 101 | WORD wClientX; 102 | WORD wClientY; 103 | WORD wClientW; 104 | WORD wClientH; 105 | CLUT_DAT_DLL stRasterColor; 106 | int iPosX; 107 | int iPosY; 108 | DWORD dwFlushColorCount; 109 | DWORD dwImageSize; 110 | const CLUT_DAT_DLL* pstFlushColorList; 111 | const BYTE* pbImage; 112 | }BITMAP_DATA_DLL; 113 | 114 | #endif 115 | -------------------------------------------------------------------------------- /src/Caption.h: -------------------------------------------------------------------------------- 1 | #ifndef INCLUDE_CAPTION_H 2 | #define INCLUDE_CAPTION_H 3 | 4 | #include "../Caption_src/CaptionDef.h" 5 | #include "../Caption_src/Caption.h" 6 | 7 | inline bool operator==(const CLUT_DAT_DLL &a, const CLUT_DAT_DLL &b) { 8 | return a.ucR == b.ucR && a.ucG == b.ucG && a.ucB == b.ucB && a.ucAlpha == b.ucAlpha; 9 | } 10 | 11 | BOOL CalcMD5FromDRCSPattern(BYTE (&bHash)[16], const DRCS_PATTERN_DLL &drcs, int nIndex); 12 | 13 | // 2ストリーム(字幕+文字スーパーなど)をまとめて扱うラッパークラス 14 | // 昔の名残りでこんな名前だが実装はすでにDLLではない 15 | 16 | class CCaptionDll { 17 | public: 18 | CCaptionDll() : m_fInitialized(false) {} 19 | bool IsInitialized() const { return m_fInitialized; } 20 | bool Initialize() { 21 | if (m_fInitialized) return true; 22 | m_fInitialized = true; 23 | if (SwitchStream(1) && InitializeCPW() == TRUE && 24 | SwitchStream(0) && InitializeCPW() == TRUE) 25 | { 26 | return true; 27 | } 28 | m_fInitialized = false; 29 | return false; 30 | } 31 | void UnInitialize() { 32 | if (m_fInitialized) { 33 | if (SwitchStream(1)) UnInitializeCP(); 34 | if (SwitchStream(0)) UnInitializeCP(); 35 | m_fInitialized = false; 36 | } 37 | } 38 | DWORD AddTSPacket(DWORD dwIndex, BYTE *pbPacket) const { 39 | return SwitchStream(dwIndex) ? AddTSPacketCP(pbPacket) : FALSE; 40 | } 41 | DWORD Clear(DWORD dwIndex) const { 42 | return SwitchStream(dwIndex) ? ClearCP() : FALSE; 43 | } 44 | DWORD GetTagInfo(DWORD dwIndex, LANG_TAG_INFO_DLL** ppList, DWORD* pdwListCount) const { 45 | return SwitchStream(dwIndex) ? GetTagInfoCP(ppList, pdwListCount) : FALSE; 46 | } 47 | DWORD GetCaptionData(DWORD dwIndex, unsigned char ucLangTag, CAPTION_DATA_DLL** ppList, DWORD* pdwListCount) const { 48 | return SwitchStream(dwIndex) ? GetCaptionDataCPW(ucLangTag, ppList, pdwListCount) : FALSE; 49 | } 50 | DWORD GetDRCSPattern(DWORD dwIndex, unsigned char ucLangTag, DRCS_PATTERN_DLL** ppList, DWORD* pdwListCount) const { 51 | return SwitchStream(dwIndex) ? GetDRCSPatternCP(ucLangTag, ppList, pdwListCount) : FALSE; 52 | } 53 | DWORD GetBitmapData(DWORD dwIndex, unsigned char ucLangTag, BITMAP_DATA_DLL** ppList, DWORD* pdwListCount) const { 54 | return SwitchStream(dwIndex) ? GetBitmapDataCP(ucLangTag, ppList, pdwListCount) : FALSE; 55 | } 56 | bool SetGaiji(DWORD dwCommand, const WCHAR* ppTable, DWORD* pdwTableSize) const { 57 | DWORD dwTableSize = *pdwTableSize; 58 | return SwitchStream(1) && SetGaijiCP(dwCommand, ppTable, &dwTableSize) == TRUE && 59 | SwitchStream(0) && SetGaijiCP(dwCommand, ppTable, pdwTableSize) == TRUE; 60 | } 61 | bool GetGaiji(DWORD dwCommand, WCHAR* ppTable, DWORD* pdwTableSize) const { 62 | return SwitchStream(0) && GetGaijiCP(dwCommand, ppTable, pdwTableSize) == TRUE; 63 | } 64 | private: 65 | bool SwitchStream(DWORD dwIndex) const { 66 | return m_fInitialized && dwIndex < 2 && SwitchStreamCP(dwIndex) == TRUE; 67 | } 68 | bool m_fInitialized; 69 | }; 70 | 71 | #endif // INCLUDE_CAPTION_H 72 | -------------------------------------------------------------------------------- /Caption_src/ColorDef.h: -------------------------------------------------------------------------------- 1 | static const CLUT_DAT_DLL DefClut[]={ 2 | { 0, 0, 0,255}, //0 3 | {255, 0, 0,255}, 4 | { 0,255, 0,255}, 5 | {255,255, 0,255}, 6 | { 0, 0,255,255}, 7 | {255, 0,255,255}, //5 8 | { 0,255,255,255}, 9 | {255,255,255,255}, 10 | { 0, 0, 0, 0}, 11 | {170, 0, 0,255}, 12 | { 0,170, 0,255}, //10 13 | {170,170, 0,255}, 14 | { 0, 0,170,255}, 15 | {170, 0,170,255}, 16 | { 0,170,170,255}, 17 | {170,170,170,255}, //15 18 | { 0, 0, 85,255}, 19 | { 0, 85, 0,255}, 20 | { 0, 85, 85,255}, 21 | { 0, 85,170,255}, 22 | { 0, 85,255,255}, //20 23 | { 0,170, 85,255}, 24 | { 0,170,255,255}, 25 | { 0,255, 85,255}, 26 | { 0,255,170,255}, 27 | { 85, 0, 0,255}, //25 28 | { 85, 0, 85,255}, 29 | { 85, 0,170,255}, 30 | { 85, 0,255,255}, 31 | { 85, 85, 0,255}, 32 | { 85, 85, 85,255}, //30 33 | { 85, 85,170,255}, 34 | { 85, 85,255,255}, 35 | { 85,170, 0,255}, 36 | { 85,170, 85,255}, 37 | { 85,170,170,255}, //35 38 | { 85,170,255,255}, 39 | { 85,255, 0,255}, 40 | { 85,255, 85,255}, 41 | { 85,255,170,255}, 42 | { 85,255,255,255}, //40 43 | {170, 0, 85,255}, 44 | {170, 0,255,255}, 45 | {170, 85, 0,255}, 46 | {170, 85, 85,255}, 47 | {170, 85,170,255}, //45 48 | {170, 85,255,255}, 49 | {170,170, 85,255}, 50 | {170,170,255,255}, 51 | {170,255, 0,255}, 52 | {170,255, 85,255}, //50 53 | {170,255,170,255}, 54 | {170,255,255,255}, 55 | {255, 0, 85,255}, 56 | {255, 0,170,255}, 57 | {255, 85, 0,255}, //55 58 | {255, 85, 85,255}, 59 | {255, 85,170,255}, 60 | {255, 85,255,255}, 61 | {255,170, 0,255}, 62 | {255,170, 85,255}, //60 63 | {255,170,170,255}, 64 | {255,170,255,255}, 65 | {255,255, 85,255}, 66 | {255,255,170,255}, 67 | { 0, 0, 0,128}, //65 68 | {255, 0, 0,128}, 69 | { 0,255, 0,128}, 70 | {255,255, 0,128}, 71 | { 0, 0,255,128}, 72 | {255, 0,255,128}, //70 73 | { 0,255,255,128}, 74 | {255,255,255,128}, 75 | {170, 0, 0,128}, 76 | { 0,170, 0,128}, 77 | {170,170, 0,128}, //75 78 | { 0, 0,170,128}, 79 | {170, 0,170,128}, 80 | { 0,170,170,128}, 81 | {170,170,170,128}, 82 | { 0, 0, 85,128}, //80 83 | { 0, 85, 0,128}, 84 | { 0, 85, 85,128}, 85 | { 0, 85,170,128}, 86 | { 0, 85,255,128}, 87 | { 0,170, 85,128}, //85 88 | { 0,170,255,128}, 89 | { 0,255, 85,128}, 90 | { 0,255,170,128}, 91 | { 85, 0, 0,128}, 92 | { 85, 0, 85,128}, //90 93 | { 85, 0,170,128}, 94 | { 85, 0,255,128}, 95 | { 85, 85, 0,128}, 96 | { 85, 85, 85,128}, 97 | { 85, 85,170,128}, //95 98 | { 85, 85,255,128}, 99 | { 85,170, 0,128}, 100 | { 85,170, 85,128}, 101 | { 85,170,170,128}, 102 | { 85,170,255,128}, //100 103 | { 85,255, 0,128}, 104 | { 85,255, 85,128}, 105 | { 85,255,170,128}, 106 | { 85,255,255,128}, 107 | {170, 0, 85,128}, //105 108 | {170, 0,255,128}, 109 | {170, 85, 0,128}, 110 | {170, 85, 85,128}, 111 | {170, 85,170,128}, 112 | {170, 85,255,128}, //110 113 | {170,170, 85,128}, 114 | {170,170,255,128}, 115 | {170,255, 0,128}, 116 | {170,255, 85,128}, 117 | {170,255,170,128}, //115 118 | {170,255,255,128}, 119 | {255, 0, 85,128}, 120 | {255, 0,170,128}, 121 | {255, 85, 0,128}, 122 | {255, 85, 85,128}, //120 123 | {255, 85,170,128}, 124 | {255, 85,255,128}, 125 | {255,170, 0,128}, 126 | {255,170, 85,128}, 127 | {255,170,170,128}, //125 128 | {255,170,255,128}, 129 | {255,255, 85,128} 130 | }; 131 | -------------------------------------------------------------------------------- /src/resource.h: -------------------------------------------------------------------------------- 1 | #ifndef IDC_STATIC 2 | #define IDC_STATIC (-1) 3 | #endif 4 | 5 | #define IDD_OPTIONS 100 6 | #define IDD_OPTIONS_LEGACY 101 7 | #define IDB_ICON 110 8 | #define IDB_SWITCH_LANG 111 9 | #define IDB_SWITCH_SETTING 112 10 | #define IDW_ROM_00 150 11 | #define IDW_ROM_01 151 12 | #define IDW_ROM_02 152 13 | #define IDW_ROM_03 153 14 | #define IDW_ROM_04 154 15 | #define IDW_ROM_05 155 16 | #define IDW_ROM_06 156 17 | #define IDW_ROM_07 157 18 | #define IDW_ROM_08 158 19 | #define IDW_ROM_09 159 20 | #define IDW_ROM_10 160 21 | #define IDW_ROM_11 161 22 | #define IDW_ROM_12 162 23 | #define IDW_ROM_13 163 24 | #define IDC_CHECK_OSD 1000 25 | #define IDC_EDIT_CAPFOLDER 1001 26 | #define IDC_CAPFOLDER_BROWSE 1002 27 | #define IDC_COMBO_SETTINGS 1003 28 | #define IDC_SETTINGS_ADD 1004 29 | #define IDC_SETTINGS_DELETE 1005 30 | #define IDC_CHECK_SETTINGS_TEST 1006 31 | #define IDC_COMBO_FACE 1007 32 | #define IDC_COMBO_GAIJI_FACE 1008 33 | #define IDC_COMBO_GAIJI_TABLE 1009 34 | #define IDC_COMBO_METHOD 1010 35 | #define IDC_CHECK_CAPTION 1011 36 | #define IDC_CHECK_SUPERIMPOSE 1012 37 | #define IDC_EDIT_DELAY 1013 38 | #define IDC_CHECK_IGNORE_PTS 1014 39 | #define IDC_CHECK_TEXTOPA 1015 40 | #define IDC_CHECK_BACKOPA 1016 41 | #define IDC_EDIT_TEXTOPA 1017 42 | #define IDC_EDIT_BACKOPA 1018 43 | #define IDC_EDIT_ADJUST_X 1019 44 | #define IDC_EDIT_ADJUST_Y 1020 45 | #define IDC_EDIT_ADJUST_SIZE 1021 46 | #define IDC_EDIT_ADJUST_RATIO 1022 47 | #define IDC_EDIT_STROKE_WIDTH 1023 48 | #define IDC_EDIT_ORN_STROKE_WIDTH 1024 49 | #define IDC_CHECK_STROKE_WIDTH 1025 50 | #define IDC_COMBO_STROKE_LEVEL 1026 51 | #define IDC_EDIT_BY_DILATE 1027 52 | #define IDC_EDIT_VERT_ANTI 1028 53 | #define IDC_CHECK_ADD_PADDING 1029 54 | #define IDC_CHECK_IGNORE_SMALL 1030 55 | #define IDC_CHECK_CENTERING 1031 56 | #define IDC_CHECK_ROMSOUND 1032 57 | #define IDC_STATIC_CAPFOLDER 1033 58 | #define IDC_STATIC_GAIJI_TABLE 1034 59 | #define IDC_EDIT_ADJUST_VIEW_X 1035 60 | #define IDC_EDIT_ADJUST_VIEW_Y 1036 61 | #define IDC_CHECK_SHRINK_SD_SCALE 1037 62 | #define IDC_COMBO_AVOID_HALF 1038 63 | #define IDC_CHECK_SHIFT_SMALL 1039 64 | #define IDC_CHECK_CUST_ROMSOUND 1040 65 | #define IDC_CHECK_ESTIMATE_VIEWER_DELAY 1041 66 | -------------------------------------------------------------------------------- /Caption_src/Caption.h: -------------------------------------------------------------------------------- 1 | #ifndef INCLUDE_CP_CAPTION_H 2 | #define INCLUDE_CP_CAPTION_H 3 | 4 | #ifdef CAPTION_EXPORTS 5 | #define CAPTION_DLLEXPORT __declspec(dllexport) 6 | #else 7 | #define CAPTION_DLLEXPORT 8 | #endif 9 | 10 | #ifdef __cplusplus 11 | extern "C" { 12 | #endif 13 | 14 | //ストリーム切り替え 15 | //ひとつのストリームしか扱わないときは無視して構わない 16 | //戻り値:エラーコード 17 | //FALSE:失敗, TRUE:成功 18 | CAPTION_DLLEXPORT 19 | DWORD WINAPI SwitchStreamCP(DWORD dwIndex); 20 | 21 | //DLLの初期化 22 | //戻り値:エラーコード 23 | //ERR_INIT:既に初期化されている, TRUE:成功 24 | CAPTION_DLLEXPORT 25 | DWORD WINAPI InitializeCP(); 26 | 27 | //DLLの初期化(ワイド文字版) 28 | //戻り値:エラーコード 29 | CAPTION_DLLEXPORT 30 | DWORD WINAPI InitializeCPW(); 31 | 32 | //DLLの初期化(UTF-8 mark10als互換) 33 | //戻り値:エラーコード 34 | CAPTION_DLLEXPORT 35 | DWORD WINAPI InitializeUNICODE(); 36 | 37 | //DLLの開放 38 | //戻り値:エラーコード 39 | CAPTION_DLLEXPORT 40 | DWORD WINAPI UnInitializeCP(); 41 | 42 | //188バイトTS1パケット 43 | //戻り値:エラーコード 44 | //ERR_NOT_INIT:初期化されていない, ERR_CAN_NOT_ANALYZ, ERR_NOT_FIRST, ERR_INVALID_PACKET, FALSE:その他の失敗, 45 | //ERR_NEED_NEXT_PACKET:解析中(処理は正常に完了), 46 | //CHANGE_VERSION:字幕の構成が変わった, 47 | //NO_ERR_TAG_INFO:字幕の構成を取得した(ただし前回から変更はない), 48 | //NO_ERR_CAPTION_1~NO_ERR_CAPTION_8:第n言語の新しい字幕文が得られた(ただし運用規定上は第2言語まで), 49 | //TRUE:字幕文を取得した(ただし前回から変更はない) 50 | CAPTION_DLLEXPORT 51 | DWORD WINAPI AddTSPacketCP(BYTE* pbPacket); 52 | 53 | //内部データクリア 54 | //戻り値:エラーコード 55 | //ERR_NOT_INIT:初期化されていない, 0:クリアした 56 | CAPTION_DLLEXPORT 57 | DWORD WINAPI ClearCP(); 58 | 59 | //以下の関数で返されるバッファはつぎにAddTSPacketCP、UnInitializeCP、ClearCPのいずれかを呼ぶまで有効 60 | 61 | //字幕情報取得 62 | // 63 | // pdwListCount==NULLのとき、既定の字幕管理データを取得済みにする 64 | // 必須ではないが、ワンセグ字幕での初期化のレスポンスが向上する 65 | // TRUEを返したときppListには必ず1つの言語タグが格納される 66 | //戻り値:エラーコード 67 | //ERR_NOT_INIT:初期化されていない, FALSE:失敗, TRUE:成功(*pdwListCount>=1) 68 | CAPTION_DLLEXPORT 69 | DWORD WINAPI GetTagInfoCP(LANG_TAG_INFO_DLL** ppList, DWORD* pdwListCount); 70 | 71 | //字幕データ本文取得 72 | //戻り値:エラーコード 73 | //ERR_NOT_INIT:初期化されていない, FALSE:失敗, TRUE:成功(*pdwListCount>=1) 74 | //現仕様ではpstCharListのpszDecodeがNULLになることはないが、元仕様では可能性があるのでNULLチェックするべき 75 | CAPTION_DLLEXPORT 76 | DWORD WINAPI GetCaptionDataCP(unsigned char ucLangTag, CAPTION_DATA_DLL** ppList, DWORD* pdwListCount); 77 | 78 | //字幕データ本文取得(ワイド文字版) 79 | //戻り値:エラーコード 80 | CAPTION_DLLEXPORT 81 | DWORD WINAPI GetCaptionDataCPW(unsigned char ucLangTag, CAPTION_DATA_DLL** ppList, DWORD* pdwListCount); 82 | 83 | //DRCS図形取得 84 | //戻り値:エラーコード 85 | //ERR_NOT_INIT:初期化されていない, FALSE:失敗, TRUE:成功(*pdwListCount>=1) 86 | CAPTION_DLLEXPORT 87 | DWORD WINAPI GetDRCSPatternCP(unsigned char ucLangTag, DRCS_PATTERN_DLL** ppList, DWORD* pdwListCount); 88 | 89 | //ビットマップ図形取得 90 | //戻り値:エラーコード 91 | //ERR_NOT_INIT:初期化されていない, FALSE:失敗, TRUE:成功(*pdwListCount>=1) 92 | CAPTION_DLLEXPORT 93 | DWORD WINAPI GetBitmapDataCP(unsigned char ucLangTag, BITMAP_DATA_DLL** ppList, DWORD* pdwListCount); 94 | 95 | //外字変換テーブル設定 96 | //戻り値:エラーコード 97 | //ERR_NOT_INIT:初期化されていない, FALSE:失敗, TRUE:成功 98 | //外字90~94,85,86区の変換テーブルをリセット(dwCommand==0)または設定(dwCommand==1)する 99 | //成功すればpdwTableSizeに設定されたテーブルの要素数が返る 100 | CAPTION_DLLEXPORT 101 | DWORD WINAPI SetGaijiCP(DWORD dwCommand, const WCHAR* ppTable, DWORD* pdwTableSize); 102 | 103 | //外字変換テーブル取得 104 | //戻り値:エラーコード 105 | //ERR_NOT_INIT:初期化されていない, FALSE:失敗, TRUE:成功 106 | //外字90~94,85,86区の変換テーブルを取得(dwCommand==1)する 107 | //成功すればpdwTableSizeに取得されたテーブルの要素数が返る 108 | CAPTION_DLLEXPORT 109 | DWORD WINAPI GetGaijiCP(DWORD dwCommand, WCHAR* ppTable, DWORD* pdwTableSize); 110 | 111 | #ifdef __cplusplus 112 | } 113 | #endif 114 | 115 | #endif -------------------------------------------------------------------------------- /src/OsdCompositor.h: -------------------------------------------------------------------------------- 1 | // TVTestのVMR9/EVRレンダラに対するOSD合成管理クラス ver.1 (2013-01-24) 2 | // 改変流用自由(ただしプラグイン間の互換をなるべく維持してください) 3 | #ifndef INCLUDE_OSD_COMPOSITOR_H 4 | #define INCLUDE_OSD_COMPOSITOR_H 5 | 6 | #include 7 | #include 8 | 9 | #ifndef OSD_COMPOSITOR_VERSION 10 | #define OSD_COMPOSITOR_VERSION 1 11 | #endif 12 | 13 | class COsdCompositor 14 | { 15 | public: 16 | COsdCompositor(); 17 | ~COsdCompositor(); 18 | static HWND FindHandle(); 19 | bool SetContainerWindow(HWND hwndContainer); 20 | int AddTexture(HBITMAP hbm, int Left, int Top, bool fShow, int Group); 21 | bool DeleteTexture(int ID, int Group); 22 | bool ShowTexture(bool fShow, int ID, int Group); 23 | bool GetSurfaceRect(RECT *pRect); 24 | bool UpdateSurface(); 25 | #if OSD_COMPOSITOR_VERSION >= 1 26 | typedef BOOL (CALLBACK *UpdateCallbackFunc)(void *pBits, const RECT *pSurfaceRect, int Pitch, void *pClientData); 27 | bool SetUpdateCallback(UpdateCallbackFunc Callback, void *pClientData = nullptr, bool fTop = false); 28 | int GetVersion(); 29 | #endif 30 | bool Initialize(bool fSetHook); 31 | void Uninitialize(); 32 | void OnFilterGraphInitialized(IGraphBuilder *pGraphBuilder); 33 | void OnFilterGraphFinalize(IGraphBuilder *pGraphBuilder); 34 | private: 35 | struct TEXTURE_PARAM { 36 | int nSize; 37 | int ID; 38 | int Left; 39 | int Top; 40 | HBITMAP hbm; 41 | }; 42 | struct TEXTURE { 43 | int ID; 44 | int Left; 45 | int Top; 46 | void *pBits; 47 | int Width; 48 | int Height; 49 | }; 50 | #if OSD_COMPOSITOR_VERSION >= 1 51 | struct SET_UPDATE_CALLBACK_PARAM { 52 | int nSize; 53 | int Flags; 54 | UpdateCallbackFunc Callback; 55 | void *pClientData; 56 | }; 57 | #endif 58 | enum RENDERER_TYPE { RT_VMR9, RT_EVR, }; 59 | typedef HRESULT (WINAPI CoCreateInstanceFunc)(REFCLSID, LPUNKNOWN, DWORD, REFIID, LPVOID FAR*); 60 | typedef IDirect3D9 *(WINAPI Direct3DCreate9Func)(UINT); 61 | 62 | LRESULT SendMessageToHandle(UINT Msg, WPARAM wParam, LPARAM lParam) const; 63 | static bool Hook(CoCreateInstanceFunc *pfnNew, CoCreateInstanceFunc *pfnOld); 64 | static LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 65 | static void ComposeAlpha(DWORD* __restrict pBitsDest, int PitchDest, int WidthDest, int HeightDest, 66 | const DWORD* __restrict pBits, int Pitch, int Width, int Height, int Left, int Top); 67 | static bool GetVideoPosition(RECT *pRect, IBaseFilter *pRenderer, RENDERER_TYPE RendererType); 68 | static bool SetAlphaBitmap(IBaseFilter *pRenderer, RENDERER_TYPE RendererType, IDirect3DSurface9 *pD3DS9, const NORMALIZEDRECT *pNrc); 69 | bool CreateDevice(); 70 | void ReleaseDevice(); 71 | bool SetupSurface(int VideoWidth, int VideoHeight, RECT *pSurfaceRect); 72 | static HRESULT WINAPI CoCreateInstanceHook( 73 | REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID FAR* ppv); 74 | 75 | HWND m_hwnd; 76 | HWND m_hwndContainer; 77 | HMODULE m_hOle32; 78 | CoCreateInstanceFunc *m_pfnCoCreateInstance; 79 | IBaseFilter *m_pRenderer; 80 | RENDERER_TYPE m_RendererType; 81 | HMODULE m_hD3D9; 82 | IDirect3D9 *m_pD3D9; 83 | IDirect3DDevice9 *m_pD3DD9; 84 | IDirect3DSurface9 *m_pD3DS9; 85 | TEXTURE m_TxList[256]; 86 | int m_TxListLen; 87 | int m_TxCount; 88 | struct { int ID, Group; } m_GroupList[256]; 89 | int m_GroupListLen; 90 | #if OSD_COMPOSITOR_VERSION >= 1 91 | struct { UpdateCallbackFunc Callback; void *pClientData; bool fTop; } m_CallbackList[64]; 92 | int m_CallbackListLen; 93 | UpdateCallbackFunc m_LocCallback; 94 | #endif 95 | }; 96 | 97 | #endif // INCLUDE_OSD_COMPOSITOR_H 98 | -------------------------------------------------------------------------------- /src/PseudoOSD.h: -------------------------------------------------------------------------------- 1 | #ifndef PSEUDO_OSD_H 2 | #define PSEUDO_OSD_H 3 | 4 | 5 | class CPseudoOSD 6 | { 7 | HWND m_hwnd; 8 | COLORREF m_crBackColor; 9 | struct STYLE_ELEM { 10 | tstring Text; 11 | HBITMAP hbm; 12 | int Width; 13 | int OriginalWidth; 14 | LOGFONT lf; 15 | COLORREF cr; 16 | union { 17 | RECT AdjustRect; 18 | RECT PaintRect; 19 | }; 20 | STYLE_ELEM(LPCTSTR pszText,int Width_,int OriginalWidth_,const LOGFONT &lf_,COLORREF cr_,const RECT &AdjustRect_) 21 | : Text(pszText),hbm(nullptr),Width(Width_),OriginalWidth(OriginalWidth_),lf(lf_),cr(cr_),AdjustRect(AdjustRect_) {} 22 | STYLE_ELEM(HBITMAP hbm_,int Width_,COLORREF cr_,const RECT &PaintRect_) 23 | : hbm(hbm_),Width(Width_),OriginalWidth(Width_),cr(cr_),PaintRect(PaintRect_) {} 24 | }; 25 | std::vector m_StyleList; 26 | bool m_fSingle; 27 | HBITMAP m_hbmSingleFlush; 28 | struct { 29 | int Left,OriginalLeft,Top,Height; 30 | } m_Position; 31 | int m_OffsetX; 32 | int m_OffsetY; 33 | double m_ScaleX; 34 | double m_ScaleY; 35 | WORD m_wSWFMode; 36 | int m_FlashingInterval; 37 | int m_Opacity; 38 | int m_BackOpacity; 39 | int m_StrokeWidth; 40 | int m_StrokeSmoothLevel; 41 | int m_StrokeByDilateThreshold; 42 | bool m_fHLLeft,m_fHLTop,m_fHLRight,m_fHLBottom; 43 | int m_VertAntiAliasingThreshold; 44 | bool m_fFlushing; 45 | bool m_fWindowPrepared; 46 | bool m_fLayeredWindow; 47 | HWND m_hwndParent; 48 | HWND m_hwndOwner; 49 | POINT m_ParentPosition; 50 | bool m_fHide; 51 | 52 | void DrawTextList(HDC hdc,int MultX,int MultY,bool fSetColor) const; 53 | void DrawImageList(HDC hdc,int MultX,int MultY) const; 54 | void Draw(HDC hdc,const RECT &PaintRect) const; 55 | static bool AllocateWorkBitmap(int Width,int Height,int HeightMono,int *pAllocWidth); 56 | void UpdateLayeredWindow(HDC hdcCompose=nullptr,void *pBitsCompose=nullptr,int WidthCompose=0,int HeightCompose=0,bool fKeepAlpha=false); 57 | 58 | static const LPCTSTR m_pszWindowClass; 59 | static HINSTANCE m_hinst; 60 | static int m_RefCount; 61 | static HBITMAP m_hbmWork; 62 | static HBITMAP m_hbmWorkMono; 63 | static void *m_pBits; 64 | static void *m_pBitsMono; 65 | static CPseudoOSD *GetThis(HWND hwnd); 66 | static LRESULT CALLBACK WndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam); 67 | 68 | public: 69 | static bool Initialize(HINSTANCE hinst); 70 | static void FreeWorkBitmap(); 71 | 72 | CPseudoOSD(); 73 | ~CPseudoOSD(); 74 | bool Create(HWND hwndParent,bool fLayeredWindow,bool fRenewWindow=false); 75 | bool Destroy(); 76 | bool PrepareWindow(); 77 | bool Show(); 78 | bool Hide(); 79 | bool IsVisible() const; 80 | void ClearText(); 81 | void AddText(LPCTSTR pszText,int Width,int OriginalWidth,const LOGFONT &lf,COLORREF cr,const RECT &AdjustRect); 82 | void AddImage(HBITMAP hbm,int Width,COLORREF cr,const RECT &PaintRect); 83 | void SetSingleImage(HBITMAP hbm,HBITMAP hbmFlush,int Left,int Top); 84 | void SetPosition(int Left,int OriginalLeft,int Top,int Height); 85 | void GetOriginalPosition(int *pLeft,int *pTop,int *pWidth,int *pHeight) const; 86 | void GetWindowPosition(int *pLeft,int *pTop,int *pWidth,int *pHeight) const; 87 | void SetWindowOffset(int X,int Y); 88 | void SetWindowScale(double X,double Y); 89 | void SetSWFMode(WORD wMode) { m_wSWFMode=wMode; } 90 | WORD GetSWFMode() const { return m_wSWFMode; } 91 | void SetBackgroundColor(COLORREF crBack); 92 | bool SetOpacity(int Opacity,int BackOpacity=50); 93 | void SetStroke(int Width,int SmoothLevel,int ByDilateThreshold); 94 | void SetHighlightingBlock(bool fLeft,bool fTop,bool fRight,bool fBottom); 95 | void SetVerticalAntiAliasing(int Threshold); 96 | void SetFlashingInterval(int Interval); 97 | int GetFlashingInterval() { return m_FlashingInterval; } 98 | void OnParentMove(); 99 | void OnParentSize(); 100 | HBITMAP CreateBitmap(); 101 | void Compose(HDC hdc,int Left,int Top); 102 | private: 103 | CPseudoOSD(const CPseudoOSD &other); 104 | CPseudoOSD &operator=(const CPseudoOSD &other); 105 | }; 106 | 107 | 108 | #endif 109 | -------------------------------------------------------------------------------- /gaiji/GaijiTable_estima.c: -------------------------------------------------------------------------------- 1 | #if 1 2 | #ifndef WCHAR 3 | #define WCHAR unsigned short 4 | #endif 5 | #endif 6 | 7 | //From: up0511mod "Estima" 8 | static const WCHAR GaijiTable[]={ 9 | //row 90 10 | 0xE1B8, 0xE1B9, 0xE1BA, 0xE1BB, 0xE1BC, 0xE1BD, 0xE1BE, 0xE1BF, 0xE1C0, 0xE1C1, 11 | 0xE1C2, 0xE1C3, 0xE1C4, 0xE1C5, 0xE1C6, 0xE1C7, 0xE1C8, 0xE1C9, 0xE1CA, 0xE1CB, 12 | 0xE1CC, 0xE1CD, 0xE1CE, 0xE1CF, 0xE1D0, 0xE1D1, 0xE1D2, 0xE1D3, 0xE1D4, 0xE1D5, 13 | 0xE1D6, 0xE1D7, 0xE1D8, 0xE1D9, 0xE1DA, 0xE1DB, 0xE1DC, 0xE1DD, 0xE1DE, 0xE1DF, 14 | 0xE1E0, 0xE1E1, 0xE1E2, 0xE1E3, 0xE1E4, 0xE1E5, 0xE1E6, 0xE1E7, 0xE1E8, 0xE1E9, 15 | 0xE1EA, 0xE1EB, 0xE1EC, 0xE1ED, 0xE1EE, 0xE1EF, 0xE1F0, 0xE1F1, 0xE1F2, 0xE1F3, 16 | 0xE1F4, 0xE1F5, 0xE1F6, 0xE1F7, 0xE1F8, 0xE1F9, 0xE1FA, 0xE1FB, 0xE1FC, 0xE1FD, 17 | 0xE1FE, 0xE1FF, 0xE200, 0xE201, 0xE202, 0xE203, 0xE204, 0xE205, 0xE206, 0xE207, 18 | 0xE208, 0xE209, 0xE20A, 0xE20B, 0x837D, 0x8386, 0x8392, 0x8398, 0x83A7, 0x83A9, 19 | 0x83BF, 0x83C0, 0x83C7, 0x83CF, 20 | //row 91 21 | 0xE274, 0xE275, 0xE276, 0xE277, 0xE278, 0xE279, 0xE27A, 0xE27B, 0xE27C, 0xE27D, 22 | 0xE27E, 0xE27F, 0xE280, 0xE281, 0xE282, 0xE283, 0xE284, 0xE285, 0xE286, 0xE287, 23 | 0xE288, 0xE289, 0xE28A, 0xE28B, 0xE28C, 0xE28D, 0xE28E, 0xE28F, 0xE290, 0xE291, 24 | 0xE292, 0xE293, 0xE294, 0xE295, 0xE296, 0xE297, 0xE298, 0xE299, 0xE29A, 0xE29B, 25 | 0xE29C, 0xE29D, 0xE29E, 0xE29F, 0xE2A0, 0xE2A1, 0xE2A2, 0xE2A3, 0xE2A4, 0x866C, 26 | 0x8675, 0x8698, 0x86B8, 0x86FA, 0x86FC, 0x86FD, 0x870B, 0x8771, 0x8787, 0x8788, 27 | 0x87AC, 0x87AD, 0x87B5, 0x45EA, 0x87D6, 0x87EC, 0x8806, 0x880A, 0x8810, 0x8814, 28 | 0x881F, 0x8898, 0x88AA, 0x88CA, 0x88CE, 0x30FB, 0x88F5, 0x891C, 0x30FB, 0x8918, 29 | 0x8919, 0x891A, 0x8927, 0x8930, 0x8932, 0x8939, 0x8940, 0x8994, 0x30FB, 0x89D4, 30 | 0x89E5, 0x89F6, 0x8A12, 0x8A15, 31 | //row 92 32 | 0xE330, 0xE331, 0xE332, 0xE333, 0xE334, 0xE335, 0xE336, 0xE337, 0xE338, 0xE339, 33 | 0xE33A, 0xE33B, 0xE33C, 0xE33D, 0xE33E, 0xE33F, 0xE340, 0xE341, 0xE342, 0xE343, 34 | 0xE344, 0xE345, 0xE346, 0xE347, 0xE348, 0xE349, 0xE34A, 0xE34B, 0xE34C, 0xE34D, 35 | 0xE34E, 0xE34F, 0xE350, 0xE351, 0xE352, 0xE353, 0xE354, 0xE355, 0xE356, 0xE357, 36 | 0xE358, 0xE359, 0xE35A, 0xE35B, 0xE35C, 0xE35D, 0xE35E, 0xE35F, 0xE360, 0xE361, 37 | 0xE362, 0xE363, 0xE364, 0xE365, 0xE366, 0xE367, 0xE368, 0xE369, 0xE36A, 0xE36B, 38 | 0xE36C, 0xE36D, 0xE36E, 0xE36F, 0xE370, 0xE371, 0xE372, 0xE373, 0xE374, 0xE375, 39 | 0xE376, 0xE377, 0xE378, 0xE379, 0xE37A, 0xE37B, 0xE37C, 0xE37D, 0xE37E, 0xE37F, 40 | 0xE380, 0xE381, 0xE382, 0xE383, 0xE384, 0xE385, 0xE386, 0xE387, 0xE388, 0xE389, 41 | 0xE38A, 0x91D7, 0x91FB, 0x91E4, 42 | //row 93 43 | 0xE3EC, 0xE3ED, 0xE3EE, 0xE3EF, 0xE3F0, 0xE3F1, 0xE3F2, 0xE3F3, 0xE3F4, 0xE3F5, 44 | 0xE3F6, 0xE3F7, 0xE3F8, 0xE3F9, 0xE3FA, 0xE3FB, 0xE3FC, 0xE3FD, 0xE3FE, 0xE3FF, 45 | 0xE400, 0xE401, 0xE402, 0xE403, 0xE404, 0xE405, 0xE406, 0xE407, 0xE408, 0xE409, 46 | 0xE40A, 0xE40B, 0xE40C, 0xE40D, 0xE40E, 0xE40F, 0xE410, 0xE411, 0xE412, 0xE413, 47 | 0xE414, 0xE415, 0xE416, 0xE417, 0xE418, 0xE419, 0xE41A, 0xE41B, 0xE41C, 0xE41D, 48 | 0xE41E, 0xE41F, 0xE420, 0xE421, 0xE422, 0xE423, 0xE424, 0xE425, 0xE426, 0xE427, 49 | 0xE428, 0xE429, 0xE42A, 0xE42B, 0xE42C, 0xE42D, 0xE42E, 0xE42F, 0xE430, 0xE431, 50 | 0xE432, 0xE433, 0xE434, 0xE435, 0xE436, 0xE437, 0xE438, 0xE439, 0xE43A, 0xE43B, 51 | 0xE43C, 0xE43D, 0xE43E, 0xE43F, 0xE440, 0xE441, 0xE442, 0xE443, 0xE444, 0xE445, 52 | 0xE446, 0x9852, 0x9853, 0x9856, 53 | //row 94 54 | 0xE4A8, 0xE4A9, 0xE4AA, 0xE4AB, 0xE4AC, 0xE4AD, 0xE4AE, 0xE4AF, 0xE4B0, 0xE4B1, 55 | 0xE4B2, 0xE4B3, 0xE4B4, 0xE4B5, 0xE4B6, 0xE4B7, 0xE4B8, 0xE4B9, 0xE4BA, 0xE4BB, 56 | 0xE4BC, 0xE4BD, 0xE4BE, 0xE4BF, 0xE4C0, 0xE4C1, 0xE4C2, 0xE4C3, 0xE4C4, 0xE4C5, 57 | 0xE4C6, 0xE4C7, 0xE4C8, 0xE4C9, 0xE4CA, 0xE4CB, 0xE4CC, 0xE4CD, 0xE4CE, 0xE4CF, 58 | 0xE4D0, 0xE4D1, 0xE4D2, 0xE4D3, 0xE4D4, 0xE4D5, 0xE4D6, 0xE4D7, 0xE4D8, 0xE4D9, 59 | 0xE4DA, 0xE4DB, 0xE4DC, 0xE4DD, 0xE4DE, 0xE4DF, 0xE4E0, 0xE4E1, 0xE4E2, 0xE4E3, 60 | 0xE4E4, 0xE4E5, 0xE4E6, 0xE4E7, 0xE4E8, 0xE4E9, 0xE4EA, 0xE4EB, 0xE4EC, 0xE4ED, 61 | 0xE4EE, 0xE4EF, 0xE4F0, 0xE4F1, 0xE4F2, 0xE4F3, 0xE4F4, 0xE4F5, 0xE4F6, 0xE4F7, 62 | 0xE4F8, 0xE4F9, 0xE4FA, 0xE4FB, 0xE4FC, 0xE4FD, 0xE4FE, 0xE4FF, 0xE500, 0xE501, 63 | 0xE502, 0xE503, 0xE504, 0x30FB, 64 | //row 85 65 | 0x3402, 0xE081, 0x4EFD, 0x4EFF, 0x4F9A, 0x4FC9, 0x509C, 0x511E, 0x51BC, 0x351F, 66 | 0x5307, 0x5361, 0x536C, 0x8A79, 0xE084, 0x544D, 0x5496, 0x549C, 0x54A9, 0x550E, 67 | 0x554A, 0x5672, 0x56E4, 0x5733, 0x5734, 0xFA10, 0x5880, 0x59E4, 0x5A23, 0x5A55, 68 | 0x5BEC, 0xFA11, 0x37E2, 0x5EAC, 0x5F34, 0x5F45, 0x5FB7, 0x6017, 0xE087, 0x6130, 69 | 0x6624, 0x66C8, 0x66D9, 0x66FA, 0x66FB, 0xE088, 0xE089, 0x6911, 0x693B, 0x6A45, 70 | 0x6A91, 0x6ADB, 0xE08A, 0xE08B, 0xE08C, 0x6BF1, 0x6CE0, 0x6D2E, 0xFA45, 0x6DBF, 71 | 0x6DCA, 0x6DF8, 0xFA46, 0x6F5E, 0x6FF9, 0x7064, 0xE08D, 0xE08E, 0x7147, 0x71C1, 72 | 0x7200, 0x739F, 0x73A8, 0x73C9, 0x73D6, 0x741B, 0x7421, 0xFA4A, 0x7426, 0x742A, 73 | 0x742C, 0x7439, 0x744B, 0x3EDA, 0x7575, 0x7581, 0x7772, 0x4093, 0x78C8, 0x78E0, 74 | 0x7947, 0x79AE, 0xE091, 0xE092, 75 | //row 86 76 | 0xE093, 0x79DA, 0x7A1E, 0x7B7F, 0x7C31, 0x4264, 0x7D8B, 0x7FA1, 0x8118, 0x813A, 77 | 0xE095, 0x82AE, 0x845B, 0x84DC, 0x84EC, 0x8559, 0x85CE, 0x8755, 0x87EC, 0x880B, 78 | 0x88F5, 0x89D2, 0x8AF6, 0x8DCE, 0x8FBB, 0x8FF6, 0x90DD, 0x9127, 0x912D, 0x91B2, 79 | 0x9233, 0x9288, 0x9321, 0x9348, 0x9592, 0x96DE, 0x9903, 0x9940, 0x9AD9, 0x9BD6, 80 | 0x9DD7, 0x9EB4, 0x9EB5, 0xE096, 0xE097, 0xE098, 0xE099, 0xE09A, 0xE09B, 0xE09C, 81 | 0xE09D, 0xE09E, 0xE09F, 0xE0A0, 0xE0A1, 0xE0A2, 0xE0A3, 0xE0A4, 0xE0A5, 0xE0A6, 82 | 0xE0A7, 0xE0A8, 0xE0A9, 0xE0AA, 0xE0AB, 0xE0AC, 0xE0AD, 0xE0AE, 0xE0AF, 0xE0B0, 83 | 0xE0B1, 0xE0B2, 0xE0B3, 0xE0B4, 0xE0B5, 0xE0B6, 0xE0B7, 0xE0B8, 0xE0B9, 0xE0BA, 84 | 0xE0BB, 0xE0BC, 0xE0BD, 0xE0BE, 0xE0BF, 0xE0C0, 0xE0C1, 0xE0C2, 0xE0C3, 0xE0C4, 85 | 0xE0C5, 0xE0C6, 0xE0C7, 0xE0C8, 86 | }; 87 | 88 | #if 1 89 | #include 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 4 | #include "CaptionDef.h" 5 | #include "ARIB8CharDecode.h" 6 | #include "CaptionMain.h" 7 | #include "Caption.h" 8 | 9 | #ifdef CAPTION_EXPORTS 10 | BOOL APIENTRY DllMain( HMODULE hModule, 11 | DWORD ul_reason_for_call, 12 | LPVOID lpReserved 13 | ) 14 | { 15 | return TRUE; 16 | } 17 | #endif 18 | 19 | typedef enum{ 20 | MODE_ACP, MODE_UTF16, MODE_UTF8 21 | } CP_MODE; 22 | 23 | #define SWITCH_STREAM_MAX 8 24 | 25 | static DWORD g_dwIndex; 26 | static CCaptionMain* g_sysList[SWITCH_STREAM_MAX]; 27 | static char* g_pPoolList[SWITCH_STREAM_MAX]; 28 | static DWORD g_dwPoolSizeList[SWITCH_STREAM_MAX]; 29 | static CP_MODE g_charModeList[SWITCH_STREAM_MAX]; 30 | 31 | static CCaptionMain* g_sys; 32 | static char* g_pPool; 33 | static DWORD g_dwPoolSize; 34 | static CP_MODE g_charMode; 35 | 36 | DWORD WINAPI SwitchStreamCP(DWORD dwIndex) 37 | { 38 | if( dwIndex >= SWITCH_STREAM_MAX ){ 39 | return FALSE; 40 | } 41 | g_sysList[g_dwIndex] = g_sys; 42 | g_pPoolList[g_dwIndex] = g_pPool; 43 | g_dwPoolSizeList[g_dwIndex] = g_dwPoolSize; 44 | g_charModeList[g_dwIndex] = g_charMode; 45 | 46 | g_sys = g_sysList[dwIndex]; 47 | g_pPool = g_pPoolList[dwIndex]; 48 | g_dwPoolSize = g_dwPoolSizeList[dwIndex]; 49 | g_charMode = g_charModeList[dwIndex]; 50 | 51 | g_dwIndex = dwIndex; 52 | return TRUE; 53 | } 54 | 55 | //DLLの初期化 56 | //戻り値:エラーコード 57 | DWORD WINAPI InitializeCP() 58 | { 59 | if( g_sys != NULL ){ 60 | return CP_ERR_INIT; 61 | } 62 | g_sys = new CCaptionMain; 63 | g_charMode = MODE_ACP; 64 | return TRUE; 65 | } 66 | 67 | //DLLの初期化(ワイド文字版) 68 | //戻り値:エラーコード 69 | DWORD WINAPI InitializeCPW() 70 | { 71 | if( g_sys != NULL ){ 72 | return CP_ERR_INIT; 73 | } 74 | g_sys = new CCaptionMain; 75 | g_charMode = MODE_UTF16; 76 | return TRUE; 77 | } 78 | 79 | //DLLの初期化(UTF-8 mark10als互換) 80 | //戻り値:エラーコード 81 | DWORD WINAPI InitializeUNICODE() 82 | { 83 | if( g_sys != NULL ){ 84 | return CP_ERR_INIT; 85 | } 86 | g_sys = new CCaptionMain; 87 | g_charMode = MODE_UTF8; 88 | return TRUE; 89 | } 90 | 91 | //DLLの開放 92 | //戻り値:エラーコード 93 | DWORD WINAPI UnInitializeCP() 94 | { 95 | if( g_sys != NULL ){ 96 | delete g_sys; 97 | g_sys = NULL; 98 | } 99 | if( g_pPool != NULL ){ 100 | delete[] g_pPool; 101 | g_pPool = NULL; 102 | g_dwPoolSize = 0; 103 | } 104 | return TRUE; 105 | } 106 | 107 | DWORD WINAPI AddTSPacketCP(BYTE* pbPacket) 108 | { 109 | if( g_sys == NULL ){ 110 | return CP_ERR_NOT_INIT; 111 | } 112 | return g_sys->AddTSPacket(pbPacket); 113 | } 114 | 115 | DWORD WINAPI ClearCP() 116 | { 117 | if( g_sys == NULL ){ 118 | return CP_ERR_NOT_INIT; 119 | } 120 | return g_sys->Clear(); 121 | } 122 | 123 | DWORD WINAPI GetTagInfoCP(LANG_TAG_INFO_DLL** ppList, DWORD* pdwListCount) 124 | { 125 | if( g_sys == NULL ){ 126 | return CP_ERR_NOT_INIT; 127 | } 128 | return g_sys->GetTagInfo(ppList, pdwListCount); 129 | } 130 | 131 | DWORD WINAPI GetCaptionDataCP(unsigned char ucLangTag, CAPTION_DATA_DLL** ppList, DWORD* pdwListCount) 132 | { 133 | if( g_sys == NULL || (g_charMode != MODE_ACP && g_charMode != MODE_UTF8) ){ 134 | return CP_ERR_NOT_INIT; 135 | } 136 | DWORD dwRet = g_sys->GetCaptionData(ucLangTag, ppList, pdwListCount); 137 | 138 | if( dwRet != FALSE ){ 139 | //変換後の文字列を格納できるだけの領域を確保 140 | DWORD dwNeedSize = 0; 141 | for( size_t i=0; i<*pdwListCount; i++ ){ 142 | for( size_t j=0; j<(*ppList)[i].dwListCount; j++ ){ 143 | dwNeedSize += lstrlenW( static_cast((*ppList)[i].pstCharList[j].pszDecode) ) + 1; 144 | } 145 | } 146 | if( g_charMode == MODE_ACP ){ 147 | if( g_dwPoolSize < dwNeedSize*2+1 ){ 148 | delete[] g_pPool; 149 | g_dwPoolSize = dwNeedSize*2+1; 150 | g_pPool = new char[g_dwPoolSize]; 151 | } 152 | }else{ 153 | if( g_dwPoolSize < dwNeedSize*4+1 ){ 154 | delete[] g_pPool; 155 | g_dwPoolSize = dwNeedSize*4+1; 156 | g_pPool = new char[g_dwPoolSize]; 157 | } 158 | } 159 | 160 | //必要なコードページに変換してバッファを入れ替える 161 | DWORD dwPoolCount = 0; 162 | for( DWORD i=0; i<*pdwListCount; i++ ){ 163 | for( DWORD j=0; j<(*ppList)[i].dwListCount; j++ ){ 164 | if( dwPoolCount >= g_dwPoolSize ){ 165 | dwPoolCount = g_dwPoolSize - 1; 166 | } 167 | LPCWSTR pszSrc = static_cast((*ppList)[i].pstCharList[j].pszDecode); 168 | char *pszDest = g_pPool + dwPoolCount; 169 | int nWritten = WideCharToMultiByte(g_charMode==MODE_ACP?CP_ACP:CP_UTF8, 0, pszSrc, -1, pszDest, g_dwPoolSize - dwPoolCount, NULL, NULL); 170 | 171 | if( nWritten > 0 ){ 172 | dwPoolCount += nWritten; 173 | }else{ 174 | pszDest[0] = '\0'; 175 | dwPoolCount++; 176 | } 177 | (*ppList)[i].pstCharList[j].pszDecode = pszDest; 178 | } 179 | } 180 | } 181 | 182 | return dwRet; 183 | } 184 | 185 | DWORD WINAPI GetCaptionDataCPW(unsigned char ucLangTag, CAPTION_DATA_DLL** ppList, DWORD* pdwListCount) 186 | { 187 | if( g_sys == NULL || g_charMode != MODE_UTF16 ){ 188 | return CP_ERR_NOT_INIT; 189 | } 190 | return g_sys->GetCaptionData(ucLangTag, ppList, pdwListCount); 191 | } 192 | 193 | DWORD WINAPI GetDRCSPatternCP(unsigned char ucLangTag, DRCS_PATTERN_DLL** ppList, DWORD* pdwListCount) 194 | { 195 | if( g_sys == NULL ){ 196 | return CP_ERR_NOT_INIT; 197 | } 198 | return g_sys->GetDRCSPattern(ucLangTag, ppList, pdwListCount); 199 | } 200 | 201 | DWORD WINAPI GetBitmapDataCP(unsigned char ucLangTag, BITMAP_DATA_DLL** ppList, DWORD* pdwListCount) 202 | { 203 | if( g_sys == NULL ){ 204 | return CP_ERR_NOT_INIT; 205 | } 206 | return g_sys->GetBitmapData(ucLangTag, ppList, pdwListCount); 207 | } 208 | 209 | DWORD WINAPI SetGaijiCP(DWORD dwCommand, const WCHAR* pTable, DWORD* pdwTableSize) 210 | { 211 | if( g_sys == NULL ){ 212 | return CP_ERR_NOT_INIT; 213 | } 214 | if( dwCommand == 0 ){ 215 | return g_sys->ResetGaijiTable(pdwTableSize); 216 | }else if( dwCommand == 1 ){ 217 | return g_sys->SetGaijiTable(pTable, pdwTableSize); 218 | } 219 | return FALSE; 220 | } 221 | 222 | DWORD WINAPI GetGaijiCP(DWORD dwCommand, WCHAR* pTable, DWORD* pdwTableSize) 223 | { 224 | if( g_sys == NULL ){ 225 | return CP_ERR_NOT_INIT; 226 | } 227 | if( dwCommand == 1 ){ 228 | return g_sys->GetGaijiTable(pTable, pdwTableSize); 229 | } 230 | return FALSE; 231 | } 232 | -------------------------------------------------------------------------------- /gaiji/GaijiTable_typebank.c: -------------------------------------------------------------------------------- 1 | #if 1 2 | #ifndef WCHAR 3 | #define WCHAR unsigned short 4 | #endif 5 | #endif 6 | 7 | //From: up0511mod "Windows TV ゴシック" 8 | static const WCHAR GaijiTable[]={ 9 | //row 90 10 | 0xE0C9, 0xE0CA, 0xE0CB, 0xE0CC, 0xE0CD, 0xE0CE, 0xE0CF, 0xE0D0, 0xE0D1, 0xE0D2, 11 | 0xE0D3, 0xE0D4, 0xE0D5, 0xE0D6, 0xE0D7, 0xE0D8, 0xE0D9, 0xE0DA, 0xE0DB, 0xE0DC, 12 | 0xE0DD, 0xE0DE, 0xE0DF, 0xE0E0, 0xE0E1, 0xE0E2, 0xE0E3, 0xE0E4, 0xE0E5, 0xE0E6, 13 | 0xE0E7, 0xE0E8, 0xE0E9, 0xE0EA, 0xE0EB, 0xE0EC, 0xE0ED, 0xE0EE, 0xE0EF, 0xE0F0, 14 | 0xE0F1, 0xE0F2, 0xE0F3, 0xE0F4, 0x2491, 0x2492, 0x2493, 0xE0F8, 0xE0F9, 0xE0FA, 15 | 0xE0FB, 0xE0FC, 0xE0FD, 0xE0FE, 0xE0FF, 0xE180, 0xE181, 0xE182, 0xE183, 0xE184, 16 | 0xE185, 0xE186, 0xE187, 0x25A0, 0x25CF, 0xE18A, 0xE18B, 0xE18C, 0xE18D, 0xE18E, 17 | 0xE18F, 0xE190, 0xE191, 0xE192, 0xE193, 0xE194, 0xE195, 0xE196, 0xE197, 0xE198, 18 | 0xE199, 0xE19A, 0x3299, 0xE19C, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 19 | 0x30FB, 0x30FB, 0x30FB, 0x30FB, 20 | //row 91 21 | 0xE1A7, 0xE1A8, 0x25CE, 0x25CB, 0x2A02, 0xE1AC, 0x328B, 0x3012, 0xE1AF, 0xE1B0, 22 | 0xE1B1, 0xE1B2, 0x534D, 0xE1B4, 0xE1B5, 0x2234, 0x2668, 0xE1B8, 0xE1B9, 0xE1BA, 23 | 0x2693, 0x2708, 0x25B2, 0xE1BE, 0xE1BF, 0xE1C0, 0xE1C1, 0xE1C2, 0xE1C3, 0x24B9, 24 | 0x24C8, 0xE1C6, 0xE1C7, 0xE1C8, 0xE1C9, 0xE1CA, 0xE1CB, 0xE1CC, 0xE1CD, 0xE1CE, 25 | 0xE1CF, 0xE1D0, 0x260E, 0xE1D2, 0xE1D3, 0xE1D4, 0xE1D5, 0xE1D6, 0xE1D7, 0x30FB, 26 | 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 27 | 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 28 | 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 29 | 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 0x30FB, 30 | 0x30FB, 0x30FB, 0x30FB, 0x30FB, 31 | //row 92 32 | 0x27A1, 0x2B05, 0x2B06, 0x2B07, 0x2B2F, 0x2B2E, 0x5E74, 0x6708, 0x65E5, 0x5186, 33 | 0x33A1, 0x33A5, 0x339D, 0x33A0, 0x33A4, 0xE28F, 0x2488, 0x2489, 0x248A, 0x248B, 34 | 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x6C0F, 0x526F, 0x5143, 0x6545, 0x524D, 35 | 0x65B0, 0xE296, 0xE297, 0xE298, 0xE299, 0xE29A, 0xE29B, 0xE29C, 0xE29D, 0xE29E, 36 | 0xE29F, 0x3233, 0x3236, 0x3232, 0x3231, 0x3239, 0xE2A0, 0x25B6, 0x25C0, 0x3016, 37 | 0x3017, 0xE2A1, 0x00B2, 0x00B3, 0xE2A4, 0xE2A5, 0xE2A6, 0xE2A7, 0xE2A8, 0xE2A9, 38 | 0xE2AA, 0xE2AB, 0xE2AC, 0xE2AD, 0xE2AE, 0xE2AF, 0xE2B0, 0xE2B1, 0xE2B2, 0xE2B3, 39 | 0xE2B4, 0xE2B5, 0xE2B6, 0xE2B7, 0xE2B8, 0xE2B9, 0xE2BA, 0xE2BB, 0xE2BC, 0xE2BD, 40 | 0xE2BE, 0xE2BF, 0xE2C0, 0xE2C1, 0xE2C2, 0xE3A7, 0xE3A8, 0xE2C3, 0xE2C4, 0xE2C5, 41 | 0x213B, 0x30FB, 0x30FB, 0x30FB, 42 | //row 93 43 | 0x322A, 0x322B, 0x322C, 0x322D, 0x322E, 0x322F, 0x3230, 0x3237, 0x337E, 0x337D, 44 | 0x337C, 0x337B, 0x2116, 0x2121, 0x3036, 0xE2CC, 0xE2CD, 0xE2CE, 0xE2CF, 0xE2D0, 45 | 0xE2D1, 0xE2D2, 0xE2D3, 0xE2D4, 0xE2D5, 0xE2D6, 0xE2D7, 0xE2D8, 0xE2D9, 0xE2DA, 46 | 0xE2DB, 0xE2DC, 0xE2DD, 0xE2DE, 0xE2DF, 0xE2E0, 0xE2E1, 0xE2E2, 0x2113, 0x338F, 47 | 0x3390, 0x33CA, 0x339E, 0x33A2, 0x3371, 0x30FB, 0x30FB, 0x00BD, 0xE2E5, 0x2153, 48 | 0x2154, 0x00BC, 0x00BE, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215A, 0xE2E6, 49 | 0x215B, 0xE2E7, 0xE2E8, 0x2600, 0x2601, 0x2602, 0x2603, 0x2616, 0x2617, 0xE2EC, 50 | 0xE2ED, 0x2666, 0x2665, 0x2663, 0x2660, 0xE2EE, 0xE2EF, 0x203C, 0x2049, 0xE2F1, 51 | 0x2614, 0xE2F3, 0x2603, 0xE2F5, 0x2607, 0x2608, 0x30FB, 0xE2F9, 0xE2FA, 0x266C, 52 | 0x260E, 0x30FB, 0x30FB, 0x30FB, 53 | //row 94 54 | 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 55 | 0x216A, 0x216B, 0x2470, 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477, 56 | 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x3251, 0x3252, 57 | 0x3253, 0x3254, 0xE383, 0xE384, 0xE385, 0xE386, 0xE387, 0xE388, 0xE389, 0xE38A, 58 | 0xE38B, 0xE38C, 0xE38D, 0xE38E, 0xE38F, 0xE390, 0xE391, 0xE392, 0xE393, 0xE394, 59 | 0xE395, 0xE396, 0xE397, 0xE398, 0xE399, 0xE39A, 0xE39B, 0xE39C, 0x3255, 0x3256, 60 | 0x3257, 0x3258, 0x3259, 0x325A, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 61 | 0x2466, 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, 0x246F, 62 | 0x2776, 0x2777, 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F, 63 | 0x24EB, 0x24EC, 0x325B, 0x30FB, 64 | //row 85 65 | 0x3402, /*(*/0xD840, 0xDD58/*)*/, 0x4EFD, 0x4EFF, 0x4F9A, 0x4FC9, 0x509C, 0x511E, 0x51BC, 0x351F, 66 | 0x5307, 0x5361, 0x536C, 0x8A79, /*(*/0xD842, 0xDFB7/*)*/, 0x544D, 0x5496, 0x549C, 0x54A9, 0x550E, 67 | 0x554A, 0x5672, 0x56E4, 0x5733, 0x5734, 0xFA10, 0x5880, 0x59E4, 0x5A23, 0x5A55, 68 | 0x5BEC, 0xFA11, 0x37E2, 0x5EAC, 0x5F34, 0x5F45, 0x5FB7, 0x6017, 0xE087, 0x6130, 69 | 0x6624, 0x66C8, 0x66D9, 0x66FA, 0x66FB, 0xE088, 0xE089, 0x6911, 0x693B, 0x6A45, 70 | 0x6A91, 0x6ADB, /*(*/0xD84C, 0xDFCC/*)*/, /*(*/0xD84C, 0xDFFE/*)*/, /*(*/0xD84D, 0xDDC4/*)*/, 0x6BF1, 0x6CE0, 0x6D2E, 0xFA45, 0x6DBF, 71 | 0x6DCA, 0x6DF8, 0xFA46, 0x6F5E, 0x6FF9, 0x7064, 0xE08D, /*(*/0xD850, 0xDEEE/*)*/, 0x7147, 0x71C1, 72 | 0x7200, 0x739F, 0x73A8, 0x73C9, 0x73D6, 0x741B, 0x7421, 0xFA4A, 0x7426, 0x742A, 73 | 0x742C, 0x7439, 0x744B, 0x3EDA, 0x7575, 0x7581, 0x7772, 0x4093, 0x78C8, 0x78E0, 74 | 0x7947, 0x79AE, 0xE091, 0xE092, 75 | //row 86 76 | 0xE093, 0x79DA, 0x7A1E, 0x7B7F, 0x7C31, 0x4264, 0x7D8B, 0x7FA1, 0x8118, 0x813A, 77 | 0xE095, 0x82AE, 0x845B, 0x84DC, 0x84EC, 0x8559, 0x85CE, 0x8755, 0x87EC, 0x880B, 78 | 0x88F5, 0x89D2, 0x8AF6, 0x8DCE, 0x8FBB, 0x8FF6, 0x90DD, 0x9127, 0x912D, 0x91B2, 79 | 0x9233, 0x9288, 0x9321, 0x9348, 0x9592, 0x96DE, 0x9903, 0x9940, 0x9AD9, 0x9BD6, 80 | 0x9DD7, 0x9EB4, 0x9EB5, 0xE096, 0xE097, 0xE098, 0xE099, 0xE09A, 0xE09B, 0xE09C, 81 | 0xE09D, 0xE09E, 0xE09F, 0xE0A0, 0xE0A1, 0xE0A2, 0xE0A3, 0xE0A4, 0xE0A5, 0xE0A6, 82 | 0xE0A7, 0xE0A8, 0xE0A9, 0xE0AA, 0xE0AB, 0xE0AC, 0xE0AD, 0xE0AE, 0xE0AF, 0xE0B0, 83 | 0xE0B1, 0xE0B2, 0xE0B3, 0xE0B4, 0xE0B5, 0xE0B6, 0xE0B7, 0xE0B8, 0xE0B9, 0xE0BA, 84 | 0xE0BB, 0xE0BC, 0xE0BD, 0xE0BE, 0xE0BF, 0xE0C0, 0xE0C1, 0xE0C2, 0xE0C3, 0xE0C4, 85 | 0xE0C5, 0xE0C6, 0xE0C7, 0xE0C8, 86 | }; 87 | 88 | #if 1 89 | #include 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 5 | #include 6 | #include 7 | #include "../Caption_src/CaptionDef.h" 8 | 9 | #ifdef _DEBUG 10 | #define DEBUG_OUT(x) ::OutputDebugString(x) 11 | #define DDEBUG_OUT 12 | #else 13 | #define DEBUG_OUT(x) 14 | #endif 15 | 16 | typedef std::basic_string tstring; 17 | 18 | static const size_t READ_FILE_MAX_SIZE = 64 * 1024 * 1024; 19 | 20 | std::vector GetPrivateProfileSectionBuffer(LPCTSTR lpAppName, LPCTSTR lpFileName); 21 | void GetBufferedProfileString(LPCTSTR lpBuff, LPCTSTR lpKeyName, LPCTSTR lpDefault, LPTSTR lpReturnedString, DWORD nSize); 22 | int GetBufferedProfileInt(LPCTSTR lpBuff, LPCTSTR lpKeyName, int nDefault); 23 | BOOL WritePrivateProfileInt(LPCTSTR lpAppName, LPCTSTR lpKeyName, int value, LPCTSTR lpFileName); 24 | DWORD GetLongModuleFileName(HMODULE hModule, LPTSTR lpFileName, DWORD nSize); 25 | bool IsWindows7OrLater(); 26 | std::vector ReadTextFileToEnd(LPCTSTR fileName, DWORD dwShareMode); 27 | bool IsNonSpacingCharacter(TCHAR c); 28 | int StrlenWoLoSurrogateOrNonSpacing(LPCTSTR str); 29 | bool HexStringToByteArray(LPCTSTR str, BYTE *pDest, int destLen); 30 | void AddToComboBoxList(HWND hDlg, int id, const LPCTSTR *pList); 31 | void AddFaceNameToComboBoxList(HWND hDlg, int id); 32 | inline bool Is1SegPmtPid(int pid) { return 0x1FC8 <= pid && pid <= 0x1FCF; } 33 | 34 | static const DWORD PCR_45KHZ_PER_MSEC = 45; 35 | 36 | #define H_262_VIDEO 0x02 37 | #define PES_PRIVATE_DATA 0x06 38 | #define AVC_VIDEO 0x1B 39 | #define H_265_VIDEO 0x24 40 | 41 | typedef struct { 42 | int sync; 43 | int transport_error_indicator; 44 | int payload_unit_start_indicator; 45 | int transport_priority; 46 | int pid; 47 | int transport_scrambling_control; 48 | int adaptation_field_control; 49 | int continuity_counter; 50 | } TS_HEADER; 51 | 52 | typedef struct { 53 | int adaptation_field_length; 54 | int discontinuity_counter; 55 | int random_access_indicator; 56 | int elementary_stream_priority_indicator; 57 | int pcr_flag; 58 | int opcr_flag; 59 | int splicing_point_flag; 60 | int transport_private_data_flag; 61 | int adaptation_field_extension_flag; 62 | unsigned int pcr_45khz; 63 | } ADAPTATION_FIELD; // (partial) 64 | 65 | typedef struct { 66 | int pointer_field; 67 | int table_id; 68 | int section_length; 69 | int version_number; 70 | int current_next_indicator; 71 | int continuity_counter; 72 | int data_count; 73 | unsigned char data[1025]; 74 | } PSI; 75 | 76 | typedef struct { 77 | int pmt_pid; 78 | int program_number; 79 | int version_number; 80 | int pcr_pid; 81 | int pid_count; 82 | unsigned char stream_type[256]; 83 | unsigned short pid[256]; // PESの一部に限定 84 | unsigned char component_tag[256]; 85 | PSI psi; 86 | } PMT; 87 | 88 | typedef struct { 89 | int transport_stream_id; 90 | int version_number; 91 | std::vector pmt; 92 | PSI psi; 93 | } PAT; 94 | 95 | typedef struct { 96 | int packet_start_code_prefix; 97 | int stream_id; 98 | int pes_packet_length; 99 | int pts_dts_flags; 100 | unsigned int pts_45khz; 101 | unsigned int dts_45khz; 102 | } PES_HEADER; // (partial) 103 | 104 | void extract_pat(PAT *pat, const unsigned char *payload, int payload_size, int unit_start, int counter); 105 | void extract_pmt(PMT *pmt, const unsigned char *payload, int payload_size, int unit_start, int counter); 106 | void extract_pes_header(PES_HEADER *dst, const unsigned char *payload, int payload_size/*, int stream_type*/); 107 | void extract_adaptation_field(ADAPTATION_FIELD *dst, const unsigned char *data); 108 | 109 | inline void extract_ts_header(TS_HEADER *dst, const unsigned char *packet) 110 | { 111 | dst->sync = packet[0]; 112 | dst->transport_error_indicator = packet[1] & 0x80; 113 | dst->payload_unit_start_indicator = packet[1] & 0x40; 114 | dst->transport_priority = packet[1] & 0x20; 115 | dst->pid = ((packet[1] & 0x1f) << 8) | packet[2]; 116 | dst->transport_scrambling_control = (packet[3] >> 6) & 0x03; 117 | dst->adaptation_field_control = (packet[3] >> 4) & 0x03; 118 | dst->continuity_counter = packet[3] & 0x0f; 119 | } 120 | 121 | class recursive_mutex_ 122 | { 123 | public: 124 | recursive_mutex_() { ::InitializeCriticalSection(&m_cs); } 125 | ~recursive_mutex_() { ::DeleteCriticalSection(&m_cs); } 126 | void lock() { ::EnterCriticalSection(&m_cs); } 127 | void unlock() { ::LeaveCriticalSection(&m_cs); } 128 | private: 129 | recursive_mutex_(const recursive_mutex_&); 130 | recursive_mutex_ &operator=(const recursive_mutex_&); 131 | CRITICAL_SECTION m_cs; 132 | }; 133 | 134 | class lock_recursive_mutex 135 | { 136 | public: 137 | lock_recursive_mutex(recursive_mutex_ &mtx) : m_mtx(mtx) { m_mtx.lock(); } 138 | ~lock_recursive_mutex() { m_mtx.unlock(); } 139 | private: 140 | lock_recursive_mutex(const lock_recursive_mutex&); 141 | lock_recursive_mutex &operator=(const lock_recursive_mutex&); 142 | recursive_mutex_ &m_mtx; 143 | }; 144 | 145 | bool CompareLogFont(const LOGFONT &lf1, const LOGFONT &lf2); 146 | bool BrowseFolderDialog(HWND hwndOwner, TCHAR (&szDirectory)[MAX_PATH], LPCTSTR pszTitle); 147 | 148 | bool SaveImageAsBmp(LPCTSTR fileName, const BITMAPINFOHEADER &bih, const void *pBits); 149 | bool SaveImageAsPngOrJpeg(HMODULE hTVTestImage, LPCTSTR fileName, bool pngOrJpeg, int compressionLevelOrQuality, const BITMAPINFOHEADER &bih, const void *pBits); 150 | HBITMAP LoadAribPngAsDIBSection(HMODULE hTVTestImage, const BYTE *pPngData, size_t dataSize, void **ppBits, RECT *pCropRect = nullptr); 151 | HBITMAP CopyDIBSectionWithTransparency(HBITMAP hbmSrc, const CLUT_DAT_DLL *pTransparentColorList, size_t colorLen, void **ppBits); 152 | 153 | bool StretchDrawBitmap(HDC hdc, int x, int y, int width, int height, HBITMAP hbm, int stretchMode = STRETCH_HALFTONE, int halfSizeStretchMode = 0); 154 | 155 | namespace DrawUtil { 156 | 157 | bool Fill(HDC hdc,const RECT *pRect,COLORREF Color); 158 | 159 | } // namespace DrawUtil 160 | 161 | #endif // INCLUDE_UTIL_H 162 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | ## 4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 5 | 6 | # User-specific files 7 | *.suo 8 | *.user 9 | *.userosscache 10 | *.sln.docstates 11 | 12 | # User-specific files (MonoDevelop/Xamarin Studio) 13 | *.userprefs 14 | 15 | # Build results 16 | [Dd]ebug/ 17 | [Dd]ebugPublic/ 18 | [Rr]elease/ 19 | [Rr]elease_[Ss]tatic/ 20 | [Rr]elease_MD/ 21 | [Rr]eleases/ 22 | [Ww]in32/ 23 | x64/ 24 | x86/ 25 | bld/ 26 | [Bb]in/ 27 | [Oo]bj/ 28 | [Ll]og/ 29 | 30 | # Visual Studio 2015 cache/options directory 31 | .vs/ 32 | # Uncomment if you have tasks that create the project's static files in wwwroot 33 | #wwwroot/ 34 | 35 | # MSTest test Results 36 | [Tt]est[Rr]esult*/ 37 | [Bb]uild[Ll]og.* 38 | 39 | # NUNIT 40 | *.VisualState.xml 41 | TestResult.xml 42 | 43 | # Build Results of an ATL Project 44 | [Dd]ebugPS/ 45 | [Rr]eleasePS/ 46 | dlldata.c 47 | 48 | # Benchmark Results 49 | BenchmarkDotNet.Artifacts/ 50 | 51 | # .NET Core 52 | project.lock.json 53 | project.fragment.lock.json 54 | artifacts/ 55 | **/Properties/launchSettings.json 56 | 57 | *_i.c 58 | *_p.c 59 | *_i.h 60 | *.ilk 61 | *.meta 62 | *.obj 63 | *.pch 64 | *.pdb 65 | *.pgc 66 | *.pgd 67 | *.rsp 68 | *.sbr 69 | *.tlb 70 | *.tli 71 | *.tlh 72 | *.tmp 73 | *.tmp_proj 74 | *.log 75 | *.vspscc 76 | *.vssscc 77 | .builds 78 | *.pidb 79 | *.svclog 80 | *.scc 81 | 82 | # Chutzpah Test files 83 | _Chutzpah* 84 | 85 | # Visual C++ cache files 86 | ipch/ 87 | *.aps 88 | *.ncb 89 | *.opendb 90 | *.opensdf 91 | *.sdf 92 | *.cachefile 93 | *.VC.db 94 | *.VC.VC.opendb 95 | 96 | # Visual Studio profiler 97 | *.psess 98 | *.vsp 99 | *.vspx 100 | *.sap 101 | 102 | # Visual Studio Trace Files 103 | *.e2e 104 | 105 | # TFS 2012 Local Workspace 106 | $tf/ 107 | 108 | # Guidance Automation Toolkit 109 | *.gpState 110 | 111 | # ReSharper is a .NET coding add-in 112 | _ReSharper*/ 113 | *.[Rr]e[Ss]harper 114 | *.DotSettings.user 115 | 116 | # JustCode is a .NET coding add-in 117 | .JustCode 118 | 119 | # TeamCity is a build add-in 120 | _TeamCity* 121 | 122 | # DotCover is a Code Coverage Tool 123 | *.dotCover 124 | 125 | # AxoCover is a Code Coverage Tool 126 | .axoCover/* 127 | !.axoCover/settings.json 128 | 129 | # Visual Studio code coverage results 130 | *.coverage 131 | *.coveragexml 132 | 133 | # NCrunch 134 | _NCrunch_* 135 | .*crunch*.local.xml 136 | nCrunchTemp_* 137 | 138 | # MightyMoose 139 | *.mm.* 140 | AutoTest.Net/ 141 | 142 | # Web workbench (sass) 143 | .sass-cache/ 144 | 145 | # Installshield output folder 146 | [Ee]xpress/ 147 | 148 | # DocProject is a documentation generator add-in 149 | DocProject/buildhelp/ 150 | DocProject/Help/*.HxT 151 | DocProject/Help/*.HxC 152 | DocProject/Help/*.hhc 153 | DocProject/Help/*.hhk 154 | DocProject/Help/*.hhp 155 | DocProject/Help/Html2 156 | DocProject/Help/html 157 | 158 | # Click-Once directory 159 | publish/ 160 | 161 | # Publish Web Output 162 | *.[Pp]ublish.xml 163 | *.azurePubxml 164 | # Note: Comment the next line if you want to checkin your web deploy settings, 165 | # but database connection strings (with potential passwords) will be unencrypted 166 | *.pubxml 167 | *.publishproj 168 | 169 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 170 | # checkin your Azure Web App publish settings, but sensitive information contained 171 | # in these scripts will be unencrypted 172 | PublishScripts/ 173 | 174 | # NuGet Packages 175 | *.nupkg 176 | # The packages folder can be ignored because of Package Restore 177 | **/packages/* 178 | # except build/, which is used as an MSBuild target. 179 | !**/packages/build/ 180 | # Uncomment if necessary however generally it will be regenerated when needed 181 | #!**/packages/repositories.config 182 | # NuGet v3's project.json files produces more ignorable files 183 | *.nuget.props 184 | *.nuget.targets 185 | 186 | # Microsoft Azure Build Output 187 | csx/ 188 | *.build.csdef 189 | 190 | # Microsoft Azure Emulator 191 | ecf/ 192 | rcf/ 193 | 194 | # Windows Store app package directories and files 195 | AppPackages/ 196 | BundleArtifacts/ 197 | Package.StoreAssociation.xml 198 | _pkginfo.txt 199 | *.appx 200 | 201 | # Visual Studio cache files 202 | # files ending in .cache can be ignored 203 | *.[Cc]ache 204 | # but keep track of directories ending in .cache 205 | !*.[Cc]ache/ 206 | 207 | # Others 208 | ClientBin/ 209 | ~$* 210 | *~ 211 | *.dbmdl 212 | *.dbproj.schemaview 213 | *.jfm 214 | *.pfx 215 | *.publishsettings 216 | orleans.codegen.cs 217 | 218 | # Since there are multiple workflows, uncomment next line to ignore bower_components 219 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 220 | #bower_components/ 221 | 222 | # RIA/Silverlight projects 223 | Generated_Code/ 224 | 225 | # Backup & report files from converting an old project file 226 | # to a newer Visual Studio version. Backup files are not needed, 227 | # because we have git ;-) 228 | _UpgradeReport_Files/ 229 | Backup*/ 230 | UpgradeLog*.XML 231 | UpgradeLog*.htm 232 | 233 | # SQL Server files 234 | *.mdf 235 | *.ldf 236 | *.ndf 237 | 238 | # Business Intelligence projects 239 | *.rdl.data 240 | *.bim.layout 241 | *.bim_*.settings 242 | 243 | # Microsoft Fakes 244 | FakesAssemblies/ 245 | 246 | # GhostDoc plugin setting file 247 | *.GhostDoc.xml 248 | 249 | # Node.js Tools for Visual Studio 250 | .ntvs_analysis.dat 251 | node_modules/ 252 | 253 | # Typescript v1 declaration files 254 | typings/ 255 | 256 | # Visual Studio 6 build log 257 | *.plg 258 | 259 | # Visual Studio 6 workspace options file 260 | *.opt 261 | 262 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) 263 | *.vbw 264 | 265 | # Visual Studio LightSwitch build output 266 | **/*.HTMLClient/GeneratedArtifacts 267 | **/*.DesktopClient/GeneratedArtifacts 268 | **/*.DesktopClient/ModelManifest.xml 269 | **/*.Server/GeneratedArtifacts 270 | **/*.Server/ModelManifest.xml 271 | _Pvt_Extensions 272 | 273 | # Paket dependency manager 274 | .paket/paket.exe 275 | paket-files/ 276 | 277 | # FAKE - F# Make 278 | .fake/ 279 | 280 | # JetBrains Rider 281 | .idea/ 282 | *.sln.iml 283 | 284 | # CodeRush 285 | .cr/ 286 | 287 | # Python Tools for Visual Studio (PTVS) 288 | __pycache__/ 289 | *.pyc 290 | 291 | # Cake - Uncomment if you are using it 292 | # tools/** 293 | # !tools/packages.config 294 | 295 | # Tabs Studio 296 | *.tss 297 | 298 | # Telerik's JustMock configuration file 299 | *.jmconfig 300 | 301 | # BizTalk build output 302 | *.btp.cs 303 | *.btm.cs 304 | *.odx.cs 305 | *.xsd.cs 306 | 307 | # OpenCover UI analysis results 308 | OpenCover/ 309 | -------------------------------------------------------------------------------- /src/TVCaption2.h: -------------------------------------------------------------------------------- 1 | #ifndef INCLUDE_TV_CAPTION2_H 2 | #define INCLUDE_TV_CAPTION2_H 3 | 4 | // プラグインクラス 5 | class CTVCaption2 : public TVTest::CTVTestPlugin 6 | { 7 | // 作成できるOSDの最大数 8 | static const size_t OSD_MAX_CREATE_NUM = 50; 9 | // 事前に作成しておくOSDの数(作成時にウィンドウが前面にくるので、気になるなら増やす) 10 | static const size_t OSD_PRE_CREATE_NUM = 12; 11 | // 設定値の最大読み込み文字数 12 | static const int SETTING_VALUE_MAX = 2048; 13 | static const int GAIJI_TABLE_SIZE = G_CELL_SIZE * 7; 14 | static const int FLASHING_INTERVAL = 500; 15 | static const int TXGROUP_NORMAL = 1; 16 | static const int TXGROUP_FLASHING = 3; 17 | static const int TXGROUP_IFLASHING = 5; 18 | static const int STREAM_MAX = 2; 19 | enum STREAM_INDEX { 20 | STREAM_CAPTION, 21 | STREAM_SUPERIMPOSE, 22 | }; 23 | struct DRCS_PAIR { 24 | BYTE md5[16]; 25 | TCHAR str[4]; 26 | struct COMPARE { 27 | bool operator()(const DRCS_PAIR &l, const DRCS_PAIR &r) { return ::memcmp(l.md5, r.md5, 16) < 0; } 28 | }; 29 | }; 30 | struct SHIFT_SMALL_STATE { 31 | int posY; 32 | int shiftH; 33 | int dirH; 34 | bool fSmall; 35 | SHIFT_SMALL_STATE() : posY(-1), shiftH(0), dirH(0) {} 36 | }; 37 | public: 38 | // CTVTestPlugin 39 | CTVCaption2(); 40 | ~CTVCaption2(); 41 | bool GetPluginInfo(TVTest::PluginInfo *pInfo); 42 | bool Initialize(); 43 | bool Finalize(); 44 | private: 45 | HWND GetFullscreenWindow(); 46 | HWND FindVideoContainer(); 47 | bool GetVideoContainerLayout(HWND hwndContainer, RECT *pRect, RECT *pVideoRect = nullptr, RECT *pExVideoRect = nullptr); 48 | bool GetVideoSurfaceRect(HWND hwndContainer, RECT *pVideoRect = nullptr, RECT *pExVideoRect = nullptr); 49 | int GetVideoPid(); 50 | bool ConfigureGaijiTable(LPCTSTR tableName, std::vector *pDrcsStrMap, WCHAR (*pCustomTable)[2]); 51 | bool EnablePlugin(bool fEnable); 52 | void LoadSettings(); 53 | void SaveSettings() const; 54 | void SwitchSettings(int specIndex = -1); 55 | void AddSettings(); 56 | void DeleteSettings(); 57 | int GetSettingsCount() const; 58 | bool PlayRomSound(int index) const; 59 | static LRESULT CALLBACK EventCallback(UINT Event, LPARAM lParam1, LPARAM lParam2, void *pClientData); 60 | bool LoadTVTestImageLibrary(); 61 | void OnCapture(bool fSaveToFile); 62 | static BOOL CALLBACK WindowMsgCallback(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult, void *pUserData); 63 | void HideOsds(STREAM_INDEX index); 64 | void DeleteTextures(); 65 | void HideAllOsds(); 66 | void DestroyOsds(); 67 | void AddOsdText(CPseudoOSD *pOsd, LPCTSTR text, int width, int originalWidth, int charWidth, int charHeight, 68 | const RECT &rcFontAdjust, LPCTSTR faceName, const CAPTION_CHAR_DATA_DLL &style) const; 69 | CPseudoOSD &CreateOsd(STREAM_INDEX index, HWND hwndContainer, int charHeight, int nomalHeight, const CAPTION_CHAR_DATA_DLL &style); 70 | void DryrunCaptionData(const CAPTION_DATA_DLL &caption, SHIFT_SMALL_STATE &ssState); 71 | void SetOsdWindowOffsetAndScale(CPseudoOSD *pOsd, const RECT &rcVideo) const; 72 | void ShowCaptionData(STREAM_INDEX index, const CAPTION_DATA_DLL &caption, bool fLangCodeJpn, 73 | const DRCS_PATTERN_DLL *pDrcsList, DWORD drcsCount, 74 | SHIFT_SMALL_STATE &ssState, HWND hwndContainer, const RECT &rcVideo); 75 | void ShowBitmapData(STREAM_INDEX index, const BITMAP_DATA_DLL &bitmapData, HWND hwndContainer, const RECT &rcVideo); 76 | static LRESULT CALLBACK PaintingWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 77 | void ProcessCaption(CCaptionManager *pCaptionManager, const CAPTION_DATA_DLL *pCaptionForTest = nullptr); 78 | void OnSize(STREAM_INDEX index, bool fFast = false); 79 | void OnFullscreenChange(); 80 | static BOOL CALLBACK StreamCallback(BYTE *pData, void *pClientData); 81 | static LRESULT CALLBACK VideoStreamCallback(DWORD Format, const void *pData, SIZE_T Size, void *pClientData); 82 | void ProcessPacket(BYTE *pPacket); 83 | bool PluginSettings(HWND hwndOwner); 84 | static INT_PTR CALLBACK SettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 85 | static INT_PTR CALLBACK TVTestSettingsDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam, void *pClientData); 86 | void InitializeSettingsDlg(HWND hDlg); 87 | INT_PTR ProcessSettingsDlg(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 88 | 89 | // 設定 90 | tstring m_iniPath; 91 | tstring m_captureFolder; 92 | tstring m_captureFileName; 93 | tstring m_captureFileNameFormat; 94 | TCHAR m_szCaptureSaveFormat[8]; 95 | int m_jpegQuality; 96 | int m_pngCompressionLevel; 97 | TCHAR m_szFaceName[LF_FACESIZE]; 98 | TCHAR m_szGaijiFaceName[LF_FACESIZE]; 99 | TCHAR m_szGaijiTableName[LF_FACESIZE]; 100 | WCHAR m_customGaijiTable[GAIJI_TABLE_SIZE][2]; 101 | std::vector m_drcsStrMap; 102 | int m_settingsIndex; 103 | int m_paintingMethod; 104 | int m_showFlags[STREAM_MAX]; 105 | int m_delayTime[STREAM_MAX]; 106 | bool m_fIgnorePts; 107 | bool m_fEnTextColor; 108 | bool m_fEnBackColor; 109 | COLORREF m_textColor; 110 | COLORREF m_backColor; 111 | int m_textOpacity; 112 | int m_backOpacity; 113 | int m_vertAntiAliasing; 114 | RECT m_rcAdjust; 115 | RECT m_rcGaijiAdjust; 116 | int m_strokeWidth; 117 | int m_ornStrokeWidth; 118 | int m_strokeSmoothLevel; 119 | int m_strokeByDilate; 120 | int m_paddingWidth; 121 | int m_avoidHalfFlags; 122 | bool m_fIgnoreSmall; 123 | bool m_fShiftSmall; 124 | bool m_fCentering; 125 | bool m_fShrinkSDScale; 126 | int m_adjustViewX; 127 | int m_adjustViewY; 128 | tstring m_romSoundList; 129 | bool m_fInitializeSettingsDlg; 130 | 131 | // コマンド 132 | HBITMAP m_hbmSwitchLang; 133 | HBITMAP m_hbmSwitchSetting; 134 | 135 | // キャプチャなど 136 | bool m_fDoneLoadTVTestImage; 137 | HMODULE m_hTVTestImage; 138 | 139 | // 字幕描画 140 | HWND m_hwndPainting; 141 | HWND m_hwndContainer; 142 | std::vector> m_pOsdList[STREAM_MAX]; 143 | size_t m_osdShowCount[STREAM_MAX]; 144 | size_t m_osdPrepareCount[STREAM_MAX]; 145 | bool m_fOsdClear[STREAM_MAX]; 146 | bool m_fNeedtoShow; 147 | bool m_fFlashingFlipFlop; 148 | bool m_fProfileC; 149 | SHIFT_SMALL_STATE m_shiftSmallState[STREAM_MAX]; 150 | 151 | // 字幕解析 152 | CCaptionDll m_captionDll; 153 | CCaptionManager m_caption1Manager; 154 | CCaptionManager m_caption2Manager; 155 | 156 | // ストリーム解析 157 | recursive_mutex_ m_streamLock; 158 | DWORD m_procCapTick; 159 | bool m_fResetPat; 160 | PAT m_pat; 161 | int m_videoPid; 162 | int m_pcrPid; 163 | int m_caption1Pid; 164 | int m_caption2Pid; 165 | 166 | // レンダラで合成する(疑似でない)OSD 167 | COsdCompositor m_osdCompositor; 168 | 169 | // ビューアPCRの推定用 170 | CViewerClockEstimator m_viewerClockEstimator; 171 | }; 172 | 173 | #endif // INCLUDE_TV_CAPTION2_H 174 | -------------------------------------------------------------------------------- /Caption_src/ARIB8CharDecode.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | using std::wstring; 7 | using std::vector; 8 | 9 | //文字符号集合 10 | //Gセット 11 | #define MF_JIS_KANJI1 0x39 //JIS互換漢字1面 12 | #define MF_JIS_KANJI2 0x3A //JIS互換漢字2面 13 | #define MF_KIGOU 0x3B //追加記号 14 | #define MF_ASCII 0x4A //英数 15 | #define MF_HIRA 0x30 //平仮名 16 | #define MF_KANA 0x31 //片仮名 17 | #define MF_KANJI 0x42 //漢字 18 | #define MF_MOSAIC_A 0x32 //モザイクA 19 | #define MF_MOSAIC_B 0x33 //モザイクB 20 | #define MF_MOSAIC_C 0x34 //モザイクC 21 | #define MF_MOSAIC_D 0x35 //モザイクD 22 | #define MF_PROP_ASCII 0x36 //プロポーショナル英数 23 | #define MF_PROP_HIRA 0x37 //プロポーショナル平仮名 24 | #define MF_PROP_KANA 0x38 //プロポーショナル片仮名 25 | #define MF_JISX_KANA 0x49 //JIX X0201片仮名 26 | #define MF_LATIN_EXTENSION 0x4B //ラテン文字拡張 27 | #define MF_LATIN_SPECIAL 0x4C //ラテン文字特殊 28 | //DRCS 29 | #define MF_DRCS_0 0x40 //DRCS-0 30 | #define MF_DRCS_1 0x41 //DRCS-1 31 | #define MF_DRCS_2 0x42 //DRCS-2 32 | #define MF_DRCS_3 0x43 //DRCS-3 33 | #define MF_DRCS_4 0x44 //DRCS-4 34 | #define MF_DRCS_5 0x45 //DRCS-5 35 | #define MF_DRCS_6 0x46 //DRCS-6 36 | #define MF_DRCS_7 0x47 //DRCS-7 37 | #define MF_DRCS_8 0x48 //DRCS-8 38 | #define MF_DRCS_9 0x49 //DRCS-9 39 | #define MF_DRCS_10 0x4A //DRCS-10 40 | #define MF_DRCS_11 0x4B //DRCS-11 41 | #define MF_DRCS_12 0x4C //DRCS-12 42 | #define MF_DRCS_13 0x4D //DRCS-13 43 | #define MF_DRCS_14 0x4E //DRCS-14 44 | #define MF_DRCS_15 0x4F //DRCS-15 45 | #define MF_MACRO 0x70 //マクロ 46 | 47 | //符号集合の分類 48 | #define MF_MODE_G 1 //Gセット 49 | #define MF_MODE_DRCS 2 //DRCS 50 | 51 | struct CAPTION_CHAR_DATA{ 52 | wstring strDecode; 53 | CP_STRING_SIZE emCharSizeMode; 54 | 55 | CLUT_DAT_DLL stCharColor; 56 | CLUT_DAT_DLL stBackColor; 57 | CLUT_DAT_DLL stRasterColor; 58 | CLUT_DAT_DLL stORNColor; 59 | 60 | BOOL bUnderLine; 61 | BOOL bBold; 62 | BOOL bItalic; 63 | BYTE bFlushMode; 64 | BYTE bHLC; 65 | BYTE bPRA; 66 | BYTE bORN; 67 | 68 | WORD wCharW; 69 | WORD wCharH; 70 | WORD wCharHInterval; 71 | WORD wCharVInterval; 72 | }; 73 | 74 | struct CAPTION_DATA{ 75 | //bClear==TRUEのときdwWaitTime以外のフィールドは未定義 76 | BOOL bClear; 77 | WORD wSWFMode; 78 | WORD wClientX; 79 | WORD wClientY; 80 | WORD wClientW; 81 | WORD wClientH; 82 | WORD wPosX; 83 | WORD wPosY; 84 | //表示区画を同じくする本文のリスト 85 | vector CharList; 86 | DWORD dwWaitTime; 87 | }; 88 | 89 | struct DRCS_PATTERN{ 90 | WORD wDRCCode; 91 | WORD wGradation; 92 | BITMAPINFOHEADER bmiHeader; 93 | vector Bitmap; 94 | }; 95 | 96 | //参考:up0511mod 97 | //U+EC00~U+ECFFの範囲でDRCSをUCSにマッピングする 98 | //DRCSがすでにUCSの私用領域(U+EC00~U+EFFF)ならそのまま返す 99 | //BMPの私用領域はU+F8FFまであるが、一部のフォントが後方領域を外字に使うことから範囲を制限する 100 | class CDRCMap 101 | { 102 | int m_used, m_front; 103 | WORD m_wCodeMap[0x100]; 104 | public: 105 | CDRCMap(void) : m_used(0), m_front(0) {} 106 | void Clear(void) { m_used = m_front = 0; } 107 | wchar_t GetUCS(WORD cc) const; 108 | wchar_t MapUCS(WORD cc); 109 | }; 110 | 111 | class CARIB8CharDecode 112 | { 113 | public: 114 | CARIB8CharDecode(void); 115 | //字幕を想定したワイド文字列への変換 116 | BOOL Caption( const BYTE* pbSrc, DWORD dwSrcSize, vector* pCaptionList, 117 | CDRCMap* pDRCMap, WORD wInitSWFMode, const char* pszLang, BOOL bUCS ); 118 | //Caption()が成功したとき、その時点の表示書式や表示領域の情報を取得 119 | void GetCaptionDataFields(CAPTION_DATA* pItem) const { CreateCaptionData(pItem); } 120 | //DRCSヘッダの分析(参考:mark10als) 121 | static BOOL DRCSHeaderparse( const BYTE* pbSrc, DWORD dwSrcSize, vector* pDRCList, BOOL bDRCS_0 ); 122 | //ビットマップ図形の分析 123 | static BOOL ParseBitmapData(const BYTE* pbSrc, DWORD dwSrcSize, int* pPosX, int* pPosY, 124 | vector* pFlushColor, vector* pImage); 125 | static BOOL GetDisplayAreaFromSWFMode(WORD* pwClientW, WORD* pwClientH, WORD wSWFMode); 126 | BOOL GetGaijiTable(WCHAR* pTable, DWORD* pdwTableSize) const; 127 | BOOL SetGaijiTable(const WCHAR* pTable, DWORD* pdwTableSize); 128 | BOOL ResetGaijiTable(DWORD* pdwTableSize); 129 | 130 | protected: 131 | struct MF_MODE{ 132 | int iMF; //文字符号集合 133 | int iMode; //符号集合の分類 134 | int iByte; //読み込みバイト数 135 | }; 136 | 137 | MF_MODE m_G0; 138 | MF_MODE m_G1; 139 | MF_MODE m_G2; 140 | MF_MODE m_G3; 141 | MF_MODE* m_GL; 142 | MF_MODE* m_GR; 143 | 144 | //デコードした文字列 145 | wstring m_strDecode; 146 | //保留中のノンスペーシング文字列 147 | wstring m_strPending; 148 | //文字サイズ 149 | CP_STRING_SIZE m_emStrSize; 150 | 151 | //CLUTのインデックス 152 | BYTE m_bCharColorIndex; 153 | BYTE m_bBackColorIndex; 154 | BYTE m_bRasterColorIndex; 155 | BYTE m_bDefPalette; 156 | BYTE m_bORNColorIndex; 157 | 158 | BOOL m_bUnderLine; 159 | BOOL m_bBold; 160 | BOOL m_bItalic; 161 | BYTE m_bFlushMode; 162 | BYTE m_bHLC; 163 | BYTE m_bPRA; 164 | BYTE m_bORN; 165 | BOOL m_bRPC; 166 | //文字繰り返しの残りカウント(ただし0x40以上のときは表示領域端まで) 167 | WORD m_wRPC; 168 | //C0、C1、GL_GR呼び出し後、解析した文字がスペーシング文字であったかどうか 169 | BOOL m_bSpacing; 170 | 171 | //表示書式(運用規定で960x540または720x480) 172 | WORD m_wSWFMode; 173 | //ラテン文字(SBTVD)かどうか 174 | BOOL m_bLatin; 175 | //符号化方式がUCSかどうか 176 | BOOL m_bUCS; 177 | //初期化動作時の表示書式 178 | WORD m_wInitSWFMode; 179 | //表示領域の位置(字幕プレーン左上角からの座標) 180 | WORD m_wClientX; 181 | WORD m_wClientY; 182 | //表示領域の横/縦ドット数 183 | WORD m_wClientW; 184 | WORD m_wClientH; 185 | //現在の文字の動作位置(字幕プレーン左上角からの座標) 186 | WORD m_wPosX; 187 | WORD m_wPosY; 188 | //現在の文字列1行の動作位置(字幕プレーン左上角からの座標) 189 | WORD m_wPosStartX; 190 | //初期動作位置の設定が完了したかどうか 191 | BOOL m_bPosInit; 192 | //文字サイズ 193 | WORD m_wCharW; 194 | WORD m_wCharH; 195 | //字間隔/行間隔 196 | WORD m_wCharHInterval; 197 | WORD m_wCharVInterval; 198 | //表示タイミング(ミリ秒) 199 | DWORD m_dwWaitTime; 200 | 201 | vector* m_pCaptionList; 202 | CDRCMap* m_pDRCMap; 203 | WCHAR m_GaijiTable[G_CELL_SIZE * 7][2]; 204 | //UCSコードポイントを8単位符号の追加記号集合に変換するテーブル 205 | std::pair m_UCSToGaijiTable[G_CELL_SIZE * 7]; 206 | 207 | static const WCHAR AsciiTable[94]; 208 | static const WCHAR HiraTable[94]; 209 | static const WCHAR KanaTable[94]; 210 | static const WCHAR JisXKanaTable[94]; 211 | static const WCHAR LatinExtensionTable[94]; 212 | static const WCHAR LatinSpecialTable[94]; 213 | static const BYTE DefaultMacro[16][20]; 214 | protected: 215 | BOOL InitCaption(void); 216 | BOOL Analyze( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize ); 217 | 218 | const BOOL IsCaptionPropertyChanged(void) const; 219 | void CreateCaptionData(CAPTION_DATA* pItem) const; 220 | void CreateCaptionCharData(CAPTION_CHAR_DATA* pItem) const; 221 | void CheckModify(BOOL bForce=FALSE); 222 | 223 | //制御符号 224 | BOOL C0( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize ); 225 | BOOL C1( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize ); 226 | BOOL GL_GR( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize, const MF_MODE* mode ); 227 | BOOL G_UCS( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize ); 228 | //エスケープシーケンス 229 | BOOL ESC( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize ); 230 | //JIS->SJIS変換 231 | static BOOL ToSJIS( unsigned char *pucFirst, unsigned char *pucSecond ); 232 | void AddGaijiToString( const BYTE bFirst, const BYTE bSecond ); 233 | 234 | BOOL CSI( const BYTE* pbSrc, DWORD dwSrcSize, DWORD* pdwReadSize ); 235 | 236 | void AddSJISToString( unsigned char ucFirst, unsigned char ucSecond ); 237 | void AddDecodedCharacters( WCHAR cFirst, WCHAR cSecond = 0 ); 238 | void ActivePositionForward( int nCount ); 239 | WORD GetCharDirSize(void) const; 240 | WORD GetLineDirSize(void) const; 241 | }; 242 | -------------------------------------------------------------------------------- /src/ViewerClockEstimator.cpp: -------------------------------------------------------------------------------- 1 | #define NOMINMAX 2 | #include 3 | #include "ViewerClockEstimator.h" 4 | #include 5 | #include 6 | 7 | CViewerClockEstimator::CViewerClockEstimator() 8 | : m_fEnabled(true) 9 | , m_streamPcr(-1) 10 | , m_updateDiffPcr(-1) 11 | , m_pcrDiff(DEFAULT_PCR_DIFF) 12 | { 13 | for (int i = 0; i < 2; ++i) { 14 | m_pesHeaderRemain[i] = -1; 15 | m_unitState[i] = 0; 16 | m_unitSize[i] = 0; 17 | m_crc[i] = 0; 18 | } 19 | for (DWORD i = 0; i < 256; ++i) { 20 | m_crcTable[i] = i << 24; 21 | for (int j = 0; j < 8; ++j) { 22 | m_crcTable[i] = (m_crcTable[i] << 1) ^ ((m_crcTable[i] & 0x80000000) ? 0x04c11db7 : 0); 23 | } 24 | } 25 | } 26 | 27 | void CViewerClockEstimator::SetEnabled(bool fEnabled) 28 | { 29 | lock_recursive_mutex lock(m_streamLock); 30 | 31 | if (m_fEnabled != fEnabled) { 32 | Reset(); 33 | m_fEnabled = fEnabled; 34 | } 35 | } 36 | 37 | bool CViewerClockEstimator::GetEnabled() const 38 | { 39 | lock_recursive_mutex lock(m_streamLock); 40 | 41 | return m_fEnabled; 42 | } 43 | 44 | void CViewerClockEstimator::SetStreamPcr(LONGLONG pcr) 45 | { 46 | lock_recursive_mutex lock(m_streamLock); 47 | 48 | m_streamPcr = pcr; 49 | 50 | if (((0x200000000 + m_streamPcr - m_updateDiffPcr) & 0x1ffffffff) > VIEWER_PCR_QUEUE_DIFF) { 51 | m_updateDiffPcr = m_streamPcr; 52 | 53 | for (int i = 0; i < 2; ++i) { 54 | while (!m_crcPcrDeq[i].empty()) { 55 | DWORD pcrDiff = static_cast(m_streamPcr) - m_crcPcrDeq[i].front().second; 56 | if (pcrDiff < (i ? VIEWER_PCR_QUEUE_DIFF : STREAM_PCR_QUEUE_DIFF)) { 57 | break; 58 | } 59 | m_crcPcrDeq[i].pop_front(); 60 | } 61 | } 62 | 63 | // 2地点で得たストリームの各ユニットについて、CRC32値の一致するものの時差を計算する 64 | m_pcrDiffs.clear(); 65 | int entireCount = 0; 66 | if (!m_crcPcrDeq[0].empty() && !m_crcPcrDeq[1].empty()) { 67 | auto itStream = m_crcPcrDeq[0].rbegin() + 1; 68 | auto itStreamEnd = m_crcPcrDeq[0].rend(); 69 | auto itViewerEnd = m_crcPcrDeq[1].rend(); 70 | for (auto itViewer = m_crcPcrDeq[1].rbegin() + 1; itViewer != itViewerEnd; ++itViewer) { 71 | DWORD crc = itViewer->first; 72 | for (; itStream != itStreamEnd && crc != itStream->first; ++itStream); 73 | if (itStream == itStreamEnd) { 74 | // 下流で見つかったものが上流にないことはあまりないので比較的まれ 75 | // 計算量を制限するため1/100だけスキップする 76 | itViewer += std::min(m_crcPcrDeq[1].size() / 100, std::distance(itViewer, itViewerEnd) - 1); 77 | itStream = m_crcPcrDeq[0].rbegin() + 1; 78 | } 79 | else { 80 | // 一致した 81 | DWORD pcrDiff = itViewer->second - itStream->second; 82 | if (pcrDiff < STREAM_PCR_QUEUE_DIFF) { 83 | auto it = std::lower_bound(m_pcrDiffs.begin(), m_pcrDiffs.end(), std::make_pair(pcrDiff, 0)); 84 | if (it == m_pcrDiffs.end() || it->first != pcrDiff) { 85 | it = m_pcrDiffs.insert(it, std::make_pair(pcrDiff, 0)); 86 | } 87 | it->second++; 88 | ++entireCount; 89 | } 90 | ++itStream; 91 | } 92 | } 93 | } 94 | 95 | // 中央値を使う 96 | int medianCount = 0; 97 | for (auto it = m_pcrDiffs.begin(); it != m_pcrDiffs.end(); ++it) { 98 | medianCount += it->second; 99 | if (medianCount * 2 >= entireCount) { 100 | m_pcrDiff = it->first < ADJUST_PCR_DIFF ? 0 : it->first - ADJUST_PCR_DIFF; 101 | #ifndef NDEBUG 102 | TCHAR debug[64]; 103 | _stprintf_s(debug, TEXT("Estimated viewer PCR diff: %d\n"), m_pcrDiff); 104 | DEBUG_OUT(debug); 105 | #endif 106 | break; 107 | } 108 | } 109 | } 110 | } 111 | 112 | LONGLONG CViewerClockEstimator::GetStreamPcr() const 113 | { 114 | lock_recursive_mutex lock(m_streamLock); 115 | 116 | return m_streamPcr; 117 | } 118 | 119 | void CViewerClockEstimator::Reset() 120 | { 121 | lock_recursive_mutex lock(m_streamLock); 122 | 123 | m_crcPcrDeq[0].clear(); 124 | m_crcPcrDeq[1].clear(); 125 | m_pcrDiff = DEFAULT_PCR_DIFF; 126 | } 127 | 128 | void CViewerClockEstimator::SetVideoPes(bool fViewer, bool fUnitStart, const BYTE *data, size_t len) 129 | { 130 | if (fUnitStart) { 131 | m_pesHeaderRemain[fViewer] = -1; 132 | if (data[0] == 0 && data[1] == 0 && data[2] == 1 && len >= 9) { 133 | // TODO: ここでPTSを取って補正に使うとよりよいかもしれない 134 | m_pesHeaderRemain[fViewer] = 9 + data[8]; 135 | } 136 | } 137 | if (m_pesHeaderRemain[fViewer] > 0) { 138 | // PESヘッダを無視する 139 | int n = std::min(m_pesHeaderRemain[fViewer], static_cast(len)); 140 | m_pesHeaderRemain[fViewer] -= n; 141 | data += n; 142 | len -= n; 143 | } 144 | if (m_pesHeaderRemain[fViewer] == 0) { 145 | SetVideoStream(fViewer, data, len); 146 | } 147 | } 148 | 149 | void CViewerClockEstimator::SetVideoStream(bool fViewer, const BYTE *data, size_t len) 150 | { 151 | { 152 | lock_recursive_mutex lock(m_streamLock); 153 | 154 | if (!m_fEnabled) return; 155 | } 156 | 157 | int state = m_unitState[fViewer]; 158 | size_t unitSize = m_unitSize[fViewer]; 159 | DWORD crc = m_crc[fViewer]; 160 | 161 | // スタートコードで区切られた各ユニットのCRC32値と取得時刻のペアを記録する 162 | for (size_t i = 0; i < len; ++i) { 163 | if (state <= 1 && data[i] == 0) { 164 | ++state; 165 | ++unitSize; 166 | crc = CalcCrc32(0, crc); 167 | } 168 | else if (state == 2 && data[i] == 1) { 169 | lock_recursive_mutex lock(m_streamLock); 170 | 171 | if (!m_fEnabled) return; 172 | state = 0; 173 | if (!m_crcPcrDeq[fViewer].empty()) { 174 | m_crcPcrDeq[fViewer].back().first = crc; 175 | if (unitSize < 40) { 176 | // 小さすぎるものは除外 177 | m_crcPcrDeq[fViewer].pop_back(); 178 | } 179 | } 180 | unitSize = 1; 181 | crc = CalcCrc32(1); 182 | while (!m_crcPcrDeq[fViewer].empty()) { 183 | DWORD pcrDiff = static_cast(m_streamPcr) - m_crcPcrDeq[fViewer].front().second; 184 | if (pcrDiff < (fViewer ? VIEWER_PCR_QUEUE_DIFF : STREAM_PCR_QUEUE_DIFF)) { 185 | break; 186 | } 187 | m_crcPcrDeq[fViewer].pop_front(); 188 | } 189 | m_crcPcrDeq[fViewer].push_back(std::make_pair(crc, static_cast(m_streamPcr))); 190 | } 191 | else if (state != 2 || data[i] != 0) { 192 | state = 0; 193 | ++unitSize; 194 | crc = CalcCrc32(data[i], crc); 195 | } 196 | } 197 | 198 | m_unitState[fViewer] = state; 199 | m_unitSize[fViewer] = unitSize; 200 | m_crc[fViewer] = crc; 201 | } 202 | 203 | LONGLONG CViewerClockEstimator::GetViewerPcr() const 204 | { 205 | lock_recursive_mutex lock(m_streamLock); 206 | 207 | return m_streamPcr < 0 ? -1 : (0x200000000 + m_streamPcr - m_pcrDiff) & 0x1ffffffff; 208 | } 209 | -------------------------------------------------------------------------------- /gaiji/GaijiTable_std.c: -------------------------------------------------------------------------------- 1 | #if 1 2 | #ifndef WCHAR 3 | #define WCHAR unsigned short 4 | #endif 5 | #endif 6 | 7 | //From: ARIB STD-B24 (6.3) VOLUME1 Table7-19 + Unicode5.2 8 | static const WCHAR GaijiTable[]={ 9 | //row 90 10 | 0x26CC, 0x26CD, 0x2757, 0x26CF, 0x26D0, 0x26D1, 0xE0CF, 0x26D2, 0x26D5, 0x26D3, 11 | 0x26D4, 0xE0D4, 0xE0D5, 0xE0D6, 0xE0D7, /*(*/0xD83C, 0xDD7F/*)*/, /*(*/0xD83C, 0xDD8A/*)*/, 0xE0DA, 0xE0DB, 0x26D6, 12 | 0x26D7, 0x26D8, 0x26D9, 0x26DA, 0x26DB, 0x26DC, 0x26DD, 0x26DE, 0x26DF, 0x26E0, 13 | 0x26E1, 0x2B55, 0x3248, 0x3249, 0x324A, 0x324B, 0x324C, 0x324D, 0x324E, 0x324F, 14 | 0xE0F1, 0xE0F2, 0xE0F3, 0xE0F4, 0x2491, 0x2492, 0x2493, /*(*/0xD83C, 0xDD4A/*)*/, /*(*/0xD83C, 0xDD4C/*)*/, /*(*/0xD83C, 0xDD3F/*)*/, 15 | /*(*/0xD83C, 0xDD46/*)*/, /*(*/0xD83C, 0xDD4B/*)*/, /*(*/0xD83C, 0xDE10/*)*/, /*(*/0xD83C, 0xDE11/*)*/, /*(*/0xD83C, 0xDE12/*)*/, /*(*/0xD83C, 0xDE13/*)*/, /*(*/0xD83C, 0xDD42/*)*/, /*(*/0xD83C, 0xDE14/*)*/, /*(*/0xD83C, 0xDE15/*)*/, /*(*/0xD83C, 0xDE16/*)*/, 16 | /*(*/0xD83C, 0xDD4D/*)*/, /*(*/0xD83C, 0xDD31/*)*/, /*(*/0xD83C, 0xDD3D/*)*/, 0x2B1B, 0x2B24, /*(*/0xD83C, 0xDE17/*)*/, /*(*/0xD83C, 0xDE18/*)*/, /*(*/0xD83C, 0xDE19/*)*/, /*(*/0xD83C, 0xDE1A/*)*/, /*(*/0xD83C, 0xDE1B/*)*/, 17 | 0x26BF, /*(*/0xD83C, 0xDE1C/*)*/, /*(*/0xD83C, 0xDE1D/*)*/, /*(*/0xD83C, 0xDE1E/*)*/, /*(*/0xD83C, 0xDE1F/*)*/, /*(*/0xD83C, 0xDE20/*)*/, /*(*/0xD83C, 0xDE21/*)*/, /*(*/0xD83C, 0xDE22/*)*/, /*(*/0xD83C, 0xDE23/*)*/, /*(*/0xD83C, 0xDE24/*)*/, 18 | /*(*/0xD83C, 0xDE25/*)*/, /*(*/0xD83C, 0xDD4E/*)*/, 0x3299, /*(*/0xD83C, 0xDE00/*)*/, 0xE19D, 0xE19E, 0xE19F, 0xE1A0, 0xE1A1, 0xE1A2, 19 | 0xE1A3, 0xE1A4, 0xE1A5, 0xE1A6, 20 | //row 91 21 | 0x26E3, 0x2B56, 0x2B57, 0x2B58, 0x2B59, 0x2613, 0x328B, 0x3012, 0x26E8, 0x3246, 22 | 0x3245, 0x26E9, 0x0FD6, 0x26EA, 0x26EB, 0x26EC, 0x2668, 0x26ED, 0x26EE, 0x26EF, 23 | 0x2693, 0x2708, 0x26F0, 0x26F1, 0x26F2, 0x26F3, 0x26F4, 0x26F5, /*(*/0xD83C, 0xDD57/*)*/, 0x24B9, 24 | 0x24C8, 0x26F6, /*(*/0xD83C, 0xDD5F/*)*/, /*(*/0xD83C, 0xDD8B/*)*/, /*(*/0xD83C, 0xDD8D/*)*/, /*(*/0xD83C, 0xDD8C/*)*/, /*(*/0xD83C, 0xDD79/*)*/, 0x26F7, 0x26F8, 0x26F9, 25 | 0x26FA, /*(*/0xD83C, 0xDD7B/*)*/, 0x260E, 0x26FB, 0x26FC, 0x26FD, 0x26FE, /*(*/0xD83C, 0xDD7C/*)*/, 0x26FF, 0xE1D8, 26 | 0xE1D9, 0xE1DA, 0xE1DB, 0xE1DC, 0xE1DD, 0xE1DE, 0xE1DF, 0xE1E0, 0xE1E1, 0xE1E2, 27 | 0xE1E3, 0xE1E4, 0xE1E5, 0xE1E6, 0xE1E7, 0xE1E8, 0xE1E9, 0xE1EA, 0xE1EB, 0xE1EC, 28 | 0xE1ED, 0xE1EE, 0xE1EF, 0xE1F0, 0xE1F1, 0xE1F2, 0xE1F3, 0xE1F4, 0xE1F5, 0xE1F6, 29 | 0xE1F7, 0xE1F8, 0xE1F9, 0xE1FA, 0xE1FB, 0xE1FC, 0xE1FD, 0xE1FE, 0xE1FF, 0xE280, 30 | 0xE281, 0xE282, 0xE283, 0xE284, 31 | //row 92 32 | 0x27A1, 0x2B05, 0x2B06, 0x2B07, 0x2B2F, 0x2B2E, 0x5E74, 0x6708, 0x65E5, 0x5186, 33 | 0x33A1, 0x33A5, 0x339D, 0x33A0, 0x33A4, /*(*/0xD83C, 0xDD00/*)*/, 0x2488, 0x2489, 0x248A, 0x248B, 34 | 0x248C, 0x248D, 0x248E, 0x248F, 0x2490, 0x6C0F, 0x526F, 0x5143, 0x6545, 0x524D, 35 | 0x65B0, /*(*/0xD83C, 0xDD01/*)*/, /*(*/0xD83C, 0xDD02/*)*/, /*(*/0xD83C, 0xDD03/*)*/, /*(*/0xD83C, 0xDD04/*)*/, /*(*/0xD83C, 0xDD05/*)*/, /*(*/0xD83C, 0xDD06/*)*/, /*(*/0xD83C, 0xDD07/*)*/, /*(*/0xD83C, 0xDD08/*)*/, /*(*/0xD83C, 0xDD09/*)*/, 36 | /*(*/0xD83C, 0xDD0A/*)*/, 0x3233, 0x3236, 0x3232, 0x3231, 0x3239, 0x3244, 0x25B6, 0x25C0, 0x3016, 37 | 0x3017, 0x27D0, 0x00B2, 0x00B3, /*(*/0xD83C, 0xDD2D/*)*/, 0xE2A5, 0xE2A6, 0xE2A7, 0xE2A8, 0xE2A9, 38 | 0xE2AA, 0xE2AB, 0xE2AC, 0xE2AD, 0xE2AE, 0xE2AF, 0xE2B0, 0xE2B1, 0xE2B2, 0xE2B3, 39 | 0xE2B4, 0xE2B5, 0xE2B6, 0xE2B7, 0xE2B8, 0xE2B9, 0xE2BA, 0xE2BB, 0xE2BC, 0xE2BD, 40 | 0xE2BE, 0xE2BF, 0xE2C0, 0xE2C1, 0xE2C2, /*(*/0xD83C, 0xDD2C/*)*/, /*(*/0xD83C, 0xDD2B/*)*/, 0x3247, /*(*/0xD83C, 0xDD90/*)*/, /*(*/0xD83C, 0xDE26/*)*/, 41 | 0x213B, 0xE2C7, 0xE2C8, 0xE2C9, 42 | //row 93 43 | 0x322A, 0x322B, 0x322C, 0x322D, 0x322E, 0x322F, 0x3230, 0x3237, 0x337E, 0x337D, 44 | 0x337C, 0x337B, 0x2116, 0x2121, 0x3036, 0x26BE, /*(*/0xD83C, 0xDE40/*)*/, /*(*/0xD83C, 0xDE41/*)*/, /*(*/0xD83C, 0xDE42/*)*/, /*(*/0xD83C, 0xDE43/*)*/, 45 | /*(*/0xD83C, 0xDE44/*)*/, /*(*/0xD83C, 0xDE45/*)*/, /*(*/0xD83C, 0xDE46/*)*/, /*(*/0xD83C, 0xDE47/*)*/, /*(*/0xD83C, 0xDE48/*)*/, /*(*/0xD83C, 0xDD2A/*)*/, /*(*/0xD83C, 0xDE27/*)*/, /*(*/0xD83C, 0xDE28/*)*/, /*(*/0xD83C, 0xDE29/*)*/, /*(*/0xD83C, 0xDE14/*)*/, 46 | /*(*/0xD83C, 0xDE2A/*)*/, /*(*/0xD83C, 0xDE2B/*)*/, /*(*/0xD83C, 0xDE2C/*)*/, /*(*/0xD83C, 0xDE2D/*)*/, /*(*/0xD83C, 0xDE2E/*)*/, /*(*/0xD83C, 0xDE2F/*)*/, /*(*/0xD83C, 0xDE30/*)*/, /*(*/0xD83C, 0xDE31/*)*/, 0x2113, 0x338F, 47 | 0x3390, 0x33CA, 0x339E, 0x33A2, 0x3371, 0xE2E3, 0xE2E4, 0x00BD, 0x2189, 0x2153, 48 | 0x2154, 0x00BC, 0x00BE, 0x2155, 0x2156, 0x2157, 0x2158, 0x2159, 0x215A, 0x2150, 49 | 0x215B, 0x2151, 0x2152, 0x2600, 0x2601, 0x2602, 0x26C4, 0x2616, 0x2617, 0x26C9, 50 | 0x26CA, 0x2666, 0x2665, 0x2663, 0x2660, 0x26CB, 0x2A00, 0x203C, 0x2049, 0x26C5, 51 | 0x2614, 0x26C6, 0x2603, 0x26C7, 0x26A1, 0x26C8, 0xE2F8, 0x269E, 0x269F, 0x266C, 52 | 0x260E, 0xE2FC, 0xE2FD, 0xE2FE, 53 | //row 94 54 | 0x2160, 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168, 0x2169, 55 | 0x216A, 0x216B, 0x2470, 0x2471, 0x2472, 0x2473, 0x2474, 0x2475, 0x2476, 0x2477, 56 | 0x2478, 0x2479, 0x247A, 0x247B, 0x247C, 0x247D, 0x247E, 0x247F, 0x3251, 0x3252, 57 | 0x3253, 0x3254, /*(*/0xD83C, 0xDD10/*)*/, /*(*/0xD83C, 0xDD11/*)*/, /*(*/0xD83C, 0xDD12/*)*/, /*(*/0xD83C, 0xDD13/*)*/, /*(*/0xD83C, 0xDD14/*)*/, /*(*/0xD83C, 0xDD15/*)*/, /*(*/0xD83C, 0xDD16/*)*/, /*(*/0xD83C, 0xDD17/*)*/, 58 | /*(*/0xD83C, 0xDD18/*)*/, /*(*/0xD83C, 0xDD19/*)*/, /*(*/0xD83C, 0xDD1A/*)*/, /*(*/0xD83C, 0xDD1B/*)*/, /*(*/0xD83C, 0xDD1C/*)*/, /*(*/0xD83C, 0xDD1D/*)*/, /*(*/0xD83C, 0xDD1E/*)*/, /*(*/0xD83C, 0xDD1F/*)*/, /*(*/0xD83C, 0xDD20/*)*/, /*(*/0xD83C, 0xDD21/*)*/, 59 | /*(*/0xD83C, 0xDD22/*)*/, /*(*/0xD83C, 0xDD23/*)*/, /*(*/0xD83C, 0xDD24/*)*/, /*(*/0xD83C, 0xDD25/*)*/, /*(*/0xD83C, 0xDD26/*)*/, /*(*/0xD83C, 0xDD27/*)*/, /*(*/0xD83C, 0xDD28/*)*/, /*(*/0xD83C, 0xDD29/*)*/, 0x3255, 0x3256, 60 | 0x3257, 0x3258, 0x3259, 0x325A, 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 61 | 0x2466, 0x2467, 0x2468, 0x2469, 0x246A, 0x246B, 0x246C, 0x246D, 0x246E, 0x246F, 62 | 0x2776, 0x2777, 0x2778, 0x2779, 0x277A, 0x277B, 0x277C, 0x277D, 0x277E, 0x277F, 63 | 0x24EB, 0x24EC, 0x325B, 0xE3A6, 64 | //row 85 65 | 0x3402, /*(*/0xD840, 0xDD58/*)*/, 0x4EFD, 0x4EFF, 0x4F9A, 0x4FC9, 0x509C, 0x511E, 0x51BC, 0x351F, 66 | 0x5307, 0x5361, 0x536C, 0x8A79, /*(*/0xD842, 0xDFB7/*)*/, 0x544D, 0x5496, 0x549C, 0x54A9, 0x550E, 67 | 0x554A, 0x5672, 0x56E4, 0x5733, 0x5734, 0xFA10, 0x5880, 0x59E4, 0x5A23, 0x5A55, 68 | 0x5BEC, 0xFA11, 0x37E2, 0x5EAC, 0x5F34, 0x5F45, 0x5FB7, 0x6017, 0xFA6B, 0x6130, 69 | 0x6624, 0x66C8, 0x66D9, 0x66FA, 0x66FB, 0x6852, 0x9FC4, 0x6911, 0x693B, 0x6A45, 70 | 0x6A91, 0x6ADB, /*(*/0xD84C, 0xDFCC/*)*/, /*(*/0xD84C, 0xDFFE/*)*/, /*(*/0xD84D, 0xDDC4/*)*/, 0x6BF1, 0x6CE0, 0x6D2E, 0xFA45, 0x6DBF, 71 | 0x6DCA, 0x6DF8, 0xFA46, 0x6F5E, 0x6FF9, 0x7064, 0xFA6C, /*(*/0xD850, 0xDEEE/*)*/, 0x7147, 0x71C1, 72 | 0x7200, 0x739F, 0x73A8, 0x73C9, 0x73D6, 0x741B, 0x7421, 0xFA4A, 0x7426, 0x742A, 73 | 0x742C, 0x7439, 0x744B, 0x3EDA, 0x7575, 0x7581, 0x7772, 0x4093, 0x78C8, 0x78E0, 74 | 0x7947, 0x79AE, 0x9FC6, 0x4103, 75 | //row 86 76 | 0x9FC5, 0x79DA, 0x7A1E, 0x7B7F, 0x7C31, 0x4264, 0x7D8B, 0x7FA1, 0x8118, 0x813A, 77 | 0xFA6D, 0x82AE, 0x845B, 0x84DC, 0x84EC, 0x8559, 0x85CE, 0x8755, 0x87EC, 0x880B, 78 | 0x88F5, 0x89D2, 0x8AF6, 0x8DCE, 0x8FBB, 0x8FF6, 0x90DD, 0x9127, 0x912D, 0x91B2, 79 | 0x9233, 0x9288, 0x9321, 0x9348, 0x9592, 0x96DE, 0x9903, 0x9940, 0x9AD9, 0x9BD6, 80 | 0x9DD7, 0x9EB4, 0x9EB5, 0xE096, 0xE097, 0xE098, 0xE099, 0xE09A, 0xE09B, 0xE09C, 81 | 0xE09D, 0xE09E, 0xE09F, 0xE0A0, 0xE0A1, 0xE0A2, 0xE0A3, 0xE0A4, 0xE0A5, 0xE0A6, 82 | 0xE0A7, 0xE0A8, 0xE0A9, 0xE0AA, 0xE0AB, 0xE0AC, 0xE0AD, 0xE0AE, 0xE0AF, 0xE0B0, 83 | 0xE0B1, 0xE0B2, 0xE0B3, 0xE0B4, 0xE0B5, 0xE0B6, 0xE0B7, 0xE0B8, 0xE0B9, 0xE0BA, 84 | 0xE0BB, 0xE0BC, 0xE0BD, 0xE0BE, 0xE0BF, 0xE0C0, 0xE0C1, 0xE0C2, 0xE0C3, 0xE0C4, 85 | 0xE0C5, 0xE0C6, 0xE0C7, 0xE0C8, 86 | }; 87 | 88 | #if 1 89 | #include 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 90 | int main(void) 91 | { 92 | FILE *fp = fopen("Gaiji.txt", "wb"); 93 | if( fp ){ 94 | unsigned char bom[] = {0xFF, 0xFE}; 95 | if( fwrite(bom, 1, 2, fp) != 2 ) return 1; 96 | 97 | int le = 1; 98 | le = *(char*)&le ? 1 : 0; 99 | int i = 0; 100 | for( ; i 2 | #include "Caption.h" 3 | #include "Util.h" 4 | #include "CaptionManager.h" 5 | 6 | #define MSB(x) ((x) & 0x80000000) 7 | 8 | CCaptionManager::CCaptionManager() 9 | : m_pCaptionDll(nullptr) 10 | , m_dwIndex(0) 11 | , m_fProfileC(false) 12 | , m_fShowLang2(false) 13 | , m_fSuperimpose(false) 14 | , m_fEnPts(false) 15 | , m_pcr(0) 16 | , m_pts(0) 17 | , m_pCapList(nullptr) 18 | , m_pDrcsList(nullptr) 19 | , m_pBitmapDataList(nullptr) 20 | , m_capCount(0) 21 | , m_popCount(0) 22 | , m_drcsCount(0) 23 | , m_bitmapDataCount(0) 24 | , m_bitmapPopCount(0) 25 | , m_fEnLastTagInfoPcr(false) 26 | , m_lastTagInfoPcr(0) 27 | , m_queueFront(0) 28 | , m_queueRear(0) 29 | { 30 | m_lang1.ucLangTag = 0xFF; 31 | m_lang2.ucLangTag = 0xFF; 32 | } 33 | 34 | void CCaptionManager::SetCaptionDll(const CCaptionDll *pCaptionDll, DWORD dwIndexToUse) 35 | { 36 | m_pCaptionDll = pCaptionDll; 37 | m_dwIndex = dwIndexToUse; 38 | Clear(); 39 | } 40 | 41 | void CCaptionManager::Clear() 42 | { 43 | m_fSuperimpose = false; 44 | m_fEnPts = false; 45 | m_capCount = 0; 46 | m_popCount = 0; 47 | m_drcsCount = 0; 48 | m_bitmapDataCount = 0; 49 | m_bitmapPopCount = 0; 50 | m_lang1.ucLangTag = 0xFF; 51 | m_lang2.ucLangTag = 0xFF; 52 | m_fEnLastTagInfoPcr = false; 53 | m_queueFront = m_queueRear; 54 | if (m_pCaptionDll) { 55 | m_pCaptionDll->Clear(m_dwIndex); 56 | if (m_fProfileC) { 57 | // 既定の字幕管理データを取得済みにする 58 | LANG_TAG_INFO_DLL *pLangList; 59 | if (m_pCaptionDll->GetTagInfo(m_dwIndex, &pLangList, nullptr) == TRUE) { 60 | m_lang1 = pLangList[0]; 61 | } 62 | } 63 | } 64 | } 65 | 66 | void CCaptionManager::AddPacket(LPCBYTE pPacket) 67 | { 68 | ::memcpy(m_queue[m_queueRear], pPacket, 188); 69 | m_queueRear = (m_queueRear+1) % PACKET_QUEUE_SIZE; 70 | } 71 | 72 | // キューにある字幕ストリームから次の字幕文を取得する 73 | // キューが空になるか字幕文を得る(m_capCount!=0)と返る 74 | // PopCaptionOrBitmap()やGetDrcsList()で返されたバッファは無効になる 75 | void CCaptionManager::Analyze(DWORD currentPcr) 76 | { 77 | if (!m_pCaptionDll) return; 78 | m_capCount = 0; 79 | m_popCount = 0; 80 | m_drcsCount = 0; 81 | m_bitmapDataCount = 0; 82 | m_bitmapPopCount = 0; 83 | 84 | // "字幕管理データを3分以上未受信の場合は選局時の初期化動作を行う" 85 | if (m_fEnLastTagInfoPcr && currentPcr - m_lastTagInfoPcr >= 180000 * PCR_45KHZ_PER_MSEC) { 86 | DEBUG_OUT(TEXT(__FUNCTION__) TEXT("(): Clear\n")); 87 | Clear(); 88 | } 89 | 90 | while (m_queueFront != m_queueRear) { 91 | BYTE *pPacket = m_queue[m_queueFront]; 92 | m_queueFront = (m_queueFront+1) % PACKET_QUEUE_SIZE; 93 | 94 | TS_HEADER header; 95 | extract_ts_header(&header, pPacket); 96 | 97 | // 字幕PTSを取得 98 | if (header.payload_unit_start_indicator && 99 | (header.adaptation_field_control&1)/*1,3*/) 100 | { 101 | BYTE *pPayload = pPacket + 4; 102 | if (header.adaptation_field_control == 3) { 103 | // アダプテーションに続けてペイロードがある 104 | ADAPTATION_FIELD adapt; 105 | extract_adaptation_field(&adapt, pPayload); 106 | pPayload = adapt.adaptation_field_length >= 0 ? pPayload + adapt.adaptation_field_length + 1 : nullptr; 107 | } 108 | if (pPayload) { 109 | int payloadSize = 188 - static_cast(pPayload - pPacket); 110 | PES_HEADER pesHeader; 111 | extract_pes_header(&pesHeader, pPayload, payloadSize); 112 | if (pesHeader.packet_start_code_prefix) { 113 | if (pesHeader.stream_id == 0xBF) { 114 | m_fSuperimpose = true; 115 | } 116 | else if (pesHeader.pts_dts_flags >= 2) { 117 | m_pts = (DWORD)pesHeader.pts_45khz; 118 | m_fEnPts = true; 119 | } 120 | } 121 | } 122 | } 123 | 124 | DWORD ret = m_pCaptionDll->AddTSPacket(m_dwIndex, pPacket); 125 | unsigned char ucLangTag = m_fShowLang2 && m_lang2.ucLangTag!=0xFF ? 1 : 0; 126 | if ((m_fSuperimpose || m_fEnPts) && ret == (DWORD)(CP_NO_ERR_CAPTION_1+ucLangTag)) { 127 | // 字幕文データ 128 | if (m_pCaptionDll->GetCaptionData(m_dwIndex, ucLangTag, &m_pCapList, &m_capCount) != TRUE) { 129 | m_capCount = 0; 130 | } 131 | else { 132 | // DRCS図形データ(あれば) 133 | if (m_pCaptionDll->GetDRCSPattern(m_dwIndex, ucLangTag, &m_pDrcsList, &m_drcsCount) != TRUE) { 134 | m_drcsCount = 0; 135 | } 136 | // ビットマップ図形データ(あれば) 137 | if (m_pCaptionDll->GetBitmapData(m_dwIndex, ucLangTag, &m_pBitmapDataList, &m_bitmapDataCount) != TRUE) { 138 | m_bitmapDataCount = 0; 139 | } 140 | m_pcr = currentPcr; 141 | break; 142 | } 143 | } 144 | else if (ret == CP_CHANGE_VERSION) { 145 | // 字幕管理データ 146 | m_lang1.ucLangTag = 0xFF; 147 | m_lang2.ucLangTag = 0xFF; 148 | LANG_TAG_INFO_DLL *pLangList; 149 | DWORD langCount; 150 | if (m_pCaptionDll->GetTagInfo(m_dwIndex, &pLangList, &langCount) == TRUE) { 151 | if (langCount >= 1) m_lang1 = pLangList[0]; 152 | if (langCount >= 2) m_lang2 = pLangList[1]; 153 | } 154 | m_lastTagInfoPcr = currentPcr; 155 | m_fEnLastTagInfoPcr = true; 156 | } 157 | else if (ret == CP_NO_ERR_TAG_INFO) { 158 | m_lastTagInfoPcr = currentPcr; 159 | m_fEnLastTagInfoPcr = true; 160 | } 161 | else if (ret != TRUE && ret != CP_ERR_NEED_NEXT_PACKET && 162 | (ret < CP_NO_ERR_CAPTION_1 || CP_NO_ERR_CAPTION_8 < ret)) 163 | { 164 | DEBUG_OUT(TEXT(__FUNCTION__) TEXT("(): Error packet!\n")); 165 | } 166 | } 167 | } 168 | 169 | // 表示タイミングに達した字幕本文かビットマップ図形を1つだけとり出す 170 | bool CCaptionManager::PopCaptionOrBitmap(const CAPTION_DATA_DLL **ppCaption, const BITMAP_DATA_DLL **ppBitmapData, 171 | DWORD currentPcr, bool fIgnorePts) 172 | { 173 | const CAPTION_DATA_DLL *pCaption; 174 | if (GetCaptionOrBitmap(&pCaption, ppBitmapData, currentPcr, fIgnorePts, 0)) { 175 | if (pCaption) { 176 | ++m_popCount; 177 | } 178 | else { 179 | ++m_bitmapPopCount; 180 | } 181 | if (ppCaption) { 182 | *ppCaption = pCaption; 183 | } 184 | return true; 185 | } 186 | return false; 187 | } 188 | 189 | // 表示タイミングに達した字幕本文かビットマップ図形を取得する 190 | bool CCaptionManager::GetCaptionOrBitmap(const CAPTION_DATA_DLL **ppCaption, const BITMAP_DATA_DLL **ppBitmapData, 191 | DWORD currentPcr, bool fIgnorePts, DWORD index) const 192 | { 193 | DWORD popCount = m_popCount; 194 | DWORD bitmapPopCount = m_bitmapPopCount; 195 | for (;;) { 196 | const CAPTION_DATA_DLL *pCaption = nullptr; 197 | const BITMAP_DATA_DLL *pBitmapData = nullptr; 198 | DWORD dwWaitTime; 199 | if (bitmapPopCount < m_bitmapDataCount && m_pBitmapDataList[bitmapPopCount].wAppearanceOrder == popCount) { 200 | pBitmapData = &m_pBitmapDataList[bitmapPopCount++]; 201 | dwWaitTime = popCount > 0 ? m_pCapList[popCount - 1].dwWaitTime : 0; 202 | } 203 | else if (popCount < m_capCount) { 204 | pCaption = &m_pCapList[popCount++]; 205 | dwWaitTime = pCaption->dwWaitTime; 206 | } 207 | else { 208 | break; 209 | } 210 | // 文字スーパーは非同期PESなので字幕文取得時のPCRが表示タイミングの基準になる 211 | if ((m_fSuperimpose || fIgnorePts) && MSB(m_pcr + dwWaitTime * PCR_45KHZ_PER_MSEC - currentPcr) || 212 | !m_fSuperimpose && !fIgnorePts && MSB(m_pts + dwWaitTime * PCR_45KHZ_PER_MSEC - currentPcr)) 213 | { 214 | if (index == 0) { 215 | if (ppCaption) { 216 | *ppCaption = pCaption; 217 | } 218 | if (ppBitmapData) { 219 | *ppBitmapData = pBitmapData; 220 | } 221 | return true; 222 | } 223 | } 224 | else { 225 | break; 226 | } 227 | --index; 228 | } 229 | return false; 230 | } 231 | -------------------------------------------------------------------------------- /Caption_src/CaptionLib.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Debug 10 | x64 11 | 12 | 13 | Release 14 | Win32 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | {671D1C97-C4DA-45B9-A9DC-C1925FE03603} 23 | Win32Proj 24 | CaptionLib 25 | 10.0.17763.0 26 | 27 | 28 | 29 | StaticLibrary 30 | true 31 | Unicode 32 | v140_xp 33 | v141 34 | v142 35 | 36 | 37 | StaticLibrary 38 | true 39 | Unicode 40 | Windows7.1SDK 41 | v140_xp 42 | v141 43 | v142 44 | 45 | 46 | StaticLibrary 47 | false 48 | true 49 | Unicode 50 | v140_xp 51 | v141 52 | v142 53 | 54 | 55 | StaticLibrary 56 | false 57 | true 58 | Unicode 59 | Windows7.1SDK 60 | v140_xp 61 | v141 62 | v142 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | Level4 86 | Disabled 87 | WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) 88 | NoExtensions 89 | 90 | 91 | Windows 92 | true 93 | 94 | 95 | 96 | 97 | 98 | 99 | Level4 100 | Disabled 101 | WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) 102 | 103 | 104 | Windows 105 | true 106 | 107 | 108 | 109 | 110 | Level4 111 | 112 | 113 | MinSpace 114 | true 115 | true 116 | WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) 117 | NoExtensions 118 | 119 | 120 | Windows 121 | true 122 | true 123 | true 124 | 125 | 126 | 127 | 128 | Level4 129 | 130 | 131 | MinSpace 132 | true 133 | true 134 | WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) 135 | 136 | 137 | Windows 138 | true 139 | true 140 | true 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | -------------------------------------------------------------------------------- /Caption_src/Caption.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Debug 10 | x64 11 | 12 | 13 | Release 14 | Win32 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | {60BC8339-018F-4AF1-A09C-EDAF70A007B7} 23 | Win32Proj 24 | Caption 25 | 10.0.17763.0 26 | 27 | 28 | 29 | DynamicLibrary 30 | true 31 | Unicode 32 | v140_xp 33 | v141 34 | v142 35 | 36 | 37 | DynamicLibrary 38 | true 39 | Unicode 40 | Windows7.1SDK 41 | v140_xp 42 | v141 43 | v142 44 | 45 | 46 | DynamicLibrary 47 | false 48 | true 49 | Unicode 50 | v140_xp 51 | v141 52 | v142 53 | 54 | 55 | DynamicLibrary 56 | false 57 | true 58 | Unicode 59 | Windows7.1SDK 60 | v140_xp 61 | v141 62 | v142 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | true 82 | 83 | 84 | true 85 | 86 | 87 | false 88 | 89 | 90 | false 91 | 92 | 93 | 94 | 95 | 96 | Level4 97 | Disabled 98 | WIN32;_DEBUG;_WINDOWS;_USRDLL;CAPTION_EXPORTS;%(PreprocessorDefinitions) 99 | NoExtensions 100 | 101 | 102 | Windows 103 | true 104 | Caption.def 105 | 106 | 107 | 108 | 109 | 110 | 111 | Level4 112 | Disabled 113 | WIN32;_DEBUG;_WINDOWS;_USRDLL;CAPTION_EXPORTS;%(PreprocessorDefinitions) 114 | 115 | 116 | Windows 117 | true 118 | 119 | 120 | 121 | 122 | Level4 123 | 124 | 125 | MinSpace 126 | true 127 | true 128 | WIN32;NDEBUG;_WINDOWS;_USRDLL;CAPTION_EXPORTS;%(PreprocessorDefinitions) 129 | NoExtensions 130 | 131 | 132 | Windows 133 | false 134 | true 135 | true 136 | Caption.def 137 | 138 | 139 | 140 | 141 | Level4 142 | 143 | 144 | MinSpace 145 | true 146 | true 147 | WIN32;NDEBUG;_WINDOWS;_USRDLL;CAPTION_EXPORTS;%(PreprocessorDefinitions) 148 | 149 | 150 | Windows 151 | false 152 | true 153 | true 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | -------------------------------------------------------------------------------- /src/TVCaption2.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Debug 10 | x64 11 | 12 | 13 | Release 14 | Win32 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | {4BE74EE2-B6D0-427D-9DA4-652737CA71DE} 23 | Win32Proj 24 | TVCaption2 25 | 10.0.17763.0 26 | 27 | 28 | 29 | DynamicLibrary 30 | true 31 | Unicode 32 | v140_xp 33 | v141 34 | v142 35 | 36 | 37 | DynamicLibrary 38 | true 39 | Unicode 40 | Windows7.1SDK 41 | v140_xp 42 | v141 43 | v142 44 | 45 | 46 | DynamicLibrary 47 | false 48 | true 49 | Unicode 50 | v140_xp 51 | v141 52 | v142 53 | 54 | 55 | DynamicLibrary 56 | false 57 | true 58 | Unicode 59 | Windows7.1SDK 60 | v140_xp 61 | v141 62 | v142 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | true 82 | .tvtp 83 | TVCaptionMod2 84 | 85 | 86 | true 87 | .tvtp 88 | TVCaptionMod2 89 | 90 | 91 | false 92 | .tvtp 93 | TVCaptionMod2 94 | 95 | 96 | false 97 | .tvtp 98 | TVCaptionMod2 99 | 100 | 101 | 102 | 103 | 104 | Level4 105 | Disabled 106 | WIN32;_DEBUG;_WINDOWS;_USRDLL;TVCAPTION2_EXPORTS;%(PreprocessorDefinitions) 107 | 4995 108 | NoExtensions 109 | 110 | 111 | Windows 112 | true 113 | CaptionLib.lib;Winmm.lib;%(AdditionalDependencies) 114 | Exports.def 115 | ..\Caption_src\$(Configuration);%(AdditionalLibraryDirectories) 116 | 117 | 118 | 119 | 120 | 121 | 122 | Level4 123 | Disabled 124 | WIN64;_DEBUG;_WINDOWS;_USRDLL;TVCAPTION2_EXPORTS;%(PreprocessorDefinitions) 125 | 4995 126 | 127 | 128 | Windows 129 | true 130 | CaptionLib.lib;Winmm.lib;%(AdditionalDependencies) 131 | ..\Caption_src\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) 132 | 133 | 134 | 135 | 136 | Level4 137 | 138 | 139 | MinSpace 140 | true 141 | true 142 | WIN32;NDEBUG;_WINDOWS;_USRDLL;TVCAPTION2_EXPORTS;%(PreprocessorDefinitions) 143 | 4995 144 | NoExtensions 145 | 146 | 147 | Windows 148 | false 149 | true 150 | true 151 | CaptionLib.lib;Winmm.lib;%(AdditionalDependencies) 152 | Exports.def 153 | ..\Caption_src\$(Configuration);%(AdditionalLibraryDirectories) 154 | 155 | 156 | 157 | 158 | Level4 159 | 160 | 161 | MinSpace 162 | true 163 | true 164 | WIN64;NDEBUG;_WINDOWS;_USRDLL;TVCAPTION2_EXPORTS;%(PreprocessorDefinitions) 165 | 4995 166 | 167 | 168 | Windows 169 | false 170 | true 171 | true 172 | CaptionLib.lib;Winmm.lib;%(AdditionalDependencies) 173 | ..\Caption_src\$(Platform)\$(Configuration);%(AdditionalLibraryDirectories) 174 | 175 | 176 | 177 | 178 | 179 | 180 | MaxSpeed 181 | MaxSpeed 182 | 183 | 184 | MaxSpeed 185 | MaxSpeed 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | -------------------------------------------------------------------------------- /TVCaptionMod2_Readme.txt: -------------------------------------------------------------------------------- 1 | TVTest TVCaptionMod2 Plugin ver.3.1 2 | 3 | ■概要 4 | odaruさんが公開された「字幕 Plugin For TVTest(20081216)」をベースに、mark10alsさ 5 | ん・makiさんによるCaption2Ass_PCR付属のCaption.dll改造版の改変点を選択的に取りこ 6 | み、表示まわりを「字幕 Plugin For TVTest(20081216) 改変版(090627)」を参考にして 7 | 作成した字幕プラグインです。字幕の中央表示をしたいがために作りました。 8 | 9 | ■動作環境 10 | ・Vista以降 11 | ・TVTest/TVH264 ver.0.7.6(たぶん) 以降 12 | ・必要ランタイム: 2015-2022 Visual C++ 再頒布可能パッケージ 13 | ・ビルド環境: Visual Studio Express 2017 for Windows Desktop 14 | 15 | ■以前のバージョンからの移行 16 | TVCaptionMod2.tvtpを以前のものと置きかえてください。Caption.dllは不要です。 17 | デフォルトの外字テーブル(!std)をUnicode5.2ベースに更新しました。Unicode5.2に対応 18 | したフォントであれば基本的に外字フォントの導入は不要です。以前の外字テーブルが必 19 | 要な場合は"gaiji.zip"の"TVCaptionMod2_Gaiji_stdpua.txt"を使ってください。 20 | 21 | ■使い方 22 | TVTestのプラグインフォルダにTVCaptionMod2.tvtpを入れ、右クリックメニューからプラ 23 | グインを有効にして、字幕のある番組で字幕が表示されればOKです。 24 | 25 | プラグイン設定は 右クリックメニュー→設定→プラグイン→TVCaptionMod2 から行いま 26 | す。各設定について詳細は後述「設定ファイルについて」の対応する項目を参照してくだ 27 | さい。必須ではないですが、記号の文字化けを防ぐために外字用フォントとして「和田研 28 | ゴシック2004ARIB」(外字テーブル名!std)や「Windows TV ゴシック」(!typebank)を導入 29 | ・設定しておくことをお勧めします。 30 | (参考)和田研フォント入手先: https://ja.osdn.net/projects/jis2004/ 31 | また、これらのフォントを導入する場合、添付の"gaiji.zip"フォルダにある 32 | "TVCaptionMod2_Gaiji_std(typebank).txt"をプラグインフォルダに入れ、外字テーブル 33 | 名を"std"や"typebank"にしておくと、ドットの粗い文字や記号の出現をかなり抑制でき 34 | ます(詳細は後述「設定ファイルについて」のGaijiTableNameの説明を参照)。 35 | 36 | 緊急地震速報の文字スーパー等で音を出したいときは、設定の「内蔵音再生する」を有効 37 | にしてください。 38 | 39 | PNG形式の字幕の表示にはTVTest.exeのあるフォルダにTVTest_Image.dllが必要です。 40 | 41 | 字幕表示時の負荷により他プラグインのオンスクリーン表示がカクつく場合は「垂直方向 42 | アンチエイリアスしない」の項目を999ドットにしてみてください(「設定ファイルについ 43 | て」VertAntiAliasingを参照)。 44 | 45 | ■おまけ 46 | 高水準漢字とARIB記号が収録されている丸ゴのフリーフォントは(多分)和田研ぐらいだと 47 | 思いますが、割とクセのあるフォントなのでRounded M+と混ぜたものを作ってみました。 48 | 外字テーブル名は和田研フォントと同じです。"j"などの下部を表示できるようにやや上 49 | 付きなので文字位置補正のY方向を5ぐらいに設定すると丁度いいです。 50 | rounded-mplus-1m-arib-20131205.zip 51 | https://www.axfc.net/u/search.pl?sha1=c5d3f3115218431e3fda0b8c25ac62e05ce48428 52 | rounded-mplus-1m-arib-20121219.zip 53 | https://www.axfc.net/u/search.pl?sha1=a75e3938b25c6426197d919a37b784f16474cbe8 54 | (1年ぐらいで流れるっぽいので入り用なら再頒布してください) 55 | 56 | ■既知の不具合 57 | たぶん色々な字幕形式に未対応です。以下思いつくもの: 58 | ・縦書き (なかなか遭遇しないのでどう表示されるかもわからない) 59 | ・ORN縁取り指定の着色。いまのところ背景色で縁取り 60 | 61 | ■設定ファイルについて 62 | 設定ファイル"TVCaptionMod2.ini"は初回使用時プラグインフォルダに自動作成します。 63 | 必要な場合はこれを直接編集してカスタマイズしてください。*付きのキーはプラグイン 64 | 設定のダイアログから(完全には)設定できないものです。 65 | EnOsdCompositor 66 | 映像への字幕合成機能を有効にする[=1]かどうか 67 | # レンダラはVMR9かEVRを利用し、さらに設定キーMethod[=3]としてください。 68 | # TVTest設定→OSD表示→「映像と合成する」とおなじ方法で字幕を表示できるよう 69 | # にします。たぶんつぎの場合に効果的です: 70 | # ・TVTest本体のキャプチャ機能でキャプをとりたい 71 | # ・XPや非Aero環境での性能向上 72 | # TVTest ver.0.9.0未満ではAPIフックを利用する比較的リスキーな機能です。Aero 73 | # な環境では従来の設定キーMethod[=2]を利用することをお勧めします。 74 | Version* 75 | 設定ファイルのバージョン 76 | # デフォルト値を出力するために使います。特にユーザがいじる必要はありません。 77 | EstimateViewerDelay 78 | 表示遅延の精度を高める[=1]かどうか 79 | # TVTestのバッファリングなどの影響で字幕の表示がずれるのを抑制できます。 80 | # 遅延時間を450ミリ秒と指定したとき適切な遅れになるよう調整しています。 81 | CaptureFolder 82 | キー割り当て「字幕付き画像の保存」の保存先フォルダを絶対パスで指定 83 | # たとえば[=C:\CapFolder]とすると、そのフォルダに画像を保存します。 84 | # 指定しないと「字幕付き画像の保存」は機能しません。 85 | CaptureFileName* 86 | 「字幕付き画像の保存」の画像ファイル名 87 | # たとえば[=Capture]とすると、"Capture20121231-235959.bmp"のようになります。 88 | CaptureFileNameFormat* 89 | 変数使用可能な「字幕付き画像の保存」の画像ファイル名 90 | # こちらはTVTest本体のキャプチャ設定のファイル名のように変数を使用できます。 91 | # TVTest ver.0.9.0未満は未対応です。 92 | # たとえば[=Capture_%date%-%time%]とすると、"Capture_20121231-235959.bmp"の 93 | # ようになります。 94 | CaptureSaveFormat* 95 | 「字幕付き画像の保存」の保存形式 96 | # [=BMP]か[=JPEG]か[=PNG]を指定してください。 97 | # JPEGやPNGの保存にはTVTest_Image.dllが必要です。 98 | JpegQuality* 99 | JPEG品質 100 | # [=0]から[=100]まで。 101 | PngCompressionLevel* 102 | PNG圧縮レベル 103 | # [=0]から[=9]まで。 104 | SettingsIndex 105 | 現在選択中の表示設定の番号 106 | # このキーより下の設定は実行中に切り替え(TVTest設定→キー割り当て→表示設定 107 | # 切り替え)できます。つまり↓のような感じです: 108 | # 109 | # [Settings] 110 | # EnOsdCompositor=0 111 | # Version=1 112 | # CaptureFolder= 113 | # CaptureFileName=Capture 114 | # SettingsIndex=1 115 | # FaceName=Windows TV ゴシック 116 | # GaijiFaceName= 117 | # GaijiTableName=!typebank 118 | # Method=2 119 | # ShowFlags=65535 120 | # ShowFlagsSuper=65535 121 | # DelayTime=450 122 | # DelayTimeSuper=0 123 | # IgnorePts=0 124 | # TextColor=-1 125 | # BackColor=-1 126 | # ... 127 | # [Settings1] 128 | # FaceName= 129 | # GaijiFaceName=和田研中丸ゴシック2004ARIB 130 | # GaijiTableName=!std 131 | # Method=2 132 | # ShowFlags=0 133 | # ShowFlagsSuper=65535 134 | # DelayTime=450 135 | # DelayTimeSuper=0 136 | # IgnorePts=0 137 | # TextColor=255255000 138 | # BackColor=000000255 139 | # ... 140 | # [Settings2] 141 | # ... 142 | FaceName 143 | 使用するフォント名を指定 144 | # 何も指定しないと適当な等幅フォントが使われます。 145 | # ARIB外字が収録されているフォントを使用すると、記号も化けずに表示できます。 146 | GaijiFaceName 147 | 外字に使用するフォント名を指定 148 | # 何も指定しないと外字も上記FaceNameのフォントが使われます。 149 | GaijiTableName 150 | 使用する外字テーブル名を指定 151 | # まず、添付の"gaiji.zip"にある"{プラグイン名}_Gaiji_{テーブル名}.txt"からフ 152 | # ォントに合ったもの(メモ帳などでこのファイルを開けば、フォントに合っていれ 153 | # ば記号が羅列されるので大体わかります)をえらび、プラグインフォルダに置いて 154 | # ください。{テーブル名}の部分を指定することでその外字テーブルが使われます。 155 | # 156 | # 「Windows TV ゴシック/丸ゴシック/太丸ゴシック」についてはプラグインに組み 157 | # 込まれています。[=!typebank]と指定してください。 158 | # 159 | # 上述のファイルに特定ハッシュ値のDRCS(Dynamic Redefinable Character Set)を 160 | # 文字列に置換するリストを記述できます。たまに出現するドットの粗い文字や記号 161 | # が気になる方は利用してください。記述方法は"gaiji.zip"のstdまたはtypebankの 162 | # ものを参考にしてください。ハッシュ値はTVTestで取得できます。 163 | # 置換可能な文字列は3文字まで、サロゲートペアに対応しています【ver.1.1~】。 164 | # 2文字や3文字の場合も表示は1文字幅に圧縮されることに注意してください。 165 | Method 166 | 字幕の表示方法 167 | # 通常ウィンドウ[=1]、レイヤードウィンドウ[=2]、もしくは映像と合成[=3](要 168 | # EnOsdCompositor[=1])のいずれかを指定してください。 169 | ShowFlags* / ShowFlagsSuper* 170 | 字幕/文字スーパーを表示するかどうかのフラグ 171 | # 基本的に、すべて表示する[=65535]または表示しない[=0]のどちらかを指定してく 172 | # ださい。 173 | # [かなり上級者向け] 174 | # この設定キーはARIB STD-B24のDMF(表示モード)と関係しています。たとえばDMFの 175 | # 値が10(=受信時選択表示・記録再生時選択表示)の字幕/文字スーパーは、10ビット 176 | # 目を立てる(=設定値に1024を加える)ことで表示されるようになります。 177 | DelayTime / DelayTimeSuper* 178 | 字幕/文字スーパーを受け取ってから表示するまでの遅延時間をミリ秒で指定 179 | # [=-5000]から[=5000]まで。 180 | # 181 | # [上級者向け] 182 | # 字幕については、PTS(Presentation Time Stamp)がPCR(Program Clock Reference) 183 | # に同期した時点を基準[=0]とします。文字スーパー、もしくはIgnorePts[=1]のと 184 | # きの字幕については、データを受け取った時点を基準とします(つまり[=0]未満に 185 | # しても表示が早まることはない)。 186 | IgnorePts 187 | PTSを無視する[=1]かどうか 188 | # 番組のPTSが信用できないときに使います。 189 | # とにかく即時に字幕を表示させたいときにも使えます(DelayTime[=0]にする)。 190 | TextColor* / BackColor* 191 | 字幕文/背景枠の色 192 | # [=-1]のときは自動(TSに含まれる情報をそのまま使う)です。RGB値を10進数で表現 193 | # してください: (例) (R,G,B)=(128,64,0)のとき、[=128064000] 194 | TextOpacity / BackOpacity 195 | 字幕文/背景枠の透過率 196 | # [=-1]のときは自動(TSに含まれる情報をそのまま使う)です。0%[=0]~100%[=100] 197 | # で指定してください。 198 | VertAntiAliasing 199 | フォントの垂直方向アンチエイリアスを行うフォント高さ(画素数)の下限 200 | # ClearTypeフォントの横線のジャギーが気になる場合に効果的です。 201 | # Method[=2,3]のときだけ効果があります。 202 | # 字幕表示の負荷が気になる場合は[=999]などの大きな値にしてください。 203 | # フォント高さがこの設定値以下のときは、StrokeByDilate以下ならばアンチエイリ 204 | # アス処理なし、それ以外は低品質(低負荷)なアンチエイリアスをかけます。 205 | FontXAdjust / FontYAdjust / GaijiFontXAdjust* / GaijiFontYAdjust* 206 | フォント/外字フォントのX方向/Y方向の位置を補正 207 | # 文字が左寄りや上付きになるようなときに使います。 208 | FontSizeAdjust / GaijiFontSizeAdjust* 209 | フォント/外字フォントの文字サイズを調整(単位はパーセント) 210 | # たとえば[=90]とすると、通常にたいして線分比で90%の大きさになります。 211 | FontRatioAdjust / GaijiFontRatioAdjust* 212 | フォント/外字フォントの縦横比を調整(単位はパーセント) 213 | StrokeWidth 214 | 字幕文の縁取りの幅 215 | # [=0]以上のときは画面の大きさにかかわらず指定した幅で縁取ります。 216 | # [=0]より小さいときは画面に応じて縁取りの幅を調整します。 217 | OrnStrokeWidth 218 | ORN縁取り指定された字幕文の縁取りの幅 219 | # [=0]以上で指定します。 220 | # 字幕データ内で明示的に縁取りを指示されているときの幅です。 221 | StrokeSmoothLevel 222 | 縁取りをなだらかに透過させる度合い 223 | StrokeByDilate 224 | 膨張アルゴリズムで縁取るフォント高さ(画素数)の上限 225 | # 画面を小さくしたときに縁取りが汚くなる場合は値を上下させてみてください。 226 | PaddingWidth* 227 | 両端の余白をふやす幅 228 | # 文字の左右端が背景枠からはみ出るようなときに使います。 229 | AvoidHalfFlags 230 | 英字/数字/その他約物(@や!など)の半角置換を回避するフラグ 231 | # (旧AvoidHalfAlphaから拡張) 232 | # プロポーショナルな文字の描画が乱れるときに使います。 233 | # この設定でプロポーショナルフォントが破綻なく使用できるとは限りません。等幅 234 | # フォントの使用をお勧めします。 235 | IgnoreSmall 236 | 振り仮名らしきものを除外する[=1]かどうか 237 | # 厳密には小型サイズ(SSZ)の字幕文を除外します。 238 | ShiftSmall 239 | 振り仮名らしきものの行間を詰める[=1]かどうか 240 | # IgnoreSmallを[=1]にしたときの行間が気になるときに使います。 241 | Centering 242 | 字幕を画面中央に表示する[=1]かどうか 243 | # 厳密には字幕の表示領域を縦横2/3にして上部中央に配置します。 244 | ShrinkSDScale 245 | SD字幕の横幅をすこし縮める[=1]かどうか 246 | # 標準画質放送の字幕は横に引き伸ばされることが多いですが、これを補正します。 247 | ViewXAdjust / ViewYAdjust 248 | 字幕の表示位置を補正(単位はパーセント) 249 | RomSoundList* 250 | 内蔵音0~18のリストを':'区切りで指定 251 | # フォーマット: [;]{内蔵音0}:{内蔵音1}: ... :{内蔵音18} 252 | # 何も指定しないか';'でコメントアウトすると内蔵音再生しません。 253 | # 254 | # {内蔵音0}~については、プラグインフォルダにプラグインと同名(通常は 255 | # "TVCaptionMod2")のフォルダをつくり、そこに配置した"{ファイル名}.wav"という 256 | # 音声ファイルの{ファイル名}の部分を指定してください。何も指定しないかファイ 257 | # ルがなければ再生しません。 258 | # "!00"~"!15"を指定すると組み込みの内蔵音("!14"と"!15"は無音)を再生します。 259 | # これ以外で先頭を'!'にするとシステムサウンドのエイリアスを参照します。 260 | # http://dobon.net/vb/dotnet/programing/playsystemsound.html などを参考に、 261 | # 例えば「Windowsログオン」時のサウンドは !WindowsLogon となります。 262 | # 263 | # 参考-地デジの内蔵音定義(詳細はARIB TR-B14参照): 264 | # ・内蔵音0~4 速報チャイム1~5 265 | # ・内蔵音5~12 ボタン操作音1~8 266 | # ・内蔵音13 アラート音 267 | # ・内蔵音14~15 未定義 268 | # 269 | # 独自定義の内蔵音(再生テストなどに便利): 270 | # ・内蔵音16 表示設定切り替え 271 | # ・内蔵音17 プラグイン有効時 272 | # ・内蔵音18 プラグイン無効時 273 | 274 | ■ソースについて 275 | Caption.dll(現CaptionLib.lib)のソースコードはodaruさんのもの、または 276 | Caption2Ass_PCR付属のものとなるべく差分をとれるように改変してます(WinMergeなどつ 277 | かうとよいかも)。TVCaptionMod2.tvtpのほうは基本的にスクラッチです。 278 | 279 | 組み込みの内蔵音はソースコードの"rom"フォルダにあります。今のところ"!02"~"!04" 280 | の音声は"!01"のものを使います。00.wavをのぞき「無料効果音」( 281 | https://taira-komori.jpn.org/freesound.html )の素材を加工・調整したものです。 282 | 283 | TSファイルの解析のために、tsselect-0.1.8( 284 | http://www.marumo.ne.jp/junk/tsselect-0.1.8.lzh)よりソースコードを改変利用してい 285 | ます。 286 | また、TVTest ver.0.7.23から"PseudoOSD.cpp"、"PseudoOSD.h"、ほかソースコードを改 287 | 変利用しています(ソースコメントに流用元を記述しています)。 288 | また、Caption.dll改造版より多くを参考にしているので、このプラグインもCaption.dll 289 | オリジナル版の以下ライセンスに従います(TVCaptionMod2.tvtpのソースの取り扱いにつ 290 | いても同様です)。改変や流用にあたって当方に連絡は不要です。 291 | 292 | ------引用開始------ 293 | ●EpgDataCap_Bon、TSEpgView_Sample、NetworkRemocon、Caption、TSEpgViewServerの 294 | ソースの取り扱いについて 295 |  特にGPLとかにはしないので自由に改変してもらって構わないです。 296 |  改変して公開する場合は改変部分のソースぐらいは一緒に公開してください。 297 |  (強制ではないので別に公開しなくてもいいです) 298 |  EpgDataCap.dllの使い方の参考にしてもらうといいかも。 299 | 300 | ●EpgDataCap.dll、Caption.dllの取り扱いについて 301 |  フリーソフトに組み込む場合は特に制限は設けません。ただし、dllはオリジナルのまま 302 |  組み込んでください。 303 |  このdllを使用したことによって発生した問題について保証は一切行いません。 304 |  商用、シェアウェアなどに組み込むのは不可です。 305 | ------引用終了------ 306 | 307 | ■更新履歴 308 | ver.1.9 (2016-02-03) 309 | ・ソース管理をGitHubに移行した。以後の更新内容は省略 310 | ・https://github.com/xtne6f/TVCaptionMod2 311 | ver.1.8 (2013-12-10) 312 | ・文字の縦横比を調整できるようにした 313 | ・半角英字への置換をオフにできるようにした 314 | ・文字サイズを調整したときに両端の余白幅が微妙に狂うのを修正 315 | ・コード微整理 316 | ver.1.7 (2013-12-06) 317 | ・x86/x64ビルド環境をVC++2010Expressに統一 318 | ・Caption.dllを静的リンク 319 | ・OpenTypeフォント等が一覧に表示されないのを修正 320 | ・DRCS出現時のレンダリングをより正確にした 321 | ・(万が一)非常に複雑な字幕が送られても描画しきれるようにした 322 | ・おまけフォントの更新とDRCS追加 323 | ver.1.6r2 (2013-06-06) 324 | ・ARIB8CharDecode.cppのデフォルトマクロ文の誤りを修正 325 | ・ついでにCaption.dllのビルドオプションを微調整 326 | ver.1.6 (2013-03-05) 327 | ・TVTestスレPart50>>57を参考にサイドカット表示を考慮 328 | ・ただし設定キーMethod[=1,2]のときのみ 329 | ・字幕表示のちらつきを軽減 330 | ・VertAntiAliasingの定義を微妙に変更 331 | ・振り仮名の文字の縁取りが太すぎてバランスが悪いように感じたので微調整 332 | ・OsdCompositorを更新(他プラグインとのすり合わせ) 333 | ・その他コード整理とDRCS追加 334 | ver.1.5 (2012-12-21) 335 | ・一部局がMPEGヘッダのアスペクト比4:3で16:9の映像を送っている?ようなので考慮 336 | ・この辺詳しい方居れば解説を…→TVTestスレで解決済 337 | ・半角置換対象の記号を拡大、英数字も置換するようにした 338 | ver.1.4r2 (2012-11-26) 339 | ・両端の余白を増やしたとき、字幕背景に隙間や重なりができる場合があったのを修正 340 | ver.1.4 (2012-11-25) 341 | ・外字フォントの文字位置/サイズ補正をベースフォントと別に指定できるようにした 342 | ・外字テーブルファイルを更新 343 | ・設定キーが増えてきたのでiniをセクション単位読み込みに変更 344 | ・若干の冗長コード削除 345 | ver.1.3 (2012-11-17) 346 | ・プラグイン設定ダイアログを追加 347 | ・一部の設定はiniを直接編集する必要あり 348 | ・文字位置補正機能を追加 349 | ・振り仮名除外機能を追加 350 | ・両端の余白を増やせるようにした 351 | ver.1.2 (2012-08-26) 352 | ・「字幕Plugin改変版(090627)」やTVTest本体のコードを参考に、映像への字幕合成機能 353 | を追加(設定キーEnOsdCompositor) 354 | ・設定キーFixRatioを廃止(今後は常に[=1]相当) 355 | ver.1.1 (2012-08-14) 356 | ・サロゲートペアに対応 357 | ・Windows TV ゴシックの通称「つちよし」などを表示できるようになった 358 | ・関連して外字テーブルのファイルを修正 359 | ・約物の半角置換処理を改善 360 | ・スレを参考にフラッシング制御(FLC)を背景も含めて明滅させるようにした 361 | ver.1.0 (2012-07-19) 362 | ・0.9→1.0だけど特に大きなバージョンアップではない 363 | ・フラッシング制御(FLC)に対応 364 | ・初めて見ました。サンプル提供感謝します 365 | ・1/2幅で描画すべき約物について、可能なら一部を半角に置きかえるようにした 366 | ・「字幕付き画像の保存」機能を追加 367 | ・レンダラによっては「字幕付き画像のコピー」の比率がおかしくなるのを修正 368 | ・囲み制御(HLC)の囲み線にも膨張処理がかかってしまうのを修正 369 | ・デフォルトの字幕以外の字幕が混在して表示される場合があったのを修正 370 | ・0.9r4以前はサービスごとに字幕および文字スーパーそれぞれ最大1つであることを仮 371 | 定していたため。1.0以降はコンポーネントタグを確認するようにした 372 | ・情報、サンプル提供サンクスです 373 | ・ver.0.9r4でワンセグ字幕が表示されなくなっていたのを修正 374 | ver.0.9r4 (2012-07-16) 375 | ・CM明けなどに字幕が表示されない可能性を排除(できたかもしれない) 376 | ・文字サイズ小のときは垂直方向アンチエイリアスを切れるようにした 377 | ・設定キーVertAntiAliasingとStrokeByDilateのデフォルト値に変更があるので注意 378 | ver.0.9r3 (2012-07-04) 379 | ・通常フォントと外字フォントの(上端ではなく)下端を揃えるようにしてみた 380 | ・この修正でメイリオなどのレディングの大きいフォントは下付き→上付きになるが、 381 | こういうフォントは横方向の合わせも必要だったりするのでとりあえず対応を保留 382 | ver.0.9r2 (2012-07-01) 383 | ・Caption.dll 0111改造版の公開停止要望があったとの書き込みをうけ、関連するコード 384 | (10行ぐらい)を変更 385 | ・変更点はdiff_09_09r2.txtを参照 386 | ・機能変更はなし 387 | ver.0.9 (2012-06-29) 388 | ・垂直方向アンチエイリアスを利かせてみた(設定キーVertAntiAliasing) 389 | ・文字サイズを微調整できるようにした(設定キーFontSizeAdjust) 390 | ・レンダリングの細かな最適化 391 | ver.0.8 (2012-06-13) 392 | ・字幕付きでクリップボードに画像コピーできるようにした 393 | ・DRCSを文字列置換できるようにした(設定キーGaijiTableNameの説明を参照) 394 | ver.0.7 (2012-06-08) 395 | ・スレ報告より以下3点を修正・追加 396 | ・マルチ放送などでのサービス切り替え動作をチェックしてなかったのを修正 397 | ・PTSが信用できないソースに対するフォローを追加 (設定キーIgnorePts) 398 | ・プラグイン有効/無効時の内蔵音を追加 399 | ver.0.6 (2012-06-02) 400 | ・文字スーパーに対応(未検証) 401 | ・字幕ウィンドウがなるべく前面に来ないようにした 402 | ・TVTestが非表示状態(最小化起動を含む)のときに字幕が表示されてしまうのを修正 403 | ・スレの指摘サンクスです 404 | ・言語切り替えを改善 405 | ・実質機能してなかったので修正 406 | ・第2言語のない番組は第1言語の字幕/文字スーパーを表示するようにした 407 | ・切り替え時にTVTestのログに出すようにした 408 | ver.0.5 (2012-05-28) 409 | ・外字用のフォントを別に指定できるようにした 410 | ・内蔵音再生(PRA)に対応(未検証) 411 | ・文字スーパーに未対応なのであまり意味ないかも 412 | ver.0.4 (2012-05-26) 413 | ・TVH264のワンセグ字幕に対応 414 | ・Caption.dll:冗長なバイナリを吐いていた部分をすこし改変 415 | ・人柱表記をはずした 416 | ver.0.3 (2012-05-20) 417 | ・字幕表示のちらつき防止と効率化 418 | ver.0.2 (2012-05-17) 419 | ・画面左上の字幕の位置がずれる場合があったのを修正 420 | ・映像とウィンドウのアスペクト比がことなる場合の動作を改善 421 | ・縁取りがあんまり綺麗じゃなかったので修正 422 | ver.0.1 (2012-05-14) 423 | ・初版 424 | --------------------------------------------------------------------------------