Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Jun 17th, 2012  |  syntax: None  |  size: 104.22 KB  |  hits: 20  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. ###################################################################################################################################
  2. ###                                                                                                                             ###
  3. ###                                      Motion-Compensated Temporal Denoise: MCTD()                                            ###
  4. ###                                                                                                                             ###
  5. ###                                       v1.4.20 by "LaTo INV.", mod 2 by 06_taro                                              ###
  6. ###                                                                                                                             ###
  7. ###                                                  29 November 2011                                                           ###
  8. ###                                                                                                                             ###
  9. ###################################################################################################################################
  10. ###
  11. ###
  12. ###
  13. ### /!\ Needed filters: MVTools (v2.5.11.3/v2.5.13.1), MaskTools (v2.0a48),
  14. ### ------------------- LSFmod (v1.9), FFT3Dgpu (v0.8.2) or FFT3Dfilter (v2.1.1),
  15. ###                     TTempsmooth (v0.9.4), RemoveGrain + Repair (v1.0PR),
  16. ###                     Deblock (v1.2), Deblock_QED (16.Oct.2010), DctFilter (v0.0.1.4),
  17. ###                     EEDI2 (v0.9.2), SangNom (v1.0beta),
  18. ###                     GradFun2DBmod (v1.5), GradFun2db (v1.0), AddGrainC (v1.6.1).
  19. ###
  20. ###
  21. ###
  22. ### USAGE: MCTD(i, radius, sigma, twopass, useTTmpSm, limit, limit2, post, chroma, interlaced,
  23. ###             sharp, adapt, strength, SHmode, SHmethod, Slimit, Sovershoot, Tlimit, Tovershoot, shF,
  24. ###             protect, cutoff, threshold, maxdiff,
  25. ###             AA, useEEDI2, reduc, maxd, AAthr, method, aaF,
  26. ###             deblock, useQED, quant1, quant2,
  27. ###             edgeclean, ECrad, ECthr, ECmode,
  28. ###             stabilize, maxr, TTstr,  
  29. ###             enhance, GFthr, AGstr, bias, temp, dbF,
  30. ###             bwbh, owoh, blksize, overlap,
  31. ###             GPU, fixband, bt, ncpu, precision,
  32. ###             thSAD, thSAD2, thSCD1, thSCD2,
  33. ###             truemotion, MVglobal, pel, pelsearch, search, searchparam, MVsharp, DCT,
  34. ###             p, settings,
  35. ###             show, screenW, screenH,
  36. ###             p1nr, p2nr, ppnr)
  37. ###
  38. ###
  39. ###
  40. ### PARAMETERS:
  41. ### -----------
  42. ###
  43. ### +---------+
  44. ### | DENOISE |
  45. ### +---------+-------------------------------------------------------------------------------------------+
  46. ### | radius     : Temporal radius [1...6]                                                                |
  47. ### | sigma      : FFT3D sigma for the pre-filtering clip [0=no pre-filtering,1...]                       |
  48. ### | twopass    : Do the denoising job in 2 stages (stronger but very slow)                              |
  49. ### | useTTmpSm  : Use MDegrain (faster) or MCompensate+TTempsmooth (stronger)                            |
  50. ### | limit      : Limit the effect of the first denoising [-1=auto,0=off,1...255]                        |
  51. ### | limit2     : Limit the effect of the second denoising (if twopass=true) [-1=auto,0=off,1...255]     |
  52. ### | post       : Sigma value for post-denoising with FFT3D (before all the PP stage) [0=off,...]        |
  53. ### | chroma     : Process or not the chroma plane                                                        |
  54. ### | interlaced : Input video interlaced or not                                                          |
  55. ### | p1nr       : Use your own denoising filter instead of internal MDegrain/TTempsmooth in the 1st pass |
  56. ### | p2nr       : Use your own denoising filter instead of internal MDegrain/TTempsmooth in the 2nd pass |
  57. ### | ppnr       : Use your own denoising filter instead of internal FFT3D in post-denoising              |
  58. ### |              (Set your filter in string, e.g., p1nr="FluxSmoothST(7, 7)")                           |
  59. ### +-----------------------------------------------------------------------------------------------------+
  60. ###
  61. ###
  62. ### +-------+
  63. ### | SHARP |
  64. ### +-------+-----------------------------------------------------------------------------------------------------------------------------+
  65. ### | sharp      : Enable Post-Sharpening (Spatial-Sharpening + Motion-compensated temporal limiting)                                     |
  66. ### | adapt      : Adaptative sharpening --> sharp only static & detailed areas, prevents grain sharpening & save much bitrate (+-10/15%) |
  67. ### | strength   : Sharpening strength ( see LSFmod: strength  )                                                                          |
  68. ### | SHmode     : Sharpening mode     ( see LSFmod: Smode     )                                                                          |
  69. ### | SHmethod   : Sharpening method   ( see LSFmod: Smethod   )                                                                          |
  70. ### | Slimit     : Spatial limiting    ( see LSFmod: Lmode     )                                                                          |
  71. ### | Sovershoot : Spatial overshoot   ( see LSFmod: overshoot )                                                                          |
  72. ### | Tlimit     : Temporal limiting (Motion compensated, clamp output to Tovershoot)                                                     |
  73. ### | Tovershoot : Temporal overshoot, = Maximum sharpening excess allowed (If Tovershoot=0, don't sharp more than the original clip.)    |
  74. ### |              /!\ If you set Tovershoot>0, be sure that Slimit!=0 (to not over-enhance edges... Slimit=2 is a good compromise)       |
  75. ### | shF        : Use your own sharpening filter instead of internal LSFmod (Set your filter in string, e.g., shF="Sharpen(0.3)")        |
  76. ### +-------------------------------------------------------------------------------------------------------------------------------------+
  77. ###
  78. ###
  79. ### +---------------------------------+
  80. ### | STAR & BRIGHT POINTS PROTECTION |
  81. ### +---------------------------------+---------------------------------------------------------------------------------------+
  82. ### | protect   : Enable star & bright points protection                                                                      |
  83. ### | cutoff    : Luma cutoff (process only brighter areas than this value) [0=all,1...255]                                   |
  84. ### | threshold : Luma threshold (minimal change needed to be filtered, the higher = the lesser areas are filtered) [0...127] |
  85. ### | maxdiff   : Maximum change allowed between source and result (the lesser, the brighter) [0=source,1...255]              |
  86. ### +-------------------------------------------------------------------------------------------------------------------------+
  87. ###
  88. ###
  89. ### +--------------+
  90. ### | ANTIALIASING |
  91. ### +--------------+----------------------------------------------------------------------------------------------------------------------+
  92. ### | AA       : Enable antialiasing (only on edges)                                                                                      |
  93. ### | useEEDI2 : If true use EEDI2 filtering, else use SANGNOM filtering                                                                  |
  94. ### | reduc    : MC-soothe reduc parameter, reduc==-1 turn off "MC-antialiasing" [-1=off,0.0...1.0]                                       |
  95. ### | maxd     : If EEDI2 is used it's his maxd setting, if SANGNOM is used it's his AA setting (see docs of these filters)               |
  96. ### | AAthr    : Threshold for mask (the higher, the less "small edges" are processed) [0...255]                                          |
  97. ### | method   : Sharpness for downsize [0=bilinear,1=spline36,2=lanczos4]                                                                |
  98. ### | aaF      : Use your own anti-aliasing filter instead of internal SANGNOM/EEDI2 (Set your filter in string, e.g., aaF="Sangnom(48)") |
  99. ### +-------------------------------------------------------------------------------------------------------------------------------------+
  100. ###
  101. ###
  102. ### +---------+
  103. ### | DEBLOCK |
  104. ### +---------+-----------------------------------------------------------------------------------+
  105. ### | deblock : Enable deblocking before the denoising                                            |
  106. ### | useQED  : If true, use Deblock_QED, else use Deblock (faster & stronger)                    |
  107. ### | quant1  : Deblock_QED "quant1" parameter (Deblock "quant" parameter is "(quant1+quant2)/2") |
  108. ### | quant2  : Deblock_QED "quant2" parameter (Deblock "quant" parameter is "(quant1+quant2)/2") |
  109. ### +---------------------------------------------------------------------------------------------+
  110. ###
  111. ###
  112. ### +------------------------------+
  113. ### | EDGECLEAN: DERING, DEHALO... |
  114. ### +------------------------------+-----------------------------------------------------------------------------------------------------+
  115. ### | edgeclean : Enable safe edgeclean process after the denoising (only on edges which are in non-detailed areas, so less detail loss) |
  116. ### | ECrad     : Radius for mask (the higher, the greater distance from the edge is filtered)                                           |
  117. ### | ECthr     : Threshold for mask (the higher, the less "small edges" are process) [0...255]                                          |
  118. ### | ECmode    : Script/Filter used for cleaning edges (ex: "dfttest().dehalo_alpha()", don't forget quotes "")                         |
  119. ### +------------------------------------------------------------------------------------------------------------------------------------+
  120. ###
  121. ###
  122. ### +-----------+
  123. ### | STABILIZE |
  124. ### +-----------+------------------------------------------------------------------------------------------------+
  125. ### | stabilize : Enable TTempSmooth post processing to stabilize flat areas (background will be less "nervous") |
  126. ### | maxr      : Temporal radius (the higher, the more stable image)                                            |
  127. ### | TTstr     : Strength (see TTempSmooth docs)                                                                |
  128. ### +------------------------------------------------------------------------------------------------------------+
  129. ###
  130. ###
  131. ### +---------+
  132. ### | ENHANCE |
  133. ### +---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------+
  134. ### | enhance : Enable GradFun2DBmod post processing to enhance flat areas (may avoid banding & blocking when encoding too)                                               |
  135. ### | GFthr   : Gradfun2db threshold [1.0=off,...]                                                                                                                        |
  136. ### | AGstr   : AddGrain strength  [0.0=off,...]                                                                                                                          |
  137. ### | bias    : Brightness bias for adaptative grain mask (the higher, the less grain in dark areas & the more grain in bright areas) [-1=off,0=input,1...254,255=invert] |
  138. ### | temp    : Temporal stabilization for grain (the higher, the more calm) [0=nervous,...,100=static]                                                                   |
  139. ### | dbF     : Use your own debanding filter instead of internal GradFun2dbmod (Set your filter in string, e.g., dbF="f3kdb(31, 32, 0, 0)")                              |
  140. ### +---------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  141. ###
  142. ###
  143. ### +---------------------+
  144. ### | BLOCKSIZE / OVERLAP |
  145. ### +---------------------+----------------+
  146. ### | bwbh    : FFT3D blocksize            |
  147. ### | owoh    : FFT3D overlap              |
  148. ### |             - for speed:   bwbh/4    |
  149. ### |             - for quality: bwbh/2    |
  150. ### | blksize : MVTools blocksize          |
  151. ### | overlap : MVTools overlap            |
  152. ### |             - for speed:   blksize/4 |
  153. ### |             - for quality: blksize/2 |
  154. ### +--------------------------------------+
  155. ###
  156. ###
  157. ### +-------+
  158. ### | FFT3D |
  159. ### +-------+---------------------------------------+
  160. ### | GPU     : Use FFT3Dgpu instead of FFT3Dfilter |
  161. ### | fixband : Prevent banding issue with FFT3D    |
  162. ### +---------------------------------------+-------+
  163. ### | bt        : FFT3D block temporal size |
  164. ### | ncpu      : FFT3Dfilter ncpu          |
  165. ### | precision : FFT3Dgpu precision        |
  166. ### +---------------------------------------+
  167. ###
  168. ###
  169. ### +---------+
  170. ### | MVTOOLS |
  171. ### +---------+----------------------------------------------------+
  172. ### | thSAD  : MVTools thSAD for the first pass                    |
  173. ### | thSAD2 : MVTools thSAD for the second pass (if twopass=true) |
  174. ### | thSCD1 : MVTools thSCD1                                      |
  175. ### | thSCD2 : MVTools thSCD2                                      |
  176. ### +-----------------------------------+--------------------------+
  177. ### | truemotion  : MVTools truemotion  |
  178. ### | MVglobal    : MVTools global      |
  179. ### | pel         : MVTools pel         |
  180. ### | pelsearch   : MVTools pelsearch   |
  181. ### | search      : MVTools search      |
  182. ### | searchparam : MVTools searchparam |
  183. ### | MVsharp     : MVTools sharp       |
  184. ### | DCT         : MVTools DCT         |
  185. ### +-----------------------------------+
  186. ###
  187. ###
  188. ### +--------+
  189. ### | GLOBAL |
  190. ### +--------+-----------------------------------------------------+
  191. ### | p        : Set an external prefilter clip                    |
  192. ### | settings : Global MCTD settings [default="low"] |
  193. ### |             - "very low"                                     |
  194. ### |             - "low"                                          |
  195. ### |             - "medium"                                       |
  196. ### |             - "high"                                         |
  197. ### |             - "very high"                                    |
  198. ### +--------------------------------------------------------------+
  199. ###
  200. ###
  201. ### +-------+
  202. ### | DEBUG |
  203. ### +-------+------------------------------------------------+
  204. ### | show    : Show debug clip & informations               |
  205. ### | screenW : Screen horizontal resolution (for show clip) |
  206. ### | screenH : Screen vertical resolution (for show clip)   |
  207. ### +--------------------------------------------------------+
  208. ###
  209. ###
  210. ###
  211. ### DEFAULTS:
  212. ### ---------
  213. ###
  214. ### +-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+
  215. ### | SETTINGS    |      VERY LOW               |      LOW                    |      MEDIUM                 |      HIGH                   |      VERY HIGH              |
  216. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  217. ### | radius      |      1                      |      2                      |      3                      |      2                      |      3                      |
  218. ### | sigma       |      2                      |      4                      |      8                      |      12                     |      16                     |
  219. ### | twopass     |      false                  |      false                  |      false                  |      true                   |      true                   |
  220. ### | useTTmpSm   |      false                  |      false                  |      false                  |      false                  |      false                  |
  221. ### | limit       |      -1                     |      -1                     |      -1                     |      -1                     |      0                      |
  222. ### | limit2      |      -1                     |      -1                     |      -1                     |      0                      |      0                      |
  223. ### | post        |      0                      |      0                      |      0                      |      0                      |      0                      |
  224. ### | chroma      |      false                  |      false                  |      true                   |      true                   |      true                   |
  225. ### | interlaced  |      false                  |      false                  |      false                  |      false                  |      false                  |
  226. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  227. ### | sharp       |      true                   |      true                   |      true                   |      true                   |      true                   |
  228. ### | adapt       |      true                   |      true                   |      true                   |      true                   |      true                   |
  229. ### | strength    |      100                    |      100                    |      150                    |      200                    |      200                    |
  230. ### | SHmode      |      3                      |      3                      |      3                      |      3                      |      3                      |
  231. ### | SHmethod    |      3                      |      3                      |      3                      |      3                      |      3                      |
  232. ### | Slimit      |      0                      |      0                      |      0                      |      0                      |      0                      |
  233. ### | Sovershoot  |      0                      |      0                      |      0                      |      0                      |      0                      |
  234. ### | Tlimit      |      true                   |      true                   |      true                   |      true                   |      true                   |
  235. ### | Tovershoot  |      2                      |      2                      |      1                      |      0                      |      0                      |
  236. ### | shF         |      "internal"             |      "internal"             |      "internal"             |      "internal"             |      "internal"             |
  237. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  238. ### | protect     |      false                  |      false                  |      false                  |      false                  |      false                  |
  239. ### | cutoff      |      64                     |      64                     |      64                     |      64                     |      64                     |
  240. ### | threshold   |      16                     |      16                     |      16                     |      16                     |      16                     |
  241. ### | maxdiff     |      4                      |      4                      |      4                      |      4                      |      4                      |
  242. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  243. ### | AA          |      false                  |      false                  |      false                  |      false                  |      false                  |
  244. ### | useEEDI2    |      true                   |      true                   |      false                  |      false                  |      false                  |
  245. ### | reduc       |      0.5                    |      0.5                    |      0.5                    |      0.5                    |      0.5                    |
  246. ### | maxd        |      24                     |      24                     |      48                     |      48                     |      48                     |
  247. ### | AAthr       |      64                     |      32                     |      32                     |      16                     |      16                     |
  248. ### | method      |      2                      |      1                      |      1                      |      0                      |      0                      |
  249. ### | aaF         |      "internal"             |      "internal"             |      "internal"             |      "internal"             |      "internal"             |
  250. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  251. ### | deblock     |      false                  |      false                  |      false                  |      false                  |      false                  |
  252. ### | useQED      |      true                   |      true                   |      true                   |      false                  |      false                  |
  253. ### | quant1      |      10                     |      20                     |      30                     |      30                     |      40                     |
  254. ### | quant2      |      20                     |      40                     |      60                     |      60                     |      80                     |
  255. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  256. ### | edgeclean   |      false                  |      false                  |      false                  |      false                  |      false                  |
  257. ### | ECrad       |      1                      |      2                      |      3                      |      4                      |      5                      |
  258. ### | ECthr       |      32                     |      32                     |      32                     |      16                     |      16                     |
  259. ### | ECmode      |      "Removegrain(2,0)"     |      "Removegrain(2,0)"     |      "Removegrain(2,2)"     |      "Removegrain(4,4)"     |      "Removegrain(4,4)"     |
  260. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  261. ### | stabilize   |      false                  |      false                  |      false                  |      true                   |      true                   |
  262. ### | maxr        |      1                      |      1                      |      2                      |      2                      |      2                      |
  263. ### | TTstr       |      1                      |      1                      |      1                      |      2                      |      2                      |
  264. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  265. ### | enhance     |      true                   |      true                   |      false                  |      false                  |      false                  |
  266. ### | GFthr       |      1.1                    |      1.2                    |      1.4                    |      1.6                    |      1.8                    |
  267. ### | AGstr       |      0.6                    |      0.8                    |      1.2                    |      1.8                    |      2.4                    |
  268. ### | bias        |      64                     |      64                     |      64                     |      64                     |      64                     |
  269. ### | temp        |      50                     |      50                     |      50                     |      50                     |      50                     |
  270. ### | dbF         |      "internal"             |      "internal"             |      "internal"             |      "internal"             |      "internal"             |
  271. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  272. ### | bwbh        |      HD?16:8                |      HD?16:8                |      HD?16:8                |      HD?16:8                |      HD?16:8                |
  273. ### | owoh        |      HD? 8:4                |      HD? 8:4                |      HD? 8:4                |      HD? 8:4                |      HD? 8:4                |
  274. ### | blksize     |      HD?16:8                |      HD?16:8                |      HD?16:8                |      HD?16:8                |      HD?16:8                |
  275. ### | overlap     |      HD? 8:4                |      HD? 8:4                |      HD? 8:4                |      HD? 8:4                |      HD? 8:4                |
  276. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  277. ### | GPU         |      false                  |      false                  |      false                  |      false                  |      false                  |
  278. ### | fixband     |      true                   |      true                   |      true                   |      true                   |      true                   |
  279. ### | bt          |      1                      |      3                      |      3                      |      3                      |      4                      |
  280. ### | ncpu        |      1                      |      1                      |      1                      |      1                      |      1                      |
  281. ### | precision   |      2                      |      2                      |      2                      |      2                      |      2                      |
  282. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  283. ### | thSAD       |      200                    |      300                    |      400                    |      500                    |      600                    |
  284. ### | thSAD2      |      200                    |      300                    |      400                    |      500                    |      600                    |
  285. ### | thSCD1      |      200                    |      300                    |      400                    |      500                    |      600                    |
  286. ### | thSCD2      |      90                     |      100                    |      100                    |      130                    |      130                    |
  287. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  288. ### | truemotion  |      false                  |      false                  |      false                  |      false                  |      false                  |
  289. ### | MVglobal    |      true                   |      true                   |      true                   |      true                   |      true                   |
  290. ### | pel         |      1                      |      2                      |      2                      |      2                      |      2                      |
  291. ### | pelsearch   |      1                      |      2                      |      2                      |      2                      |      2                      |
  292. ### | search      |      2                      |      2                      |      2                      |      2                      |      2                      |
  293. ### | searchparam |      2                      |      2                      |      2                      |      2                      |      2                      |
  294. ### | MVsharp     |      2                      |      2                      |      2                      |      1                      |      0                      |
  295. ### | DCT         |      0                      |      0                      |      0                      |      0                      |      0                      |
  296. ### |-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------|
  297. ### | show        |      false                  |      false                  |      false                  |      false                  |      false                  |
  298. ### | screenW     |      1280                   |      1280                   |      1280                   |      1280                   |      1280                   |
  299. ### | screenH     |      1024                   |      1024                   |      1024                   |      1024                   |      1024                   |
  300. ### +-------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+
  301. ###
  302. ###
  303. ###
  304. ### MCTD's Post Processor :
  305. ### ------------------------------------
  306. ###
  307. ### USAGE: MCTD_PP( denoised, source,
  308. ###                 sharp, adapt, strength, SHmode, SHmethod, Slimit, Sovershoot, Tlimit, Tovershoot, shF,
  309. ###                 protect, cutoff, threshold, maxdiff,
  310. ###                 AA, useEEDI2, reduc, maxd, AAthr, method, aaF,
  311. ###                 deblock, useQED, quant1, quant2,
  312. ###                 edgeclean, ECrad, ECthr, ECmode,
  313. ###                 stabilize, maxr, TTstr,
  314. ###                 enhance, GFthr, AGstr, bias, temp, dbF,
  315. ###                 chroma, settings )
  316. ###
  317. ### This is the post-processor used internally in MCTD.
  318. ### It can be called externally if you want some specific functionality without denoising.
  319. ###
  320. ### Parameters & defaults are the same as MCTD.
  321. ### By default, all filters are OFF!
  322. ###
  323. ### "Sharp" & "Protect" options need 2 inputs:
  324. ### EX: source=last
  325. ###     denoised=source.FFT3Dfilter()
  326. ###     MCTD_PP(denoised,source,...)
  327. ### The others only need "denoised".
  328. ###
  329. ###
  330. ###
  331. ### CHANGELOG:
  332. ### ----------
  333. ###
  334. ### v1.4.20 mod2: remove deblock mod16 warnings, pad and crop internally
  335. ###
  336. ### v1.4.20 mod : add "p1nr", "p2nr", "ppnr", "shF", "aaF", "dbF" to allow custom filters
  337. ###
  338. ### v1.4.20 : tweaked some settings
  339. ###           updated QED_Deblock version
  340. ###
  341. ### v1.4.18 : fixed anti-aliasing PP (was broken since v1.4.07)
  342. ###           updated MVTools-MaskTools-AddgrainC version
  343. ###
  344. ### v1.4.16 : added switch to avoid loading of unused filters
  345. ###           fixed a bug in anti-aliasing part
  346. ###
  347. ### v1.4.08 : fixed MOD16 warning when deblock=true
  348. ###
  349. ### v1.4.07 : improved masking in PP-stage
  350. ###           cleaned code (cosmetic)
  351. ###
  352. ### v1.4.00 : fixed bug with maxdiff=0
  353. ###           fixed speed issue in MCTemporalDenoisePP (+20%)
  354. ###           added "deblock" to MCTemporalDenoisePP
  355. ###           changed "flat" to "enhance"
  356. ###           cleaned and optimized all the code
  357. ###           changed some settings
  358. ###           updated documentation
  359. ###
  360. ### v1.3.09 : added MOD4 restriction
  361. ###           updated MVTools version
  362. ###
  363. ### v1.3.00 : added a post-denoising stage (see "post")
  364. ###           fixed a bug with fixFFT3D and defined p clip
  365. ###           changed "very high" to be less insane
  366. ###           renamed fixFFT3D to fixband
  367. ###           cleaned some stuff
  368. ###           adapted to LSFmod v1.8
  369. ###
  370. ### v1.2.02 : changed default gpu=true to gpu=false (set gpu=true if you want speed!!!)
  371. ###           adapted to LSFmod v1.7
  372. ###
  373. ### v1.2.00 : adapted for LSFmod v1.6 & GradFun2DBmod v1.3
  374. ###           changed sharp int->bool (deleted sharp=1)
  375. ###
  376. ### v1.1.27 : fixed a bug in MCTemporalDenoisePP with chroma=false
  377. ###           adapted for LSFmod v1.5
  378. ###
  379. ### v1.1.26 : changed "flat" post-processing to use GradFun2DBmod
  380. ###           changed int->float for AGstr
  381. ###           fixed a small bug in AA
  382. ###
  383. ### v1.1.24 : fixed a chroma bug with PP
  384. ###
  385. ### v1.1.23 : adapted script for MvTools v2.3.0 (deleted MT & idx parameters)
  386. ###           changed MCTemporalDenoisePP's defaults (now the same as MCTemporalDenoise)
  387. ###           deleted safe parameter (slow & useless)
  388. ###           changed some minor things
  389. ###
  390. ### v1.0.03 : fixed a bug in MCTemporalDenoisePP
  391. ###
  392. ### v1.0.02 : changed defaults according to new LSFmod v1.2
  393. ###
  394. ### v1.0.01 : fixed a speed issue in MCTemporalDenoisePP (introduced in beta5)
  395. ###           changed documentation about MCTemporalDenoisePP
  396. ###
  397. ### v1.0.00 : first stable version
  398. ###           changed sharp=2, need LSFmod v1.0 !
  399. ###           fixed a bug introduced in beta5
  400. ###
  401. ### 1.0beta5: added new sharpening routine & deleted LSF (SHmode,Slimit,Sovershoot,Tlimit,Tovershoot)
  402. ###           changed some code (cosmetic)
  403. ###
  404. ### 1.0beta4: changed some descriptions & blksize default (submitted by Didée)
  405. ###           added auto blksize setting (16:HD & 8:SD, if you want speed use 16)
  406. ###
  407. ### 1.0beta3: all post-processing filters are now usable as a standalone function (MCTemporalDenoisePP)
  408. ###           added MC-antialiasing (see reduc parameter)
  409. ###
  410. ### 1.0beta2: fixed MOD16 restriction (effective only if deblock=true)
  411. ###           small speedup/fix with limit>0 and/or protect=true&maxdiff>0
  412. ###           added warning about GPU & MT in the documentation
  413. ###
  414. ### 1.0beta1: changed name Udegrain --> MCTemporalDenoise (to be more specific and avoid confusion with chroma)
  415. ###           added the choice to use MDegrain (since the chroma bug in MDegrain is fixed, +50% speed)
  416. ###           added twopass option to do the denoising job in two stage (very effective but slow)
  417. ###           added MT parameter for MVTools (be careful +- unstable)
  418. ###           added fixFFT3D parameter to prevent banding/posterize with limit=-1
  419. ###           added stabilize options (stabilize,maxr,TTstr)
  420. ###           added deblock options (deblock,useQED,quant1,quant2)
  421. ###           added new presets "light"(=low)/"heavy"(=medium) --> 5 presets (very high is 'a bit' extrem)
  422. ###           added check/warning for some settings
  423. ###           added thSAD2 & limit2 parameters for twopass=true
  424. ###           added overrange parameter for controling sharpness (useful for sharpening more than the source)
  425. ###           changed +- much code to implement twopass/MDegrain/MT, should be bug free (I hope)
  426. ###           changed sharp->MVsharp & post->sharp
  427. ###           changed "light Smode4" --> LimitedSharpenFaster for sharp=2 (strength,Smode,overshoot)
  428. ###           reduced max radius to 6
  429. ###           optimized chroma in PP stage (+20% with all PP on)
  430. ###           fixed a bug with external p clip
  431. ###           fixed a bug in Star&Bright Point Protection with maxdiff>0
  432. ###           added YV12&MOD16 restriction
  433. ###           changed some settings due to new presets
  434. ###           restriction when using MT=true: bt=1 in FFT3Dgpu & plane=4 in MDegrainMulti (will be removed when fixed)
  435. ###
  436. ### v0.9.05a: changed version number: vX.XX branch -> v0.X.XX branch
  437. ###           added AA options (AA,useEEDI2,maxd,AAthr,method)
  438. ###           changed dering --> edgeclean: you can now use your own script
  439. ###           fixed bug with show=true
  440. ###           fixed bug with chroma in PP stage
  441. ###           fixed omission with chroma=false in MAnalyse
  442. ###           changed some settings
  443. ###           added changelog in .avsi
  444. ###
  445. ### v0.9.01a: added adapt & SS for sharpening
  446. ###           added dering option (dering, DRGrad, DRGthr, RGmode)
  447. ###           added flat areas processing (flat, AGstr, GFthr, bias)
  448. ###           added modX(=blocksize) checking
  449. ###           changed some default settings
  450. ###           updated documentation in .avsi
  451. ###
  452. ### v0.8.08c: fixed bug with chroma=false & interlaced=true
  453. ###
  454. ### v0.8.08b: added mocomp contra-sharpening (basic contra-sharpening always usable)
  455. ###
  456. ### v0.7.29a: added star & bright points protection
  457. ###           changed some default options
  458. ###           added more options for FFT3D
  459. ###           added YV12 checking
  460. ###
  461. ### v0.7.25a: changed to chroma=false for light settings
  462. ###           added temporal limiter for sharpening
  463. ###
  464. ### v0.7.24a: replaced blankclip by nop
  465. ###
  466. ### v0.7.23a: first public release
  467. ###
  468. ####################################################################################################################################
  469.  
  470. # Based on dither_merge16_8 in Dither package (http://forum.doom9.org/showthread.php?p=1386559#post1386559)
  471. Function MCPP_merge16_8 (clip src1, clip src2, clip mask, bool "luma", int "y", int "u", int "v")
  472. {
  473.         vers = VersionNumber ()
  474.  
  475.         luma = Default (luma, false)
  476.        
  477.         y = Default (y, 3)
  478.         u = Default (u, 1)
  479.         v = Default (v, 1)
  480.        
  481.         Assert(y == 1 || y == 3, "MCPP_merge16_8: y can only be 1 or 3")
  482.         Assert(u == 1 || u == 3, "MCPP_merge16_8: u can only be 1 or 3")
  483.         Assert(v == 1 || v == 3, "MCPP_merge16_8: v can only be 1 or 3")
  484.  
  485.         w = mask.Width ()
  486.         h = mask.Height ()
  487.         Assert (src1.Width ()  == w)
  488.         Assert (src2.Width ()  == w)
  489.         Assert (src1.Height () == h * 2)
  490.         Assert (src2.Height () == h * 2)
  491.  
  492.         mask = (luma && (vers < 2.6 || ! src1.Dither_isy8 ()))
  493. \       ? mask.MergeChroma (mask.YToUV (mask).BilinearResize (w, h))
  494. \       : mask
  495.  
  496.         msb1 = src1.Dither_get_msb ()
  497.         lsb1 = src1.Dither_get_lsb ()
  498.         msb2 = src2.Dither_get_msb ()
  499.         lsb2 = src2.Dither_get_lsb ()
  500.  
  501.         p1a = Dither_lutxy8 (msb1, mask, expr="256 y - x *      ", y=y, u=u, v=v)
  502.         p1b = Dither_lutxy8 (lsb1, mask, expr="256 y - x * 256 /", y=y, u=u, v=v)
  503.  
  504.         p2a = Dither_lutxy8 (msb2, mask, expr="    y   x *      ", y=y, u=u, v=v)
  505.         p2b = Dither_lutxy8 (lsb2, mask, expr="    y   x * 256 /", y=y, u=u, v=v)
  506.  
  507.         p1 = Dither_add16 (p1a, p1b, wrap=True)
  508.         p2 = Dither_add16 (p2a, p2b, wrap=True)
  509.  
  510.         Dither_add16 (p1, p2, wrap=True)
  511. }
  512.  
  513. # Based on Dither_convert_8_to_16
  514. Function MCPP_convert_8_to_16 (clip src)
  515. {
  516.         StackVertical (src, BlankClip (src, pixel_type="YV12", color_yuv=0))
  517. }
  518.  
  519. # copied from Dither package
  520. Function MCPP_crop16 (clip src, int "left", int "top",
  521. \       int "width", int "height", bool "align")
  522. {
  523.         left   = Default (left,   0)
  524.         top    = Default (top,    0)
  525.         width  = Default (width,  0)
  526.         height = Default (height, 0)
  527.  
  528.         src
  529.         w = Width ()
  530.         h = Height () / 2
  531.  
  532.         width  = (width  <= 0) ? w - left + width  : width
  533.         height = (height <= 0) ? h - top  + height : height
  534.         Assert (width  > 0)
  535.         Assert (height > 0)
  536.  
  537.         msb = Crop (left, top,     width, height, align)
  538.         lsb = Crop (left, top + h, width, height, align)
  539.  
  540.         (top == 0 && height == h)
  541. \       ?       src.Crop (left, 0, width, 0)
  542. \       :       StackVertical (msb, lsb)
  543. }
  544.  
  545. Function MCPP_final_mt_merge (clip src1, clip src2, clip mask, bool "luma", int "y", int "u", int "v")
  546. {
  547.         src1 = (src1.height * 2 == src2.height    ) ? src1.MCPP_convert_8_to_16() : src1
  548.         src2 = (src1.height     == src2.height * 2) ? src2.MCPP_convert_8_to_16() : src2
  549.         return Eval( ((mask.height * 2 == src1.height) ? "MCPP_merge16_8" : "mt_merge") + "(src1, src2, mask, luma, y, u, v)")
  550. }
  551.  
  552. Function MCPP_final_MergeChroma (clip src1, clip src2)
  553. {
  554.         src1 = (src1.height * 2 == src2.height    ) ? src1.MCPP_convert_8_to_16() : src1
  555.         src2 = (src1.height     == src2.height * 2) ? src2.MCPP_convert_8_to_16() : src2
  556.         return src1.MergeChroma(src2)
  557. }
  558.  
  559.  
  560. function MCTD( clip i, int "radius", int "sigma", bool "twopass", bool "useTTmpSm", int "limit", int "limit2", int "post", bool "chroma", bool "interlaced",
  561. \              bool "sharp", bool "adapt", int "strength", int "SHmode", int "SHmethod", int "Slimit", int "Sovershoot", bool "Tlimit", int "Tovershoot", string "shF",
  562. \              bool "protect", int "cutoff", int "threshold", int "maxdiff",
  563. \              bool "AA", bool "useEEDI2", float "reduc", int "maxd", int "AAthr", int "method", string "aaF",
  564. \              bool "deblock", bool "useQED", int "quant1", int "quant2",
  565. \              bool "edgeclean", int "ECrad", int "ECthr", string "ECmode",
  566. \              bool "stabilize", int "maxr", int "TTstr",
  567. \              bool "enhance", float "GFthr", float "AGstr", int "bias", int "temp", string "dbF",
  568. \              int "bwbh", int "owoh", int "blksize", int "overlap",
  569. \              bool "GPU", bool "fixband", int "bt", int "ncpu", int "precision",
  570. \              int "thSAD", int "thSAD2", int "thSCD1", int "thSCD2",
  571. \              bool "truemotion", bool "MVglobal", int "pel", int "pelsearch", int "search", int "searchparam", int "MVsharp", int "DCT",
  572. \              clip "p", string "settings",
  573. \              bool "show", int "screenW", int "screenH",
  574. \              string "p1nr", string "p2nr", string "ppnr" )
  575. {
  576. ### VERSION
  577. version = "v1.4.20 mod2"
  578. Assert(isYV12(i) == True ? true : false, chr(10) + "This is not an YV12 clip ! Please convert color space to YV12 before using MCTD()" + chr(10))
  579.  
  580.  
  581. ### SETTINGS
  582. settings     = Default(settings, "low")
  583. settings_num =  -1
  584. settings_num = (settings == "very low")  ? 0 : settings_num
  585. settings_num = (settings == "low")       ? 1 : settings_num
  586. settings_num = (settings == "medium")    ? 2 : settings_num
  587. settings_num = (settings == "high")      ? 3 : settings_num
  588. settings_num = (settings == "very high") ? 4 : settings_num
  589. Assert(settings_num >=0 ? true : false, chr(10) + "These settings do not exist !" + chr(10))
  590.  
  591.    function MCTD_Defaults(clip clp, int "settings_num", string "setting")
  592.    {
  593.    HD = (clp.width > 1024 || clp.height > 576) ? true : false
  594.  
  595.    ### DEFAULTS                     #          VERY LOW           #             LOW             #            MEDIUM           #            HIGH             #          VERY HIGH          #
  596.    radius      = Select(settings_num,      1                      ,      2                      ,      3                      ,      2                      ,      3                      )
  597.    sigma       = Select(settings_num,      2                      ,      4                      ,      8                      ,      12                     ,      16                     )
  598.    twopass     = Select(settings_num,      false                  ,      false                  ,      false                  ,      true                   ,      true                   )
  599.    useTTmpSm   = Select(settings_num,      false                  ,      false                  ,      false                  ,      false                  ,      false                  )
  600.    limit       = Select(settings_num,      -1                     ,      -1                     ,      -1                     ,      -1                     ,      0                      )
  601.    limit2      = Select(settings_num,      -1                     ,      -1                     ,      -1                     ,      0                      ,      0                      )
  602.    post        = Select(settings_num,      0                      ,      0                      ,      0                      ,      0                      ,      0                      )
  603.    chroma      = Select(settings_num,      false                  ,      false                  ,      true                   ,      true                   ,      true                   )
  604.    interlaced  = Select(settings_num,      false                  ,      false                  ,      false                  ,      false                  ,      false                  )
  605.  
  606.    sharp       = Select(settings_num,      true                   ,      true                   ,      true                   ,      true                   ,      true                   )
  607.    adapt       = Select(settings_num,      true                   ,      true                   ,      true                   ,      true                   ,      true                   )
  608.    strength    = Select(settings_num,      100                    ,      100                    ,      150                    ,      200                    ,      200                    )
  609.    SHmode      = Select(settings_num,      3                      ,      3                      ,      3                      ,      3                      ,      3                      )
  610.    SHmethod    = Select(settings_num,      3                      ,      3                      ,      3                      ,      3                      ,      3                      )
  611.    Slimit      = Select(settings_num,      0                      ,      0                      ,      0                      ,      0                      ,      0                      )
  612.    Sovershoot  = Select(settings_num,      0                      ,      0                      ,      0                      ,      0                      ,      0                      )
  613.    Tlimit      = Select(settings_num,      true                   ,      true                   ,      true                   ,      true                   ,      true                   )
  614.    Tovershoot  = Select(settings_num,      2                      ,      2                      ,      1                      ,      0                      ,      0                      )
  615.    shF         = Select(settings_num,      "internal"             ,      "internal"             ,      "internal"             ,      "internal"             ,      "internal"             )
  616.  
  617.    protect     = Select(settings_num,      false                  ,      false                  ,      false                  ,      false                  ,      false                  )
  618.    cutoff      = Select(settings_num,      64                     ,      64                     ,      64                     ,      64                     ,      64                     )
  619.    threshold   = Select(settings_num,      16                     ,      16                     ,      16                     ,      16                     ,      16                     )
  620.    maxdiff     = Select(settings_num,      4                      ,      4                      ,      4                      ,      4                      ,      4                      )
  621.  
  622.    AA          = Select(settings_num,      false                  ,      false                  ,      false                  ,      false                  ,      false                  )
  623.    useEEDI2    = Select(settings_num,      true                   ,      true                   ,      false                  ,      false                  ,      false                  )
  624.    reduc       = Select(settings_num,      0.5                    ,      0.5                    ,      0.5                    ,      0.5                    ,      0.5                    )
  625.    maxd        = Select(settings_num,      24                     ,      24                     ,      48                     ,      48                     ,      48                     )
  626.    AAthr       = Select(settings_num,      64                     ,      32                     ,      32                     ,      16                     ,      16                     )
  627.    method      = Select(settings_num,      2                      ,      1                      ,      1                      ,      0                      ,      0                      )
  628.    aaF         = Select(settings_num,      "internal"             ,      "internal"             ,      "internal"             ,      "internal"             ,      "internal"             )
  629.  
  630.    deblock     = Select(settings_num,      false                  ,      false                  ,      false                  ,      false                  ,      false                  )
  631.    useQED      = Select(settings_num,      true                   ,      true                   ,      true                   ,      false                  ,      false                  )
  632.    quant1      = Select(settings_num,      10                     ,      20                     ,      30                     ,      30                     ,      40                     )
  633.    quant2      = Select(settings_num,      20                     ,      40                     ,      60                     ,      60                     ,      80                     )
  634.  
  635.    edgeclean   = Select(settings_num,      false                  ,      false                  ,      false                  ,      false                  ,      false                  )
  636.    ECrad       = Select(settings_num,      1                      ,      2                      ,      3                      ,      4                      ,      5                      )
  637.    ECthr       = Select(settings_num,      64                     ,      32                     ,      32                     ,      16                     ,      16                     )
  638.    ECmode      = Select(settings_num,      "Removegrain(2,0)"     ,      "Removegrain(2,0)"     ,      "Removegrain(2,2)"     ,      "Removegrain(4,4)"     ,      "Removegrain(4,4)"     )
  639.  
  640.    stabilize   = Select(settings_num,      false                  ,      false                  ,      false                  ,      true                   ,      true                   )
  641.    maxr        = Select(settings_num,      1                      ,      1                      ,      2                      ,      2                      ,      2                      )
  642.    TTstr       = Select(settings_num,      1                      ,      1                      ,      1                      ,      2                      ,      2                      )
  643.  
  644.    enhance     = Select(settings_num,      true                   ,      true                   ,      false                  ,      false                  ,      false                  )
  645.    GFthr       = Select(settings_num,      1.1                    ,      1.2                    ,      1.4                    ,      1.6                    ,      1.8                    )
  646.    AGstr       = Select(settings_num,      0.6                    ,      0.8                    ,      1.2                    ,      1.8                    ,      2.4                    )
  647.    bias        = Select(settings_num,      64                     ,      64                     ,      64                     ,      64                     ,      64                     )
  648.    temp        = Select(settings_num,      50                     ,      50                     ,      50                     ,      50                     ,      50                     )
  649.    dbF         = Select(settings_num,      "internal"             ,      "internal"             ,      "internal"             ,      "internal"             ,      "internal"             )
  650.  
  651.    bwbh        = Select(settings_num,      HD?16:8                ,      HD?16:8                ,      HD?16:8                ,      HD?16:8                ,      HD?16:8                )
  652.    owoh        = Select(settings_num,      HD? 8:4                ,      HD? 8:4                ,      HD? 8:4                ,      HD? 8:4                ,      HD? 8:4                )
  653.    blksize     = Select(settings_num,      HD?16:8                ,      HD?16:8                ,      HD?16:8                ,      HD?16:8                ,      HD?16:8                )
  654.    overlap     = Select(settings_num,      HD? 8:4                ,      HD? 8:4                ,      HD? 8:4                ,      HD? 8:4                ,      HD? 8:4                )
  655.  
  656.    GPU         = Select(settings_num,      false                  ,      false                  ,      false                  ,      false                  ,      false                  )
  657.    fixband     = Select(settings_num,      true                   ,      true                   ,      true                   ,      true                   ,      true                   )
  658.    bt          = Select(settings_num,      1                      ,      3                      ,      3                      ,      3                      ,      4                      )
  659.    ncpu        = Select(settings_num,      1                      ,      1                      ,      1                      ,      1                      ,      1                      )
  660.    precision   = Select(settings_num,      2                      ,      2                      ,      2                      ,      2                      ,      2                      )
  661.  
  662.    thSAD       = Select(settings_num,      200                    ,      300                    ,      400                    ,      500                    ,      600                    )
  663.    thSAD2      = Select(settings_num,      200                    ,      300                    ,      400                    ,      500                    ,      600                    )
  664.    thSCD1      = Select(settings_num,      200                    ,      300                    ,      400                    ,      500                    ,      600                    )
  665.    thSCD2      = Select(settings_num,      90                     ,      100                    ,      100                    ,      130                    ,      130                    )
  666.  
  667.    truemotion  = Select(settings_num,      false                  ,      false                  ,      false                  ,      false                  ,      false                  )
  668.    MVglobal    = Select(settings_num,      true                   ,      true                   ,      true                   ,      true                   ,      true                   )
  669.    pel         = Select(settings_num,      1                      ,      2                      ,      2                      ,      2                      ,      2                      )
  670.    pelsearch   = Select(settings_num,      1                      ,      2                      ,      2                      ,      2                      ,      2                      )
  671.    search      = Select(settings_num,      2                      ,      2                      ,      2                      ,      2                      ,      2                      )
  672.    searchparam = Select(settings_num,      2                      ,      2                      ,      2                      ,      2                      ,      2                      )
  673.    MVsharp     = Select(settings_num,      2                      ,      2                      ,      2                      ,      1                      ,      0                      )
  674.    DCT         = Select(settings_num,      0                      ,      0                      ,      0                      ,      0                      ,      0                      )
  675.  
  676.    show        = Select(settings_num,      false                  ,      false                  ,      false                  ,      false                  ,      false                  )
  677.    screenW     = Select(settings_num,      1280                   ,      1280                   ,      1280                   ,      1280                   ,      1280                   )
  678.    screenH     = Select(settings_num,      1024                   ,      1024                   ,      1024                   ,      1024                   ,      1024                   )
  679.  
  680.    return Eval(setting)
  681.    }
  682.  
  683. radius      = default(radius,       MCTD_Defaults( i, settings_num, "radius"      ) )
  684. sigma       = default(sigma,        MCTD_Defaults( i, settings_num, "sigma"       ) )
  685. twopass     = default(twopass,      MCTD_Defaults( i, settings_num, "twopass"     ) )
  686. useTTmpSm   = default(useTTmpSm,    MCTD_Defaults( i, settings_num, "useTTmpSm"   ) )
  687. limit       = default(limit,        MCTD_Defaults( i, settings_num, "limit"       ) )
  688. limit2      = default(limit2,       MCTD_Defaults( i, settings_num, "limit2"      ) )
  689. post        = default(post,         MCTD_Defaults( i, settings_num, "post"        ) )
  690. chroma      = default(chroma,       MCTD_Defaults( i, settings_num, "chroma"      ) )
  691. interlaced  = default(interlaced,   MCTD_Defaults( i, settings_num, "interlaced"  ) )
  692.  
  693. sharp       = default(sharp,        MCTD_Defaults( i, settings_num, "sharp"       ) )
  694. adapt       = default(adapt,        MCTD_Defaults( i, settings_num, "adapt"       ) )
  695. strength    = default(strength,     MCTD_Defaults( i, settings_num, "strength"    ) )
  696. SHmode      = default(SHmode,       MCTD_Defaults( i, settings_num, "SHmode"      ) )
  697. SHmethod    = default(SHmethod,     MCTD_Defaults( i, settings_num, "SHmethod"    ) )
  698. Slimit      = default(Slimit,       MCTD_Defaults( i, settings_num, "Slimit"      ) )
  699. Sovershoot  = default(Sovershoot,   MCTD_Defaults( i, settings_num, "Sovershoot"  ) )
  700. Tlimit      = default(Tlimit,       MCTD_Defaults( i, settings_num, "Tlimit"      ) )
  701. Tovershoot  = default(Tovershoot,   MCTD_Defaults( i, settings_num, "Tovershoot"  ) )
  702. shF         = default(shF,          MCTD_Defaults( i, settings_num, "shF"         ) )
  703.  
  704. protect     = default(protect,      MCTD_Defaults( i, settings_num, "protect"     ) )
  705. cutoff      = default(cutoff,       MCTD_Defaults( i, settings_num, "cutoff"      ) )
  706. threshold   = default(threshold,    MCTD_Defaults( i, settings_num, "threshold"   ) )
  707. maxdiff     = default(maxdiff,      MCTD_Defaults( i, settings_num, "maxdiff"     ) )
  708.  
  709. AA          = default(AA,           MCTD_Defaults( i, settings_num, "AA"          ) )
  710. useEEDI2    = default(useEEDI2,     MCTD_Defaults( i, settings_num, "useEEDI2"    ) )
  711. reduc       = default(reduc,        MCTD_Defaults( i, settings_num, "reduc"       ) )
  712. maxd        = default(maxd,         MCTD_Defaults( i, settings_num, "maxd"        ) )
  713. AAthr       = default(AAthr,        MCTD_Defaults( i, settings_num, "AAthr"       ) )
  714. method      = default(method,       MCTD_Defaults( i, settings_num, "method"      ) )
  715. aaF         = default(aaF,          MCTD_Defaults( i, settings_num, "aaF"         ) )
  716.  
  717. deblock     = default(deblock,      MCTD_Defaults( i, settings_num, "deblock"     ) )
  718. useQED      = default(useQED,       MCTD_Defaults( i, settings_num, "useQED"      ) )
  719. quant1      = default(quant1,       MCTD_Defaults( i, settings_num, "quant1"      ) )
  720. quant2      = default(quant2,       MCTD_Defaults( i, settings_num, "quant2"      ) )
  721.  
  722. edgeclean   = default(edgeclean,    MCTD_Defaults( i, settings_num, "edgeclean"   ) )
  723. ECrad       = default(ECrad,        MCTD_Defaults( i, settings_num, "ECrad"       ) )
  724. ECthr       = default(ECthr,        MCTD_Defaults( i, settings_num, "ECthr"       ) )
  725. ECmode      = default(ECmode,       MCTD_Defaults( i, settings_num, "ECmode"      ) )
  726.  
  727. stabilize   = default(stabilize,    MCTD_Defaults( i, settings_num, "stabilize"   ) )
  728. maxr        = default(maxr,         MCTD_Defaults( i, settings_num, "maxr"        ) )
  729. TTstr       = default(TTstr,        MCTD_Defaults( i, settings_num, "TTstr"       ) )
  730.  
  731. enhance     = default(enhance,      MCTD_Defaults( i, settings_num, "enhance"     ) )
  732. GFthr       = default(GFthr,        MCTD_Defaults( i, settings_num, "GFthr"       ) )
  733. AGstr       = default(AGstr,        MCTD_Defaults( i, settings_num, "AGstr"       ) )
  734. bias        = default(bias,         MCTD_Defaults( i, settings_num, "bias"        ) )
  735. temp        = default(temp,         MCTD_Defaults( i, settings_num, "temp"        ) )
  736. dbF         = default(dbF,          MCTD_Defaults( i, settings_num, "dbF"         ) )
  737.  
  738. bwbh        = default(bwbh,         MCTD_Defaults( i, settings_num, "bwbh"        ) )
  739. owoh        = default(owoh,         MCTD_Defaults( i, settings_num, "owoh"        ) )
  740. blksize     = default(blksize,      MCTD_Defaults( i, settings_num, "blksize"     ) )
  741. overlap     = default(overlap,      MCTD_Defaults( i, settings_num, "overlap"     ) )
  742.  
  743. GPU         = default(GPU,          MCTD_Defaults( i, settings_num, "GPU"         ) )
  744. fixband     = default(fixband,      MCTD_Defaults( i, settings_num, "fixband"     ) )
  745. bt          = default(bt,           MCTD_Defaults( i, settings_num, "bt"          ) )
  746. ncpu        = default(ncpu,         MCTD_Defaults( i, settings_num, "ncpu"        ) )
  747. precision   = default(precision,    MCTD_Defaults( i, settings_num, "precision"   ) )
  748.  
  749. thSAD       = default(thSAD,        MCTD_Defaults( i, settings_num, "thSAD"       ) )
  750. thSAD2      = default(thSAD2,       MCTD_Defaults( i, settings_num, "thSAD2"      ) )
  751. thSCD1      = default(thSCD1,       MCTD_Defaults( i, settings_num, "thSCD1"      ) )
  752. thSCD2      = default(thSCD2,       MCTD_Defaults( i, settings_num, "thSCD2"      ) )
  753.  
  754. truemotion  = default(truemotion,   MCTD_Defaults( i, settings_num, "truemotion"  ) )
  755. MVglobal    = default(MVglobal,     MCTD_Defaults( i, settings_num, "MVglobal"    ) )
  756. pel         = default(pel,          MCTD_Defaults( i, settings_num, "pel"         ) )
  757. pelsearch   = default(pelsearch,    MCTD_Defaults( i, settings_num, "pelsearch"   ) )
  758. search      = default(search,       MCTD_Defaults( i, settings_num, "search"      ) )
  759. searchparam = default(searchparam,  MCTD_Defaults( i, settings_num, "searchparam" ) )
  760. MVsharp     = default(MVsharp,      MCTD_Defaults( i, settings_num, "MVsharp"     ) )
  761. DCT         = default(DCT,          MCTD_Defaults( i, settings_num, "DCT"         ) )
  762.  
  763. show        = default(show,         MCTD_Defaults( i, settings_num, "show"        ) )
  764. screenW     = default(screenW,      MCTD_Defaults( i, settings_num, "screenW"     ) )
  765. screenH     = default(screenH,      MCTD_Defaults( i, settings_num, "screenH"     ) )
  766.  
  767. show_p      = defined(p) ? "external" : "internal"
  768.  
  769.  
  770. ### WARNING
  771. Assert((radius>=1&&radius<=6)         ? true : false, chr(10) + "'radius' have not a correct value! [0-6]" + chr(10))
  772. Assert((limit>=-1&&limit<=255)        ? true : false, chr(10) + "'limit' have not a correct value! [-1,0,...255]" + chr(10))
  773. Assert((limit2>=-1&&limit2<=255)      ? true : false, chr(10) + "'limit' have not a correct value! [-1,0,...255]" + chr(10))
  774. Assert((Tovershoot>=0)                ? true : false, chr(10) + "'Tovershoot' have not a correct value! [>=0]" + chr(10))
  775. Assert((cutoff>=0&&cutoff<=255)       ? true : false, chr(10) + "'cutoff' have not a correct value! [0,...,255]" + chr(10))
  776. Assert((threshold>=0&&threshold<=127) ? true : false, chr(10) + "'threshold' have not a correct value! [0,...,127]" + chr(10))
  777. Assert((maxdiff>=0&&maxdiff<=255)     ? true : false, chr(10) + "'maxdiff' have not a correct value! [0,...,255]" + chr(10))
  778. Assert((reduc>=-1&&reduc<=1.0)        ? true : false, chr(10) + "'reduc' have not a correct value! [-1,0.0,...,1.0]" + chr(10))
  779. Assert((AAthr>=0&&AAthr<=255)         ? true : false, chr(10) + "'AAthr' have not a correct value! [0,...,255]" + chr(10))
  780. Assert((method>=0&&method<=2)         ? true : false, chr(10) + "'method' have not a correct value! [0,1,2]" + chr(10))
  781. Assert((ECrad>=1)                     ? true : false, chr(10) + "'ECrad' have not a correct value! [>=1]" + chr(10))
  782. Assert((ECthr>=0&&ECthr<=255)         ? true : false, chr(10) + "'ECthr' have not a correct value! [0,...,255]" + chr(10))
  783.  
  784.  
  785. ### INPUT
  786. i   = (interlaced==true) ? i.separatefields() : i
  787.  
  788. mod = (bwbh>=blksize) ? bwbh : blksize
  789. xi  = i.width()
  790. xf  = ceil(xi/float(mod))*mod - xi + mod
  791. xn  = int(xi+xf)
  792. yi  = i.height()
  793. yf  = ceil(yi/float(mod))*mod - yi + mod
  794. yn  = int(yi+yf)
  795. idb = i
  796. i   = i.pointresize(xn,yn,-xf/2,-yf/2,xn,yn)
  797.  
  798. m4 = ((int(xi/4.0)*4==xi)&&(int(yi/4.0)*4==yi)) ? true : false
  799. Assert( m4 ? true : false, chr(10) + "This is not a MOD4 clip! Please use crop() or addborders() before using MCTD()" + chr(10))
  800.  
  801. ### PREFILTERING
  802. p = defined(p)                   ? p.pointresize(xn,yn,-xf/2,-yf/2,xn,yn)
  803. \ : (sigma==0)                   ? i
  804. \ : (GPU==false&&fixband==false) ? i.FFT3Dfilter(sigma=sigma*0.8,sigma2=sigma*0.6,sigma3=sigma*0.4,sigma4=sigma*0.2,bw=bwbh,bh=bwbh,ow=owoh,oh=owoh,plane=chroma?4:0,bt=bt,ncpu=ncpu)
  805. \ : (GPU==true &&fixband==false) ? i.FFT3Dgpu(sigma=sigma*0.8,sigma2=sigma*0.6,sigma3=sigma*0.4,sigma4=sigma*0.2,bw=bwbh,bh=bwbh,ow=owoh,oh=owoh,plane=chroma?4:0,bt=bt,precision=precision)
  806. \ : (GPU==false&&fixband==true ) ? i.FFT3Dfilter(sigma=sigma*0.8,sigma2=sigma*0.6,sigma3=sigma*0.4,sigma4=sigma*0.2,bw=bwbh,bh=bwbh,ow=owoh,oh=owoh,plane=chroma?4:0,bt=bt,ncpu=ncpu).gradfun2db(thr=1.0+sigma*0.05)
  807. \ :                                i.FFT3Dgpu(sigma=sigma*0.8,sigma2=sigma*0.6,sigma3=sigma*0.4,sigma4=sigma*0.2,bw=bwbh,bh=bwbh,ow=owoh,oh=owoh,plane=chroma?4:0,bt=bt,precision=precision).gradfun2db(thr=1.0+sigma*0.05)
  808.  
  809.  
  810. ### DEBLOCKING
  811. padX = xi%8 == 0 ? 0 : (8 - xi%8)
  812. padY = yi%8 == 0 ? 0 : (8 - yi%8)
  813.  
  814. d  = (deblock==false) ? i
  815. \  : (useQED==true)   ? idb.deblock_QED(quant1=quant1,quant2=quant2,uv=chroma?3:2).pointresize(xn,yn,-xf/2,-yf/2,xn,yn)
  816. \  : ( padX==0 && padY==0 ) ? idb.deblock(quant=int(quant1*0.5+quant2*0.5)).pointresize(xn,yn,-xf/2,-yf/2,xn,yn)
  817. \  : idb.pointresize(xi+padX, yi+padY, 0, 0, xi+padX, xi+padY).deblock(quant=int(quant1*0.5+quant2*0.5)).pointresize(xn,yn,-xf/2,-yf/2,xn-padX,yn-padX)
  818.  
  819. ### PREPARING
  820. nullclip = Blankclip()
  821.  
  822. pMVS = p.MSuper(hpad=0,vpad=0,pel=pel,sharp=MVsharp,chroma=chroma)
  823.  
  824. f1v = (radius<1) ? nullclip
  825. \   :              pMVS.MAnalyse(isb=false, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  826. f2v = (radius<2) ? nullclip
  827. \   :              pMVS.MAnalyse(isb=false, delta=2, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  828. f3v = (radius<3) ? nullclip
  829. \   :              pMVS.MAnalyse(isb=false, delta=3, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  830. f4v = (radius<4) ? nullclip
  831. \   :              pMVS.MAnalyse(isb=false, delta=4, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  832. f5v = (radius<5) ? nullclip
  833. \   :              pMVS.MAnalyse(isb=false, delta=5, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  834. f6v = (radius<6) ? nullclip
  835. \   :              pMVS.MAnalyse(isb=false, delta=6, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  836. b1v = (radius<1) ? nullclip
  837. \   :              pMVS.MAnalyse(isb=true, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  838. b2v = (radius<2) ? nullclip
  839. \   :              pMVS.MAnalyse(isb=true, delta=2, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  840. b3v = (radius<3) ? nullclip
  841. \   :              pMVS.MAnalyse(isb=true, delta=3, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  842. b4v = (radius<4) ? nullclip
  843. \   :              pMVS.MAnalyse(isb=true, delta=4, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  844. b5v = (radius<5) ? nullclip
  845. \   :              pMVS.MAnalyse(isb=true, delta=5, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  846. b6v = (radius<6) ? nullclip
  847. \   :              pMVS.MAnalyse(isb=true, delta=6, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=chroma)
  848.  
  849.    function MCTD_CTM(clip "i", clip "iMVS", clip "SAD_f1m", clip "SAD_b1m", clip "f1c", clip "b1c",
  850.    \                 clip "f1v", clip "f2v", clip "f3v", clip "f4v", clip "f5v", clip "f6v", clip "b1v", clip "b2v", clip "b3v", clip "b4v", clip "b5v", clip "b6v",
  851.    \                 int "radius", bool "chroma", int "thSAD", int "thSCD1", int "thSCD2", string "cnr")
  852.    {
  853.    nullclip = BlankClip()
  854.  
  855.    SAD_f2m = (radius>=2) ? i.MMask(f2v, kind=1, ml=thSAD, gamma=0.999, Ysc=255) : nullclip
  856.    SAD_f3m = (radius>=3) ? i.MMask(f3v, kind=1, ml=thSAD, gamma=0.999, Ysc=255) : nullclip
  857.    SAD_f4m = (radius>=4) ? i.MMask(f4v, kind=1, ml=thSAD, gamma=0.999, Ysc=255) : nullclip
  858.    SAD_f5m = (radius>=5) ? i.MMask(f5v, kind=1, ml=thSAD, gamma=0.999, Ysc=255) : nullclip
  859.    SAD_f6m = (radius>=6) ? i.MMask(f6v, kind=1, ml=thSAD, gamma=0.999, Ysc=255) : nullclip
  860.    SAD_b2m = (radius>=2) ? i.MMask(b2v, kind=1, ml=thSAD, gamma=0.999, Ysc=255) : nullclip
  861.    SAD_b3m = (radius>=3) ? i.MMask(b3v, kind=1, ml=thSAD, gamma=0.999, Ysc=255) : nullclip
  862.    SAD_b4m = (radius>=4) ? i.MMask(b4v, kind=1, ml=thSAD, gamma=0.999, Ysc=255) : nullclip
  863.    SAD_b5m = (radius>=5) ? i.MMask(b5v, kind=1, ml=thSAD, gamma=0.999, Ysc=255) : nullclip
  864.    SAD_b6m = (radius>=6) ? i.MMask(b6v, kind=1, ml=thSAD, gamma=0.999, Ysc=255) : nullclip
  865.  
  866.    b     = BlankClip(i,color_yuv=$008080)
  867.    SAD_m = (radius==6) ? interleave(SAD_f6m, SAD_f5m, SAD_f4m, SAD_f3m, SAD_f2m, SAD_f1m, b, SAD_b1m, SAD_b2m, SAD_b3m, SAD_b4m, SAD_b5m, SAD_b6m)
  868.    \     : (radius==5) ? interleave(         SAD_f5m, SAD_f4m, SAD_f3m, SAD_f2m, SAD_f1m, b, SAD_b1m, SAD_b2m, SAD_b3m, SAD_b4m, SAD_b5m         )
  869.    \     : (radius==4) ? interleave(                  SAD_f4m, SAD_f3m, SAD_f2m, SAD_f1m, b, SAD_b1m, SAD_b2m, SAD_b3m, SAD_b4m                  )
  870.    \     : (radius==3) ? interleave(                           SAD_f3m, SAD_f2m, SAD_f1m, b, SAD_b1m, SAD_b2m, SAD_b3m                           )
  871.    \     : (radius==2) ? interleave(                                    SAD_f2m, SAD_f1m, b, SAD_b1m, SAD_b2m                                    )
  872.    \     : (radius==1) ? interleave(                                             SAD_f1m, b, SAD_b1m                                             )
  873.    \     : nullclip
  874.  
  875.    b2c = (radius>=2)  ? i.MCompensate(iMVS, b2v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
  876.    b3c = (radius>=3)  ? i.MCompensate(iMVS, b3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
  877.    b4c = (radius>=4)  ? i.MCompensate(iMVS, b4v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
  878.    b5c = (radius>=5)  ? i.MCompensate(iMVS, b5v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
  879.    b6c = (radius>=6)  ? i.MCompensate(iMVS, b6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
  880.    f2c = (radius>=2)  ? i.MCompensate(iMVS, f2v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
  881.    f3c = (radius>=3)  ? i.MCompensate(iMVS, f3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
  882.    f4c = (radius>=4)  ? i.MCompensate(iMVS, f4v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
  883.    f5c = (radius>=5)  ? i.MCompensate(iMVS, f5v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
  884.    f6c = (radius>=6)  ? i.MCompensate(iMVS, f6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2) : nullclip
  885.    
  886.    c = (radius==6) ? interleave(f6c, f5c, f4c, f3c, f2c, f1c, i, b1c, b2c, b3c, b4c, b5c, b6c)
  887.    \ : (radius==5) ? interleave(     f5c, f4c, f3c, f2c, f1c, i, b1c, b2c, b3c, b4c, b5c     )
  888.    \ : (radius==4) ? interleave(          f4c, f3c, f2c, f1c, i, b1c, b2c, b3c, b4c          )
  889.    \ : (radius==3) ? interleave(               f3c, f2c, f1c, i, b1c, b2c, b3c               )
  890.    \ : (radius==2) ? interleave(                    f2c, f1c, i, b1c, b2c                    )
  891.    \ : (radius==1) ? interleave(                         f1c, i, b1c                         )
  892.    \ : nullclip
  893.  
  894.    sm = Defined(cnr) ? Eval("c."+cnr)
  895.    \  : c.TTempSmooth(radius,255,255,1,1,strength=radius+1,pfclip=SAD_m,fp=false,scthresh=99.9)
  896.    sm = sm.SelectEvery(1+radius*2,radius)
  897.    
  898.    return sm
  899.    }
  900.  
  901.    function MCTD_MVD(clip "i", clip "iMVS",
  902.    \                 clip "f1v", clip "f2v", clip "f3v", clip "f4v", clip "f5v", clip "f6v", clip "b1v", clip "b2v", clip "b3v", clip "b4v", clip "b5v", clip "b6v",
  903.    \                 int "radius", bool "chroma", int "thSAD", int "thSCD1", int "thSCD2")
  904.    {
  905.    nullclip = BlankClip()
  906.  
  907.    mv12  = (radius==4) ? i.MDegrain2(iMVS, b1v, f1v, b2v, f2v,           thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, plane=chroma?4:0) : nullclip
  908.    mv34  = (radius==4) ? i.MDegrain2(iMVS, b3v, f3v, b4v, f4v,           thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, plane=chroma?4:0) : nullclip
  909.    mv45  = (radius==5) ? i.MDegrain2(iMVS, b4v, f4v, b5v, f5v,           thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, plane=chroma?4:0) : nullclip
  910.    mv123 = (radius>=5) ? i.MDegrain3(iMVS, b1v, f1v, b2v, f2v, b3v, f3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, plane=chroma?4:0) : nullclip
  911.    mv456 = (radius==6) ? i.MDegrain3(iMVS, b4v, f4v, b5v, f5v, b6v, f6v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, plane=chroma?4:0) : nullclip
  912.    
  913.    sm = (radius==1) ? i.MDegrain1(iMVS, b1v, f1v,                     thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, plane=chroma?4:0)
  914.    \  : (radius==2) ? i.MDegrain2(iMVS, b1v, f1v, b2v, f2v,           thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, plane=chroma?4:0)
  915.    \  : (radius==3) ? i.MDegrain3(iMVS, b1v, f1v, b2v, f2v, b3v, f3v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, plane=chroma?4:0)
  916.    \  : (radius==4) ? Merge(mv12,  mv34,  0.4444)
  917.    \  : (radius==5) ? Merge(mv123, mv45,  0.4545)
  918.    \  :               Merge(mv123, mv456, 0.4615)
  919.    
  920.    return sm
  921.    }
  922.  
  923. dMVS    = d.MSuper(hpad=0,vpad=0,pel=pel,sharp=MVsharp,chroma=chroma)
  924. SAD_f1m = d.MMask(f1v, kind=1, ml=thSAD, gamma=0.999, Ysc=255)
  925. SAD_b1m = d.MMask(b1v, kind=1, ml=thSAD, gamma=0.999, Ysc=255)
  926. f1c     = d.MCompensate(dMVS, f1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
  927. b1c     = d.MCompensate(dMVS, b1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
  928.  
  929.  
  930. ### DENOISING: FIRST PASS
  931. sm = ( Defined(p1nr) ) ? MCTD_CTM(i=d, iMVS=dMVS, SAD_f1m=SAD_f1m, SAD_b1m=SAD_b1m, f1c=f1c, b1c=b1c,
  932. \                                 f1v=f1v, f2v=f2v, f3v=f3v, f4v=f4v, f5v=f5v, f6v=f6v, b1v=b1v, b2v=b2v, b3v=b3v, b4v=b4v, b5v=b5v, b6v=b6v,
  933. \                                 radius=radius, chroma=chroma, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, cnr=p1nr)
  934. \  : (useTTmpSm==true) ? MCTD_CTM(i=d, iMVS=dMVS, SAD_f1m=SAD_f1m, SAD_b1m=SAD_b1m, f1c=f1c, b1c=b1c,
  935. \                                 f1v=f1v, f2v=f2v, f3v=f3v, f4v=f4v, f5v=f5v, f6v=f6v, b1v=b1v, b2v=b2v, b3v=b3v, b4v=b4v, b5v=b5v, b6v=b6v,
  936. \                                 radius=radius, chroma=chroma, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
  937. \  :                     MCTD_MVD(i=d, iMVS=dMVS,
  938. \                                 f1v=f1v, f2v=f2v, f3v=f3v, f4v=f4v, f5v=f5v, f6v=f6v, b1v=b1v, b2v=b2v, b3v=b3v, b4v=b4v, b5v=b5v, b6v=b6v,
  939. \                                 radius=radius, chroma=chroma, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
  940.  
  941. chr41 = chroma?4:1
  942. chr31 = chroma?3:1
  943. chr21 = chroma?2:1
  944. pD    = mt_makediff(i,p,U=chr31,V=chr31)
  945.  
  946. smD = mt_makediff(i,sm,U=chr31,V=chr31)
  947. DD  = (limit==-1) ? mt_lutxy(pD,smD,"x 128 - abs y 128 - abs < x y ?",U=chr31,V=chr31)
  948. \   : (limit>0)   ? mt_lutxy(sm,i,"x y - abs "+string(limit)+" <= x x y - 0 < y "+string(limit)+" - y "+string(limit)+" + ? ?",U=chr31,V=chr31)
  949. \   :               sm
  950. smL = (limit==-1) ? i.mt_makediff(DD,U=chr31,V=chr31) : DD
  951.  
  952.  
  953. ### DENOISING: SECOND PASS
  954. smLMVS = (twopass==true) ? smL.MSuper(hpad=0,vpad=0,pel=pel,sharp=MVsharp,chroma=chroma) : nullclip
  955.  
  956. sm = (twopass==false)  ? sm
  957. \  : ( Defined(p2nr) ) ? MCTD_CTM(i=d, iMVS=dMVS, SAD_f1m=SAD_f1m, SAD_b1m=SAD_b1m, f1c=f1c, b1c=b1c,
  958. \                                 f1v=f1v, f2v=f2v, f3v=f3v, f4v=f4v, f5v=f5v, f6v=f6v, b1v=b1v, b2v=b2v, b3v=b3v, b4v=b4v, b5v=b5v, b6v=b6v,
  959. \                                 radius=radius, chroma=chroma, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, cnr=p2nr)
  960. \  : (useTTmpSm==true) ? MCTD_CTM(i=smL, iMVS=smLMVS, SAD_f1m=SAD_f1m, SAD_b1m=SAD_b1m, f1c=f1c, b1c=b1c,
  961. \                                 f1v=f1v, f2v=f2v, f3v=f3v, f4v=f4v, f5v=f5v, f6v=f6v, b1v=b1v, b2v=b2v, b3v=b3v, b4v=b4v, b5v=b5v, b6v=b6v,
  962. \                                 radius=radius, chroma=chroma, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
  963. \  :                     MCTD_MVD(i=smL, iMVS=smLMVS,
  964. \                                 f1v=f1v, f2v=f2v, f3v=f3v, f4v=f4v, f5v=f5v, f6v=f6v, b1v=b1v, b2v=b2v, b3v=b3v, b4v=b4v, b5v=b5v, b6v=b6v,
  965. \                                 radius=radius, chroma=chroma, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
  966.  
  967. smD = mt_makediff(i,sm,U=chr31,V=chr31)
  968. DD  = (twopass==true&&limit2==-1) ? mt_lutxy(pD,smD,"x 128 - abs y 128 - abs < x y ?",U=chr31,V=chr31)
  969. \   : (twopass==true&&limit2>0)   ? mt_lutxy(sm,i,"x y - abs "+string(limit2)+" <= x x y - 0 < y "+string(limit2)+" - y "+string(limit2)+" + ? ?",U=chr31,V=chr31)
  970. \   :                               sm
  971. smL = (twopass==false) ? smL
  972. \   : (limit2==-1)     ? i.mt_makediff(DD,U=chr31,V=chr31)
  973. \   :                    DD
  974.  
  975.  
  976. ### POST-DENOISING: FFT3D
  977. smP = (post==0)    ? smL
  978. \   : Defined(ppnr)? Eval("smL."+ppnr)
  979. \   : (GPU==false) ? smL.FFT3Dfilter(sigma=post*0.8,sigma2=post*0.6,sigma3=post*0.4,sigma4=post*0.2,bw=bwbh,bh=bwbh,ow=owoh,oh=owoh,plane=chroma?4:0,bt=bt,ncpu=ncpu)
  980. \   :                smL.FFT3Dgpu(sigma=post*0.8,sigma2=post*0.6,sigma3=post*0.4,sigma4=post*0.2,bw=bwbh,bh=bwbh,ow=owoh,oh=owoh,plane=chroma?4:0,bt=bt,precision=precision)
  981. smP = (post==0)        ? smP
  982. \   : (fixband==false) ? smP
  983. \   :                    mt_makediff(smL,mt_makediff(smL,smP,U=chr31,V=chr31).gradfun2DB(thr=1.0+post*0.5),U=chr31,V=chr31)
  984.  
  985.  
  986. ### POST-PROCESSING
  987.    function MCTD_PP( clip denoised, clip "source",
  988.    \                 bool "sharp", bool "adapt", int "strength", int "SHmode", int "SHmethod", int "Slimit", int "Sovershoot", bool "Tlimit", int "Tovershoot", string "shF",
  989.    \                 bool "protect", int "cutoff", int "threshold", int "maxdiff",
  990.    \                 bool "AA", bool "useEEDI2", float "reduc", int "maxd", int "AAthr", int "method", string "aaF",
  991.    \                 bool "deblock", bool "useQED", int "quant1", int "quant2",          
  992.    \                 bool "edgeclean", int "ECrad", int "ECthr", string "ECmode",
  993.    \                 bool "stabilize", int "maxr", int "TTstr",
  994.    \                 bool "enhance", float "GFthr", float "AGstr", int "bias", int "temp", string "dbF",
  995.    \                 bool "chroma", string "settings",
  996.    \                 clip "f1v", clip "b1v", clip "f1c", clip "b1c", clip "SAD_f1m", clip "SAD_b1m", bool "internal" )
  997.    {
  998.    ### SETTINGS
  999.    settings     = Default(settings, "low")
  1000.    settings_num =  -1
  1001.    settings_num = (settings == "very low")  ? 0 : settings_num
  1002.    settings_num = (settings == "low")       ? 1 : settings_num
  1003.    settings_num = (settings == "medium")    ? 2 : settings_num
  1004.    settings_num = (settings == "high")      ? 3 : settings_num
  1005.    settings_num = (settings == "very high") ? 4 : settings_num
  1006.    Assert(settings_num >=0 ? true : false, chr(10) + "These settings do not exist !" + chr(10))
  1007.  
  1008.    sharp       = default(sharp,        false                                                  )
  1009.    adapt       = default(adapt,        MCTD_Defaults( denoised, settings_num, "adapt"       ) )
  1010.    strength    = default(strength,     MCTD_Defaults( denoised, settings_num, "strength"    ) )
  1011.    SHmode      = default(SHmode,       MCTD_Defaults( denoised, settings_num, "SHmode"      ) )
  1012.    SHmethod    = default(SHmethod,     MCTD_Defaults( denoised, settings_num, "SHmethod"    ) )
  1013.    Slimit      = default(Slimit,       MCTD_Defaults( denoised, settings_num, "Slimit"      ) )
  1014.    Sovershoot  = default(Sovershoot,   MCTD_Defaults( denoised, settings_num, "Sovershoot"  ) )
  1015.    Tlimit      = default(Tlimit,       MCTD_Defaults( denoised, settings_num, "Tlimit"      ) )
  1016.    Tovershoot  = default(Tovershoot,   MCTD_Defaults( denoised, settings_num, "Tovershoot"  ) )
  1017.    shF         = default(shF,          MCTD_Defaults( denoised, settings_num, "shF"         ) )
  1018.  
  1019.    protect     = default(protect,      false                                                  )
  1020.    cutoff      = default(cutoff,       MCTD_Defaults( denoised, settings_num, "cutoff"      ) )
  1021.    threshold   = default(threshold,    MCTD_Defaults( denoised, settings_num, "threshold"   ) )
  1022.    maxdiff     = default(maxdiff,      MCTD_Defaults( denoised, settings_num, "maxdiff"     ) )
  1023.  
  1024.    AA          = default(AA,           false                                                  )
  1025.    useEEDI2    = default(useEEDI2,     MCTD_Defaults( denoised, settings_num, "useEEDI2"    ) )
  1026.    reduc       = default(reduc,        MCTD_Defaults( denoised, settings_num, "reduc"       ) )
  1027.    maxd        = default(maxd,         MCTD_Defaults( denoised, settings_num, "maxd"        ) )
  1028.    AAthr       = default(AAthr,        MCTD_Defaults( denoised, settings_num, "AAthr"       ) )
  1029.    method      = default(method,       MCTD_Defaults( denoised, settings_num, "method"      ) )
  1030.    aaF         = default(aaF,          MCTD_Defaults( denoised, settings_num, "aaF"         ) )
  1031.  
  1032.    deblock     = default(deblock,      false                                                  )
  1033.    useQED      = default(useQED,       MCTD_Defaults( denoised, settings_num, "useQED"      ) )
  1034.    quant1      = default(quant1,       MCTD_Defaults( denoised, settings_num, "quant1"      ) )
  1035.    quant2      = default(quant2,       MCTD_Defaults( denoised, settings_num, "quant2"      ) )
  1036.  
  1037.    edgeclean   = default(edgeclean,    false                                                  )
  1038.    ECrad       = default(ECrad,        MCTD_Defaults( denoised, settings_num, "ECrad"       ) )
  1039.    ECthr       = default(ECthr,        MCTD_Defaults( denoised, settings_num, "ECthr"       ) )
  1040.    ECmode      = default(ECmode,       MCTD_Defaults( denoised, settings_num, "ECmode"      ) )
  1041.  
  1042.    stabilize   = default(stabilize,    false                                                  )
  1043.    maxr        = default(maxr,         MCTD_Defaults( denoised, settings_num, "maxr"        ) )
  1044.    TTstr       = default(TTstr,        MCTD_Defaults( denoised, settings_num, "TTstr"       ) )
  1045.  
  1046.    enhance     = default(enhance,      false                                                  )
  1047.    GFthr       = default(GFthr,        MCTD_Defaults( denoised, settings_num, "GFthr"       ) )
  1048.    AGstr       = default(AGstr,        MCTD_Defaults( denoised, settings_num, "AGstr"       ) )
  1049.    bias        = default(bias,         MCTD_Defaults( denoised, settings_num, "bias"        ) )
  1050.    temp        = default(temp,         MCTD_Defaults( denoised, settings_num, "temp"        ) )
  1051.    dbF         = default(dbF,          MCTD_Defaults( denoised, settings_num, "dbF"         ) )
  1052.  
  1053.    chroma      = default(chroma,       MCTD_Defaults( denoised, settings_num, "chroma"      ) )
  1054.    internal    = default(internal,     false                                                  )
  1055.  
  1056.    Assert((Tovershoot>=0)                ? true : false, chr(10) + "'Tovershoot' have not a correct value! [>=0]" + chr(10))
  1057.    Assert((cutoff>=0&&cutoff<=255)       ? true : false, chr(10) + "'cutoff' have not a correct value! [0,...,255]" + chr(10))
  1058.    Assert((threshold>=0&&threshold<=127) ? true : false, chr(10) + "'threshold' have not a correct value! [0,...,127]" + chr(10))
  1059.    Assert((maxdiff>=0&&maxdiff<=255)     ? true : false, chr(10) + "'maxdiff' have not a correct value! [0,...,255]" + chr(10))
  1060.    Assert((reduc>=-1&&reduc<=1.0)        ? true : false, chr(10) + "'reduc' have not a correct value! [-1,0.0,...,1.0]" + chr(10))
  1061.    Assert((AAthr>=0&&AAthr<=255)         ? true : false, chr(10) + "'AAthr' have not a correct value! [0,...,255]" + chr(10))
  1062.    Assert((method>=0&&method<=2)         ? true : false, chr(10) + "'method' have not a correct value! [0,1,2]" + chr(10))
  1063.    Assert((ECrad>=1)                     ? true : false, chr(10) + "'ECrad' have not a correct value! [>=1]" + chr(10))
  1064.    Assert((ECthr>=0&&ECthr<=255)         ? true : false, chr(10) + "'ECthr' have not a correct value! [0,...,255]" + chr(10))
  1065.  
  1066.    Assert((sharp==true||protect==true)&&defined(source)==false ? false : true, chr(10) + "Sharp & Protect need 'source' input in MCTD_PP !" + chr(10))
  1067.  
  1068.  
  1069.    ### WARNING
  1070.    Assert(isYV12(denoised) == True ? true : false, chr(10) + "This is not an YV12 clip ! Please convert color space to YV12 before using MCTD_PP()" + chr(10))
  1071.  
  1072.    w = denoised.width()
  1073.    h = denoised.height()
  1074.  
  1075.    m4 = (internal==true) ? true : ((int(w/4.0)*4==w)&&(int(h/4.0)*4==h)) ? true : false
  1076.    Assert( m4 ? true : false, chr(10) + "This is not a MOD4 clip! Please use crop() or addborders() before using MCTD_PP()" + chr(10))
  1077.  
  1078.    ### EXTERNAL
  1079.    blksize     = MCTD_Defaults( denoised, settings_num, "blksize"     )
  1080.    overlap     = MCTD_Defaults( denoised, settings_num, "overlap"     )
  1081.    truemotion  = MCTD_Defaults( denoised, settings_num, "truemotion"  )
  1082.    MVglobal    = MCTD_Defaults( denoised, settings_num, "MVglobal"    )
  1083.    pel         = MCTD_Defaults( denoised, settings_num, "pel"         )
  1084.    pelsearch   = MCTD_Defaults( denoised, settings_num, "pelsearch"   )
  1085.    search      = MCTD_Defaults( denoised, settings_num, "search"      )
  1086.    searchparam = MCTD_Defaults( denoised, settings_num, "searchparam" )
  1087.    MVsharp     = MCTD_Defaults( denoised, settings_num, "MVsharp"     )
  1088.    DCT         = MCTD_Defaults( denoised, settings_num, "DCT"         )
  1089.    thSAD       = MCTD_Defaults( denoised, settings_num, "thSAD"       )
  1090.    thSCD1      = MCTD_Defaults( denoised, settings_num, "thSCD1"      )
  1091.    thSCD2      = MCTD_Defaults( denoised, settings_num, "thSCD2"      )
  1092.  
  1093.    denoisedMVS = (internal==true) ? denoised : denoised.MSuper(hpad=0,vpad=0,pel=pel,sharp=MVsharp,chroma=false)
  1094.    f1v         = (internal==true) ? f1v : MAnalyse(denoisedMVS, isb=false, delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=false)
  1095.    b1v         = (internal==true) ? b1v : MAnalyse(denoisedMVS, isb=true,  delta=1, truemotion=truemotion, blksize=blksize, overlap=overlap, pelsearch=pelsearch, search=search, searchparam=searchparam, DCT=DCT, global=MVglobal, chroma=false)
  1096.    f1c         = (internal==true) ? f1c
  1097.    \           : defined(source)  ? MCompensate(source  , denoisedMVS, f1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
  1098.    \           :                    MCompensate(denoised, denoisedMVS, f1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
  1099.    b1c         = (internal==true) ? b1c
  1100.    \           : defined(source)  ? MCompensate(source  , denoisedMVS, b1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
  1101.    \           :                    MCompensate(denoised, denoisedMVS, b1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2)
  1102.    SAD_f1m     = (internal==true) ? SAD_f1m
  1103.    \           : defined(source)  ? MMask(source,   f1v, kind=1, ml=thSAD, gamma=0.999, Ysc=255)
  1104.    \           :                    MMask(denoised, f1v, kind=1, ml=thSAD, gamma=0.999, Ysc=255)
  1105.    SAD_b1m     = (internal==true) ? SAD_b1m
  1106.    \           : defined(source)  ? MMask(source,   b1v, kind=1, ml=thSAD, gamma=0.999, Ysc=255)
  1107.    \           :                    MMask(denoised, b1v, kind=1, ml=thSAD, gamma=0.999, Ysc=255)
  1108.  
  1109.  
  1110.    ### DEBLOCKING
  1111.    padX = w%8 == 0 ? 0 : (8 - w%8)
  1112.    padY = h%8 == 0 ? 0 : (8 - h%8)
  1113.  
  1114.    denoised = (internal==true) ? denoised
  1115.    \        : (deblock==false) ? denoised
  1116.    \        : (useQED==true)   ? denoised.deblock_QED(quant1=quant1,quant2=quant2,uv=chroma?3:2)
  1117.    \        : (padX==0 && padY==0) ? denoised.deblock(quant=int(quant1*0.5+quant2*0.5))
  1118.    \        : denoised.pointresize(w+padX, h+padY, 0, 0, w+padX, h+padY).deblock(quant=int(quant1*0.5+quant2*0.5)).Crop(0, 0, -padX, -padY)
  1119.  
  1120.  
  1121.    ### INITIATING
  1122.    nullclip = BlankClip()
  1123.  
  1124.    i   = defined(source) ? source : denoised
  1125.    smP = denoised
  1126.  
  1127.    xn = smP.width()
  1128.    yn = smP.height()
  1129.  
  1130.    chr41 = chroma?4:1
  1131.    chr31 = chroma?3:1
  1132.    chr21 = chroma?2:1
  1133.  
  1134.  
  1135.    ### PROTECTING
  1136.    rg17 = (protect==true) ? smP.removegrain(17,-1) : NOP()
  1137.    iOB  = (protect==true) ? i.mt_lut("x "+string(cutoff)+" >= x 0 ?",U=1,V=1) : NOP()
  1138.    mB   = (protect==true) ? mt_makediff(iOB,rg17,U=1,V=1).mt_binarize(128+threshold,upper=false,U=1,V=1).removegrain(5,-1) : NOP()
  1139.    lB   = (protect==true) ? mt_lutxy(smP,i,"x y - abs "+string(maxdiff)+" <= x x y - 0 < y "+string(maxdiff)+" - x ? ?",U=1,V=1) : NOP()
  1140.    smB  = (protect==true) ? mt_merge(smP,lB,mB,U=chr21,V=chr21) : smP
  1141.  
  1142.  
  1143.    ### ANTI-ALIASING
  1144.    cAA = (AA==false)      ? nullclip
  1145.    \   : (useEEDI2==true) ? smB.Turnleft().EEDI2(field=1,maxd=maxd).Turnright().EEDI2(field=1,maxd=maxd)
  1146.    \   :                    smB.Pointresize(xn*2,yn*2).Turnleft().Sangnom(order=1,aa=maxd).Turnright().Sangnom(order=1,aa=maxd)
  1147.    cAA = (AA==false)      ? nullclip
  1148.    \   : (method==0)      ? cAA.Bilinearresize(xn,yn,0.5,-0.5,xn*2,yn*2)
  1149.    \   : (method==1)      ? cAA.Spline36resize(xn,yn,0.5,-0.5,xn*2,yn*2)
  1150.    \   :                    cAA.Lanczos4resize(xn,yn,0.5,-0.5,xn*2,yn*2)
  1151.    cAA = (aaF!="internal") ? Eval("smB."+aaF) : cAA
  1152.    mA  = (AA==true) ? smB.mt_edge("prewitt",0,255,0,0,V=1,U=1).mt_lut("x "+string(AAthr)+" <= 0 x 1.4 ^ ?",U=1,V=1).removegrain(4,-1).mt_inflate(U=1,V=1) : NOP()
  1153.    smA = (AA==true) ? mt_merge(smB,cAA,mA,luma=chroma?true:false,U=chr31,V=chr31) : NOP()
  1154.  
  1155.    aaD1    = (AA==true&&reduc!=-1) ? mt_makediff(smB, smA, U=1, V=1) : NOP()
  1156.    aaD1MVS = (AA==true&&reduc!=-1) ? aaD1.MSuper(hpad=0,vpad=0,pel=pel,sharp=MVsharp,chroma=false) : NOP()              
  1157.    aaD2    = (AA==true&&reduc!=-1) ? aaD1.MDegrain1(aaD1MVS, b1v, f1v, thSAD=thSAD, thSCD1=thSCD1, thSCD2=thSCD2, plane=0) : NOP()
  1158.    aaD2    = (AA==true&&reduc!=-1) ? mt_lutxy(aaD1, aaD2, "x 128 - abs y 128 - abs < x y ?", U=1, V=1).mergeluma(aaD2, 1.0-reduc) : NOP()
  1159.  
  1160.    smA     = (AA==false) ? smB
  1161.    \       : (reduc==-1) ? smA
  1162.    \       :               mt_makediff(smB, aaD2, U=2, V=2)
  1163.  
  1164.  
  1165.    ### EDGECLEANING
  1166.    mP  = (edgeclean==true) ? mt_edge(smA,"prewitt",0,255,0,0,V=1,U=1) : NOP()
  1167.    mS  = (edgeclean==true) ? mP.mt_expand(mode=mt_square(radius=ECrad),U=1,V=1).mt_inflate(U=1,V=1) : NOP()
  1168.    mD  = (edgeclean==true) ? mt_lutxy(mS,mP.mt_inflate(U=1,V=1),"x y - "+string(ECthr)+" <= 0 x y - ?",U=1,V=1).mt_inflate(U=1,V=1).removegrain(20,-1) : NOP()
  1169.    smE = (edgeclean==true) ? mt_merge(smA,Eval("smA." + ECmode),mD,luma=chroma?true:false,U=chr31,V=chr31) : smA
  1170.  
  1171.  
  1172.    ### MASKING
  1173.    mM = (sharp==true||enhance==true||stabilize==true) ? mt_average(SAD_f1m,SAD_b1m,U=1,V=1).mt_lut(expr="x 1.6 ^",U=1,V=1) : NOP()
  1174.    mE = (sharp==true||enhance==true||stabilize==true) ? mt_edge(smE,"prewitt",0,255,0,0,V=1,U=1).mt_lut(expr="x 1.8 ^",U=1,V=1).removegrain(4,-1).mt_inflate(U=1,V=1) : NOP()
  1175.    mL = (sharp==true||enhance==true||stabilize==true) ? mt_logic(mM.invert(),mE,"min",U=1,V=1).removegrain(20,-1) : NOP()
  1176.    mF = (sharp==true||enhance==true||stabilize==true) ? mt_logic(mM,mE,"max",U=1,V=1).removegrain(20,-1) : NOP()
  1177.  
  1178.  
  1179.    ### SHARPENING
  1180.    Sclp = (sharp == true) ? (shF!="internal") ? Eval("smE."+shF)
  1181.    \                      : smE.LSFmod(strength=strength,Smode=SHmode,Smethod=SHmethod,Lmode=Slimit,overshoot=Sovershoot,preblur="ON",secure=true,edgemode=0,soft=0,soothe=false,ss_x=1.00,ss_y=1.00) : NOP()
  1182.    Tmax = (sharp == true) ? i.mt_logic(f1c,"max",U=1,V=1).mt_logic(b1c,"max",U=1,V=1) : NOP()
  1183.    Tmin = (sharp == true) ? i.mt_logic(f1c,"min",U=1,V=1).mt_logic(b1c,"min",U=1,V=1) : NOP()
  1184.  
  1185.    shrp = (sharp==false) ? smE
  1186.    \    : (Tlimit==true) ? Sclp.mt_clamp(Tmax, Tmin, Tovershoot, Tovershoot, U=1, V=1)
  1187.    \    :                  Sclp
  1188.    sL   = (sharp==true&&adapt==true) ? mt_merge(smE,shrp,mL,U=chr21,V=chr21)
  1189.    \    :                              shrp.mergechroma(smE)
  1190.  
  1191.  
  1192.    ### STABILIZING & ENHANCING
  1193.    TTc = (stabilize==true) ? sL.TTempSmoothF(maxr=maxr,strength=TTstr)
  1194.    \   :                     sL
  1195.    GFc = (enhance==true) ? (dbF!="internal") ? Eval("TTc."+dbF)
  1196.    \   :                   TTc.GradFun2DBmod(thr=GFthr,thrC=chroma?GFthr:1.0,mode=0,str=AGstr,strC=0.0,temp=temp,adapt=bias,mask=false,show=false)
  1197.    \   :                   TTc
  1198.    FSc = (enhance==true||stabilize==true) ? MCPP_final_mt_merge(GFc,sL,mF,luma=chroma?true:false,U=chr31,V=chr31)
  1199.    \   :                                    GFc
  1200.    PP  = (chroma==false) ? FSc.MCPP_final_mergechroma(internal?i:smP)
  1201.    \   :                   FSc
  1202.  
  1203.    return PP
  1204.    }
  1205.  
  1206. PP = MCTD_PP( smP, i,
  1207.    \          sharp, adapt, strength, SHmode, SHmethod, Slimit, Sovershoot, Tlimit, Tovershoot, shF,
  1208.    \          protect, cutoff, threshold, maxdiff,
  1209.    \          AA, useEEDI2, reduc, maxd, AAthr, method, aaF,
  1210.    \          deblock, useQED, quant1, quant2,
  1211.    \          edgeclean, ECrad, ECthr, ECmode,
  1212.    \          stabilize, maxr, TTstr,
  1213.    \          enhance, GFthr, AGstr, bias, temp, dbF,
  1214.    \          chroma, settings,
  1215.    \          f1v, b1v, f1c, b1c, SAD_f1m, SAD_b1m, true )
  1216.  
  1217.  
  1218.  
  1219. ### OUTPUT
  1220. o = ((smP.height) * 2 == PP.height) ? PP.MCPP_crop16(xf/2,yf/2,-xf/2,-yf/2) : PP.crop(xf/2,yf/2,-xf/2,-yf/2)
  1221. o = (interlaced==true) ? o.weave() : o
  1222.  
  1223. p1nr = Defined(p1nr) ? p1nr : "internal"
  1224. p2nr = Defined(p2nr) ? p2nr : "internal"
  1225. ppnr = Defined(ppnr) ? ppnr : "internal"
  1226.  
  1227. ### SHOW
  1228.    function MCTD_Show( clip i, clip p, clip o, int "xf", int "yf", string "version", string "settings", string "show_p",
  1229.    \                   int "radius", int "sigma", bool "twopass", bool "useTTmpSm", int "limit", int "limit2", int "post", bool "chroma", bool "interlaced",
  1230.    \                   bool "sharp", bool "adapt", int "strength", int "SHmode", int "SHmethod", int "Slimit", int "Sovershoot", bool "Tlimit", int "Tovershoot", string "shF",
  1231.    \                   bool "protect", int "cutoff", int "threshold", int "maxdiff",
  1232.    \                   bool "AA", bool "useEEDI2", float "reduc", int "maxd", int "AAthr", int "method", string "aaF",
  1233.    \                   bool "deblock", bool "useQED", int "quant1", int "quant2",
  1234.    \                   bool "edgeclean", int "ECrad", int "ECthr", string "ECmode",
  1235.    \                   bool "stabilize", int "maxr", int "TTstr",
  1236.    \                   bool "enhance", float "GFthr", float "AGstr", int "bias", int "temp", string "dbF",
  1237.    \                   int "bwbh", int "owoh", int "blksize", int "overlap",
  1238.    \                   bool "GPU", bool "fixband", int "bt", int "ncpu", int "precision",
  1239.    \                   int "thSAD", int "thSAD2", int "thSCD1", int "thSCD2",
  1240.    \                   bool "truemotion", bool "MVglobal", int "pel", int "pelsearch", int "search", int "searchparam", int "MVsharp", int "DCT",
  1241.    \                   int "screenW", int "screenH",
  1242.    \                   string "p1nr", string "p2nr", string "ppnr" )
  1243.    {
  1244.    i  = i.crop(xf/2,yf/2,-xf/2,-yf/2)
  1245.    p  = p.crop(xf/2,yf/2,-xf/2,-yf/2)
  1246.    cW = screenW/2
  1247.    cH = screenH/2
  1248.    iW = i.width()
  1249.    iH = i.height()
  1250.  
  1251.    iR = round((iW*cH)/(4*iH))*4
  1252.    iC = (iR-cW)/2
  1253.  
  1254.    i = i.spline36resize(iR,cH)
  1255.    p = p.spline36resize(iR,cH)
  1256.    o = o.spline36resize(iR,cH)
  1257.  
  1258.    i = (iC>0) ? i.crop(iC,0,-iC,0) : i
  1259.    p = (iC>0) ? p.crop(iC,0,-iC,0) : p
  1260.    o = (iC>0) ? o.crop(iC,0,-iC,0) : o
  1261.  
  1262.    i = (iC<0) ? i.addborders(-iC,0,-iC,0) : i
  1263.    p = (iC<0) ? p.addborders(-iC,0,-iC,0) : p
  1264.    o = (iC<0) ? o.addborders(-iC,0,-iC,0) : o
  1265.  
  1266.    b = i.blankclip()
  1267.  
  1268.    b = b.SubTitle("MCTD    " + string(version)             ,text_color=$FFFFFF,font="COURIER NEW",size=24,x=40,y=20)
  1269.    b = b.SubTitle("SETTINGS           = " + string(settings)            ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=60)
  1270.    b = b.SubTitle("'p' clip           = " + string(show_p)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=70)
  1271.  
  1272.    b = b.SubTitle("radius             = " + string(radius)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=90)
  1273.    b = b.SubTitle("sigma              = " + string(sigma)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=100)
  1274.    b = b.SubTitle("twopass            = " + string(twopass)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=110)
  1275.    b = b.SubTitle("useTTmpSm          = " + string(useTTmpSm)           ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=120)
  1276.    b = b.SubTitle("limit              = " + string(limit)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=130)
  1277.    b = b.SubTitle("limit2             = " + string(limit2)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=140)
  1278.    b = b.SubTitle("post               = " + string(post)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=150)
  1279.    b = b.SubTitle("chroma             = " + string(chroma)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=160)
  1280.    b = b.SubTitle("interlaced         = " + string(interlaced)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=170)
  1281.  
  1282.    b = b.SubTitle("sharp              = " + string(sharp)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=190)
  1283.    b = b.SubTitle("adapt              = " + string(adapt)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=200)
  1284.    b = b.SubTitle("strength           = " + string(strength)            ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=210)
  1285.    b = b.SubTitle("SHmode             = " + string(SHmode)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=220)
  1286.    b = b.SubTitle("SHmethod           = " + string(SHmethod)            ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=230)
  1287.    b = b.SubTitle("Slimit             = " + string(Slimit)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=240)
  1288.    b = b.SubTitle("Sovershoot         = " + string(Sovershoot)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=250)
  1289.    b = b.SubTitle("Tlimit             = " + string(Tlimit)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=260)
  1290.    b = b.SubTitle("Tovershoot         = " + string(Tovershoot)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=270)
  1291.    b = b.SubTitle("shF                = " + string(shF)                 ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=280)
  1292.  
  1293.    b = b.SubTitle("protect            = " + string(protect)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=300)
  1294.    b = b.SubTitle("cutoff             = " + string(cutoff)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=310)
  1295.    b = b.SubTitle("threshold          = " + string(threshold)           ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=320)
  1296.    b = b.SubTitle("maxdiff            = " + string(maxdiff)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=330)
  1297.  
  1298.    b = b.SubTitle("AA                 = " + string(AA)                  ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=350)
  1299.    b = b.SubTitle("useEEDI2           = " + string(useEEDI2)            ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=360)
  1300.    b = b.SubTitle("reduc              = " + string(reduc)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=370)
  1301.    b = b.SubTitle("maxd               = " + string(maxd)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=380)
  1302.    b = b.SubTitle("AAthr              = " + string(AAthr)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=390)
  1303.    b = b.SubTitle("method             = " + string(method)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=400)
  1304.    b = b.SubTitle("aaF                = " + string(aaF)                 ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=410)
  1305.  
  1306.    b = b.SubTitle("deblock            = " + string(deblock)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=430)
  1307.    b = b.SubTitle("useQED             = " + string(useQED)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=440)
  1308.    b = b.SubTitle("quant1             = " + string(quant1)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=450)
  1309.    b = b.SubTitle("quant2             = " + string(quant2)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=460)
  1310.  
  1311.    b = b.SubTitle("p1nr               = " + string(p1nr)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=480)
  1312.    b = b.SubTitle("p2nr               = " + string(p2nr)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=490)
  1313.    b = b.SubTitle("ppnr               = " + string(ppnr)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=60,y=500)
  1314.  
  1315.    b = b.SubTitle("edgeclean          = " + string(edgeclean)           ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=60)
  1316.    b = b.SubTitle("ECrad              = " + string(ECrad)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=70)
  1317.    b = b.SubTitle("ECthr              = " + string(ECthr)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=80)
  1318.    b = b.SubTitle("ECmode             = " + string(ECmode)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=90)
  1319.  
  1320.    b = b.SubTitle("stabilize          = " + string(stabilize)           ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=110)
  1321.    b = b.SubTitle("maxr               = " + string(maxr)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=120)
  1322.    b = b.SubTitle("TTstr              = " + string(TTstr)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=130)
  1323.  
  1324.    b = b.SubTitle("enhance            = " + string(enhance)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=150)
  1325.    b = b.SubTitle("GFthr              = " + string(GFthr)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=160)
  1326.    b = b.SubTitle("AGstr              = " + string(AGstr)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=170)
  1327.    b = b.SubTitle("bias               = " + string(bias)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=180)
  1328.    b = b.SubTitle("temp               = " + string(temp)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=190)
  1329.    b = b.SubTitle("dbF                = " + string(dbF)                 ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=200)
  1330.  
  1331.    b = b.SubTitle("bwbh               = " + string(bwbh)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=220)
  1332.    b = b.SubTitle("owoh               = " + string(owoh)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=230)
  1333.    b = b.SubTitle("blksize            = " + string(blksize)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=240)
  1334.    b = b.SubTitle("overlap            = " + string(overlap)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=250)
  1335.  
  1336.    b = b.SubTitle("GPU                = " + string(GPU)                 ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=270)
  1337.    b = b.SubTitle("fixband            = " + string(fixband)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=280)
  1338.    b = b.SubTitle("bt                 = " + string(bt)                  ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=290)
  1339.    b = b.SubTitle("ncpu               = " + string(ncpu)                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=300)
  1340.    b = b.SubTitle("precision          = " + string(precision)           ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=310)
  1341.  
  1342.    b = b.SubTitle("thSAD              = " + string(thSAD)               ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=330)
  1343.    b = b.SubTitle("thSAD2             = " + string(thSAD2)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=340)
  1344.    b = b.SubTitle("thSCD1             = " + string(thSCD1)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=350)
  1345.    b = b.SubTitle("thSCD2             = " + string(thSCD2)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=360)
  1346.  
  1347.    b = b.SubTitle("truemotion         = " + string(truemotion)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=380)
  1348.    b = b.SubTitle("MVglobal           = " + string(MVglobal)            ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=390)
  1349.    b = b.SubTitle("pel                = " + string(pel)                 ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=400)
  1350.    b = b.SubTitle("pelsearch          = " + string(pelsearch)           ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=410)
  1351.    b = b.SubTitle("search             = " + string(search)              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=420)
  1352.    b = b.SubTitle("searchparam        = " + string(searchparam)         ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=430)
  1353.    b = b.SubTitle("MVsharp            = " + string(MVsharp)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=440)
  1354.    b = b.SubTitle("DCT                = " + string(DCT)                 ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=450)
  1355.  
  1356.    #b = b.SubTitle("screenW            = " + string(screenW)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=470)
  1357.    #b = b.SubTitle("screenH            = " + string(screenH)             ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=360,y=480)
  1358.  
  1359.    i = i.subtitle("Input",text_color=$FFFFFF,size=20,x=20,y=20)
  1360.    p = p.subtitle("Prefilter",text_color=$FFFFFF,size=20,x=20,y=20)
  1361.    o = o.subtitle("Output",text_color=$FFFFFF,size=20,x=20,y=20)
  1362.  
  1363.    TOP = stackhorizontal(b,p)
  1364.    BOT = stackhorizontal(i,o)
  1365.  
  1366.    return stackvertical(TOP,BOT)
  1367.    }
  1368.  
  1369. o = (show==false) ? o : MCTD_Show(i,p,o,xf,yf,version,settings,show_p,
  1370. \                                 radius,sigma,twopass,useTTmpSm,limit,limit2,post,chroma,interlaced,
  1371. \                                 sharp,adapt,strength,SHmode,SHmethod,Slimit,Sovershoot,Tlimit,Tovershoot,shF,
  1372. \                                 protect,cutoff,threshold,maxdiff,
  1373. \                                 AA,useEEDI2,reduc,maxd,AAthr,method,aaF,
  1374. \                                 deblock,useQED,quant1,quant2,
  1375. \                                 edgeclean,ECrad,ECthr,ECmode,
  1376. \                                 stabilize,maxr,TTstr,  
  1377. \                                 enhance,GFthr,AGstr,bias,temp,dbF,
  1378. \                                 bwbh,owoh,blksize,overlap,
  1379. \                                 GPU,fixband,bt,ncpu,precision,
  1380. \                                 thSAD,thSAD2,thSCD1,thSCD2,
  1381. \                                 truemotion,MVglobal,pel,pelsearch,search,searchparam,MVsharp,DCT,
  1382. \                                 screenW,screenH,
  1383. \                                 p1nr,p2nr,ppnr)
  1384.  
  1385. return o
  1386. }