VobSubFile.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 "VobSubImage.h"
  24. #include "..SubPicISubPic.h"
  25. #define VOBSUBIDXVER 7
  26. extern CString FindLangFromId(WORD id);
  27. class CVobSubSettings
  28. {
  29. protected:
  30. HRESULT Render(SubPicDesc& spd, RECT& bbox);
  31. public:
  32. CSize m_size;
  33. int m_x, m_y;
  34. CPoint m_org;
  35. int m_scale_x, m_scale_y; // % (don't set it to unsigned because as a side effect it will mess up negative coordinates in GetDestrect())
  36. int m_alpha; // %
  37. int m_fSmooth; // 0: OFF, 1: ON, 2: OLD (means no filtering at all)
  38. int m_fadein, m_fadeout; // ms
  39. bool m_fAlign;
  40. int m_alignhor, m_alignver; // 0: left/top, 1: center, 2: right/bottom
  41. unsigned int m_toff; // ms
  42. bool m_fOnlyShowForcedSubs;
  43. bool m_fCustomPal;
  44. int m_tridx;
  45. RGBQUAD m_orgpal[16], m_cuspal[4];
  46. CVobSubImage m_img;
  47. CVobSubSettings() {InitSettings();}
  48. void InitSettings();
  49. bool GetCustomPal(RGBQUAD* cuspal, int& tridx);
  50.     void SetCustomPal(RGBQUAD* cuspal, int tridx);
  51. void GetDestrect(CRect& r); // destrect of m_img, considering the current alignment mode
  52. void GetDestrect(CRect& r, int w, int h); // this will scale it to the frame size of (w, h)
  53. void SetAlignment(bool fAlign, int x, int y, int hor, int ver);
  54. };
  55. [uuid("998D4C9A-460F-4de6-BDCD-35AB24F94ADF")]
  56. class CVobSubFile : public CVobSubSettings, public ISubStream, public ISubPicProviderImpl
  57. {
  58. protected:
  59. CString m_title;
  60. void TrimExtension(CString& fn);
  61. bool ReadIdx(CString fn, int& ver), ReadSub(CString fn), ReadRar(CString fn), ReadIfo(CString fn);
  62. bool WriteIdx(CString fn), WriteSub(CString fn);
  63. CMemFile m_sub;
  64. BYTE* GetPacket(int idx, int& packetsize, int& datasize, int iLang = -1);
  65. bool GetFrame(int idx, int iLang = -1);
  66. bool GetFrameByTimeStamp(__int64 time);
  67. int GetFrameIdxByTimeStamp(__int64 time);
  68. bool SaveVobSub(CString fn);
  69. bool SaveWinSubMux(CString fn);
  70. bool SaveScenarist(CString fn);
  71. bool SaveMaestro(CString fn);
  72. public:
  73. typedef struct
  74. {
  75. __int64 filepos;
  76. __int64 start, stop;
  77. bool fForced;
  78. char vobid, cellid;
  79. __int64 celltimestamp;
  80. bool fValid;
  81. } SubPos;
  82. typedef struct
  83. {
  84. int id;
  85. CString name, alt;
  86. CArray<SubPos> subpos;
  87. } SubLang;
  88. int m_iLang;
  89. SubLang m_langs[32];
  90. public:
  91. CVobSubFile(CCritSec* pLock);
  92. virtual ~CVobSubFile();
  93. bool Copy(CVobSubFile& vsf);
  94. typedef enum {None,VobSub,WinSubMux,Scenarist,Maestro} SubFormat;
  95. bool Open(CString fn);
  96. bool Save(CString fn, SubFormat sf = VobSub);
  97. void Close();
  98. CString GetTitle() {return(m_title);}
  99. DECLARE_IUNKNOWN
  100.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  101. // ISubPicProvider
  102. STDMETHODIMP_(POSITION) GetStartPosition(REFERENCE_TIME rt, double fps);
  103. STDMETHODIMP_(POSITION) GetNext(POSITION pos);
  104. STDMETHODIMP_(REFERENCE_TIME) GetStart(POSITION pos, double fps);
  105. STDMETHODIMP_(REFERENCE_TIME) GetStop(POSITION pos, double fps);
  106. STDMETHODIMP_(bool) IsAnimated(POSITION pos);
  107. STDMETHODIMP Render(SubPicDesc& spd, REFERENCE_TIME rt, double fps, RECT& bbox);
  108. // IPersist
  109. STDMETHODIMP GetClassID(CLSID* pClassID);
  110. // ISubStream
  111. STDMETHODIMP_(int) GetStreamCount();
  112. STDMETHODIMP GetStreamInfo(int i, WCHAR** ppName, LCID* pLCID);
  113. STDMETHODIMP_(int) GetStream();
  114. STDMETHODIMP SetStream(int iStream);
  115. STDMETHODIMP Reload();
  116. };
  117. [uuid("D7FBFB45-2D13-494F-9B3D-FFC9557D5C45")]
  118. class CVobSubStream : public CVobSubSettings, public ISubStream, public ISubPicProviderImpl
  119. {
  120. CString m_name;
  121. CCritSec m_csSubPics;
  122. struct SubPic {REFERENCE_TIME tStart, tStop; CArray<BYTE> pData;};
  123. CAutoPtrList<SubPic> m_subpics;
  124. public:
  125. CVobSubStream(CCritSec* pLock);
  126. virtual ~CVobSubStream();
  127. void Open(CString name, BYTE* pData, int len);
  128.     void Add(REFERENCE_TIME tStart, REFERENCE_TIME tStop, BYTE* pData, int len);
  129. void RemoveAll();
  130. DECLARE_IUNKNOWN
  131.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  132. // ISubPicProvider
  133. STDMETHODIMP_(POSITION) GetStartPosition(REFERENCE_TIME rt, double fps);
  134. STDMETHODIMP_(POSITION) GetNext(POSITION pos);
  135. STDMETHODIMP_(REFERENCE_TIME) GetStart(POSITION pos, double fps);
  136. STDMETHODIMP_(REFERENCE_TIME) GetStop(POSITION pos, double fps);
  137. STDMETHODIMP_(bool) IsAnimated(POSITION pos);
  138. STDMETHODIMP Render(SubPicDesc& spd, REFERENCE_TIME rt, double fps, RECT& bbox);
  139. // IPersist
  140. STDMETHODIMP GetClassID(CLSID* pClassID);
  141. // ISubStream
  142. STDMETHODIMP_(int) GetStreamCount();
  143. STDMETHODIMP GetStreamInfo(int i, WCHAR** ppName, LCID* pLCID);
  144. STDMETHODIMP_(int) GetStream();
  145. STDMETHODIMP SetStream(int iStream);
  146. STDMETHODIMP Reload() {return E_NOTIMPL;}
  147. };