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

多媒体编程

开发平台:

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. #pragma once
  22. #include <afxtempl.h>
  23. #include "..decssVobFile.h"
  24. #include "VobSubFile.h"
  25. #pragma pack(push)
  26. #pragma pack(1)
  27. typedef struct
  28. {
  29. WORD perm_displ       : 2;
  30. WORD ratio            : 2;
  31. WORD system           : 2;
  32. WORD compression      : 2;
  33. WORD mode             : 1;
  34. WORD letterboxed      : 1;
  35. WORD source_res       : 2;
  36. WORD cbrvbr           : 2;
  37. WORD line21_2         : 1;
  38. WORD line21_1         : 1;
  39. } vidinfo;
  40. typedef struct 
  41. {
  42. BYTE vob, cell; 
  43. DWORD tTime, tOffset, tTotal; 
  44. DWORD start, end;
  45. int iAngle; 
  46. bool fDiscontinuity;
  47. } vc_t;
  48. typedef struct 
  49. {
  50. int nAngles;
  51. CArray<vc_t> angles[10];
  52. int iSelAngle;
  53. RGBQUAD pal[16];
  54. WORD ids[32];
  55. } PGC;
  56. typedef struct VSFRipperData_t
  57. {
  58. CSize vidsize;
  59. vidinfo vidinfo;
  60. CArray<PGC> pgcs;
  61. int iSelPGC;
  62. bool fResetTime, fClosedCaption, fForcedOnly;
  63. bool fClose, fBeep, fAuto; // only used by the UI externally, but may be set through the parameter file
  64. bool fCloseIgnoreError;
  65. CUIntArray selvcs;
  66. CMap<BYTE, BYTE, bool, bool> selids;
  67. void Reset();
  68. void Copy(struct VSFRipperData_t& rd);
  69. } VSFRipperData;
  70. typedef struct {__int64 start, end; DWORD vc;} vcchunk;
  71. #pragma pack(pop)
  72. // note: these interfaces only meant to be used internally with static linking
  73. //
  74. // IVSFRipperCallback
  75. //
  76. [uuid("9E2EBB5C-AD7C-452f-A48B-38685716AC46")]
  77. interface IVSFRipperCallback : public IUnknown
  78. {
  79. STDMETHOD (OnMessage) (LPCTSTR msg) PURE;
  80. STDMETHOD (OnProgress) (double progress /*0->1*/) PURE;
  81. STDMETHOD (OnFinished) (bool fSucceeded) PURE;
  82. };
  83. // IVSFRipperCallbackImpl
  84. #ifndef QI
  85. #define QI(i) (riid == __uuidof(i)) ? GetInterface((i*)this, ppv) :
  86. #endif
  87. class IVSFRipperCallbackImpl : public CUnknown, public IVSFRipperCallback
  88. {
  89. protected:
  90. DECLARE_IUNKNOWN
  91.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv)
  92. {
  93. return 
  94. QI(IVSFRipperCallback)
  95. __super::NonDelegatingQueryInterface(riid, ppv);
  96. }
  97. // IVSFRipperCallback
  98. STDMETHODIMP OnMessage(LPCTSTR msg) {return S_FALSE;}
  99. STDMETHODIMP OnProgress(double progress /*0->1*/) {return S_FALSE;}
  100. STDMETHODIMP OnFinished(bool fSucceeded) {return S_FALSE;}
  101. public:
  102. IVSFRipperCallbackImpl() : CUnknown(NAME("IVSFRipperCallbackImpl"), NULL) {}
  103. };
  104. //
  105. // IVSFRipper
  106. //
  107. [uuid("69F935BB-B8D0-43f5-AA2E-BBD0851CC9A6")]
  108. interface IVSFRipper : public IUnknown
  109. {
  110. STDMETHOD (SetCallBack) (IVSFRipperCallback* pCallback) PURE;
  111. STDMETHOD (LoadParamFile) (CString fn) PURE;
  112. STDMETHOD (SetInput) (CString infn) PURE;
  113. STDMETHOD (SetOutput) (CString outfn) PURE;
  114. STDMETHOD (GetRipperData) (VSFRipperData& rd) PURE;
  115. STDMETHOD (UpdateRipperData) (VSFRipperData& rd) PURE;
  116. STDMETHOD (Index) () PURE;
  117. STDMETHOD (IsIndexing) () PURE;
  118. STDMETHOD (Abort) (bool fSavePartial) PURE;
  119. };
  120. class CVobSubFileRipper : public CVobSubFile, protected CAMThread, public IVSFRipper
  121. {
  122. private:
  123. bool m_fThreadActive, m_fBreakThread, m_fIndexing;
  124. enum {CMD_EXIT, CMD_INDEX};
  125. DWORD ThreadProc();
  126. bool Create();
  127. //
  128. typedef enum {LOG_INFO, LOG_WARNING, LOG_ERROR} log_t;
  129. void Log(log_t type, LPCTSTR lpszFormat, ...);
  130. void Progress(double progress);
  131. void Finished(bool fSucceeded);
  132. //
  133. CCritSec m_csAccessLock;
  134. CString m_infn, m_outfn;
  135. CVobFile m_vob;
  136. VSFRipperData m_rd;
  137. bool LoadIfo(CString fn);
  138. bool LoadVob(CString fn);
  139. bool LoadChunks(CArray<vcchunk>& chunks), SaveChunks(CArray<vcchunk>& chunks);
  140. //
  141. CCritSec m_csCallback;
  142. CComPtr<IVSFRipperCallback> m_pCallback;
  143. public:
  144.     CVobSubFileRipper();
  145.     virtual ~CVobSubFileRipper();
  146. DECLARE_IUNKNOWN
  147.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  148. // IVSFRipper
  149. STDMETHODIMP SetCallBack(IVSFRipperCallback* pCallback);
  150. STDMETHODIMP LoadParamFile(CString fn);
  151. STDMETHODIMP SetInput(CString infn);
  152. STDMETHODIMP SetOutput(CString outfn);
  153. STDMETHODIMP GetRipperData(VSFRipperData& rd);
  154. STDMETHODIMP UpdateRipperData(VSFRipperData& rd);
  155. STDMETHODIMP Index();
  156. STDMETHODIMP IsIndexing();
  157. STDMETHODIMP Abort(bool fSavePartial);
  158. };