plugins.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:20k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #include "stdafx.h"
  22. #include <afxdlgs.h>
  23. #include <atlpath.h>
  24. #include "resource.h"
  25. #include "......subtitlesVobSubFile.h"
  26. #include "......subtitlesRTS.h"
  27. #include "......SubPicMemSubPic.h"
  28. //
  29. // Generic interface
  30. //
  31. namespace Plugin
  32. {
  33. class CFilter : public CAMThread, public CCritSec
  34. {
  35. private:
  36. CString m_fn;
  37. protected:
  38. float m_fps;
  39. CCritSec m_csSubLock;
  40. CComPtr<ISubPicQueue> m_pSubPicQueue;
  41. CComPtr<ISubPicProvider> m_pSubPicProvider;
  42. DWORD_PTR m_SubPicProviderId;
  43. public:
  44. CFilter() : m_fps(-1), m_SubPicProviderId(0) {CAMThread::Create();}
  45. virtual ~CFilter() {CAMThread::CallWorker(0);}
  46. CString GetFileName() {CAutoLock cAutoLock(this); return m_fn;}
  47. void SetFileName(CString fn) {CAutoLock cAutoLock(this); m_fn = fn;}
  48. bool Render(SubPicDesc& dst, REFERENCE_TIME rt, float fps)
  49. {
  50. if(!m_pSubPicProvider)
  51. return(false);
  52. CSize size(dst.w, dst.h);
  53. if(!m_pSubPicQueue)
  54. {
  55. CComPtr<ISubPicAllocator> pAllocator = new CMemSubPicAllocator(dst.type, size);
  56. HRESULT hr;
  57. if(!(m_pSubPicQueue = new CSubPicQueueNoThread(pAllocator, &hr)) || FAILED(hr))
  58. {
  59. m_pSubPicQueue = NULL;
  60. return(false);
  61. }
  62. }
  63. if(m_SubPicProviderId != (DWORD_PTR)(ISubPicProvider*)m_pSubPicProvider)
  64. {
  65. m_pSubPicQueue->SetSubPicProvider(m_pSubPicProvider);
  66. m_SubPicProviderId = (DWORD_PTR)(ISubPicProvider*)m_pSubPicProvider;
  67. }
  68. CComPtr<ISubPic> pSubPic;
  69. if(!m_pSubPicQueue->LookupSubPic(rt, &pSubPic))
  70. return(false);
  71. CRect r;
  72. pSubPic->GetDirtyRect(r);
  73. if(dst.type == MSP_RGB32 || dst.type == MSP_RGB24 || dst.type == MSP_RGB16 || dst.type == MSP_RGB15)
  74. dst.h = -dst.h;
  75. pSubPic->AlphaBlt(r, r, &dst);
  76. return(true);
  77. }
  78. DWORD ThreadProc()
  79. {
  80. SetThreadPriority(m_hThread, THREAD_PRIORITY_LOWEST);
  81. CArray<HANDLE> handles;
  82. handles.Add(GetRequestHandle());
  83. CString fn = GetFileName();
  84. CFileStatus fs;
  85. fs.m_mtime = 0;
  86. CFileGetStatus(fn, fs);
  87. while(1)
  88. {
  89. DWORD i = WaitForMultipleObjects(handles.GetSize(), handles.GetData(), FALSE, 1000);
  90. if(WAIT_OBJECT_0 == i)
  91. {
  92. Reply(S_OK);
  93. break;
  94. }
  95. else if(WAIT_ABANDONED_0 == i)
  96. {
  97. break;
  98. }
  99. else if(WAIT_OBJECT_0 + 1 >= i && i <= WAIT_OBJECT_0 + handles.GetCount())
  100. {
  101. if(FindNextChangeNotification(handles[i - WAIT_OBJECT_0]))
  102. {
  103. CFileStatus fs2;
  104. fs2.m_mtime = 0;
  105. CFileGetStatus(fn, fs2);
  106. if(fs.m_mtime < fs2.m_mtime)
  107. {
  108. fs.m_mtime = fs2.m_mtime;
  109. if(CComQIPtr<ISubStream> pSubStream = m_pSubPicProvider)
  110. {
  111. CAutoLock cAutoLock(&m_csSubLock);
  112. pSubStream->Reload();
  113. }
  114. }
  115. }
  116. }
  117. else if(WAIT_TIMEOUT == i)
  118. {
  119. CString fn2 = GetFileName();
  120. if(fn != fn2)
  121. {
  122. CPath p(fn2);
  123. p.RemoveFileSpec();
  124. HANDLE h = FindFirstChangeNotification(p, FALSE, FILE_NOTIFY_CHANGE_LAST_WRITE); 
  125. if(h != INVALID_HANDLE_VALUE)
  126. {
  127. fn = fn2;
  128. handles.SetSize(1);
  129. handles.Add(h);
  130. }
  131. }
  132. }
  133. }
  134. for(int i = 1; i < handles.GetCount(); i++)
  135. FindCloseChangeNotification(handles[i]);
  136. return 0;
  137. }
  138. };
  139. class CVobSubFilter : virtual public CFilter
  140. {
  141. public:
  142. CVobSubFilter(CString fn = _T(""))
  143. {
  144. if(!fn.IsEmpty()) Open(fn);
  145. }
  146. bool Open(CString fn)
  147. {
  148. SetFileName(_T(""));
  149. m_pSubPicProvider = NULL;
  150. if(CVobSubFile* vsf = new CVobSubFile(&m_csSubLock))
  151. {
  152. m_pSubPicProvider = (ISubPicProvider*)vsf;
  153. if(vsf->Open(CString(fn))) SetFileName(fn);
  154. else m_pSubPicProvider = NULL;
  155. }
  156. return !!m_pSubPicProvider;
  157. }
  158. };
  159. class CTextSubFilter : virtual public CFilter
  160. {
  161. int m_CharSet;
  162. public:
  163. CTextSubFilter(CString fn = _T(""), int CharSet = DEFAULT_CHARSET, float fps = -1)
  164. : m_CharSet(CharSet)
  165. {
  166. m_fps = fps;
  167. if(!fn.IsEmpty()) Open(fn, CharSet);
  168. }
  169. int GetCharSet() {return(m_CharSet);}
  170. bool Open(CString fn, int CharSet = DEFAULT_CHARSET)
  171. {
  172. SetFileName(_T(""));
  173. m_pSubPicProvider = NULL;
  174. if(CRenderedTextSubtitle* rts = new CRenderedTextSubtitle(&m_csSubLock))
  175. {
  176. m_pSubPicProvider = (ISubPicProvider*)rts;
  177. if(rts->Open(CString(fn), CharSet)) SetFileName(fn);
  178. else m_pSubPicProvider = NULL;
  179. }
  180. return !!m_pSubPicProvider;
  181. }
  182. };
  183. //
  184. // VirtualDub interface
  185. //
  186. namespace VirtualDub
  187. {
  188. #include "........includeVirtualDubVirtualDub.h"
  189. class CVirtualDubFilter : virtual public CFilter
  190. {
  191. public:
  192. CVirtualDubFilter() {}
  193. virtual ~CVirtualDubFilter() {}
  194. virtual int RunProc(const FilterActivation* fa, const FilterFunctions* ff)
  195. {
  196. SubPicDesc dst;
  197. dst.type = MSP_RGB32;
  198. dst.w = fa->src.w;
  199. dst.h = fa->src.h;
  200. dst.bpp = 32;
  201. dst.pitch = fa->src.pitch;
  202. dst.bits = (LPVOID)fa->src.data;
  203. Render(dst, 10000i64*fa->pfsi->lSourceFrameMS, (float)1000 / fa->pfsi->lMicrosecsPerFrame);
  204. return 0;
  205. }
  206. virtual long ParamProc(FilterActivation* fa, const FilterFunctions* ff)
  207. {
  208. fa->dst.offset = fa->src.offset;
  209. fa->dst.modulo = fa->src.modulo;
  210. fa->dst.pitch = fa->src.pitch;
  211. return 0;
  212. }
  213. virtual int ConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd) = 0;
  214. virtual void StringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str) = 0;
  215. virtual bool FssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen) = 0;
  216. };
  217. class CVobSubVirtualDubFilter : public CVobSubFilter, public CVirtualDubFilter
  218. {
  219. public:
  220. CVobSubVirtualDubFilter(CString fn = _T("")) 
  221. : CVobSubFilter(fn) {}
  222. int ConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd)
  223. {
  224. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  225. CFileDialog fd(TRUE, NULL, GetFileName(), OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY, 
  226. _T("VobSub files (*.idx;*.sub)|*.idx;*.sub||"), CWnd::FromHandle(hwnd), 0);
  227. if(fd.DoModal() != IDOK) return 1;
  228. return Open(fd.GetPathName()) ? 0 : 1;
  229. }
  230. void StringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str)
  231. {
  232. sprintf(str, " (%s)", !GetFileName().IsEmpty() ? CStringA(GetFileName()) : " (empty)");
  233. }
  234. bool FssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen)
  235. {
  236. CStringA fn(GetFileName());
  237. fn.Replace("\", "\\");
  238. _snprintf(buf, buflen, "Config("%s")", fn);
  239. return(true);
  240. }
  241. };
  242. class CTextSubVirtualDubFilter : public CTextSubFilter, public CVirtualDubFilter
  243. {
  244. public:
  245. CTextSubVirtualDubFilter(CString fn = _T(""), int CharSet = DEFAULT_CHARSET) 
  246. : CTextSubFilter(fn, CharSet) {}
  247. int ConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd)
  248. {
  249. AFX_MANAGE_STATE(AfxGetStaticModuleState());
  250. const TCHAR formats[] = _T("TextSub files (*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt)|*.sub;*.srt;*.smi;*.ssa;*.ass;*.xss;*.psb;*.txt||");
  251. CFileDialog fd(TRUE, NULL, GetFileName(), OFN_EXPLORER|OFN_ENABLESIZING|OFN_HIDEREADONLY|OFN_ENABLETEMPLATE|OFN_ENABLEHOOK, 
  252. formats, CWnd::FromHandle(hwnd), OPENFILENAME_SIZE_VERSION_400 /*0*/);
  253. UINT CALLBACK OpenHookProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam);
  254. fd.m_pOFN->hInstance = AfxGetResourceHandle();
  255. fd.m_pOFN->lpTemplateName = MAKEINTRESOURCE(IDD_TEXTSUBOPENTEMPLATE);
  256. fd.m_pOFN->lpfnHook = OpenHookProc;
  257. fd.m_pOFN->lCustData = (LPARAM)DEFAULT_CHARSET;
  258. if(fd.DoModal() != IDOK) return 1;
  259. return Open(fd.GetPathName(), fd.m_pOFN->lCustData) ? 0 : 1;
  260. }
  261. void StringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str)
  262. {
  263. if(!GetFileName().IsEmpty()) sprintf(str, " (%s, %d)", CStringA(GetFileName()), GetCharSet());
  264. else sprintf(str, " (empty)");
  265. }
  266. bool FssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen)
  267. {
  268. CStringA fn(GetFileName());
  269. fn.Replace("\", "\\");
  270. _snprintf(buf, buflen, "Config("%s", %d)", fn, GetCharSet());
  271. return(true);
  272. }
  273. };
  274. int vobsubInitProc(FilterActivation* fa, const FilterFunctions* ff)
  275. {
  276. return !(*(CVirtualDubFilter**)fa->filter_data = new CVobSubVirtualDubFilter());
  277. }
  278. int textsubInitProc(FilterActivation* fa, const FilterFunctions* ff)
  279. {
  280. return !(*(CVirtualDubFilter**)fa->filter_data = new CTextSubVirtualDubFilter());
  281. }
  282. void baseDeinitProc(FilterActivation* fa, const FilterFunctions* ff)
  283. {
  284. CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
  285. if(f) delete f, f = NULL;
  286. }
  287. int baseRunProc(const FilterActivation* fa, const FilterFunctions* ff)
  288. {
  289. CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
  290. return f ? f->RunProc(fa, ff) : 1;
  291. }
  292. long baseParamProc(FilterActivation* fa, const FilterFunctions* ff)
  293. {
  294. CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
  295. return f ? f->ParamProc(fa, ff) : 1;
  296. }
  297. int baseConfigProc(FilterActivation* fa, const FilterFunctions* ff, HWND hwnd)
  298. {
  299. CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
  300. return f ? f->ConfigProc(fa, ff, hwnd) : 1;
  301. }
  302. void baseStringProc(const FilterActivation* fa, const FilterFunctions* ff, char* str)
  303. {
  304. CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
  305. if(f) f->StringProc(fa, ff, str);
  306. }
  307. bool baseFssProc(FilterActivation* fa, const FilterFunctions* ff, char* buf, int buflen)
  308. {
  309. CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
  310. return f ? f->FssProc(fa, ff, buf, buflen) : false;
  311. }
  312. void vobsubScriptConfig(IScriptInterpreter* isi, void* lpVoid, CScriptValue* argv, int argc)
  313. {
  314. FilterActivation* fa = (FilterActivation*)lpVoid;
  315. CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
  316. if(f) delete f;
  317. f = new CVobSubVirtualDubFilter(CString(*argv[0].asString()));
  318. *(CVirtualDubFilter**)fa->filter_data = f;
  319. }
  320. void textsubScriptConfig(IScriptInterpreter* isi, void* lpVoid, CScriptValue* argv, int argc)
  321. {
  322. FilterActivation* fa = (FilterActivation*)lpVoid;
  323. CVirtualDubFilter* f = *(CVirtualDubFilter**)fa->filter_data;
  324. if(f) delete f;
  325. f = new CTextSubVirtualDubFilter(CString(*argv[0].asString()), argv[1].asInt());
  326. *(CVirtualDubFilter**)fa->filter_data = f;
  327. }
  328. ScriptFunctionDef vobsub_func_defs[]={
  329. { (ScriptFunctionPtr)vobsubScriptConfig, "Config", "0s" },
  330. { NULL },
  331. };
  332. CScriptObject vobsub_obj={
  333. NULL, vobsub_func_defs
  334. };
  335. struct FilterDefinition filterDef_vobsub = 
  336. {
  337. NULL, NULL, NULL,       // next, prev, module
  338. "VobSub", // name
  339. "Adds subtitles from a vob sequence.", // desc
  340. "Gabest",               // maker
  341. NULL,                   // private_data
  342. sizeof(CVirtualDubFilter**), // inst_data_size
  343. vobsubInitProc,         // initProc
  344. baseDeinitProc, // deinitProc
  345. baseRunProc, // runProc
  346. baseParamProc, // paramProc
  347. baseConfigProc, // configProc
  348. baseStringProc, // stringProc
  349. NULL, // startProc
  350. NULL, // endProc
  351. &vobsub_obj, // script_obj
  352. baseFssProc, // fssProc
  353. };
  354. ScriptFunctionDef textsub_func_defs[]={
  355. { (ScriptFunctionPtr)textsubScriptConfig, "Config", "0si" },
  356. { NULL },
  357. };
  358. CScriptObject textsub_obj={
  359. NULL, textsub_func_defs
  360. };
  361. struct FilterDefinition filterDef_textsub = 
  362. {
  363. NULL, NULL, NULL,       // next, prev, module
  364. "TextSub", // name
  365. "Adds subtitles from srt, sub, psb, smi, ssa, ass file formats.", // desc
  366. "Gabest",               // maker
  367. NULL,                   // private_data
  368. sizeof(CVirtualDubFilter**), // inst_data_size
  369. textsubInitProc,        // initProc
  370. baseDeinitProc, // deinitProc
  371. baseRunProc, // runProc
  372. baseParamProc, // paramProc
  373. baseConfigProc, // configProc
  374. baseStringProc, // stringProc
  375. NULL, // startProc
  376. NULL, // endProc
  377. &textsub_obj, // script_obj
  378. baseFssProc, // fssProc
  379. };
  380. static FilterDefinition* fd_vobsub;
  381. static FilterDefinition* fd_textsub;
  382. extern "C" __declspec(dllexport) int __cdecl VirtualdubFilterModuleInit2(FilterModule *fm, const FilterFunctions *ff, int& vdfd_ver, int& vdfd_compat)
  383. {
  384. if(!(fd_vobsub = ff->addFilter(fm, &filterDef_vobsub, sizeof(FilterDefinition)))
  385. || !(fd_textsub = ff->addFilter(fm, &filterDef_textsub, sizeof(FilterDefinition))))
  386. return 1;
  387. vdfd_ver = VIRTUALDUB_FILTERDEF_VERSION;
  388. vdfd_compat = VIRTUALDUB_FILTERDEF_COMPATIBLE;
  389. return 0;
  390. }
  391. extern "C" __declspec(dllexport) void __cdecl VirtualdubFilterModuleDeinit(FilterModule *fm, const FilterFunctions *ff)
  392. {
  393. ff->removeFilter(fd_textsub);
  394. ff->removeFilter(fd_vobsub);
  395. }
  396. }
  397. //
  398. // Avisynth interface
  399. //
  400. namespace AviSynth1
  401. {
  402. #include "........includeavisynthavisynth1.h"
  403. class CAvisynthFilter : public GenericVideoFilter, virtual public CFilter
  404. {
  405. public:
  406. CAvisynthFilter(PClip c, IScriptEnvironment* env) : GenericVideoFilter(c) {}
  407. PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env)
  408. {
  409. PVideoFrame frame = child->GetFrame(n, env);
  410. env->MakeWritable(&frame);
  411. SubPicDesc dst;
  412. dst.w = vi.width;
  413. dst.h = vi.height;
  414. dst.pitch = frame->GetPitch();
  415. dst.bits = (void**)frame->GetWritePtr();
  416. dst.bpp = vi.BitsPerPixel();
  417. dst.type = 
  418. vi.IsRGB32() ? MSP_RGB32 : 
  419. vi.IsRGB24() ? MSP_RGB24 : 
  420. vi.IsYUY2() ? MSP_YUY2 : 
  421. -1;
  422. float fps = m_fps > 0 ? m_fps : (float)vi.fps_numerator / vi.fps_denominator;
  423. Render(dst, (REFERENCE_TIME)(10000000i64 * n / fps), fps);
  424. return(frame);
  425. }
  426. };
  427. class CVobSubAvisynthFilter : public CVobSubFilter, public CAvisynthFilter
  428. {
  429. public:
  430. CVobSubAvisynthFilter(PClip c, const char* fn, IScriptEnvironment* env)
  431. : CVobSubFilter(CString(fn))
  432. , CAvisynthFilter(c, env)
  433. {
  434. if(!m_pSubPicProvider)
  435. env->ThrowError("VobSub: Can't open "%s"", fn);
  436. }
  437. };
  438. AVSValue __cdecl VobSubCreateS(AVSValue args, void* user_data, IScriptEnvironment* env)
  439. {
  440. return(new CVobSubAvisynthFilter(args[0].AsClip(), args[1].AsString(), env));
  441. }
  442.     
  443. class CTextSubAvisynthFilter : public CTextSubFilter, public CAvisynthFilter
  444. {
  445. public:
  446. CTextSubAvisynthFilter(PClip c, IScriptEnvironment* env, const char* fn, int CharSet = DEFAULT_CHARSET, float fps = -1)
  447. : CTextSubFilter(CString(fn), CharSet, fps)
  448. , CAvisynthFilter(c, env)
  449. {
  450. if(!m_pSubPicProvider)
  451. env->ThrowError("TextSub: Can't open "%s"", fn);
  452. }
  453. };
  454. AVSValue __cdecl TextSubCreateS(AVSValue args, void* user_data, IScriptEnvironment* env)
  455. {
  456. return(new CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString()));
  457. }
  458. AVSValue __cdecl TextSubCreateSI(AVSValue args, void* user_data, IScriptEnvironment* env)
  459. {
  460. return(new CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString(), args[2].AsInt()));
  461. }
  462. AVSValue __cdecl TextSubCreateSIF(AVSValue args, void* user_data, IScriptEnvironment* env)
  463. {
  464. return(new CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString(), args[2].AsInt(), args[3].AsFloat()));
  465. }
  466. extern "C" __declspec(dllexport) const char* __stdcall AvisynthPluginInit(IScriptEnvironment* env)
  467. {
  468. env->AddFunction("VobSub", "cs", VobSubCreateS, 0);
  469. env->AddFunction("TextSub", "cs", TextSubCreateS, 0);
  470. env->AddFunction("TextSub", "csi", TextSubCreateSI, 0);
  471. env->AddFunction("TextSub", "csif", TextSubCreateSIF, 0);
  472. return(NULL);
  473. }
  474. }
  475. namespace AviSynth25
  476. {
  477. #include "........includeavisynthavisynth25.h"
  478. static bool s_fSwapUV = false;
  479. class CAvisynthFilter : public GenericVideoFilter, virtual public CFilter
  480. {
  481. public:
  482. CAvisynthFilter(PClip c, IScriptEnvironment* env) : GenericVideoFilter(c) {}
  483. PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env)
  484. {
  485. PVideoFrame frame = child->GetFrame(n, env);
  486. env->MakeWritable(&frame);
  487. SubPicDesc dst;
  488. dst.w = vi.width;
  489. dst.h = vi.height;
  490. dst.pitch = frame->GetPitch();
  491. dst.pitchUV = frame->GetPitch(PLANAR_U);
  492. dst.bits = (void**)frame->GetWritePtr();
  493. dst.bitsU = frame->GetWritePtr(PLANAR_U);
  494. dst.bitsV = frame->GetWritePtr(PLANAR_V);
  495. dst.bpp = dst.pitch/dst.w*8; //vi.BitsPerPixel();
  496. dst.type = 
  497. vi.IsRGB32() ? MSP_RGB32 : 
  498. vi.IsRGB24() ? MSP_RGB24 : 
  499. vi.IsYUY2() ? MSP_YUY2 : 
  500. /*vi.IsYV12()*/ vi.pixel_type == VideoInfo::CS_YV12 ? (s_fSwapUV?MSP_IYUV:MSP_YV12) : 
  501. /*vi.IsIYUV()*/ vi.pixel_type == VideoInfo::CS_IYUV ? (s_fSwapUV?MSP_YV12:MSP_IYUV) : 
  502. -1;
  503. float fps = m_fps > 0 ? m_fps : (float)vi.fps_numerator / vi.fps_denominator;
  504. Render(dst, (REFERENCE_TIME)(10000000i64 * n / fps), fps);
  505. return(frame);
  506. }
  507. };
  508. class CVobSubAvisynthFilter : public CVobSubFilter, public CAvisynthFilter
  509. {
  510. public:
  511. CVobSubAvisynthFilter(PClip c, const char* fn, IScriptEnvironment* env)
  512. : CVobSubFilter(CString(fn))
  513. , CAvisynthFilter(c, env)
  514. {
  515. if(!m_pSubPicProvider)
  516. env->ThrowError("VobSub: Can't open "%s"", fn);
  517. }
  518. };
  519. AVSValue __cdecl VobSubCreateS(AVSValue args, void* user_data, IScriptEnvironment* env)
  520. {
  521. return(new CVobSubAvisynthFilter(args[0].AsClip(), args[1].AsString(), env));
  522. }
  523.     
  524. class CTextSubAvisynthFilter : public CTextSubFilter, public CAvisynthFilter
  525. {
  526. public:
  527. CTextSubAvisynthFilter(PClip c, IScriptEnvironment* env, const char* fn, int CharSet = DEFAULT_CHARSET, float fps = -1)
  528. : CTextSubFilter(CString(fn), CharSet, fps)
  529. , CAvisynthFilter(c, env)
  530. {
  531. if(!m_pSubPicProvider)
  532. env->ThrowError("TextSub: Can't open "%s"", fn);
  533. }
  534. };
  535. AVSValue __cdecl TextSubCreateS(AVSValue args, void* user_data, IScriptEnvironment* env)
  536. {
  537. return(new CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString()));
  538. }
  539. AVSValue __cdecl TextSubCreateSI(AVSValue args, void* user_data, IScriptEnvironment* env)
  540. {
  541. return(new CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString(), args[2].AsInt()));
  542. }
  543. AVSValue __cdecl TextSubCreateSIF(AVSValue args, void* user_data, IScriptEnvironment* env)
  544. {
  545. return(new CTextSubAvisynthFilter(args[0].AsClip(), env, args[1].AsString(), args[2].AsInt(), args[3].AsFloat()));
  546. }
  547. AVSValue __cdecl TextSubSwapUV(AVSValue args, void* user_data, IScriptEnvironment* env)
  548. {
  549. s_fSwapUV = args[0].AsBool(false);
  550. return(AVSValue());
  551. }
  552. extern "C" __declspec(dllexport) const char* __stdcall AvisynthPluginInit2(IScriptEnvironment* env)
  553. {
  554. env->AddFunction("VobSub", "cs", VobSubCreateS, 0);
  555. env->AddFunction("TextSub", "cs", TextSubCreateS, 0);
  556. env->AddFunction("TextSub", "csi", TextSubCreateSI, 0);
  557. env->AddFunction("TextSub", "csif", TextSubCreateSIF, 0);
  558. env->AddFunction("TextSubSwapUV", "b", TextSubSwapUV, 0);
  559. return(NULL);
  560. }
  561. }
  562. }
  563. UINT CALLBACK OpenHookProc(HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
  564. {
  565. switch(uiMsg)
  566. {
  567. case WM_NOTIFY:
  568. {
  569. OPENFILENAME* ofn = ((OFNOTIFY *)lParam)->lpOFN;
  570. if(((NMHDR *)lParam)->code == CDN_FILEOK)
  571. {
  572. ofn->lCustData = (LPARAM)CharSetList[SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_GETCURSEL, 0, 0)];
  573. }
  574. break;
  575. }
  576. case WM_INITDIALOG:
  577. {
  578. SetWindowLong(hDlg, GWL_USERDATA, lParam);
  579. for(int i = 0; i < CharSetLen; i++)
  580. {
  581. CString s;
  582. s.Format(_T("%s (%d)"), CharSetNames[i], CharSetList[i]);
  583. SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_ADDSTRING, 0, (LONG)(LPCTSTR)s);
  584. if(CharSetList[i] == (int)((OPENFILENAME*)lParam)->lCustData)
  585. SendMessage(GetDlgItem(hDlg, IDC_COMBO1), CB_SETCURSEL, i, 0);
  586. }
  587. break;
  588. }
  589. default:
  590. break;
  591. }
  592. return FALSE;
  593. }