home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 January / maximum-cd-2010-01.iso / DiscContents / eac-0.99pb5.exe / WMCmd.vbs < prev   
Encoding:
Text File  |  2007-10-10  |  157.8 KB  |  4,983 lines

  1. '*****************************************************************************
  2. '
  3. ' Microsoft Windows Media
  4. ' Copyright (C) Microsoft Corporation. All rights reserved.
  5. '
  6. ' FileName:            WMCMD.VBS
  7. '
  8. ' Abstract:            Windows Media Encoder Command Line Script Utility
  9. '                      Use Cscript.exe wmcmd.vbs /? for Help
  10. '
  11. ' Last Update:         October 11, 2007
  12. '
  13. ' Visit http://www.citizeninsomniac.com/WMV for latest (unofficial) updates.
  14. '*****************************************************************************
  15.  
  16. Option Explicit
  17.  
  18. ' Check to see if script is run within cscript host.
  19. if instr( LCase(WScript.Fullname),"cscript.exe" ) = 0 then
  20.     dim WshShell
  21.     set WshShell = WScript.CreateObject("WScript.Shell")
  22.     WshShell.Popup "This script must be run using cscript.exe from a command window." , 0 , "Windows Media Encoder Command Line Script Utility" , 64
  23.     WScript.Quit()
  24. end if
  25.  
  26. ' These variables are part of encoder idl. However vbs cannot use them directly. So these are redefined
  27. dim WMENC_ENCODER_STARTING
  28. dim WMENC_ENCODER_RUNNING
  29. dim WMENC_ENCODER_PAUSED
  30. dim WMENC_ENCODER_STOPPING
  31. dim WMENC_ENCODER_STOPPED
  32. dim WMENC_ENCODER_END_PREPROCESS
  33.  
  34. dim WMENC_ARCHIVE_LOCAL
  35. dim WMENC_ARCHIVE_RUNNING
  36. dim WMENC_ARCHIVE_PAUSED
  37. dim WMENC_ARCHIVE_STOPPED
  38.  
  39. dim WMENC_AUDIO
  40. dim WMENC_VIDEO
  41. dim WMENC_SCRIPT
  42. dim WMENC_FILETRANSFER
  43.  
  44. dim WMENC_SOURCE_START
  45. dim WMENC_SOURCE_STOP
  46. dim WMENC_SOURCE_PREPARE
  47. dim WMENC_SOURCE_UNPREPARE
  48. dim WMENC_START_FILETRANSFER
  49. dim WMENC_STOP_FILETRANSFER
  50.  
  51. dim WMENC_PROTOCOL_HTTP
  52. dim WMENC_PROTOCOL_PUSH_DISTRIBUTION
  53.  
  54. dim WMENC_PVM_NONE
  55. dim WMENC_PVM_PEAK
  56. dim WMENC_PVM_UNCONSTRAINED
  57. dim WMENC_PVM_BITRATE_BASED
  58.  
  59. dim WMASTD_FOURCC
  60. dim WMAPRO_FOURCC
  61. dim WMALSL_FOURCC
  62. dim WMSPEECH_FOURCC
  63. dim PCM_FOURCC
  64.  
  65. dim WMV7_FOURCC
  66. dim WMV8_FOURCC
  67. dim WMV9_FOURCC
  68. dim WVC1_FOURCC
  69. dim WMS9_FOURCC
  70. dim MP41_FOURCC
  71. dim UNCOMP_FOURCC
  72.  
  73. dim WMASTD
  74. dim WMAPRO
  75. dim WMALSL
  76. dim WMSPEECH
  77. dim PCM
  78.  
  79. dim WMV7
  80. dim WMV8
  81. dim WMV9
  82. dim WVC1
  83. dim WMS9
  84. dim MP41
  85. dim UNCOMP
  86.  
  87. dim WMENC_CONTENT_ONE_AUDIO
  88. dim WMENC_CONTENT_ONE_VIDEO
  89. dim WMENC_CONTENT_ONE_AUDIO_ONE_VIDEO
  90.  
  91. dim WMENC_VIDEO_STANDARD
  92. dim WMENC_VIDEO_DEINTERLACE
  93. dim WMENC_VIDEO_INVERSETELECINE
  94. dim WMENC_VIDEO_PROCESS_INTERLACED
  95. dim WMENC_VIDEO_TELECINE_AUTO
  96. dim WMENC_VIDEO_TELECINE_AA_TOP
  97. dim WMENC_VIDEO_TELECINE_BB_TOP
  98. dim WMENC_VIDEO_TELECINE_BC_TOP
  99. dim WMENC_VIDEO_TELECINE_CD_TOP
  100. dim WMENC_VIDEO_TELECINE_DD_TOP
  101. dim WMENC_VIDEO_TELECINE_AA_BOTTOM
  102. dim WMENC_VIDEO_TELECINE_BB_BOTTOM
  103. dim WMENC_VIDEO_TELECINE_BC_BOTTOM
  104. dim WMENC_VIDEO_TELECINE_CD_BOTTOM
  105. dim WMENC_VIDEO_TELECINE_DD_BOTTOM
  106. dim WMENC_VIDEO_INTERLACED_AUTO
  107. dim WMENC_VIDEO_INTERLACED_TOP_FIRST
  108. dim WMENC_VIDEO_INTERLACED_BOTTOM_FIRST
  109. dim WMENC_PIXELFORMAT_IYUV
  110. dim WMENC_PIXELFORMAT_I420
  111. dim WMENC_PIXELFORMAT_YV12
  112. dim WMENC_PIXELFORMAT_YUY2
  113. dim WMENC_PIXELFORMAT_UYVY
  114. dim WMENC_PIXELFORMAT_YVYU
  115. dim WMENC_PIXELFORMAT_YVU9
  116. dim WMENC_PIXELFORMAT_RGB24
  117. dim WMENC_PIXELFORMAT_RGB32
  118. dim WMENC_PIXELFORMAT_RGB555
  119. dim WMENC_PIXELFORMAT_RGB565
  120. dim WMENC_PIXELFORMAT_RGB8
  121.  
  122. WMENC_ENCODER_STARTING = 1
  123. WMENC_ENCODER_RUNNING = 2
  124. WMENC_ENCODER_PAUSED = 3
  125. WMENC_ENCODER_STOPPING = 4
  126. WMENC_ENCODER_STOPPED = 5
  127. WMENC_ENCODER_END_PREPROCESS = 6
  128.  
  129. WMENC_ARCHIVE_LOCAL = 1
  130.  
  131. WMENC_ARCHIVE_RUNNING = 1
  132. WMENC_ARCHIVE_PAUSED = 2
  133. WMENC_ARCHIVE_STOPPED = 3
  134.  
  135. WMENC_AUDIO = 1
  136. WMENC_VIDEO = 2
  137. WMENC_SCRIPT = 4
  138. WMENC_FILETRANSFER = 8
  139.  
  140. WMENC_SOURCE_START = 1
  141. WMENC_SOURCE_STOP = 2
  142. WMENC_SOURCE_PREPARE = 3
  143. WMENC_SOURCE_UNPREPARE = 4
  144. WMENC_START_FILETRANSFER = 5
  145. WMENC_STOP_FILETRANSFER = 6
  146.  
  147. WMENC_PROTOCOL_HTTP = 1
  148. WMENC_PROTOCOL_PUSH_DISTRIBUTION = 2
  149.  
  150. WMENC_PVM_NONE = 1
  151. WMENC_PVM_PEAK = 2
  152. WMENC_PVM_UNCONSTRAINED = 3
  153. WMENC_PVM_BITRATE_BASED = 4
  154.  
  155. WMASTD_FOURCC = 353
  156. WMAPRO_FOURCC = 354
  157. WMALSL_FOURCC = 355
  158. WMSPEECH_FOURCC = 10
  159. PCM_FOURCC = 0
  160.  
  161. WMV7_FOURCC = 827739479
  162. WMV8_FOURCC = 844516695
  163. WMV9_FOURCC = 861293911
  164. WVC1_FOURCC = 826496599
  165. WMS9_FOURCC = 844321613
  166. MP41_FOURCC = 1395937357
  167. UNCOMP_FOURCC = 0
  168.  
  169. WMASTD = "WMASTD"
  170. WMAPRO = "WMAPRO"
  171. WMALSL = "WMALSL"
  172. WMSPEECH = "WMSP"
  173. PCM = "PCM"
  174.  
  175. WMV7 = "WMV7"
  176. WMV8 = "WMV8"
  177. WMV9 = "WMV9"
  178. WVC1 = "WVC1"
  179. WMS9 = "WMS9"
  180. MP41 = "MP41"
  181. UNCOMP = "UNCOMP"
  182.  
  183. WMENC_CONTENT_ONE_AUDIO = 1
  184. WMENC_CONTENT_ONE_VIDEO = 16
  185. WMENC_CONTENT_ONE_AUDIO_ONE_VIDEO = 17
  186.  
  187. WMENC_VIDEO_STANDARD = 1
  188. WMENC_VIDEO_DEINTERLACE = 2
  189. WMENC_VIDEO_INVERSETELECINE = 3
  190. WMENC_VIDEO_PROCESS_INTERLACED = 4
  191. WMENC_VIDEO_TELECINE_AA_TOP = &H23
  192. WMENC_VIDEO_TELECINE_BB_TOP = &H33
  193. WMENC_VIDEO_TELECINE_BC_TOP = &H43
  194. WMENC_VIDEO_TELECINE_CD_TOP = &H53
  195. WMENC_VIDEO_TELECINE_DD_TOP = &H63
  196. WMENC_VIDEO_TELECINE_AA_BOTTOM = &H73
  197. WMENC_VIDEO_TELECINE_BB_BOTTOM = &H83
  198. WMENC_VIDEO_TELECINE_BC_BOTTOM = &H93
  199. WMENC_VIDEO_TELECINE_CD_BOTTOM = &HA3
  200. WMENC_VIDEO_TELECINE_DD_BOTTOM = &HB3
  201. WMENC_VIDEO_INTERLACED_AUTO = 4
  202. WMENC_VIDEO_INTERLACED_TOP_FIRST = &H2004
  203. WMENC_VIDEO_INTERLACED_BOTTOM_FIRST = &H3004
  204.  
  205. WMENC_PIXELFORMAT_IYUV = &H56555949
  206. WMENC_PIXELFORMAT_I420 = &H30323449
  207. WMENC_PIXELFORMAT_YV12 = &H32315659
  208. WMENC_PIXELFORMAT_YUY2 = &H32595559
  209. WMENC_PIXELFORMAT_UYVY = &H59565955
  210. WMENC_PIXELFORMAT_YVYU = &H55595659
  211. WMENC_PIXELFORMAT_YVU9 = &H39555659
  212. WMENC_PIXELFORMAT_RGB24 = &HE436EB7D
  213. WMENC_PIXELFORMAT_RGB32 = &HE436EB7E
  214. WMENC_PIXELFORMAT_RGB555 = &HE436EB7C
  215. WMENC_PIXELFORMAT_RGB565 = &HE436EB7B
  216. WMENC_PIXELFORMAT_RGB8 = &HE436EB7A
  217.  
  218. dim g_strProductName
  219. dim g_strProductCopyright
  220. dim g_strInput
  221. dim g_strAudioInput
  222. dim g_strOutput
  223. dim g_strOutputString
  224. dim g_intSessionType
  225. dim g_strProfile
  226. dim g_strTitle
  227. dim g_strAlbum
  228. dim g_strGenre
  229. dim g_intTrackNo
  230. dim g_strYear
  231. dim g_strAuthor
  232. dim g_strCopyright
  233. dim g_strDescription
  234. dim g_strRating
  235. dim g_strWMEFile
  236. dim g_strProfileSave
  237. dim g_strProfileLoad
  238. dim g_strVideoEncoderRegistryKey
  239. dim g_strLogFile
  240.  
  241. dim g_intAudioDevice
  242. dim g_intVideoDevice
  243. dim g_intProfile
  244. dim g_intBroadcast
  245. dim g_strPushServer
  246. dim g_strPublishingPoint
  247. dim g_strPushTemplate
  248. dim g_intMarkInTime
  249. dim g_intMarkOutTime
  250. dim g_intDuration
  251. dim g_intVerbose
  252. dim g_intAudioSourceDuration
  253. dim g_intVideoSourceDuration
  254.  
  255.  
  256. dim g_objEncoder
  257. dim g_objSourceGroup
  258. dim g_objAudioSource
  259. dim g_objVideoSource
  260. dim g_objProfile
  261. dim g_objFileSystem
  262. dim g_objWshShell
  263. dim g_objLogFile
  264.  
  265. dim g_blnEncoderStarted
  266. dim g_blnEndPreProcess
  267. dim g_blnEncoderStopped
  268. dim g_intErrorCode
  269. dim g_intRunningSource
  270. dim g_blnDevice
  271. dim g_blnAudioOnly
  272. dim g_blnVideoOnly
  273. dim g_blnSilent
  274. dim g_blnDurationError
  275. dim g_blnLogOutput
  276.  
  277. dim g_intAudioVBRMode
  278. dim g_strAudioCodec
  279. dim g_strAudioSetting
  280. dim g_intAudioPeakBitrate
  281. dim g_intAudioPeakBuffer
  282. dim g_intAudioSpeechContent
  283. dim g_strAudioSpeechEdl
  284. dim g_intAudioSurroundMix
  285. dim g_intAudioCenterMix
  286. dim g_intAudioLEFMix
  287. dim g_strAudioCodecName
  288.  
  289. dim g_intVideoVBRMode
  290. dim g_strVideoCodec
  291. dim g_intVideoBitrate
  292. dim g_intVideoWidth
  293. dim g_intVideoHeight
  294. dim g_intVideoFramerate
  295. dim g_intVideoKeydist
  296. dim g_intVideoBuffer
  297. dim g_intVideoQuality
  298. dim g_intVideoQP
  299. dim g_intVideoPeakBitrate
  300. dim g_intVideoPeakBuffer
  301. dim g_intVideoPreprocess
  302. dim g_strPixelFormat
  303. dim g_intPixelAspectRatioX
  304. dim g_intPixelAspectRatioY
  305. dim g_intVideoPerformance
  306. dim g_strVideoCodecName
  307. dim g_strVideoDevConf
  308. dim g_intMaxPacketSize
  309. dim g_intMinPacketSize
  310.  
  311. dim g_intVideoCompOpt
  312. dim g_intVideoDenoise
  313. dim g_intVideoDquantOption
  314. dim g_intVideoDquantStrength
  315. dim g_intVideoBDeltaQP
  316. dim g_intVideoLoopfilter
  317. dim g_intVideoMedian
  318. dim g_intVideoEdgeRemoval
  319. dim g_intVideoNumThreads
  320. dim g_intVideoRangeRedux
  321. dim g_intVideoOverlap
  322. dim g_intVideoScaling
  323. dim g_intVideoLookahead
  324. dim g_intVideoLookaheadRC
  325. dim g_intVideoMBModeCost
  326. dim g_intVideoMMatch
  327. dim g_intVideoMSLevel
  328. dim g_intVideoMSRange
  329. dim g_intVideoMVCoding
  330. dim g_intVideoMVCost
  331. dim g_intVideoBFrameDist
  332. dim g_intVideoPercOpt
  333. dim g_intVideoType
  334. dim g_intVideoCodedWidth
  335. dim g_intVideoCodedHeight
  336. dim g_strVideoPreset
  337. dim g_intVideoThreadAffinity
  338.  
  339. dim g_EncoderRegSettings(30, 1)
  340.  
  341.  
  342. dim i
  343. dim j
  344. dim g_blnCreateCustomProfile
  345.  
  346. dim g_tStartTime
  347. dim g_tStopTime
  348.  
  349. dim g_intClipLeft
  350. dim g_intClipRight
  351. dim g_intClipTop
  352. dim g_intClipBottom
  353.  
  354. g_objLogFile = Null
  355.  
  356. g_strProductName = "Microsoft (R) Windows Media Encoder Command Line Script Utility"
  357. g_strProductCopyright = "Copyright (C) Microsoft Corporation. All rights reserved."
  358. g_strInput = ""
  359. g_strAudioInput = ""
  360. g_strOutput = ""
  361. g_strOutputString = ""
  362. g_intSessionType = WMENC_CONTENT_ONE_AUDIO
  363. g_strProfile = ""
  364. g_strTitle = ""
  365. g_strAuthor = ""
  366. g_strAlbum = ""
  367. g_intTrackNo = ""
  368. g_strYear = ""
  369. g_strGenre = ""
  370. g_strCopyright = ""
  371. g_strDescription = ""
  372. g_strRating = ""
  373. g_strWMEFile = ""
  374. g_strProfileSave = ""
  375. g_strProfileLoad = ""
  376. g_strProfile = ""
  377. g_strVideoEncoderRegistryKey = "HKCU\Software\Microsoft\Scrunch\WMVideo"
  378.  
  379. g_intAudioDevice = -1
  380. g_intVideoDevice = -1
  381. g_intProfile = -1
  382. g_intBroadcast = -1
  383. g_strPushServer = ""
  384. g_strPublishingPoint = ""
  385. g_strPushTemplate = ""
  386. g_intMarkInTime = -1
  387. g_intMarkOutTime = -1
  388. g_intDuration = -1
  389. g_intVerbose = 2
  390. g_intAudioSourceDuration = -1
  391. g_intVideoSourceDuration = -1
  392.  
  393. g_blnEncoderStarted = false
  394. g_blnEncoderStopped = false
  395. g_blnEndPreProcess = false
  396. g_blnDevice = false
  397. g_intErrorCode = 0
  398. g_intRunningSource = 0
  399. g_blnAudioOnly = false
  400. g_blnVideoOnly = false
  401. g_blnDurationError = false
  402. g_blnLogOutput = false
  403.  
  404. g_intAudioVBRMode = -1
  405. g_strAudioCodec = ""
  406. g_strAudioSetting = ""
  407. g_intAudioPeakBitrate = -1
  408. g_intAudioPeakBuffer = -1
  409. g_intAudioSpeechContent = -1
  410. g_strAudioSpeechEdl = ""
  411. g_intAudioSurroundMix = -1
  412. g_intAudioCenterMix = -1
  413. g_intAudioLEFMix = -1
  414. g_strAudioCodecName = ""
  415.  
  416. g_intVideoVBRMode = -1
  417. g_strVideoCodec = ""
  418. g_intVideoBitrate = -1
  419. g_intVideoWidth = -1
  420. g_intVideoHeight = -1
  421. g_intVideoFramerate = -1
  422. g_intVideoKeydist = -1
  423. g_intVideoBuffer = -1
  424. g_intVideoQuality = -1
  425. g_intVideoQP = -1
  426. g_intVideoPeakBitrate = -1
  427. g_intVideoPeakBuffer = -1
  428. g_intVideoPreprocess = -1
  429. g_strPixelFormat = ""
  430. g_intPixelAspectRatioX = -1
  431. g_intPixelAspectRatioY = -1
  432. g_intVideoPerformance = -1
  433. g_strVideoCodecName = ""
  434. g_strVideoDevConf = ""
  435. g_intMaxPacketSize = -1
  436. g_intMinPacketSize = -1
  437.  
  438.  
  439. g_intVideoCompOpt = -128
  440. g_intVideoDenoise = -128
  441. g_intVideoDquantOption = -128
  442. g_intVideoDquantStrength = -128
  443. g_intVideoBDeltaQP = -128
  444. g_intVideoLoopfilter = -128
  445. g_intVideoMedian = -128
  446. g_intVideoEdgeRemoval = -128
  447. g_intVideoNumThreads = -128
  448. g_intVideoRangeRedux = -128
  449. g_intVideoOverlap = -128
  450. g_intVideoScaling = -128
  451. g_intVideoLookahead = -128
  452. g_intVideoLookaheadRC = -128
  453. g_intVideoMBModeCost = -128
  454. g_intVideoMMatch = -128
  455. g_intVideoMSLevel = -128
  456. g_intVideoMSRange = -128
  457. g_intVideoMVCoding = -128
  458. g_intVideoMVCost = -128
  459. g_intVideoBFrameDist = -128
  460. g_intVideoPercOpt = -128
  461. g_intVideoType = -128
  462. g_intVideoCodedWidth = -128
  463. g_intVideoCodedHeight = -128
  464. g_strVideoPreset = ""
  465. g_intVideoThreadAffinity = -128
  466.  
  467. for i = 0 to 30 
  468.     g_EncoderRegSettings(i,0) = ""
  469.     g_EncoderRegSettings(i,1) = -128
  470. next
  471.  
  472. g_intClipLeft = -1
  473. g_intClipRight = -1
  474. g_intClipTop = -1
  475. g_intClipBottom = -1
  476.  
  477. g_blnCreateCustomProfile = true
  478.  
  479. ' Create an encoder object.
  480. on error resume next
  481. set g_objEncoder = WScript.CreateObject( "WMEncEng.WMEncoder" )
  482. if not isObject(g_objEncoder) then
  483.     OutputInfo "Error: Cannot initialize Windows Media Encoder object. Please verify that"
  484.     OutputInfo "Windows Media Encoder 9 Series is correctly installed on your system."
  485.     OutputInfo "If running 64-bit Windows, make sure that the version of cscript.exe used"
  486.     OutputInfo "corresponds to the version (x86/x64) of WME9 installed on your system."
  487.     WScript.Quit()
  488. end if
  489. On Error Goto 0
  490.  
  491.  
  492. WScript.ConnectObject g_objEncoder, "Encoder_"        ' Setup call back events
  493.     
  494. set g_objFileSystem = WScript.CreateObject( "Scripting.FileSystemObject" )
  495. set g_objWshShell = WScript.CreateObject("WScript.Shell")
  496. g_objSourceGroup = Null
  497. g_objAudioSource = Null
  498. g_objVideoSource = Null
  499. g_objProfile = NULL
  500.  
  501. ' Read a integer value from the paramters list.
  502. ' args is the paramters list to be read.
  503. ' intIndex1 is the position of the parameter name.
  504. ' intIndex2 is the position of the parameter value.
  505. ' It will return the integer if it can read a integer value from the parameter list
  506. ' It will return -1 if it can not get a integer value from the paramters list.
  507. function ReadInteger( args, intIndex1, intIndex2 )
  508.     on error resume next
  509.     dim strTypeName
  510.  
  511.     ' Check the range of index.
  512.     if intIndex2 > UBound(args) or Left( args(intIndex2), 1 ) = "-" then
  513.         OutputInfo "Invalid format for parameter " & args(intIndex1)
  514.         ReadInteger = -1
  515.         exit function
  516.     end if
  517.  
  518.     strTypeName = typename( eval( args(intIndex2) ) )
  519.  
  520.     ' Convert it to an integer value.
  521.     ReadInteger = CLng( args(intIndex2) )
  522.  
  523.     ' The value is not in integer fommat.
  524.     if err.number <> 0 or ( strTypeName <> "Integer" and strTypeName <> "Long" )  then
  525.         OutputInfo "Expect integer value for parameter " & args(intIndex1)
  526.         ReadInteger = -1
  527.         err.Clear
  528.     end if
  529.  
  530. end function
  531.  
  532. ' Read a float value from the paramters list.
  533. ' args is the paramters list to be read.
  534. ' intIndex1 is the position of the parameter name.
  535. ' intIndex2 is the position of the parameter value.
  536. ' It will return the float if it can read a float value from the parameter list
  537. ' It will return -1 if it can not get a float value from the paramters list.
  538. function ReadFloat( args, intIndex1, intIndex2 )
  539.     on error resume next
  540.     dim strTypeName
  541.  
  542.     ' Check the range of index.
  543.     if intIndex2 > UBound(args) or Left( args(intIndex2), 1 ) = "-" then
  544.         OutputInfo "Invalid format for parameter " & args(intIndex1)
  545.         ReadFloat = -1
  546.         exit function
  547.     end if
  548.  
  549.     strTypeName = typename( eval( args(intIndex2) ) )
  550.  
  551.     ' Convert it to an integer value.
  552.     ReadFloat = CSng( args(intIndex2) )
  553.  
  554.     ' The value is not in integer fommat.
  555.     if err.number <> 0 or ( strTypeName <> "Integer" and strTypeName <> "Long" and strTypeName <> "Single" and strTypeName <> "Double" )  then
  556.         OutputInfo "Expect float value for parameter " & args(intIndex1)
  557.         ReadFloat = -1
  558.         err.Clear
  559.     end if
  560.  
  561. end function
  562.  
  563. ' Read a var value from the paramters list.
  564. ' args is the paramters list to be read.
  565. ' intIndex1 is the position of the parameter name.
  566. ' intIndex2 is the position of the parameter value.
  567. ' It will return the var if it can not get a var value from the paramters list.
  568. ' It will return "" if it can not get a var value from the paramters list.
  569. function ReadString( args, intIndex1, intIndex2 )
  570.     ' Check the range of index.
  571.     if intIndex2 > UBound(args) or Left( args(intIndex2), 1 ) = "-" then
  572.         OutputInfo "Invalid format for parameter " & args(intIndex1)
  573.         ReadString = ""
  574.         exit function
  575.     end if
  576.  
  577.     ReadString = args(intIndex2)
  578. end function
  579.  
  580. function ConvertStringToInteger( strInput )
  581.     on error resume next
  582.     dim strTypeName
  583.  
  584.     strTypeName = typename( eval( strInput ) )
  585.  
  586.     ' Convert it to an integer value.
  587.     ConvertStringToInteger = CLng( strInput )
  588.  
  589.     ' The value is not in integer fommat.
  590.     if err.number <> 0 or ( strTypeName <> "Integer" and strTypeName <> "Long" )  then
  591.         OutputInfo "Invalid format " & strInput & " expecting integer value"
  592.         ConvertStringToInteger = -1
  593.         err.Clear
  594.     end if
  595.  
  596. end function
  597.  
  598. ' Parse parameters.
  599.  
  600. if wscript.arguments.Length = 0 then
  601.     ShowHelp()
  602.     wscript.quit()
  603. end if
  604.  
  605. dim colStrArgs()
  606. reDim colStrArgs( wscript.arguments.Length-1 )
  607. for i = 0 to wscript.arguments.Length-1
  608.     colStrArgs(i) = wscript.arguments(i)
  609. next
  610.  
  611. if ParseParameters( colStrArgs ) then
  612.     ' Do different things depending on whether input is wme, directory encoding or file encoding
  613.     if g_strInput <> "" and g_objFileSystem.FolderExists(g_strInput) then
  614.         DoDirectoryModeEncoding()
  615.     elseif SetupEncoder() then
  616.         ' Transcode and show statistics information
  617.         if Transcode() and not g_blnSilent then 
  618.             ShowStatistics()
  619.         end if 
  620.     end if
  621. else
  622.     OutputInfo "Command-line parsing completed."
  623. end if
  624.  
  625.  
  626. if not IsNull(g_objLogFile) then
  627.     g_objLogFile.Close
  628. end if
  629.  
  630. ' Some input sources are known to cause the script engine to hang
  631. ' Forcefully terminate this script
  632. TerminateEncoderProcess()
  633.  
  634. WScript.Quit()
  635.  
  636. ' Output information
  637. function OutputInfo( strInfo )
  638.     WScript.Echo( strInfo )
  639.     if g_blnLogOutput then
  640.         g_objLogFile.WriteLine( strInfo )
  641.     end if
  642. end function
  643.  
  644. ' Event handler for encoder state
  645. function Encoder_OnStateChange( enumState )
  646.     dim strState
  647.     ' Translate encoder state
  648.     select case  enumState
  649.         case WMENC_ENCODER_STARTING
  650.             strState = "Starting"
  651.  
  652.         case WMENC_ENCODER_RUNNING
  653.             strState = "Running"
  654.             g_blnEncoderStarted = true
  655.  
  656.         case WMENC_ENCODER_PAUSED
  657.             strState = "Paused"
  658.  
  659.         case WMENC_ENCODER_STOPPING
  660.             strState = "Stopping"
  661.  
  662.         case WMENC_ENCODER_STOPPED
  663.             g_tStopTime = Now()
  664.             strState = "Stopped"
  665.             g_blnEncoderStopped = true
  666.  
  667.         case WMENC_ENCODER_END_PREPROCESS
  668.             strState = "End Preprorocess"
  669.             g_blnEndPreProcess = true
  670.  
  671.         case else
  672.             strState = "Unknown State"
  673.     end select
  674.  
  675.     Encoder_OnStateChange = 1
  676. end function
  677.  
  678. ' Event handler for encoder error
  679. function Encoder_OnError( intResult )
  680.     g_intErrorCode = intResult
  681.  
  682.     Encoder_OnError = 0
  683. end function
  684.  
  685. function IsEncoderRegistryDirty()
  686.  
  687.     On Error Resume Next
  688.  
  689.     dim bDirtyFlag
  690.     dim regDirtyFlag
  691.     bDirtyFlag = false
  692.     
  693.     regDirtyFlag = g_objWshShell.RegRead(g_strVideoEncoderRegistryKey & "\WMCmdDirtyFlag")
  694.     
  695.     if err <> 0 then
  696.         bDirtyFlag = false
  697.     else
  698.         if regDirtyFlag = 1 then
  699.             bDirtyFlag = true
  700.         else
  701.             bDirtyFlag = false
  702.         end if
  703.     end if
  704.  
  705.     IsEncoderRegistryDirty = bDirtyFlag
  706.  
  707. end function
  708.  
  709. function SaveEncoderRegistrySettings()
  710.  
  711.     On Error Resume Next
  712.     
  713.     g_EncoderRegSettings(0,0) =  "\Compression Optimization Type"
  714.     g_EncoderRegSettings(1,0) =  "\DenoiseOption"
  715.     g_EncoderRegSettings(2,0) =  "\Dquant Option"
  716.     g_EncoderRegSettings(3,0) =  "\Dquant Strength"
  717.     g_EncoderRegSettings(4,0) =  "\Force B Frame Delta QP"
  718.     g_EncoderRegSettings(5,0) =  "\Force Encoding Width"
  719.     g_EncoderRegSettings(6,0) =  "\Force Encoding Height"
  720.     g_EncoderRegSettings(7,0) =  "\Force LoopFilter"
  721.     g_EncoderRegSettings(8,0) =  "\Force Median"
  722.     g_EncoderRegSettings(9,0) =  "\Force NoiseEdgeRemoval"
  723.     g_EncoderRegSettings(10,0) =  "\Force NumThreads"
  724.     g_EncoderRegSettings(11,0) =  "\Force Range Reduction"
  725.     g_EncoderRegSettings(12,0) =  "\Force Overlap"
  726.     g_EncoderRegSettings(13,0) =  "\Force Video Scaling"
  727.     g_EncoderRegSettings(14,0) =  "\Lookahead"
  728.     g_EncoderRegSettings(15,0) =  "\Lookahead Ratecontrol"
  729.     g_EncoderRegSettings(16,0) =  "\Macroblock Mode Cost Method"
  730.     g_EncoderRegSettings(17,0) =  "\Motion Match Method"
  731.     g_EncoderRegSettings(18,0) =  "\Motion Search Level"
  732.     g_EncoderRegSettings(19,0) =  "\Motion Search Range"
  733.     g_EncoderRegSettings(20,0) =  "\Motion Vector Coding Method"
  734.     g_EncoderRegSettings(21,0) =  "\Motion Vector Cost Method"
  735.     g_EncoderRegSettings(22,0) =  "\NumBFrames"
  736.     g_EncoderRegSettings(23,0) =  "\Perceptual Option"
  737.     g_EncoderRegSettings(24,0) =  "\VideoType"
  738.     g_EncoderRegSettings(25,0) =  "\Encoder Thread Affinity"
  739.     
  740.     for i = 0 to 25
  741.         g_EncoderRegSettings(i,1) = g_objWshShell.RegRead(g_strVideoEncoderRegistryKey & g_EncoderRegSettings(i,0))
  742.     next
  743.  
  744.     On Error Goto 0
  745.  
  746. end function
  747.  
  748. function RestoreEncoderRegistrySettings()
  749.  
  750.     On Error Resume Next
  751.     
  752.     for i = 0 to 30
  753.         if (g_EncoderRegSettings(i,0) <> "") and (g_EncoderRegSettings(i,1) <> -128) then
  754.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & g_EncoderRegSettings(i,0), g_EncoderRegSettings(i,1), "REG_DWORD"
  755.         end if
  756.     next
  757.  
  758.     On Error Goto 0
  759.  
  760. end function
  761.  
  762. ' Deletes WVC1 encoder parameters from the registry
  763. function ClearEncoderRegistrySettings()
  764.  
  765.     On Error Resume Next
  766.         
  767.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Compression Optimization Type"
  768.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\DenoiseOption"
  769.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Dquant Option"
  770.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Dquant Strength"
  771.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Force B Frame Delta QP"
  772.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Force Encoding Width"
  773.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Force Encoding Height"
  774.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Force LoopFilter"
  775.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Force Median"
  776.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Force NoiseEdgeRemoval"
  777.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Force NumThreads"
  778.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Force Range Reduction"
  779.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Force Overlap"
  780.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Force Video Scaling"
  781.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Lookahead"
  782.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Lookahead Ratecontrol"
  783.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Macroblock Mode Cost Method"
  784.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Motion Match Method"
  785.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Motion Search Level"
  786.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Motion Search Range"
  787.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Motion Vector Coding Method"
  788.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Motion Vector Cost Method"
  789.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\NumBFrames"
  790.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Perceptual Option"
  791.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\VideoType"
  792.     g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\Encoder Thread Affinity"
  793.  
  794.     On Error Goto 0
  795.  
  796. end function
  797.  
  798. ' Parse the parameters of this program.
  799. function ParseParameters( args )
  800.     dim reParser
  801.     dim colMatches
  802.     dim strMarkOutTime
  803.     dim strArguments, strArgumentsQuoted
  804.     dim strSaveToCfgFile
  805.     dim strLoadFromCfgFile
  806.     dim strCfgFileArguments
  807.     dim colStrConfigArgs
  808.     dim objTextFile
  809.     dim intVideoRangeReduxYR, intVideoRangeReduxYE, intVideoRangeReduxCR, intVideoRangeReduxCE
  810.     dim intArgIndex
  811.     
  812.     ' First traverse of the arguments just checks for config saving and loading args
  813.     for intArgIndex=0 to UBound(args)
  814.             
  815.         if args(intArgIndex) = "-s_config" then
  816.             intArgIndex = intArgIndex + 1
  817.         else
  818.             if InStr(args(intArgIndex)," ") > 0 then
  819.                 strArgumentsQuoted = strArgumentsQuoted & Chr(34) & args(intArgIndex) & Chr(34) & " "
  820.             else
  821.                 strArgumentsQuoted = strArgumentsQuoted & args(intArgIndex) & " "
  822.             end if
  823.             strArguments = strArguments & args(intArgIndex) & " "
  824.         end if
  825.  
  826.         if args(intArgIndex) = "-config" then
  827.             strLoadFromCfgFile = ReadString( args, intArgIndex, intArgIndex+1 )
  828.             if strLoadFromCfgFile = "" then
  829.                 ParseParameters = false
  830.                 exit function
  831.             end if
  832.                     
  833.             intArgIndex = intArgIndex + 1
  834.                         
  835.             strLoadFromCfgFile = g_objFileSystem.GetAbsolutePathName( strLoadFromCfgFile )
  836.             set objTextFile = g_objFileSystem.OpenTextFile( strLoadFromCfgFile, 1 )
  837.             strCfgFileArguments = objTextFile.ReadLine
  838.             objTextFile.Close
  839.             
  840.             strCfgFileArguments = Trim( strCfgFileArguments )
  841.             if strCfgFileArguments = "" then
  842.                 OutputInfo "Configuration file " & strLoadFromCfgFile & " is empty."
  843.                 ParseParameters = false
  844.                 exit function
  845.             end if
  846.  
  847.             ' Splits the argument string into an array using space as separator but respecting quotes
  848.             set reParser = New RegExp
  849.             reParser.Pattern = "\s*(" & Chr(34) & "([^" & Chr(34) & "]*)" & Chr(34) & "|([^" & " " & "]+))\s*"
  850.             reParser.Global = true
  851.             set colMatches = reParser.Execute(strCfgFileArguments)
  852.             ReDim colStrConfigArgs(colMatches.Count - 1)
  853.             for j=0 to colMatches.Count - 1
  854.                 colStrConfigArgs(j) = Replace(Trim(colMatches(j).Value), Chr(34), "")
  855.             next            
  856.             set reParser = nothing
  857.             set colMatches = nothing
  858.                         
  859.             if ParseParameters( colStrConfigArgs ) = false then
  860.                 ParseParameters = false
  861.                 exit function
  862.             end if
  863.         end if
  864.     next
  865.  
  866.     'OutputInfo "Args = " & strArguments
  867.     'OutputInfo "ArgsQuoted = " & strArgumentsQuoted
  868.  
  869.     if UBound(args) = 0 then
  870.         ' If it has only has one parameter, check the content of this parameter.
  871.         select case LCase( args(0) )     
  872.             case "-devices":
  873.                 ' List all audio and video devices.
  874.                 ListDevices()
  875.                 ParseParameters = false
  876.                 exit function
  877.  
  878.             case "-a_codecs":
  879.                 ' List all audio codecs.
  880.                 ListAudioCodecs()
  881.                 ParseParameters = false
  882.                 exit function
  883.  
  884.             case "-a_formats"
  885.                 ' List audio formats
  886.                 ListAudioFormats()
  887.                 ParseParameters = false
  888.                 exit function
  889.             
  890.             case "-v_codecs":
  891.                 ' List all video codecs.
  892.                 ListVideoCodecs()
  893.                 ParseParameters = false
  894.                 exit function
  895.             
  896.             case "-help":
  897.                 ' Show help information.
  898.                 ShowHelp()
  899.                 ParseParameters = false
  900.                 exit function
  901.  
  902.             case "-?":
  903.                 ' Show help information.
  904.                 ShowHelp()
  905.                 ParseParameters = false
  906.                 exit function
  907.  
  908.             case "-all?":
  909.                 ' Show help information.
  910.                 ShowHelp()
  911.                 ParseParameters = false
  912.                 exit function
  913.             
  914.             case "/?":
  915.                 ' Show help information.
  916.                 ShowHelp()
  917.                 ParseParameters = false
  918.                 exit function
  919.                         
  920.         end select
  921.     end if
  922.  
  923.     if UBound(args) = 1 then
  924.         select case LCase( args(0) ) 
  925.             case "-input"
  926.             ' Print out info about file specified
  927.             g_strInput = ReadString( args, 0, 1 )
  928.             if g_strInput = ""  then
  929.                 ParseParameters = false
  930.                 exit function
  931.             end if
  932.  
  933.             PrintFileInfo()
  934.             ParseParameters = false
  935.             exit function
  936.             
  937.             case "-log"
  938.             ' Print all output to log file
  939.             OutputInfo "Log file can only be used with a valid encoding session."
  940.             ParseParameters = false
  941.             exit function
  942.             
  943.         end select
  944.     end if
  945.  
  946.     ' Check all parameters.
  947.     for i=0 to UBound(args)
  948.     
  949.         select case LCase( args(i) )
  950.             ' Parse all input related stuff
  951.             case "-wme"
  952.                 ' Get the WME file name to be load.
  953.                 g_strWMEFile = ReadString( args, i, i+1 )
  954.                 if g_strWMEFile = "" then
  955.                     ParseParameters = false
  956.                     exit function
  957.                 end if
  958.         
  959.                 i = i + 1
  960.  
  961.             case "-input"                        
  962.                 ' Get input source file name.
  963.                 g_strInput = ReadString( args, i, i+1 )
  964.                 if g_strInput = ""  then
  965.                     ParseParameters = false
  966.                     exit function
  967.                 end if
  968.         
  969.                 i = i + 1
  970.  
  971.             case "-audioonly"
  972.                 g_blnAudioOnly = true
  973.  
  974.             case "-videoonly"
  975.                 g_blnVideoOnly = true
  976.  
  977.             case "-adevice"
  978.                 g_blnDevice = true
  979.                 ' Get audio device index.
  980.                 if i+1 <= UBound(args) and Left( args(i+1), 1 ) <> "-" then
  981.                     g_intAudioDevice = ReadInteger( args, i, i+1 )
  982.                     if g_intAudioDevice = -1 then
  983.                         ParseParameters = false
  984.                         exit function
  985.                     end if
  986.                     
  987.                     i = i + 1
  988.                 else
  989.                     g_intAudioDevice = 0     ' default audio device
  990.                 end if
  991.  
  992.             case "-vdevice"
  993.                 g_blnDevice = true
  994.                 ' Get video device index.
  995.                 if i+1 <= UBound(args) and Left( args(i+1), 1 ) <> "-" then
  996.                     g_intVideoDevice = ReadInteger( args, i, i+1 )
  997.                     if g_intVideoDevice = -1 then
  998.                         ParseParameters = false
  999.                         exit function
  1000.                     end if
  1001.                 
  1002.                     i = i + 1
  1003.                 else
  1004.                     g_intVideoDevice = 0     ' default video device
  1005.                 end if
  1006.  
  1007.             ' Parse all profile related stuff
  1008.             case "-profile"
  1009.                 ' Get input source file name.
  1010.                 g_strProfile = ReadString( args, i, i+1 )
  1011.                 if g_strProfile = ""  then
  1012.                     ParseParameters = false
  1013.                     exit function
  1014.                 end if
  1015.         
  1016.                 i = i + 1
  1017.  
  1018.             ' Parse audio related stuff
  1019.             
  1020.             case "-a_input"                        
  1021.                 ' Get alternate audio input source file name.
  1022.                 g_strAudioInput = ReadString( args, i, i+1 )
  1023.                 if g_strAudioInput = ""  then
  1024.                     ParseParameters = false
  1025.                     exit function
  1026.                 end if
  1027.         
  1028.                 i = i + 1            
  1029.             
  1030.             case "-a_mode"
  1031.                 g_intAudioVBRMode = ReadInteger( args, i, i+1 )
  1032.                 if g_intAudioVBRMode = -1 then
  1033.                     ParseParameters = false
  1034.                     exit function
  1035.                 end if
  1036.         
  1037.                 i = i + 1
  1038.  
  1039.             case "-a_codec"
  1040.                 'Get audio codec name
  1041.                 g_strAudioCodec = ReadString( args, i, i+1 )
  1042.                 g_strAudioCodec = UCase( g_strAudioCodec )
  1043.  
  1044.                 if g_strAudioCodec = "WMA9STD" then g_strAudioCodec = "WMASTD"
  1045.                 if g_strAudioCodec = "WMA9PRO" then g_strAudioCodec = "WMAPRO"
  1046.                 if g_strAudioCodec = "WMA9LSL" then g_strAudioCodec = "WMALSL"
  1047.                 if g_strAudioCodec = "WMSP9" then g_strAudioCodec = "WMSP9"
  1048.  
  1049.                 if g_strAudioCodec <> WMASTD and g_strAudioCodec <> WMAPRO and g_strAudioCodec <> WMALSL and g_strAudioCodec <> WMSPEECH and g_strAudioCodec <> PCM then
  1050.                     OutputInfo "Please enter correct audio codec index only"
  1051.                     ParseParameters = false
  1052.                     exit function
  1053.                 end if
  1054.  
  1055.                 if g_strAudioCodec = ""  then
  1056.                     ParseParameters = false
  1057.                     exit function
  1058.                 end if
  1059.         
  1060.                 i = i + 1
  1061.  
  1062.             case "-a_setting"
  1063.                 'Get audio setting
  1064.                 g_strAudioSetting = ReadString( args, i, i+1 )
  1065.                 if g_strAudioSetting = ""  then
  1066.                     ParseParameters = false
  1067.                     exit function
  1068.                 end if
  1069.         
  1070.                 i = i + 1
  1071.  
  1072.             case "-a_peakbitrate"
  1073.                 'Get audio peakbitrate size
  1074.                 g_intAudioPeakBitrate = ReadInteger( args, i, i+1 )
  1075.                 if g_intAudioPeakBitrate = -1  then
  1076.                     ParseParameters = false
  1077.                     exit function
  1078.                 end if
  1079.         
  1080.                 i = i + 1
  1081.  
  1082.             case "-a_peakbuffer"
  1083.                 'Get audio peakbuffer size
  1084.                 g_intAudioPeakBuffer = ReadInteger( args, i, i+1 )
  1085.                 if g_intAudioPeakBuffer = -1  then
  1086.                     ParseParameters = false
  1087.                     exit function
  1088.                 end if
  1089.         
  1090.                 i = i + 1
  1091.  
  1092.             case "-a_content"
  1093.                 'Get content type for speech
  1094.                 g_intAudioSpeechContent = ReadInteger( args, i, i+1 )
  1095.                 if g_intAudioSpeechContent = -1 then
  1096.                     ParseParameters = false
  1097.                     exit function
  1098.                 elseif g_intAudioSpeechContent < 0 or g_intAudioSpeechContent > 2 then
  1099.                     OutputInfo "Invalid range for parameter " & args(i)
  1100.                     ParseParameters = false
  1101.                     exit function
  1102.                 end if
  1103.         
  1104.                 i = i + 1
  1105.  
  1106.             case "-a_contentedl"
  1107.                 'Get EDL file for speech content
  1108.                 g_strAudioSpeechEdl = ReadString( args, i, i+1 )
  1109.                 if g_strAudioSpeechEdl = ""  then
  1110.                     ParseParameters = false
  1111.                     exit function
  1112.                 end if
  1113.         
  1114.                 i = i + 1
  1115.  
  1116.             case "-a_folddown6to2"
  1117.                 'Get EDL file for speech content
  1118.                 g_intAudioSurroundMix = ReadInteger( args, i, i+1 )
  1119.                 if g_intAudioSurroundMix = -1  then
  1120.                     ParseParameters = false
  1121.                     exit function
  1122.                 end if
  1123.                 g_intAudioCenterMix = ReadInteger( args, i, i+2 )
  1124.                 if g_intAudioCenterMix = -1  then
  1125.                     ParseParameters = false
  1126.                     exit function
  1127.                 end if    
  1128.                 g_intAudioLEFMix = ReadInteger( args, i, i+3 )
  1129.                 if g_intAudioLEFMix = -1  then
  1130.                     ParseParameters = false
  1131.                     exit function
  1132.                 end if
  1133.         
  1134.                 i = i + 3
  1135.  
  1136.             ' Parse video related stuff
  1137.             case "-v_mode"
  1138.                 g_intVideoVBRMode = ReadInteger( args, i, i+1 )
  1139.                 if g_intVideoVBRMode = -1 then
  1140.                     ParseParameters = false
  1141.                     exit function
  1142.                 end if
  1143.         
  1144.                 i = i + 1
  1145.  
  1146.             case "-v_codec"
  1147.                 'Get video codec name
  1148.                 g_strVideoCodec = ReadString( args, i, i+1 )
  1149.                 g_strVideoCodec = UCase( g_strVideoCodec )
  1150.                 if g_strVideoCodec <> WMV7 and g_strVideoCodec <> WMV8 and g_strVideoCodec <> WMV9 and g_strVideoCodec <> WVC1 and g_strVideoCodec <> WMS9 and g_strVideoCodec <> UNCOMP and g_strVideoCodec <> MP41 then
  1151.                     OutputInfo "Please enter correct video codec index only"
  1152.                     ParseParameters = false
  1153.                     exit function
  1154.                 end if
  1155.  
  1156.                 if g_strVideoCodec = ""  then
  1157.                     ParseParameters = false
  1158.                     exit function
  1159.                 end if
  1160.         
  1161.                 i = i + 1
  1162.  
  1163.             case "-v_bitrate"
  1164.                 'Get video bitrate
  1165.                 g_intVideoBitrate = ReadInteger( args, i, i+1 )
  1166.                 if g_intVideoBitrate = -1  then
  1167.                     ParseParameters = false
  1168.                     exit function
  1169.                 end if
  1170.         
  1171.                 i = i + 1
  1172.  
  1173.             case "-v_buffer"
  1174.                 'Get video buffer
  1175.                 g_intVideoBuffer = ReadInteger( args, i, i+1 )
  1176.                 if g_intVideoBuffer = -1  then
  1177.                     ParseParameters = false
  1178.                     exit function
  1179.                 end if
  1180.         
  1181.                 i = i + 1
  1182.  
  1183.             case "-v_width"
  1184.                 'Get video width
  1185.                 g_intVideoWidth = ReadInteger( args, i, i+1 )
  1186.                 if g_intVideoWidth = -1  then
  1187.                     ParseParameters = false
  1188.                     exit function
  1189.                 end if
  1190.         
  1191.                 i = i + 1
  1192.  
  1193.             case "-v_height"
  1194.                 'Get video height
  1195.                 g_intVideoHeight = ReadInteger( args, i, i+1 )
  1196.                 if g_intVideoHeight = -1  then
  1197.                     ParseParameters = false
  1198.                     exit function
  1199.                 end if
  1200.         
  1201.                 i = i + 1
  1202.  
  1203.             case "-v_framerate"
  1204.                 'Get video framerate
  1205.                 g_intVideoFramerate = ReadFloat( args, i, i+1 )
  1206.                 if g_intVideoFramerate = -1  then
  1207.                     ParseParameters = false
  1208.                     exit function
  1209.                 end if
  1210.                 g_intVideoFramerate = 1000 * g_intVideoFramerate
  1211.         
  1212.                 i = i + 1
  1213.  
  1214.             case "-v_keydist"
  1215.                 'Get video keyframe distance
  1216.                 g_intVideoKeydist = ReadFloat( args, i, i+1 )
  1217.                 if g_intVideoKeydist = -1  then
  1218.                     ParseParameters = false
  1219.                     exit function
  1220.                 end if
  1221.  
  1222.                 g_intVideoKeydist = 1000 * g_intVideoKeydist
  1223.         
  1224.                 i = i + 1
  1225.  
  1226.             case "-v_quality"
  1227.                 'Get video crispness (CBR) or quality (VBR)
  1228.                 g_intVideoQuality = ReadInteger( args, i, i+1 )
  1229.                 if g_intVideoQuality = -1  then
  1230.                     ParseParameters = false
  1231.                     exit function
  1232.                 end if
  1233.         
  1234.                 i = i + 1
  1235.                 
  1236.             case "-v_qp"
  1237.                 'Get video quantizer parameter (VBR)
  1238.                 g_intVideoQP = ReadFloat( args, i, i+1 )
  1239.                 if g_intVideoQP = -1 then
  1240.                     ParseParameters = false
  1241.                     exit function
  1242.                 end if
  1243.                 g_intVideoQP = Round(g_intVideoQP*2)/2
  1244.                 if g_intVideoQP < 1.0 or g_intVideoQP > 31.0 then
  1245.                     OutputInfo "Invalid range for parameter " & args(i)
  1246.                     ParseParameters = false
  1247.                     exit function
  1248.                 end if
  1249.  
  1250.                 i = i + 1
  1251.  
  1252.             case "-v_peakbitrate"
  1253.                 'Get video peakbitrate size
  1254.                 g_intVideoPeakBitrate = ReadInteger( args, i, i+1 )
  1255.                 if g_intVideoPeakBitrate = -1  then
  1256.                     ParseParameters = false
  1257.                     exit function
  1258.                 end if
  1259.         
  1260.                 i = i + 1
  1261.  
  1262.             case "-v_peakbuffer"
  1263.                 'Get video peakbuffer size
  1264.                 g_intVideoPeakBuffer = ReadInteger( args, i, i+1 )
  1265.                 if g_intVideoPeakBuffer = -1  then
  1266.                     ParseParameters = false
  1267.                     exit function
  1268.                 end if
  1269.         
  1270.                 i = i + 1
  1271.                 
  1272.             case "-v_complexity"
  1273.                 'Get video complexity setting on codec 0-5 scale, but give v_performance priority
  1274.                 if (g_intVideoPerformance = -1) then 
  1275.                     g_intVideoPerformance = ReadInteger( args, i, i+1 ) * 20
  1276.                     if g_intVideoPerformance <> 0 and g_intVideoPerformance <> 20 and g_intVideoPerformance <> 40 and g_intVideoPerformance <> 60 and g_intVideoPerformance <> 80 and g_intVideoPerformance <> 100 then
  1277.                         ParseParameters = false
  1278.                         exit function
  1279.                     end if
  1280.                 end if
  1281.  
  1282.                 i = i + 1                
  1283.  
  1284.             case "-v_performance"
  1285.                 'Get video complexity setting on WME9 0-100 scale
  1286.                 g_intVideoPerformance = ReadInteger( args, i, i+1 )
  1287.                 if g_intVideoPerformance <> 0 and g_intVideoPerformance <> 20 and g_intVideoPerformance <> 40 and g_intVideoPerformance <> 60 and g_intVideoPerformance <> 80 and g_intVideoPerformance <> 100 then
  1288.                     ParseParameters = false
  1289.                     exit function
  1290.                 end if
  1291.  
  1292.                 i = i + 1
  1293.  
  1294.             case "-v_preproc"
  1295.                 'Get video preprocess setting
  1296.                 g_intVideoPreprocess = ReadInteger( args, i, i+1 )
  1297.                 if g_intVideoPreprocess = -1  or g_intVideoPreprocess > 18 then
  1298.                     OutputInfo "Invalid preproc value: " & args(i+1)
  1299.                     ParseParameters = false
  1300.                     exit function
  1301.                 end if
  1302.     
  1303.                 i = i + 1
  1304.  
  1305.             case "-pixelformat"
  1306.                 ' Get pixelformat.
  1307.                 g_strPixelFormat = ReadString( args, i, i+1 )
  1308.                 if g_strPixelFormat = "" then
  1309.                     ParseParameters = false
  1310.                     exit function
  1311.                 end if
  1312.         
  1313.                 i = i + 1
  1314.  
  1315.             case "-pixelratio"
  1316.                 ' Get pixelformat.
  1317.                 g_intPixelAspectRatioX = ReadInteger( args, i, i+1 )
  1318.                 g_intPixelAspectRatioY = ReadInteger( args, i, i+2 )
  1319.  
  1320.                 if g_intPixelAspectRatioX = -1 or g_intPixelAspectRatioY = -1 then
  1321.                     ParseParameters = false
  1322.                     exit function
  1323.                 end if
  1324.         
  1325.                 i = i + 2
  1326.  
  1327.             case "-v_clip"
  1328.                 ' Get clipping values.
  1329.                 g_intClipLeft   = ReadInteger( args, i, i+1 )
  1330.                 g_intClipTop    = ReadInteger( args, i, i+2 )
  1331.                 g_intClipRight  = ReadInteger( args, i, i+3 )
  1332.                 g_intClipBottom = ReadInteger( args, i, i+4 )
  1333.  
  1334.                 if g_intClipLeft = -1 or g_intClipTop = -1 or g_intClipRight = -1 or g_intClipBottom = -1 then
  1335.                     ParseParameters = false
  1336.                     exit function
  1337.                 end if
  1338.  
  1339.                 i = i + 4
  1340.  
  1341.             case "-v_profile"
  1342.                 ' Get video device conformance value
  1343.                 g_strVideoDevConf = ReadString( args, i, i+1 )
  1344.                 g_strVideoDevConf = UCase( g_strVideoDevConf )
  1345.                 
  1346.                 if g_strVideoDevConf = "SIMPLE" then g_strVideoDevConf = "SP"
  1347.                 if g_strVideoDevConf = "MAIN" then g_strVideoDevConf = "MP"
  1348.                 if g_strVideoDevConf = "ADVANCED" then g_strVideoDevConf = "AP"
  1349.                 ' Translate old pre-VC1 Complex Profile to Advanced Profile
  1350.                 if g_strVideoDevConf = "CP" then g_strVideoDevConf = "AP"
  1351.  
  1352.                 if g_strVideoDevConf = ""  then
  1353.                     ParseParameters = false
  1354.                     exit function
  1355.                 end if
  1356.         
  1357.                 i = i + 1
  1358.  
  1359.             ' Parse advanced WMV settings
  1360.  
  1361.             case "-v_compopt"
  1362.                 g_intVideoCompOpt = ReadInteger( args, i, i+1 )
  1363.                 if g_intVideoCompOpt < 0 or g_intVideoCompOpt > 2 then
  1364.                     OutputInfo "Invalid range for parameter " & args(i)
  1365.                     ParseParameters = false
  1366.                     exit function
  1367.                 end if
  1368.         
  1369.                 i = i + 1
  1370.  
  1371.             case "-v_denoise"
  1372.                 g_intVideoDenoise = ReadInteger( args, i, i+1 )
  1373.                 if g_intVideoDenoise < 0 or g_intVideoDenoise > 5 then
  1374.                     OutputInfo "Invalid range for parameter " & args(i)
  1375.                     ParseParameters = false
  1376.                     exit function
  1377.                 end if
  1378.         
  1379.                 i = i + 1
  1380.  
  1381.             case "-v_dquantoption"
  1382.                 g_intVideoDquantOption = ReadInteger( args, i, i+1 )
  1383.                 if g_intVideoDquantOption < 0 or g_intVideoDquantOption > 3 then
  1384.                     OutputInfo "Invalid range for parameter " & args(i)
  1385.                     ParseParameters = false
  1386.                     exit function
  1387.                 end if
  1388.         
  1389.                 i = i + 1
  1390.  
  1391.  
  1392.             case "-v_dquantstrength" 
  1393.                 g_intVideoDquantStrength = ReadInteger( args, i, i+1 ) 
  1394.                 if g_intVideoDquantStrength < 0 or g_intVideoDquantStrength > 4 then 
  1395.                     OutputInfo "Invalid range for parameter " & args(i) 
  1396.                     ParseParameters = false 
  1397.                     exit function 
  1398.                 end if 
  1399.  
  1400.                 i = i + 1 
  1401.  
  1402.             case "-v_bdeltaqp" 
  1403.                 g_intVideoBDeltaQP = ReadInteger( args, i, i+1 ) 
  1404.                 if g_intVideoBDeltaQP < 0 or g_intVideoBDeltaQP > 31 then 
  1405.                     OutputInfo "Invalid range for parameter " & args(i) 
  1406.                     ParseParameters = false
  1407.                     exit function 
  1408.                 end if 
  1409.  
  1410.                 i = i + 1 
  1411.  
  1412.             case "-v_loopfilter" 
  1413.                 g_intVideoLoopfilter = ReadInteger( args, i, i+1 ) 
  1414.                 if g_intVideoLoopfilter < 0 or g_intVideoLoopfilter > 1 then 
  1415.                 OutputInfo "Invalid range for parameter " & args(i) 
  1416.                 ParseParameters = false 
  1417.                 exit function 
  1418.                 end if 
  1419.  
  1420.                 i = i + 1 
  1421.  
  1422.             case "-v_median" 
  1423.                 g_intVideoMedian = ReadInteger( args, i, i+1 ) 
  1424.                 if g_intVideoMedian < 0 or g_intVideoMedian > 1 then 
  1425.                 OutputInfo "Invalid range for parameter " & args(i) 
  1426.                 ParseParameters = false 
  1427.                 exit function 
  1428.                 end if 
  1429.  
  1430.                 i = i + 1 
  1431.  
  1432.             case "-v_edgeremoval" 
  1433.                 g_intVideoEdgeRemoval = ReadInteger( args, i, i+1 ) 
  1434.                 if g_intVideoEdgeRemoval < 0 or g_intVideoEdgeRemoval > 1 then 
  1435.                 OutputInfo "Invalid range for parameter " & args(i) 
  1436.                 ParseParameters = false 
  1437.                 exit function 
  1438.                 end if 
  1439.  
  1440.                 i = i + 1 
  1441.                 
  1442.             case "-v_threadaffinity" 
  1443.                 g_intVideoThreadAffinity = ReadInteger( args, i, i+1 ) 
  1444.                 if g_intVideoThreadAffinity < 0 or g_intVideoThreadAffinity > 1 then 
  1445.                 OutputInfo "Invalid range for parameter " & args(i) 
  1446.                 ParseParameters = false 
  1447.                 exit function 
  1448.                 end if 
  1449.  
  1450.                 i = i + 1 
  1451.  
  1452.             case "-v_numthreads" 
  1453.                 g_intVideoNumThreads = ReadInteger( args, i, i+1 ) 
  1454.                 if g_intVideoNumThreads <> 1 and g_intVideoNumThreads <> 2 and g_intVideoNumThreads <> 4 then 
  1455.                 OutputInfo "Invalid range for parameter " & args(i) 
  1456.                 ParseParameters = false 
  1457.                 exit function 
  1458.                 end if 
  1459.  
  1460.                 i = i + 1 
  1461.  
  1462.             case "-v_rangeredux" 
  1463.                 intVideoRangeReduxYR = ReadInteger( args, i, i+1 )
  1464.                 intVideoRangeReduxYE = ReadInteger( args, i, i+2 )
  1465.                 intVideoRangeReduxCR = ReadInteger( args, i, i+3 )
  1466.                 intVideoRangeReduxCE = ReadInteger( args, i, i+4 )
  1467.                 if intVideoRangeReduxYR < 0 or intVideoRangeReduxYR > 8 or intVideoRangeReduxYE < 0 or intVideoRangeReduxYE > 8 or intVideoRangeReduxCR < 0 or intVideoRangeReduxCR > 8 or intVideoRangeReduxCE < 0 or intVideoRangeReduxCE > 8 then
  1468.                     OutputInfo "Invalid range for parameter " & args(i) 
  1469.                     ParseParameters = false 
  1470.                     exit function
  1471.                 end if
  1472.                 
  1473.                 'Convert into hexadecimal 0x0Y0y0C0c format
  1474.                 g_intVideoRangeRedux = intVideoRangeReduxYR * 16777216 + intVideoRangeReduxYE * 65536 + intVideoRangeReduxCR * 256 + intVideoRangeReduxCE
  1475.  
  1476.                 i = i + 4 
  1477.  
  1478.             case "-v_overlap" 
  1479.                 g_intVideoOverlap = ReadInteger( args, i, i+1 ) 
  1480.                 if g_intVideoOverlap < 0 or g_intVideoOverlap > 1 then 
  1481.                 OutputInfo "Invalid range for parameter " & args(i) 
  1482.                 ParseParameters = false 
  1483.                 exit function 
  1484.                 end if 
  1485.  
  1486.                 i = i + 1 
  1487.  
  1488.             case "-v_scaling" 
  1489.                 g_intVideoScaling = ReadInteger( args, i, i+1 ) 
  1490.                 if g_intVideoScaling < 0 or g_intVideoScaling > 2 then 
  1491.                 OutputInfo "Invalid range for parameter " & args(i) 
  1492.                 ParseParameters = false 
  1493.                 exit function 
  1494.                 end if 
  1495.  
  1496.                 i = i + 1 
  1497.  
  1498.             case "-v_lookahead" 
  1499.                 g_intVideoLookahead = ReadInteger( args, i, i+1 ) 
  1500.                 if g_intVideoLookahead < 0 or g_intVideoLookahead > 16 then 
  1501.                 OutputInfo "Invalid range for parameter " & args(i) 
  1502.                 ParseParameters = false 
  1503.                 exit function 
  1504.                 end if 
  1505.  
  1506.                 i = i + 1 
  1507.  
  1508.              case "-v_lrc" 
  1509.                 g_intVideoLookaheadRC = ReadInteger( args, i, i+1 ) 
  1510.                 if g_intVideoLookaheadRC < 0 or g_intVideoLookaheadRC > 150 then 
  1511.                 OutputInfo "Invalid range for parameter " & args(i) 
  1512.                 ParseParameters = false 
  1513.                 exit function 
  1514.                 end if 
  1515.  
  1516.                 i = i + 1 
  1517.  
  1518.             case "-v_mbmodecost" 
  1519.                 g_intVideoMBModeCost = ReadInteger( args, i, i+1 ) 
  1520.                 if g_intVideoMBModeCost < 0 or g_intVideoMBModeCost > 1 then 
  1521.                 OutputInfo "Invalid range for parameter " & args(i) 
  1522.                 ParseParameters = false 
  1523.                 exit function 
  1524.                 end if 
  1525.  
  1526.                 i = i + 1 
  1527.  
  1528.             case "-v_mmatch" 
  1529.                 g_intVideoMMatch = ReadInteger( args, i, i+1 ) 
  1530.                 if g_intVideoMMatch < 0 or g_intVideoMMatch > 2 then 
  1531.                     OutputInfo "Invalid range for parameter " & args(i) 
  1532.                     ParseParameters = false 
  1533.                     exit function 
  1534.                 end if
  1535.                 g_intVideoMMatch = g_intVideoMMatch - 1
  1536.  
  1537.                 i = i + 1 
  1538.  
  1539.             case "-v_mslevel" 
  1540.                 g_intVideoMSLevel = ReadInteger( args, i, i+1 ) 
  1541.                 if g_intVideoMSLevel < 0 or g_intVideoMSLevel > 4 then 
  1542.                     OutputInfo "Invalid range for parameter " & args(i) 
  1543.                     ParseParameters = false 
  1544.                     exit function 
  1545.                 end if 
  1546.  
  1547.                 i = i + 1 
  1548.  
  1549.             case "-v_msrange" 
  1550.                 g_intVideoMSRange = ReadInteger( args, i, i+1 ) 
  1551.                 if g_intVideoMSRange < 0 or g_intVideoMSRange > 4 then 
  1552.                     OutputInfo "Invalid range for parameter " & args(i) 
  1553.                     ParseParameters = false 
  1554.                     exit function 
  1555.                 end if 
  1556.                 g_intVideoMSRange = g_intVideoMSRange - 1
  1557.  
  1558.                 i = i + 1 
  1559.  
  1560.             case "-v_mvcoding" 
  1561.                 g_intVideoMVCoding = ReadInteger( args, i, i+1 ) 
  1562.                 if g_intVideoMVCoding < 0 or g_intVideoMVCoding > 3 then 
  1563.                 OutputInfo "Invalid range for parameter " & args(i) 
  1564.                 ParseParameters = false 
  1565.                 exit function 
  1566.                 end if 
  1567.  
  1568.                 i = i + 1 
  1569.  
  1570.             case "-v_mvcost" 
  1571.                 g_intVideoMVCost = ReadInteger( args, i, i+1 ) 
  1572.                 if g_intVideoMVCost < 0 or g_intVideoMVCost > 1 then 
  1573.                 OutputInfo "Invalid range for parameter " & args(i) 
  1574.                 ParseParameters = false 
  1575.                 exit function 
  1576.                 end if 
  1577.  
  1578.                 i = i + 1 
  1579.  
  1580.             case "-v_bframedist" 
  1581.                 g_intVideoBFrameDist = ReadInteger( args, i, i+1 ) 
  1582.                 if g_intVideoBFrameDist < 0 or g_intVideoBFrameDist > 7 then 
  1583.                     OutputInfo "Invalid range for parameter " & args(i) 
  1584.                     ParseParameters = false 
  1585.                     exit function 
  1586.                 end if
  1587.  
  1588.                 i = i + 1 
  1589.  
  1590.             case "-v_percopt" 
  1591.                 g_intVideoPercOpt = ReadInteger( args, i, i+1 ) 
  1592.                 if g_intVideoPercOpt < 0 or g_intVideoPercOpt > 23 then 
  1593.                     OutputInfo "Invalid range for parameter " & args(i)
  1594.                     ParseParameters = false 
  1595.                     exit function 
  1596.                 end if 
  1597.                 ' Disallow usage of old dquant which might create illegal bitstreams
  1598.                 if g_intVideoPercOpt = 1 then
  1599.                     g_intVideoPercOpt = 4
  1600.                 end if 
  1601.                 OutputInfo "Warning: -v_percopt option has been deprecated and replaced with -v_adz."
  1602.                 OutputInfo "         See help listing for more details."
  1603.  
  1604.                 i = i + 1 
  1605.                 
  1606.             case "-v_adz" 
  1607.                 if g_intVideoPercOpt = -128 then
  1608.                     g_intVideoPercOpt = ReadInteger( args, i, i+1 ) 
  1609.                     if g_intVideoPercOpt < 0 or g_intVideoPercOpt > 20 then 
  1610.                         OutputInfo "Invalid range for parameter " & args(i) 
  1611.                         ParseParameters = false 
  1612.                         exit function 
  1613.                     end if
  1614.                     if g_intVideoPercOpt > 0 then
  1615.                         g_intVideoPercOpt = g_intVideoPercOpt + 3
  1616.                     end if
  1617.                 end if
  1618.  
  1619.                 i = i + 1 
  1620.  
  1621.             case "-v_type" 
  1622.                 g_intVideoType = ReadInteger( args, i, i+1 ) 
  1623.                 if g_intVideoType < 0 or g_intVideoType > 4 then 
  1624.                     OutputInfo "Invalid range for parameter " & args(i) 
  1625.                     ParseParameters = false 
  1626.                     exit function 
  1627.                 end if 
  1628.  
  1629.                 i = i + 1 
  1630.  
  1631.             case "-v_codedwidth" 
  1632.                 g_intVideoCodedWidth = ReadInteger( args, i, i+1 ) 
  1633.                 if g_intVideoCodedWidth < 32 or g_intVideoCodedWidth > 8192 then 
  1634.                     OutputInfo "Invalid range for parameter " & args(i) 
  1635.                     ParseParameters = false 
  1636.                     exit function 
  1637.                 end if 
  1638.  
  1639.                 i = i + 1 
  1640.  
  1641.             case "-v_codedheight" 
  1642.                 g_intVideoCodedHeight = ReadInteger( args, i, i+1 ) 
  1643.                 if g_intVideoCodedHeight < 32 or g_intVideoCodedHeight > 8192 then 
  1644.                     OutputInfo "Invalid range for parameter " & args(i) 
  1645.                     ParseParameters = false 
  1646.                     exit function 
  1647.                 end if 
  1648.  
  1649.                 i = i + 1 
  1650.                 
  1651.             case "-v_preset" 
  1652.                 ' Get video preset
  1653.                 g_strVideoPreset = ReadString( args, i, i+1 )
  1654.                 g_strVideoPreset = LCase( g_strVideoPreset )
  1655.                 
  1656.                 if g_strVideoPreset = "" or ( g_strVideoPreset <> "fast" and g_strVideoPreset <> "good" and g_strVideoPreset <> "better" and g_strVideoPreset <> "best" and g_strVideoPreset <> "insane" ) then
  1657.                     OutputInfo "Invalid preset name used. Available presets are: fast, good, better, best, insane."
  1658.                     ParseParameters = false
  1659.                     exit function
  1660.                 end if        
  1661.                 
  1662.                 select case g_strVideoPreset
  1663.                 
  1664.                     case "fast" ' Complexity = 2 / Lookahead = 16 / Loopfilter = On / Overlap = On / B frames = 1
  1665.                         if g_intVideoPerformance = -1 then g_intVideoPerformance = 40
  1666.                         if g_intVideoLookahead = -128 then g_intVideoLookahead = 16
  1667.                         if g_intVideoLoopfilter = -128 then g_intVideoLoopfilter = 1
  1668.                         if g_intVideoOverlap = -128 then g_intVideoOverlap = 1
  1669.                         if g_intVideoBFrameDist = -128 then g_intVideoBFrameDist = 1
  1670.                                                 
  1671.                     case "good" ' Complexity = 3 / Lookahead = 16 / Loopfilter = On / B frames = 1 
  1672.                         if g_intVideoPerformance = -1 then g_intVideoPerformance = 60
  1673.                         if g_intVideoLookahead = -128 then g_intVideoLookahead = 16
  1674.                         if g_intVideoLoopfilter = -128 then g_intVideoLoopfilter = 1
  1675.                         if g_intVideoBFrameDist = -128 then g_intVideoBFrameDist = 1
  1676.                                                 
  1677.                     case "better" ' Complexity = 3 / Lookahead = 16 / Loopfilter = On / B frames = 1 / MS Level = Integer Chroma / MS Range = Auto 
  1678.                         if g_intVideoPerformance = -1 then g_intVideoPerformance = 60
  1679.                         if g_intVideoLookahead = -128 then g_intVideoLookahead = 16
  1680.                         if g_intVideoLoopfilter = -128 then g_intVideoLoopfilter = 1
  1681.                         if g_intVideoBFrameDist = -128 then g_intVideoBFrameDist = 1
  1682.                         if g_intVideoMSLevel = -128 then g_intVideoMSLevel = 1
  1683.                         if g_intVideoMSRange = -128 then g_intVideoMSRange = -1
  1684.                         
  1685.                     case "best" ' Complexity = 5 / Lookahead = 16 / Loopfilter = On / B frames = 1 / MS Range = Auto
  1686.                         if g_intVideoPerformance = -1 then g_intVideoPerformance = 100
  1687.                         if g_intVideoLookahead = -128 then g_intVideoLookahead = 16
  1688.                         if g_intVideoLoopfilter = -128 then g_intVideoLoopfilter = 1
  1689.                         if g_intVideoBFrameDist = -128 then g_intVideoBFrameDist = 1
  1690.                         if g_intVideoMSRange = -128 then g_intVideoMSRange = -1
  1691.                         
  1692.                     case "insane" 'Complexity = 4 / Lookahead = 16 / Loopfilter = On / B frames = 1 / MS Level = True Chroma / MS Range = Auto / Motion Match = Auto
  1693.                         if g_intVideoPerformance = -1 then g_intVideoPerformance = 80
  1694.                         if g_intVideoLookahead = -128 then g_intVideoLookahead = 16
  1695.                         if g_intVideoLoopfilter = -128 then g_intVideoLoopfilter = 1
  1696.                         if g_intVideoBFrameDist = -128 then g_intVideoBFrameDist = 1
  1697.                         if g_intVideoMSLevel = -128 then g_intVideoMSLevel = 2
  1698.                         if g_intVideoMSRange = -128 then g_intVideoMSRange = -1
  1699.                         if g_intVideoMMatch = -128 then g_intVideoMMatch = -1
  1700.                         
  1701.                 end select    
  1702.         
  1703.                 i = i + 1
  1704.  
  1705.  
  1706.             ' Parse all output related stuff
  1707.             case "-output"                        
  1708.                 ' Get output file name.
  1709.                 g_strOutput = ReadString( args, i, i+1 )
  1710.                 if g_strOutput = "" then
  1711.                     ParseParameters = false
  1712.                     exit function
  1713.                 end if
  1714.         
  1715.                 i = i + 1
  1716.  
  1717.             case "-outputstring"
  1718.                 ' Read in the string that is to be appended to output file name
  1719.                 g_strOutputString = ReadString( args, i, i+1 )
  1720.                 if g_strOutputString = "" then
  1721.                     ParseParameters = false
  1722.                     exit function
  1723.                 end if
  1724.         
  1725.                 i = i + 1
  1726.  
  1727.             case "-broadcast"
  1728.                 ' Get broadcast port number.
  1729.                 if i+1 <= UBound(args) and Left( args(i+1), 1 ) <> "-" then
  1730.                     g_intBroadcast = ReadInteger( args, i, i+1 )
  1731.                     if g_intBroadcast = -1 then
  1732.                         ParseParameters = false
  1733.                         exit function
  1734.                     end if
  1735.         
  1736.                     i = i + 1
  1737.                 else
  1738.                     g_intBroadcast = 8080
  1739.                 end if
  1740.  
  1741.             case "-push"
  1742.                 ' Get push server, pub point and template name (optional)
  1743.                 g_strPushServer = ReadString( args, i, i+1 )
  1744.                 g_strPublishingPoint = ReadString( args, i, i+2 )
  1745.  
  1746.                 if g_strPushServer = "" or g_strPublishingPoint = "" then
  1747.                     ParseParameters = false
  1748.                     exit function
  1749.                 end if
  1750.  
  1751.                 ' Check if template name is specified
  1752.                 if i+1 <= UBound(args) and Left( args(i+3), 1 ) <> "-" then
  1753.                     g_strPushTemplate = ReadString( args, i, i+3 )
  1754.                     i = i + 3
  1755.                 else
  1756.                     i = i + 2
  1757.                 end if
  1758.  
  1759.             case "-time"
  1760.                 ' Get the mark in time of the source file.
  1761.                 g_intMarkInTime = ReadInteger( args, i, i+1 )
  1762.  
  1763.                 ' Get the markout time of the source file
  1764.                 strMarkOutTime = ReadString( args, i, i+2 )
  1765.                 if strMarkOutTime <> "end" then
  1766.                     g_intMarkOutTime = ConvertStringToInteger( strMarkOutTime )
  1767.                 else
  1768.                     g_intMarkOutTime = 0
  1769.                 end if
  1770.  
  1771.                 if g_intMarkInTime = -1 or g_intMarkOutTime = -1 then
  1772.                     ParseParameters = false
  1773.                     exit function
  1774.                 end if
  1775.         
  1776.         
  1777.                 i = i + 2
  1778.  
  1779.             case "-duration"
  1780.                 ' Get the duration of the encoding session.
  1781.                 g_intDuration = ReadInteger( args, i, i+1 )
  1782.                 if g_intDuration = -1 then
  1783.                     ParseParameters = false
  1784.                     exit function
  1785.                 end if
  1786.         
  1787.                 i = i + 1
  1788.  
  1789.             case "-silent"
  1790.                 g_blnSilent = true
  1791.                 
  1792.             case "-log"
  1793.                 ' Print all output to log file
  1794.                 g_strLogFile = ReadString( args, i, i+1 )
  1795.                 if g_strLogFile <> "" then
  1796.                     on error resume next
  1797.                     g_strLogFile = g_objFileSystem.GetAbsolutePathname(g_strLogFile)
  1798.                     set g_objLogFile = g_objFileSystem.CreateTextFile( g_strLogFile, true)
  1799.                     if IsNull(g_objLogFile) then
  1800.                         OutputInfo "Invalid log file destination."
  1801.                         ParseParameters = false
  1802.                         exit function
  1803.                     else
  1804.                         g_blnLogOutput = true
  1805.                     end if
  1806.                     on error goto 0
  1807.                 else
  1808.                     ParseParameters = false
  1809.                     exit function
  1810.                 end if
  1811.         
  1812.                 i = i + 1
  1813.  
  1814.             ' Parse all attributes
  1815.             case "-title"
  1816.                 ' Get the title of the output file.
  1817.                 g_strTitle = ReadString( args, i, i+1 )
  1818.  
  1819.                 i = i + 1
  1820.  
  1821.             case "-author"                        
  1822.                 ' Get the author of the output file.
  1823.                 g_strAuthor = ReadString( args, i, i+1 )
  1824.         
  1825.                 i = i + 1
  1826.  
  1827.             case "-album"                        
  1828.                 ' Get the album of the output file.
  1829.                 g_strAlbum = ReadString( args, i, i+1 )
  1830.         
  1831.                 i = i + 1
  1832.  
  1833.             case "-trackno"                        
  1834.                 ' Get the track number of the output file.
  1835.                 g_intTrackNo = ReadString( args, i, i+1 )
  1836.         
  1837.                 i = i + 1
  1838.  
  1839.             case "-year"                        
  1840.                 ' Get the year of the output file.
  1841.                 g_strYear = ReadString( args, i, i+1 )
  1842.         
  1843.                 i = i + 1
  1844.  
  1845.             case "-genre"                        
  1846.                 ' Get the genre of the output file.
  1847.                 g_strGenre = ReadString( args, i, i+1 )
  1848.  
  1849.                 i = i + 1
  1850.  
  1851.             case "-copyright"                        
  1852.                 ' Get the copyright information of the output file.
  1853.                 g_strCopyright = ReadString( args, i, i+1 )
  1854.         
  1855.                 i = i + 1
  1856.  
  1857.             case "-description"
  1858.                 ' Get the descrption of the output file.
  1859.                 g_strDescription = ReadString( args, i, i+1 )
  1860.         
  1861.                 i = i + 1
  1862.  
  1863.             case "-rating"                        
  1864.                 ' Get the rating of the output file.
  1865.                 g_strRating = ReadString( args, i, i+1 )
  1866.         
  1867.                 i = i + 1
  1868.  
  1869.             case "-saveprofile"                            
  1870.                 ' Get the profile file name to be saved.
  1871.                 g_strProfileSave = ReadString( args, i, i+1 )
  1872.                 if g_strProfileSave = "" then
  1873.                     ParseParameters = false
  1874.                     exit function
  1875.                 end if
  1876.         
  1877.                 i = i + 1
  1878.         
  1879.             case "-loadprofile"                            
  1880.                 ' Get the profile file name to be loaded.
  1881.                 g_strProfileLoad = ReadString( args, i, i+1 )
  1882.                 if g_strProfileLoad = "" then
  1883.                     ParseParameters = false
  1884.                     exit function
  1885.                 end if
  1886.         
  1887.                 i = i + 1
  1888.  
  1889.             case "-verbose"
  1890.                 ' Get the verbose mode.
  1891.                 g_intVerbose = ReadInteger( args, i, i+1 )
  1892.                 if g_intVerbose = -1 then
  1893.                     ParseParameters = false
  1894.                     exit function
  1895.                 end if
  1896.  
  1897.                 i = i + 1
  1898.  
  1899.             case "-s_config"
  1900.                 ' Save the WEU configuration file
  1901.                 strSaveToCfgFile = ReadString( args, i, i+1 )
  1902.                 if strSaveToCfgFile = "" then
  1903.                     ParseParameters = false
  1904.                     exit function
  1905.                 end if
  1906.  
  1907.                 i = i + 1
  1908.             case "-config"
  1909.                 if strLoadFromCfgFile = "" then
  1910.                     ParseParameters = false
  1911.                     exit function
  1912.                 end if
  1913.         
  1914.                 i = i + 1
  1915.  
  1916.             case "-maxpacket"
  1917.                 g_intMaxPacketSize = ReadInteger( args, i, i+1 )
  1918.                 if g_intMaxPacketSize = -1 then
  1919.                     ParseParameters = false
  1920.                     exit function
  1921.                 end if
  1922.  
  1923.                 i = i + 1
  1924.  
  1925.             case "-minpacket"
  1926.                 g_intMinPacketSize = ReadInteger( args, i, i+1 )
  1927.                 if g_intMinPacketSize = -1 then
  1928.                     ParseParameters = false
  1929.                     exit function
  1930.                 end if
  1931.         
  1932.                 i = i + 1
  1933.  
  1934.             case else
  1935.                 ' Show an error information for unrecognized parameter.
  1936.                 OutputInfo "Invalid parameter: " & args(i)
  1937.                 ParseParameters = false
  1938.                 exit function
  1939.         end select
  1940.     
  1941.     next
  1942.  
  1943.     if strSaveToCfgFile <> "" then
  1944.         strSaveToCfgFile = g_objFileSystem.GetAbsolutePathName( strSaveToCfgFile )
  1945.  
  1946.         ' Add extension if necessary
  1947.         if Right( LCase( strSaveToCfgFile ), 4 ) <>  ".weu" then
  1948.             strSaveToCfgFile = strSaveToCfgFile & ".weu"
  1949.         end if
  1950.  
  1951.         CreateOutputFolder( g_objFileSystem.GetParentFolderName( strSaveToCfgFile ) )    
  1952.         set objTextFile = g_objFileSystem.OpenTextFile( strSaveToCfgFile, 2, True )
  1953.         objTextFile.Write( strArgumentsQuoted )
  1954.         objTextFile.close
  1955.     end if
  1956.  
  1957.     ParseParameters = true
  1958. end function
  1959.  
  1960. ' Show help information of this program.
  1961. function ShowHelp()
  1962.     OutputInfo g_strProductName
  1963.     OutputInfo g_strProductCopyright
  1964.     OutputInfo ""
  1965.     OutputInfo ""
  1966.     OutputInfo "Encode from files or devices to Windows Media files or streams. Supported"
  1967.     OutputInfo "source file formats are .wmv, .wma, .asf, .avi, .wav, .mpg, .mp3, .bmp,"
  1968.     OutputInfo ".jpg, and .avs."
  1969.     OutputInfo ""
  1970.     OutputInfo ""
  1971.     OutputInfo "Usage for I/O and statistics."
  1972.     OutputInfo "-----------------------------"
  1973.     OutputInfo ""
  1974.     OutputInfo "[-wme] <Windows Media Encoder session file>"
  1975.     OutputInfo "    Loads an existing Windows Media Encoder session file."
  1976.     OutputInfo "[-input] <file or directory name>"
  1977.     OutputInfo "    The file or directory to be encoded."
  1978.     OutputInfo "    Specify a file or directory name. If you specify a directory, supported"
  1979.     OutputInfo "    files in the directory will be encoded to the output directory, using"
  1980.     OutputInfo "    the same encoding settings. "
  1981.     OutputInfo "    Enclose file and directory names that have spaces in quotations."
  1982.     OutputInfo "    For example: -input ""c:\my sample.wmv"""
  1983.     OutputInfo "[-output] <file or directory name>"
  1984.     OutputInfo "    The name of the output file or directory."
  1985.     OutputInfo "    If the input is a file, -output corresponds to a file name. If the input"
  1986.     OutputInfo "    is a directory, -output corresponds to a directory name."
  1987.     OutputInfo "    The output directory will be created if it doesn't already exist."
  1988.     OutputInfo "    An extension is automatically appended to output files."
  1989.     OutputInfo "    (.wma for audio-only Windows Media files, and .wmv for video-only or"
  1990.     OutputInfo "    audio and video Windows Media files.)"
  1991.     OutputInfo "[-devices]"
  1992.     OutputInfo "    Lists audio and video capture devices."
  1993.     OutputInfo "[-adevice] <audio device number>"
  1994.     OutputInfo "    The audio capture device to encode from."
  1995.     OutputInfo "    Use -devices to list all available capture devices."  
  1996.     OutputInfo "    When encoding from devices, you must specify a duration using -duration."      
  1997.     OutputInfo "[-vdevice] <video device number>"
  1998.     OutputInfo "    The video capture device to encode from."
  1999.     OutputInfo "    Use -devices to list all available capture devices."  
  2000.     OutputInfo "    When capturing from devices, you must specify a duration using -duration."
  2001.     OutputInfo "[-duration] <seconds>"
  2002.     OutputInfo "    Amount of time in seconds to encode. Use when sourcing from devices."
  2003.     OutputInfo "[-outputstring] <string>"
  2004.     OutputInfo "    The string to be attached to every output file name for directory mode."
  2005.     OutputInfo "[-broadcast] <port>"
  2006.     OutputInfo "    Broadcasts via HTTP on the port specified. The default port is 8080."
  2007.     OutputInfo "[-time] <start time> <end time>"
  2008.     OutputInfo "    Specify the time segment (in msec) to be encoded. Use 'end' for"
  2009.     OutputInfo "    <end time> if you want to encode to the end of the file."
  2010.     OutputInfo "[-silent]"
  2011.     OutputInfo "    Prevents statistics from being displayed after encoding is finished."
  2012.     OutputInfo "[-config] <input configuration file>"
  2013.     OutputInfo "    Inputs arguments from a configuration file. The default extension is .weu."
  2014.     OutputInfo "    Parameters in the file can be overridden by later arguments."
  2015.     OutputInfo "[-s_config] <output configuration file>"
  2016.     OutputInfo "    Creates a configuration file. The file name extension .weu is appended"
  2017.     OutputInfo "    automatically."
  2018.     OutputInfo "[-maxpacket] <packet size>"
  2019.     OutputInfo "    Specifies the maximum packet size in bytes."
  2020.     OutputInfo "[-minpacket] <packet size>"
  2021.     OutputInfo "    Specifies the minimum packet size in bytes."
  2022.     OutputInfo "[-log] <log file>"
  2023.     OutputInfo "    Writes all text output to a log file. Always overwrites."
  2024.  
  2025.     OutputInfo ""
  2026.     OutputInfo ""
  2027.     OutputInfo "Usage for profiles."
  2028.     OutputInfo "-------------------"
  2029.     OutputInfo "    You can override parameters in a profile by appending arguments to a"
  2030.     OutputInfo "    command."
  2031.     OutputInfo ""
  2032.     OutputInfo "[-profile] <profile code>"
  2033.     OutputInfo "    Specifies a predefined profile to use in the session."
  2034.     OutputInfo ""
  2035.     OutputInfo "Codes and basic descriptions for the predefined profiles:"
  2036.     OutputInfo "Audio/Video:"
  2037.     OutputInfo "    av20: Profile_AudioVideo_Modem_28K (actual rate: 20Kbps)"
  2038.     OutputInfo "    av32: Profile_AudioVideo_Modem_56K (32 Kbps)"
  2039.     OutputInfo "    av100: Profile_AudioVideo_LAN_100K (100 Kbps)"
  2040.     OutputInfo "    av225: Profile_AudioVideo_LAN_256K (225 Kbps)"
  2041.     OutputInfo "    av350: Profile_AudioVideo_LANDSL_384K (350 Kbps)"
  2042.     OutputInfo "    av450: Profile_AudioVideo_LANDSL_768K (450 Kbps)"
  2043.     OutputInfo "    av700: Profile_AudioVideo_NearBroadcast_700K (700 Kbps)"
  2044.     OutputInfo "    av1400: Profile_AudioVideo_NearBroadcast_1400K (1400 Kbps)"
  2045.     OutputInfo "    av350pal: Profile_AudioVideo_Broadband_PAL_384K (350 Kbps)"
  2046.     OutputInfo "    av700pal: Profile_AudioVideo_NearBroadcast_PAL_700K (700 Kbps)"
  2047.     OutputInfo "    av100_2p: Profile_AudioVideo_LAN_100K_2Pass (100 Kbps)"
  2048.     OutputInfo "    av350_2p: Profile_AudioVideo_LANDSL_384K_2Pass (350 Kbps)"
  2049.     OutputInfo "    av600vbr: Profile_AudioVideo_FilmVBR_600K (600 Kbps)"
  2050.     OutputInfo "    avq97vbr: Profile_AudioVideo_FilmVBR_Quality97 (Quality 97)"
  2051.     OutputInfo ""
  2052.     OutputInfo "Audio-only:"
  2053.     OutputInfo "    a20_1: Profile_AudioOnly_FMRadioMono_28K (20 Kbps)"
  2054.     OutputInfo "    a20_2: Profile_AudioOnly_FMRadioStereo_28K (20 Kbps)"
  2055.     OutputInfo "    a32: Profile_AudioOnly_Modem_56K (32 Kbps)"
  2056.     OutputInfo "    a48: Profile_AudioOnly_NearCDQuality_48K (48 Kbps)"
  2057.     OutputInfo "    a64: Profile_AudioOnly_CDQuality_64K (64 Kbps)"
  2058.     OutputInfo "    a96: Profile_AudioOnly_CDAudiophileQuality_96K (96 Kbps)"
  2059.     OutputInfo "    a128: Profile_AudioOnly_CDAudiophileQuality_128K (128 Kbps)"
  2060.     OutputInfo ""
  2061.     OutputInfo "Video-only:"
  2062.     OutputInfo "    v20: Profile_VideoOnly_Modem_28K (20 Kbps)"
  2063.     OutputInfo "    v32: Profile_VideoOnly_Modem_56K (32 Kbps)"
  2064.     OutputInfo ""
  2065.     OutputInfo "[-loadprofile] <profile file name>"
  2066.     OutputInfo "    Specifies a Windows Media Encoder or custom profile to use."
  2067.     OutputInfo "[-saveprofile] <profile file name>"
  2068.     OutputInfo "    Saves current settings to a file for later reuse. Default file name"
  2069.     OutputInfo "    extension is .prx."
  2070.     OutputInfo ""
  2071.     OutputInfo ""
  2072.     OutputInfo "Usage for audio settings."
  2073.     OutputInfo "-------------------------"
  2074.     OutputInfo ""
  2075.     OutputInfo "[-a_input]"
  2076.     OutputInfo "    Sets a separate input file to be used as audio source when encoding"
  2077.     OutputInfo "    to a .wmv containing both video and audio streams."
  2078.     OutputInfo "    Must use -input to also specify the video source, otherwise -a_input"
  2079.     OutputInfo "    will be ignored. Audio source defined by -a_input will override any"
  2080.     OutputInfo "    audio stream present in the main -input source."
  2081.     OutputInfo "    Enclose file names that have spaces in quotations."
  2082.     OutputInfo "    For example: -a_input ""c:\my sample.wav"""
  2083.     OutputInfo "[-a_codecs]"
  2084.     OutputInfo "    Lists all available audio codecs."
  2085.     OutputInfo "[-a_formats]"
  2086.     OutputInfo "    Lists all audio formats for each codec."
  2087.     OutputInfo "[-a_codec] <codec index>"
  2088.     OutputInfo "    Audio codec to be used. Use -a_codecs to list available codecs."
  2089.     OutputInfo "    Specify codec index:"
  2090.     OutputInfo "    WMASTD:  Windows Media Audio (default)."
  2091.     OutputInfo "    WMAPRO:  Windows Media Audio Professional."
  2092.     OutputInfo "    WMALSL:  Windows Media Audio Lossless."
  2093.     OutputInfo "    WMSP:    Windows Media Audio Voice."
  2094.     OutputInfo "    PCM:     No compression."
  2095.     OutputInfo ""
  2096.     OutputInfo "    Legacy indexes WMA9STD, WMA9PRO, WMA9LSL and WMSP9 will translate"
  2097.     OutputInfo "    to new version-agnostic indexes."
  2098.     OutputInfo "[-a_mode] <mode>"
  2099.     OutputInfo "    Audio encoding mode to be used."
  2100.     OutputInfo "    0: 1-pass CBR (default)."
  2101.     OutputInfo "    1: 2-pass CBR."
  2102.     OutputInfo "    2: Quality-based VBR."
  2103.     OutputInfo "    3: Bit rate-based VBR (two-pass)."
  2104.     OutputInfo "    4: Bit rate-based peak VBR (two-pass)." 
  2105.     OutputInfo "[-a_content] <mode>"
  2106.     OutputInfo "    Audio content mode for the Windows Media Audio Voice codec."
  2107.     OutputInfo "    0 = No special mode for the audio content (default)"
  2108.     OutputInfo "    1 = Speech mode"
  2109.     OutputInfo "    2 = Mixed (speech and music) mode (also requires -a_contentedl)"
  2110.     OutputInfo "    You must also specify the Windows Media Audio Voice codec."
  2111.     OutputInfo "[-a_contentedl] <file name>"
  2112.     OutputInfo "    Specifies the places in audio content where music starts and ends. To do"
  2113.     OutputInfo "    this, you must first create an optimization definition file. You"
  2114.     OutputInfo "    must specify the Windows Media Audio Voice codec and -a_content 2 when"
  2115.     OutputInfo "    when you use the -a_contentedl option."
  2116.     OutputInfo "[-a_folddown6to2] <surround mix> <center mix> <LFE>"
  2117.     OutputInfo "    Fold-down coefficients for multichannel audio. Use whole numbers only."
  2118.     OutputInfo "    Values will be converted to negative numbers. Valid numbers are 0 to 144."
  2119.     OutputInfo "    For example, -a_folddown6to2 10 3 3"
  2120.     OutputInfo "[-a_peakbitrate] <peak bit rate>"
  2121.     OutputInfo "    Specifies the peak bit rate in bits per second for peak bit rate-based"
  2122.     OutputInfo "    VBR for audio. If not specified, the peak bit rate is 1.5 times the"
  2123.     OutputInfo "    audio bit rate."
  2124.     OutputInfo "[-a_peakbuffer] <peak buffer>"
  2125.     OutputInfo "    Buffer in msec for audio with peak bit rate-based VBR. If not specified,"
  2126.     OutputInfo "    the default of 3000 msec is used."
  2127.     OutputInfo "[-a_setting] <setting>"
  2128.     OutputInfo "    Specifies the formats for audio setting."
  2129.     OutputInfo "    Use -a_formats to list supported audio formats for each codec."
  2130.     OutputInfo ""
  2131.     OutputInfo "    -a_setting Bitrate_SamplingRate_Channels. For example, -a_setting 48_44_2"
  2132.     OutputInfo "    specifies 48 Kbps, 44 kHz, and two channels. The default is 64_44_2."
  2133.     OutputInfo ""
  2134.     OutputInfo "    If you use quality-based VBR: -a_setting Qxx_SamplingRate_Channels."
  2135.     OutputInfo "    For example, -a_setting Q90_44_2 specifies a quality level of 90, 44 kHz,"
  2136.     OutputInfo "    and 2 channels."
  2137.     OutputInfo ""
  2138.     OutputInfo "    If you use the Windows Media Audio Professional codec:" 
  2139.     OutputInfo "    -a_setting Bitrate_SamplingRate_Channels_BitDepth."
  2140.     OutputInfo "    For example, -a_setting 250_44_2_24 specifies 250 Kbps, 44 kHz, "
  2141.     OutputInfo "    two channels, and 24-bit encoding. Use either 16- or 24-bit encoding."
  2142.     OutputInfo "    24-bit is the default."
  2143.     OutputInfo ""
  2144.     OutputInfo "    If you use the Windows Media Audio Lossless codec:"
  2145.     OutputInfo "    -a_setting Qxx_SamplingRate_Channels_BitDepth. For example,"
  2146.     OutputInfo "    -a_setting Q100_44_2_24 specifies VBR Quality 100, 44 kHz, two channel,"
  2147.     OutputInfo "    24-bit encoding. (Quality-based VBR and a quality level of 100 is"
  2148.     OutputInfo "    required with this codec.)"
  2149.     OutputInfo "[-audioonly]"
  2150.     OutputInfo "    Encodes the audio portion of the stream only."
  2151.     OutputInfo ""
  2152.     OutputInfo ""
  2153.     OutputInfo "Usage for video settings."
  2154.     OutputInfo "-------------------------"
  2155.     OutputInfo ""
  2156.     OutputInfo "[-v_codecs]"
  2157.     OutputInfo "    Lists all available video codecs."
  2158.     OutputInfo "[-v_codec] <codec index>"
  2159.     OutputInfo "    Video codec to be used. Use -v_codecs to list available video codecs."
  2160.     OutputInfo "    Specify codec index:"
  2161.     OutputInfo "       WMV9:   Windows Media Video 9 Simple & Main Profiles (default)."
  2162.     OutputInfo "       WVC1:   Windows Media Video 9 Advanced Profile."
  2163.     OutputInfo "       WMS9:   Windows Media Video 9 Screen."
  2164.     OutputInfo "       WMV8:   Windows Media Video V8."
  2165.     OutputInfo "       WMV7:   Windows Media Video V7."
  2166.     OutputInfo "       UNCOMP: Full frames (uncompressed)."
  2167.     OutputInfo "[-v_mode] <mode>"
  2168.     OutputInfo "    Video encoding mode to be used."
  2169.     OutputInfo "    0: 1-pass CBR (default)."
  2170.     OutputInfo "    1: 2-pass CBR."
  2171.     OutputInfo "    2: Quality-based VBR."
  2172.     OutputInfo "    3: Bit rate-based VBR (two-pass)."
  2173.     OutputInfo "    4: Peak bit rate-based VBR (two-pass)."
  2174.     OutputInfo "[-v_width] <width>"
  2175.     OutputInfo "    Video frame width in pixels to be encoded. Default: Source video width."
  2176.     OutputInfo "[-v_height] <height>"
  2177.     OutputInfo "    Video frame height in pixels to be encoded. Default: Source video height."
  2178.     OutputInfo "[-v_framerate] <rate>"
  2179.     OutputInfo "    Video frame rate in floating point to be encoded. Default: Source video"
  2180.     OutputInfo "    frame rate, or 30 fps."
  2181.     OutputInfo "[-v_keydist] <time>"
  2182.     OutputInfo "    Key frame distance in seconds for video. Default: 10 seconds."
  2183.     OutputInfo "[-v_preproc] <filter number>"
  2184.     OutputInfo "    Video preprocessing for certain input sources."
  2185.     OutputInfo "    0:  None (for progressive video input). Default."
  2186.     OutputInfo "    1, 2, 3, 4:"
  2187.     OutputInfo "        Deinterlace but preserve source size and framerate."
  2188.     OutputInfo "        For example, 640x480x30 interlace to 640x480x30 progressive."
  2189.     OutputInfo "        The encoder uses a simple field blending deinterlace method which"
  2190.     OutputInfo "        produces good quality in still scenes but might result in ghosting"
  2191.     OutputInfo "        or blurring in high motion scenes."
  2192.     OutputInfo "    5:  Inverse telecine from 30fps to 24fps."
  2193.     OutputInfo "    6:  Inverse telecine - First field is top field with AA telecine pattern."
  2194.     OutputInfo "    7:  Inverse telecine - First field is top field with BB telecine pattern."
  2195.     OutputInfo "    8:  Inverse telecine - First field is top field with BC telecine pattern."
  2196.     OutputInfo "    9:  Inverse telecine - First field is top field with CD telecine pattern."
  2197.     OutputInfo "    10: Inverse telecine - First field is top field with DD telecine pattern."
  2198.     OutputInfo "    11: Inverse telecine - First field is bottom field with AA telecine "
  2199.     OutputInfo "        pattern."
  2200.     OutputInfo "    12: Inverse telecine - First field is bottom field with BB telecine"
  2201.     OutputInfo "        pattern."
  2202.     OutputInfo "    13: Inverse telecine - First field is bottom field with BC telecine"
  2203.     OutputInfo "        pattern."
  2204.     OutputInfo "    14: Inverse telecine - First field is bottom field with CD telecine"
  2205.     OutputInfo "        pattern."
  2206.     OutputInfo "    15: Inverse telecine - First field is bottom field with DD telecine"
  2207.     OutputInfo "        pattern."
  2208.     OutputInfo "    16: Interlaced encoding - Auto detect field order."
  2209.     OutputInfo "    17: Interlaced encoding - First field is top field."
  2210.     OutputInfo "    18: Interlaced encoding - First field is bottom field."
  2211.     OutputInfo "[-v_clip] <left> <top> <right> <bottom>"
  2212.     OutputInfo "    The region of the image (with respect to source) to be clipped/encoded."
  2213.     OutputInfo "    If the right is 0 or greater than width, it is ignored and re-assigned"
  2214.     OutputInfo "    to width. If the bottom is 0 or greater than height, it is ignored and"
  2215.     OutputInfo "    re-assigned to height."
  2216.     OutputInfo "[-v_bitrate] <bit rate>"
  2217.     OutputInfo "    Video bit rate in bits per second to be encoded. Default: 250000 bps."
  2218.     OutputInfo "    Set this to 0 for audio-only coding."
  2219.     OutputInfo "[-v_buffer] <buffer>"
  2220.     OutputInfo "    Delay buffer in milliseconds for video. Default: 5000 msec."
  2221.     OutputInfo "[-v_quality] <quality>"
  2222.     OutputInfo "    CBR: Quality/smoothness tradeoff. 0 to 100, 0 being the smoothest."
  2223.     OutputInfo "    Higher values might drop frames in order to maintain image quality."
  2224.     OutputInfo "    Default: 75."
  2225.     OutputInfo "    Quality-based VBR: Image quality for the video. Encode video to the"
  2226.     OutputInfo "    specified quality, regardless of bit rate. Default: 95."
  2227.     OutputInfo "    In 2-pass modes the quality parameter is ignored."
  2228.     OutputInfo "[-v_qp] <quantizer parameter>"
  2229.     OutputInfo "    An alternative method of specifying image quality in quality-based VBR"
  2230.     OutputInfo "    mode. Because quality-based VBR uses a fixed QP for all encoded frames,"
  2231.     OutputInfo "    this method allows direct mapping to QP levels. Valid range is 1.0 to"
  2232.     OutputInfo "    31.0 in 0.5 intervals. Default: 2.5"
  2233.     OutputInfo "    If v_quality is also specified it will override v_qp."
  2234.     OutputInfo "[-v_peakbitrate] <peak bit rate>"
  2235.     OutputInfo "    Peak bit rate in bits per second for peak bit rate-based VBR for video."
  2236.     OutputInfo "    If not specified, the peak bit rate is 1.5 times the video bit rate."
  2237.     OutputInfo "[-v_peakbuffer] <peak buffer>"
  2238.     OutputInfo "    Buffer in msec for video, with peak bit rate-based VBR. If not specified,"
  2239.     OutputInfo "    the default of 5000 msec is used."
  2240.     OutputInfo "[-v_performance] <performance level>"
  2241.     OutputInfo "    Sets the encoder performance/quality level. Possible values: 0, 20, 40,"
  2242.     OutputInfo "    60, 80, and 100, where 0 is fastest and 100 is highest quality. If you"
  2243.     OutputInfo "    do not specify a value, codec defaults are used."
  2244.     OutputInfo "    Default: 60 (WMV9 and WVC1)."
  2245.     OutputInfo "[-v_complexity] <complexity level>"
  2246.     OutputInfo "    Same as v_performance but expressed on a scale from 0 to 5."
  2247.     OutputInfo "    If v_performance is also specified it will override v_complexity."
  2248.     OutputInfo "[-v_profile] <conformance profile>"
  2249.     OutputInfo "    Sets the VC-1 conformance profile for the encoded video. Video profiles"
  2250.     OutputInfo "    are used to indicate the decoding complexity of the video, as well as to"
  2251.     OutputInfo "    indicate which features a decoder needs to have implemented in order to"
  2252.     OutputInfo "    correctly decode the video. In order to stay conformant to the requested"
  2253.     OutputInfo "    profile, the encoder might ignore certain advanced WMV settings."
  2254.     OutputInfo "    Possible values for WMV9 codec are SP (Simple) and MP (Main). WVC1 codec"
  2255.     OutputInfo "    only allows AP (Advanced) value."
  2256.     OutputInfo "    If you do not add the -v_profile option to a command, the correct profile"
  2257.     OutputInfo "    level is selected automatically during encoding."
  2258.     OutputInfo "[-pixelratio] <x y>"
  2259.     OutputInfo "    Specifies the video pixel aspect ratio. Common pixel aspect ratios:"
  2260.     OutputInfo "    DV NTSC fullscreen    10:11"
  2261.     OutputInfo "    DV NTSC widescreen    40:33"
  2262.     OutputInfo "    DV PAL fullscreen     12:11"
  2263.     OutputInfo "    DV PAL widescreen     16:11"
  2264.     OutputInfo "[-pixelformat] <format>"
  2265.     OutputInfo "    Specifies the source video pixel format. Possible values:"
  2266.     OutputInfo "    I420"
  2267.     OutputInfo "    IYUV"
  2268.     OutputInfo "    YV12"
  2269.     OutputInfo "    UYVY"
  2270.     OutputInfo "    YUY2"
  2271.     OutputInfo "    YVYU"
  2272.     OutputInfo "    YVU9"
  2273.     OutputInfo "    RGB24"
  2274.     OutputInfo "    RGB32"
  2275.     OutputInfo "    RGB555"
  2276.     OutputInfo "    RGB565"
  2277.     OutputInfo "    RGB8"
  2278.     OutputInfo "    By default the encoder will try to autodetect the source pixel format."
  2279.     OutputInfo "[-videoonly]"
  2280.     OutputInfo "    Encodes video stream only."
  2281.     OutputInfo ""
  2282.     OutputInfo ""
  2283.     OutputInfo "Usage for advanced Windows Media Video settings."
  2284.     OutputInfo "------------------------------------------------"
  2285.     OutputInfo "    Valid only with -v_codec set to WVC1 or WMV9."
  2286.     OutputInfo ""
  2287.     OutputInfo "[-v_compopt] <preset>"
  2288.     OutputInfo "    Compression optimization preset."
  2289.     OutputInfo "    0: Off (default)."
  2290.     OutputInfo "    1: Best visual quality. Automatically sets:"
  2291.     OutputInfo "       -v_bframedist 1"
  2292.     OutputInfo "       -v_mslevel 1 (Integer Chroma)"
  2293.     OutputInfo "       -v_msrange 0 (Adaptive)"
  2294.     OutputInfo "       -v_mvcost 1 (Adaptive)"
  2295.     OutputInfo "       -v_mmatch 0 (Adaptive)"
  2296.     OutputInfo "       -v_dquantoption 2 (I & P frames)"
  2297.     OutputInfo "       -v_loopfilter 1 (On)"
  2298.     OutputInfo "       -v_complexity 3"
  2299.     OutputInfo "    Setting additional parameters will override any values set by the preset."
  2300.     OutputInfo "[-v_dquantoption] <option>"
  2301.     OutputInfo "    Specifies the type of frames to apply differential quantization to."
  2302.     OutputInfo "    Dquant allows macroblocks containing smooth or dark areas to be encoded at"
  2303.     OutputInfo "    a quantizer level lower than the rest of the image."
  2304.     OutputInfo "    0: Off (default)."
  2305.     OutputInfo "    1: Apply to I frame only."
  2306.     OutputInfo "    2: Apply to I and P frames."
  2307.     OutputInfo "    3: Apply to I, P and B frames."
  2308.     OutputInfo "[-v_dquantstrength] <strength>"
  2309.     OutputInfo "    Specifies the method and strength of dquant application. Only valid"
  2310.     OutputInfo "    when used with -v_dquantoption parameter set greater than 0."
  2311.     OutputInfo "    0: Regular dquant method (default)."
  2312.     OutputInfo "    1: Fixed QP dquant method for smooth areas (QP 2)."
  2313.     OutputInfo "    2: Fixed QP dquant method for very smooth areas (QP 1)."
  2314.     OutputInfo "    3: Fixed QP dquant method for dark areas (QP 1)."
  2315.     OutputInfo "    4: Regular dquant method for dark areas."
  2316.     OutputInfo "[-v_adz] <strength>"
  2317.     OutputInfo "    Controls adaptive dead-zone, a quantization method which attempts to"
  2318.     OutputInfo "    balance the bit distribution within a picture between smooth areas with"
  2319.     OutputInfo "    fine details and textured areas with coarse details. Increasing the"
  2320.     OutputInfo "    strength controls how aggressively areas are mapped to larger dead-zones"
  2321.     OutputInfo "    where image detail is irretrievably lost."
  2322.     OutputInfo "    Valid range is 0 to 15, where 0 (default) disables the ADZ option."
  2323.     OutputInfo "    Using high values can result in loss of too much image detail."
  2324.     OutputInfo "[-v_loopfilter] <setting>"
  2325.     OutputInfo "    Controls the in-loop deblocking filter. This filter reduces blocking"
  2326.     OutputInfo "    artifacts at encoding time so that future P and B frames don't carry"
  2327.     OutputInfo "    forward the blocking artifacts. If not specified, loop filter is"
  2328.     OutputInfo "    enabled by default at resolutions below standard definition (SD)."
  2329.     OutputInfo "    0 to disable, 1 to enable."
  2330.     OutputInfo "[-v_overlap] <setting>"
  2331.     OutputInfo "    Controls overlap smoothing. This filter smooths borders of adjacent"
  2332.     OutputInfo "    macroblocks in an encoded video. If not specified, overlap smoothing"
  2333.     OutputInfo "    is enabled by default at resolutions below standard definition (SD)."
  2334.     OutputInfo "    0 to disable, 1 to enable."
  2335.     OutputInfo "[-v_denoise] <setting>"
  2336.     OutputInfo "    Controls the noise removal filter. Valid range is 0 to 5, where 0"
  2337.     OutputInfo "    (default) disables denoising and 5 uses strongest denoising."
  2338.     OutputInfo "[-v_median] <setting>"
  2339.     OutputInfo "    Controls the median filter. This filter tells the codec to ignore noise"
  2340.     OutputInfo "    and grain when performing motion estimation which can improve video"
  2341.     OutputInfo "    quality in very noisy video but can adversely affect clean video."
  2342.     OutputInfo "    0 to disable (default), 1 to enable."
  2343.     OutputInfo "[-v_scaling] <setting>"
  2344.     OutputInfo "    Specifies whether to scale the luma range before encoding in order to"
  2345.     OutputInfo "    improve efficiency. Scaled luma range is not expanded when decoded."
  2346.     OutputInfo "    0: Off (default)."
  2347.     OutputInfo "    1: Conservative. Compresses Y range to 26..229."
  2348.     OutputInfo "    2: Aggressive. Compresses Y range to 31..224."
  2349.     OutputInfo "[-v_edgeremoval] <setting>"
  2350.     OutputInfo "    Specifies whether encoder should attempt to detect and remove noisy"
  2351.     OutputInfo "    frame edges, such as VBI data often found in broadcast television."
  2352.     OutputInfo "    0 to disable (default), 1 to enable."
  2353.     OutputInfo "[-v_mslevel] <level>"
  2354.     OutputInfo "    Specifies the level of color information used in motion search."
  2355.     OutputInfo "    0: Luma only (default)."
  2356.     OutputInfo "    1: Luma with nearest integer chroma."
  2357.     OutputInfo "    2: Luma with true chroma."
  2358.     'OutputInfo "    3: Macroblock-adaptive with nearest integer chroma."
  2359.     'OutputInfo "    4: Macroblock-adaptive with true chroma."
  2360.     OutputInfo "[-v_msrange] <range>"
  2361.     OutputInfo "    Controls the search range used in motion search."
  2362.     OutputInfo "    0: Frame-adaptive."
  2363.     OutputInfo "    1: +63.75/-64.0 H, +31.75/-32.0 V (default)."
  2364.     OutputInfo "    2: +127.75/-128.0 H, +63.75/-64.0 V."
  2365.     OutputInfo "    3: +511.75/-512.0 H, +127.75/-128.0 V."
  2366.     OutputInfo "    4: +1023.75/-1024.0 H, +255.75/-256.0 V."
  2367.     OutputInfo "[-v_mmatch] <method>"
  2368.     OutputInfo "    Specifies the method used to measure and identify motion."
  2369.     OutputInfo "    0: Macroblock-adaptive."
  2370.     OutputInfo "    1: SAD (default)."
  2371.     OutputInfo "    2: Hadamard."
  2372.     OutputInfo "[-v_mbmodecost] <method>"
  2373.     OutputInfo "    Specifies the cost method used to decide the macroblock mode."
  2374.     OutputInfo "    0: SAD/Hadamard (default when v_performance < 60)."
  2375.     OutputInfo "    1: Rate Distortion (default when v_performance > 40)."
  2376.     OutputInfo "[-v_mvcoding] <method>"
  2377.     OutputInfo "    Specifies the method used to code delta motion vectors in interlaced"
  2378.     OutputInfo "    images. Wider motion vector distributions are more efficient at storing"
  2379.     OutputInfo "    random motion within a frame."
  2380.     OutputInfo "    0: Default delta motion vector distribution size."
  2381.     OutputInfo "    1: Double horizontal delta motion vector distribution size."
  2382.     OutputInfo "    2: Double vertical delta motion vector distribution size."
  2383.     OutputInfo "    3: Double delta motion vector distribution size in both directions."
  2384.     OutputInfo "[-v_mvcost] <method>"
  2385.     OutputInfo "    Specifies the motion vector cost method."
  2386.     OutputInfo "    0: Fixed motion vector cost."
  2387.     OutputInfo "    1: Adaptive motion vector cost (default)."
  2388.     OutputInfo "[-v_bframedist] <frames>"
  2389.     OutputInfo "    Specifies the number of bidirectional predictive (B) frames that the"
  2390.     OutputInfo "    encoder will use between other types of frames."
  2391.     OutputInfo "    If not specified, the encoder will only use I and P type frames."
  2392.     OutputInfo "    Valid range is 0 to 7, where 0 indicates that B-frames will not be used."
  2393.     OutputInfo "[-v_bdeltaqp] <delta>"
  2394.     OutputInfo "    Sets the fixed increase between the anchor frame's picture quantizer level"
  2395.     OutputInfo "    and the B frame's picture quantizer level. Valid range is 0 to 31. If not"
  2396.     OutputInfo "    specified, the encoder will use variable deltas."
  2397.     OutputInfo "[-v_lookahead] <frames>"
  2398.     OutputInfo "    Sets the number of frames to evaluate ahead for ratecontrol optimization."
  2399.     OutputInfo "    Enabling lookahead might automatically insert B frames into the video in"
  2400.     OutputInfo "    place of flash frames. To completely disable B frame insertion, also set"
  2401.     OutputInfo "    -v_bframedist to 0. Lookahead is ignored in 2-pass ratecontrol modes."
  2402.     OutputInfo "    Valid range is 0 to 16, where 0 disables the lookahead option."
  2403.     OutputInfo "[-v_rangeredux] <Y reduction> <Y expansion> <C reduction> <C expansion>"
  2404.     OutputInfo "    Forces range reduction for the luma (Y) and chroma (C) channels. Reduced"
  2405.     OutputInfo "    range is then expanded on decode by the set expansion factor."
  2406.     OutputInfo "    Reducing the color/luma range reduces the encoded size of video frames,"
  2407.     OutputInfo "    but can introduce banding artifacts in the decoded frames."
  2408.     OutputInfo "    Valid range for each reduction/expansion factor is 0 to 8."
  2409.     OutputInfo "[-v_codedwidth] <width>"
  2410.     OutputInfo "    Encodes video at a width different than the decoded display width."
  2411.     OutputInfo "    Valid range is 32 to 8192. Values will be rounded up internally to the"
  2412.     OutputInfo "    nearest multiple of 32."
  2413.     OutputInfo "[-v_codedheight] <height>"
  2414.     OutputInfo "    Encodes video at a height different than the decoded display height."
  2415.     OutputInfo "    Valid range is 32 to 8192. Values will be rounded up internally to the"
  2416.     OutputInfo "    nearest multiple of 32."
  2417.     OutputInfo "[-v_numthreads] <threads>"
  2418.     OutputInfo "    Forces the encoder to use the specified number of threads for encoding."
  2419.     OutputInfo "    Valid values are 1, 2 and 4. If not specified, encoder will match the"
  2420.     OutputInfo "    number of logical processors reported by the operating system."
  2421.     OutputInfo "[-v_type] <type>"
  2422.     OutputInfo "    Specifies progressive, field or frame picture encoding method."
  2423.     OutputInfo "    For interlaced encoding you must also set -v_preproc to 16, 17 or 18."
  2424.     OutputInfo "    0: Progressive encoding (default when v_preproc < 16)."
  2425.     OutputInfo "    1: Interlaced frame encoding."
  2426.     OutputInfo "    2: Interlaced field encoding (default when v_preproc > 15)."
  2427.     OutputInfo "    3: Auto Interlaced frame/field switching."
  2428.     OutputInfo "    4: Auto Progressive/Interlaced frame/Interlaced field switching."
  2429.     OutputInfo "    The auto options are designed to pick the most efficient coding method"
  2430.     OutputInfo "    for every frame but do not affect the output frame rate or frame pattern."
  2431.     OutputInfo "[-v_preset] <preset>"
  2432.     OutputInfo "    Selects a set of predefined settings that help improve speed or quality."
  2433.     OutputInfo "    Available presets are:"
  2434.     OutputInfo "     fast: Up to 1.5x faster than default with comparable quality."
  2435.     OutputInfo "           -v_complexity 2"
  2436.     OutputInfo "           -v_bframedist 1"
  2437.     OutputInfo "           -v_lookahead 16"
  2438.     OutputInfo "           -v_loopfilter 1"
  2439.     OutputInfo "           -v_overlap 1"
  2440.     OutputInfo "     good: Up to 1.5x slower than default."
  2441.     OutputInfo "           -v_complexity 3"
  2442.     OutputInfo "           -v_bframedist 1"
  2443.     OutputInfo "           -v_lookahead 16"
  2444.     OutputInfo "           -v_loopfilter 1"
  2445.     OutputInfo "     better: Up to 2.5x slower than default."
  2446.     OutputInfo "           -v_complexity 3"
  2447.     OutputInfo "           -v_bframedist 1"
  2448.     OutputInfo "           -v_lookahead 16"
  2449.     OutputInfo "           -v_loopfilter 1"
  2450.     OutputInfo "           -v_mslevel 1"
  2451.     OutputInfo "           -v_msrange 0"
  2452.     OutputInfo "     best: Up to 4.5x slower than default."
  2453.     OutputInfo "           -v_complexity 5"
  2454.     OutputInfo "           -v_bframedist 1"
  2455.     OutputInfo "           -v_lookahead 16"
  2456.     OutputInfo "           -v_loopfilter 1"
  2457.     OutputInfo "           -v_msrange 0"
  2458.     OutputInfo "     insane: The slowest and highest quality preset."
  2459.     OutputInfo "           -v_complexity 4"
  2460.     OutputInfo "           -v_bframedist 1"
  2461.     OutputInfo "           -v_lookahead 16"
  2462.     OutputInfo "           -v_loopfilter 1"
  2463.     OutputInfo "           -v_mslevel 2"
  2464.     OutputInfo "           -v_msrange 0"
  2465.     OutputInfo "           -v_mmatch 0"
  2466.     OutputInfo "    Setting additional parameters will override any values set by the preset."
  2467.     OutputInfo "    Using video presets with -v_compopt 1 is not recommended."
  2468.     OutputInfo ""
  2469.     OutputInfo ""
  2470.     OutputInfo "Usage for metadata settings."
  2471.     OutputInfo "----------------------------"
  2472.     OutputInfo ""
  2473.     OutputInfo "[-title] <string>"
  2474.     OutputInfo "[-author] <string>"
  2475.     Outputinfo "[-album] <string>"
  2476.     Outputinfo "[-year] <string>"
  2477.     Outputinfo "[-trackno] <string>"
  2478.     Outputinfo "[-genre] <string>"
  2479.     OutputInfo "[-copyright] <string>"
  2480.     OutputInfo "[-description] <string>    "
  2481.     OutputInfo "[-rating] <string>"
  2482.         OutputInfo "NOTE: The maximum string length for each one is 255. It is recommended"
  2483.     OutputInfo "      that you enclose all string parameters in quotations.    "
  2484.  
  2485. end function
  2486.  
  2487. ' Print out info about the input file
  2488. function PrintFileInfo()
  2489.     dim objFileInfo
  2490.     dim strFileInfo
  2491.     dim strInput2
  2492.         
  2493.     strInput2 = g_objFileSystem.GetAbsolutePathName( g_strInput )
  2494.  
  2495.     set objFileInfo = WScript.CreateObject( "FileInfo.MediaInfo" )
  2496.  
  2497.     objFileInfo.FileName = strInput2
  2498.  
  2499.     strFileInfo = objFileInfo.MediaInfo
  2500.  
  2501.     OutputInfo strFileInfo
  2502. end function
  2503.  
  2504. ' List audio codecs.
  2505. function ListAudioCodecs()
  2506.     dim objProfile
  2507.     dim objName
  2508.     dim intFourCC
  2509.     dim intVBRMode
  2510.     dim strCodecId
  2511.     dim intCount
  2512.     
  2513.     set objProfile = WScript.CreateObject( "WMENCEng.WMEncProfile2" )
  2514.  
  2515.     OutputInfo vbCrLf & "Audio Codecs: "
  2516.  
  2517.     ' For all VBR modes    
  2518.     for intVBRMode = 1 to 4
  2519.         objProfile.VBRMode(WMENC_AUDIO, 0) = intVBRMode
  2520.  
  2521.         select case intVBRMode
  2522.             case WMENC_PVM_NONE
  2523.                 OutputInfo "CBR Audio Mode :"
  2524.  
  2525.             case WMENC_PVM_PEAK
  2526.                 OutputInfo "Peak Bit Rate-Based VBR Audio Mode :"
  2527.  
  2528.             case WMENC_PVM_UNCONSTRAINED
  2529.                 OutputInfo "Quality-Based VBR Audio Mode :"
  2530.  
  2531.             case WMENC_PVM_BITRATE_BASED
  2532.                 OutputInfo "Bit Rate-Based VBR Audio Mode :"
  2533.     
  2534.             case else
  2535.                 OutputInfo "Unknown Mode"
  2536.         end select
  2537.  
  2538.         intCount = 0
  2539.         ' Enum all audio codecs
  2540.         for i=0 to objProfile.AudioCodecCount-1
  2541.             objProfile.EnumAudioCodec i, objName
  2542.  
  2543.             'Check and display fourcc
  2544.             intFourCC = objProfile.GetCodecFourCCFromIndex(WMENC_AUDIO, i)
  2545.             select case intFourCC
  2546.                 case WMASTD_FOURCC
  2547.                     strCodecId = WMASTD
  2548.  
  2549.                 case WMAPRO_FOURCC
  2550.                     strCodecId = WMAPRO
  2551.  
  2552.                 case WMALSL_FOURCC
  2553.                     strCodecId = WMALSL
  2554.  
  2555.                 case WMSPEECH_FOURCC
  2556.                     strCodecId = WMSPEECH
  2557.  
  2558.                 case PCM_FOURCC
  2559.                     strCodecId = PCM
  2560.  
  2561.                 case else
  2562.                     strCodecId = ""
  2563.             end select
  2564.  
  2565.             if( strCodecId <> "" ) then  
  2566.                 OutputInfo vbTab &  "[" & intCount & "] "  & strCodecId & " : " & objName
  2567.                 intCount = intCount + 1
  2568.             end if
  2569.         next
  2570.  
  2571.         OutputInfo vbCrLf
  2572.     next
  2573.     
  2574. end function
  2575.  
  2576. ' List video codecs.
  2577. function ListVideoCodecs()
  2578.     dim objProfile
  2579.     dim objName
  2580.     dim intFourCC
  2581.     dim intVBRMode
  2582.     dim strCodecId
  2583.     dim intCount
  2584.     
  2585.     set objProfile = WScript.CreateObject( "WMENCEng.WMEncProfile2" )
  2586.  
  2587.     OutputInfo vbCrLf & "Video Codecs: "
  2588.  
  2589.     ' For all VBR modes    
  2590.     for intVBRMode = 1 to 4
  2591.         objProfile.VBRMode(WMENC_VIDEO, 0) = intVBRMode
  2592.  
  2593.         select case intVBRMode
  2594.             case WMENC_PVM_NONE
  2595.                 OutputInfo "CBR Video Mode :"
  2596.  
  2597.             case WMENC_PVM_PEAK
  2598.                 OutputInfo "Peak Bit Rate-Based VBR Video Mode :"
  2599.  
  2600.             case WMENC_PVM_UNCONSTRAINED
  2601.                 OutputInfo "Quality-Based VBR Video Mode :"
  2602.  
  2603.             case WMENC_PVM_BITRATE_BASED
  2604.                 OutputInfo "Bit Rate-Based VBR Video Mode :"
  2605.     
  2606.             case else
  2607.                 OutputInfo "Unknown Mode"
  2608.         end select
  2609.  
  2610.         intCount = 0
  2611.         ' Enum all video codecs
  2612.         for i=0 to objProfile.VideoCodecCount-1
  2613.             objProfile.EnumVideoCodec i, objName
  2614.  
  2615.             'Check and display fourcc
  2616.             intFourCC = objProfile.GetCodecFourCCFromIndex(WMENC_VIDEO, i)
  2617.             select case intFourCC
  2618.                 case WMV7_FOURCC
  2619.                     strCodecId = WMV7
  2620.  
  2621.                 case WMV8_FOURCC
  2622.                     strCodecId = WMV8
  2623.  
  2624.                 case WMV9_FOURCC
  2625.                     strCodecId = WMV9
  2626.  
  2627.                 case WVC1_FOURCC
  2628.                     strCodecId = WVC1
  2629.  
  2630.                 case WMS9_FOURCC
  2631.                     strCodecId = WMS9
  2632.  
  2633.                 case MP41_FOURCC
  2634.                     strCodecId = MP41
  2635.  
  2636.                 case UNCOMP_FOURCC
  2637.                     strCodecId = UNCOMP
  2638.  
  2639.                 case else
  2640.                     strCodecId = ""
  2641.             end select
  2642.  
  2643.             if( strCodecId <> "" ) then  
  2644.                 OutputInfo vbTab &  "[" & i & "] "  & strCodecId & " : " & objName
  2645.                 intCount = intCount + 1
  2646.             end if
  2647.         next
  2648.         OutputInfo vbCrLf
  2649.     next
  2650.  
  2651.  
  2652. end function
  2653.  
  2654. ' List audio formats.
  2655. function ListAudioFormats()
  2656.     dim objProfile
  2657.     dim objName
  2658.     dim intFourCC
  2659.     dim intVBRMode
  2660.     dim strCodecId, strAudFormatName, strSetting
  2661.     dim intAudioSampleRate, intAudioChannels, intAudioBitsPerSample, intAudioBitrate 
  2662.     dim intArgSpaceCount, intBitrateSpaceCount, intSamplingRateSpaceCount, intChannelSpaceCount
  2663.     
  2664.     intArgSpaceCount = 24
  2665.     intBitrateSpaceCount = 16
  2666.     intSamplingRateSpaceCount = 20
  2667.     intChannelSpaceCount = 10
  2668.  
  2669.     set objProfile = WScript.CreateObject( "WMENCEng.WMEncProfile2" )
  2670.  
  2671.     OutputInfo vbCrLf & "Audio Codecs: "
  2672.  
  2673.     ' For all VBR modes    
  2674.     for intVBRMode = 1 to 4
  2675.         objProfile.VBRMode(WMENC_AUDIO, 0) = intVBRMode
  2676.  
  2677.         select case intVBRMode
  2678.             case WMENC_PVM_NONE
  2679.                 OutputInfo "CBR Mode :"
  2680.  
  2681.             case WMENC_PVM_PEAK
  2682.                 OutputInfo "Peak Bit Rate-Based VBR Audio Mode :"
  2683.  
  2684.             case WMENC_PVM_UNCONSTRAINED
  2685.                 OutputInfo "Quality-Based VBR Audio Mode :"
  2686.  
  2687.             case WMENC_PVM_BITRATE_BASED
  2688.                 OutputInfo "Bit Rate-Based VBR Audio Mode :"
  2689.     
  2690.             case else
  2691.                 OutputInfo "Unknown Mode"
  2692.         end select
  2693.  
  2694.         ' Enum all audio codecs
  2695.         for i=0 to objProfile.AudioCodecCount-1
  2696.             objProfile.EnumAudioCodec i, objName
  2697.  
  2698.             'Check and display fourcc
  2699.             intFourCC = objProfile.GetCodecFourCCFromIndex(WMENC_AUDIO, i)
  2700.             select case intFourCC
  2701.                 case WMASTD_FOURCC
  2702.                     strCodecId = WMASTD
  2703.  
  2704.                 case WMAPRO_FOURCC
  2705.                     strCodecId = WMAPRO
  2706.  
  2707.                 case WMALSL_FOURCC
  2708.                     strCodecId = WMALSL
  2709.  
  2710.                 case WMSPEECH_FOURCC
  2711.                     strCodecId = WMSPEECH
  2712.  
  2713.                 case PCM_FOURCC
  2714.                     strCodecId = PCM
  2715.             end select
  2716.  
  2717.             if( strCodecId <> "" ) then  
  2718.                 OutputInfo vbTab & strCodecId & " : " & objName & " (" & strCodecId & "):"
  2719.             else
  2720.                 OutputInfo vbTab & objName & ":"
  2721.             end if
  2722.  
  2723.             OutputInfo vbCrLf
  2724.  
  2725.             if intVBRMode = WMENC_PVM_UNCONSTRAINED then
  2726.                 if strCodecId <> WMAPRO then
  2727.                     OutputInfo vbTab & vbTab & PadSpaces("Argument", intArgSpaceCount) & PadSpaces("Quality", intBitrateSpaceCount) & PadSpaces("Sampling rate", intSamplingRateSpaceCount) & "Channel"
  2728.                 else
  2729.                     OutputInfo vbTab & vbTab & PadSpaces("Argument", intArgSpaceCount) & PadSpaces("Quality", intBitrateSpaceCount) & PadSpaces("Sampling rate", intSamplingRateSpaceCount) & PadSpaces("Channel", intChannelSpaceCount) & "BitsPerSample"
  2730.                 end if
  2731.             else
  2732.                 if strCodecId <> WMAPRO and strCodecId <> WMALSL then
  2733.                     OutputInfo vbTab & vbTab & PadSpaces("Argument", intArgSpaceCount) & PadSpaces("Bitrate", intBitrateSpaceCount) & PadSpaces("Sampling rate", intSamplingRateSpaceCount) & "Channel"
  2734.                 else
  2735.                     OutputInfo vbTab & vbTab & PadSpaces("Argument", intArgSpaceCount) & PadSpaces("Bitrate", intBitrateSpaceCount) & PadSpaces("Sampling rate", intSamplingRateSpaceCount) & PadSpaces("Channel", intChannelSpaceCount) & "BitsPerSample"
  2736.                 end if
  2737.             end if
  2738.  
  2739.             OutputInfo vbTab & vbTab & "------------------------------------------------------------------------------------"
  2740.  
  2741.             For j=0 To objProfile.audioFormatCount(i) - 1
  2742.                 intAudioBitrate = objProfile.EnumAudioFormat(i, j, strAudFormatName, intAudioSampleRate, intAudioChannels, intAudioBitsPerSample)
  2743.  
  2744.                 if intVBRMode <> WMENC_PVM_UNCONSTRAINED then
  2745.                     intAudioBitrate = CLng(intAudioBitrate / 1000)
  2746.                 else
  2747.                     intAudioBitrate = "Q" & intAudioBitrate
  2748.                 end if
  2749.  
  2750.                 if intAudioSampleRate = 96000 then
  2751.                     intAudioSampleRate = 96
  2752.                 elseif intAudioSampleRate = 88200 then
  2753.                     intAudioSampleRate = 88
  2754.                 elseif intAudioSampleRate = 48000 then
  2755.                     intAudioSampleRate = 48
  2756.                 elseif intAudioSampleRate = 44100 then
  2757.                     intAudioSampleRate = 44
  2758.                 elseif intAudioSampleRate = 22050 then
  2759.                     intAudioSampleRate = 22
  2760.                 elseif intAudioSampleRate = 11025 then
  2761.                     intAudioSampleRate = 11
  2762.                 else
  2763.                     intAudioSampleRate = Clng(intAudioSampleRate / 1000)
  2764.                 end if
  2765.  
  2766.                 if strCodecId <> WMAPRO and strCodecId <> WMALSL then
  2767.                     strSetting = intAudioBitrate & "_" & intAudioSampleRate & "_" & intAudioChannels
  2768.                     OutputInfo vbTab & vbTab & PadSpaces(strSetting, intArgSpaceCount) & PadSpaces(intAudioBitrate, intBitrateSpaceCount) & PadSpaces(intAudioSampleRate, intSamplingRateSpaceCount) & intAudioChannels
  2769.                 else 
  2770.                     strSetting = intAudioBitrate & "_" & intAudioSampleRate & "_" & intAudioChannels & "_" & intAudioBitsPerSample
  2771.                     OutputInfo vbTab & vbTab & PadSpaces(strSetting, intArgSpaceCount) & PadSpaces(intAudioBitrate, intBitrateSpaceCount) & PadSpaces(intAudioSampleRate, intSamplingRateSpaceCount) & PadSpaces(intAudioChannels, intChannelSpaceCount) & intAudioBitsPerSample
  2772.                 end if
  2773.  
  2774.             next 
  2775.     
  2776.             OutputInfo vbCrLf & vbCrLf
  2777.  
  2778.         next
  2779.         OutputInfo vbCrLf
  2780.     next
  2781.     
  2782. end function
  2783.  
  2784.  
  2785. ' Add spaces to the end of arg to create intCount characters string
  2786. function PadSpaces( arg, intCount )
  2787.  
  2788.     if Len(arg) >= intCount then
  2789.         PadSpaces = arg
  2790.         exit function
  2791.     end if
  2792.  
  2793.     PadSpaces = arg & Space( intCount - Len(arg) )
  2794. end function
  2795.  
  2796.  
  2797.  
  2798. ' List all audio and video devices.
  2799. function ListDevices()
  2800.     dim objManager, objPlugin, i, j, k, count
  2801.  
  2802.     set objManager = g_objEncoder.SourcePluginInfoManager
  2803.  
  2804.     for i=0 to 1
  2805.         if i = 0 then
  2806.             OutputInfo "audio device:"
  2807.         elseif i = 1 then
  2808.             OutputInfo "video device:"
  2809.         end if
  2810.         count = 0
  2811.         for j=0 to objManager.Count-1
  2812.             set objPlugin = objManager.Item(j)
  2813.  
  2814.             if objPlugin.Resources = true then
  2815.                 if i = 0 then
  2816.                     if objPlugin.MediaType = 1 or objPlugin.MediaType = 3 then
  2817.                         ' Enum all devices in this type
  2818.                         for k=0 to objPlugin.Count-1
  2819.                             OutputInfo vbTab & count & " : " & objPlugin.Item(k)
  2820.                             count = count + 1
  2821.                         next
  2822.                     end if
  2823.                 elseif i = 1 then
  2824.                     if objPlugin.MediaType = 2 or objPlugin.MediaType = 3 or objPlugin.MediaType = 6 then
  2825.                         ' Enum all devices in this type
  2826.                         for k=0 to objPlugin.Count-1
  2827.                             OutputInfo vbTab & count & " : " & objPlugin.Item(k)
  2828.                             count = count + 1
  2829.                         next
  2830.                     end if
  2831.                 end if
  2832.             end if
  2833.         next
  2834.     next
  2835. end function
  2836.  
  2837.  
  2838. ' Setup encoder using the current settings.
  2839. function SetupEncoder( )
  2840.     
  2841.     if not CreateSourceGroup() then
  2842.         SetupEncoder = false
  2843.         exit function
  2844.     end if
  2845.  
  2846.     if not SetupInput() then
  2847.         SetupEncoder = false
  2848.         exit function
  2849.     end if
  2850.  
  2851.     if not SetupProfile() then
  2852.         SetupEncoder = false
  2853.         exit function
  2854.     end if
  2855.  
  2856.     if not SetupOutput()  then
  2857.         SetupEncoder = false
  2858.         exit function
  2859.     end if
  2860.  
  2861.     if not SetupTime() then
  2862.         SetupEncoder = false
  2863.         exit function
  2864.     end if
  2865.  
  2866.     if not SetupDisplayInfo() then
  2867.         SetupEncoder = false
  2868.         exit function
  2869.     end if
  2870.  
  2871.     g_objEncoder.AutoStop = true
  2872.  
  2873.     SetupEncoder = true
  2874. end function
  2875.  
  2876. ' Create Source group by loading from wme or adding a new one
  2877. function CreateSourceGroup()
  2878.  
  2879.     dim objProfile
  2880.     dim intCodecIndex
  2881.  
  2882.     ' If a WME file is provided, load the encoding configuration from this WME file.
  2883.     if g_strWMEFile <> "" then
  2884.         on error resume next
  2885.  
  2886.         ' Load enocder session from a WME file
  2887.         g_objEncoder.Load( g_objFileSystem.GetAbsolutePathName( g_strWMEFile ) )
  2888.  
  2889.         ' Add a new source group.
  2890.         set g_objSourceGroup = g_objEncoder.SourceGroupCollection.Item(0)
  2891.  
  2892.         set objProfile = g_objSourceGroup.Profile
  2893.         set g_objProfile = WScript.CreateObject( "WMENCENG.WMEncProfile2" )
  2894.         g_objProfile.LoadFromIWMProfile( objProfile )
  2895.  
  2896.         ' If source file has an auido stream, get the audio source.
  2897.         if g_objSourceGroup.SourceCount( WMENC_AUDIO ) > 0 then
  2898.             set g_objAudioSource = g_objSourceGroup.Source( WMENC_AUDIO, 0 )
  2899.             intCodecIndex = g_objProfile.Audience(0).AudioCodec( 0 )
  2900.             g_objProfile.EnumAudioCodec intCodecIndex, g_strAudioCodecName
  2901.         end if
  2902.  
  2903.         ' If source file has a video stream, get the video source.
  2904.         if g_objSourceGroup.SourceCount( WMENC_VIDEO ) > 0 then
  2905.             set g_objVideoSource = g_objSourceGroup.Source( WMENC_VIDEO, 0 )
  2906.             intCodecIndex = g_objProfile.Audience(0).VideoCodec( 0 )
  2907.             g_objProfile.EnumVideoCodec intCodecIndex, g_strVideoCodecName
  2908.         end if
  2909.  
  2910.         g_blnCreateCustomProfile = false
  2911.  
  2912.         if g_intMaxPacketSize = -1 then
  2913.             g_intMaxPacketSize = objProfile.MaxPacketSize
  2914.         end if
  2915.  
  2916.         if err.number <> 0 then
  2917.             OutputInfo "Loading the session (.wme) file failed: " & g_strWMEFile
  2918.             err.Clear
  2919.             CreateSourceGroup = false
  2920.             exit function
  2921.         end if
  2922.     else
  2923.         ' Create a new source group for this session
  2924.         set g_objSourceGroup = g_objEncoder.SourceGroupCollection.Add( "SG_1" )
  2925.     end if
  2926.  
  2927.     CreateSourceGroup = true
  2928. end function
  2929.  
  2930. ' Setup profile configuration
  2931. function SetupProfile()
  2932.     on error resume next
  2933.  
  2934.     dim objProfile
  2935.     dim objAudience
  2936.     dim blnRet
  2937.     dim strProfileLoad
  2938.     dim objFileInfo
  2939.     dim intVideoFramerateTemp
  2940.     dim intSourceVideoFramerate
  2941.     dim strInput2
  2942.  
  2943.     ' save the global frame rate, since we might over-write it based on the input files frame rate
  2944.     intVideoFramerateTemp = g_intVideoFramerate
  2945.  
  2946.     if IsNull(g_objProfile) then
  2947.         Set g_objProfile = WScript.CreateObject( "WMENCEng.WMEncProfile2" )
  2948.         g_objProfile.ContentType = g_intSessionType
  2949.         g_objProfile.ProfileName = "WMCMDProfile"
  2950.  
  2951.         Set objAudience = g_objProfile.AddAudience( 10000000 )
  2952.     else
  2953.         g_objProfile.ContentType = g_intSessionType
  2954.         Set objAudience = g_objProfile.Audience( 0 )
  2955.  
  2956.     end if
  2957.  
  2958.  
  2959.     if g_intVideoFramerate = -1 then
  2960.         ' Assume 30 fps unless we can get the input files framerate
  2961.         g_intVideoFramerate = 30000
  2962.     end if
  2963.  
  2964.     strInput2 = g_objFileSystem.GetAbsolutePathName( g_strInput )
  2965.     set objFileInfo = WScript.CreateObject( "FileInfo.MediaInfo" )
  2966.     objFileInfo.FileName = strInput2
  2967.     intSourceVideoFramerate = 100000
  2968.     intSourceVideoFramerate = objFileInfo.FrameRate * 1000
  2969.     if intSourceVideoFramerate = 0 then
  2970.         intSourceVideoFramerate = 100000
  2971.     end if
  2972.  
  2973.     ' Set the video frame rate to lower of the source input or user specified frame rate for better quality
  2974.     if intSourceVideoFramerate < g_intVideoFramerate then
  2975.         g_intVideoFramerate = intSourceVideoFramerate
  2976.     end if
  2977.  
  2978.     ' if profile string is specified load it
  2979.     if g_strProfile <> "" then
  2980.         blnRet = SetupPredefinedProfile( objAudience )
  2981.  
  2982.         g_blnCreateCustomProfile = false
  2983.  
  2984.         if not blnRet then
  2985.             SetupProfile = false
  2986.             exit function
  2987.         end if
  2988.     end if
  2989.  
  2990.     if g_strProfileLoad <> "" then
  2991.         strProfileLoad = g_objFileSystem.GetAbsolutePathName( g_strProfileLoad )
  2992.         g_objProfile.LoadFromFile strProfileLoad
  2993.         g_blnCreateCustomProfile = false
  2994.         Set objAudience = g_objProfile.Audience( 0 )
  2995.  
  2996.         ' enable two pass if required
  2997.         if not isnull( g_objVideoSource ) then                
  2998.             if g_objProfile.VBRMode( WMENC_VIDEO, 0 ) = WMENC_PVM_PEAK or g_objProfile.VBRMode( WMENC_VIDEO, 0 ) = WMENC_PVM_BITRATE_BASED then
  2999.                 g_objVideoSource.PreProcessPass = 1
  3000.             end if
  3001.             
  3002.             if objAudience.VideoFPS(0) > g_intVideoFramerate then
  3003.                 objAudience.VideoFPS(0) = g_intVideoFramerate
  3004.             else
  3005.                 g_intVideoFramerate = objAudience.VideoFPS(0)
  3006.             end if
  3007.         end if
  3008.  
  3009.         if not isnull( g_objAudioSource ) then                
  3010.             if g_objProfile.VBRMode( WMENC_AUDIO, 0 ) = WMENC_PVM_PEAK or g_objProfile.VBRMode( WMENC_AUDIO, 0 ) = WMENC_PVM_BITRATE_BASED then
  3011.                 g_objAudioSource.PreProcessPass = 1
  3012.             end if
  3013.         end if
  3014.     end if
  3015.  
  3016.     ' First time: override the WME or predefined profile with custom values
  3017.     blnRet = SetupCustomProfile( objAudience )
  3018.     if not blnRet then
  3019.         SetupProfile = false
  3020.         exit function
  3021.     end if
  3022.  
  3023.     if g_blnCreateCustomProfile then
  3024.         ' Second time: Update profile based on input specified and default values
  3025.         LoadProfileDefaults()
  3026.  
  3027.         blnRet = SetupCustomProfile( objAudience )
  3028.         if not blnRet then
  3029.             SetupProfile = false
  3030.             exit function
  3031.         end if
  3032.     end if
  3033.  
  3034.     ' Set a few more things like interlaced coding and pixel ratio
  3035.     if g_intPixelAspectRatioX <> -1 or g_intPixelAspectRatioY <> -1 then
  3036.         g_objProfile.NonSquarePixelMode(0) = true
  3037.     end if
  3038.  
  3039.     if g_intVideoPreprocess >= 16 and g_intVideoPreprocess <= 18 then
  3040.         g_objProfile.InterlaceMode(0) = true
  3041.     end if
  3042.  
  3043.     if g_intMinPacketSize <> -1 then
  3044.         g_objProfile.MinPacketSize = g_intMinPacketSize
  3045.     end if
  3046.  
  3047.     ' Set the profile in encoder.
  3048.     g_objSourceGroup.Profile = g_objProfile
  3049.  
  3050.     if g_intMaxPacketSize <> -1 then
  3051.         g_objSourceGroup.Profile.MaxPacketSize = g_intMaxPacketSize
  3052.     end if
  3053.  
  3054.     g_intVideoFramerate = intVideoFramerateTemp
  3055.  
  3056.  
  3057.     if g_strVideoCodec = WMV9 and g_strVideoDevConf = "AP" then
  3058.         OutputInfo "WMV9 video codec does not include Advanced Profile."
  3059.         OutputInfo "If you wish to use Advanced Profile, please specify -v_codec WVC1"
  3060.         SetupProfile = false
  3061.         exit function
  3062.     end if
  3063.  
  3064.     if g_strVideoCodec = WVC1 and (g_strVideoDevConf = "SP" or g_strVideoDevConf = "MP") then
  3065.         OutputInfo "WVC1 video codec does not include Simple and Main profiles."
  3066.         OutputInfo "If you wish to use Simple or Main Profile, please specify -v_codec WMV9"
  3067.         SetupProfile = false
  3068.         exit function
  3069.     end if
  3070.  
  3071.  
  3072.     'Set advanced WMV settings
  3073.     if g_strVideoCodec = WVC1 or g_strVideoCodec = WMV9 then
  3074.     
  3075.         ' Check if a previous WMCmd encoding session was aborted and registry settings were left behind accidentally - "dirty" flag
  3076.         if not IsEncoderRegistryDirty() then 
  3077.             SaveEncoderRegistrySettings()
  3078.         end if
  3079.         ClearEncoderRegistrySettings()
  3080.         
  3081.         ' Set dirty flag that ensures we can detect if registry settings were accidentally left behind due to an aborted encode session
  3082.         g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\WMCmdDirtyFlag", 1, "REG_DWORD"
  3083.                 
  3084.         ' Advanced Profile only
  3085.         if g_strVideoCodec = WVC1 then
  3086.         
  3087.             if g_intVideoCompOpt <> -128 then
  3088.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Compression Optimization Type", g_intVideoCompOpt, "REG_DWORD"
  3089.             end if
  3090.         
  3091.             if g_intVideoRangeRedux <> -128 then 
  3092.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Force Range Reduction", g_intVideoRangeRedux, "REG_DWORD"
  3093.             end if
  3094.             
  3095.             if g_intVideoMVCoding <> -128 then 
  3096.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Motion Vector Coding Method", g_intVideoMVCoding, "REG_DWORD"
  3097.             end if 
  3098.             
  3099.             if g_intVideoCodedWidth <> -128 then 
  3100.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Force Encoding Width", g_intVideoCodedWidth, "REG_DWORD"
  3101.             end if 
  3102.  
  3103.             if g_intVideoCodedHeight <> -128 then 
  3104.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Force Encoding Height", g_intVideoCodedHeight, "REG_DWORD"
  3105.             end if 
  3106.  
  3107.             if g_intVideoType <> -128 then 
  3108.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\VideoType", g_intVideoType, "REG_DWORD"
  3109.             end if 
  3110.         end if
  3111.         
  3112.         ' Advanced and Main Profiles only
  3113.         if not g_strVideoDevConf = "SP" then
  3114.  
  3115.             if g_intVideoDquantOption <> -128 then 
  3116.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Dquant Option", g_intVideoDquantOption, "REG_DWORD"
  3117.             end if 
  3118.      
  3119.             if g_intVideoDquantStrength <> -128 then 
  3120.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Dquant Strength", g_intVideoDquantStrength, "REG_DWORD"
  3121.             end if 
  3122.             
  3123.             if g_intVideoBDeltaQP <> -128 then 
  3124.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Force B Frame Delta QP", g_intVideoBDeltaQP, "REG_DWORD"
  3125.             end if 
  3126.      
  3127.             if g_intVideoLoopfilter <> -128 then 
  3128.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Force LoopFilter", g_intVideoLoopfilter, "REG_DWORD"
  3129.             end if 
  3130.             
  3131.             if g_intVideoMSRange <> -128 then 
  3132.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Motion Search Range", g_intVideoMSRange, "REG_DWORD"
  3133.             end if 
  3134.             
  3135.             if g_intVideoBFrameDist <> -128 then 
  3136.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\NumBFrames", g_intVideoBFrameDist, "REG_DWORD"
  3137.             end if 
  3138.      
  3139.             if g_intVideoPercOpt <> -128 then 
  3140.                 g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Perceptual Option", g_intVideoPercOpt, "REG_DWORD"
  3141.             end if
  3142.         end if
  3143.  
  3144.         
  3145.         ' All profiles
  3146.         if g_intVideoDenoise <> -128 then 
  3147.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\DenoiseOption", g_intVideoDenoise, "REG_DWORD"
  3148.         end if 
  3149.  
  3150.         if g_intVideoMedian <> -128 then 
  3151.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Force Median", g_intVideoMedian, "REG_DWORD" 
  3152.         end if 
  3153.  
  3154.         if g_intVideoEdgeRemoval <> -128 then 
  3155.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Force NoiseEdgeRemoval", g_intVideoEdgeRemoval, "REG_DWORD"
  3156.         end if 
  3157.  
  3158.         if g_intVideoThreadAffinity <> -128 then 
  3159.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Encoder Thread Affinity", g_intVideoThreadAffinity, "REG_DWORD"
  3160.         end if 
  3161.  
  3162.         if g_intVideoNumThreads <> -128 then 
  3163.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Force NumThreads", g_intVideoNumThreads, "REG_DWORD"
  3164.         end if 
  3165.  
  3166.         if g_intVideoOverlap <> -128 then 
  3167.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Force Overlap", g_intVideoOverlap, "REG_DWORD"
  3168.         end if 
  3169.  
  3170.         if g_intVideoScaling <> -128 then 
  3171.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Force Video Scaling", g_intVideoScaling, "REG_DWORD"
  3172.         end if 
  3173.  
  3174.         if g_intVideoLookahead <> -128 then 
  3175.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Lookahead", g_intVideoLookahead, "REG_DWORD"
  3176.         end if 
  3177.         
  3178.         if g_intVideoLookaheadRC <> -128 then 
  3179.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Lookahead Ratecontrol", g_intVideoLookaheadRC, "REG_DWORD"
  3180.         end if 
  3181.  
  3182.         if g_intVideoMBModeCost <> -128 then 
  3183.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Macroblock Mode Cost Method", g_intVideoMBModeCost, "REG_DWORD"
  3184.         end if 
  3185.  
  3186.         if g_intVideoMMatch <> -128 then 
  3187.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Motion Match Method", g_intVideoMMatch, "REG_DWORD"
  3188.         end if 
  3189.  
  3190.         if g_intVideoMSLevel <> -128 then 
  3191.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Motion Search Level", g_intVideoMSLevel, "REG_DWORD"
  3192.         end if 
  3193.  
  3194.         if g_intVideoMVCost <> -128 then 
  3195.             g_objWshShell.RegWrite g_strVideoEncoderRegistryKey & "\Motion Vector Cost Method", g_intVideoMVCost, "REG_DWORD"
  3196.         end if 
  3197.  
  3198.     end if
  3199.  
  3200.  
  3201.     ' Invalid profile
  3202.     if err.number <> 0 then
  3203.         OutputInfo "Invalid profile: 0x" & Hex( err.number ) & " " & err.Description
  3204.         err.Clear
  3205.         SetupProfile = false
  3206.         exit function
  3207.     end if
  3208.  
  3209.     if g_strProfileSave <> "" then
  3210.         g_objProfile.SaveToFile g_strProfileSave
  3211.     end if
  3212.  
  3213.     SetupProfile = true
  3214. end function
  3215.  
  3216. ' Setup ouptut configuration.
  3217. function SetupOutput()
  3218.     ' Is an output file name provided?
  3219.     if g_strOutput <> "" then
  3220.         ' Is this output name a directory?
  3221.         if g_objFileSystem.FolderExists( g_strOutput ) then
  3222.             
  3223.             ' If the output name is a directory, create the real output file name.
  3224.             ' If the input is a file, use the file name of the input file (extension is not ussed).
  3225.             ' If the inputs are devices, use 'output' as the output name.            
  3226.             if g_strInput <> "" then
  3227.                 g_strOutput = g_strOutput & "\\" & g_objFileSystem.GetBaseName( g_strInput )
  3228.             else
  3229.                 g_strOutput = g_strOutput & "\\output"
  3230.             end if
  3231.         end if
  3232.  
  3233.         ' If the output file name doesn't have a extension, create a proper one.
  3234.         if g_objFileSystem.GetExtensionName( g_strOutput ) = "" then            
  3235.  
  3236.             ' Does "." already exist in the output file name.
  3237.             ' If not, append "." to the output file name.
  3238.             if Right( g_strOutput, 1 ) <>  "." then
  3239.                 g_strOutput = g_strOutput & "."
  3240.             end if
  3241.  
  3242.             ' Does this session have a video source?
  3243.             ' If it has video stream, append wmv extension, otherwise wma extension is appended.
  3244.             if g_objSourceGroup.SourceCount( WMENC_VIDEO ) > 0 then
  3245.                 g_strOutput = g_strOutput & "wmv"
  3246.             else
  3247.                 g_strOutput = g_strOutput & "wma"
  3248.             end if
  3249.         end if
  3250.  
  3251.         CreateOutputFolder( g_objFileSystem.GetParentFolderName( g_objFileSystem.GetAbsolutePathName( g_strOutput ) ) )
  3252.  
  3253.         g_objEncoder.File.LocalFileName = g_strOutput
  3254.     else
  3255.         ' Get the output file name from WME file.
  3256.         if not IsNull(g_objEncoder.File.LocalFileName) then
  3257.             g_strOutput = g_objEncoder.File.LocalFileName
  3258.         end if
  3259.     end if
  3260.  
  3261.     ' Enable HTTP broadcasting for the encoder if a broadcast port is provided.
  3262.     if g_intBroadcast <> -1 then
  3263.         g_objEncoder.Broadcast.PortNumber( WMENC_PROTOCOL_HTTP ) = g_intBroadcast
  3264.     end if
  3265.  
  3266.     ' Enable push if push server is specified
  3267.     if g_strPushServer <> "" then
  3268.         g_objEncoder.Broadcast.ServerName = g_strPushServer
  3269.         g_objEncoder.Broadcast.PublishingPoint = g_strPublishingPoint
  3270.         if g_strPushTemplate <> "" then
  3271.             g_objEncoder.Broadcast.Template = g_strPushTemplate
  3272.         end if
  3273.     end if
  3274.  
  3275.     SetupOutput = true
  3276. end function
  3277.  
  3278. ' Setup display configuration
  3279. function SetupDisplayInfo()
  3280.     dim objDisplayInfo
  3281.     dim objAttributes
  3282.     
  3283.     set objDisplayInfo = g_objEncoder.DisplayInfo
  3284.     set objAttributes = g_objEncoder.Attributes
  3285.  
  3286.     ' Is title set?
  3287.     if g_strTitle <> "" then
  3288.         objDisplayInfo.Title = g_strTitle
  3289.     end if
  3290.  
  3291.     ' Is author set?
  3292.     if g_strAuthor <> "" then
  3293.         objDisplayInfo.Author = g_strAuthor
  3294.     end if
  3295.  
  3296.     ' Is album set?
  3297.     if g_strAlbum <> "" then
  3298.         objAttributes.Add "WM/AlbumTitle", CStr(g_strAlbum)        
  3299.     end if
  3300.  
  3301.     ' Is genre set?
  3302.     if g_strGenre <> "" then
  3303.         objAttributes.Add "WM/Genre", CStr(g_strGenre)
  3304.     end if
  3305.  
  3306.     ' Is track number set?
  3307.     if (g_intTrackNo <> "") and (IsNumeric(g_intTrackNo)) then
  3308.         objAttributes.Add "WM/TrackNumber", CStr(CInt(g_intTrackNo))
  3309.         objAttributes.Add "WM/Track", CStr(CInt(g_intTrackNo)-1)
  3310.     else g_intTrackNo = ""
  3311.     end if
  3312.  
  3313.     ' Is year set?
  3314.     if (g_strYear <> "") and (IsNumeric(g_strYear)) then
  3315.         objAttributes.Add "WM/Year", CStr(g_strYear)
  3316.     else g_strYear = ""
  3317.     end if
  3318.  
  3319.     ' Is copyright set?
  3320.     if g_strCopyright <> "" then
  3321.         objDisplayInfo.Copyright = g_strCopyright
  3322.     end if
  3323.  
  3324.     ' Is description set?
  3325.     if g_strDescription <> "" then
  3326.         objDisplayInfo.Description = g_strDescription
  3327.     end if
  3328.  
  3329.     ' Is rating set?
  3330.     if g_strRating <> "" then
  3331.         objDisplayInfo.Rating = g_strRating
  3332.     end if
  3333.  
  3334.     ' Add folddown coefficients
  3335.     if g_intAudioSurroundMix <> -1 then
  3336.         objAttributes.Add "SurroundMix", -g_intAudioSurroundMix
  3337.         objAttributes.Add "CenterMix", -g_intAudioCenterMix
  3338.         objAttributes.Add "LFEMix", -g_intAudioLEFMix
  3339.     end if
  3340.  
  3341.     SetupDisplayInfo = true
  3342. end function
  3343.  
  3344. ' Setup a new profile based on predefined profiles
  3345. function SetupPredefinedProfile(objAudience)
  3346.     dim intAudioCodecIndex, intVideoCodecIndex
  3347.     
  3348.     '  The following defined built in profiles.  Built in profiles are defined by the following:
  3349.     '  Audio:  Codec, channels, sample rate, bit rate, bit depth
  3350.     '  Video:  Codec, bit rate, width, height, fpsx1000, buffer (ms), smoothness, key frame 
  3351.     '  New built in profiles can be added by creating a new case statement and specifying
  3352.     '  audio and video profile settings.
  3353.     select case LCase( g_strProfile )
  3354.         case "av20":
  3355.             SetupAudioAudience objAudience, "WMASTD", 1, 8000, 5000, 16
  3356.             SetupVideoAudience objAudience, "WMV9", 15000, 160, 120, 15000, 5000, 75, 10000
  3357.  
  3358.         case "av32":
  3359.             SetupAudioAudience objAudience, "WMASTD", 1, 11025, 10168, 16
  3360.             SetupVideoAudience objAudience, "WMV9", 22000, 176, 144, 15000, 5000, 75, 10000
  3361.  
  3362.         case "av100":
  3363.             SetupAudioAudience objAudience, "WMASTD", 1, 16000, 16000, 16
  3364.             SetupVideoAudience objAudience, "WMV9", 84000, 320, 240, 15000, 5000, 75, 10000
  3365.  
  3366.         case "av225":
  3367.             SetupAudioAudience objAudience, "WMASTD", 2, 32000, 40000, 16
  3368.             SetupVideoAudience objAudience, "WMV9", 185000, 320, 240, 30000, 5000, 75, 10000
  3369.  
  3370.         case "av350":
  3371.             SetupAudioAudience objAudience, "WMASTD", 2, 32000, 48000, 16
  3372.             SetupVideoAudience objAudience, "WMV9", 302000, 320, 240, 30000, 5000, 75, 10000
  3373.  
  3374.         case "av450":
  3375.             SetupAudioAudience objAudience, "WMASTD", 2, 44100, 64040, 16
  3376.             SetupVideoAudience objAudience, "WMV9", 386000, 320, 240, 30000, 5000, 75, 10000
  3377.  
  3378.         case "av700":
  3379.             SetupAudioAudience objAudience, "WMASTD", 2, 44100, 64040, 16
  3380.             SetupVideoAudience objAudience, "WMV9", 636000, 320, 240, 30000, 5000, 75, 10000
  3381.  
  3382.         case "av1400":
  3383.             SetupAudioAudience objAudience, "WMASTD", 2, 44100, 128040, 16
  3384.             SetupVideoAudience objAudience, "WMV9", 1272000, 320, 240, 30000, 5000, 75, 10000
  3385.  
  3386.         case "av350pal":
  3387.             SetupAudioAudience objAudience, "WMASTD", 2, 32000, 48000, 16
  3388.             SetupVideoAudience objAudience, "WMV9", 302000, 384, 288, 25000, 5000, 75, 10000
  3389.  
  3390.         case "av700pal":
  3391.             SetupAudioAudience objAudience, "WMASTD", 2, 44100, 64040, 16
  3392.             SetupVideoAudience objAudience, "WMV9", 636000, 384, 288, 25000, 5000, 75, 10000
  3393.  
  3394.         case "av100_2p":
  3395.             SetupAudioAudience objAudience, "WMASTD", 1, 16000, 16000, 16
  3396.             SetupVideoAudience objAudience, "WMV9", 84000, 320, 240, 15000, 5000, 75, 10000
  3397.             g_objAudioSource.PreProcessPass = 1
  3398.             g_objVideoSource.PreProcessPass = 1
  3399.  
  3400.         case "av350_2p"
  3401.             SetupAudioAudience objAudience, "WMASTD", 2, 32000, 48000, 16
  3402.             SetupVideoAudience objAudience, "WMV9", 302000, 320, 240, 30000, 5000, 75, 10000
  3403.             g_objAudioSource.PreProcessPass = 1
  3404.             g_objVideoSource.PreProcessPass = 1
  3405.  
  3406.         case "av600vbr":
  3407.             g_objProfile.VBRMode(WMENC_VIDEO, 0) = WMENC_PVM_PEAK
  3408.             SetupAudioAudience objAudience, "WMASTD", 2, 44100, 64040, 16
  3409.             SetupVideoAudience objAudience, "WMV9", 536000, 320, 240, 24000, 5000, 75, 10000
  3410.             
  3411.             objAudience.VideoPeakBitrate(0) = 1.5 * objAudience.VideoBitrate(0)
  3412.             objAudience.VideoBufferMax(0) = 5000
  3413.  
  3414.             ' Turn telecine and two pass video on
  3415.             g_objVideoSource.Optimization = WMENC_VIDEO_INVERSETELECINE
  3416.             g_objVideoSource.PreProcessPass = 1    
  3417.  
  3418.         case "avq97vbr":
  3419.             g_objProfile.VBRMode(WMENC_VIDEO, 0) = WMENC_PVM_UNCONSTRAINED
  3420.             SetupAudioAudience objAudience, "WMASTD", 2, 44100, 64040, 16
  3421.             SetupVideoAudience objAudience, "WMV9", 536000, 320, 240, 24000, 5000, 97, 10000
  3422.  
  3423.             ' Turn telecine on
  3424.             g_objVideoSource.Optimization = WMENC_VIDEO_INVERSETELECINE
  3425.  
  3426.         case "a20_1":
  3427.             SetupAudioAudience objAudience, "WMASTD", 1, 22050, 20008, 16
  3428.  
  3429.         case "a20_2":
  3430.             SetupAudioAudience objAudience, "WMASTD", 2, 22050, 20008, 16
  3431.  
  3432.         case "a32":
  3433.             SetupAudioAudience objAudience, "WMASTD", 2, 32000, 32000, 16
  3434.  
  3435.         case "a48":
  3436.             SetupAudioAudience objAudience, "WMASTD", 2, 32000, 48024, 16
  3437.  
  3438.         case "a64":
  3439.             SetupAudioAudience objAudience, "WMASTD", 2, 44100, 64016, 16
  3440.  
  3441.         case "a96":
  3442.             SetupAudioAudience objAudience, "WMASTD", 2, 44100, 96024, 16
  3443.  
  3444.         case "a128":
  3445.             SetupAudioAudience objAudience, "WMASTD", 2, 44100, 128016, 16
  3446.  
  3447.         case "v20":
  3448.             SetupVideoAudience objAudience, "WMV9", 20000, 176, 144, 15000, 5000, 75, 10000
  3449.  
  3450.         case "v32":
  3451.             SetupVideoAudience objAudience, "WMV9", 32000, 240, 176, 15000, 5000, 75, 10000
  3452.  
  3453.         case else
  3454.             OutputInfo "No predefined profile found."
  3455.             SetupPredefinedProfile = false
  3456.             exit function
  3457.  
  3458.     end select
  3459.  
  3460.     SetupPredefinedProfile = true
  3461. end function
  3462.  
  3463. ' Given audio parameters this will setup the audience
  3464. function SetupAudioAudience(objAudience, strAudioCodec, intChannels, intSampleRate, intBitrate, intBitsPerSample)
  3465.     dim intAudioCodecIndex
  3466.  
  3467.     intAudioCodecIndex = GetAudioCodecIndex(strAudioCodec)
  3468.     g_objProfile.EnumAudioCodec intAudioCodecIndex, g_strAudioCodecName
  3469.     
  3470.     objAudience.AudioCodec(0) = intAudioCodecIndex
  3471.     objAudience.SetAudioConfig 0, intChannels, intSampleRate, intBitrate, intBitsPerSample
  3472. end function
  3473.  
  3474. ' Given video parameters this will setup the audience
  3475. function SetupVideoAudience(objAudience, strVideoCodec, intBitrate, intWidth, intHeight, intFps, intBufferWindow, intSmoothness, intKeyFrame)
  3476.     dim intVideoCodecIndex
  3477.     
  3478.     if intFps > g_intVideoFramerate then
  3479.         intFps = g_intVideoFramerate
  3480.     else
  3481.         g_intVideoFramerate = intFps
  3482.     end if
  3483.  
  3484.     intVideoCodecIndex = GetVideoCodecIndex(strVideoCodec)
  3485.     g_objProfile.EnumVideoCodec intVideoCodecIndex, g_strVideoCodecName
  3486.  
  3487.     objAudience.VideoCodec(0) = intVideoCodecIndex
  3488.     objAudience.VideoBitrate(0) = intBitrate
  3489.     objAudience.VideoWidth(0) = intWidth
  3490.     objAudience.VideoHeight(0) = intHeight
  3491.     objAudience.VideoFps(0) = intFps
  3492.     objAudience.VideoKeyFrameDistance(0) = intKeyFrame
  3493.     objAudience.VideoBufferSize(0) = intBufferWindow
  3494.  
  3495.     ' For quality vbr mode use intSmoothness as VBR quality
  3496.     if g_objProfile.VBRMode(WMENC_VIDEO, 0) = WMENC_PVM_UNCONSTRAINED then
  3497.         objAudience.VideoCompressionQuality(0) = intSmoothness
  3498.     else
  3499.         objAudience.VideoImageSharpness(0) = intSmoothness
  3500.     end if
  3501. end function
  3502.  
  3503. ' Given audio string(eg WMASTD) this returns the audio codec index
  3504. function GetAudioCodecIndex(strAudioCodec)
  3505.     dim intFourCC
  3506.  
  3507.     select case strAudioCodec
  3508.         case WMASTD
  3509.             intFourCC = WMASTD_FOURCC
  3510.  
  3511.         case WMAPRO
  3512.             intFourCC = WMAPRO_FOURCC
  3513.  
  3514.         case WMALSL
  3515.             intFourCC = WMALSL_FOURCC
  3516.  
  3517.         case WMSPEECH
  3518.             intFourCC = WMSPEECH_FOURCC
  3519.  
  3520.         case PCM
  3521.             intFourCC = PCM_FOURCC
  3522.  
  3523.         case else
  3524.             intFourCC = WMASTD_FOURCC
  3525.     end select
  3526.  
  3527.     GetAudioCodecIndex = g_objProfile.GetCodecIndexFromFourCC(WMENC_AUDIO, intFourCC)
  3528.  
  3529. end function
  3530.  
  3531. ' Given the video string(eg WMV9) this returns the video codec index
  3532. function GetVideoCodecIndex(strVideoCodec)
  3533.     dim intFourCC
  3534.  
  3535.     select case strVideoCodec
  3536.         case WMV7
  3537.             intFourCC = WMV7_FOURCC
  3538.  
  3539.         case WMV8
  3540.             intFourCC = WMV8_FOURCC
  3541.  
  3542.         case WMV9
  3543.             intFourCC = WMV9_FOURCC
  3544.  
  3545.         case WVC1
  3546.             intFourCC = WVC1_FOURCC
  3547.  
  3548.         case WMS9
  3549.             intFourCC = WMS9_FOURCC
  3550.  
  3551.         case MP41
  3552.             intFourCC = MP41_FOURCC
  3553.  
  3554.         case UNCOMP
  3555.             intFourCC = UNCOMP_FOURCC
  3556.  
  3557.         case else
  3558.             intFourCC = WMV9_FOURCC
  3559.     end select
  3560.     
  3561.     GetVideoCodecIndex = g_objProfile.GetCodecIndexFromFourCC(WMENC_VIDEO, intFourCC)
  3562.  
  3563. end function
  3564.  
  3565. ' Setup a new profile based on predefined profiles
  3566. function SetupCustomProfile(objAudience)
  3567.     dim intAudioCodecIndex, intVideoCodecIndex
  3568.     dim blnRet
  3569.  
  3570.     if not g_blnAudioOnly and not g_blnVideoOnly  then
  3571.         if g_strVideoCodec = UNCOMP and g_strAudioCodec <> PCM then
  3572.             OutputInfo "Audio codec must be uncompressed when using uncompressed video codec"
  3573.             SetupCustomProfile = false
  3574.             exit function
  3575.         end if
  3576.  
  3577.         if g_strVideoCodec <> UNCOMP and g_strAudioCodec = PCM then
  3578.             OutputInfo "Video codec must be uncompressed when using uncompressed audio codec"
  3579.             SetupCustomProfile = false
  3580.             exit function
  3581.         end if    
  3582.     end if
  3583.  
  3584.     if not isnull( g_objAudioSource ) then
  3585.         blnRet = SetupCustomAudioProfile( objAudience )
  3586.         if not blnRet then
  3587.             SetupCustomProfile = false
  3588.             exit function
  3589.         end if
  3590.     end if
  3591.  
  3592.     if not isnull( g_objVideoSource ) then
  3593.         blnRet = SetupCustomVideoProfile( objAudience )
  3594.         if not blnRet then
  3595.             SetupCustomProfile = false
  3596.             exit function
  3597.         end if
  3598.     end if
  3599.  
  3600.     SetupCustomProfile = true
  3601.  
  3602. end function
  3603.  
  3604. ' Setup the audio part of the custom profile
  3605. function SetupCustomAudioProfile(objAudience)
  3606.     on error resume next
  3607.  
  3608.     ' Setup audio
  3609.     dim intAudioCodecIndex, intAudioBitrate, intAudioSampleRate, intAudioChannels, intBitDepth, intFourCC
  3610.     dim strTemp
  3611.     dim intNextArgStart, intNextArgEnd
  3612.     dim blnAudioQuality, blnValidBitrate, blnValidSampleRate, blnValidChannels, blnValidBitDepth
  3613.  
  3614.  
  3615.     'Set audio vbr mode
  3616.     if g_intAudioVBRMode <> -1 then
  3617.         select case g_intAudioVBRMode
  3618.             case 0 ' 1 pass CBR
  3619.  
  3620.             case 1 ' 2 pass CBR
  3621.                 g_objAudioSource.PreProcessPass = 1
  3622.  
  3623.             case 2 ' Quality VBR mode
  3624.                 g_objProfile.VBRMode(WMENC_AUDIO, 0) = WMENC_PVM_UNCONSTRAINED
  3625.  
  3626.             case 3 ' 2 pass bitrate based VBR
  3627.                 g_objProfile.VBRMode(WMENC_AUDIO, 0) = WMENC_PVM_BITRATE_BASED
  3628.                 g_objAudioSource.PreProcessPass = 1
  3629.  
  3630.             case 4 ' 2 pass bitrate-based peak constrained VBR
  3631.                 g_objProfile.VBRMode(WMENC_AUDIO, 0) = WMENC_PVM_PEAK
  3632.                 g_objAudioSource.PreProcessPass = 1
  3633.  
  3634.             case else
  3635.                 OutputInfo "Invalid -a_mode <mode_number>"
  3636.                 SetupCustomAudioProfile = false
  3637.                 exit function
  3638.         end select
  3639.     end if
  3640.  
  3641.  
  3642.     ' Set audio codec
  3643.     if g_strAudioCodec <> "" then
  3644.         intAudioCodecIndex = GetAudioCodecIndex(g_strAudioCodec)
  3645.         intFourCC = g_objProfile.EnumAudioCodec(intAudioCodecIndex, g_strAudioCodecName)
  3646.         objAudience.AudioCodec(0) = intAudioCodecIndex
  3647.     end if
  3648.  
  3649.     'Parse the a_setting string to extract audio bitrate sample rate and stuff like that
  3650.     if g_strAudioSetting <> "" then
  3651.         intNextArgStart = instr(g_strAudioSetting, "_")
  3652.         strTemp = left(g_strAudioSetting, intNextArgStart-1)
  3653.     
  3654.         if ucase( left(strTemp, 1) ) = "Q" then
  3655.             g_intAudioVBRMode = 2
  3656.             g_objProfile.VBRMode(WMENC_AUDIO, 0) = WMENC_PVM_UNCONSTRAINED
  3657.  
  3658.             blnAudioQuality = true
  3659.             intAudioBitrate = ConvertStringToInteger( mid(strTemp, 2 ) )
  3660.         else
  3661.             intAudioBitrate = ConvertStringToInteger( strTemp )
  3662.         end if
  3663.  
  3664.         'OutputInfo "****Audio bit rate is " & intAudioBitrate
  3665.  
  3666.         intNextArgEnd = instr(intNextArgStart+1, g_strAudioSetting, "_")
  3667.         strTemp = mid(g_strAudioSetting, intNextArgStart+1, intNextArgEnd-intNextArgStart-1)
  3668.         intAudioSampleRate = ConvertStringToInteger( strTemp )
  3669.         'OutputInfo "****Audio sample rate is " & intAudioSampleRate
  3670.     
  3671.         intNextArgStart = intNextArgEnd
  3672.         intNextArgEnd = instr(intNextArgStart+1, g_strAudioSetting, "_")
  3673.         if intNextArgEnd > 0 then
  3674.             strTemp = mid(g_strAudioSetting, intNextArgStart+1, intNextArgEnd-intNextArgStart-1)
  3675.         else
  3676.             strTemp = mid(g_strAudioSetting, intNextArgStart+1)
  3677.         end if
  3678.         intAudioChannels = ConvertStringToInteger( strTemp )
  3679.         'OutputInfo "****Audio channels are " & intAudioChannels
  3680.  
  3681.         if intNextArgEnd > 0 then
  3682.             strTemp = mid(g_strAudioSetting, intNextArgEnd+1)
  3683.             intBitDepth = ConvertStringToInteger( strTemp )
  3684.         else
  3685.             intBitDepth = 16
  3686.         end if
  3687.         'OutputInfo "****Audio bit depth is " & intBitDepth
  3688.  
  3689.         if intAudioBitrate = -1 or intAudioSampleRate = -1 or intAudioChannels = -1 or intBitDepth = -1 then
  3690.             SetupCustomAudioProfile = false
  3691.             err.Raise &H80070057
  3692.             exit function
  3693.         end if
  3694.  
  3695.         'Convert bitrate and samplerate to actual values
  3696.         if blnAudioQuality = false then
  3697.             if intAudioBitrate = 1411 then
  3698.                 intAudioBitrate = 1411200
  3699.             elseif intAudioBitrate = 705 then
  3700.                 intAudioBitrate = 705600
  3701.             elseif intAudioBitrate = 353 then
  3702.                 intAudioBitrate = 352800
  3703.             else
  3704.                 intAudioBitrate = 1000 * intAudioBitrate
  3705.             end if
  3706.         end if
  3707.  
  3708.         ' For peak vbr mode set peakbitrate and peak buffer
  3709.         if g_objProfile.VBRMode(WMENC_AUDIO, 0) = WMENC_PVM_PEAK then
  3710.             if g_intAudioPeakBuffer <> -1 then
  3711.                 objAudience.AudioBufferMax(0) = g_intAudioPeakBuffer
  3712.             end if
  3713.  
  3714.             if g_intAudioPeakBitrate = -1 then
  3715.                 objAudience.AudioPeakBitrate(0) = 1.5 * intAudioBitrate
  3716.             else
  3717.                 objAudience.AudioPeakBitrate(0) = g_intAudioPeakBitrate
  3718.             end if
  3719.             'OutputInfo "****Audio peak bit rate is " & objAudience.AudioPeakbitrate(0)
  3720.             'OutputInfo "****Audio peak buffer is " & objAudience.AudioBufferMax(0)
  3721.         end if
  3722.  
  3723.         if intAudioSampleRate = 96 then
  3724.             intAudioSampleRate = 96000
  3725.         elseif intAudioSampleRate = 88 then
  3726.             intAudioSampleRate = 88200
  3727.         elseif intAudioSampleRate = 48 then
  3728.             intAudioSampleRate = 48000
  3729.         elseif intAudioSampleRate = 44 then
  3730.             intAudioSampleRate = 44100
  3731.         elseif intAudioSampleRate = 22 then
  3732.             intAudioSampleRate = 22050
  3733.         elseif intAudioSampleRate = 11 then
  3734.             intAudioSampleRate = 11025
  3735.         else
  3736.             intAudioSampleRate = 1000 * intAudioSampleRate
  3737.         end if
  3738.  
  3739.         ' Validate values for bitrate, samplerate, channels and depth 
  3740.         if blnAudioQuality = false then
  3741.             blnValidBitrate = CheckForValidAudioBitRates( intAudioBitrate )
  3742.             if blnValidBitrate = false then 
  3743.                 OutputInfo "Invalid audio bit rate " & intAudioBitrate
  3744.                 SetupCustomAudioProfile = false
  3745.                 exit function
  3746.             end if
  3747.         end if
  3748.  
  3749.         blnValidSampleRate = CheckForValidAudioSamplingRates( intAudioSampleRate )
  3750.         if blnValidSampleRate = false then 
  3751.             OutputInfo "Invalid audio sample rate " & intAudioSampleRate
  3752.             SetupCustomAudioProfile = false
  3753.             exit function
  3754.         end if
  3755.  
  3756.         blnValidChannels = CheckForValidAudioChannel( intAudioChannels )
  3757.         if blnValidChannels = false then 
  3758.             OutputInfo "Invalid audio channels " & intAudioChannels
  3759.             SetupCustomAudioProfile = false
  3760.             exit function
  3761.         end if
  3762.  
  3763.         blnValidBitDepth = CheckForValidDepth( intBitDepth )
  3764.         if blnValidBitDepth = false then 
  3765.             OutputInfo "Invalid bits per sample " & intBitDepth
  3766.             SetupCustomAudioProfile = false
  3767.             exit function
  3768.         end if
  3769.  
  3770.         objAudience.SetAudioConfig 0, intAudioChannels, intAudioSampleRate, intAudioBitrate, intBitDepth
  3771.     end if
  3772.  
  3773.     SetupCustomAudioProfile = true
  3774.  
  3775. end function
  3776.  
  3777. ' Setup the video part of the custom profile
  3778. function SetupCustomVideoProfile(objAudience)
  3779.     on error resume next
  3780.  
  3781.     ' Setup audio
  3782.     dim intVideoCodecIndex, intFourCC
  3783.  
  3784.     'Set video vbr mode
  3785.     if g_intVideoVBRMode <> -1 then
  3786.         select case g_intVideoVBRMode
  3787.             case 0 ' 1 pass CBR
  3788.  
  3789.             case 1 ' 2 pass CBR
  3790.                 g_objVideoSource.PreProcessPass = 1
  3791.  
  3792.             case 2 ' Quality VBR mode
  3793.                 g_objProfile.VBRMode(WMENC_VIDEO, 0) = WMENC_PVM_UNCONSTRAINED
  3794.  
  3795.             case 3 ' 2 pass bitrate based VBR
  3796.                 g_objProfile.VBRMode(WMENC_VIDEO, 0) = WMENC_PVM_BITRATE_BASED
  3797.                 g_objVideoSource.PreProcessPass = 1
  3798.  
  3799.             case 4 ' 2 pass bitrate-based peak constrained VBR
  3800.                 g_objProfile.VBRMode(WMENC_VIDEO, 0) = WMENC_PVM_PEAK            
  3801.                 g_objVideoSource.PreProcessPass = 1
  3802.  
  3803.             case else
  3804.                 OutputInfo "Invalid -v_mode <mode_number>"
  3805.                 SetupCustomVideoProfile = false
  3806.                 exit function
  3807.  
  3808.         end select
  3809.     end if
  3810.  
  3811.     ' Set video codec
  3812.     if g_strVideoCodec <> "" then
  3813.         intVideoCodecIndex = GetVideoCodecIndex(g_strVideoCodec)
  3814.         intFourCC = g_objProfile.EnumVideoCodec(intVideoCodecIndex, g_strVideoCodecName)
  3815.  
  3816.         objAudience.VideoCodec(0) = intVideoCodecIndex
  3817.     end if
  3818.  
  3819.     if g_intVideoBitrate <> -1 then
  3820.         objAudience.VideoBitrate(0) = g_intVideoBitrate
  3821.     end if
  3822.  
  3823.     if g_intVideoWidth <> -1 then
  3824.         objAudience.VideoWidth(0) = g_intVideoWidth
  3825.     end if
  3826.  
  3827.     if g_intVideoHeight <> -1 then
  3828.         objAudience.VideoHeight(0) = g_intVideoHeight
  3829.     end if
  3830.  
  3831.     if g_intVideoFramerate <> -1 then
  3832.         objAudience.VideoFPS(0) = g_intVideoFramerate
  3833.     end if
  3834.  
  3835.     if g_intVideoKeydist <> -1 then
  3836.         objAudience.VideoKeyFrameDistance(0) = g_intVideoKeydist
  3837.     end if
  3838.  
  3839.     if g_intVideoBuffer <> -1 then
  3840.         objAudience.VideoBufferSize(0) = g_intVideoBuffer
  3841.     end if
  3842.  
  3843.     ' For quality vbr mode use intSmoothness as VBR quality
  3844.     if g_objProfile.VBRMode(WMENC_VIDEO, 0) = WMENC_PVM_UNCONSTRAINED then
  3845.         if (g_intVideoQP <> -1) and (g_intVideoQuality = -1) then
  3846.             g_intVideoQuality = Int((31.01 - g_intVideoQP) / 0.3)
  3847.         end if
  3848.         if g_intVideoQuality <> -1 then
  3849.             objAudience.VideoCompressionQuality(0) = g_intVideoQuality
  3850.         end if
  3851.     else
  3852.         if g_intVideoQuality <> -1 then
  3853.             objAudience.VideoImageSharpness(0) = g_intVideoQuality
  3854.         end if
  3855.     end if
  3856.  
  3857.     ' For peak vbr mode set peakbitrate and peak buffer
  3858.     if g_objProfile.VBRMode(WMENC_VIDEO, 0) = WMENC_PVM_PEAK then
  3859.         if g_intVideoPeakBuffer <> -1 then
  3860.             objAudience.VideoBufferMax(0) = g_intVideoPeakBuffer
  3861.         end if
  3862.  
  3863.         if g_intVideoPeakBitrate <> -1 then
  3864.             if objAudience.VideoBitrate(0) > g_intVideoPeakBitrate then
  3865.                 objAudience.VideoBitrate(0) = g_intVideoPeakBitrate
  3866.             end if
  3867.             objAudience.VideoPeakBitrate(0) = g_intVideoPeakBitrate
  3868.         end if
  3869.     end if
  3870.  
  3871.     ' Setup video device conformance
  3872.     if g_strVideoDevConf <> "" then
  3873.         objAudience.Property( WMENC_VIDEO, 0, "DeviceConformanceTarget") = g_strVideoDevConf
  3874.     end if
  3875.  
  3876.     SetupCustomVideoProfile = true
  3877. end function
  3878.  
  3879.  
  3880. ' Load the default profile settings
  3881. function LoadProfileDefaults()
  3882.     dim argsArray
  3883.  
  3884.     ' Audio profile settings
  3885.     ' Set default codec and/or VBR mode when appropriate
  3886.  
  3887.     if g_strAudioSetting <> "" then
  3888.         argsArray = Split ( g_strAudioSetting, "_" )
  3889.         if UBound( argsArray ) = 3 and left(g_strAudioSetting, 4) <> "Q100" then
  3890.             g_strAudioCodec = WMAPRO
  3891.         end if
  3892.     end if
  3893.  
  3894.  
  3895.     if g_intAudioVBRMode = -1 then
  3896.         g_intAudioVBRMode = 0
  3897.     end if
  3898.  
  3899.     if g_strAudioCodec = "" then
  3900.         g_strAudioCodec = "WMASTD"
  3901.     end if
  3902.  
  3903.     if g_intAudioPeakBuffer = -1 then
  3904.         g_intAudioPeakBuffer = 3000
  3905.     end if
  3906.  
  3907.     ' Set default -a_setting based on format and mode
  3908.     if g_strAudioSetting = "" then
  3909.         if g_intAudioVBRMode = 2 and g_strAudioCodec = WMAPRO then
  3910.             g_strAudioSetting = "Q75_44_2_24"
  3911.         elseif g_intAudioVBRMode = 2 and g_strAudioCodec = WMALSL then
  3912.             g_strAudioSetting = "Q100_44_2_16"
  3913.         elseif g_intAudioVBRMode = 2 then
  3914.             g_strAudioSetting = "Q75_44_2"
  3915.         elseif g_intAudioVBRMode = 0 and g_strAudioCodec = WMSPEECH then
  3916.             g_strAudioSetting = "12_16_1"
  3917.         elseif g_intAudioVBRMode = 0 and g_strAudioCodec = PCM then
  3918.             g_strAudioSetting = "705_22_2"
  3919.         elseif g_strAudioCodec = WMAPRO then
  3920.             g_strAudioSetting = "128_44_2_24"
  3921.         else
  3922.             g_strAudioSetting = "64_44_2"
  3923.         end if
  3924.     end if
  3925.  
  3926.     ' Video profile settings
  3927.     if g_intVideoVBRMode = -1 then
  3928.         g_intVideoVBRMode = 0
  3929.     end if
  3930.  
  3931.     if g_strVideoCodec = "" then
  3932.         g_strVideoCodec = "WMV9"
  3933.     end if
  3934.  
  3935.     if g_intVideoBitrate = -1 then
  3936.         g_intVideoBitrate = 250000
  3937.     end if
  3938.  
  3939.     if g_intVideoWidth = -1 then
  3940.         g_intVideoWidth = 0
  3941.     end if
  3942.  
  3943.     if g_intVideoHeight = -1 then
  3944.         g_intVideoHeight = 0
  3945.     end if
  3946.  
  3947.     if g_intVideoKeydist = -1 then
  3948.         g_intVideoKeydist = 10000
  3949.     end if
  3950.  
  3951.     if g_intVideoBuffer = -1 then 
  3952.         g_intVideoBuffer = 5000
  3953.     end if
  3954.  
  3955.     if g_intVideoPeakBuffer = -1 then
  3956.         g_intVideoPeakBuffer = 5000
  3957.     end if
  3958.  
  3959.  
  3960.     if g_intVideoPeakBitrate = -1 then
  3961.         g_intVideoPeakBitrate = 1.5 * g_intVideoBitrate
  3962.     end if
  3963.  
  3964.     if g_intVideoQuality = -1 then
  3965.         if g_intVideoVBRMode = 2 then
  3966.             g_intVideoQuality = 95
  3967.         else
  3968.             g_intVideoQuality = 75
  3969.         end if
  3970.     end if
  3971. end function
  3972.  
  3973. ' Setup time configuration
  3974. function SetupTime()
  3975.     if g_blnDevice then
  3976.         ' Duration must be specified when capture from a live device.
  3977.         if g_intDuration = -1 then
  3978.             OutputInfo "Duration must be specified when capturing from devices."
  3979.             SetupTime = false
  3980.             exit function
  3981.         end if
  3982.     end if
  3983.  
  3984.     ' Setup markin and markout
  3985.     if g_intMarkInTime <> -1 then
  3986.         
  3987.         ' Set start time for audio source (mark in) if it has a audio stream.
  3988.         if not IsNull(g_objAudioSource) then
  3989.             g_objAudioSource.MarkIn = g_intMarkInTime
  3990.         end if
  3991.     
  3992.         ' Set start time for video source (mark in) if it has a video stream.
  3993.         if not IsNull(g_objVideoSource) then
  3994.             g_objVideoSource.MarkIn = g_intMarkInTime
  3995.         end if
  3996.     end if
  3997.  
  3998.     ' Is a mark out time provided?
  3999.     if g_intMarkOutTime <> -1 then
  4000.         
  4001.         ' Set end time for audio source (mark out) if it has a audio stream.
  4002.         if not IsNull(g_objAudioSource) then
  4003.             g_objAudioSource.MarkOut = g_intMarkOutTime
  4004.         end if
  4005.         
  4006.         ' Set end time for video source (mark out) if it has a video stream.
  4007.         if not IsNull(g_objVideoSource) then
  4008.             g_objVideoSource.MarkOut = g_intMarkOutTime
  4009.         end if
  4010.     end if
  4011.  
  4012.     SetupTime = true
  4013. end function
  4014.  
  4015. ' Transcode 
  4016. function Transcode()
  4017.     on error resume next
  4018.     
  4019.     ' Prepare to encode
  4020.     g_objEncoder.PrepareToEncode( true )
  4021.  
  4022.     ' Check if we got an error saying markout is greater that end of file. If so set markout to end of file
  4023.     if err.number = -1072882855 then
  4024.         err.Clear
  4025.  
  4026.         if not IsNull(g_objAudioSource) then
  4027.             g_objAudioSource.MarkOut = 0
  4028.         end if
  4029.         
  4030.         if not IsNull(g_objVideoSource) then
  4031.             g_objVideoSource.MarkOut = 0
  4032.         end if
  4033.  
  4034.         g_objEncoder.PrepareToEncode( true )
  4035.     elseif err.number <> 0 then
  4036.         Transcode = false
  4037.         OutputInfo "Prepare to encode failed with error " & err.Number & " " & err.Description
  4038.         exit function
  4039.     end if
  4040.  
  4041.     ' Start encoder
  4042.     g_intErrorCode = 0
  4043.     g_objEncoder.Start()
  4044.     if err.number <> 0 then
  4045.         Transcode = false
  4046.         OutputInfo "Start encoder failed with error " & err.Number & " " & err.Description
  4047.         exit function
  4048.     end if
  4049.  
  4050.     g_tStartTime = Now()
  4051.     
  4052.     ' Wait for start event
  4053.     while not g_blnEncoderStarted and g_intErrorCode = 0
  4054.         WScript.Sleep( 1000 )
  4055.     wend
  4056.     
  4057.     'Once the encoder has started it's safe to clear and restore registry settings
  4058.     if g_strVideoCodec = WVC1 or g_strVideoCodec = WMV9 then
  4059.         ClearEncoderRegistrySettings()
  4060.         RestoreEncoderRegistrySettings()
  4061.         g_objWshShell.RegDelete g_strVideoEncoderRegistryKey & "\WMCmdDirtyFlag"
  4062.     end if
  4063.     
  4064.     on error goto 0
  4065.     
  4066.     if g_intDuration >= 0 then
  4067.         ' Wait for time
  4068.         OutputInfo "Wait for " & g_intDuration & " seconds to stop encoder..."
  4069.  
  4070.         dim t1, t2
  4071.         
  4072.         t1 = Now()
  4073.  
  4074.         ' Wait until an error code is received
  4075.         do while g_intErrorCode = 0
  4076.             WScript.Sleep( 1000 )
  4077.  
  4078.             t2 = Now()
  4079.  
  4080.             if DateDiff( "s", t1, t2 ) >= g_intDuration then
  4081.                 OutputInfo "Duration time is reached. Stop encoder..."
  4082.                 g_objEncoder.Stop()
  4083.                 exit do
  4084.             end if
  4085.  
  4086.             if g_objEncoder.RunState = WMENC_ENCODER_STOPPED then
  4087.                 OutputInfo "Encoding completed before duration time is reached."
  4088.                 exit do
  4089.             end if
  4090.         loop
  4091.     else
  4092.         ShowProgress
  4093.     end if
  4094.  
  4095.     while not g_blnEncoderStopped and g_intErrorCode = 0
  4096.         WScript.Sleep( 1000 )
  4097.     wend
  4098.  
  4099.     ' Check error event
  4100.     if g_intErrorCode = 0 then
  4101.         OutputInfo "======== Encoding Completed ========"
  4102.         Transcode = true
  4103.     else
  4104.         OutputInfo "Error occurred in transcoding: Error Code = 0x" & Hex( g_intErrorCode )
  4105.         Transcode = false
  4106.     end if
  4107.  
  4108. end function
  4109.  
  4110. ' Show statistics information of output
  4111. function ShowStatistics()
  4112.     dim objProfile
  4113.  
  4114.     ' Output statistics for audio stream
  4115.     if not IsNull(g_objAudioSource) then
  4116.         dim objAudioStats
  4117.         
  4118.         set objAudioStats = g_objEncoder.Statistics.StreamOutputStats( WMENC_AUDIO, 0, 0 )
  4119.  
  4120.         OutputInfo ""
  4121.         OutputInfo "Audio :"
  4122.         OutputInfo vbTab & "Codec: " & g_strAudioCodecName
  4123.         if g_intAudioVBRMode <> 2 then
  4124.             OutputInfo vbTab & "Expected bit rate: " & vbTab & objAudioStats.ExpectedBitrate & " bps"
  4125.         end if
  4126.         OutputInfo vbTab & "Average bit rate: " & vbTab & objAudioStats.AverageBitrate & " bps"
  4127.         OutputInfo vbTab & "Expected sample rate: " & vbTab & objAudioStats.ExpectedSampleRate
  4128.         OutputInfo vbTab & "Average sample rate: " & vbTab & objAudioStats.AverageSampleRate & ""
  4129.         OutputInfo vbTab & "Dropped byte count: " & vbTab & objAudioStats.DroppedByteCount*10000 & " bytes"
  4130.         OutputInfo vbTab & "Dropped sample rate: " & vbTab & objAudioStats.DroppedSampleCount*10000 & ""
  4131.         OutputInfo vbTab & "Total bytes: " & vbTab & vbTab & objAudioStats.ByteCount*10000 & " bytes"
  4132.     end if
  4133.  
  4134.     if not IsNull(g_objVideoSource) then
  4135.         dim objVideoStats
  4136.         
  4137.         set objVideoStats = g_objEncoder.Statistics.StreamOutputStats( WMENC_VIDEO, 0, 0 )
  4138.  
  4139.         OutputInfo ""
  4140.         OutputInfo "Video :"
  4141.         OutputInfo vbTab & "Codec: " & g_strVideoCodecName
  4142.         if g_intVideoVBRMode <> 2 then
  4143.             OutputInfo vbTab & "Expected bit rate: " & vbTab & objVideoStats.ExpectedBitrate & " bps"
  4144.         end if
  4145.         OutputInfo vbTab & "Average bit rate: " & vbTab & objVideoStats.AverageBitrate & " bps"
  4146.         OutputInfo vbTab & "Expected fps: " & vbTab & vbTab & objVideoStats.ExpectedSampleRate / 1000
  4147.         OutputInfo vbTab & "Dropped frame count: " & vbTab & objVideoStats.DroppedSampleCount*10000 & ""
  4148.         OutputInfo vbTab & "Total coded frames: " & vbTab & objVideoStats.SampleCount*10000 & ""
  4149.         OutputInfo vbTab & "Average sample rate: " & vbTab & objVideoStats.AverageSampleRate / 1000 & ""
  4150.         OutputInfo vbTab & "Dropped bytes: " & vbTab & vbTab & objVideoStats.DroppedByteCount*10000 & " bytes"
  4151.         OutputInfo vbTab & "Total bytes: " & vbTab & vbTab & objVideoStats.ByteCount*10000 & " bytes"
  4152.     end if
  4153.  
  4154.     ' Output statistics information of output stream
  4155.     OutputInfo ""
  4156.     OutputInfo "Overall:"
  4157.     OutputInfo vbTab & "Encoding time: " & vbTab & vbTab & DateDiff( "s", g_tStartTime, g_tStopTime ) & " seconds"
  4158.     OutputInfo vbTab & "Average bit rate: " & vbTab & g_objEncoder.Statistics.WMFOutputStats.AverageBitrate & " bps"
  4159.     
  4160.     if g_strOutput <> "" then
  4161.         dim objFileStats
  4162.         
  4163.         set objFileStats = g_objEncoder.Statistics.FileArchiveStats
  4164.     
  4165.         OutputInfo vbTab & "File size: " & vbTab & vbTab & objFileStats.FileSize*10000 & " bytes "
  4166.         OutputInfo vbTab & "File duration: " & vbTab & vbTab & objFileStats.FileDuration*10 & " seconds "
  4167.     end if
  4168.  
  4169. end function
  4170.  
  4171. ' Setup input configuration
  4172. function SetupInput()
  4173.     dim strDeviceName
  4174.  
  4175.     ' The input file name is used if it is not empty, otherwise device index is used.
  4176.     if g_strInput <> "" then
  4177.         dim strInput2
  4178.                 
  4179.         strInput2 = g_objFileSystem.GetAbsolutePathName( g_strInput )
  4180.  
  4181.         on error resume next
  4182.  
  4183.         ' Check for file existance
  4184.         if not g_objFileSystem.FileExists(strInput2) then
  4185.             err.Raise(53)
  4186.             OutputInfo "Input Error: 0x" & Hex(err.number) & " - " & err.description
  4187.             err.Clear
  4188.             SetupInput = false
  4189.             exit function
  4190.         end if
  4191.  
  4192.         if g_strProfile <> "" then
  4193.             dim strProfileName
  4194.  
  4195.             strProfileName = LCase( g_strProfile )
  4196.             if Left( strProfileName, 1) = "a" and Mid( strProfileName, 2, 1 ) <> "v"  then
  4197.                  g_blnAudioOnly = true
  4198.             elseif Left( strProfileName, 1) = "v" then
  4199.                 g_blnVideoOnly = true
  4200.             end if
  4201.         end if
  4202.         
  4203.         ' Check for existance of alternate audio input
  4204.         if g_strAudioInput <> "" then
  4205.             dim strAudioInput2
  4206.             
  4207.             strAudioInput2 = g_objFileSystem.GetAbsolutePathName( g_strAudioInput )
  4208.  
  4209.             ' Check for file existance
  4210.             if not g_objFileSystem.FileExists(strAudioInput2) then
  4211.                 err.Raise(53)
  4212.                 OutputInfo "Audio Input Error: 0x" & Hex(err.number) & " - " & err.description
  4213.                 err.Clear
  4214.                 SetupInput = false
  4215.                 exit function
  4216.             end if
  4217.  
  4218.         end if
  4219.  
  4220.         ' Add this file into the source group.
  4221.         if g_blnAudioOnly then
  4222.             set g_objAudioSource = g_objSourceGroup.AddSource( WMENC_AUDIO )
  4223.             g_objAudioSource.SetInput( strInput2 )
  4224.         elseif g_blnVideoOnly then
  4225.             set g_objVideoSource = g_objSourceGroup.AddSource( WMENC_VIDEO )
  4226.             g_objVideoSource.SetInput( strInput2 )
  4227.         
  4228.         ' If alternate audio source is defined, add video and audio sources separately
  4229.         elseif strAudioInput2 <> "" then
  4230.             set g_objVideoSource = g_objSourceGroup.AddSource( WMENC_VIDEO )
  4231.             g_objVideoSource.SetInput( strInput2 )
  4232.             set g_objAudioSource = g_objSourceGroup.AddSource( WMENC_AUDIO )
  4233.             g_objAudioSource.SetInput( strAudioInput2 )
  4234.         
  4235.         ' Otherwise just automatically parse the single intput for streams
  4236.         else
  4237.             g_objSourceGroup.AutoSetFileSource( strInput2 )
  4238.  
  4239.             ' If source file has an auido stream, get the audio source.
  4240.             if g_objSourceGroup.SourceCount( WMENC_AUDIO ) > 0 then
  4241.                 set g_objAudioSource = g_objSourceGroup.Source( WMENC_AUDIO, 0 )
  4242.             end if
  4243.  
  4244.             ' If source file has a video stream, get the video source.
  4245.             if g_objSourceGroup.SourceCount( WMENC_VIDEO ) > 0 then
  4246.                 set g_objVideoSource = g_objSourceGroup.Source( WMENC_VIDEO, 0 )
  4247.             end if
  4248.  
  4249.         end if
  4250.     elseif g_intAudioDevice <> -1 or g_intVideoDevice <> -1 then
  4251.         if g_intAudioDevice <> -1 then
  4252.             strDeviceName = GetDeviceNameFromIndex( WMENC_AUDIO, g_intAudioDevice )
  4253.             if strDeviceName = "" then
  4254.                 OutputInfo "Error: Invalid audio device number specified" 
  4255.                 SetupInput = false
  4256.                 exit function
  4257.             end if
  4258.             set g_objAudioSource = g_objSourceGroup.AddSource( WMENC_AUDIO )
  4259.             g_objAudioSource.SetInput strDeviceName, "device"
  4260.         end if
  4261.  
  4262.         if g_intVideoDevice <> -1 then
  4263.             strDeviceName = GetDeviceNameFromIndex( WMENC_VIDEO, g_intVideoDevice )
  4264.             if strDeviceName = "" then
  4265.                 OutputInfo "Error: Invalid video device number specified" 
  4266.                 SetupInput = false
  4267.                 exit function
  4268.             end if
  4269.             
  4270.             set g_objVideoSource = g_objSourceGroup.AddSource( WMENC_VIDEO )
  4271.             g_objVideoSource.SetInput strDeviceName, "device"
  4272.         end if
  4273.         
  4274.     end if
  4275.  
  4276.     if g_objSourceGroup.SourceCount( WMENC_AUDIO ) and g_objSourceGroup.SourceCount( WMENC_VIDEO ) then
  4277.         g_intSessionType = WMENC_CONTENT_ONE_AUDIO_ONE_VIDEO
  4278.     elseif g_objSourceGroup.SourceCount( WMENC_AUDIO ) then
  4279.         g_intSessionType = WMENC_CONTENT_ONE_AUDIO
  4280.     elseif g_objSourceGroup.SourceCount( WMENC_VIDEO ) then
  4281.         g_intSessionType = WMENC_CONTENT_ONE_VIDEO
  4282.     end if
  4283.  
  4284.     ' Set audio setting for speech
  4285.     if not IsNull(g_objAudioSource) then
  4286.         SetupAudioSource()
  4287.     end if
  4288.  
  4289.     ' Set video settings
  4290.     if not IsNull(g_objVideoSource) then
  4291.         SetupVideoSource()
  4292.     end if
  4293.    
  4294.     if err.number <> 0 then
  4295.         OutputInfo "Error: 0x" & Hex(err.number) & " - " & err.description
  4296.         err.Clear
  4297.         SetupInput = false
  4298.         exit function
  4299.     end if
  4300.  
  4301.     SetupInput = true
  4302. end function
  4303.  
  4304. 'Set speech related settings on audio source
  4305. function SetupAudioSource()
  4306.     if g_intAudioSpeechContent <> -1 then
  4307.         g_objAudioSource.contentmode = g_intAudioSpeechContent
  4308.     end if
  4309.     if g_strAudioSpeechEdl <> "" then
  4310.         g_objAudioSource.contentedl = g_strAudioSpeechEdl
  4311.     end if
  4312. end function
  4313.  
  4314. 'Set settings on video source
  4315. function SetupVideoSource()
  4316.     ' Set video preprocess
  4317.     select case g_intVideoPreprocess
  4318.         case 0 
  4319.             g_objVideoSource.Optimization = WMENC_VIDEO_STANDARD
  4320.         case 1
  4321.             g_objVideoSource.Optimization = WMENC_VIDEO_DEINTERLACE
  4322.         case 2
  4323.             g_objVideoSource.Optimization = WMENC_VIDEO_DEINTERLACE
  4324.         case 3
  4325.             g_objVideoSource.Optimization = WMENC_VIDEO_DEINTERLACE
  4326.         case 4
  4327.             g_objVideoSource.Optimization = WMENC_VIDEO_DEINTERLACE
  4328.         case 5
  4329.             g_objVideoSource.Optimization = WMENC_VIDEO_INVERSETELECINE
  4330.         case 6
  4331.             g_objVideoSource.Optimization = WMENC_VIDEO_TELECINE_AA_TOP
  4332.         case 7
  4333.             g_objVideoSource.Optimization = WMENC_VIDEO_TELECINE_BB_TOP
  4334.         case 8
  4335.             g_objVideoSource.Optimization = WMENC_VIDEO_TELECINE_BC_TOP
  4336.         case 9
  4337.             g_objVideoSource.Optimization = WMENC_VIDEO_TELECINE_CD_TOP
  4338.         case 10
  4339.             g_objVideoSource.Optimization = WMENC_VIDEO_TELECINE_DD_TOP
  4340.         case 11
  4341.             g_objVideoSource.Optimization = WMENC_VIDEO_TELECINE_AA_BOTTOM
  4342.         case 12
  4343.             g_objVideoSource.Optimization = WMENC_VIDEO_TELECINE_BB_BOTTOM
  4344.         case 13
  4345.             g_objVideoSource.Optimization = WMENC_VIDEO_TELECINE_BC_BOTTOM
  4346.         case 14
  4347.             g_objVideoSource.Optimization = WMENC_VIDEO_TELECINE_CD_BOTTOM
  4348.         case 15
  4349.             g_objVideoSource.Optimization = WMENC_VIDEO_TELECINE_DD_BOTTOM
  4350.         case 16
  4351.             g_objVideoSource.Optimization = WMENC_VIDEO_INTERLACED_AUTO
  4352.         case 17
  4353.             g_objVideoSource.Optimization = WMENC_VIDEO_INTERLACED_TOP_FIRST
  4354.         case 18
  4355.             g_objVideoSource.Optimization = WMENC_VIDEO_INTERLACED_BOTTOM_FIRST
  4356.     end select
  4357.  
  4358.     'Set pixelformat
  4359.     select case ucase( g_strPixelFormat )
  4360.         case "I420"
  4361.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_I420
  4362.         case "IYUV"
  4363.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_IYUV
  4364.         case "RGB24"
  4365.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_RGB24
  4366.         case "RGB32"
  4367.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_RGB32 
  4368.         case "RGB555"
  4369.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_RGB555 
  4370.         case "RGB565"
  4371.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_RGB565
  4372.         case "RGB8"
  4373.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_RGB8
  4374.         case "UYVY"
  4375.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_UYVY
  4376.         case "YUY2"
  4377.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_YUY2
  4378.         case "YV12"
  4379.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_YV12 
  4380.         case "YVU9"
  4381.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_YVU9 
  4382.         case "YVYU"
  4383.             g_objVideoSource.PixelFormat = WMENC_PIXELFORMAT_YVYU 
  4384.     end select
  4385.  
  4386.     'Set pixel aspect ratio
  4387.     if g_intPixelAspectRatioX <> -1 then
  4388.         g_objVideoSource.PixelAspectRatioX = g_intPixelAspectRatioX
  4389.     end if
  4390.  
  4391.     if g_intPixelAspectRatioY <> -1 then
  4392.         g_objVideoSource.PixelAspectRatioY = g_intPixelAspectRatioY
  4393.     end if
  4394.  
  4395.  
  4396.     'Set performance
  4397.     if g_intVideoPerformance <> -1 then
  4398.         g_objEncoder.VideoComplexity = g_intVideoPerformance
  4399.     end if
  4400.  
  4401.     'Set clipping margins
  4402.     if g_intClipLeft <> -1 then
  4403.         g_objVideoSource.CroppingLeftMargin = g_intClipLeft
  4404.     end if
  4405.  
  4406.     if g_intClipRight <> -1 then
  4407.         g_objVideoSource.CroppingRightMargin = g_intClipRight
  4408.     end if
  4409.  
  4410.     if g_intClipTop <> -1 then
  4411.         g_objVideoSource.CroppingTopMargin = g_intClipTop
  4412.     end if
  4413.  
  4414.     if g_intClipBottom <> -1 then
  4415.         g_objVideoSource.CroppingBottomMargin = g_intClipBottom
  4416.     end if
  4417.  
  4418.  
  4419. end function
  4420.  
  4421. 'This function is used to check if the bit rate specified for the a_setting param is valid
  4422. function CheckForValidAudioBitRates( intBitRate )
  4423.  
  4424.     select case intBitRate
  4425.  
  4426.         case 1536000, 1411200,1280000,1024000,768000,705600,640000,440000,384000,383000,_
  4427.                      352800,320000,256000,255000,192000,191000,160000,128000,127000,96000,95000,_
  4428.                      80000,64000,63000,48000,40000,32000,24000,22000,20000,17000,16000,12000,10000,_
  4429.                      8000,6000,5000,4000,0
  4430.             CheckForValidAudioBitRates = True
  4431.  
  4432.         case else
  4433.             CheckForValidAudioBitRates = False
  4434.  
  4435.     end select
  4436. end function
  4437.  
  4438. 'This function is used to check if the sampling rate specified for the a_setting param is valid
  4439. function CheckForValidAudioSamplingRates( intSamplingRate )
  4440.  
  4441.     select case intSamplingRate
  4442.  
  4443.         case 96000,88200,48000,44100,32000,22050,16000,11025,8000
  4444.             CheckForValidAudioSamplingRates = True
  4445.  
  4446.         case else
  4447.             CheckForValidAudioSamplingRates = False
  4448.  
  4449.     end select
  4450. end function
  4451.  
  4452. 'This function is used to check if the channel specified for the a_setting param is valid
  4453. function CheckForValidAudioChannel( intChannel )
  4454.  
  4455.     select case intChannel
  4456.  
  4457.         case 1,2,6,8
  4458.             CheckForValidAudioChannel = True
  4459.  
  4460.         case else
  4461.             CheckForValidAudioChannel = False
  4462.  
  4463.    end select
  4464. end function
  4465.  
  4466. 'This function is used to check if the depth specified for the a_setting param is valid
  4467. function CheckForValidDepth( intAudioDepth )
  4468.  
  4469.     select Case intAudioDepth
  4470.  
  4471.         case 16,20,24
  4472.             CheckForValidDepth = True 
  4473.  
  4474.         case else
  4475.             CheckForValidDepth = False
  4476.  
  4477.    end select 
  4478. end function
  4479.  
  4480. 'This function is the top level function for directory based encoding
  4481. function DoDirectoryModeEncoding()
  4482.     dim strInputFull
  4483.     dim strOutputFull
  4484.  
  4485.     if g_strOutput = "" then
  4486.         OutputInfo "Error: No output directory specified" 
  4487.         DoDirectoryModeEncoding = false
  4488.         exit function
  4489.     end if
  4490.  
  4491.     strInputFull = g_objFileSystem.GetAbsolutePathName(g_strInput)
  4492.     strOutputFull = g_objFileSystem.GetAbsolutePathName(g_strOutput)
  4493.  
  4494.     EncodeFilesInFolder strInputFull, strOutputFull
  4495.  
  4496. end function
  4497.  
  4498. 'This function will create all folders down to the strFolderName level
  4499. function CreateOutputFolder( strFolderName )
  4500.     if g_objFileSystem.FolderExists(strFolderName) = false then
  4501.         CreateOutputFolder( g_objFileSystem.GetParentFolderName( strFolderName ) )
  4502.         g_objFileSystem.CreateFolder( strFolderName )
  4503.         end if
  4504. end function
  4505.  
  4506. 'This function will encode all files in the input directory and generate output files in output directory
  4507. function EncodeFilesInFolder( strInputFolderName, strOutputFolderName )
  4508.     dim objSubFoldersCollection
  4509.     dim objInputSubFolder
  4510.     dim strOutputSubFolderName, strFileType
  4511.     dim objFile, objFolder, objFileCollection
  4512.  
  4513.     OutputInfo "============== Encoding Files in Folder ============== " & strInputFolderName
  4514.  
  4515.     set objFolder = g_objFileSystem.GetFolder( strInputFolderName )
  4516.     
  4517.     ' First encode all the files contained in the input folder
  4518.     set objFileCollection = objFolder.Files
  4519.  
  4520.     for each objFile in objFileCollection
  4521.  
  4522.         strFileType = right(objFile.name, len(objFile.name) - instrrev(objFile.name,".") )  
  4523.  
  4524.         select case lcase(strFileType)
  4525.             case "avi", "wav", "mpg", "mpeg", "vob" , "wmv" , "wma", "mp3", "asf", "avs"
  4526.                 g_strInput = strInputFolderName & "\" & objFile.name
  4527.                 g_strOutput = strOutputFolderName & "\" & Left(objFile.name, len(objFile.Name)-(len(objFile.name) - instrrev(objFile.name,".") + 1)) & g_strOutputString
  4528.  
  4529.                 OutputInfo "============== Input " & g_strInput & " " & g_strOutput
  4530.  
  4531.                 ' This will force wmcmd to append wmv/wma extension
  4532.                 g_strOutput = g_strOutput & "."
  4533.             
  4534.                 ' Encode files
  4535.                 if SetupEncoder() then
  4536.                     if Transcode() and not g_blnSilent then 
  4537.                         ShowStatistics()
  4538.                     end if 
  4539.                 end if
  4540.  
  4541.                 ' reset encoder states for next file 
  4542.                 g_objEncoder.PrepareToEncode( false )
  4543.                 g_objEncoder.SourceGroupCollection.Remove( "SG_1" )
  4544.                 g_objSourceGroup = Null
  4545.                 g_objAudioSource = Null
  4546.                 g_objVideoSource = Null
  4547.                 g_blnEncoderStarted = false
  4548.                 g_blnEncoderStopped = false
  4549.                 g_blnEndPreProcess = false
  4550.  
  4551.             case else
  4552.                 OutputInfo "Skipping: " & objFile.name
  4553.         end select
  4554.     next
  4555.  
  4556.     ' Then recurse into subfolders and encode all files there
  4557.     set objSubFoldersCollection = objFolder.SubFolders
  4558.  
  4559.     for each objInputSubFolder in objSubFoldersCollection
  4560.         strOutputSubFolderName = strOutputFolderName & "\" & objInputSubFolder.name
  4561.  
  4562.         EncodeFilesInFolder objInputSubFolder, strOutputSubFolderName
  4563.     Next
  4564.  
  4565. end function
  4566.  
  4567. ' Get device name from index
  4568. function GetDeviceNameFromIndex(enumMediaType, intDeviceIndex)
  4569.     dim intLastDevice
  4570.     dim objSourceInfo, objSourcePluginManager
  4571.  
  4572.     intLastDevice = 0
  4573.     set objSourcePlugInManager = g_objEncoder.SourcePlugInInfoManager
  4574.  
  4575.     for i = 0 to objSourcePlugInManager.count -1
  4576.         set objSourceInfo = objSourcePlugInManager.Item(i)
  4577.         
  4578.         if objSourceInfo.Resources = true then
  4579.             if enumMediaType = WMENC_AUDIO then ' Audio
  4580.                 ' For audio search audio and audio | video
  4581.                 if objSourceInfo.MediaType = 1 or objSourceInfo.MediaType = 3 then
  4582.                     if intDeviceIndex < intLastDevice + objSourceInfo.Count then
  4583.                         GetDeviceNameFromIndex = objSourceInfo( intDeviceIndex - intLastDevice )
  4584.                         exit function
  4585.                     else 
  4586.                         intLastDevice = intLastDevice + objSourceInfo.Count
  4587.                     end if
  4588.                 end if
  4589.             else ' Video
  4590.                 ' For video search video, audio | video and video | script
  4591.                 if objSourceInfo.MediaType = 2 or objSourceInfo.MediaType = 3 or objSourceInfo.MediaType = 6 then
  4592.                     if intDeviceIndex < intLastDevice + objSourceInfo.Count Then
  4593.                         GetDeviceNameFromIndex = objSourceInfo( intDeviceIndex - intLastDevice )
  4594.                         exit function
  4595.                     else 
  4596.                         intLastDevice = intLastDevice + objSourceInfo.Count
  4597.                     end if
  4598.                 end if
  4599.             end if
  4600.         end if
  4601.     next
  4602.  
  4603.     GetDeviceNameFromIndex = ""
  4604.  
  4605. end function
  4606.  
  4607. function CheckAndEnablePlaybackinWMP(ext)
  4608.  
  4609.     On Error Resume Next
  4610.  
  4611.     dim regAVS, intPermissions, intRuntime
  4612.             
  4613.     ' Check if extension key already exists
  4614.     regAVS = g_objWshShell.RegRead("HKCU\Software\Microsoft\MediaPlayer\Player\Extensions\" & ext & "\")
  4615.     
  4616.     if err <> 0 then
  4617.         g_objWshShell.RegWrite "HKCU\Software\Microsoft\MediaPlayer\Player\Extensions\" & ext & "\Permissions", 1, "REG_DWORD"
  4618.         g_objWshShell.RegWrite "HKCU\Software\Microsoft\MediaPlayer\Player\Extensions\" & ext & "\Runtime", 7, "REG_DWORD"
  4619.     else
  4620.         intPermissions = -1
  4621.         intRuntime = -1
  4622.         
  4623.         intPermissions = g_objWshShell.RegRead("HKCU\Software\Microsoft\MediaPlayer\Player\Extensions\" & ext & "\Permissions")
  4624.         intRuntime = g_objWshShell.RegRead("HKCU\Software\Microsoft\MediaPlayer\Player\Extensions\" & ext & "\Runtime")
  4625.         
  4626.         if intPermissions < 1 then g_objWshShell.RegWrite "HKCU\Software\Microsoft\MediaPlayer\Player\Extensions\" & ext & "\Permissions", 1, "REG_DWORD"
  4627.         if intRuntime < 7 then g_objWshShell.RegWrite "HKCU\Software\Microsoft\MediaPlayer\Player\Extensions\" & ext & "\Runtime", 7, "REG_DWORD"    
  4628.     end if
  4629.  
  4630. end function
  4631.  
  4632. function GetAlternateSourceDuration()
  4633.  
  4634.     On Error Resume Next
  4635.  
  4636.     dim intTimeOut
  4637.     dim intWMPMediaDuration
  4638.     dim objWMP
  4639.     dim strInput2
  4640.     dim blnWMPError
  4641.  
  4642.     objWMP = Null
  4643.     intWMPMediaDuration = -1
  4644.     blnWMPError = false
  4645.         
  4646.     strInput2 = g_objFileSystem.GetAbsolutePathName( g_strInput )
  4647.  
  4648.     OutputInfo "Warning: Encoder failed to retrieve duration attribute from source plug-in."
  4649.     WScript.Stdout.Write "         Trying alternate method now."
  4650.  
  4651.     ' Initialize Windows Media Player ActiveX control
  4652.     set objWMP = WScript.CreateObject( "WMPlayer.OCX" )
  4653.  
  4654.     if not IsNull(objWMP) then
  4655.     
  4656.         ' If source unknown, enable playback in WMP - override security dialog
  4657.         CheckAndEnablePlaybackinWMP(Right( LCase( g_strInput ), 4 ))
  4658.  
  4659.         ' Mute player volume
  4660.         objWMP.settings.mute = True
  4661.  
  4662.         ' Load source media
  4663.         objWMP.URL = strInput2
  4664.  
  4665.         intTimeOut = 0
  4666.  
  4667.         ' Wait for the media to open or time out after 30 seconds
  4668.         do while (intTimeOut < 30) and not (objWMP.openState = 13)
  4669.             WScript.stdout.Write "."
  4670.             WScript.Sleep(1000)
  4671.             intTimeOut = intTimeOut + 1
  4672.         loop
  4673.         OutputInfo "."
  4674.  
  4675.         ' Proceed only if media was successfully opened
  4676.         if intTimeOut < 30 then
  4677.  
  4678.             if not IsNull(objWMP.currentMedia) then
  4679.  
  4680.                 '  If media is not playing yet, wait another 3 seconds before retrieving duration
  4681.                 if objWMP.playState <> 3 then WScript.Sleep(3000)
  4682.             
  4683.                 intWMPMediaDuration = objWMP.currentMedia.duration
  4684.     
  4685.                 if intWMPMediaDuration <> -1 then
  4686.  
  4687.                     g_intAudioSourceDuration = intWMPMediaDuration * 1000
  4688.                     g_intVideoSourceDuration = intWMPMediaDuration * 1000
  4689.  
  4690.                     OutputInfo "Source duration retrieved: " & intWMPMediaDuration & " seconds."
  4691.                 else
  4692.                     blnWMPError = true
  4693.                 end if
  4694.  
  4695.             else
  4696.                 blnWMPError = true
  4697.             end if
  4698.  
  4699.         else
  4700.             blnWMPError = true
  4701.         end if
  4702.  
  4703.         ' Request Player shutdown
  4704.         objWMP.Close()
  4705.  
  4706.         WScript.Sleep(500)
  4707.  
  4708.         set objWMP = Nothing
  4709.  
  4710.     else
  4711.         blnWMPError = true
  4712.     end if
  4713.  
  4714.     if blnWMPError then
  4715.         OutputInfo ""
  4716.         OutputInfo "Warning: Encoder failed to retrieve source duration again."
  4717.         OutputInfo "         Encode process might not continue or progress report may be inaccurate."
  4718.         g_intAudioSourceDuration = 0
  4719.         g_intVideoSourceDuration = 0
  4720.     end if
  4721.  
  4722.     OutputInfo ""
  4723.  
  4724. end function
  4725.  
  4726.  
  4727. function ConvertSecondsToHHMMSS( intSeconds )
  4728.  
  4729.     ' Takes time in seconds as input and outputs a string formatted as hh:mm:ss
  4730.  
  4731.     dim intHH, intMM, intSS
  4732.     dim strHH, strMM, strSS
  4733.  
  4734.     intSS = Int(intSeconds mod 60)
  4735.     intMM = Int((intSeconds\60) mod 60)
  4736.     intHH = Int(intSeconds\3600)
  4737.  
  4738.     if intSS < 10 then
  4739.         strSS = "0" & intSS
  4740.     else
  4741.         strSS = CStr(intSS)
  4742.     end if
  4743.  
  4744.     if intMM < 10 then
  4745.         strMM = "0" & intMM
  4746.     else
  4747.         strMM = CStr(intMM)
  4748.     end if
  4749.  
  4750.     if intHH < 10 then
  4751.         strHH = "0" & intHH
  4752.     else
  4753.         strHH = CStr(intHH)
  4754.     end if
  4755.  
  4756.     ConvertSecondsToHHMMSS = strHH & ":" & strMM & ":" & strSS
  4757.  
  4758. end function
  4759.  
  4760.  
  4761. function ShowProgress()
  4762.     dim intSleepDuration, intPercent, intADuration, intVDuration, intDuration
  4763.     dim intPasses, intLimit, intCurrentPosition, tPassStartTime, intTimeElapsed, intTimeLeft, intLastPosition
  4764.  
  4765.     OutputInfo g_strProductName
  4766.     OutputInfo g_strProductCopyright
  4767.     OutputInfo ""
  4768.  
  4769.     ' Display metadata information passed to the encoder script
  4770.  
  4771.     if g_strTitle <> "" then
  4772.         OutputInfo "Title:     " & g_strTitle
  4773.     end if
  4774.     if (g_intTrackNo <> "") and (IsNumeric(g_intTrackNo)) then
  4775.         OutputInfo "Track No:  " & g_intTrackNo
  4776.     end if
  4777.     if g_strAuthor <> "" then
  4778.         OutputInfo "Artist:    " & g_strAuthor
  4779.     end if
  4780.     if g_strAlbum <> "" then
  4781.         OutputInfo "Album:     " & g_strAlbum
  4782.     end if
  4783.     if g_strYear <> "" then
  4784.         OutputInfo "Year:      " & g_strYear
  4785.     end if
  4786.     if g_strGenre <> "" then
  4787.         OutputInfo "Genre:     " & g_strGenre
  4788.     end if
  4789.     if g_strCopyright <> "" then
  4790.         OutputInfo "Copyright: " & g_strCopyright
  4791.     end if
  4792.     if g_strDescription <> "" then
  4793.         OutputInfo "Comment:   " & g_strDescription
  4794.     end if
  4795.     OutputInfo ""
  4796.  
  4797.  
  4798.     intPasses = 1
  4799.  
  4800.     ' Compute number of passes required
  4801.     if not IsNull(g_objAudioSource) then
  4802.         if g_objAudioSource.PreProcessPass = 1 then
  4803.             intPasses = 2
  4804.         end if
  4805.     end if
  4806.  
  4807.     if not IsNull(g_objVideoSource) then
  4808.         if g_objVideoSource.PreProcessPass = 1 then
  4809.             intPasses = 2
  4810.         end if
  4811.     end if
  4812.  
  4813.     ' Check if source duration property is available - enable error handling
  4814.     On Error Resume Next
  4815.  
  4816.     if not IsNull(g_objAudioSource) then
  4817.         g_intAudioSourceDuration = g_objAudioSource.Duration
  4818.         if IsNull(g_objAudioSource.Duration) then
  4819.             g_blnDurationError = True
  4820.         end if
  4821.     end if
  4822.  
  4823.     if not IsNull(g_objVideoSource) then
  4824.         g_intVideoSourceDuration = g_objVideoSource.Duration
  4825.         if IsNull(g_objVideoSource.Duration) then
  4826.             g_blnDurationError = True
  4827.         end if
  4828.     end if
  4829.  
  4830.     if g_blnDurationError then
  4831.         ' Try to retrieve the source duration through Windows Media Player OCX
  4832.         GetAlternateSourceDuration()
  4833.     end if
  4834.  
  4835.     On Error Goto 0
  4836.  
  4837.  
  4838.     ' Compute file duration and compensate for mark in/out
  4839.     if not IsNull(g_objAudioSource) then
  4840.         if g_objAudioSource.MarkOut <> 0 then
  4841.             intADuration = g_objAudioSource.MarkOut - g_objAudioSource.MarkIn
  4842.         else
  4843.             intADuration = g_intAudioSourceDuration - g_objAudioSource.MarkIn
  4844.         end if
  4845.     end if
  4846.     if not IsNull(g_objVideoSource) then
  4847.         if g_objVideoSource.MarkOut <> 0 then
  4848.             intVDuration = g_objVideoSource.MarkOut - g_objVideoSource.MarkIn
  4849.         else
  4850.             intVDuration = g_intVideoSourceDuration - g_objVideoSource.MarkIn
  4851.         end if
  4852.     end if
  4853.  
  4854.     if intADuration > intVDuration then
  4855.         intDuration = intADuration
  4856.     else
  4857.         intDuration = intVDuration
  4858.     end if
  4859.  
  4860.     intSleepDuration = 2000
  4861.  
  4862.     intLimit = 100
  4863.     
  4864.     ' For all passes show progress from 0 to 100
  4865.     for j=0 to intPasses-1
  4866.  
  4867.         intPercent = 0
  4868.         intCurrentPosition = 0
  4869.         intLastPosition = 0
  4870.         intTimeElapsed = 0
  4871.         intTimeLeft = 0
  4872.         tPassStartTime = Now()
  4873.  
  4874.         if intPasses = 2 and j = 0 then
  4875.             OutputInfo "======== Begin Pass1 ========"
  4876.         elseif intPasses = 2 and j = 1 then
  4877.             OutputInfo "======== Begin Pass2 ========"
  4878.         end if    
  4879.  
  4880.         do while g_objEncoder.RunState <> WMENC_ENCODER_STOPPED and g_intErrorCode = 0 and Int(intPercent) < intLimit
  4881.  
  4882.             if intDuration = 0 then
  4883.                 WScript.stdout.Write "."
  4884.             else
  4885.                 intPercent = g_objEncoder.Statistics.EncodingTime * 1000000 / intDuration
  4886.                 intCurrentPosition = g_objEncoder.Statistics.EncodingTime*10
  4887.  
  4888.                 ' Check if the current position has lapped itself, indicating that 2nd pass has started
  4889.                 if intPasses = 2 and j = 0 and intLastPosition > intCurrentPosition then
  4890.                     exit Do
  4891.                 end if
  4892.  
  4893.                 ' Time elapsed since start of current pass. Total encoding time is tracked separately
  4894.                 intTimeElapsed = DateDiff("s", tPassStartTime, Now())
  4895.                 ' Add 0.001 to divisor to prevent division-by-zero errors
  4896.                 intTimeLeft = ( (0.001 * intDuration / (intCurrentPosition+0.001)) * intTimeElapsed ) - intTimeElapsed
  4897.  
  4898.                 if intTimeLeft < 0 then
  4899.                     intTimeLeft = 0   ' Prevents ugly negative output
  4900.                 end if
  4901.  
  4902.                 WScript.stdout.Write vbCr
  4903.  
  4904.                 if intPasses = 2 and j = 0 then
  4905.                     WScript.stdout.Write "Read: "
  4906.                 else
  4907.                     WScript.stdout.Write "Encoded: "
  4908.                 end if    
  4909.  
  4910.                 WScript.stdout.Write Round(intCurrentPosition,1) & "s (" & Round(intPercent,1) & "%)    "
  4911.                 WScript.stdout.Write "Elapsed: " & ConvertSecondsToHHMMSS(intTimeElapsed) & "    "
  4912.                 WScript.stdout.Write "Left: " & ConvertSecondsToHHMMSS(intTimeLeft) & "   [" 
  4913.                 WScript.stdout.Write Round(intCurrentPosition/(intTimeElapsed+0.001),2) & "x]     "
  4914.  
  4915.                 intLastPosition = intCurrentPosition
  4916.             end if
  4917.  
  4918.             WScript.Sleep intSleepDuration
  4919.  
  4920.         loop
  4921.     
  4922.         if g_intErrorCode <> 0 then 
  4923.             OutputInfo vbCrLf & "Encoder error: 0x" & Hex( g_intErrorCode )
  4924.             exit for
  4925.         end if
  4926.  
  4927.  
  4928.         if j = 0 and intPasses = 2 then
  4929.             do while not g_blnEndPreProcess and g_intErrorCode = 0
  4930.                 WScript.Sleep intSleepDuration
  4931.             loop
  4932.         end if
  4933.  
  4934.         if g_intErrorCode <> 0 then 
  4935.             OutputInfo vbCrLf & "Encoder error: 0x" & Hex( g_intErrorCode )
  4936.             exit for
  4937.         end if
  4938.  
  4939.         OutputInfo ""
  4940.         OutputInfo ""
  4941.     next
  4942.  
  4943. end function
  4944.  
  4945. function TerminateEncoderProcess()
  4946.  
  4947.     dim objWMIService
  4948.     dim objProcess
  4949.  
  4950.     On Error Resume Next
  4951.  
  4952.     ' Get Windows Manager object
  4953.     Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
  4954.  
  4955.     ' Enumerate all CScript.exe processes
  4956.     dim colProcessList
  4957.     Set colProcessList = objWMIService.ExecQuery ("Select * from Win32_Process Where Name = 'cscript.exe'")
  4958.     
  4959.     dim strArguments
  4960.     strArguments = ""
  4961.     
  4962.     ' Enumerate all command-line arguments
  4963.     for i = 0 to wscript.arguments.Length-1
  4964.         strArguments = strArguments & " " & wscript.arguments(i)
  4965.     next
  4966.     strArguments = Replace(strArguments, Chr(34), "")
  4967.  
  4968.     ' Kill the processes that match this one in name and arguments
  4969.     For Each objProcess in colProcessList
  4970.         if InStr(1, Replace(objProcess.CommandLine, Chr(34), ""), Trim(WScript.ScriptName & strArguments), 1 ) > 0 then
  4971.             objProcess.Terminate()
  4972.         end if
  4973.     Next
  4974.     
  4975.     ' What? Still not terminated? OK, kill first occurrence.
  4976.     For Each objProcess in colProcessList
  4977.         if InStr(1, objProcess.CommandLine, WScript.ScriptName) > 0 then 
  4978.             objProcess.Terminate()
  4979.         end if
  4980.     Next
  4981.  
  4982. end function
  4983.