PlayerSubresyncBar.cpp
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:7k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 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. // PlayerSubresyncBar.cpp : implementation file
  22. //
  23. #include "stdafx.h"
  24. #include "mplayerc.h"
  25. #include "mainfrm.h"
  26. #include "PlayerSubresyncBar.h"
  27. // CPlayerSubresyncBar
  28. IMPLEMENT_DYNAMIC(CPlayerSubresyncBar, CSizingControlBarG)
  29. CPlayerSubresyncBar::CPlayerSubresyncBar()
  30. {
  31. m_rt = 0;
  32. m_fUnlink = false;
  33. m_lastSegment = -1;
  34. }
  35. CPlayerSubresyncBar::~CPlayerSubresyncBar()
  36. {
  37. }
  38. BOOL CPlayerSubresyncBar::Create(CWnd* pParentWnd, CCritSec* pSubLock)
  39. {
  40. if(!CSizingControlBarG::Create(_T("Subresync"), pParentWnd, 0))
  41. return FALSE;
  42. m_pSubLock = pSubLock;
  43. m_list.CreateEx(
  44. WS_EX_DLGMODALFRAME|WS_EX_CLIENTEDGE, 
  45. WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_TABSTOP|LVS_REPORT/*|LVS_SHOWSELALWAYS*/|LVS_AUTOARRANGE|LVS_NOSORTHEADER, 
  46. CRect(0,0,100,100), this, IDC_SUBRESYNCLIST);
  47. m_list.SetExtendedStyle(m_list.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_DOUBLEBUFFER);
  48. return TRUE;
  49. }
  50. BOOL CPlayerSubresyncBar::PreCreateWindow(CREATESTRUCT& cs)
  51. {
  52. if(!CSizingControlBarG::PreCreateWindow(cs))
  53. return FALSE;
  54. return TRUE;
  55. }
  56. BOOL CPlayerSubresyncBar::PreTranslateMessage(MSG* pMsg)
  57. {
  58. if(IsWindow(pMsg->hwnd) && IsVisible() && pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST)
  59. {
  60. if(IsShortCut(pMsg) || IsDialogMessage(pMsg))
  61. return TRUE;
  62. }
  63. return CSizingControlBarG::PreTranslateMessage(pMsg);
  64. }
  65. void CPlayerSubresyncBar::SetTime(__int64 rt)
  66. {
  67. m_rt = rt;
  68. int curSegment;
  69. if(!m_sts.SearchSubs((int)(rt/10000), 25, &curSegment))
  70. {
  71. curSegment = -1;
  72. }
  73. if(m_lastSegment != curSegment) m_list.Invalidate();
  74. m_lastSegment = curSegment;
  75. }
  76. void CPlayerSubresyncBar::SetSubtitle(ISubStream* pSubStream, double fps)
  77. {
  78. m_pSubStream = pSubStream;
  79. m_mode = NONE;
  80. m_lastSegment = -1;
  81. m_sts.Empty();
  82. ResetSubtitle();
  83. if(!m_pSubStream) return;
  84. CLSID clsid;
  85. m_pSubStream->GetClassID(&clsid);
  86. if(clsid == __uuidof(CVobSubFile))
  87. {
  88. CVobSubFile* pVSF = (CVobSubFile*)(ISubStream*)m_pSubStream;
  89. m_mode = VOBSUB;
  90. CAtlArray<CVobSubFile::SubPos>& sp = pVSF->m_langs[pVSF->m_iLang].subpos;
  91. for(int i = 0, j = sp.GetCount(); i < j; i++)
  92. {
  93. CString str;
  94. str.Format(_T("%d,%d,%d,%d"), sp[i].vobid, sp[i].cellid, sp[i].fForced, i);
  95. m_sts.Add(TToW(str), false, (int)sp[i].start, (int)sp[i].stop);
  96. }
  97. m_sts.CreateDefaultStyle(DEFAULT_CHARSET);
  98. pVSF->m_fOnlyShowForcedSubs = false;
  99. for(int i = 0, j = m_list.GetHeaderCtrl()->GetItemCount(); i < j; i++) m_list.DeleteColumn(0);
  100. m_list.InsertColumn(COL_START, _T("Time"), LVCFMT_LEFT, 80);
  101. m_list.InsertColumn(COL_END, _T("End"), LVCFMT_LEFT, 80);
  102. m_list.InsertColumn(COL_PREVSTART, _T("Preview"), LVCFMT_LEFT, 80);
  103. m_list.InsertColumn(COL_PREVEND, _T("End"), LVCFMT_LEFT, 80);
  104. m_list.InsertColumn(COL_VOBID, _T("Vob ID"), LVCFMT_CENTER, 60);
  105. m_list.InsertColumn(COL_CELLID, _T("Cell ID"), LVCFMT_CENTER, 60);
  106. m_list.InsertColumn(COL_FORCED, _T("Forced"), LVCFMT_CENTER, 60);
  107. }
  108. else if(clsid == __uuidof(CRenderedTextSubtitle))
  109. {
  110. CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream;
  111. m_mode = TEXTSUB;
  112. m_sts.Copy(*pRTS);
  113. m_sts.ConvertToTimeBased(fps);
  114. m_sts.Sort(true); /*!!m_fUnlink*/
  115. #ifndef UNICODE
  116. if(!m_sts.IsEntryUnicode(0))
  117. {
  118. CFont* f = m_list.GetFont();
  119. LOGFONT lf;
  120. f->GetLogFont(&lf);
  121. lf.lfCharSet = m_sts.GetCharSet(0);
  122. m_font.DeleteObject();
  123. m_font.CreateFontIndirect(&lf);
  124. m_list.SetFont(&m_font);
  125. }
  126. #endif
  127. for(int i = 0, j = m_list.GetHeaderCtrl()->GetItemCount(); i < j; i++) m_list.DeleteColumn(0);
  128. m_list.InsertColumn(COL_START, _T("Time"), LVCFMT_LEFT, 90);
  129. m_list.InsertColumn(COL_END, _T("End"), LVCFMT_LEFT, 4);
  130. m_list.InsertColumn(COL_PREVSTART, _T("Preview"), LVCFMT_LEFT, 80);
  131. m_list.InsertColumn(COL_PREVEND, _T("End"), LVCFMT_LEFT, 4);
  132. m_list.InsertColumn(COL_TEXT, _T("Text"), LVCFMT_LEFT, 275);
  133. m_list.InsertColumn(COL_STYLE, _T("Style"), LVCFMT_LEFT, 80);
  134. m_list.InsertColumn(COL_FONT, _T("Font"), LVCFMT_LEFT, 60);
  135. m_list.InsertColumn(COL_CHARSET, _T("CharSet"), LVCFMT_CENTER, 20);
  136. m_list.InsertColumn(COL_UNICODE, _T("Unicode"), LVCFMT_CENTER, 40);
  137. m_list.InsertColumn(COL_LAYER, _T("Layer"), LVCFMT_CENTER, 50);
  138. m_list.InsertColumn(COL_ACTOR, _T("Actor"), LVCFMT_LEFT, 80);
  139. m_list.InsertColumn(COL_EFFECT, _T("Effect"), LVCFMT_LEFT, 80);
  140. }
  141. m_subtimes.SetCount(m_sts.GetCount());
  142. for(int i = 0, j = m_sts.GetCount(); i < j; i++)
  143. {
  144. m_subtimes[i].orgstart = m_sts[i].start;
  145. m_subtimes[i].orgend = m_sts[i].end;
  146. }
  147. ResetSubtitle();
  148. }
  149. void CPlayerSubresyncBar::ResetSubtitle()
  150. {
  151. m_list.DeleteAllItems();
  152. if(m_mode == VOBSUB || m_mode == TEXTSUB) 
  153. {
  154. TCHAR buff[32];
  155. int prevstart = INT_MIN;
  156. for(int i = 0, j = m_sts.GetCount(); i < j; i++)
  157. {
  158. m_subtimes[i].newstart = m_subtimes[i].orgstart;
  159. m_subtimes[i].newend = m_subtimes[i].orgend;
  160. FormatTime(i, buff, 0, false);
  161. m_list.InsertItem(i, buff, COL_START);
  162. FormatTime(i, buff, 0, true);
  163. m_list.SetItemText(i, COL_END, buff);
  164. if(prevstart > m_subtimes[i].orgstart) m_list.SetItemData(i, TSEP);
  165. prevstart = m_subtimes[i].orgstart;
  166. SetCheck(i, false, false);
  167. }
  168. UpdatePreview();
  169. m_list.SetColumnWidth(COL_START, LVSCW_AUTOSIZE);
  170. m_list.SetColumnWidth(COL_PREVSTART, LVSCW_AUTOSIZE);
  171. }
  172. UpdateStrings();
  173. }
  174. void CPlayerSubresyncBar::SaveSubtitle()
  175. {
  176. CMainFrame* pFrame = ((CMainFrame*)AfxGetMainWnd());
  177. if(!pFrame) return;
  178. CLSID clsid;
  179. m_pSubStream->GetClassID(&clsid);
  180. if(clsid == __uuidof(CVobSubFile) && m_mode == VOBSUB)
  181. {
  182. CVobSubFile* pVSF = (CVobSubFile*)(ISubStream*)m_pSubStream;
  183. CAutoLock cAutoLock(m_pSubLock);
  184. CAtlArray<CVobSubFile::SubPos>& sp = pVSF->m_langs[pVSF->m_iLang].subpos;
  185. for(int i = 0, j = sp.GetCount(); i < j; i++) 
  186. {
  187. sp[i].fValid = false;
  188. }
  189. for(int i = 0, j = m_sts.GetCount(); i < j; i++) 
  190. {
  191. int vobid, cellid, forced, spnum, c;
  192. if(_stscanf(m_sts.GetStr(i), _T("%d%c%d%c%d%c%d"), &vobid, &c, &cellid, &c, &forced, &c, &spnum) != 7) continue;
  193.             sp[spnum].start = m_sts[i].start;
  194. sp[spnum].stop = m_sts[i].end;
  195. sp[spnum].fValid = true;
  196. }
  197. }
  198. else if(clsid == __uuidof