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

DVD

开发平台:

Others

  1. /****************************************************************************************
  2.  *  Copyright (c) 2002 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: $Workfile: DVDDetection.c $             
  6.  *
  7.  * Description: 
  8.  * ============
  9.  * 
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 8 $
  14.  * Last Modified by $Author: Leslie $ at $Modtime: 04-03-03 17:02 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/Playcore/MediaDetection/DVDDetection.c $
  19.  * 
  20.  * 8     04-03-03 17:43 Leslie
  21.  * Fix wrong disc identification after eject try during disc loading
  22.  * 
  23.  * 7     10/28/03 8:56a Leslie
  24.  * remove the useless code
  25.  * 
  26.  * 6     10/27/03 8:07a Leslie
  27.  * add header
  28.  * 
  29.  ****************************************************************************************/
  30. #include "Config.h" // Global Configuration - do not remove!
  31. #ifdef _DEBUG
  32. #define IFTRACE if (gTraceNavigator)
  33. #include "DebugDbgMain.h"
  34. #endif
  35. #include "IncludeSysDefs.h"
  36. #include "Includestring_ex.h"
  37. #include "Decoderdecoder.h"
  38. #include "Drivedrv_API.h"
  39. #include "PlaycoreDataStructuresArray.h"
  40. #include "PlaycoreAuxCacheAuxCache.h"
  41. #include "PlaycoreExceptionException.h"
  42. #include "PlaycoreFileSysFileSystem.h"
  43. #include "PlaycoreMediaDetectionDVDDetection.h"
  44. #include "PlaycorePlayModePlayMode.h"
  45. #include "PlaycoreNav_DVDHeadernvgadefs.h"
  46. #ifdef MACESTROLINK_SUPPORT
  47. #include "drivefe_manager.h"
  48. #endif
  49. /////////////////////////////////////////////////////////////////
  50. //global Variables Definition
  51. ////////////////////////////////////////////////////////////////
  52. // Private Services
  53. DWORD get_ifobase(LPCWSTR prefix, BOOL bIsBackupfile);
  54. static DWORD get_sapbase(void);
  55. static DWORD get_sapbase(void)
  56. {
  57. DWORD dwSAPBase= 0;
  58. int repeatcnt = 1;
  59. while (0 != repeatcnt--) 
  60. {
  61. if (! FileSys_selectType(eAny)) {
  62. dbg_printf(("WARNING: get_sapbase() Failed [1]n", repeatcnt ));
  63. continue;
  64. }
  65. // Initialize the File-System
  66. if (! FileSys_initialize(FALSE)) {
  67. dbg_printf(("WARNING: get_sapbase() Failed [2]n"));
  68. continue;
  69. }
  70. // Try to enter the requested Directory
  71. if (! FileSys_changeDir(L"AUDIO_TS")) {
  72. dbg_printf(("WARNING: get_sapbase() Failed [3]n"));
  73. continue;
  74. }
  75. // Acquire the Address of the file
  76. if (FileSys_getFileLocation(L"AUDIO_PP.IFO", &dwSAPBase))
  77. break;
  78. dbg_printf(("WARNING: get_sapbase() Failed [4]n"));
  79. }
  80. return dwSAPBase;
  81. }
  82. DWORD get_ifobase(LPCWSTR prefix, BOOL bIsBackupfile)
  83. {
  84. DWORD dwIFOBase= 0;
  85. int repeatcnt = 2;
  86. WCHAR szFilename[16];
  87. dbg_printf(("get_ifobase(%s) calling.n", prefix));
  88. while (0 != repeatcnt--)
  89. {
  90. // Select any type of File-System that resides on the Medium
  91. if (! FileSys_selectType(eAny)) {
  92. dbg_printf(("WARNING: get_ifobase() Failed [1]n", repeatcnt ));
  93. continue;
  94. }
  95. // Initialize the File-System
  96. if (! FileSys_initialize(FALSE)) {
  97. dbg_printf(("WARNING: get_ifobase() Failed [2]n"));
  98. continue;
  99. }
  100. // Construct directory name
  101. wcscpy(szFilename, prefix);
  102. wcscat(szFilename, L"_TS");
  103. // Try to enter the requested Directory
  104. if (! FileSys_changeDir(szFilename)) {
  105. //<<<LX082202: Temporary patch for DVD discs whose VIDEO_TS don't locate in the root directory. Eventually we need to search the 
  106. //path table to get the location of video_ts.ifo file
  107. if(wcscmp(szFilename, L"VIDEO_TS") == 0)//Leon.He_20050326: This patch should be only for DVD_Video, but this function is for DVD Audio also
  108. {
  109. LPCWSTR pszNewDir = L"DVDVolume";
  110. LPCWSTR pszNewDir1 = L"VIDEO_TS";
  111. dbg_printf(("WARNING: get_ifobase() Failed [3]n"));
  112. if ( !FileSys_changeDir(pszNewDir)){
  113. dbg_printf(("WARNING: get_ifobase() Failed [n]n"));
  114. continue;
  115. }
  116. if ( !FileSys_changeDir(pszNewDir1)){
  117. dbg_printf(("WARNING: get_ifobase() Failed [n+1]n"));
  118. continue;
  119. }
  120. }
  121. //LX082202>>>
  122. }
  123. // Locate the IFO file
  124. wcscpy(szFilename, prefix);
  125. if(bIsBackupfile)
  126. wcscat(szFilename, L"_TS.BUP");
  127. else
  128. wcscat(szFilename, L"_TS.IFO");
  129. // Acquire the Address of the file
  130. if (FileSys_getFileLocation((LPCWSTR)szFilename, &dwIFOBase))
  131. return dwIFOBase;
  132. dbg_printf(("WARNING: get_ifobase() Failed [4]n"));
  133. }
  134. if (0 == dwIFOBase) {
  135. tr_printf(("FATAL: Can't get IFO Base...Bad Disk!n"));
  136. }
  137. return dwIFOBase;
  138. }
  139. /////////////////////////////////////////////////////////////////////////////////////////////////
  140. // DEC_DISC_TYPE DVD_DetermineDiscType() -
  141. // A sub-media identification service.
  142. //
  143. // Input:
  144. // None.
  145. //
  146. // Output:
  147. // The appropriate type of Disc for the Decoding process, or DEC_DISC_TYPE_NO_DISK if the
  148. // sub-media type couldn't be determined.
  149. //
  150. // Remarks: None
  151. int DVD_DetermineDiscType(void)
  152. {
  153. int iDVDDiscType = DVD_TYPE_NO_DISC;
  154. /* parse file system to find out what kind of DVD it is */
  155. /* DVD-Video, DVD-Audio/Video mixed, DVD-Audio only and DVD-ROM */
  156. #ifdef MACESTROLINK_SUPPORT
  157. if(IS_PLAYING_MLNK)
  158. DEC_SetDiskType( DEC_DISC_TYPE_MLNK); 
  159. Logo_display(); //Hansen_2004_12_29
  160. #endif
  161. /* Check if it is DVD Video Disc First */
  162. if (0 != (gns.dvd.dw_vmg_ifobase= get_ifobase(L"VIDEO", FALSE)))
  163. {
  164. iDVDDiscType |= DVD_TYPE_VMG;
  165. }
  166. if (0 != (gns.dvd.dw_amg_ifobase= get_ifobase(L"AUDIO", FALSE)))
  167. {
  168. iDVDDiscType |= DVD_TYPE_AMG;
  169. }
  170. #ifdef DVD_VR_SUPPORT
  171. {//detect DVD-VR disc
  172. #ifdef D_ONLY_ONE_SESSION_4VCD
  173. enFileSysType eFS= FileSys_determineType(FALSE);
  174. #else
  175. enFileSysType eFS= FileSys_determineType();
  176. #endif
  177. if( eUDF_200 == eFS )
  178. {
  179. if( FileSys_selectType(eFS) && FileSys_initialize(TRUE) )
  180. {
  181. if (FileSys_goToRootDir() && FileSys_changeDir(L"DVD_RTAV") )
  182. iDVDDiscType |= DVD_TYPE_VR_VMG;
  183. }
  184. }
  185. }
  186. #endif//DVD_VR_SUPPORT
  187. /*if (0 != (gns.dvd.dw_sap_ifobase= get_sapbase()))
  188. {
  189. iDVDDiscType |= DVD_TYPE_SAP;
  190. }*/
  191. dbg_printf(("DVD type: %dn", iDVDDiscType));
  192. dbg_printf(("vmg_ifobase:%ldn", gns.dvd.dw_vmg_ifobase));
  193. dbg_printf(("amg_ifobase:%ldn", gns.dvd.dw_amg_ifobase));
  194. dbg_printf(("sap_ifobase:%ldn", gns.dvd.dw_sap_ifobase));
  195. /* Check if it is DVD-Audio disc */
  196. #ifdef DVD_AUDIO_SUPPORT
  197. if (!gps->dvd_a_v_preference && (iDVDDiscType & DVD_TYPE_VMG))
  198. {
  199. /* means priority contents is DVD-Video and VMG exists */
  200. iDVDDiscType &= ~DVD_TYPE_AMG;
  201. }
  202. if (iDVDDiscType & DVD_TYPE_AMG)
  203. {
  204. return DVD_TYPE_AMG;
  205. }
  206. #endif
  207. if (iDVDDiscType & DVD_TYPE_VMG)
  208. {
  209. return DVD_TYPE_VMG;
  210. }
  211. #ifdef DVD_VR_SUPPORT
  212. if(iDVDDiscType & DVD_TYPE_VR_VMG)
  213. return DVD_TYPE_VR_VMG;
  214. #endif
  215. #ifdef DVD_ROM_CLIPS_SUPPORT
  216. /* Neither DVD-Video nor DVD-Audio, check if it is DVD-ROM Disc
  217.  * By default, we now assume it is DVD-ROM disc
  218.  */
  219. if ( Exception_catchAndRethrow( EXCEPTION_MEDIUM_EJECTED ) )
  220. return DVD_TYPE_NO_DISC;
  221. else
  222. return DVD_TYPE_DVD_ROM;
  223. #else
  224. return DVD_TYPE_NO_DISC;
  225. #endif /* DVD_ROM_CLIPS_SUPPORT */
  226. }