AuxSubtitlesFormats.c
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:44k
源码类别:

DVD

开发平台:

Others

  1. /**************************************************************
  2.  *  AuxSubtitlesFormats.c
  3.  **************************************************************
  4.  *  Description:
  5.  *  ============
  6.  *  Format specific data and functions for subtitles files.
  7.  **************************************************************
  8.  *
  9.  *  Hagay Barel 14.11.03
  10.  **************************************************************/
  11. #include "Config.h" // Global Configuration - do not remove!
  12. #ifdef USE_AUX_SUBTITLES
  13. #ifdef _DEBUG
  14. #undef IFTRACE
  15. #ifdef DEBUG_AUX_SUBTITLES
  16. #define IFTRACE if (gTraceNavigator)
  17. #else
  18. #define IFTRACE
  19. #endif // DEBUG_AUX_SUBTITLES
  20. #include "Debugdbgmain.h"
  21. #endif // _DEBUG
  22. #include "PlaycoreNav_ClipsreadTextFile.h"
  23. #include "PlaycoreNav_ClipsAuxSubtitlesCommonPrivate.h"
  24. #include "PlaycoreNav_ClipsAuxSubtitles.h"
  25. #define SF_MICRODVD_PROBE_LIMIT 50
  26. BOOL readDelimitedTimeString(textFilePtr tfpFile, DWORD *dwPTS, int mult[], int number);
  27. BOOL probeSubtitlesFileMicroDVD(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize);
  28. // Robin_1003_2004_E
  29. BOOL probeSubtitlesFileSubRip  (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize);
  30. BOOL probeSubtitlesFilePowerDivX  (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize);
  31. BOOL probeSubtitlesFileAdvancedSubStationAlpha  (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize);
  32. BOOL probeSubtitlesFileSubViewer(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize);
  33. BOOL probeSubtitlesFileTMPlayer(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize);
  34. BOOL probeSubtitlesFileSubViewerVer1(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize);
  35. BOOL parseSubtitlesFileMicroDVD(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate);
  36. BOOL parseSubtitlesFileSubRip  (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate);
  37. BOOL parseSubtitlesFileSubViewer  (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate);
  38. BOOL parseSubtitlesFileSubViewerVer1  (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate);
  39. BOOL parseSubtitlesFilePowerDivX  (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate);
  40. BOOL parseSubtitlesFileAdvancedSubStationAlpha  (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate);
  41. BOOL parseSubtitlesFileTMPlayer (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate);
  42. BOOL parseSubtitlesFileDummy   (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate);
  43. BOOL parseSubtitlesFileCommon(DWORD num1, DWORD num2, textFilePtr tfpFile, BOOL bNoStorenum2,BOOL bNoStorenum1);
  44. #ifdef SUPPORT_SAMI_SUBTITLE
  45. // <<< Robin_0907_2004
  46. extern BOOL probeSubtitlesFileSami(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize);
  47. // >>> Robin_0907_2004
  48. extern BOOL parseSubtitlesFileSami(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate);
  49. #endif
  50. // <<< Robin_1003_2004_E
  51. BOOL probeSubtitlesFileBitMap(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize);
  52. BOOL parseSubtitlesFileBitMap (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate);
  53. CONST SubtitleFormatAttr availableSubtitleFormats[SF_NUMBER_OF_FORMATS]={
  54.     { probeSubtitlesFileBitMap, parseSubtitlesFileBitMap},
  55. { probeSubtitlesFileMicroDVD, parseSubtitlesFileMicroDVD },
  56. { probeSubtitlesFileSubRip,parseSubtitlesFileSubRip }, 
  57. #ifdef SUPPORT_SAMI_SUBTITLE
  58. // <<< Robin_0907_2004
  59. { probeSubtitlesFileSami, parseSubtitlesFileSami },
  60. // >>> Robin_0907_2004
  61. #endif
  62. { probeSubtitlesFilePowerDivX, parseSubtitlesFilePowerDivX },
  63. { probeSubtitlesFileAdvancedSubStationAlpha, parseSubtitlesFileAdvancedSubStationAlpha },
  64. { probeSubtitlesFileSubViewer, parseSubtitlesFileSubViewer },
  65. { probeSubtitlesFileTMPlayer, parseSubtitlesFileTMPlayer },
  66. { probeSubtitlesFileSubViewerVer1, parseSubtitlesFileSubViewerVer1 },
  67. };
  68. // >>> Robin_1003_2004_E
  69. // MicroDVD probing
  70. // Pattern to be identified:
  71. // {#*}{#*}
  72. // where #* are numbers of any size
  73. BOOL probeSubtitlesFileMicroDVD(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize)
  74. {
  75. textFilePtr tfpFile;
  76. DWORD num;
  77. char c;
  78. BOOL bSuccess=FALSE;
  79. // Robin_0715_2004, merge changelist #24407
  80. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  81. if ( NULL == tfpFile )
  82. return FALSE;
  83. while(1) {
  84. // search for the 1st "{"
  85. if (FALSE == textFileFindString(tfpFile,"{",SF_MICRODVD_PROBE_LIMIT))
  86. break;
  87. if(TRUE == textFileIsCurrentChar2(tfpFile, 'D') &&
  88. TRUE == textFileIsCurrentChar2(tfpFile, 'E') &&
  89. TRUE == textFileIsCurrentChar2(tfpFile, 'F') &&
  90. TRUE == textFileIsCurrentChar2(tfpFile, 'A') &&
  91. TRUE == textFileIsCurrentChar2(tfpFile, 'U') &&
  92. TRUE == textFileIsCurrentChar2(tfpFile, 'L') &&
  93. TRUE == textFileIsCurrentChar2(tfpFile, 'T') &&
  94. TRUE == textFileIsCurrentChar2(tfpFile, '}')
  95. ) // Robin_0705_2004_B, bypass {DEFAULT} control code
  96. {
  97. if(FALSE == textFileFindString(tfpFile,"n",0))
  98. return FALSE;
  99. continue;
  100. }
  101. // check if it's followed by a number
  102. if (FALSE == textFileReadNumber(tfpFile,&num))
  103.     break;
  104. // look for the "}{" string
  105. if (FALSE == textFileIsCurrentChar(tfpFile, '}'))
  106. break;
  107. if (FALSE == textFileIsCurrentChar(tfpFile, '{'))
  108. break;
  109. if (TRUE == textFileIsCurrentChar2(tfpFile, '}'))
  110. {
  111. dbg_printf(("probeSubtitlesFileMicroDVD - MicroDVD format confirmed.n"));
  112. bSuccess=TRUE;
  113.        break;
  114. }
  115. // check if it's followed by a number
  116. if (FALSE == textFileReadNumber(tfpFile,&num))
  117.     break;
  118. // check for the closing '}'
  119. if (FALSE == textFileReadChar(tfpFile,0,&c)) {
  120. tr_printf(("probeSubtitlesFileMicroDVD - can't read charn"));
  121. break;
  122. }
  123. if ( '}' != c )
  124. break;
  125. dbg_printf(("probeSubtitlesFileMicroDVD - MicroDVD format confirmed.n"));
  126. bSuccess=TRUE;
  127.       break;
  128. }
  129. if ( NULL != tfpFile )
  130. textFileClose(tfpFile);
  131. return bSuccess;
  132. }
  133. // <<< Robin_1003_2004_E
  134. BOOL probeSubtitlesFileSubRip(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize)
  135. {
  136. DWORD num1,num2;
  137.     char c;
  138.     BOOL bSuccess=TRUE;
  139.     int mult[]={60,60,1000};
  140. textFilePtr tfpFile;
  141. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  142. if ( NULL == tfpFile )
  143. return FALSE;
  144.     while( FALSE == textFileEOF(tfpFile) ) {
  145.    num1=0;
  146.    num2=0;
  147.    // Look for number - should be the number of the 1st subtitle - probably 1
  148.    bSuccess &= textFileFindNumber(tfpFile,0);
  149.    // reading subtitle serial number - not used.
  150.    bSuccess &= textFileReadNumber(tfpFile,&num1);
  151.    bSuccess &= textFileSkipLine(tfpFile);
  152.    // read start time
  153.    bSuccess &= readDelimitedTimeString(tfpFile, &num1, mult,3);
  154.    // skip the "-->" symbol
  155.    bSuccess &= textFileFindString(tfpFile, " --> ",6);
  156.    bSuccess &= readDelimitedTimeString(tfpFile, &num2, mult,3);
  157.    bSuccess &= textFileSkipLine(tfpFile);
  158.    break;
  159.    }
  160.     textFileClose(tfpFile);
  161. if (TRUE == bSuccess)
  162. dbg_printf(("probeSubtitlesFileSubRip - SubRip format confirmed.n"));
  163. return bSuccess;
  164. }
  165. BOOL probeSubtitlesFilePowerDivX(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize)
  166. {
  167. DWORD num1,num2;
  168. char c;
  169. BOOL bSuccess=TRUE;
  170. BOOL bExpectFormatting=TRUE;
  171. int mult[]={60,60};
  172. textFilePtr tfpFile;
  173. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  174. if ( NULL == tfpFile )
  175. return FALSE;
  176. while( FALSE == textFileEOF(tfpFile) ) {
  177. // parse the section "{start frame}{end frame}"
  178. bSuccess &= textFileFindString(tfpFile,"{",0);
  179. bSuccess &= readDelimitedTimeString(tfpFile, &num1, mult,2);
  180. bSuccess &= textFileIsCurrentChar(tfpFile, '}');
  181. bSuccess &= textFileIsCurrentChar(tfpFile, '{');
  182. bSuccess &= readDelimitedTimeString(tfpFile, &num2, mult,2);
  183. bSuccess &= textFileIsCurrentChar(tfpFile, '}');
  184. break;
  185. }
  186.    
  187.     textFileClose(tfpFile);
  188.    
  189. if (TRUE == bSuccess)
  190. dbg_printf(("probeSubtitlesFilePowerDivX - PowerDivx format confirmed.n"));
  191. return bSuccess;
  192. }
  193. BOOL probeSubtitlesFileAdvancedSubStationAlpha(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize)
  194. {
  195. DWORD num1,num2;
  196. char c;
  197. BOOL bSuccess=TRUE;
  198. BOOL bExpectFormatting=TRUE;
  199. int mult[]={60,60,100};
  200. textFilePtr tfpFile;
  201. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  202. if ( NULL == tfpFile )
  203. return FALSE;
  204.     subtitleStorageInitWriting();
  205. while( FALSE == textFileEOF(tfpFile) ) {
  206. bSuccess &= textFileFindString(tfpFile,"Dialogue:",0); // Format
  207. bSuccess &= textFileFindString(tfpFile,",",0); // Layer
  208. bSuccess &= readDelimitedTimeString(tfpFile, &num1, mult,3); // Start
  209. bSuccess &= textFileIsCurrentChar(tfpFile, ',');
  210. bSuccess &= readDelimitedTimeString(tfpFile, &num2, mult,3); // End
  211. bSuccess &= textFileIsCurrentChar(tfpFile, ',');
  212. bSuccess &= textFileFindString(tfpFile,",",0); // Style
  213. bSuccess &= textFileFindString(tfpFile,",",0); // Actor
  214. bSuccess &= textFileFindString(tfpFile,",",0); // MarginL
  215. bSuccess &= textFileFindString(tfpFile,",",0); // MarginR
  216. bSuccess &= textFileFindString(tfpFile,",",0); // MarginV
  217. bSuccess &= textFileFindString(tfpFile,",",0); // Effect
  218.         break;
  219. }
  220.    
  221.     textFileClose(tfpFile);
  222.    
  223. if (TRUE == bSuccess)
  224. dbg_printf(("probeSubtitlesFileAdvancedSubStationAlpha - SubStationAlpha format confirmed.n"));
  225. return bSuccess;
  226. }
  227. // >>> Robin_1003_2004_E
  228. // Robin_0604_2004_C
  229. // SubViewer 2.0 probing
  230. // Pattern to be identified:
  231. // 00:00:03.25,00:00:05.42
  232. // where #* are numbers of any size
  233. BOOL probeSubtitlesFileSubViewer(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize)
  234. {
  235. textFilePtr tfpFile;
  236. DWORD num;
  237. char c;
  238. BOOL bSuccess=FALSE;
  239. UINT16 count = 0;
  240.  tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  241.  if ( NULL == tfpFile )
  242.  return FALSE;
  243. while( FALSE == textFileEOF(tfpFile) ) 
  244. {
  245. // Robin_1003_2004_E
  246. if (count >= 500)
  247. break;
  248. if ((TRUE == textFileReadNumber(tfpFile,&num)) &&
  249. (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  250. (TRUE == textFileReadNumber(tfpFile,&num)) &&
  251. (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  252. (TRUE == textFileReadNumber(tfpFile,&num)) &&
  253. ((TRUE == textFileIsCurrentChar2(tfpFile, '.')) || 
  254. (TRUE == textFileIsCurrentChar2(tfpFile, ':')) || 
  255. (TRUE == textFileIsCurrentChar(tfpFile, ','))) &&
  256. (TRUE == textFileReadNumber(tfpFile,&num)) &&
  257. (TRUE == textFileIsCurrentChar(tfpFile, ',')) &&
  258. (TRUE == textFileReadNumber(tfpFile,&num)) &&
  259. (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  260. (TRUE == textFileReadNumber(tfpFile,&num)) &&
  261. (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  262. (TRUE == textFileReadNumber(tfpFile,&num)) &&
  263. ((TRUE == textFileIsCurrentChar2(tfpFile, '.')) || 
  264. (TRUE == textFileIsCurrentChar2(tfpFile, ':')) || 
  265. (TRUE == textFileIsCurrentChar(tfpFile, ','))) &&
  266. (TRUE == textFileReadNumber(tfpFile,&num)) )
  267. {
  268. dbg_printf(("probeSubtitlesFileSubViewer - SubViewer 2.0 format confirmed.n"));
  269. bSuccess=TRUE;
  270. break;
  271. }
  272. if (FALSE == textFileReadChar(tfpFile,0,&c)) {
  273. tr_printf(("probeSubtitlesFileSubViewer - can't read charn"));
  274. break;
  275. }
  276. count++;
  277. }
  278. if ( NULL != tfpFile )
  279. textFileClose(tfpFile);
  280. return bSuccess;
  281. }
  282. BOOL probeSubtitlesFileTMPlayer(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize)
  283. {
  284. textFilePtr tfpFile;
  285. DWORD num;
  286. char c;
  287. BOOL bSuccess=FALSE;
  288. UINT16 count = 0;
  289.  tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  290.  if ( NULL == tfpFile )
  291.  return FALSE;
  292. while( FALSE == textFileEOF(tfpFile) ) 
  293. {
  294. // Robin_1003_2004_E
  295. if (count >= 500)
  296. break;
  297. if ((TRUE == textFileReadNumber(tfpFile,&num)) &&
  298. (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  299. (TRUE == textFileReadNumber(tfpFile,&num)) &&
  300. (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  301. (TRUE == textFileReadNumber(tfpFile,&num)) &&
  302. (   (TRUE == textFileIsCurrentChar2(tfpFile, ':')) || 
  303.   (TRUE == textFileIsCurrentChar2(tfpFile, '=')) ||
  304.   ((TRUE == textFileIsCurrentChar(tfpFile, ',')) && (TRUE == textFileReadNumber(tfpFile,&num)) && (TRUE == textFileIsCurrentChar(tfpFile, '=')))
  305. )
  306.   )
  307. {
  308. dbg_printf(("probeSubtitlesFileTMPlayer - TMPlayer format confirmed.n"));
  309. bSuccess=TRUE;
  310. break;
  311. }
  312. if (FALSE == textFileReadChar(tfpFile,0,&c)) {
  313. dbg_printf(("probeSubtitlesFileTMPlayer - can't read charn"));
  314. break;
  315. }
  316. count++;
  317. }
  318. if ( NULL != tfpFile )
  319. textFileClose(tfpFile);
  320. return bSuccess;
  321. }
  322. // Robin_1125_2004, support SubViewer 1.0
  323. BOOL probeSubtitlesFileSubViewerVer1(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize)
  324. {
  325. textFilePtr tfpFile;
  326. DWORD num1;
  327. char c;
  328. BOOL bSuccess=FALSE;
  329. UINT16 count = 0;
  330.  tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  331.  if ( NULL == tfpFile )
  332.  return FALSE;
  333. while( FALSE == textFileEOF(tfpFile) ) 
  334. {
  335. // Robin_1003_2004_E
  336. if (count >= 500)
  337. break;
  338. if ((TRUE == textFileFindString(tfpFile,"[",0)) &&
  339. (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  340.    (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  341.    (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  342.    (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  343.    (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  344.    (TRUE == textFileIsCurrentChar(tfpFile, ']')) &&
  345.    (TRUE == textFileIsCurrentChar(tfpFile, 'r')) &&
  346.    (TRUE == textFileIsCurrentChar(tfpFile, 'n')))
  347. {
  348. dbg_printf(("probeSubtitlesFileSubViewerVer1 - SubViewer 1.0 format confirmed.n"));
  349. bSuccess=TRUE;
  350. break;
  351. }
  352. if (FALSE == textFileReadChar(tfpFile,0,&c)) {
  353. tr_printf(("probeSubtitlesFileSubViewerVer1 - can't read charn"));
  354. break;
  355. }
  356. count++;
  357. }
  358. if ( NULL != tfpFile )
  359. textFileClose(tfpFile);
  360. return bSuccess;
  361. }
  362. BOOL parseSubtitlesFileMicroDVD(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate)
  363. {
  364. DWORD num1,num2,dwTmp1,dwTmp2;
  365.     char c;
  366.     BOOL bSuccess=TRUE;
  367.     BOOL bExpectFormatting=TRUE;
  368. BOOL bNoExistNum2 = FALSE;
  369. textFilePtr tfpFile;
  370.    dbg_printf(("parseSubtitlesFileMicroDVD - Startingn"));
  371. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  372. if ( NULL == tfpFile )
  373. return FALSE;
  374.    subtitleStorageInitWriting();
  375. while( FALSE == textFileEOF(tfpFile) ) {
  376. // parse the section "{start frame}{end frame}"
  377.        bSuccess &= textFileFindString(tfpFile,"{",0);
  378. // Robin_0715_2004, merge changlist #24407
  379. if(TRUE == textFileIsCurrentChar2(tfpFile, 'D') &&
  380. TRUE == textFileIsCurrentChar2(tfpFile, 'E') &&
  381. TRUE == textFileIsCurrentChar2(tfpFile, 'F') &&
  382. TRUE == textFileIsCurrentChar2(tfpFile, 'A') &&
  383. TRUE == textFileIsCurrentChar2(tfpFile, 'U') &&
  384. TRUE == textFileIsCurrentChar2(tfpFile, 'L') &&
  385. TRUE == textFileIsCurrentChar2(tfpFile, 'T') &&
  386. TRUE == textFileIsCurrentChar2(tfpFile, '}')
  387. ) // Robin_0705_2004_B, bypass {DEFAULT} control code
  388. {
  389. if(FALSE == textFileFindString(tfpFile,"n",0))
  390. return FALSE;
  391. continue;
  392. }
  393. bSuccess &= textFileReadNumber(tfpFile,&num1);
  394. bSuccess &= textFileIsCurrentChar(tfpFile, '}');
  395. bSuccess &= textFileIsCurrentChar(tfpFile, '{');
  396. if (TRUE == textFileIsCurrentChar2(tfpFile, '}'))
  397. {
  398. dwTmp1=FRAME_TO_TIME(num1, dwScale, dwRate);
  399. if (TRUE == bNoExistNum2)
  400. if ( FALSE == subtitleStorageEndEntry(dwTmp1))
  401. return FALSE;
  402. bNoExistNum2 = TRUE;
  403. }
  404. else
  405. {
  406. bNoExistNum2 = FALSE;
  407. bSuccess &= textFileReadNumber(tfpFile,&num2);
  408. bSuccess &= textFileIsCurrentChar(tfpFile, '}');
  409. }
  410. if (FALSE == bSuccess)
  411. break;
  412. // deals with a subtitle of the form "{1}{1}fps_int.fps_fract", that specifies fps for interpreting
  413. // the timing info.
  414. if ( 1 == num1 && 1 == num2 ) {
  415. // it's possible to overwrite num1 - it's no longer important
  416. bSuccess &= textFileReadNumber(tfpFile,&num1);
  417. // I'll asume that the fraction isn't mandatory
  418. if (TRUE == textFileIsCurrentChar(tfpFile, '.'))
  419. bSuccess &= textFileReadNumber(tfpFile,&num2);
  420. else {
  421. // set fraction to 0, and go back to the char that could've been '.'
  422. num2=0;
  423. bSuccess &= textFileSeek(tfpFile,-1,TF_SEEK_CUR);
  424. }
  425. if ( FALSE == bSuccess)
  426. // Robin_0328_2005, search the next '{'
  427. {
  428. textFileFindString(tfpFile,"{",SF_MICRODVD_PROBE_LIMIT*5);
  429. textFileSeek(tfpFile,-1,TF_SEEK_CUR);
  430. bSuccess = TRUE;
  431. continue;
  432. }
  433. // As far as I understand, the accuracy of the fps is 3 digits at the most, so 1000 is used as multiplier
  434. dwRate=num1*1000+num2;
  435. dwScale=1000;
  436. // that's all there is in this line.
  437. continue;
  438. }
  439. if ( FALSE == bSuccess)
  440.           break;
  441. // write the timing
  442. dwTmp1=FRAME_TO_TIME(num1, dwScale, dwRate); // Robin_0531_2004_A
  443. dwTmp2=FRAME_TO_TIME(num2, dwScale, dwRate);// Robin_0531_2004_A
  444. if(FALSE == parseSubtitlesFileCommon(dwTmp1, dwTmp2, tfpFile, bNoExistNum2,FALSE))
  445. return FALSE;
  446.    }
  447. if (TRUE == bNoExistNum2)
  448. if ( FALSE == subtitleStorageEndEntry(0xFFFFFFFF))
  449. return FALSE;
  450.    subtitleStorageMarkLastEntry();
  451.    textFileClose(tfpFile);
  452.    // Files were found in which the last subtitle ends in EOF, without new line
  453.    dbg_printf(("parseSubtitlesFileMicroDVD - Exitingn"));
  454. return (bSuccess || textFileEOF(tfpFile));
  455. }
  456. BOOL parseSubtitlesFileSubRip(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate)
  457. {
  458. DWORD num1,num2;
  459.    char c;
  460.    BOOL bSuccess=TRUE;
  461.    BOOL bLastWasNewLine=FALSE;
  462.    int mult[]={60,60,1000};
  463. textFilePtr tfpFile;
  464. //Byte Order Mark (BOM)
  465.    dbg_printf(("parseSubtitlesFileSubRip - Startingn"));
  466. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  467. if ( NULL == tfpFile )
  468. return FALSE;
  469.    subtitleStorageInitWriting();
  470.    while( FALSE == textFileEOF(tfpFile) ) {
  471.    num1=0;
  472.    num2=0;
  473.    // Look for number - should be the number of the 1st subtitle - probably 1
  474.    bSuccess &= textFileFindNumber(tfpFile,0);
  475.    // reading subtitle serial number - not used.
  476.    bSuccess &= textFileReadNumber(tfpFile,&num1);
  477.    bSuccess &= textFileSkipLine(tfpFile);
  478.    // read start time
  479.    bSuccess &= readDelimitedTimeString(tfpFile, &num1, mult,3);
  480.    // skip the "-->" symbol
  481.    bSuccess &= textFileFindString(tfpFile, " --> ",6);
  482.    bSuccess &= readDelimitedTimeString(tfpFile, &num2, mult,3);
  483.    bSuccess &= textFileSkipLine(tfpFile);
  484.    
  485.    if (FALSE == bSuccess)
  486.    break;
  487.    
  488.    // write the timing
  489.    if ( FALSE == subtitleStorageStartEntry(num1))
  490.    return FALSE;
  491.    
  492.    bLastWasNewLine = FALSE;
  493.    
  494.    while ( FALSE != (bSuccess &= textFileReadChar(tfpFile, 0, &c)) )
  495.    {
  496.    // end of subtitle or subtitle line
  497. if (( 'r' == c ) || ('n' == c)) 
  498.     {
  499. // if file uses CR-LF combination, read both chars in the same iteration
  500.     if ('r' == c ) {
  501. textFileIsCurrentChar(tfpFile,'n');
  502.                 if (textFileEOF(tfpFile))
  503.                 {
  504.                 bSuccess = FALSE; // leads to ending the entry after the break
  505.                    // is executed
  506.                 break;
  507.                 }
  508.              }
  509.              // only 2 adjacent new lines signify subtitle end
  510.           if ( TRUE == bLastWasNewLine ) {
  511.              // double new line - subtitle end
  512. if ( FALSE == subtitleStorageEndEntry(num2))
  513.                   return FALSE;
  514. break;
  515.              }
  516.              else
  517.              {
  518. // new line
  519.                 bLastWasNewLine = TRUE;
  520. #ifdef _DEBUG
  521. if ( g_pSubtitleStorage->wMaxLineLength < g_pSubtitleStorage->wCurrentLineLength )
  522.                   g_pSubtitleStorage->wMaxLineLength = g_pSubtitleStorage->wCurrentLineLength;
  523. #endif
  524.              if (FALSE == subtitleStorageWriteByte(FORMAT_NEW_LINE))
  525.              return FALSE;
  526. #ifdef _DEBUG
  527. g_pSubtitleStorage->wCurrentLineLength = 0;
  528. #endif
  529. }
  530. }
  531. // beginning of formatting information symbol
  532.           else if ( '<' == c )
  533.           {
  534.              int i;
  535. char d;
  536. char style[] = {'i','b','u'};
  537. BOOL bFoundSymbol1,bFoundSymbol2;
  538. bLastWasNewLine = FALSE;
  539. textFileIsCurrentChar2(tfpFile,'/');
  540. // Robin_0113_2005, remove the font text
  541. // <FONT COLOR="######">text text text text text</FONT>
  542. if((TRUE == textFileIsCurrentChar2(tfpFile, 'f') &&
  543. TRUE == textFileIsCurrentChar2(tfpFile, 'o') &&
  544. TRUE == textFileIsCurrentChar2(tfpFile, 'n') &&
  545. TRUE == textFileIsCurrentChar2(tfpFile, 't')) || 
  546. (TRUE == textFileIsCurrentChar2(tfpFile, 'F') &&
  547. TRUE == textFileIsCurrentChar2(tfpFile, 'O') &&
  548. TRUE == textFileIsCurrentChar2(tfpFile, 'N') &&
  549. TRUE == textFileIsCurrentChar2(tfpFile, 'T')))
  550. {
  551. if (FALSE == textFileFindString(tfpFile, ">",0))
  552. {
  553. return FALSE;
  554. }
  555. continue;
  556. }
  557. bFoundSymbol1 = FALSE;
  558. bFoundSymbol2 = FALSE;
  559. for (i =0; i<3; i++ )
  560. {
  561. d=style[i];
  562. if (TRUE == textFileIsCurrentChar2(tfpFile,d))
  563. {
  564. bFoundSymbol1 = TRUE;
  565. if (TRUE == textFileIsCurrentChar2(tfpFile,'>'))
  566. {
  567. bFoundSymbol2 = TRUE;
  568. }
  569. break;
  570. }
  571. }
  572. if (FALSE == bFoundSymbol1)
  573. {
  574. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  575.              return FALSE;
  576. }
  577. else if (FALSE == bFoundSymbol2)
  578. {
  579. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  580.              return FALSE;
  581. if (FALSE == subtitleStorageWriteByte((BYTE)d))
  582.              return FALSE;
  583. }
  584.           }
  585. // character to be displayed
  586. else 
  587. {
  588. bLastWasNewLine = FALSE;
  589. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  590.              return FALSE;
  591. }
  592. }
  593.        // The last entry in the subtitles file may end in EOF, without a new line
  594.        if ( FALSE == bSuccess ) {
  595.        if (TRUE == textFileEOF(tfpFile)) {
  596.           if ( FALSE == subtitleStorageEndEntry(num2))
  597.                  return FALSE;
  598.          }
  599.       }
  600.    }
  601.    subtitleStorageMarkLastEntry();
  602.    textFileClose(tfpFile);
  603.    // Files were found in which the last subtitle ends in EOF, without new line
  604.    dbg_printf(("parseSubtitlesFileSubRip - Exitingn"));
  605. return (bSuccess || textFileEOF(tfpFile));
  606. }
  607. // Robin_0604_2004_C
  608. BOOL parseSubtitlesFileSubViewer(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate)
  609. {
  610. DWORD num1,num2;
  611.    char c;
  612.    BOOL bSuccess=TRUE;
  613.    BOOL bLastWasNewLine=FALSE;
  614.    int mult[]={60,60,100};
  615. textFilePtr tfpFile;
  616.    dbg_printf(("parseSubtitlesFileSubViewer - Startingn"));
  617. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  618. if ( NULL == tfpFile )
  619. return FALSE;
  620.    subtitleStorageInitWriting();
  621.    while( FALSE == textFileEOF(tfpFile) ) {
  622.    if ((TRUE == textFileReadNumber(tfpFile,&num1)) &&
  623.    (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  624.    (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  625.    (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  626.    (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  627.    ((TRUE == textFileIsCurrentChar2(tfpFile, '.')) || 
  628.    (TRUE == textFileIsCurrentChar2(tfpFile, ':')) || 
  629.    (TRUE == textFileIsCurrentChar(tfpFile, ','))) &&
  630.    (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  631.    (TRUE == textFileIsCurrentChar(tfpFile, ',')) &&
  632.    (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  633.    (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  634.    (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  635.    (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  636.    (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  637.    ((TRUE == textFileIsCurrentChar2(tfpFile, '.')) || 
  638.    (TRUE == textFileIsCurrentChar2(tfpFile, ':')) || 
  639.    (TRUE == textFileIsCurrentChar(tfpFile, ','))) &&
  640.    (TRUE == textFileReadNumber(tfpFile,&num1)) )
  641.    {
  642.     bSuccess = textFileSeek(tfpFile,-23,TF_SEEK_CUR);
  643.     break;
  644.    }
  645.    
  646.    if (FALSE == textFileReadChar(tfpFile,0,&c)) {
  647.    tr_printf(("parseSubtitlesFileSubViewer - can't read charn"));
  648.    break;
  649.    }
  650.     }
  651.    while( FALSE == textFileEOF(tfpFile) ) {
  652.    num1=0;
  653.    num2=0;
  654.    // read start time
  655.    bSuccess &= readDelimitedTimeString(tfpFile, &num1,mult,3);
  656.    // skip the "-->" symbol
  657.    bSuccess &= textFileFindString(tfpFile, ",",1);
  658.    bSuccess &= readDelimitedTimeString(tfpFile, &num2,mult,3);
  659.    bSuccess &= textFileSkipLine(tfpFile);
  660.    
  661.    if (FALSE == bSuccess)
  662.    break;
  663.    num1 *= 10; // in unit of ms
  664.    num2 *= 10; // in unit of ms
  665.    // write the timing
  666.    if ( FALSE == subtitleStorageStartEntry(num1))
  667.    return FALSE;
  668.    
  669.    bLastWasNewLine = FALSE;
  670.    
  671.    while ( FALSE != (bSuccess &= textFileReadChar(tfpFile, 0, &c)) )
  672.    {
  673.    // end of subtitle or subtitle line
  674.    if (( 'r' == c ) || ('n' == c)) {
  675.    // if file uses CR-LF combination, read both chars in the same iteration
  676.    if ('r' == c ) {
  677.    textFileIsCurrentChar(tfpFile,'n');
  678.                if (textFileEOF(tfpFile))
  679.                {
  680.                 bSuccess = FALSE; // leads to ending the entry after the break
  681.                    // is executed
  682.                 break;
  683.                }
  684.             }
  685.             // only 2 adjacent new lines signify subtitle end
  686.           if ( TRUE == bLastWasNewLine ) {
  687.              // double new line - subtitle end
  688. if ( FALSE == subtitleStorageEndEntry(num2))
  689.                  return FALSE;
  690. break;
  691.             }
  692.             else
  693.             {
  694. // new line
  695.                bLastWasNewLine = TRUE;
  696. #ifdef _DEBUG
  697. if ( g_pSubtitleStorage->wMaxLineLength < g_pSubtitleStorage->wCurrentLineLength )
  698.                  g_pSubtitleStorage->wMaxLineLength = g_pSubtitleStorage->wCurrentLineLength;
  699. #endif
  700.              if (FALSE == subtitleStorageWriteByte(FORMAT_NEW_LINE))
  701.              return FALSE;
  702. #ifdef _DEBUG
  703. g_pSubtitleStorage->wCurrentLineLength = 0;
  704. #endif
  705. }
  706. }
  707.    else if ( '<' == c )
  708.           {
  709.              int i;
  710. char d;
  711. char style[] = {'i','b','u'};
  712. BOOL bFoundSymbol1,bFoundSymbol2;
  713. bLastWasNewLine = FALSE;
  714. textFileIsCurrentChar2(tfpFile,'/');
  715. bFoundSymbol1 = FALSE;
  716. bFoundSymbol2 = FALSE;
  717. for (i =0; i<3; i++ )
  718. {
  719. d=style[i];
  720. if (TRUE == textFileIsCurrentChar2(tfpFile,d))
  721. {
  722. bFoundSymbol1 = TRUE;
  723. if (TRUE == textFileIsCurrentChar2(tfpFile,'>'))
  724. {
  725. bFoundSymbol2 = TRUE;
  726. }
  727. break;
  728. }
  729. }
  730. if (FALSE == bFoundSymbol1)
  731. {
  732. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  733.              return FALSE;
  734. }
  735. else if (FALSE == bFoundSymbol2)
  736. {
  737. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  738.              return FALSE;
  739. if (FALSE == subtitleStorageWriteByte((BYTE)d))
  740.              return FALSE;
  741. }
  742.           }
  743.           // Robin_0408_2005, [br] mean new line
  744. else if ( '[' == c )
  745. {
  746. if (textFileIsCurrentChar(tfpFile,'b'))
  747. {
  748. if (textFileIsCurrentChar(tfpFile,'r'))
  749. {
  750. if (textFileIsCurrentChar(tfpFile,']'))
  751. {
  752. if (FALSE == subtitleStorageWriteByte(FORMAT_NEW_LINE))
  753. return FALSE;
  754. continue;
  755. }
  756. else
  757. {
  758. textFileSeek(tfpFile,-3,TF_SEEK_CUR);
  759. }
  760. }
  761. else
  762. {
  763. textFileSeek(tfpFile,-2,TF_SEEK_CUR);
  764. }
  765. }
  766. else
  767. {
  768. textFileSeek(tfpFile,-1,TF_SEEK_CUR);
  769. }
  770. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  771.              return FALSE;
  772. }
  773. // character to be displayed
  774. else {
  775. bLastWasNewLine = FALSE;
  776. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  777.              return FALSE;
  778. }
  779. }
  780.       // The last entry in the subtitles file may end in EOF, without a new line
  781.       if ( FALSE == bSuccess ) {
  782.    bSuccess = TRUE;
  783. if (TRUE == textFileEOF(tfpFile)) {
  784.           if ( FALSE == subtitleStorageEndEntry(num2))
  785.                  return FALSE;
  786.           }
  787.       }
  788.    }
  789.    subtitleStorageMarkLastEntry();
  790.    textFileClose(tfpFile);
  791.    // Files were found in which the last subtitle ends in EOF, without new line
  792.    dbg_printf(("parseSubtitlesFileSubViewer- Exitingn"));
  793. return (bSuccess || textFileEOF(tfpFile));
  794. }
  795. BOOL parseSubtitlesFilePowerDivX(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate)
  796. {
  797. DWORD num1,num2;
  798. char c;
  799. BOOL bSuccess=TRUE;
  800. BOOL bExpectFormatting=TRUE;
  801. int mult[]={60,60};
  802. textFilePtr tfpFile;
  803. dbg_printf(("parseSubtitlesFilePowerDivX - Startingn"));
  804. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  805. if ( NULL == tfpFile )
  806. return FALSE;
  807.     subtitleStorageInitWriting();
  808. while( FALSE == textFileEOF(tfpFile) ) {
  809. // parse the section "{start frame}{end frame}"
  810. bSuccess &= textFileFindString(tfpFile,"{",0);
  811. bSuccess &= readDelimitedTimeString(tfpFile, &num1, mult,2);
  812. bSuccess &= textFileIsCurrentChar(tfpFile, '}');
  813. bSuccess &= textFileIsCurrentChar(tfpFile, '{');
  814. bSuccess &= readDelimitedTimeString(tfpFile, &num2, mult,2);
  815. bSuccess &= textFileIsCurrentChar(tfpFile, '}');
  816. if ( FALSE == bSuccess)
  817.           break;
  818. num1 *= 1000;  // in unit of ms
  819. num2 *= 1000;  // in unit of ms
  820. if(FALSE == parseSubtitlesFileCommon(num1, num2, tfpFile,FALSE,FALSE))
  821. return FALSE;
  822. }
  823. subtitleStorageMarkLastEntry();
  824.    
  825.     textFileClose(tfpFile);
  826.     // Files were found in which the last subtitle ends in EOF, without new line
  827.     dbg_printf(("parseSubtitlesFilePowerDivX - Exitingn"));
  828. return (bSuccess || textFileEOF(tfpFile));
  829. }
  830. BOOL parseSubtitlesFileAdvancedSubStationAlpha(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate)
  831. {
  832. DWORD num1,num2;
  833. char c;
  834. BOOL bSuccess=TRUE;
  835. BOOL bExpectFormatting=TRUE;
  836. int mult[]={60,60,100};
  837. textFilePtr tfpFile;
  838. dbg_printf(("parseSubtitlesFileAdvancedSubStationAlpha - Startingn"));
  839. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  840. if ( NULL == tfpFile )
  841. return FALSE;
  842.     subtitleStorageInitWriting();
  843. while( FALSE == textFileEOF(tfpFile) ) {
  844. bSuccess &= textFileFindString(tfpFile,"Dialogue:",0); // Format
  845. bSuccess &= textFileFindString(tfpFile,",",0); // Layer
  846. bSuccess &= readDelimitedTimeString(tfpFile, &num1, mult,3); // Start
  847. bSuccess &= textFileIsCurrentChar(tfpFile, ',');
  848. bSuccess &= readDelimitedTimeString(tfpFile, &num2, mult,3); // End
  849. bSuccess &= textFileIsCurrentChar(tfpFile, ',');
  850. bSuccess &= textFileFindString(tfpFile,",",0); // Style
  851. bSuccess &= textFileFindString(tfpFile,",",0); // Actor
  852. bSuccess &= textFileFindString(tfpFile,",",0); // MarginL
  853. bSuccess &= textFileFindString(tfpFile,",",0); // MarginR
  854. bSuccess &= textFileFindString(tfpFile,",",0); // MarginV
  855. bSuccess &= textFileFindString(tfpFile,",",0); // Effect
  856. if ( FALSE == bSuccess)
  857.           break;
  858. num1 *= 10;  // in unit of ms
  859. num2 *= 10;  // in unit of ms
  860. if(FALSE == parseSubtitlesFileCommon(num1, num2, tfpFile,FALSE,FALSE))
  861. return FALSE;
  862. }
  863. subtitleStorageMarkLastEntry();
  864.    
  865.     textFileClose(tfpFile);
  866.     // Files were found in which the last subtitle ends in EOF, without new line
  867.     dbg_printf(("parseSubtitlesFileAdvancedSubStationAlpha - Exitingn"));
  868. return (bSuccess || textFileEOF(tfpFile));
  869. }
  870. // TMPlayer Format
  871. // hh:mm:ss:
  872. // TMPlayer + Format
  873. // hh:mm:ss=
  874. // TMPlayer Multiline Format
  875. // hh:mm:ss,1=
  876. // hh:mm:ss,2=
  877. BOOL parseSubtitlesFileTMPlayer(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate)
  878. {
  879. DWORD num1,num2;
  880. char c;
  881. BOOL bSuccess=TRUE;
  882. BOOL bExpectFormatting=TRUE;
  883. int mult[]={60,60};
  884. textFilePtr tfpFile;
  885. BOOL bStorednum2 = FALSE;
  886. BOOL bMultiline2 = FALSE;
  887. BOOL bFirstLine = TRUE;
  888. dbg_printf(("parseSubtitlesFileTMPlayer - Startingn"));
  889. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  890. if ( NULL == tfpFile )
  891. return FALSE;
  892.     subtitleStorageInitWriting();
  893. num1 = 0;
  894. num2 = 0xFFFFFFFF;
  895. while( FALSE == textFileEOF(tfpFile) ) {
  896. bMultiline2 = FALSE;
  897. bSuccess &= readDelimitedTimeString(tfpFile, &num1, mult,2);
  898. if (TRUE == textFileIsCurrentChar2(tfpFile, ','))
  899. {
  900. if (TRUE == textFileIsCurrentChar2(tfpFile, '1'))
  901. {
  902. bSuccess &= textFileIsCurrentChar2(tfpFile, '=');
  903. }
  904. else if (TRUE == textFileIsCurrentChar2(tfpFile, '2'))
  905. {
  906. bSuccess &= textFileIsCurrentChar2(tfpFile, '=');
  907. bMultiline2 = TRUE;
  908. }
  909. else
  910. bSuccess = FALSE;
  911. }
  912. else
  913. bSuccess &= textFileIsCurrentChar2(tfpFile, ':') || textFileIsCurrentChar(tfpFile, '=');
  914. if ( FALSE == bSuccess)
  915.           break;
  916. num1 *= 1000;  // in unit of ms
  917. if ((TRUE == textFileIsCurrentChar2(tfpFile, 'r')) && (TRUE == textFileIsCurrentChar2(tfpFile, 'n')))
  918. {
  919. if (TRUE == bMultiline2)
  920. continue;
  921. if ( FALSE == subtitleStorageEndEntry(num1))
  922. return FALSE;
  923. bStorednum2 = TRUE;
  924. continue;
  925. }
  926. if (TRUE == bMultiline2)
  927. if (FALSE == subtitleStorageWriteByte(FORMAT_NEW_LINE))
  928. return FALSE;
  929. if ((FALSE == bFirstLine) && (FALSE == bStorednum2) && (FALSE == bMultiline2))
  930. if ( FALSE == subtitleStorageEndEntry(num1))
  931. return FALSE;
  932. if(FALSE == parseSubtitlesFileCommon(num1, num2, tfpFile,TRUE,bMultiline2))
  933. return FALSE;
  934. bStorednum2 = FALSE;
  935. bFirstLine = FALSE;
  936. }
  937. if (FALSE == bStorednum2)
  938. if ( FALSE == subtitleStorageEndEntry(num2))
  939. return FALSE;
  940. subtitleStorageMarkLastEntry();
  941.    
  942.     textFileClose(tfpFile);
  943.     // Files were found in which the last subtitle ends in EOF, without new line
  944.     dbg_printf(("parseSubtitlesFileTMPlayer - Exitingn"));
  945. return (bSuccess || textFileEOF(tfpFile));
  946. }
  947. // Robin_1125_2004, support SubViewer 1.0
  948. BOOL parseSubtitlesFileSubViewerVer1(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate)
  949. {
  950. DWORD num1,num2;
  951. char c;
  952. BOOL bSuccess=TRUE;
  953. BOOL bEnd = FALSE;
  954. BOOL bExpectFormatting=TRUE;
  955. int mult[]={60,60};
  956. textFilePtr tfpFile;
  957. dbg_printf(("parseSubtitlesFileSubViewerVer1 - Startingn"));
  958. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  959. if ( NULL == tfpFile )
  960. return FALSE;
  961.     subtitleStorageInitWriting();
  962.    while( FALSE == textFileEOF(tfpFile) ) {
  963.    if ((TRUE == textFileFindString(tfpFile,"[",0)) &&
  964. (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  965.    (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  966.    (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  967.    (TRUE == textFileIsCurrentChar(tfpFile, ':')) &&
  968.    (TRUE == textFileReadNumber(tfpFile,&num1)) &&
  969.    (TRUE == textFileIsCurrentChar(tfpFile, ']')) &&
  970.    (TRUE == textFileIsCurrentChar(tfpFile, 'r')) &&
  971.    (TRUE == textFileIsCurrentChar(tfpFile, 'n')))
  972.    {
  973.     bSuccess = textFileSeek(tfpFile,-12,TF_SEEK_CUR);
  974.     break;
  975.    }
  976.    
  977.    if (FALSE == textFileReadChar(tfpFile,0,&c)) {
  978.    tr_printf(("parseSubtitlesFileSubViewerVer1 - can't read charn"));
  979.    break;
  980.    }
  981.     }
  982. num1 = 0;
  983. num2 = 0xFFFFFFFF;
  984. while( FALSE == textFileEOF(tfpFile) ) {
  985. bSuccess &= textFileFindString(tfpFile,"[",0);
  986. if ((TRUE == textFileIsCurrentChar2(tfpFile, 'e')) &&
  987. (TRUE == textFileIsCurrentChar(tfpFile, 'n')) &&
  988. (TRUE == textFileIsCurrentChar(tfpFile, 'd')) && 
  989. (TRUE == textFileIsCurrentChar(tfpFile, ']')))
  990. break; // [end]
  991. bSuccess &= readDelimitedTimeString(tfpFile, &num1, mult,2);
  992. bSuccess &= (textFileIsCurrentChar(tfpFile, ']') && textFileIsCurrentChar(tfpFile, 'r') && textFileIsCurrentChar(tfpFile, 'n')) ;
  993. if ( FALSE == bSuccess)
  994.           break;
  995. num1 *= 1000;  // in unit of ms
  996. if(FALSE == parseSubtitlesFileCommon(num1, num2, tfpFile,TRUE,FALSE))
  997. return FALSE;
  998. bSuccess &= textFileFindString(tfpFile,"[",0);
  999. if(TRUE == textFileIsCurrentChar2(tfpFile, 'e') &&
  1000. TRUE == textFileIsCurrentChar2(tfpFile, 'n') &&
  1001. TRUE == textFileIsCurrentChar2(tfpFile, 'd') &&
  1002. TRUE == textFileIsCurrentChar2(tfpFile, ']'))
  1003. bEnd = TRUE; // [end/END]
  1004. if (bEnd == FALSE)
  1005. {
  1006. bSuccess &= readDelimitedTimeString(tfpFile, &num2, mult,2);
  1007. bSuccess &= textFileIsCurrentChar(tfpFile, ']');
  1008. }
  1009. else 
  1010. num2 = num1/1000 + 1;
  1011. if ( FALSE == bSuccess)
  1012.           break;
  1013. num2 *= 1000;  // in unit of ms
  1014. if ( FALSE == subtitleStorageEndEntry(num2))
  1015. return FALSE;
  1016. if (TRUE == bEnd)
  1017. break;
  1018. }
  1019. subtitleStorageMarkLastEntry();
  1020.    
  1021.     textFileClose(tfpFile);
  1022.     // Files were found in which the last subtitle ends in EOF, without new line
  1023.     dbg_printf(("parseSubtitlesFileSubViewerVer1 - Exitingn"));
  1024. return (bSuccess || textFileEOF(tfpFile));
  1025. }
  1026. BOOL parseSubtitlesFileCommon(DWORD num1, DWORD num2,textFilePtr tfpFile, BOOL bNoStorenum2, BOOL bNoStorenum1)
  1027. {
  1028. char c,c_next;
  1029. BOOL bSuccess=TRUE;
  1030. BOOL bExpectFormatting=TRUE;
  1031. // write the timing
  1032. if ((FALSE == bNoStorenum1) && (FALSE == subtitleStorageStartEntry(num1)))
  1033. return FALSE;
  1034. while ( FALSE != (bSuccess &= textFileReadChar(tfpFile, 0, &c)) ) {
  1035. // end of subtitle
  1036. if ( 'n' == c || 'r' == c ) {
  1037. // Robin_0328_2005, search next char, not 'r' or 'n'
  1038. if (FALSE != textFileReadChar(tfpFile, 0, &c_next))
  1039. {
  1040. textFileSeek(tfpFile,-1,TF_SEEK_CUR);
  1041. if ( 'n' == c_next || 'r' == c_next)
  1042. continue;
  1043. }
  1044. bExpectFormatting=TRUE;
  1045. if ((FALSE == bNoStorenum2) && ( FALSE == subtitleStorageEndEntry(num2)))
  1046. return FALSE;
  1047. break;
  1048. }
  1049. // new line symbol
  1050. else if ( '|' == c ) {
  1051. bExpectFormatting=TRUE;
  1052. //writeNewLine
  1053. #ifdef _DEBUG
  1054. if ( g_pSubtitleStorage->wMaxLineLength < g_pSubtitleStorage->wCurrentLineLength )
  1055. g_pSubtitleStorage->wMaxLineLength = g_pSubtitleStorage->wCurrentLineLength;
  1056. #endif
  1057. if (FALSE == subtitleStorageWriteByte(FORMAT_NEW_LINE))
  1058. return FALSE;
  1059. #ifdef _DEBUG
  1060. g_pSubtitleStorage->wCurrentLineLength = 0;
  1061. #endif
  1062. }
  1063. // Robin_0715_2004, merge changelist #24309
  1064. else if ('\' == c) // Robin_0701_2004, 'N' or 'n' mean new line in *.ssa/*.ass
  1065. {
  1066. if( (TRUE == textFileIsCurrentChar2(tfpFile, 'N')) || (TRUE == textFileIsCurrentChar2(tfpFile, 'n')))
  1067. {
  1068. if (FALSE == subtitleStorageWriteByte(FORMAT_NEW_LINE))
  1069. return FALSE;
  1070. }
  1071. else 
  1072. {
  1073. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  1074. return FALSE;
  1075. }
  1076. }
  1077. // beginning of formatting information symbol
  1078. // apparently can only appear as first char in subtitle
  1079. // line, and should otherwise be stored and displayed.
  1080. else if (( '{' == c ) && (TRUE == bExpectFormatting))  {
  1081. // handle formatting
  1082. // for now skip
  1083. bSuccess &= textFileFindString(tfpFile,"}",0);
  1084. // don't set bExpectFormatting to FALSE - additional format tags
  1085. // are possible
  1086. }
  1087. else if ( '<' == c )
  1088.           {
  1089.                  int i;
  1090. char d;
  1091. char style[] = {'i','b','u'};
  1092. BOOL bFoundSymbol1,bFoundSymbol2;
  1093. textFileIsCurrentChar2(tfpFile,'/');
  1094. bFoundSymbol1 = FALSE;
  1095. bFoundSymbol2 = FALSE;
  1096. for (i =0; i<3; i++ )
  1097. {
  1098. d=style[i];
  1099. if (TRUE == textFileIsCurrentChar2(tfpFile,d))
  1100. {
  1101. bFoundSymbol1 = TRUE;
  1102. if (TRUE == textFileIsCurrentChar2(tfpFile,'>'))
  1103. {
  1104. bFoundSymbol2 = TRUE;
  1105. }
  1106. break;
  1107. }
  1108. }
  1109. if (FALSE == bFoundSymbol1)
  1110. {
  1111. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  1112.              return FALSE;
  1113. }
  1114. else if (FALSE == bFoundSymbol2)
  1115. {
  1116. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  1117.              return FALSE;
  1118. if (FALSE == subtitleStorageWriteByte((BYTE)d))
  1119.              return FALSE;
  1120. }
  1121. }
  1122. //// Robin_0408_2005, [br] mean new line
  1123. else if ( '[' == c )
  1124. {
  1125. if (textFileIsCurrentChar(tfpFile,'b'))
  1126. {
  1127. if (textFileIsCurrentChar(tfpFile,'r'))
  1128. {
  1129. if (textFileIsCurrentChar(tfpFile,']'))
  1130. {
  1131. bExpectFormatting=TRUE;
  1132. if (FALSE == subtitleStorageWriteByte(FORMAT_NEW_LINE))
  1133. return FALSE;
  1134. continue;
  1135. }
  1136. else
  1137. {
  1138. textFileSeek(tfpFile,-3,TF_SEEK_CUR);
  1139. }
  1140. }
  1141. else
  1142. {
  1143. textFileSeek(tfpFile,-2,TF_SEEK_CUR);
  1144. }
  1145. }
  1146. else
  1147. {
  1148. textFileSeek(tfpFile,-1,TF_SEEK_CUR);
  1149. }
  1150. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  1151.              return FALSE;
  1152. }
  1153. // character to be displayed
  1154. else {
  1155. if (FALSE == subtitleStorageWriteByte((BYTE)c))
  1156. return FALSE;
  1157. bExpectFormatting = FALSE;
  1158. }
  1159. }
  1160. // The last entry in the subtitles file may end in EOF, without a new line
  1161. if ( FALSE == bSuccess ) {
  1162. if (TRUE == textFileEOF(tfpFile)) {
  1163. if ( FALSE == subtitleStorageEndEntry(num2))
  1164. return FALSE;
  1165. }
  1166. }
  1167. return TRUE;
  1168. }
  1169. BOOL readDelimitedTimeString(textFilePtr tfpFile, DWORD *dwPTS, int mult[], int number)
  1170. {
  1171.     BOOL bSuccess=TRUE;
  1172.     int i;
  1173.     DWORD dwTmp;
  1174.     bSuccess &= textFileReadNumber(tfpFile,dwPTS);
  1175.     for (i=0; i<number ; i++ )
  1176.     {
  1177.      bSuccess &= textFileSeek(tfpFile,1,TF_SEEK_CUR);
  1178.        bSuccess &= textFileReadNumber(tfpFile,&dwTmp);
  1179.        *dwPTS = (*dwPTS) * mult[i] + dwTmp;
  1180.     }
  1181. // if less than 3 delimiters - continue to multiply
  1182.     for ( ; i < number ; i++ )
  1183.     *dwPTS = (*dwPTS) * mult[i];
  1184.     return bSuccess;
  1185. }
  1186. /*
  1187. BOOL parseSubtitlesFileDummy(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate)
  1188. {
  1189. textFilePtr tfpFile;
  1190.    BYTE c;
  1191.       dbg_printf(("parseSubtitlesFileDummy - Startingn"));
  1192. tfpFile=textFileOpen(dwSubtitlesFileAddress,dwSubtitlesFileSize);
  1193. if ( NULL == tfpFile )
  1194. return FALSE;
  1195.    subtitleStorageInitWriting();
  1196.    while ( FALSE != textFileReadChar(tfpFile, 0, &c))
  1197.    {
  1198. if (FALSE == subtitleStorageWriteByte(c))
  1199.           return FALSE;
  1200.    }
  1201.    textFileClose(tfpFile);
  1202.    return FALSE;
  1203. } */
  1204. /****************************************************************************************************
  1205. * Function : probeSubtitlesFileBitMap
  1206. * Input : dwSubtitlesFileAddress - file address
  1207.                     dwSubtitlesFileSize - file size
  1208. * Output :
  1209. * Return : TRUE - subpicture format
  1210.                     FLASE - not
  1211. * Description : probe if it is a subpicture format (Bitmap)
  1212. ****************************************************************************************************/
  1213. BOOL probeSubtitlesFileBitMap(DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize)
  1214. {
  1215.     DWORD dwOffset = 0UL;
  1216.     DWORD startCode;
  1217.     BYTE  stuffingLength;
  1218.     if (dwSubtitlesFileSize < 32)
  1219.         return FALSE;
  1220.     // get the pack start code "0x000001BA" 
  1221.     if (FALSE == AuxCache_GetBytes(dwSubtitlesFileAddress, dwOffset, 4, (BYTE*)&startCode))
  1222.         return FALSE;
  1223.     dwOffset += 4;
  1224.     if (startCode != 0xBA010000UL)
  1225.         return FALSE;
  1226.     // get the stuffing length
  1227.     dwOffset += 9;
  1228.     if (FALSE == AuxCache_GetBytes(dwSubtitlesFileAddress, dwOffset, 1, (BYTE*)&stuffingLength))
  1229.         return FALSE;
  1230.     dwOffset ++;
  1231.     stuffingLength &= 0x7;
  1232.     dwOffset += stuffingLength;
  1233.     // get the next start code
  1234.     if (FALSE == AuxCache_GetBytes(dwSubtitlesFileAddress, dwOffset, 4, (BYTE*)&startCode))
  1235.         return FALSE;    
  1236.     startCode &= 0xFFFFFFUL;
  1237.     if (startCode != 0x010000UL)
  1238.         return FALSE;
  1239.     dbg_printf(("probeSubtitlesFileBitMap - Subpicture format confirmed.n"));
  1240.     return TRUE;
  1241. }
  1242. /****************************************************************************************************
  1243. * Function : parseSubtitlesFileBitMap
  1244. * Input : dwSubtitlesFileAddress - file address
  1245.                     dwSubtitlesFileSize - file size
  1246. * Output :
  1247. * Return : FALSE - dont process the subtitle
  1248. * Description :
  1249. ****************************************************************************************************/
  1250. BOOL parseSubtitlesFileBitMap (DWORD dwSubtitlesFileAddress, DWORD dwSubtitlesFileSize,DWORD dwScale, DWORD dwRate)
  1251. {
  1252.     return FALSE;
  1253. }
  1254. #endif // USE_AUX_SUBTITLES