SHOW:
|
|
- or go back to the newest paste.
| 1 | ################################################################################################ | |
| 2 | ### ### | |
| 3 | ### Simple MDegrain Mod - SMDegrain() ### | |
| 4 | ### ### | |
| 5 | ### Mod by Dogway - Original idea by Caroliano ### | |
| 6 | ### ### | |
| 7 | ### Special Thanks: Sagekilla, Didée, cretindesalpes, Gavino and MVtools people ### | |
| 8 | ### ### | |
| 9 | ### v3.1.2d (Dogway's mod) - 21 July 2015 ### | |
| 10 | ### v3.1.2.98s mod for v3.1.2d to fix subpixel=3 and add Prefilter auto 16 (lsb) support ### | |
| 11 | ### and yuy2 support in avs 2.6 with masktools 2.6 ### | |
| 12 | ### and medianblur2 now will be used in Minblur instead of Quantile RemoveGrainHD in avs 2.6 ### | |
| 13 | ### and add TV_range bool ### | |
| 14 | ### less lsb if not use lsb things and get ready for yv16 and yv24 ### | |
| 15 | ### add dct, device_id and move all prefilters to external function ### | |
| 16 | ### some cleanup and others ### | |
| 17 | ### add MDegrain4 and MDegrain5 and MDegrain6 ### | |
| 18 | ### add always_MDegrainN bool ### | |
| 19 | ### SMDegrain_KNLMeansCL ### | |
| 20 | - | ### masktools 2.2.5 or up now required in avs26 and avs+ ### |
| 20 | + | ### masktools 2.2.15 or up now required in avs26 and avs+ ### |
| 21 | ### now work basically with new high bit depth in avs+ ### | |
| 22 | ### now has new parameters bool n16 and bool n16_out ### | |
| 23 | ### ### | |
| 24 | ################################################################################################ | |
| 25 | ### | |
| 26 | ### General purpose simple degrain function. Pure temporal denoiser. Basically a wrapper(function)/frontend of mvtools2+mdegrain | |
| 27 | ### with some added common related options. Goal is accessibility and quality but not targeted to any specific kind of source. | |
| 28 | ### The reason behind is to keep it simple so aside masktools2 you will only need MVTools2. | |
| 29 | ### | |
| 30 | ### Check documentation for deep explanation on settings and defaults. | |
| 31 | ### | |
| 32 | ################################################################################################ | |
| 33 | ||
| 34 | function SMDegrain (clip input , int "tr" , int "thSAD" , int "thSADC" , bool "RefineMotion", val "contrasharp", clip "CClip" , bool "interlaced" , int "plane" , int "Globals", \ | |
| 35 | int "pel" , int "subpixel", val "prefilter", clip "mfilter", int "blksize" , int "overlap" , int "search" , bool "truemotion" , int "limit" , int "limitc" , int "thSCD1" , int "thSCD2", \ | |
| 36 | bool "chroma", int "hpad" , int "vpad" , bool "lsb" , bool "lsb_in" , bool "lsb_out" , int "mode" , bool "slices" , val "Show" , float "Str" , float "Amp" , bool "TV_range", int "dct", int "device_id", int "searchparam", int "pelsearch", bool "trymany", bool "always_MDegrainN", bool "n16", bool "n16_out"){
| |
| 37 | ||
| 38 | ||
| 39 | ||
| 40 | # Defaults & Conditionals | |
| 41 | ||
| 42 | ||
| 43 | tr = default( tr, 2 ) | |
| 44 | thSAD = default( thSAD, 300 ) | |
| 45 | thSAD2=int(thSAD/2) | |
| 46 | thSADC = default( thSADC, thSAD2) | |
| 47 | RefineMotion = default( RefineMotion, false) | |
| 48 | alway_grainN = default( always_MDegrainN, false) | |
| 49 | ||
| 50 | lsb_in = default( lsb_in, false) | |
| 51 | lsb_out = default( lsb_out, false) | |
| 52 | lsb = default( lsb , lsb_in || lsb_out) | |
| 53 | mode = default( mode, 0 ) | |
| 54 | mode = mode != 9 ? mode : -1 | |
| 55 | ampn = mode != 9 ? 0.0 : 1.0 | |
| 56 | slices = default(slices, true) | |
| 57 | ||
| 58 | Globals = default( Globals, 0 ) | |
| 59 | GlobalR = Globals == 1 | |
| 60 | GlobalO = Globals == 3 | |
| 61 | if1 = Defined(CClip) | |
| 62 | ||
| 63 | Contrasharp = default( Contrasharp, !GlobalO && if1) | |
| 64 | Interlaced = default( Interlaced, false) | |
| 65 | ||
| 66 | w = input.width () | |
| 67 | h = input.height() | |
| 68 | sShow = IsString(show) | |
| 69 | preclip = IsClip(prefilter) | |
| 70 | planar = IsYUY2(input) | |
| 71 | ifC = IsBool(Contrasharp) | |
| 72 | if0 = ifC ? (Contrasharp ? true : false) : (Contrasharp > 0.0 ? true : false) | |
| 73 | if2 = if0 && lsb && !GlobalO | |
| 74 | avs26 = VersionNumber() < 2.60 ? false : true | |
| 75 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 76 | SBitsn = ssispmt ? input.BitsPerComponent() : 8 | |
| 77 | n16_out = default( n16_out, false) | |
| 78 | n16 = default( n16, n16_out) | |
| 79 | if3 = alway_grainN ? true : !avs26 ? tr > 3 : tr > 6 | |
| 80 | if4 = (w > 1099 || h > (lsb_in ? 1199 : 599)) | |
| 81 | if5 = interlaced ? (GetParity(input) ? true : false) : nop() | |
| 82 | ||
| 83 | ||
| 84 | pel = default( pel, if4 ? 1 : 2 ) | |
| 85 | subpixel = default( subpixel, 2 ) | |
| 86 | prefilter = default( prefilter, -1 ) | |
| 87 | MFilterB = defined(mfilter) | |
| 88 | pelclip = pel>1 && subpixel == 3 | |
| 89 | Str = default( Str, 1.0 ) | |
| 90 | Amp = default( Amp, 0.0625 ) | |
| 91 | TV_range = default( TV_range, !(Isrgb(input))) | |
| 92 | ||
| 93 | blksize = default( blksize, if4 ? 16 : 8 ) | |
| 94 | blk2=blksize/2 | |
| 95 | overlap = default( overlap, blk2 ) | |
| 96 | ovl2=overlap/2 | |
| 97 | search = default( search, 4 ) | |
| 98 | truemotion = default( truemotion, !if4) | |
| 99 | dct = default( dct, 0 ) | |
| 100 | thSCD1 = default( thSCD1, int(pow((blksize*2.5),2))) | |
| 101 | thSCD2 = default( thSCD2, 130 ) | |
| 102 | ||
| 103 | ||
| 104 | plane = default( plane, 4 ) | |
| 105 | chroma = default( chroma, true) | |
| 106 | Chr = chroma ? 3 : 1 | |
| 107 | Chr2 = chroma ? 3 : preclip ? 1 : (prefilter==3 ? 2 : 1) | |
| 108 | plane0 = plane!=0 | |
| 109 | U = plane0 && plane!=2 ? 3 : 2 | |
| 110 | V = plane0 && plane!=1 ? 3 : 2 | |
| 111 | Uin = lsb_in ? 3 : u | |
| 112 | Vin = lsb_in ? 3 : v | |
| 113 | ||
| 114 | ||
| 115 | hpad = blksize | |
| 116 | vpad = blksize | |
| 117 | limit = default( limit, 255 ) | |
| 118 | limitc = default( limitc,limit) | |
| 119 | ||
| 120 | Show = default( Show, false) | |
| 121 | ||
| 122 | ||
| 123 | ||
| 124 | ||
| 125 | # Error Report | |
| 126 | ||
| 127 | Assert(blksize==4 || blksize==8 || blksize==16 || blksize==32,"MAnalyse: Block's size must be 4x4, 8x4, 8x8, 16x2, 16x8, 16x16, 32x16, 32x32") | |
| 128 | Assert(overlap <= blk2, "Overlap must be at least half blksize or less") | |
| 129 | Assert(overlap == overlap-overlap%2, "MAnalyse: overlap must be an even figure") | |
| 130 | Assert(IsBool(Show) || sShow, "'Show' only accepts bool inputs (true,false), or string modes ('Speed','Memory',Quality')")
| |
| 131 | Assert(preclip || IsInt(prefilter), "'prefilter' only accepts integers and clip inputs") | |
| 132 | Assert(ifC || IsInt(Contrasharp),"'Contrasharp' only accepts integers and bool inputs") | |
| 133 | MFilterB ? Assert(IsClip(mfilter), "'mfilter' only accepts clip inputs") : nop() | |
| 134 | interlaced ? Assert(h%4==0, "Interlaced sources require mod 4 height sizes") : nop() | |
| 135 | lsb_in ? Assert(!interlaced, "Interlaced 16 bit stacked clip is not a recognized format") : nop() | |
| 136 | planar && if0 ? Assert(ifC, "LSFmod doesn't support YUY2 sources") : nop() | |
| 137 | RefineMotion ? Assert(blksize > 7, "For RefineMotion you need a blksize of at least 8") : nop() | |
| 138 | lsb_in ? Assert(lsb, "lsb_in requires: lsb=true") : nop() | |
| 139 | lsb_out ? Assert(lsb, "lsb_out requires: lsb=true") : nop() | |
| 140 | n16_out ? Assert(n16, "n16_out requires: n16=true") : nop() | |
| 141 | Assert(!(n16 && lsb), "you can't use n16 with lsb") | |
| 142 | ||
| 143 | ||
| 144 | ||
| 145 | # RefineMotion Variables | |
| 146 | ||
| 147 | halfblksize = RefineMotion ? blk2 : nop() # MRecalculate works with half block size | |
| 148 | halfoverlap = RefineMotion ? (overlap == 2 ? overlap : ovl2+ovl2%2) : nop() # Halve the overlap to suit the halved block size | |
| 149 | halfthSAD = RefineMotion || if3 ? thSAD2 : nop() # MRecalculate uses a more strict thSAD, which defaults to 150 (half of function's default of 300) | |
| 150 | halfthSADC = if3 ? int(thSADC/2) : nop() # For MDegrainN() | |
| 151 | ||
| 152 | ||
| 153 | ||
| 154 | ||
| 155 | ||
| 156 | ||
| 157 | # Input preparation for: LSB_IN, Interlacing, Planar and MSuper optimization when pel=2 | |
| 158 | ||
| 159 | inputY = planar ? (lsb_in ? Dither_YUY2toPlanar16(input) : Interleaved2planar(input)) : input | |
| 160 | ||
| 161 | inputP = !interlaced ? (pel == 2 ? inputY.AssumeFrameBased() : inputY) : \ | |
| 162 | (if5 ? inputY.AssumeTFF().SeparateFields() : inputY.AssumeBFF().SeparateFields()) | |
| 163 | ||
| 164 | input8h = lsb_in ? inputP. Ditherpost(mode=6, slice=slices) : nop() | |
| 165 | input8y = planar ? (lsb_in ? input8h.Dither_YUY2toInterleaved() : inputP) : inputP | |
| 166 | input8 = lsb_in ? (planar ? input8y.Interleaved2planar() : \ | |
| 167 | input8h) : input8y | |
| 168 | ||
| 169 | ||
| 170 | # Prefilter & Motion Filter | |
| 171 | ||
| 172 | Mfilter = MFilterB ? Mfilter : input8 | |
| 173 | ||
| 174 | bug_wa = interlaced && planar && chroma && !avs26 ? 2 : Chr # bug: crash prevention workaround | |
| 175 | ||
| 176 | pref = !GlobalR ? preclip ? prefilter : \ | |
| 177 | input.SMDegrain_prefilters(inputP=inputP,input8=input8,input8y=input8y\ | |
| 178 | ,inputY=inputY,input8h=input8h,prefilter=prefilter,chroma=chroma\ | |
| 179 | ,Chr=Chr,Chr2=Chr2,bug_wa=bug_wa,lsb=lsb,lsb_in=lsb_in,Interlaced=Interlaced\ | |
| 180 | ,if5=if5,pel=pel,device_type="GPU",device_id=device_id,a=1,d=1,h=7.0,slices=slices,planar=planar,cplace="mpeg1") : \ | |
| 181 | input8 | |
| 182 | ||
| 183 | ||
| 184 | ||
| 185 | ||
| 186 | ||
| 187 | # Default Auto-Prefilter - Luma expansion TV->PC (up to 16% more values for motion estimation) | |
| 188 | ||
| 189 | pref16 = (Height(pref)) == (Height(input8)*2) ? true : false | |
| 190 | pref = !GlobalR ? (!planar && lsb ? ((!preclip ? ((lsb_in && prefilter==-1) || prefilter==3 || prefilter==4 ) : false) ? \ | |
| 191 | !TV_range ? pref.Ditherpost(mode=6,ampn=0.0,slice=slices,staticnoise=false,u=Chr2,v=Chr2) : \ | |
| 192 | pref.Dither_Luma_Rebuild(S0=Str,c=Amp,slice=slices,lsb_in=true,uv=Chr2) : \ | |
| 193 | !TV_range ? pref16 ? pref.Ditherpost(mode=6,ampn=0.0,slice=slices,staticnoise=false,u=Chr2,v=Chr2) : pref : \ | |
| 194 | pref.Dither_Luma_Rebuild(S0=Str,c=Amp,slice=slices,lsb=true,lsb_in=pref16,uv=Chr2)) : \ | |
| 195 | ((!preclip ? (lsb_in && prefilter==-1) : false) ? \ | |
| 196 | !TV_range ? !planar ? pref.Ditherpost(mode=6,slice=slices,u=Chr,v=Chr) : pref.Ditherpost(mode=6,slice=slices,u=Chr,v=Chr).Dither_YUY2toInterleaved().Interleaved2planar(!chroma) : \ | |
| 197 | !planar ? pref.Dither_Luma_Rebuild(S0=Str,c=Amp,uv=chr, lsb_in=true) : pref.Dither_Luma_Rebuild(S0=Str,c=Amp,uv=chr, lsb_in=true).Dither_YUY2toInterleaved().Interleaved2planar(!chroma) : \ | |
| 198 | !TV_range ? pref16 ? !planar ? pref.Ditherpost(mode=6,slice=slices,u=Chr,v=Chr) : pref.planar2Interleaved(!chroma).Dither_YUY2toPlanar16().Ditherpost(mode=6,slice=slices,u=chr,v=chr).Dither_YUY2toInterleaved().Interleaved2planar(!chroma) : pref : \ | |
| 199 | pref.Dither_Luma_Rebuild(S0=Str,lsb=lsb,lsb_in=pref16,slice=slices,c=Amp,uv=bug_wa))) : \ | |
| 200 | pref | |
| 201 | ||
| 202 | pref = ssispmt ? n16 && sbitsn != pref.BitsPerComponent() ? pref.ConvertBits(sbitsn,dither=mode) : pref : pref | |
| 203 | ||
| 204 | ||
| 205 | ||
| 206 | ||
| 207 | md16str = n16 ? ",out16=true" : lsb ? ",lsb=true" : "" | |
| 208 | ||
| 209 | (sShow ? false : !Show) ? eval("""
| |
| 210 | ||
| 211 | ||
| 212 | # Subpixel 3 | |
| 213 | ||
| 214 | pclip = pelclip ? pel==4 ? pref.nnedi3_rpow2(rfactor=2,nns=4).nnedi3_rpow2(rfactor=2,nns=4) : pref.nnedi3_rpow2(rfactor=2,nns=4) : nop() | |
| 215 | pclip2 = pelclip && !GlobalR ? pel==4 ? input8.nnedi3_rpow2(rfactor=2,nns=4).nnedi3_rpow2(rfactor=2,nns=4) : input8.nnedi3_rpow2(rfactor=2,nns=4) : nop() | |
| 216 | ||
| 217 | ||
| 218 | ||
| 219 | ||
| 220 | # Motion vectors search | |
| 221 | ||
| 222 | ||
| 223 | super_search = pelclip ? MSuper(pref, pel=pel, chroma=chroma, hpad=hpad, vpad=vpad, pelclip=pclip, rfilter=4, planar=planar) : \ | |
| 224 | MSuper(pref, pel=pel,sharp=subpixel,chroma=chroma, hpad=hpad, vpad=vpad , rfilter=4, planar=planar) | |
| 225 | super_render = !GlobalR ? (pelclip ? MSuper(input8, pel=pel, chroma=plane0, hpad=hpad, vpad=vpad,levels=1, pelclip=pclip2 , planar=planar) : \ | |
| 226 | MSuper(input8, pel=pel,sharp=subpixel,chroma=plane0, hpad=hpad, vpad=vpad,levels=1 , planar=planar)): super_search | |
| 227 | Recalculate = !GlobalR && RefineMotion ? (pelclip ? MSuper(pref, pel=pel, chroma=chroma, hpad=hpad, vpad=vpad,levels=1, pelclip=pclip , planar=planar) : \ | |
| 228 | MSuper(pref, pel=pel,sharp=subpixel,chroma=chroma, hpad=hpad, vpad=vpad,levels=1 , planar=planar)): nop() | |
| 229 | !if3 ? eval("
| |
| 230 | t2 = interlaced ? tr > 1 ? tr*2 : tr : tr | |
| 231 | bv12 = interlaced && (tr > 5) ? (!GlobalR ? super_search.MAnalyse(isb = true, delta =12, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv12) : nop() | |
| 232 | bv12 = interlaced && (tr > 5) && RefineMotion && !GlobalR ? MRecalculate (Recalculate,bv12, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : bv12 | |
| 233 | bv10 = interlaced && (tr > 4) ? (!GlobalR ? super_search.MAnalyse(isb = true, delta =10, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv10) : nop() | |
| 234 | bv10 = interlaced && (tr > 4) && RefineMotion && !GlobalR ? MRecalculate (Recalculate,bv10, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : bv10 | |
| 235 | bv8 = interlaced && (tr > 3) ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 8, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv8) : nop() | |
| 236 | bv8 = interlaced && (tr > 3) && RefineMotion && !GlobalR ? MRecalculate (Recalculate, bv8, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : bv8 | |
| 237 | bv6 = t2 > 5 ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 6, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv6) : nop() | |
| 238 | bv6 = t2 > 5 && RefineMotion && !GlobalR ? MRecalculate (Recalculate, bv6, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : bv6 | |
| 239 | bv5 = !interlaced ? ((tr > 4) ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 5, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv5) : nop()) : nop() | |
| 240 | bv5 = !interlaced ? ((tr > 4 && RefineMotion && !GlobalR) ? MRecalculate (Recalculate, bv5, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : bv5) : nop() | |
| 241 | bv4 = t2 > 3 ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 4, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv4) : nop() | |
| 242 | bv4 = t2 > 3 && RefineMotion && !GlobalR ? MRecalculate (Recalculate, bv4, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : bv4 | |
| 243 | bv3 = !interlaced ? ((tr > 2) ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 3, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv3) : nop()) : nop() | |
| 244 | bv3 = !interlaced ? ((tr > 2 && RefineMotion && !GlobalR) ? MRecalculate (Recalculate, bv3, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : bv3) : nop() | |
| 245 | bv2 = (interlaced || tr > 1) ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 2, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv2) : nop() | |
| 246 | bv2 = ((interlaced || tr > 1) && RefineMotion && !GlobalR) ? MRecalculate (Recalculate, bv2, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : bv2 | |
| 247 | bv1 = !interlaced ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 1, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : bv1) : nop() | |
| 248 | bv1 = !interlaced ? ( RefineMotion && !GlobalR ? MRecalculate (Recalculate, bv1, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : bv1) : nop() | |
| 249 | ||
| 250 | fv1 = !interlaced ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 1, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv1) : nop() | |
| 251 | fv1 = !interlaced ? ( RefineMotion && !GlobalR ? MRecalculate (Recalculate, fv1, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : fv1) : nop() | |
| 252 | fv2 = (interlaced || tr > 1) ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 2, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv2) : nop() | |
| 253 | fv2 = ((interlaced || tr > 1) && RefineMotion && !GlobalR) ? MRecalculate (Recalculate, fv2, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : fv2 | |
| 254 | fv3 = !interlaced ? ((tr > 2) ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 3, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv3) : nop()) : nop() | |
| 255 | fv3 = !interlaced ? ((tr > 2 && RefineMotion && !GlobalR) ? MRecalculate (Recalculate, fv3, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : fv3) : nop() | |
| 256 | fv4 = t2 > 3 ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 4, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv4) : nop() | |
| 257 | fv4 = t2 > 3 && RefineMotion && !GlobalR ? MRecalculate (Recalculate, fv4, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : fv4 | |
| 258 | fv5 = !interlaced ? ((tr > 4) ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 5, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv5) : nop()) : nop() | |
| 259 | fv5 = !interlaced ? ((tr > 4 && RefineMotion && !GlobalR) ? MRecalculate (Recalculate, fv5, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : fv5) : nop() | |
| 260 | fv6 = t2 > 5 ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 6, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv6) : nop() | |
| 261 | fv6 = t2 > 5 && RefineMotion && !GlobalR ? MRecalculate (Recalculate, fv6, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : fv6 | |
| 262 | fv8 = interlaced && (tr > 3) ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 8, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv8) : nop() | |
| 263 | fv8 = interlaced && (tr > 3) && RefineMotion && !GlobalR ? MRecalculate (Recalculate, fv8, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : fv8 | |
| 264 | fv10 = interlaced && (tr > 4) ? (!GlobalR ? super_search.MAnalyse(isb = false, delta =10, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv10) : nop() | |
| 265 | fv10 = interlaced && (tr > 4) && RefineMotion && !GlobalR ? MRecalculate (Recalculate,fv10, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : fv10 | |
| 266 | fv12 = interlaced && (tr > 5) ? (!GlobalR ? super_search.MAnalyse(isb = false, delta =12, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : fv12) : nop() | |
| 267 | fv12 = interlaced && (tr > 5) && RefineMotion && !GlobalR ? MRecalculate (Recalculate,fv12, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion, dct=dct) : fv12 | |
| 268 | ") : eval("
| |
| 269 | tr2 = tr*2 | |
| 270 | vmulti = !GlobalR ? super_search.MAnalyse( multi=true,overlap= overlap,blksize= blksize, search=search,chroma=chroma,truemotion=truemotion, delta = interlaced ? tr2 : tr, dct=dct,searchparam=searchparam,pelsearch=pelsearch, trymany=trymany) : vmulti | |
| 271 | vmulti = RefineMotion ? (!GlobalR ? MRecalculate (Recalculate, vmulti,overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma,truemotion=truemotion, tr = interlaced ? tr2 : tr, dct=dct) : vmulti) : vmulti | |
| 272 | vmulti = !GlobalR ? (interlaced ? vmulti.SelectEvery (4, 2, 3) : vmulti) : vmulti.SelectRangeEvery (Rtr*2, tr2, 0, false) | |
| 273 | ") | |
| 274 | ||
| 275 | ||
| 276 | ||
| 277 | # Finally, MDegrain | |
| 278 | ||
| 279 | ||
| 280 | output = !GlobalO ? interlaced ? | |
| 281 | \ ( if3 ? mfilter.MDegrainN(super_render, vmulti, tr, thSAD2=halfthSAD, thSADC2=halfthSADC, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 282 | \ (tr == 6) ? mfilter.MDegrain6(super_render, bv2, fv2, bv4, fv4, bv6, fv6, bv8, fv8, bv10, fv10, bv12, fv12, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 283 | \ (tr == 5) ? mfilter.MDegrain5(super_render, bv2, fv2, bv4, fv4, bv6, fv6, bv8, fv8, bv10, fv10, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 284 | \ (tr == 4) ? mfilter.MDegrain4(super_render, bv2, fv2, bv4, fv4, bv6, fv6, bv8, fv8, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 285 | \ (tr == 3) ? mfilter.MDegrain3(super_render, bv2, fv2, bv4, fv4, bv6, fv6, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 286 | \ (tr == 2) ? mfilter.MDegrain2(super_render, bv2, fv2, bv4, fv4, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 287 | \ mfilter.MDegrain1(super_render, bv2, fv2, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""")): | |
| 288 | \ ( if3 ? mfilter.MDegrainN(super_render, vmulti, tr, thSAD2=halfthSAD, thSADC2=halfthSADC, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 289 | \ (tr == 6) ? mfilter.MDegrain6(super_render, bv1, fv1, bv2, fv2, bv3, fv3, bv4, fv4, bv5, fv5, bv6, fv6, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 290 | \ (tr == 5) ? mfilter.MDegrain5(super_render, bv1, fv1, bv2, fv2, bv3, fv3, bv4, fv4, bv5, fv5, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 291 | \ (tr == 4) ? mfilter.MDegrain4(super_render, bv1, fv1, bv2, fv2, bv3, fv3, bv4, fv4, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 292 | \ (tr == 3) ? mfilter.MDegrain3(super_render, bv1, fv1, bv2, fv2, bv3, fv3, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 293 | \ (tr == 2) ? mfilter.MDegrain2(super_render, bv1, fv1, bv2, fv2, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""") : | |
| 294 | \ mfilter.MDegrain1(super_render, bv1, fv1, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar"""+md16str+""")): nop() | |
| 295 | ||
| 296 | ||
| 297 | # LSB_IN merging | |
| 298 | ||
| 299 | type = avs26 ? input.PixelType() : "YV12" | |
| 300 | ||
| 301 | outputI= !GlobalO && planar && (lsb || ifC) ? output.Planar2Interleaved() : nop() | |
| 302 | !GlobalO && lsb ? eval("
| |
| 303 | blnkclp= lsb_in || (if2 && !planar) ? BlankClip (lsb_in?input8h:input8, pixel_type=type, color_yuv=0) : nop() | |
| 304 | output = lsb && planar ? Dither_YUY2toPlanar16(outputI) : output | |
| 305 | output = lsb_in ? inputY.Dither_add16 (Dither_sub16(output, planar?inputY:input8.Dither_convert_8_to_16 (), dif=true,u=u,v=v), dif=true,u=u,v=v) : output") : nop() | |
| 306 | ||
| 307 | ||
| 308 | ||
| 309 | ||
| 310 | # Contrasharp (only sharpens luma) | |
| 311 | ||
| 312 | ifC && if0 && if4 ? eval("
| |
| 313 | global Super = super_render | |
| 314 | global cb1 = !if3 ? (interlaced ? bv2 : bv1) : vmulti.SelectEvery (tr2, 0) | |
| 315 | global cf1 = !if3 ? (interlaced ? fv2 : fv1) : vmulti.SelectEvery (tr2, 1)") : nop() | |
| 316 | ||
| 317 | !GlobalO && if0 ? eval("
| |
| 318 | ||
| 319 | CCh = if1 ? CClip.height() : nop() | |
| 320 | ref8 = if1 ? (h == CCh*2) : nop() | |
| 321 | ref16 = if1 ? (h == CCh/2) : nop() | |
| 322 | ||
| 323 | interlaced && if1 ? Assert(!ref16, "+Chr(34)+"Interlaced 16 bit stacked CClip is not a recognized format"+Chr(34)+") : nop() | |
| 324 | ||
| 325 | CClip = planar ? (if1 ? (lsb_in ? (ref8 ? CClip.Interleaved2planar(true) : CClip.Dither_YUY2toPlanar16().DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true)) : \ | |
| 326 | (interlaced ? (if5 ? CClip.AssumeTFF().SeparateFields().Interleaved2planar(true) : CClip.AssumeBFF().SeparateFields().Interleaved2planar(true)) : \ | |
| 327 | (ref16 ? CClip.Dither_YUY2toPlanar16().DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true) : CClip.Interleaved2planar(true)))) : \ | |
| 328 | (lsb_in ? inputY.DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true) : \ | |
| 329 | inputP)) : \ | |
| 330 | (if1 ? (lsb_in ? (ref8 ? CClip : CClip.DitherPost(mode=-1,u=1,v=1)) : \ | |
| 331 | (interlaced ? (if5 ? CClip.AssumeTFF().SeparateFields() : CClip.AssumeBFF().SeparateFields()) : (ref16 ? CClip.DitherPost(mode=-1,u=1,v=1) : CClip))) : \ | |
| 332 | (lsb_in ? input.DitherPost(mode=-1,u=1,v=1) : \ | |
| 333 | inputP))") : nop() | |
| 334 | ||
| 335 | ||
| 336 | !GlobalO && if2 ? eval("
| |
| 337 | OutTO8 = output.DitherPost(mode=-1,u=1,v=1) | |
| 338 | OutTO8P = planar ? OutTO8.Dither_YUY2toInterleaved() : nop() | |
| 339 | ctr16 = ifC ? ContrasharpeningHD (planar ? OutTO8P.Interleaved2planar(true):OutTO8, CClip, planar=planar, HD=if4) : \ | |
| 340 | LSFmod(OutTO8,source=CClip,defaults="+Chr(34)+"slow"+Chr(34)+",strength=Contrasharp,soothe=false,Lmode=0,soft=-2,keep=0) | |
| 341 | ||
| 342 | ||
| 343 | ctr16P = planar ? ctr16.Planar2Interleaved(true) : ctr16 | |
| 344 | ctr16 = StackVertical (ctr16P, planar ? BlankClip (ctr16P, pixel_type="+Chr(34)+"YUY2"+Chr(34)+", color_yuv=0,length=1) : blnkclp ) | |
| 345 | ctr16 = Dither_add16 (output,mt_makediff(!planar?ctr16P:ctr16P.Dither_YUY2toPlanar(), OutTO8,u=2,v=2).Dither_convert_8_to_16(), dif=true,u=2,v=2) | |
| 346 | ctr16 = MergeChroma(ctr16, output) ") : nop() | |
| 347 | ||
| 348 | ||
| 349 | ||
| 350 | # Globals Output | |
| 351 | ||
| 352 | GlobalO || Globals == 2 ? (!if3 ? eval("
| |
| 353 | global Super = super_render | |
| 354 | global bv12 = bv12 | |
| 355 | global bv10 = bv10 | |
| 356 | global bv8 = bv8 | |
| 357 | global bv6 = bv6 | |
| 358 | global bv5 = bv5 | |
| 359 | global bv4 = bv4 | |
| 360 | global bv3 = bv3 | |
| 361 | global bv2 = bv2 | |
| 362 | global bv1 = bv1 | |
| 363 | ||
| 364 | global fv1 = fv1 | |
| 365 | global fv2 = fv2 | |
| 366 | global fv3 = fv3 | |
| 367 | global fv4 = fv4 | |
| 368 | global fv5 = fv5 | |
| 369 | global fv6 = fv6 | |
| 370 | global fv8 = fv8 | |
| 371 | global fv10 = fv10 | |
| 372 | global fv12 = fv12 | |
| 373 | ") : avs26 ? eval("
| |
| 374 | global bv1 = vmulti.SelectEvery (tr2, 0) | |
| 375 | global bv2 = interlaced ? bv1 : vmulti.SelectEvery (tr2, 2) | |
| 376 | global bv3 = vmulti.SelectEvery (tr2, 4) | |
| 377 | global bv4 = interlaced ? vmulti.SelectEvery (tr2, 2) : vmulti.SelectEvery (tr2, 6) | |
| 378 | global bv5 = vmulti.SelectEvery (tr2, 8) | |
| 379 | global bv6 = interlaced ? bv3 : vmulti.SelectEvery (tr2, 10) | |
| 380 | global bv8 = interlaced ? vmulti.SelectEvery (tr2, 6) : nop() | |
| 381 | global bv10 = interlaced ? bv5 : nop() | |
| 382 | global bv12 = interlaced ? vmulti.SelectEvery (tr2, 10) : nop() | |
| 383 | ||
| 384 | global fv1 = vmulti.SelectEvery (tr2, 1) | |
| 385 | global fv2 = interlaced ? fv1 : vmulti.SelectEvery (tr2, 3) | |
| 386 | global fv3 = vmulti.SelectEvery (tr2, 5) | |
| 387 | global fv4 = interlaced ? vmulti.SelectEvery (tr2, 3) : vmulti.SelectEvery (tr2, 7) | |
| 388 | global fv5 = vmulti.SelectEvery (tr2, 9) | |
| 389 | global fv6 = interlaced ? fv3 : vmulti.SelectEvery (tr2, 11) | |
| 390 | global fv8 = interlaced ? vmulti.SelectEvery (tr2, 7) : nop() | |
| 391 | global fv10 = interlaced ? fv5 : nop() | |
| 392 | global fv12 = interlaced ? vmulti.SelectEvery (tr2, 11) : nop() | |
| 393 | global Super = super_render | |
| 394 | global vmulti = vmulti | |
| 395 | global Rtr = tr | |
| 396 | ") : eval("
| |
| 397 | global bv1 = vmulti.SelectEvery (tr2, 0) | |
| 398 | global bv2 = interlaced ? bv1 : vmulti.SelectEvery (tr2, 2) | |
| 399 | global bv3 = vmulti.SelectEvery (tr2, 4) | |
| 400 | global bv4 = interlaced ? vmulti.SelectEvery (tr2, 2) : nop() | |
| 401 | global bv6 = interlaced ? bv3 : nop() | |
| 402 | ||
| 403 | global fv1 = vmulti.SelectEvery (tr2, 1) | |
| 404 | global fv2 = interlaced ? fv1 : vmulti.SelectEvery (tr2, 3) | |
| 405 | global fv3 = vmulti.SelectEvery (tr2, 5) | |
| 406 | global fv4 = interlaced ? vmulti.SelectEvery (tr2, 3) : nop() | |
| 407 | global fv6 = interlaced ? fv3 : nop() | |
| 408 | global Super = super_render | |
| 409 | global vmulti = vmulti | |
| 410 | global Rtr = tr")) : nop() | |
| 411 | ||
| 412 | ||
| 413 | ||
| 414 | # Output | |
| 415 | ||
| 416 | output = !GlobalO && !lsb && if0 ? ifC ? ContraSharpeningHD(output, CClip, planar=planar, HD=if4) : \ | |
| 417 | LSFmod(output,source=CClip,defaults="slow",strength=Contrasharp,soothe=false,Lmode=0,soft=-2,keep=0) \ | |
| 418 | : output | |
| 419 | ||
| 420 | !GlobalO ? n16_out ? output : n16 ? output.ConvertBits(sbitsn,dither=mode) : \ | |
| 421 | lsb_out ? (if0 ? ctr16 : output) : \ | |
| 422 | if0 && lsb ? (interlaced ? ctr16.weave().DitherPost(u=u,v=v,mode=6,slice=slices,interlaced=true) : ctr16.DitherPost(mode=mode,slice=slices,ampn=ampn,u=Uin,v=Vin)) : \ | |
| 423 | lsb ? (interlaced ? output.weave().DitherPost(u=u,v=v,mode=6,slice=slices,interlaced=true) : output.DitherPost(mode=mode,slice=slices,ampn=ampn,u=Uin,v=Vin)) : \ | |
| 424 | (interlaced ? output.weave() : output) \ | |
| 425 | : input | |
| 426 | ||
| 427 | !GlobalO ? (planar ? (lsb ? Dither_YUY2toInterleaved() : (if0 ? MergeChroma(Planar2Interleaved(true), interlaced ? outputI.weave() : outputI) : Planar2Interleaved())) : last) : last """) : \ | |
| 428 | \ | |
| 429 | \ | |
| 430 | \ | |
| 431 | \ | |
| 432 | \ | |
| 433 | eval("""
| |
| 434 | ||
| 435 | ############## | |
| 436 | # SHOW PANEL # | |
| 437 | ############## | |
| 438 | ||
| 439 | ||
| 440 | # Common Variables | |
| 441 | ||
| 442 | h = lsb_in ? h/2 : h | |
| 443 | w2 = w*1.0 | |
| 444 | h2 = h*1.0 | |
| 445 | hi = interlaced ? round(h/2.0) : h | |
| 446 | AR = w2/h2 | |
| 447 | lsp = interlaced?15:30 | |
| 448 | lsp = AR < 1.9 ? lsp : floor(AR < 1.9 ? lsp : ((AR>2.4) ? 0 : lsp-((AR-1.9)*(lsp/(2.4-1.9))))) | |
| 449 | ys = round(lsb_in ? h2/6 : (interlaced?h2/15:h2/6)) | |
| 450 | s = floor(((interlaced?w2/1.6:w2)/720.0)*16.0) | |
| 451 | type = avs26 ? input.PixelType() : planar?"YUY2":"YV12" | |
| 452 | ||
| 453 | Wadd = w2/40 | |
| 454 | Wadd2 = Wadd/2 | |
| 455 | w1 = round(w2+Wadd+Wadd2) | |
| 456 | w3 = (w2/3)+Wadd/2.1 | |
| 457 | w2 = round(w1+w3) | |
| 458 | w3 = round(w1+(w3+Wadd2)*1.96) | |
| 459 | w3sq = string(round(w3*1.01)) | |
| 460 | w3s = string(w3) | |
| 461 | ||
| 462 | # Panel Separator | |
| 463 | ||
| 464 | blkclp = BlankClip(interlaced?assumeframebased(pref):pref,length=1,pixel_type=type,color=$161616) | |
| 465 | \.crop(0,interlaced?h/2%8:h%8,0,0).separatefields().assumeframebased().separatefields() | |
| 466 | ||
| 467 | Interleave(selecteven(blkclp).addborders(2,0,0,0,color=$7f7f7f).crop(0,0,-2,0),selectodd(blkclp)) | |
| 468 | ||
| 469 | WOut=weave().assumefieldbased().weave() | |
| 470 | sep=round((hi-height(WOut))/2.0) | |
| 471 | ||
| 472 | StackHorizontal(planar? pref.Planar2Interleaved() : pref,WOut.addborders(0,sep-sep%2,0,hi-(height(WOut)+(sep-sep%2)),color=$161616)) | |
| 473 | ||
| 474 | ||
| 475 | ||
| 476 | # Color Guide Squares | |
| 477 | ||
| 478 | a=interlaced?h*0.37:h*0.74 | |
| 479 | b=interlaced?h*0.40:h*0.80 | |
| 480 | c=interlaced?h*0.43:h*0.86 | |
| 481 | ||
| 482 | !planar ? avs26 ? mt_merge(mt_lut(yexpr="127 scalef",uexpr="183 scalef",vexpr="47 scalef",use_expr=2 ,u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(a)+" >= y "+string(interlaced?h*0.3835:h*0.767)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true,use_expr=2) | |
| 483 | \ : mt_merge(mt_lut(yexpr="127",uexpr="183",vexpr="47" ,u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(a)+" >= y "+string(interlaced?h*0.3835:h*0.767)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true) : nop() | |
| 484 | !planar ? avs26 ? mt_merge(mt_lut(yexpr="81 scalef" ,uexpr="91 scalef" ,vexpr="240 scalef",use_expr=2,u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(b)+" >= y "+string(interlaced?h*0.4135:h*0.827)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true,use_expr=2) | |
| 485 | \ : mt_merge(mt_lut(yexpr="81" ,uexpr="91" ,vexpr="240",u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(b)+" >= y "+string(interlaced?h*0.4135:h*0.827)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true) : nop() | |
| 486 | !planar ? avs26 ? mt_merge(mt_lut(yexpr="210 scalef",uexpr="16 scalef" ,vexpr="146 scalef",use_expr=2,u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(c)+" >= y "+string(interlaced?h*0.4435:h*0.887)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true,use_expr=2) | |
| 487 | \ : mt_merge(mt_lut(yexpr="210",uexpr="16" ,vexpr="146",u=3,v=3) ,mt_lutspa(mode="absolute", yexpr="x "+w3s+" >= x "+w3sq+" <= & y "+string(c)+" >= y "+string(interlaced?h*0.4435:h*0.887)+" <= & & 255 0 ?").trim(0,-1).FreezeFrame(0, FrameCount(pref)-1, 0),luma=true) : nop() | |
| 488 | ||
| 489 | ||
| 490 | # Parameters List | |
| 491 | ||
| 492 | blue = sShow ? (show=="Speed" ? true : false) : false | |
| 493 | red = sShow ? (show=="Memory" ? true : false) : false | |
| 494 | yellow= sShow ? (show=="Quality" ? true : false) : false | |
| 495 | ||
| 496 | Color = sShow ? (blue ? $00aef0 : \ | |
| 497 | red ? $ff0000 : \ | |
| 498 | yellow ? $ffff00 : \ | |
| 499 | Assert(false, "Revise typo for possible color guide modes: 'Speed','Memory','Quality'")) : nop() | |
| 500 | ||
| 501 | ||
| 502 | ||
| 503 | varn = "\n\n\n\n\n" | |
| 504 | sp = !GlobalR && str==1.0 ? " " : "" | |
| 505 | ||
| 506 | Subtitle("SMDegrain Mod v3.1.2",text_color=red||blue||yellow?Color:$7f7f7f,halo_color=$000000,font="VERDANA",size=s*2,x=w1,y=lsb_in?h/40:(interlaced?h/50:h/20))
| |
| 507 | ||
| 508 | Subtitle("BASIC" ,lsp=lsp,text_color=$ffffff,font="COURIER NEW",size=s,x=w1,y=ys)
| |
| 509 | Subtitle( "\n\ntr = " + string(tr) + \ | |
| 510 | varn+varn+ "chroma = " + string(chroma) ,lsp=lsp,text_color=red||blue ?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys) | |
| 511 | Subtitle( "\n\n\nthSAD(C) = " + string( GlobalO?"bypass":string(thSAD) + "(" + string(plane0?thSADC:"bypass") + ")")+ \
| |
| 512 | varn+ "CClip = " + string( GlobalO?"bypass":(defined(CClip)?"defined":"undefined")) + \ | |
| 513 | "\n\nInterlaced = " + string(interlaced) ,lsp=lsp,text_color= $ffffff,font="COURIER NEW",size=s,x=w1,y=ys) | |
| 514 | Subtitle(varn+ "RefineMotion = " + string( GlobalO?"bypass":RefineMotion) ,lsp=lsp,text_color=yellow ?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys) | |
| 515 | Subtitle(varn+ "\n\nContrasharp = " + string( GlobalO?"bypass":contrasharp) ,lsp=lsp,text_color=yellow&&!GlobalO ?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys) | |
| 516 | Subtitle(varn+varn+ "\nplane = " + string( GlobalO?"bypass":(plane==0?"0 (Luma)":plane==1?"1 (U plane)":plane==2?"2 (V plane)":plane==3?"3 (Chroma)":"4(Luma+Chroma)")),lsp=lsp,text_color=(red||blue)&&!GlobalO?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys) | |
| 517 | Subtitle("<-- "+string(IsClip(prefilter)||prefilter!=-1?"Prefiltered clip converted\n to PC levels":"Clip converted to PC levels\n ")+" for the motion search",lsp=lsp,text_color=$ffffff,font="COURIER NEW",size=s,x=w1-10,y=(interlaced?h/2:h)-int(ys/1.5))
| |
| 518 | ||
| 519 | Subtitle("ADVANCED",lsp=lsp,text_color=$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
| |
| 520 | Subtitle( "\n\npel = " + string(pel) ,lsp=lsp,text_color=red ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
| 521 | Subtitle( "\n\n\nsubpixel = " + string( pel==1 ?"bypass":subpixel) ,lsp=lsp,text_color=(yellow||blue)&&pel!=1 ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
| 522 | Subtitle(varn+varn+ "\n\n\ntruemotion = " + string( GlobalR?"bypass":truemotion) ,lsp=lsp,text_color=(yellow||blue)&&!GlobalR?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
| 523 | Subtitle(varn+ "mfilter = " + string( GlobalR?"bypass":MFilterB?"Clip"+sp+" Variable":"OFF") ,lsp=lsp,text_color= $7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
| 524 | Subtitle(varn+ "\n\nStr = " + (GlobalR?string("bypass"):string(Str,"%1.2f"))+sp+" Brightness" + \
| |
| 525 | varn+ "search = " + string( GlobalR?"bypass":search) ,lsp=lsp,text_color=yellow&&!GlobalR ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
| 526 | Subtitle(varn+varn+ "blksize = " + string( GlobalR?"bypass":blksize) + \ | |
| 527 | "\noverlap = " + string( GlobalR?"bypass":overlap) ,lsp=lsp,text_color=(red||blue)&&!GlobalR ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
| 528 | Subtitle(varn+ "\nprefilter = " + (GlobalR?string("bypass"):(preclip?"Clip"+sp+" Variable":(prefilter==0?"0"+sp+" MinBlur(0)":prefilter==1?"1"+sp+" MinBlur(1)":prefilter==2?"2"+sp+" MinBlur(2)":prefilter==3?"3"+sp+" Dfttest":prefilter==4?"4"+sp+" KNLmeans":"OFF"+sp+" (-1)"))) + \
| |
| 529 | "\n\nAmp = " + (GlobalR||str==1.0?string("bypass"):string(Amp,"%1.2f"))+" Amplitude" + \
| |
| 530 | varn+ "\nlimit(C) = " + (GlobalO?string("bypass"):string(limit) + "(" + string(limitc) + ")") ,lsp=lsp,text_color= $7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys)
| |
| 531 | ||
| 532 | Subtitle("OTHERS" ,lsp=lsp,text_color=$494949,font="COURIER NEW",size=s,x=w3,y=ys)
| |
| 533 | Subtitle( "\n\n\nthSCD1(2) = " + (GlobalO?string("bypass"):string(thSCD1) + "(" + string(thSCD2) + ")") + \
| |
| 534 | varn+"\n\nGlobals = " + string(Globals==0 ? "0 (OFF)" : Globals==1 ? "1 (Import)" : Globals==2 ? "2 (Export)" : "3 (E.Only)"),lsp=lsp,text_color= $494949,font="COURIER NEW",size=s,x=w3,y=ys) | |
| 535 | Subtitle( varn+"\n\nslices = " + string(slices) ,lsp=lsp,text_color=blue ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys) | |
| 536 | Subtitle( "\n\nhpad(v) = " + string(hpad) + "(" + string(vpad) + ")" ,lsp=lsp,text_color=red||blue ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys)
| |
| 537 | Subtitle(varn+ "lsb = " + string(lsb) ,lsp=lsp,text_color=yellow ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys) | |
| 538 | Subtitle(varn+ "\nlsb_in/out= " + string(lsb_in) +"/"+ string(lsb_out) ,lsp=lsp,text_color=red&&lsb_in ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys) | |
| 539 | Subtitle(varn+ "\n\n\nmode = " + (GlobalO||(lsb_out||!lsb)?string("bypass"):interlaced?"6 (locked)":string(mode)) ,lsp=lsp,text_color=yellow&&!GlobalO&&lsb ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys)
| |
| 540 | ||
| 541 | Subtitle(" Speed" ,lsp=interlaced?15:30,text_color=planar?$00aef0:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(a-1))
| |
| 542 | Subtitle(" Memory" ,lsp=interlaced?17:34,text_color=planar?$ff0000:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(b-1))
| |
| 543 | Subtitle(" Quality" ,lsp=interlaced?19:38,text_color=planar?$ffff00:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(c-1))
| |
| 544 | ||
| 545 | lsb_out ? StackVertical (last, BlankClip (last, pixel_type=type, color_yuv=0,length=1)) : last""")} | |
| 546 | ||
| 547 | ||
| 548 | ||
| 549 | ||
| 550 | ||
| 551 | ######################################################## | |
| 552 | # # | |
| 553 | # HELPER FUNCTIONS: For Contrasharp and YUY2 handling # | |
| 554 | # # | |
| 555 | ######################################################## | |
| 556 | ||
| 557 | ######################################## | |
| 558 | ## Didée's functions: | |
| 559 | ||
| 560 | # contra-sharpening: sharpen the denoised clip, but don't add more to any pixel than what was removed previously. | |
| 561 | # script function from Didée, at the VERY GRAINY thread | |
| 562 | ||
| 563 | # In final version 2.0d ContraHD() was merged, to allow proper HD sharpening. | |
| 564 | # In this case global variables of (before denoising) source MSuper and forward and backward | |
| 565 | # compensated motion vectors are necessary as: Super, cb1 and cf1, if used as a stand alone function. | |
| 566 | # Don't know who made (mod) it, so I can't give proper credits, sorry. | |
| 567 | ||
| 568 | FUNCTION ContraSharpeningHD(clip denoised, clip original, bool "HD", bool "planar", int "overshoot"){
| |
| 569 | HD = default(HD ,false) | |
| 570 | planar = default(planar,false) | |
| 571 | overshoot = default(overshoot,0) | |
| 572 | avs26 = VersionNumber() < 2.60 ? false : true | |
| 573 | yuy26 = avs26 && Isyuy2(denoised) && planar | |
| 574 | ||
| 575 | HD ? eval("""
| |
| 576 | cb1=original.MCompensate(Super, cb1, planar=planar) | |
| 577 | cf1=original.MCompensate(Super, cf1, planar=planar) | |
| 578 | pmax = yuy26 ? original.Planar2Interleaved().ConvertToYV16().mt_logic(cb1.Planar2Interleaved().ConvertToYV16(), "max").mt_logic(cf1.Planar2Interleaved().ConvertToYV16(), "max") : original.mt_logic(cb1, "max").mt_logic(cf1, "max") | |
| 579 | pmin = yuy26 ? original.Planar2Interleaved().ConvertToYV16().mt_logic(cb1.Planar2Interleaved().ConvertToYV16(), "min").mt_logic(cf1.Planar2Interleaved().ConvertToYV16(), "min") : original.mt_logic(cb1, "min").mt_logic(cf1, "min")""") : nop() | |
| 580 | ||
| 581 | s = denoised.MinBlur(HD?2:1,1,planar=planar) # Damp down remaining spots of the denoised clip. | |
| 582 | s = yuy26 ? s.Planar2Interleaved().ConvertToYV16() : s | |
| 583 | original = yuy26 ? original.Planar2Interleaved().ConvertToYV16() : original | |
| 584 | denoised = yuy26 ? denoised.Planar2Interleaved().ConvertToYV16() : denoised | |
| 585 | allD = mt_makediff(original,denoised) # The difference achieved by the denoising. | |
| 586 | ssD = mt_makediff(s,HD?s.removegrain(20,-1,planar=planar).\ | |
| 587 | removegrain(20,-1,planar=planar):\ | |
| 588 | s.removegrain(11,-1,planar=planar)) # The difference of a simple kernel blur. | |
| 589 | allD = yuy26 ? allD.ConvertToYUY2().Interleaved2planar(true) : allD | |
| 590 | ssD = yuy26 ? ssD.ConvertToYUY2().Interleaved2planar(true) : ssD | |
| 591 | ssDD = ssD.repair(HD?ssD.repair(allD,1,planar=planar):allD,HD?12:1,planar=planar) # Limit the difference to the max of what the denoising removed locally. | |
| 592 | ssDD = yuy26 ? ssDD.Planar2Interleaved().ConvertToYV16() : ssDD | |
| 593 | ssD = yuy26 ? ssD.Planar2Interleaved().ConvertToYV16() : ssD | |
| 594 | ssDD = avs26 ? SSDD.mt_lutxy(ssD,"x range_half - abs y range_half - abs < x y ?",use_expr=2) | |
| 595 | \ : SSDD.mt_lutxy(ssD,"x 128 - abs y 128 - abs < x y ?") # abs(diff) after limiting may not be bigger than before. | |
| 596 | ||
| 597 | denoised.mt_adddiff(ssDD,U=2,V=2) # Apply the limited difference. (Sharpening is just inverse blurring) | |
| 598 | HD ? mt_clamp(last,pmax,pmin,overshoot,overshoot,chroma="copy first") : last | |
| 599 | yuy26 ? last.ConvertToYUY2().Interleaved2planar() : last | |
| 600 | } | |
| 601 | ||
| 602 | # MinBlur by Didée | |
| 603 | # Nifty Gauss/Median combination (Modified for Planar input) | |
| 604 | ||
| 605 | function MinBlur(clip clp, int "r", int "uv", bool "planar", string "mode", int "abtype", bool "blurrep"){
| |
| 606 | ||
| 607 | r = default(r,1) | |
| 608 | uv = default(uv,3) | |
| 609 | planar = default(planar,false) | |
| 610 | defmod = defined(mode) | |
| 611 | mode = default(mode,"Median_Both") | |
| 612 | avs26 = VersionNumber() < 2.60 ? false : true | |
| 613 | yuy26 = avs26 && Isyuy2(clp) && planar | |
| 614 | ||
| 615 | uv2 = (uv==2) ? 1 : uv | |
| 616 | rg4 = (uv==3) ? 4 : -1 | |
| 617 | rg11 = (uv==3) ? 11 : -1 | |
| 618 | rg20 = (uv==3) ? 20 : -1 | |
| 619 | uvm2 = r==2 ? (uv==3?2:uv==2?0:-1) : nop() | |
| 620 | uvm3 = r==3 ? (uv==3?3:uv==2?0:-1) : nop() | |
| 621 | medf = (uv==3) ? 1 : -200 | |
| 622 | rg4v = !(defmod && r==1) && (r<=1) | |
| 623 | ||
| 624 | blurrep= default(blurrep,false) | |
| 625 | ||
| 626 | blurstr= mode == "Median_Both" ? "medianblur(r,r*medf,r*medf)" : mode == "average_Both" ? "aBlur(r, abtype, chroma=uv)" : mode == "average_horizontal" ? "aBlur(r, abtype, blurv="+String(r==1 ? 0 : 1)+", chroma=uv)" : mode == "average_vertical" ? "aBlur("+String(r==1 ? 0 : 1)+", abtype, blurv=r, chroma=uv)" : mode
| |
| 627 | ||
| 628 | RG11D = (r==0) ? yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.sbr(planar=planar).Planar2Interleaved(uv2==1).ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.sbr(planar=planar),U=uv2,V=uv2) | |
| 629 | \ : (r==1) ? yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).Planar2Interleaved(uv2==1).ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar),U=uv2,V=uv2) | |
| 630 | \ : (r==2) ? yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).Planar2Interleaved(uv2==1).ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar),U=uv2,V=uv2) | |
| 631 | \ : yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).removegrain(20,rg20,planar=planar).Planar2Interleaved(uv2==1).ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).removegrain(20,rg20,planar=planar),U=uv2,V=uv2) | |
| 632 | RG4D = (rg4v) ? yuy26 ? mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.removegrain(4,rg4,planar=planar).Planar2Interleaved(uv2==1).ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1) : mt_makediff(clp,clp.removegrain(4,rg4,planar=planar),U=uv2,V=uv2) | |
| 633 | \ : (r==2) ? avs26 ? yuy26 ? eval("mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.Planar2Interleaved(uv2==1).ConvertToYV16()."+blurstr+",U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1)") : eval("mt_makediff(clp,clp."+blurstr+",U=uv2,V=uv2)") : mt_makediff(clp,clp.Quantile(radius_y=2, radius_u=uvm2, radius_v=uvm2, planar=planar), U=uv2,V=uv2)
| |
| 634 | \ : avs26 ? yuy26 ? eval("mt_makediff(clp.Planar2Interleaved(uv2==1).ConvertToYV16(),clp.Planar2Interleaved(uv2==1).ConvertToYV16()."+blurstr+",U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv2==1)") : eval("mt_makediff(clp,clp."+blurstr+",U=uv2,V=uv2)") : mt_makediff(clp,clp.Quantile(radius_y=3, radius_u=uvm3, radius_v=uvm3, planar=planar), U=uv2,V=uv2)
| |
| 635 | #RG4D = blurrep ? RG4D.Repair(clp.removegrain(3,uv==3 ? 0 : -1,planar=planar),9,uv==3 ? 0 : -1,planar=planar) : RG4D | |
| 636 | DD = yuy26 ? mt_lutxy(RG11D.Planar2Interleaved(uv2==1).ConvertToYV16(),RG4D.Planar2Interleaved(uv2==1).ConvertToYV16(),"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",use_expr=2,U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar(uv==1) | |
| 637 | \ : avs26 ? mt_lutxy(RG11D,RG4D,"x range_half - y range_half - * 0 < range_half x range_half - abs y range_half - abs < x y ? ?",use_expr=2,U=uv2,V=uv2) | |
| 638 | \ : mt_lutxy(RG11D,RG4D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2) | |
| 639 | yuy26 ? clp.Planar2Interleaved(uv==1).ConvertToYV16().mt_makediff(DD.Planar2Interleaved(uv==1).ConvertToYV16(),U=uv,V=uv).ConvertToYUY2().Interleaved2planar(uv==1) : clp.mt_makediff(DD,U=uv,V=uv) | |
| 640 | blurrep ? Repair(clp.removegrain(17,uv==3 ? 0 : -1,planar=planar),9,uv==3 ? 0 : -1,planar=planar) : last | |
| 641 | } | |
| 642 | ||
| 643 | ||
| 644 | # helper function: make a highpass on a blur's difference (well, kind of that) | |
| 645 | # Highpass of spatial r=1 Gaussian (like blur(1.0)) (Modified for Planar input) | |
| 646 | ||
| 647 | function sbr(clip c, bool "planar") {
| |
| 648 | ||
| 649 | planar = default(planar,false) | |
| 650 | avs26 = VersionNumber() < 2.60 ? false : true | |
| 651 | yuy26 = avs26 && Isyuy2(c) && planar | |
| 652 | ||
| 653 | rg11 = c.removegrain(11,-1,planar=planar) | |
| 654 | rg11D = yuy26 ? mt_makediff(c.Planar2Interleaved(true).ConvertToYV16(),rg11.Planar2Interleaved(true).ConvertToYV16()).ConvertToYUY2().Interleaved2planar(true) : mt_makediff(c,rg11) | |
| 655 | rg11DD = yuy26 ? mt_makediff(rg11D.Planar2Interleaved(true).ConvertToYV16(),rg11D.removegrain(11,-1,planar=planar).Planar2Interleaved(true).ConvertToYV16()).mt_lutxy(rg11D.Planar2Interleaved(true).ConvertToYV16(),"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?").ConvertToYUY2().Interleaved2planar(true) | |
| 656 | \ : avs26 ? mt_makediff(rg11D,rg11D.removegrain(11,-1,planar=planar)).mt_lutxy(rg11D,"x range_half - y range_half - * 0 < range_half x range_half - abs y range_half - abs < x y ? ?",use_expr=2) | |
| 657 | \ : mt_makediff(rg11D,rg11D.removegrain(11,-1,planar=planar)).mt_lutxy(rg11D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?") | |
| 658 | yuy26 ? c.Planar2Interleaved().ConvertToYV16().mt_makediff(rg11DD.Planar2Interleaved().ConvertToYV16(),U=2,V=2).ConvertToYUY2().Interleaved2planar() : c.mt_makediff(rg11DD,U=2,V=2) } | |
| 659 | ||
| 660 | ######################################## | |
| 661 | ## cretindesalpes' functions | |
| 662 | ||
| 663 | # Converts 16 bit interleaved YUY2 to 16bit planar YUY2 suitable for Ditherpost. (Use right before Ditherpost; this format is not suitable for filtering) | |
| 664 | ||
| 665 | function Dither_YUY2toPlanar16(c){c
| |
| 666 | yuy26 = !(VersionNumber() < 2.60) && isyuy2(c) | |
| 667 | my = !yuy26 ? Dither_get_msb().ConvertToYV12() : nop() | |
| 668 | ly = !yuy26 ? Dither_get_lsb().ConvertToYV12() : nop() | |
| 669 | u = !yuy26 ? UToY ().ConvertToYV12 () : nop() | |
| 670 | v = !yuy26 ? VToY ().ConvertToYV12 () : nop() | |
| 671 | yuy26 ? ConvertToYV16() : YToUV (u, v, StackVertical (StackVertical (my, my), StackVertical (ly, ly)))} | |
| 672 | ||
| 673 | ||
| 674 | # Converts 8 bit interleaved YUY2 to 8 bit planar YUY2 ready for either 8 or 16 bit processing also suitable for Ditherpost | |
| 675 | ||
| 676 | function Dither_YUY2toPlanar(c){c
| |
| 677 | yuy26 = !(VersionNumber() < 2.60) && isyuy2(c) | |
| 678 | y = !yuy26 ? ConvertToYV12 () : nop() | |
| 679 | u = !yuy26 ? UToY ().ConvertToYV12 () : nop() | |
| 680 | v = !yuy26 ? VToY ().ConvertToYV12 () : nop() | |
| 681 | yuy26 ? ConvertToYV16() : YToUV (u, v, StackVertical (y, y))} | |
| 682 | ||
| 683 | ||
| 684 | # Converts back the above special planar formats to normal interleaved 16 bit YUY2 | |
| 685 | ||
| 686 | function Dither_YUY2toInterleaved16(c){c
| |
| 687 | yuy26 = !(VersionNumber() < 2.60) | |
| 688 | y = !yuy26 ? StackVertical (Crop (0, 0, 0, (Height () /(4))), Crop (0, (Height () /(2))+(Height () /(4)), 0, 0)).ConvertToYUY2 () : nop() | |
| 689 | u = !yuy26 ? UToY ().ConvertToYUY2 () : nop() | |
| 690 | v = !yuy26 ? VToY ().ConvertToYUY2 () : nop() | |
| 691 | yuy26 ? ConvertToYUY2() : YToUV (u, v, y)} | |
| 692 | ||
| 693 | # Converts back the above special planar formats to normal interleaved YUY2 | |
| 694 | ||
| 695 | function Dither_YUY2toInterleaved(c){c
| |
| 696 | yuy26 = !(VersionNumber() < 2.60) | |
| 697 | y = !yuy26 ? Crop (0, 0, 0, Height () /(2)).ConvertToYUY2 () : nop() | |
| 698 | u = !yuy26 ? UToY ().ConvertToYUY2 () : nop() | |
| 699 | v = !yuy26 ? VToY ().ConvertToYUY2 () : nop() | |
| 700 | yuy26 ? ConvertToYUY2() : YToUV (u, v, y)} | |
| 701 | ||
| 702 | ||
| 703 | ||
| 704 | # Converts luma (and chroma) to PC levels, and optionally allows tweaking for pumping up the darks. (for the clip to be fed to motion search only) | |
| 705 | # By courtesy of cretindesalpes. | |
| 706 | ||
| 707 | function Dither_Luma_Rebuild (clip src, float "s0", float "c",int "uv", bool "lsb", bool "lsb_in", bool "lsb_out", int "mode", float "ampn", bool "slice"){
| |
| 708 | lsb_in = Default( lsb_in ,false) | |
| 709 | lsb_out = Default( lsb_out ,false) | |
| 710 | lsb = Default( lsb ,lsb_in || lsb_out) | |
| 711 | lsb = !lsb && (lsb_in || lsb_out) ? true : lsb | |
| 712 | mode = Default( mode ,6) | |
| 713 | uv = Default(uv, 3) | |
| 714 | s0 = Default(s0, 2.0) | |
| 715 | c = Default(c, 1.0/16) | |
| 716 | ampn = Default(ampn, 0.0) | |
| 717 | slice = Default(slice, true) | |
| 718 | yuy2 = isyuy2(src) | |
| 719 | avs26 = VersionNumber() < 2.60 ? false : true | |
| 720 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 721 | lsb_native = ssispmt ? !(src.BitsPerComponent() > 8 && (lsb)) : true | |
| 722 | ssispmt ? Assert(lsb_native, "lsb hack is not Compatible with native high bit depth" ) : nop() | |
| 723 | ssispmt ? Assert(!(src.isYUVA() && lsb), "lsb hack is not Compatible with YUVA" ) : nop() | |
| 724 | Assert(!(src.isrgb()), "Dither_Luma_Rebuild: RGB Color formats is not supported" ) | |
| 725 | src = yuy2 ? lsb_in ? src.Planar2Interleaved(uv==1).Dither_YUY2toPlanar16() : avs26 ? src.Planar2Interleaved(uv==1).ConvertToYV16() : lsb ? src.Planar2Interleaved(uv==1).Dither_YUY2toPlanar() : src : src | |
| 726 | ||
| 727 | k = (s0 - 1) * c | |
| 728 | t = lsb_in ? "x 4096 - 56064 / 0 1 clip" | |
| 729 | \ : avs26 ? "x 16 scalef - 219 scalef / 0 1 clip" | |
| 730 | \ : "x 16 - 219 / 0 1 clip" | |
| 731 | e = String(k)+" "+String(1+c)+" "+String((1+c)*c)+" "+t+" "+String(c) | |
| 732 | \ +" + / - * "+t+" 1 "+String(k)+" - * + "+String(lsb?65536:avs26?"range_size":255)+" *" | |
| 733 | src | |
| 734 | lsb ? (lsb_in ? Dither_lut16 (yexpr=e,expr="x 32768 - 32768 * 28672 / 32768 +",y=3, u=uv, v=uv) : \ | |
| 735 | Dither_lut8 (yexpr=e,expr="x 128 - 32768 * 112 / 32768 +" ,y=3, u=uv, v=uv)) : \ | |
| 736 | avs26 ? mt_lut(yexpr=e,expr="x range_half - range_half * 112 scaleb / range_half +",use_expr=2,y=3, u=uv, v=uv) : \ | |
| 737 | mt_lut(yexpr=e,expr="x 128 - 128 * 112 / 128 +" ,y=3, u=uv, v=uv) | |
| 738 | ||
| 739 | lsb_out && !yuy2 ? last : (lsb && !lsb_out ? yuy2 ? Ditherpost(mode=mode,ampn=ampn,slice=slice,staticnoise=ampn!=0.0?true:false,u=uv,v=uv).Dither_YUY2toInterleaved().Interleaved2planar(uv==1) : Ditherpost(mode=mode,ampn=ampn,slice=slice,staticnoise=ampn!=0.0?true:false,u=uv,v=uv) : last) | |
| 740 | return yuy2 && lsb_out ? last.Dither_YUY2toInterleaved16().Interleaved2planar(uv==1) : yuy2 && avs26 && !lsb ? converttoyuy2().Interleaved2planar(uv==1) : last | |
| 741 | } | |
| 742 | ||
| 743 | ||
| 744 | ||
| 745 | # SMDegrain prefilters | |
| 746 | ||
| 747 | function SMDegrain_prefilters (clip input, int "prefilter", bool "chroma", int "Chr", int "Chr2", int "bug_wa", bool "lsb", bool "lsb_in", bool "Interlaced", val "if5", int "pel", String "device_type", int "device_id", int "d", int "a", bool "slices", bool "planar", clip "inputP", clip "input8", clip "input8y", clip "inputY", val "input8h", float "h", String "knlm_params", String "cplace") | |
| 748 | {
| |
| 749 | Interlaced = Default( Interlaced ,false) | |
| 750 | slices = default(slices, true) | |
| 751 | if5 = Default( if5 ,interlaced ? (GetParity(input) ? true : false) : nop()) | |
| 752 | lsb_in = Default( lsb_in ,false) | |
| 753 | lsb = Default( lsb ,lsb_in) | |
| 754 | pel = default( pel, (input.width () > 1099 || input.height() > (lsb_in ? 1199 : 599)) ? 1 : 2 ) | |
| 755 | ssispmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 756 | chroma = default( chroma, true) | |
| 757 | planar = Default( planar , input.isyuy2()) | |
| 758 | prefilter = Default( prefilter, 3) | |
| 759 | cplace = Default( cplace, "mpeg2") | |
| 760 | ||
| 761 | Chr = Default(Chr, chroma ? 3 : 1) | |
| 762 | Chr2 = Default(Chr2, chroma ? 3 : (prefilter==3 ? 2 : 1)) | |
| 763 | avs26 = !(VersionNumber() < 2.60) | |
| 764 | ||
| 765 | Assert(!(!defined(inputP) && prefilter==-1), "prefilter must be between 0~4: "+string(prefilter)) | |
| 766 | lsb_native = ssispmt ? !(Input.BitsPerComponent() > 8 && (lsb)) : true | |
| 767 | ssispmt ? Assert(lsb_native, "lsb hack is not Compatible with native high bit depth" ) : nop() | |
| 768 | ||
| 769 | # Input preparation for: LSB_IN, Interlacing, Planar and MSuper optimization when pel=2 | |
| 770 | ||
| 771 | inputY = defined(inputY ) ? inputY : planar ? (lsb_in ? Dither_YUY2toPlanar16(input) : Interleaved2planar(input)) : input | |
| 772 | ||
| 773 | inputP = defined(inputP ) ? inputP : !interlaced ? (pel == 2 ? inputY.AssumeFrameBased() : inputY) : \ | |
| 774 | (if5 ? inputY.AssumeTFF().SeparateFields() : inputY.AssumeBFF().SeparateFields()) | |
| 775 | ||
| 776 | input8h = defined(input8h) && isclip(input8h) ? input8h : lsb_in ? inputP. Ditherpost(mode=6, slice=slices) : nop() | |
| 777 | input8y = defined(input8y) ? input8y : planar ? (lsb_in ? input8h.Dither_YUY2toInterleaved() : inputP) : inputP | |
| 778 | input8 = defined(input8 ) ? input8 : lsb_in ? (planar ? input8y.Interleaved2planar() : input8h) : input8y | |
| 779 | ||
| 780 | inputd = (prefilter == 3 || prefilter == 4) ? Interlaced ? if5 ? input.AssumeTFF().SeparateFields() : \ | |
| 781 | input.AssumeBFF().SeparateFields() : \ | |
| 782 | input : nop() | |
| 783 | ||
| 784 | bug_wa = defined(bug_wa) ? bug_wa : interlaced && planar && chroma && !avs26 ? 2 : Chr # bug: crash prevention workaround | |
| 785 | ||
| 786 | # The mt_merge() line for prefilter=3 should be swapped with a high bitdepth variant (Dither_merge16_8() ?) due to a 1 point limited range | |
| 787 | # in both range ends, but then it won't work with planar sources. This isn't as critical since we are only trying to find motion vectors. | |
| 788 | (prefilter==-1) ? inputP : \ | |
| 789 | (prefilter==0) ? input8.MinBlur(0,Chr,planar) : \ | |
| 790 | (prefilter==1) ? input8.MinBlur(1,Chr,planar) : \ | |
| 791 | (prefilter==2) ? input8.MinBlur(2,Chr,planar) : \ | |
| 792 | (prefilter==3) ? (!planar && lsb ? Dither_merge16_8( inputd.Dfttest(sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,lsb=true,lsb_in=lsb_in,quiet=true), lsb_in?inputP:inputP.Dither_convert_8_to_16(), \ | |
| 793 | lsb_in?inputP.Dither_lut16("x 4096 < 65535 x 19200 > 0 65535 x 4096 - 4.338916843220339 * - ? ?",u=1,v=1).Ditherpost(mode=6, slice=slices, u=Chr, v=Chr) \
| |
| 794 | :inputd.mt_lut( "x 16 < 255 x 75 > 0 255 x 16 - 255 75 16 - / * - ? ?",u=1,v=1), luma=chroma, u=Chr2, v=Chr2) : \ | |
| 795 | avs26 && planar && lsb ? Dither_merge16_8( inputd.Dfttest(sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,lsb=true,lsb_in=lsb_in,quiet=true).ConvertToYV16(), lsb_in?inputP:inputd.ConvertToYV16().Dither_convert_8_to_16(), \ | |
| 796 | lsb_in?inputP.Dither_lut16("x 4096 < 65535 x 19200 > 0 65535 x 4096 - 4.338916843220339 * - ? ?",u=1,v=1).Ditherpost(mode=6, slice=slices, u=Chr, v=Chr) \
| |
| 797 | :inputd.ConvertToYV16().mt_lut( "x 16 < 255 x 75 > 0 255 x 16 - 255 75 16 - / * - ? ?",u=1,v=1), luma=chroma, u=Chr2, v=Chr2).ConvertToYUY2().Interleaved2planar(!chroma) : \ | |
| 798 | avs26 && planar ? mt_merge ( Dfttest(!lsb_in?inputd:input8y,sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1).ConvertToYV16(),!lsb_in?input8y.Planar2Interleaved(!chroma).ConvertToYV16():input8y.ConvertToYV16(), \ | |
| 799 | input8.Planar2Interleaved(!chroma).ConvertToYV16().mt_lut( "x 16 < 255 x 75 > 0 255 x 16 - 4.322033898305085 * - ? ?",u=1,v=1), luma=planar?false:chroma, u=bug_wa,v=bug_wa).ConvertToYUY2().Interleaved2planar(!chroma) : \ | |
| 800 | avs26 ? mt_merge (Dfttest(inputd,sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1),input8, \ | |
| 801 | input8.mt_lut("x 16 scalef < range_max x 75 scalef > 0 range_max x 16 scalef - range_max 75 scalef 16 scalef - / * - ? ?",use_expr=2,u=1,v=1), luma=chroma, cplace=cplace, u=chr,v=chr) : \
| |
| 802 | mt_merge (planar ? Dfttest(!lsb_in?inputd:input8y,sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1).Interleaved2planar(!chroma) : \ | |
| 803 | Dfttest(!lsb_in?inputd:input8 ,sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1),input8, \ | |
| 804 | input8.mt_lut( "x 16 < 255 x 75 > 0 255 x 16 - 4.322033898305085 * - ? ?",u=1,v=1), luma=chroma, u=bug_wa,v=bug_wa)) : \ | |
| 805 | (prefilter==4) ? planar ? inputd.SMDegrain_KNLMeansCL(lsb=lsb, lsb_in=lsb_in, device_type=device_type, device_id=device_id, chroma=chroma, h=h, d=d, a=a, knlm_params=knlm_params).Interleaved2planar(!chroma) : \ | |
| 806 | inputd.SMDegrain_KNLMeansCL(lsb=lsb, lsb_in=lsb_in, device_type=device_type, device_id=device_id, chroma=chroma, h=h, d=d, a=a, knlm_params=knlm_params) : \ | |
| 807 | Assert(false, "prefilter must be between -1~4: "+string(prefilter)) | |
| 808 | } | |
| 809 | ||
| 810 | ||
| 811 | ||
| 812 | # SMDegrain_KNLMeansCL | |
| 813 | ||
| 814 | function SMDegrain_KNLMeansCL (clip input, String "device_type", int "device_id", bool "chroma", bool "lsb", bool "lsb_in", float "h", int "d", int "a", String "knlm_params") | |
| 815 | {
| |
| 816 | d = Default( d ,0) | |
| 817 | a = Default( a ,1) | |
| 818 | h = Default( h ,7.0) | |
| 819 | deviceid = Default( device_id ,0) | |
| 820 | knlm_params = default(knlm_params, "") | |
| 821 | chroma = Default( chroma ,true) | |
| 822 | lsb_in = Default( lsb_in ,false) | |
| 823 | lsb = Default( lsb ,lsb_in) | |
| 824 | ||
| 825 | avspmt = Findstr(VersionString(), "AviSynth+") != 0 && Findstr(VersionString(), "r1576") == 0 | |
| 826 | fullchr = avspmt ? input.is444() : input.isyv24() | |
| 827 | chr420 = avspmt ? input.is420() : input.isyv12() | |
| 828 | nochr = avspmt ? input.isy() : input.isy8() | |
| 829 | chrlsb = chroma && !fullchr && !nochr | |
| 830 | NL_in = lsb && !lsb_in ? input.Dither_convert_8_to_16() : input | |
| 831 | cnl = chrlsb ? "Y" : input.isrgb() ? "auto" : chroma ? "YUV" : "Y" | |
| 832 | ||
| 833 | NL_in = !chrlsb && input.isyuy2() ? NL_in.converttoyv16() : NL_in | |
| 834 | ||
| 835 | chrlsb ? eval("""
| |
| 836 | # In a more lucid state I could probably have laid out this block much better... or not... | |
| 837 | ||
| 838 | NL_W = width(NL_in) | |
| 839 | Uclip = avspmt ? ExtractU(NL_in) : UToY8(NL_in) | |
| 840 | Vclip = avspmt ? ExtractV(NL_in) : VToY8(NL_in) | |
| 841 | NL_lsb = (chr420 ? StackVertical( lsb ? StackVertical(Dither_get_msb(uclip),Dither_get_msb(vclip)) : uclip,\ | |
| 842 | lsb ? StackVertical(Dither_get_lsb(uclip),Dither_get_lsb(vclip)) : vclip) : \ | |
| 843 | StackHorizontal(uclip,vclip)) | |
| 844 | ||
| 845 | nlc = StackHorizontal(avspmt ? ConvertToY(NL_in) : ConvertToY8(NL_in),NL_lsb) | |
| 846 | ||
| 847 | nlc = Eval("nlc.KNLMeansCL(D=d, A=a, h=h,stacked=lsb_in || lsb,device_type=device_type,device_id=deviceid,channels=cnl" + knlm_params + ")")
| |
| 848 | ||
| 849 | uvh = lsb_in || lsb ? uclip.height()/2 : uclip.height() | |
| 850 | uvw = uclip.width() | |
| 851 | ||
| 852 | nly = nlc.crop(0,0,chr420 ? -uvw : -(uvw+uvw),0) | |
| 853 | ||
| 854 | nlu = chr420 ? lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W,0,0,-uvh),Dither_get_lsb(nlc).crop(NL_W,0,0,-uvh)) : nlc.crop(NL_W,0,0,-uvh) : \ | |
| 855 | nlc.crop(NL_W ,0,-uvw,0) | |
| 856 | nlv = chr420 ? lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W,uvh, 0,0),Dither_get_lsb(nlc).crop(NL_W,uvh, 0,0)) : nlc.crop(NL_W,uvh, 0,0) : \ | |
| 857 | nlc.crop(NL_W+uvw,0, 0,0) | |
| 858 | YToUV(nlu, nlv, nly) | |
| 859 | """) : Eval("NL_in.KNLMeansCL(D=d, A=a, h=h,stacked=lsb_in || lsb,device_type=device_type,device_id=deviceid,channels=cnl" + knlm_params + ")")
| |
| 860 | ||
| 861 | !lsb && lsb_in ? Ditherpost(mode=6,slice=false) : last | |
| 862 | input.isyuy2() ? converttoyuy2() : last | |
| 863 | } |