├── 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 |
--------------------------------------------------------------------------------