SHARE
TWEET

AnimeIVTC 2 mod

a guest Mar 16th, 2014 807 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # AnimeIVTC() by thetoof
  2. # v2.00 2014-3-16 mod
  3. # last update by AmjadSONY was:- make "precision=1" use "nnedi3" only for "Toriko Anime" by using it like this:- AnimeIVTC(1, precision=1)
  4. # add mode22 bool to use it in mode 2 for Spatial field-blend (field-blend in a part of the picture), ex:- AnimeIVTC(2, bbob=1, mode22=true)
  5. # TC file now will out in V2 ;) , add ediext clip to use it with QTGMC and add bob4p to change QTGMC Preset , add extbob clip to use an External bobber with bbob/cbob=5 , chrfix in mode 1 and other things fixed by doom9 member
  6. # 2014-3-11 make chrfix work. add dchr bool, can help chrfix with some source
  7.  
  8. # Read the documentation for all the required info to know how to use this function, With note that there are some things have changed in this MOD
  9.  
  10. function AnimeIVTC (clip i, int "mode", int "aa", int "precision", int "killcomb", int "cache", bool "ifade", float "sfthr", bool "sfshow"\
  11.                 , bool "chrfix"\
  12.                 , bool "blend"\  
  13.                 , bool "normconv"\
  14.                 , int "pattern"\
  15.                 , int "pass", bool "rendering" \
  16.                 , int "bbob", int "cbob", string "edimode", int "degrain", int "omode"\
  17.                 , int "i1", int "i2", int "e1", int "e2", int "e3", int "p1", int "p2", bool "dchr" \
  18.                 , int "overlap", int "pel", int "search", bool "nnedi3pel", string "credconv", bool "mode22", clip "ediext", string "bob4p", clip "extbob"\
  19.                 , float "dark", int "thin", int "sharp", int "smooth", bool "stabilize", int "tradius", int "aapel", int "aaov", int "aablk", string "aatype"){
  20.  
  21. ###General arguments###
  22. Assert(defined(mode), "Specify a mode... please read the documentation.")
  23.  
  24. #Highest quality by default
  25. precision       = default ( precision,            3 )
  26.  
  27. #boolean "creds" is set to true if any of the i/p arguments are defined (i.e. if there's a 30i or 30p section to process)
  28. creds = defined(i1) ? true : false
  29. creds = defined(i2) ? true : creds
  30. creds = defined(p1) ? true : creds
  31. creds = defined(p2) ? true : creds
  32. creds = defined(e1) ? true : creds
  33. creds = defined(e2) ? true : creds
  34. creds = defined(e3) ? true : creds
  35.  
  36. ###Framerate preparation###
  37. normconv = default( normconv, false)
  38. #Determine source region by analysing framerate
  39. Ifrate  = round(framerate(i))==30 ? 1 : framerate(i)==25 ? 2 : 3
  40. assert(ifrate!=3, "What is your input clip?? It's not 30fps NTSC nor 25fps PAL... maybe you're using the function for a purpose it was not meant to. Please post in the AnimeIVTC thread.")
  41.  
  42. #Set the output to the other region if normconv (norm-conversion) is set to true, use same as input if not
  43. Ofrate  = Ifrate==1 && normconv ? 2 : Ifrate==2 && normconv ? 1 : Ifrate
  44.  
  45. #prepare arguments for srestore and tdecimate based on user settings (as seen previously)
  46. frate   = Ofrate==1 ? 23.976 : 25
  47. tnum    = Ofrate==1 ? 24000 : 25
  48. tden    = Ofrate==1 ? 1001 : 1
  49.  
  50.  
  51.  
  52. #Set pattern=0 (tdecimate) for DHT (safest)
  53. pattern         = default ( pattern,              0 )
  54.  
  55. #Set defaults of bobbing filters to use to general optimal quality
  56. bbob            = default ( bbob,                 3 )
  57. cbob            = default ( cbob,                 4 )
  58. bob4p           = default ( bob4p,         "Slower" )
  59.  
  60. #Sets output mode to 1 (23.976fps for NTSC and 25fps for PAL) when no 30i or 30p sections are specified and sets it to 0 to use NOP() for every operation where it needs to be specified by the user
  61. omode = (creds==false && mode!=4) || ofrate==2 || normconv ? 1 : default (omode, 0)
  62. Assert(omode!=0, "Specify an output mode... please read the documentation.")
  63. normconv ? assert(mode==2, "Why would you use normconv=true with a telecined source?") : nop()
  64.  
  65. ###Framerate conversion arguments###
  66. bs              = (i.width>1100) ? 16 : 8
  67. overlap         = default ( overlap,           bs/2 )
  68. pel             = default ( pel,                  2 )
  69. search          = default ( search,               4 )
  70. assert(search >= 2, "Using a lower search than 2 will most probably lead to weird artifacts")
  71. nnedi3pel       = default ( nnedi3pel,        false )
  72. credconv        = default ( credconv,       omode==2 ? "a" : "blah" )
  73. creds ? assert(credconv!= "blah", "Please specify credconv. Check in the docs to see which is more appropriate to your source.") : nop()
  74.  
  75. #VFR - If this is pass=2 and that the user made a rendering pass out of pass=1, use input directly for decimation instead of recomputing everything
  76. pass            = default (pass,                  1 )
  77. rendering       = default ( rendering,        false )
  78.  
  79. #Ask if hard telecine (mode=1) is actually blend telecine (patter = 3 clean frames followed by 2 blended ones)
  80. blend           = default ( blend,            false )
  81.  
  82. #Ask if double chroma blend removal is needed (see guide for more info about this problem)
  83. chrfix  = default ( chrfix,       false )
  84. dchr    = default ( dchr,       false )
  85.  
  86. #mode22 for Spatial field-blend
  87. mode22  = default ( mode22,       false )
  88.  
  89. #Set cache to 10 frames for all functions using scriptclip to prevent seeking issues + frame order mess-up with temporal filters
  90. cache           = default ( cache,               10 )
  91.  
  92. #Let the user decide which edimode (optimal varies greatly depending on source) and degrain (++ affects quality vs speed) settings to use in qTGMC
  93. edimode         = default ( edimode,       "nnedi3" )
  94. degrain         = default ( degrain,              1 )
  95.  
  96. #Set decombing and antialiasing filters to off by default
  97. killcomb        = default ( killcomb,             0 )
  98. aa              = default ( aa,                   0 )
  99. aa = killcomb==3 && aa==2 ? 0 : aa
  100.  
  101. #Set interlaced fade ins detection (and correction to off by default)
  102. ifade           = default ( ifade,             false )
  103. #Also turn it off if aa=2 (use daa()), since it applies the same operation on the whole clip as ifade would have had selectively)
  104. ifade           = aa==2 ? false : ifade
  105. sfthr   = default ( sfthr,  0.4 )
  106. sfshow = default ( sfshow, false )
  107.  
  108. ###Alright, let's start doing something :p ###
  109.  
  110.  
  111. #########
  112. #Bobbing#
  113. #########
  114.  
  115. #Assign clip to prevent double computation
  116. edeint= i.nnedi3(-2)
  117. emask = i.tmm(1)
  118.  
  119. #For later NOP() use if blendbob is not needed
  120. usebbob = chrfix && blend || mode==2
  121.  
  122.  
  123. #Use non-motion-compensated bobber for blended clips since blends have a negative impact on motion detection (if blends are averaged with frames, they can be harder to detect/remove) (mode=2 and mode=1 with blend and chrfix because blend telecine... well has a lot of blends)
  124. blendbob        = usebbob ?     bbob<=0 ? i.tdeint(1)                                                           :
  125. \                               bbob==1 ? i.tdeint(1,           edeint=edeint   )                               :
  126. \                               bbob==2 ? i.tdeint(1,           edeint=edeint,emask=emask)                      :
  127. \                               bbob==3 ? i.yadifmod(mode=1,    edeint=edeint)                                  :
  128. \                               bbob==4 ? i.QTGMC(Preset=bob4p,edimode=edimode,tr2=degrain,ediext=ediext)       :
  129. \                                         extbob                                                                : NOP()
  130.  
  131. #For later NOP() use if clearbob is not needed
  132. usecbob = mode==3 || defined(i1) || chrfix && blend==false
  133.  
  134. #Allow usage of mo-comp bobber (TempGaussMC) when source is not blended. Highly recommended for stability. (mode=3, interlaced credits, used in chrfix because impact is minimal compared to bob flicker on the whole clip)
  135. clearbob        = usecbob ?     cbob<=0 ? i.tdeint(1)                                                           :
  136. \                               cbob==1 ? i.tdeint(1,           edeint=edeint)                                  :
  137. \                               cbob==2 ? i.tdeint(1,           edeint=edeint,emask=emask)                      :
  138. \                               cbob==3 ? i.yadifmod(mode=1,    edeint=edeint)                                  :
  139. \                               cbob==4 ? i.QTGMC(Preset=bob4p,edimode=edimode,tr2=degrain,ediext=ediext)       :
  140. \                                         extbob                                                                : NOP()
  141.  
  142. ############################
  143. #Chroma swap between fields# chrfix
  144. ############################
  145.  
  146. #Repair double chroma blending if requested by user using xbob depending on source (known by the mode)
  147. chrdeb = chrfix ? blend || mode==2 ? dchr ? blendbob.chroma_rep2(cache) : blendbob.chroma_rep(cache) : clearbob.chroma_rep(cache) : nop()
  148.  
  149. #Remove duplicates (like a safe selecteven/odd) for further processing before final decimation (hybrid decimation (except blend decimation to prevent having 2 calls of tdecimate) or blend telecine IVTC)
  150. #Once bobbed, in mode=1 (tdecimate(1,3,5), in mode=1 + blend = back to 30fps for further deblending, in mode=2 srestore will do the job, in mode=3 tdecimate(1,3,5), in mode 4 VFR needs 30, CFR can do it (personal notes)
  151. debprep = chrfix ? mode==1 && blend || mode==4 && omode==2 ? chrdeb.tdecimate(1,1,2) : chrdeb : i
  152.  
  153. ################
  154. #Field matching# MODE=1 AND 4
  155. ################
  156.  
  157. #Field match for mode 1, pass 2 of mode 4 (hybrid without tfm.txt output) or mode=4 with blend decimation (no need for txt file) or mode=4 with interlaced credits (txt file unusable)
  158. usefm = mode==1 || (mode==4 && (pass==2 || creds || omode==1))
  159.  
  160. #field match for hard telecine or blend telecine restoration for mode==1
  161. fm =    (precision==0 && usefm) ? blend ? debprep.srestore(omode="pp0") : i.tfm(slow=2) :
  162. \       (precision==1 && usefm) ? blend ? debprep.srestore(omode="pp1") : i.tfm(slow=2,clip2=i.nnedi3) :
  163. \       (precision==2 && usefm) ? blend ? debprep.srestore(omode="pp2") : i.tfm(slow=2,clip2=i.tdeint(2,edeint=edeint)) :
  164. \       (precision==3 && usefm) ? blend ? debprep.srestore(omode="pp3") : i.tfm(slow=2,clip2=i.tdeint(2,edeint=edeint,emask=emask)) :
  165. \       nop()
  166. fm = usefm ? ifade ? fm.smartfademod(sfthr, sfshow, cache) : fm : nop()
  167.  
  168. #Field match + tfm.txt output for VFR clips (mode=4, pass=1)
  169. usehfm = mode==4 && pass==1 && usefm==false
  170.  
  171. hybridfm =      (usehfm && precision==0) ? i.tfm(slow=2, output="tfm.txt") :
  172. \               (usehfm && precision==1) ? i.tfm(slow=2, output="tfm.txt",clip2=i.nnedi3) :
  173. \               (usehfm && precision==2) ? i.tfm(slow=2, output="tfm.txt",clip2=i.tdeint(2,edeint=edeint)) :
  174. \               (usehfm && precision==3) ? i.tfm(slow=2, output="tfm.txt",clip2=i.tdeint(2,edeint=edeint,emask=emask)) :
  175. \               nop()
  176. hybridfm = usehfm ? ifade ? hybridfm.smartfademod(sfthr, sfshow, cache) : hybridfm : nop()
  177.  
  178. ###############        ######################
  179. #Field blended# MODE=2 #Double hard telecine# MODE=3
  180. ###############        ######################
  181.  
  182. #Since during double chroma blend removal it was checked whether to use blendbob or clearbob depending on the source (blendbob was used for field blended and clearbob was used for double hard telecine), use chrbob when chrfix=true, else use the appropriate one
  183.  
  184. fbbob = mode==2 ? chrfix ? debprep : blendbob : nop()
  185.  
  186. dhtbob = mode==3 ? chrfix ? debprep : clearbob : nop()
  187.  
  188. ################
  189. #CFR decimation# OMODE=1
  190. ################
  191.  
  192. #HT decimation (mode=1), remove 3 frames out of 5 when chrfix=true since the clip has been bobbed to 60fps
  193. fmdecim = mode==1 ? chrfix ? debprep.tdecimate(1,3,5) :                         fm.tdecimate()                                                                                  : nop()
  194.  
  195. #Field blended blend removal & decimation (mode=2) No need to check for chrfix since it was done in the previous step
  196. fbdecim = mode==2 ? mode22 ? chrfix ? fbbob.srestore(omode=2, mode=-2, thresh=44, cache=cache, dclip=fbbob.crop(10,0,-10,0)).srestore(frate=frate, mode=-2, speed=-4, cache=cache) :    fbbob.srestore(omode=2, mode=2, thresh=44, cache=cache, dclip=fbbob.crop(10,0,-10,0)).srestore(frate=frate, mode=2, speed=-4, cache=cache)      :
  197. \chrfix ? fbbob.srestore(frate=frate, cache=cache) :    fbbob.srestore(frate=frate, cache=cache, dclip=i.bob(-0.2,0.6).reduceflicker(strength=1))       : nop()
  198.  
  199. #Pattern finding and decimation for double hard telecine (mode=3) No need to check for chrfix since it was done in the previous step
  200. a= mode==3 && (pattern==1 || pattern==-1) ? dhtbob.selectevery(5,0,3) : NOP()
  201. b= mode==3 && (pattern==2 || pattern==-1) ? dhtbob.selectevery(5,1,4) : NOP()
  202. c= mode==3 && (pattern==3 || pattern==-1) ? dhtbob.selectevery(5,0,2) : NOP()
  203. d= mode==3 && (pattern==4 || pattern==-1) ? dhtbob.selectevery(5,1,3) : NOP()
  204. e= mode==3 && (pattern==5 || pattern==-1) ? dhtbob.selectevery(5,2,4) : NOP()
  205. dhtdecim = mode==3 ?                    pattern==-1 ? stackvertical(stackhorizontal(a.subtitle("pattern=1"),b.subtitle("pattern=2"),c.subtitle("pattern=3")),stackhorizontal(d.subtitle("pattern=4"),e.subtitle("pattern=5"),e.blackness())) :
  206. \                                       pattern==1 ? a :
  207. \                                       pattern==2 ? b :
  208. \                                       pattern==3 ? c :
  209. \                                       pattern==4 ? d :
  210. \                                       pattern==5 ? e :
  211. \                                       dhtbob.tdecimate(1,3,5) : nop()
  212.  
  213. #Hybrid CFR blend decimation of 30p into 24p
  214. blenddecim = (mode==4 && omode==1) ? chrfix ? debprep.tdecimate(1,3,5,hybrid=1) :       fm.tdecimate(hybrid=1)                          : nop()
  215.  
  216. #########
  217. #Credits# CREDS=TRUE (USER SPECIFIES I1, I2, P1, P2, E1, E2 OR E3)
  218. #########
  219.  
  220. #Interlaced : use the same smart-bobbed clip as before; we don't care if the background is blended or not since it is unrecoverable anyways (at least for now... see developments about using masking to isolate creds from background)
  221. credbob = defined(i1) ? clearbob.selecteven() : nop()
  222.  
  223. #Progressive : Blend deinterlace the 24t background while doing minimal damage on the 30p credits
  224. blendbg= defined(p1) ? i.daa() : nop()
  225.  
  226. ###CFR conversion###
  227. #######################
  228. ###Framerate conversion (recommended for static or low-motion backgrounds since it is prone artifacts... it reduces framerate/motion based on motion vectors)
  229.  
  230. ####Convert the framerate of the interlaced credits
  231. #Determine if usage of the following conversion is required
  232. usemocompi = defined(i1) && credconv=="mocomp"
  233.  
  234. #External pelclip on source with nnedi, if requested
  235. upsi =          nnedi3pel && usemocompi ?       credbob.        nnedi3_rpow2(rfactor=pel,cshift="spline36resize")                : nop()
  236. upsp =          nnedi3pel && usemocompi ?       blendbg.        nnedi3_rpow2(rfactor=pel,cshift="spline36resize")                : nop()
  237.  
  238. #Prepare super clip for the interlaced credits
  239. credbobsuper    = usemocompi ?                  credbob.        MSuper(pel=pel, levels=0)                                        : nop()
  240. credbobupsuper  = usemocompi && nnedi3pel ?     credbob.        MSuper(pel=pel, levels=0, pelclip=upsi)                          : nop()
  241.  
  242. #Calculate vectors
  243. bvi =           usemocompi ? nnedi3pel ?        credbobupsuper. MAnalyse(isb = true,search=search, blksize=bs, overlap=overlap)  :
  244. \                                               credbobsuper.   MAnalyse(isb = true,search=search, blksize=bs, overlap=overlap)  : nop()
  245.  
  246. fvi =           usemocompi ? nnedi3pel ?        credbobupsuper. MAnalyse(isb = false,search=search, blksize=bs, overlap=overlap) :
  247. \                                               credbobsuper.   MAnalyse(isb = false,search=search, blksize=bs, overlap=overlap) : nop()
  248.  
  249. #Apply framerate conversion
  250. fpsconvi =      usemocompi ? nnedi3pel ?        credbob.        MFlowFps(credbobupsuper,bvi, fvi, tnum, tden)                    :
  251. \                                               credbob.        MFlowFps(credbobsuper,  bvi, fvi, tnum, tden)                    : nop()
  252.  
  253. ###Convert the framerate of the progressive credits
  254. #Determine if usage of the following conversion is required
  255. usemocompp = defined(p1) && credconv=="mocomp"
  256.  
  257. #Prepare super clip for the progressive credits
  258. blendbgsuper    = usemocompp ?                  blendbg.MSuper(pel=pel, levels=0)                                                : nop()
  259. blendbgsuperup  = usemocompp && nnedi3pel ?     blendbg.MSuper(pel=pel, levels=0, pelclip=upsp)                                  : nop()
  260.  
  261. #Calculate vectors
  262. bvp =           usemocompp ? nnedi3pel ?        blendbgsuperup. MAnalyse(isb = true,search=search, blksize=bs, overlap=overlap)  :
  263. \                                               blendbgsuper.   MAnalyse(isb = true,search=search, blksize=bs, overlap=overlap)  : nop()
  264.  
  265. fvp =           usemocompp ? nnedi3pel ?        blendbgsuperup. MAnalyse(isb = false,search=search, blksize=bs, overlap=overlap) :
  266. \                                               blendbgsuper.   MAnalyse(isb = false,search=search, blksize=bs, overlap=overlap) : nop()
  267.  
  268. #Apply framerate conversion
  269. fpsconvp =      usemocompp ? nnedi3pel ?        blendbg.MFlowFps(blendbgsuperup,bvp, fvp, tnum, tden)                            :
  270. \                                               blendbg.MFlowFps(blendbgsuper,  bvp, fvp, tnum, tden)                            : nop()
  271.  
  272. #######################
  273. ###Blend 30p creds into 24t (ugly and fast, but can lead to less disturbing artifacts when you have a high motion background)
  274. blendi = defined(i1) && credconv=="blend" ? credbob.convertfps(tnum,tden) : nop()
  275.  
  276. blendp = defined(p1) && credconv=="blend" ? blendbg.convertfps(tnum,tden) : nop()
  277.  
  278. #######################
  279. ###Drop frames 30p creds into 24t (ugly and fast, will lead to stuttery motion)
  280. dropi = defined(i1) && credconv=="drop" ? credbob.tdecimate(1) : nop()
  281.  
  282. dropp = defined(p1) && credconv=="drop" ? blendbg.tdecimate(1) : nop()
  283.  
  284. ########
  285. #SPLICE# CREDS=TRUE (USER SPECIFIES I1, I2, P1, P2, E1, E2 OR E3)
  286. ########
  287.  
  288. #Determine the "mix" mode (how the different sections (30i, 24t, 30p) are spliced together)
  289. #Also check for user error when entering the frame numbers
  290.  
  291. mix22a17        = defined(e1) && defined(e2) && defined(e3) && defined(i1) && defined(p1)       ? true : false
  292. mix7            = defined(e1) && defined(e2) && defined(e3) && defined(i1) && defined(i2)       ? true : false
  293. mix14           = defined(e1) && defined(e2) && defined(e3) && defined(p1) && defined(p2)       ? true : false
  294.  
  295. mix21a20a16a15  = defined(e1) && defined(e2) && defined(i1) && defined(p1) && mix22a17==false   ? true : false
  296. mix6a3          = defined(e1) && defined(e2) && defined(i1) && defined(i2) && mix7==false       ? true : false
  297. mix13a10        = defined(e1) && defined(e2) && defined(p1) && defined(p2) && mix14==false      ? true : false
  298.  
  299. mix19a18        = defined(e1) && defined(p1) && defined(i1) && mix21a20a16a15==false    ? true : false
  300. mix9            = defined(e1) && defined(p1) && defined(p2) && mix13a10==false          ? true : false
  301. mix2            = defined(e1) && defined(i1) && defined(i2) && mix6a3==false            ? true : false
  302. mix4            = defined(e1) && defined(e2) && defined(i1) && mix21a20a16a15==false && mix6a3==false   ? true : false
  303. mix11           = defined(e1) && defined(e2) && defined(p1) && mix21a20a16a15==false && mix13a10==false ? true : false
  304.  
  305. mix1a5  = defined(e1) && defined(i1) && mix19a18==false && mix2==false && mix4==false           ? true : false
  306. mix8a12 = defined(e1) && defined(p1) && mix19a18==false && mix11==false && mix9==false          ? true : false
  307.  
  308.  
  309. #Getting the "mix" mode based on user input
  310. mix = 0
  311. mix = mix1a5            && i1<e1                ? 1 : mix
  312. mix = mix2              && i1<e1<i2             ? 2 : mix
  313. mix = mix6a3            && i1<e1<i2<e2          ? 3 : mix
  314. mix = mix4              && e1<i1<e2             ? 4 : mix
  315. mix = mix1a5            && e1<i1                ? 5 : mix
  316. mix = mix6a3            && e1<i1<e2<i2          ? 6 : mix
  317. mix = mix7              && e1<i1<e2<i2<e3       ? 7 : mix
  318. mix = mix8a12           && p1<e1                ? 8 : mix
  319. mix = mix9              && p1<e1<p2             ? 9 : mix
  320. mix = mix13a10          && p1<e1<p2<e2          ? 10 : mix
  321. mix = mix11             && e1<p1<e2             ? 11 : mix
  322. mix = mix8a12           && e1<p1                ? 12 : mix
  323. mix = mix13a10          && e1<p1<e2<p2          ? 13 : mix
  324. mix = mix14             && e1<p1<e2<p2<e3       ? 14 : mix
  325. mix = mix21a20a16a15    && e1<i1<e2<p1          ? 15 : mix
  326. mix = mix21a20a16a15    && i1<e1<p1<e2          ? 16 : mix
  327. mix = mix22a17          && e1<i1<e2<p1<e3       ? 17 : mix
  328. mix = mix19a18          && i1<e1<p1             ? 18 : mix
  329. mix = mix19a18          && p1<e1<i1             ? 19 : mix
  330. mix = mix21a20a16a15    && e1<p1<e2<i1          ? 20 : mix
  331. mix = mix21a20a16a15    && p1<e1<i1<e2          ? 21 : mix
  332. mix = mix22a17          && e1<p1<e2<i1<e3       ? 22 : mix
  333. mix = defined(i2) && defined(i1)==false ? 0 : mix
  334. mix = defined(p2) && defined(p1)==false ? 0 : mix
  335. mix = defined(e2) && defined(e1)==false ? 0 : mix
  336. mix = defined(e3) && defined(e2)==false ? 0 : mix
  337. mix = defined(e3) && defined(e1)==false ? 0 : mix
  338. mix = defined(i1) && defined(e1)==false ? 0 : mix
  339. mix = defined(p1) && defined(e1)==false ? 0 : mix
  340. creds ? assert(mix!=0, "Mistake in entering i1, e1.... parameters. Please check.") : nop()
  341.  
  342. #Determine frame numbers based on mix mode and user input of i/p/e1/2/3
  343. istart1=mix==1 || mix==2 || mix==3 || mix==16 || mix==18                                        ? 0     : \
  344.         mix==4 || mix==5 || mix==6 || mix==7 || mix==15 || mix==17 || mix==19 || mix==21        ? e1+1  : \
  345.         mix==20 || mix==22                                                                      ? e2+1  : nop()
  346.  
  347. istart2=mix==2 || mix==3 ? e1+1 : mix==6 || mix==7 ? e2+1 : nop()
  348.  
  349. pstart1=mix==8 || mix==9 || mix==10 || mix==19 || mix==21                                       ? 0     : \
  350.         mix==11 || mix==12 || mix==13 || mix==14 || mix==16 || mix==18 || mix==20 || mix==22    ? e1+1  : \
  351.         mix==15 || mix==17                                                                      ? e2+1  : nop()
  352.  
  353. pstart2=mix==9 || mix==10 ? e1+1 : mix==13 || mix==14 ? e2+1 : nop()
  354.  
  355. estart1=mix==4 || mix==5 || mix==6 || mix==7 || mix==11 || mix==12 || mix==13 || mix==14 || mix==15 || mix==17 || mix==20 || mix==22    ? 0     : \
  356.         mix==1 || mix==2 || mix==3 || mix==16 || mix==18                                                                                ? i1+1  : \
  357.         mix==8 || mix==9 || mix==10 || mix==19 || mix==21                                                                               ? p1+1  : nop()
  358.  
  359. estart2=mix==4 || mix==6 || mix==7 || mix==15 || mix==17 || mix==21     ? i1+1  : \
  360.         mix==3                                                          ? i2+1  : \
  361.         mix==11 || mix==13 || mix==14 || mix==16 || mix==20 || mix==22  ? p1+1  : \
  362.         mix==10                                                         ? p2+1  : nop()
  363.  
  364. estart3=mix==7 ? i2+1 : mix==14 ? p2+1 : mix==17 ? p1+1 : mix==22 ? i1+1 : nop()
  365.  
  366. maxfps = defined(i1) ? framerate(i) : defined(p1) ? framerate(i) : nop()
  367.  
  368. #Final 24fps ivtced clip and deinterlaced + framerate converted for CFR (omode=1)
  369. tocfrfinalt = omode==1 ? (mode==1) ? fmdecim : (mode==2) ? fbdecim : (mode==3) ? dhtdecim : (mode==4 && omode==1) ? blenddecim : nop() : nop()
  370. tocfrfinali = omode==1 && creds ? (credconv=="mocomp") ? fpsconvi : (credconv=="blend") ? blendi : credconv=="drop" ? dropi : nop() : nop()
  371. tocfrfinalp = omode==1 && creds ? (credconv=="mocomp") ? fpsconvp : (credconv=="blend") ? blendp : credconv=="drop" ? dropp : nop() : nop()
  372.  
  373. #Final 30fps clips (prepare for hybrid decimation, make everything 30fps) for hybrid use fm since it will be spliced (txt file will be useless) (used when creds=true)
  374. tovfrfinalt = omode==2 && creds ? (mode==1) ? fm : (mode==2) ? fbdecim.changefps(maxfps) : (mode==3) ? dhtdecim.changefps(maxfps) : (mode==4 && omode==2) ? fm : nop() : nop()
  375. tovfrfinali = omode==2 && creds ? credbob : nop()
  376. tovfrfinalp = omode==2 && creds ? blendbg : nop()
  377.  
  378. #Final clip to splice
  379. spliceprept = mix!=0 ? omode==1 ? tocfrfinalt : omode==2 ? tovfrfinalt : nop() : nop()
  380. spliceprepi = mix!=0 ? omode==1 ? tocfrfinali : omode==2 ? tovfrfinali : nop() : nop()
  381. spliceprepp = mix!=0 ? omode==1 ? tocfrfinalp : omode==2 ? tovfrfinalp : nop() : nop()
  382.  
  383. #######################
  384. ###Trim
  385. #Factor to get the proper trim values after decimating
  386. factor = omode==1 ? defined(i1) ? float(framerate(tocfrfinali)/framerate(i)) : defined(p1) ? float(framerate(tocfrfinalp)/framerate(i)) : nop() : nop()
  387.  
  388. et1 =   defined(e1) ? omode==2 ? spliceprept.trim(estart1,e1) : spliceprept.trim(int(estart1*factor),int(e1*factor)) : nop()
  389. et2 =   defined(e2) ? omode==2 ? spliceprept.trim(estart2,e2) : spliceprept.trim(int(estart2*factor),int(e2*factor)) : nop()
  390. et3 =   defined(e3) ? omode==2 ? spliceprept.trim(estart3,e3) : spliceprept.trim(int(estart3*factor),int(e3*factor)) : nop()
  391.  
  392. ci1 =   defined(i1) ? omode==2 ? spliceprepi.trim(istart1,i1) : spliceprepi.trim(int(istart1*factor),int(i1*factor)) : nop()
  393. ci2 =   defined(i2) ? omode==2 ? spliceprepi.trim(istart2,i2) : spliceprepi.trim(int(istart2*factor),int(i2*factor)) : nop()
  394.  
  395. #Prepare 30p sections for splicing
  396. cp1 =   defined(p1) ? omode==2 ? spliceprepp.trim(pstart1,p1) : spliceprepp.trim(int(pstart1*factor),int(p1*factor)) : nop()
  397. cp2 =   defined(p2) ? omode==2 ? spliceprepp.trim(pstart2,p2) : spliceprepp.trim(int(pstart2*factor),int(p2*factor)) : nop()
  398.  
  399. spliced=(mix==1) ?      ci1 +   et1 : \
  400.         (mix==2) ?      ci1 +   et1 +   ci2 : \
  401.         (mix==3) ?      ci1 +   et1 +   ci2 +   et2 : \
  402.         (mix==4) ?      et1 +   ci1 +   et2 : \
  403.         (mix==5) ?      et1 +   ci1 : \
  404.         (mix==6) ?      et1 +   ci1 +   et2 +   ci2 : \
  405.         (mix==7) ?      et1 +   ci1 +   et2 +   ci2 +   et3 : \
  406.         (mix==8) ?      cp1 +   et1 : \
  407.         (mix==9) ?      cp1 +   et1 +   cp2 : \
  408.         (mix==10) ?     cp1 +   et1 +   cp2 +   et2 : \
  409.         (mix==11) ?     et1 +   cp1 +   et2 : \
  410.         (mix==12) ?     et1 +   cp1 : \
  411.         (mix==13) ?     et1 +   cp1 +   et2 +   cp2 : \
  412.         (mix==14) ?     et1 +   cp1 +   et2 +   cp2 +   et3 : \
  413.         (mix==15) ?     et1 +   ci1 +   et2 +   cp1 : \
  414.         (mix==16) ?     ci1 +   et1 +   cp1 +   et2 : \
  415.         (mix==17) ?     et1 +   ci1 +   et2 +   cp1 +   et3 : \
  416.         (mix==18) ?     ci1 +   et1 +   cp1 : \
  417.         (mix==19) ?     cp1 +   et1 +   ci1 : \
  418.         (mix==20) ?     et1 +   cp1 +   et2 +   ci1 : \
  419.         (mix==21) ?     cp1 +   et1 +   ci1 +   et2 : \
  420.         (mix==22) ?     et1 +   cp1 +   et2 +   ci1 +   et3 : \
  421.         NOP()
  422.  
  423. finalcfr =  omode==1 ? creds ? spliced : tocfrfinalt : nop()
  424. tovfrdec1 = omode==2 ? creds ? spliced : chrfix ? debprep : hybridfm : nop()
  425. tovfrdec2 = omode==2 ? rendering ? i : creds ? spliced : chrfix ? debprep : fm : nop()
  426.  
  427. finalvfr =      omode==2 && pass==1 ? tovfrdec1.TDecimate(4, output="stats.txt",denoise=true,vidThresh=0.8) :
  428. \               omode==2 && pass==2 ? tovfrdec2.TDecimate(5,hybrid=2,tfmin=creds ? "" : "tfm.txt",input="stats.txt",mkvout="timecodes.txt",tcfv1=false,batch=true,vidThresh=0.2) : nop()
  429.  
  430. topp = omode==1 ? finalcfr : omode==2 ? finalvfr : nop()
  431.  
  432. #Kill combing depending on user settings
  433. dec =   killcomb==0 ? topp :
  434. \       killcomb==1 ? topp.vinverse() :
  435. \       killcomb==2 ? topp.vinverseD() :
  436. \       killcomb==3 ? topp.daa() :
  437. \               interleave(     topp.            subtitle("killcomb=0",align=9),
  438. \                               topp.vinverse(). subtitle("killcomb=1",align=9),
  439. \                               topp.vinverseD().subtitle("killcomb=2",align=9),
  440. \                               topp.daa().subtitle("killcomb=3",align=9))
  441.  
  442. aaed =  aa==0 ? dec :
  443. \       aa==1 ? dec.ediaa() :
  444. \       aa==2 ? dec.daa() :
  445. \       aa==3 ? dec.maa() :
  446. \       aa==4 ? dec.sharpaamcmod(dark,thin,sharp,smooth,stabilize,tradius,aapel,aaov,aablk,aatype) :
  447. \                       interleave(     dec.            subtitle("aa=0",align=9),
  448. \                                       dec.ediaa().    subtitle("aa=1",align=9),
  449. \                                       dec.daa().      subtitle("aa=2",align=9),
  450. \                                       dec.maa().      subtitle("aa=3",align=9),
  451. \                                       dec.sharpaamcmod(dark,thin,sharp,smooth,stabilize,tradius,aapel,aaov,aablk,aatype).subtitle("aa=4",align=9))
  452.  
  453. return omode==2 && pass==1 ? finalvfr : aaed
  454. }
  455.  
  456.  
  457. function chroma_rep(clip source, int "cache")
  458. {
  459. ###### parameters & other necessary vars ######
  460.     cache   = default(cache,-1)
  461.  
  462.  
  463. ###### source preparation & lut ######
  464. global  out1    = source
  465. global  out2    = mergechroma(source,mt_adddiff(source.trim(1,0),mt_makediff(source.trim(1,0),source.trim(2,0),y=1,u=3,v=3),y=1,u=3,v=3).blur(1))
  466.  
  467.  
  468. ###### initialise variables ######
  469. global  alfr     = -100
  470.  
  471.  
  472. ###### evaluation call & output calculation ######
  473. scriptclip( source, """
  474.  
  475. ### preparation ###
  476.        cfr = current_frame
  477.        ajmp = alfr+1==cfr
  478.        
  479.    global  alfr = cfr
  480.  
  481.        al_v = LumaDifference(out1.trim(1,0),out1.trim(2,0))
  482.        ac_v = ChromaUDifference(out1.trim(1,0),out1.trim(2,0)) + ChromaVDifference(out1.trim(1,0),out1.trim(2,0))
  483.  
  484.  ## luma value shifting ##
  485.    l10 = ajmp ? l01 : al_v
  486. global          l01     = ajmp ? l12 : al_v
  487. global          l12     = al_v
  488.  
  489.  ## chroma value shifting ##
  490.    c10 = ajmp ? c01 : ac_v
  491. global          c01 = ajmp ? c12 : ac_v
  492. global          c12 = ac_v
  493.        
  494. ### condition ###
  495.    change  = l12*3<l01 && c01*1.5<c12
  496.    chango  = l01*3<l10 && c10*1.5<c01
  497.    
  498.    change ? out2 : chango ? out1.trim(1,0) : out1
  499.  
  500. """)
  501.  
  502.  
  503. ###### final decimation & caching ######
  504. cache<0 ? last : last.RequestLinear(8, cache, 5, false, false)
  505.  
  506. return last
  507. }
  508.  
  509.  
  510. function chroma_rep2(clip source, int "cache")
  511. {
  512. ###### parameters & other necessary vars ######
  513.     cache   = default(cache,-1)
  514.  
  515.  
  516. ###### source preparation & lut ######
  517. global  out1    = source
  518. global  out2    = mergechroma(source,mt_adddiff(source.trim(1,0),mt_makediff(source.trim(1,0),source.trim(2,0),y=1,u=3,v=3),y=1,u=3,v=3).blur(1))
  519.  
  520.  
  521. ###### initialise variables ######
  522. global  alfr     = -100
  523.  
  524.  
  525. ###### evaluation call & output calculation ######
  526. chrixout = scriptclip( source, """
  527.  
  528. ### preparation ###
  529.        cfr = current_frame
  530.        ajmp = alfr+1==cfr
  531.        
  532.    global  alfr = cfr
  533.  
  534.        al_v = LumaDifference(out1,out1.trim(1,0))
  535.        ac_v = ChromaUDifference(out1,out1.trim(1,0)) + ChromaVDifference(out1,out1.trim(1,0))
  536.  
  537.  ## luma value shifting ##
  538.    l10 = ajmp ? l01 : al_v
  539. global          l01     = ajmp ? l12 : al_v
  540. global          l12     = al_v
  541.  
  542.  ## chroma value shifting ##
  543.    c10 = ajmp ? c01 : ac_v
  544. global          c01 = ajmp ? c12 : ac_v
  545. global          c12 = ac_v
  546.        
  547. ### condition ###
  548.    change  = l12*3<l01 && c01*1.5<c12
  549.    chango  = l01*3<l10 && c10*1.5<c01
  550.    
  551.    change ? out2 : chango ? out1.trim(1,0) : out1
  552.  
  553. """)
  554.  
  555.  
  556. ###### final decimation & caching ######
  557. chrixout2 = cache<0 ? source.mergechroma(chrixout) : source.mergechroma(chrixout).RequestLinear(8, cache, 5, false, false)
  558.  
  559. return chrixout2
  560. }
  561.  
  562.  
  563. #based on smartfade v0.2 by martino - Aimed at removing interlaced fades in anime. Uses luma difference between two fields as activation threshold.
  564. #mod by thetoof : removed degrainmedian post-processing,
  565. #               changed how the fields are blended together (average of 2 nnedi interpolations + contra-sharpening to retain more detail) and
  566. #               added cache parameter to forward the setting of animeivtc to this function
  567. #               renamed global parameter to something less general than "threshold"
  568.  
  569. function smartfademod(clip c, float "sfthr", bool "sfshow", int "cache") {
  570.    
  571. global sfthr    = default ( sfthr,  0.4 ) # Threshold for fade detection.
  572. show            = default ( sfshow, false ) # Displays luma difference between fields without processing anything.
  573. cache           = default ( cache,   10 ) # Cache the frames to help seeking and other functions requesting many frames
  574.  
  575. show ? scriptclip(c, "subtitle(string(abs(        separatefields().selectodd().averageluma() \
  576.                                         - separatefields().selecteven().averageluma())))") : \
  577.        scriptclip(c, "sep = separatefields() \
  578.       avg = sep.selectodd().averageluma() - sep.selecteven().averageluma() \
  579.       abs(avg) > sfthr ? interleave(sep.selecteven(),sep.selectodd()).weave().daa() : last")
  580.  
  581. cache<0 ? last : last.RequestLinear(8, cache, 5, false, false)
  582.  
  583.     return last
  584.  
  585. }
  586.  
  587. #Suggested by Mystery Keeper in "Denoise of tv-anime" thread
  588. function ediaa(clip a) {return a.EEDI2(field=1).TurnRight().EEDI2(field=1).TurnLeft().spline36resize(a.width,a.height,-0.5,-0.5)}
  589.  
  590. #Anti-aliasing with contra-sharpening by Didée
  591. function daa(clip c) {
  592. nn      = c.nnedi2(field=-2)
  593. dbl     = mt_average(selecteven(nn),selectodd(nn),U=3,V=3)
  594. dblD    = mt_makediff(c,dbl,U=3,V=3)
  595. shrpD   = mt_makediff(dbl,dbl.removegrain((width(c)>1100) ? 20 : 11),U=3,V=3)
  596. DD      = shrpD.repair(dblD,13)
  597. return dbl.mt_adddiff(DD,U=3,V=3) }
  598.  
  599. #Anti-aliasing with edge masking by martino, mask using "sobel" taken from Kintaro's useless filterscripts and modded by thetoof for spline36
  600. function maa(clip input, int "mask") {
  601. mask = input.mt_edge("sobel",7,7,5,5).mt_inflate()
  602. aa_clip=input.spline36Resize(width(input)*2,height(input)*2).TurnLeft().SangNom().TurnRight().SangNom().spline36Resize(width(input),height(input)).MergeChroma(input)
  603. return mt_merge(input,aa_clip,mask) }
  604.  
  605. #Developped in the "fine anime antialiasing thread"
  606. function SharpAAMCmod(clip orig, float "dark", int "thin", int "sharp", int "smooth", bool "stabilize", int "tradius", int "aapel", int "aaov", int "aablk", string "aatype")
  607. {
  608. dark    = default ( dark,     0.2 ) # strokes darkening strength
  609. thin    = default ( thin,      10 ) # Presharpening
  610. sharp   = default ( sharp,    150 ) # Postsharpening
  611. smooth  = default ( smooth,    -1 ) # Postsmoothing
  612. stabilize= default ( stabilize,false ) # Use post stabilization with Motion Compensation
  613. Tradius = default ( Tradius,    2 ) # 2 = MDegrain2 / 3 = MDegrain3
  614. aapel   = default ( aapel,      1 ) # accuracy of the motion estimation (Value can only be 1, 2 or 4. 1 means a precision to the pixel. 2 means a precision to half a pixel, 4 means a precision to quarter a pixel, produced by spatial interpolation (better but slower).)
  615. aaov    = default ( aaov,       (orig.width>1100) ? 8 : 4 ) # block overlap value (horizontal). Must be even and less than block size. (Higher = more precise & slower)
  616. aablk   = default ( aablk,      (orig.width>1100) ? 16 : 8 ) # Size of a block (horizontal). It's either 4, 8 or 16 ( default is 8 ). Larger blocks are less sensitive to noise, are faster, but also less accurate.
  617. aatype  = default ( aatype, "Sangnom" ) # Use Sangnom() or EEDI2() for anti-aliasing
  618.  
  619. w=width(orig)
  620. h=height(orig)
  621. m=mt_logic( orig.DEdgeMask(0,255,0,255,"5 10 5 0 0 0 -5 -10 -5", divisor=4,Y=3,U=3,V=3)
  622.  \       ,orig.DEdgeMask(0,255,0,255,"5 0 -5 10 0 -10 5 0 -5", divisor=4,Y=3,U=3,V=3)
  623.  \       ,"max").mt_lut("x 128 / 0.86 ^ 255 *")
  624. preaa=(thin==0 && dark==0) ? orig : (thin==0) ? orig.Toon(dark) : (dark==0) ? orig.awarpsharp2(depth=thin) : orig.Toon(dark).awarpsharp2(depth=thin)
  625. aa= (aatype=="Sangnom") ? preaa.spline36resize(w*2,h*2).TurnLeft().SangNom().TurnRight().SangNom().spline36resize(w,h) : (aatype=="EEDI2") ? preaa.ediaa() : blankclip(pixel_type="YV12").subtitle("Please use Sangnom or EEDI2 for aatype")
  626. postsh=(sharp==0 && smooth==0) ? aa : aa.lsfmod(edgemode=1,strength=sharp,overshoot=1,soft=smooth)
  627. merged=mt_merge(orig,postsh,m,Y=3,U=3,V=3)
  628.  
  629. sD=mt_makediff(orig,merged)
  630.  
  631. origsuper= orig.MSuper(pel=aapel)
  632. sDsuper  = sD.  MSuper(pel=aapel, levels=1)
  633.  
  634.  
  635. fv3 = tradius==3 ? origsuper.MAnalyse(isb=false,delta=3,overlap=aaov,blksize=aablk) : nop()
  636. fv2 = tradius>=2 ? origsuper.MAnalyse(isb=false,delta=2,overlap=aaov,blksize=aablk) : nop()
  637. fv1 = tradius>=1 ? origsuper.MAnalyse(isb=false,delta=1,overlap=aaov,blksize=aablk) : nop()
  638. bv1 = tradius>=1 ? origsuper.MAnalyse(isb=true, delta=1,overlap=aaov,blksize=aablk) : nop()
  639. bv2 = tradius>=2 ? origsuper.MAnalyse(isb=true, delta=2,overlap=aaov,blksize=aablk) : nop()
  640. bv3 = tradius==3 ? origsuper.MAnalyse(isb=true, delta=3,overlap=aaov,blksize=aablk) : nop()
  641. sDD = tradius==1 ? sD.MDegrain1(sDsuper,bv1,fv1) : tradius==2 ? sD.MDegrain2(sDsuper,bv1,fv1,bv2,fv2) : sD.MDegrain3(sDsuper,bv1,fv1,bv2,fv2,bv3,fv3)
  642.  
  643. reduc = 0.4
  644. sDD = mt_lutxy(sD,sDD,"x 128 - abs y 128 - abs < x y ?").mergeluma(sDD,1.0-reduc)
  645.  
  646. return stabilize ? orig.mt_makediff(sDD,U=2,V=2) : merged
  647. }
  648.  
  649. # Kill Combing Function from mcbob
  650. function VinverseD(clip clp, float "sstr", int "amnt", int "uv")
  651. {
  652. uv   = default(uv,3)
  653. sstr = default(sstr,2.7)
  654. amnt = default(amnt,255)
  655. uv2  = (uv==2) ? 1 : uv
  656. STR  = string(sstr)
  657. AMN  = string(amnt)
  658. vblur  = clp.mt_convolution("1","50 99 50",U=uv,V=uv)
  659. vblurD = mt_makediff(clp,vblur,U=uv2,V=uv2)
  660. Vshrp  = mt_lutxy(vblur,vblur.mt_convolution("1","1 4 6 4 1",U=uv2,V=uv2),expr="x x y - "+STR+" * +",U=uv2,V=uv2)
  661. VshrpD = mt_makediff(Vshrp,vblur,U=uv2,V=uv2)
  662. VlimD  = mt_lutxy(VshrpD,VblurD,expr="x 128 - y 128 - * 0 < x 128 - abs y 128 - abs < x y ? 128 - 0.25 * 128 + x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2)
  663. mt_adddiff(Vblur,VlimD,U=uv,V=uv)
  664. (amnt>254) ? last : (amnt==0) ? clp : mt_lutxy(clp,last,expr="x "+AMN+" + y < x "+AMN+" + x "+AMN+" - y > x "+AMN+" - y ? ?",U=uv,V=uv)
  665. return(last)
  666. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top