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 | - | ### mod in 2016-06-25 to fix subpixel=3 and add Prefilter auto 16 (lsb) support ### |
10 | + | ### mod in 2016-06-30 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 | ### ### | |
16 | ################################################################################################ | |
17 | ### | |
18 | ### General purpose simple degrain function. Pure temporal denoiser. Basically a wrapper(function)/frontend of mvtools2+mdegrain | |
19 | ### with some added common related options. Goal is accessibility and quality but not targeted to any specific kind of source. | |
20 | ### The reason behind is to keep it simple so aside masktools2 you will only need MVTools2. | |
21 | ### | |
22 | ### Check documentation for deep explanation on settings and defaults. | |
23 | ### VideoHelp thread: (http://forum.videohelp.com/threads/369142) | |
24 | ### | |
25 | ################################################################################################ | |
26 | ||
27 | function SMDegrain (clip input , int "tr" , int "thSAD" , int "thSADC" , bool "RefineMotion", val "contrasharp", clip "CClip" , bool "interlaced" , int "plane" , int "Globals", \ | |
28 | int "pel" , int "subpixel", val "prefilter", clip "mfilter", int "blksize" , int "overlap" , int "search" , bool "truemotion" , int "limit" , int "limitc" , int "thSCD1" , int "thSCD2", \ | |
29 | 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"){ | |
30 | ||
31 | ||
32 | ||
33 | # Defaults & Conditionals | |
34 | ||
35 | ||
36 | tr = default( tr, 2 ) | |
37 | thSAD = default( thSAD, 300 ) | |
38 | thSAD2=int(thSAD/2) | |
39 | thSADC = default( thSADC, thSAD2) | |
40 | RefineMotion = default( RefineMotion,false) | |
41 | ||
42 | lsb_in = default( lsb_in, false) | |
43 | lsb_out = default( lsb_out, false) | |
44 | lsb = default( lsb , lsb_in || lsb_out) | |
45 | mode = default( mode, 0 ) | |
46 | mode = mode != 9 ? mode : -1 | |
47 | ampn = mode != 9 ? 0.0 : 1.0 | |
48 | slices = default(slices, true) | |
49 | ||
50 | Globals = default( Globals, 0 ) | |
51 | GlobalR = Globals == 1 ? true : false | |
52 | GlobalO = Globals == 3 ? true : false | |
53 | if1 = Defined(CClip) ? true : false | |
54 | ||
55 | Contrasharp = default( Contrasharp, !GlobalO && if1 ? true : false) | |
56 | Interlaced = default( Interlaced, false) | |
57 | ||
58 | w = input.width () | |
59 | h = input.height() | |
60 | sShow = IsString(show) ? true : false | |
61 | preclip = IsClip(prefilter) ? true : false | |
62 | planar = IsYUY2(input) ? true : false | |
63 | ifC = IsBool(Contrasharp) ? true : false | |
64 | if0 = ifC ? (Contrasharp ? true : false) : (Contrasharp > 0.0 ? true : false) | |
65 | if2 = if0 && lsb && !GlobalO ? true : false | |
66 | if3 = tr > 3 ? true : false | |
67 | if4 = (w > 1099 || h > (lsb_in ? 1199 : 599)) ? true : false | |
68 | if5 = interlaced ? (GetParity(input) ? true : false) : nop() | |
69 | avs26 = VersionNumber() < 2.60 ? false : true | |
70 | yuy25 = !avs26 && planar | |
71 | ||
72 | ||
73 | pel = default( pel, if4 ? 1 : 2 ) | |
74 | subpixel = default( subpixel, 2 ) | |
75 | prefilter = default( prefilter, -1 ) | |
76 | MFilterB = defined(mfilter) ? true : false | |
77 | pelclip = pel>1 && subpixel == 3 ? true : false | |
78 | Str = default( Str, 1.0 ) | |
79 | Amp = default( Amp, 0.0625 ) | |
80 | TV_range = default( TV_range, true) | |
81 | ||
82 | blksize = default( blksize, if4 ? 16 : 8 ) | |
83 | blk2=blksize/2 | |
84 | overlap = default( overlap, blk2 ) | |
85 | ovl2=overlap/2 | |
86 | search = default( search, 4 ) | |
87 | truemotion = default( truemotion, !if4) | |
88 | thSCD1 = default( thSCD1, int(pow((blksize*2.5),2))) | |
89 | thSCD2 = default( thSCD2, 130 ) | |
90 | ||
91 | ||
92 | plane = default( plane, 4 ) | |
93 | chroma = default( chroma, true) | |
94 | Chr = chroma ? 3 : 1 | |
95 | Chr2 = chroma ? 3 : (prefilter==3 ? 2 : 1) | |
96 | plane0 = plane!=0 ? true : false | |
97 | U = plane0 && plane!=2 ? 3 : 2 | |
98 | V = plane0 && plane!=1 ? 3 : 2 | |
99 | Uin = lsb_in ? 3 : u | |
100 | Vin = lsb_in ? 3 : v | |
101 | ||
102 | ||
103 | hpad = blksize | |
104 | vpad = blksize | |
105 | limit = default( limit, 255 ) | |
106 | limitc = default( limitc,limit) | |
107 | ||
108 | Show = default( Show, false) | |
109 | ||
110 | ||
111 | ||
112 | ||
113 | # Error Report | |
114 | ||
115 | Assert(blksize==4 || blksize==8 || blksize==16 || blksize==32,"MAnalyse: Block's size must be 4x4, 8x4, 8x8, 16x2, 16x8, 16x16, 32x16, 32x32") | |
116 | Assert(overlap <= blk2, "Overlap must be at least half blksize or less") | |
117 | Assert(overlap == overlap-overlap%2, "MAnalyse: overlap must be an even figure") | |
118 | Assert(IsBool(Show) || sShow, "'Show' only accepts bool inputs (true,false), or string modes ('Speed','Memory',Quality')") | |
119 | Assert(preclip || IsInt(prefilter), "'prefilter' only accepts integers and clip inputs") | |
120 | Assert(ifC || IsInt(Contrasharp),"'Contrasharp' only accepts integers and bool inputs") | |
121 | !chroma ? Assert(plane==0, "Denoising chroma with luma only vectors is bugged in mvtools and thus unsupported") : nop() | |
122 | MFilterB ? Assert(IsClip(mfilter), "'mfilter' only accepts clip inputs") : nop() | |
123 | interlaced ? Assert(h%4==0, "Interlaced sources require mod 4 height sizes") : nop() | |
124 | lsb_in ? Assert(!interlaced, "Interlaced 16 bit stacked clip is not a recognized format") : nop() | |
125 | planar && if0 ? Assert(ifC, "LSFmod doesn't support YUY2 sources") : nop() | |
126 | RefineMotion ? Assert(blksize > 7, "For RefineMotion you need a blksize of at least 8") : nop() | |
127 | lsb_in ? Assert(lsb, "lsb_in requires: lsb=true") : nop() | |
128 | lsb_out ? Assert(lsb, "lsb_out requires: lsb=true") : nop() | |
129 | ||
130 | ||
131 | ||
132 | # RefineMotion Variables | |
133 | ||
134 | halfblksize = RefineMotion ? blk2 : nop() # MRecalculate works with half block size | |
135 | halfoverlap = RefineMotion ? (overlap == 2 ? overlap : ovl2+ovl2%2) : nop() # Halve the overlap to suit the halved block size | |
136 | halfthSAD = RefineMotion || if3 ? thSAD2 : nop() # MRecalculate uses a more strict thSAD, which defaults to 150 (half of function's default of 300) | |
137 | halfthSADC = if3 ? int(thSADC/2) : nop() # For MDegrainN() | |
138 | ||
139 | ||
140 | ||
141 | ||
142 | ||
143 | ||
144 | # Input preparation for: LSB_IN, Interlacing, Planar and MSuper optimization when pel=2 | |
145 | ||
146 | inputY = planar ? (lsb_in ? Dither_YUY2toPlanar16(input) : Interleaved2planar(input)) : input | |
147 | ||
148 | inputP = !interlaced ? (pel == 2 ? inputY.AssumeFrameBased() : inputY) : \ | |
149 | (if5 ? inputY.AssumeTFF().SeparateFields() : inputY.AssumeBFF().SeparateFields()) | |
150 | ||
151 | input8h = lsb_in ? inputP. Ditherpost(mode=6, slice=slices) : nop() | |
152 | input8y = planar ? (lsb_in ? input8h.Dither_YUY2toInterleaved() : inputP) : inputP | |
153 | input8 = lsb_in ? (planar ? input8y.Interleaved2planar() : \ | |
154 | input8h) : input8y | |
155 | ||
156 | ||
157 | # Prefilter & Motion Filter | |
158 | ||
159 | Mfilter = MFilterB ? Mfilter : input8 | |
160 | ||
161 | bug_wa = interlaced && planar && chroma && !avs26 ? 2 : Chr # bug: crash prevention workaround (http://forum.doom9.org/showthread.php?p=1546684#post1546684) | |
162 | ||
163 | # 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 | |
164 | # 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. | |
165 | pref = !GlobalR ? ( preclip ? prefilter : \ | |
166 | ((prefilter==-1) ? inputP : \ | |
167 | (prefilter==0) ? input8.MinBlur(0,Chr,planar) : \ | |
168 | (prefilter==1) ? input8.MinBlur(1,Chr,planar) : \ | |
169 | (prefilter==2) ? input8.MinBlur(2,Chr,planar) : \ | |
170 | (prefilter==3) ? (!planar && lsb ? Dither_merge16_8(inputP.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(), \ | |
171 | lsb_in?inputP.Dither_lut16("x 4096 < 65535 x 19200 > 0 65535 x 4096 - 65535 19200 4096 - / * - ? ?",u=1,v=1).Ditherpost(mode=6, slice=slices, u=Chr, v=Chr) \ | |
172 | :inputP.mt_lut( "x 16 < 255 x 75 > 0 255 x 16 - 255 75 16 - / * - ? ?",u=1,v=1), luma=chroma, u=Chr2, v=Chr2) : \ | |
173 | avs26 && planar && lsb ? Dither_merge16_8(inputP.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(), \ | |
174 | lsb_in?inputP.Dither_lut16("x 4096 < 65535 x 19200 > 0 65535 x 4096 - 65535 19200 4096 - / * - ? ?",u=1,v=1).Ditherpost(mode=6, slice=slices, u=Chr, v=Chr) \ | |
175 | :inputP.Planar2Interleaved().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() : \ | |
176 | planar && avs26 ? mt_merge( Dfttest(!lsb_in?inputP.Planar2Interleaved(!chroma):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().ConvertToYV16():input8y.ConvertToYV16(), \ | |
177 | input8y.Planar2Interleaved().ConvertToYV16().mt_lut( "x 16 < 255 x 75 > 0 255 x 16 - 255 75 16 - / * - ? ?",u=1,v=1), luma=planar?false:chroma, u=bug_wa,v=bug_wa).ConvertToYUY2().Interleaved2planar() : \ | |
178 | mt_merge( planar ? Dfttest(!lsb_in?inputP.Planar2Interleaved(!chroma):input8y,sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1).Interleaved2planar(!chroma) : \ | |
179 | Dfttest( inputP, sstring="0.0:4.0 0.2:9.0 1.0:15.0",tbsize=1,u=chroma,v=chroma,dither=1),!lsb_in?input8y:input8y.Interleaved2planar(!chroma), \ | |
180 | input8y.mt_lut( "x 16 < 255 x 75 > 0 255 x 16 - 255 75 16 - / * - ? ?",u=1,v=1), luma=planar?false:chroma, u=bug_wa,v=bug_wa)) : \ | |
181 | (prefilter==4) ? eval(""" | |
182 | - | NL_in = !planar ? (lsb_in ? inputP : input8.Dither_convert_8_to_16()) : Interlaced ? (if5 ? input.AssumeTFF().SeparateFields().Dither_convert_8_to_16() : input.AssumeBFF().SeparateFields().Dither_convert_8_to_16()) : (lsb_in ? input : input.Dither_convert_8_to_16()) |
182 | + | |
183 | - | NL_W = width(NL_in) |
183 | + | fullchr = inputP.isyv24() |
184 | - | U8 = chroma || planar ? UToY8(NL_in) : nop() |
184 | + | chr422 = inputP.isyv16() || planar |
185 | - | V8 = chroma || planar ? VToY8(NL_in) : nop() |
185 | + | NL_in = !chr422 ? (lsb_in || !lsb ? inputP : input8.Dither_convert_8_to_16()) : Interlaced ? (if5 ? lsb ? input.AssumeTFF().SeparateFields().Dither_convert_8_to_16() : input.AssumeTFF().SeparateFields() : lsb ? input.AssumeBFF().SeparateFields().Dither_convert_8_to_16() : input.AssumeBFF().SeparateFields()) : (lsb_in || !lsb ? input : input.Dither_convert_8_to_16()) |
186 | - | NL_lsb = chroma ? (!planar ? StackVertical(StackVertical(Dither_get_msb(u8),Dither_get_msb(v8)),\ |
186 | + | NL_W = !fullchr ? width(NL_in) : nop() |
187 | U8 = (chroma || chr422) && !fullchr ? UToY8(NL_in) : nop() | |
188 | - | StackHorizontal(u8.ConvertToYV12(),v8.ConvertToYV12())) : nop() |
188 | + | V8 = (chroma || chr422) && !fullchr ? VToY8(NL_in) : nop() |
189 | NL_lsb = chroma && !fullchr ? (!chr422 ? StackVertical(StackVertical(Dither_get_msb(u8),Dither_get_msb(v8)),\ | |
190 | - | Y8 = chroma ? (!planar ? StackHorizontal(ConvertToY8(NL_in),NL_lsb) : \ |
190 | + | |
191 | - | StackHorizontal(StackVertical(Dither_get_msb(ConvertToY8(NL_in)),Dither_get_lsb(ConvertToY8(NL_in))).ConvertToYV12(),NL_lsb)) : \ |
191 | + | StackHorizontal(u8,v8)) : nop() |
192 | - | (!planar ? NL_in : NL_in.converttoY8()) |
192 | + | |
193 | nlc = chroma && !fullchr ? (!chr422 ? StackHorizontal(ConvertToY8(NL_in),NL_lsb) : \ | |
194 | - | Y8 = Y8.KNLMeansCL(D=1, A=1, h=7.0,lsb_inout=true,device_type="GPU") |
194 | + | StackHorizontal(StackVertical(Dither_get_msb(ConvertToY8(NL_in)),Dither_get_lsb(ConvertToY8(NL_in))),NL_lsb)) : \ |
195 | (!chr422 ? NL_in : NL_in.converttoYV16()) | |
196 | - | my = planar ? Y8.Dither_get_msb().crop(0,0,chroma?-NL_W:0,0) : nop() |
196 | + | |
197 | - | ly = planar ? Y8.Dither_get_lsb().crop(0,0,chroma?-NL_W:0,0) : nop() |
197 | + | nlc = nlc.KNLMeansCL(D=1, A=1, h=7.0,lsb_inout=lsb_in || lsb,device_type="GPU",cmode=chroma && fullchr) |
198 | ||
199 | - | chroma ? eval (" |
199 | + | my = chr422 ? lsb_in || lsb ? nlc.Dither_get_msb().crop(0,0,chroma && !fullchr ? -NL_W:0,0) : nlc.crop(0,0,chroma && !fullchr ? -NL_W:0,0) : nop() |
200 | - | u_h = u8.height()/2 |
200 | + | ly = chr422 && (lsb_in || lsb) ? nlc.Dither_get_lsb().crop(0,0,chroma && !fullchr ? -NL_W:0,0) : nop() |
201 | - | v_h = v8.height()/2 |
201 | + | |
202 | chroma && !fullchr ? eval (" | |
203 | - | u16 = !planar ? StackVertical(Dither_get_msb(Y8).crop(NL_W,0,0,-v_h),Dither_get_lsb(Y8).crop(NL_W,0,0,-v_h)) : \ |
203 | + | u_h = lsb_in || lsb ? u8.height()/2 : u8.height() |
204 | - | StackVertical(Dither_get_msb(Y8).crop(NL_W,0,-NL_W/2 ,0),Dither_get_lsb(Y8).crop(NL_W,0,-NL_W/2 ,0)) |
204 | + | v_h = lsb_in || lsb ? v8.height()/2 : v8.height() |
205 | - | v16 = !planar ? StackVertical(Dither_get_msb(Y8).crop(NL_W,u_h, 0,0),Dither_get_lsb(Y8).crop(NL_W,u_h, 0,0)) : \ |
205 | + | |
206 | - | StackVertical(Dither_get_msb(Y8).crop(NL_W+NL_W/2,0,0,0),Dither_get_lsb(Y8).crop(NL_W+NL_W/2,0,0,0)) |
206 | + | u16 = !chr422 ? lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W,0,0,-v_h),Dither_get_lsb(nlc).crop(NL_W,0,0,-v_h)) : nlc.crop(NL_W,0,0,-v_h) : \ |
207 | lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W,0,-NL_W/2 ,0),Dither_get_lsb(nlc).crop(NL_W,0,-NL_W/2 ,0)) : nlc.crop(NL_W,0,-NL_W/2 ,0) | |
208 | - | !planar ? YToUV(u16,v16,Y8.crop(0,0,-u8.width(),0)) : avs26 ? YToUV(u16, v16, StackVertical(my, ly)) : YToUV(u16, v16, StackVertical(StackVertical (my,my), StackVertical (ly,ly))) ") : \ |
208 | + | v16 = !chr422 ? lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W,u_h, 0,0),Dither_get_lsb(nlc).crop(NL_W,u_h, 0,0)) : nlc.crop(NL_W,u_h, 0,0) : \ |
209 | - | ( !planar || avs26 ? Y8 : YToUV (u8, v8, StackVertical (StackVertical (my, my), StackVertical (ly, ly)))) """) : \ |
209 | + | lsb_in || lsb ? StackVertical(Dither_get_msb(nlc).crop(NL_W+NL_W/2,0,0,0),Dither_get_lsb(nlc).crop(NL_W+NL_W/2,0,0,0)) : nlc.crop(NL_W+NL_W/2,0,0,0) |
210 | ||
211 | !chr422 ? YToUV(u16,v16,nlc.crop(0,0,-u8.width(),0)) : planar ? YToUV(u16, v16, lsb_in || lsb ? StackVertical(my, ly) : my).converttoyuy2() : YToUV(u16, v16, lsb_in || lsb ? StackVertical(my, ly) : my) ") : \ | |
212 | planar ? nlc.converttoyuy2() : nlc """) : \ | |
213 | Assert(false, "Mode must be between -1~3: "+string(prefilter)))) : \ | |
214 | input8 | |
215 | ||
216 | ||
217 | ||
218 | ||
219 | - | pref = avs26 && planar && ((lsb_in && prefilter==-1) || prefilter==4) ? pref.Dither_YUY2toInterleaved16().Interleaved2planar() : pref |
219 | + | |
220 | # Default Auto-Prefilter - Luma expansion TV->PC (up to 16% more values for motion estimation) | |
221 | - | pref = !GlobalR ? (!yuy25 && (lsb || (!preclip ? prefilter==4 : false) ) ? ((!preclip ? ((lsb_in && prefilter==-1) || prefilter==3 || prefilter==4 ) : false) ? \ |
221 | + | |
222 | pref = avs26 && planar && ((lsb_in && prefilter==-1)) ? pref.Dither_YUY2toInterleaved16().Interleaved2planar() : pref | |
223 | pref16 = (Height(pref)) == (Height(input8)*2) ? true : false | |
224 | pref = !GlobalR ? (!yuy25 && lsb ? ((!preclip ? ((lsb_in && prefilter==-1) || prefilter==3 || prefilter==4 ) : false) ? \ | |
225 | - | pref.Dither_Luma_Rebuild(S0=Str,c=Amp,slice=slices,lsb =true,lsb_in=pref16,uv=Chr2)) : \ |
225 | + | |
226 | - | ((!preclip ? ((lsb_in && prefilter==-1) || prefilter==4) : false) ? \ |
226 | + | |
227 | !TV_range ? pref16 ? pref.Ditherpost(mode=6,ampn=0.0,slice=slices,staticnoise=false,u=Chr2,v=Chr2) : pref : \ | |
228 | pref.Dither_Luma_Rebuild(S0=Str,c=Amp,slice=slices,lsb =lsb,lsb_in=pref16,uv=Chr2)) : \ | |
229 | ((!preclip ? (lsb_in && prefilter==-1) : false) ? \ | |
230 | !TV_range ? pref.Ditherpost(mode=6,slice=slices,u=Chr,v=Chr).Dither_YUY2toInterleaved().Interleaved2planar(!chroma) : \ | |
231 | pref.Ditherpost(mode=6,slice=slices,u=Chr,v=Chr).Dither_YUY2toInterleaved().Interleaved2planar(!chroma).Dither_Luma_Rebuild(S0=Str,c=Amp,uv=Chr ) : \ | |
232 | !TV_range ? pref16 ? pref.Dither_YUY2toPlanar16().Ditherpost(mode=6,slice=slices,u=bug_wa,v=bug_wa).Dither_YUY2toInterleaved().Interleaved2planar(!chroma) : pref : \ | |
233 | pref. Dither_Luma_Rebuild(S0=Str,lsb_in=pref16,slice=slices,c=Amp,uv=bug_wa))) : \ | |
234 | pref | |
235 | ||
236 | ||
237 | ||
238 | ||
239 | ||
240 | (sShow ? false : !Show) ? eval(""" | |
241 | ||
242 | ||
243 | # Subpixel 3 | |
244 | ||
245 | 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() | |
246 | 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() | |
247 | ||
248 | ||
249 | ||
250 | ||
251 | # Motion vectors search | |
252 | ||
253 | ||
254 | super_search = pelclip ? MSuper(pref, pel=pel, chroma=chroma, hpad=hpad, vpad=vpad, pelclip=pclip, rfilter=4, planar=planar) : \ | |
255 | MSuper(pref, pel=pel,sharp=subpixel,chroma=chroma, hpad=hpad, vpad=vpad , rfilter=4, planar=planar) | |
256 | super_render = !GlobalR ? (pelclip ? MSuper(input8, pel=pel, chroma=plane0, hpad=hpad, vpad=vpad,levels=1, pelclip=pclip2 , planar=planar) : \ | |
257 | MSuper(input8, pel=pel,sharp=subpixel,chroma=plane0, hpad=hpad, vpad=vpad,levels=1 , planar=planar)): super_search | |
258 | Recalculate = !GlobalR && RefineMotion ? (pelclip ? MSuper(pref, pel=pel, chroma=chroma, hpad=hpad, vpad=vpad,levels=1, pelclip=pclip , planar=planar) : \ | |
259 | MSuper(pref, pel=pel,sharp=subpixel,chroma=chroma, hpad=hpad, vpad=vpad,levels=1 , planar=planar)): nop() | |
260 | !if3 ? eval(" | |
261 | bv6 = interlaced && (tr > 2) ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 6, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion) : bv6) : nop() | |
262 | bv6 = interlaced && (tr > 2) && RefineMotion && !GlobalR ? MRecalculate (Recalculate, bv6, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) : bv6 | |
263 | bv4 = interlaced && (tr > 1) ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 4, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion) : bv4) : nop() | |
264 | bv4 = interlaced && (tr > 1) && RefineMotion && !GlobalR ? MRecalculate (Recalculate, bv4, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) : bv4 | |
265 | bv3 = !interlaced ? ((tr > 2) ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 3, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion) : bv3) : nop()) : nop() | |
266 | bv3 = !interlaced ? ((tr > 2 && RefineMotion && !GlobalR) ? MRecalculate (Recalculate, bv3, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) : bv3 ) : nop() | |
267 | bv2 = (interlaced || tr > 1) ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 2, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion) : bv2) : nop() | |
268 | bv2 = ((interlaced || tr > 1) && RefineMotion && !GlobalR) ? MRecalculate (Recalculate, bv2, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) : bv2 | |
269 | bv1 = !interlaced ? (!GlobalR ? super_search.MAnalyse(isb = true, delta = 1, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion) : bv1 ) : nop() | |
270 | bv1 = !interlaced ? ( RefineMotion && !GlobalR ? MRecalculate (Recalculate, bv1, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) : bv1 ) : nop() | |
271 | ||
272 | fv1 = !interlaced ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 1, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion) : fv1 ) : nop() | |
273 | fv1 = !interlaced ? ( RefineMotion && !GlobalR ? MRecalculate (Recalculate, fv1, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) : fv1 ) : nop() | |
274 | fv2 = (interlaced || tr > 1) ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 2, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion) : fv2) : nop() | |
275 | fv2 = ((interlaced || tr > 1) && RefineMotion && !GlobalR) ? MRecalculate (Recalculate, fv2, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) : fv2 | |
276 | fv3 = !interlaced ? ((tr > 2) ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 3, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion) : fv3) : nop()) : nop() | |
277 | fv3 = !interlaced ? ((tr > 2 && RefineMotion && !GlobalR) ? MRecalculate (Recalculate, fv3, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) : fv3 ) : nop() | |
278 | fv4 = interlaced && (tr > 1) ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 4, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion) : fv4) : nop() | |
279 | fv4 = interlaced && (tr > 1) && RefineMotion && !GlobalR ? MRecalculate (Recalculate, fv4, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) : fv4 | |
280 | fv6 = interlaced && (tr > 2) ? (!GlobalR ? super_search.MAnalyse(isb = false, delta = 6, overlap= overlap,blksize= blksize, search=search,chroma=chroma, truemotion=truemotion) : fv6) : nop() | |
281 | fv6 = interlaced && (tr > 2) && RefineMotion && !GlobalR ? MRecalculate (Recalculate, fv6, overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma, truemotion=truemotion) : fv6 " ) : \ | |
282 | \ | |
283 | eval(" | |
284 | tr2 = tr*2 | |
285 | vmulti = !GlobalR ? super_search.MAnalyse( multi=true,overlap= overlap,blksize= blksize, search=search,chroma=chroma,truemotion=truemotion, delta = interlaced ? tr2 : tr) : vmulti | |
286 | vmulti = RefineMotion ? (!GlobalR ? MRecalculate (Recalculate, vmulti,overlap=halfoverlap,blksize=halfblksize, thSAD=halfthSAD,chroma=chroma,truemotion=truemotion, tr = interlaced ? tr2 : tr) : vmulti) : vmulti | |
287 | vmulti = !GlobalR ? (interlaced ? vmulti.SelectEvery (4, 2, 3) : vmulti) : vmulti.SelectRangeEvery (Rtr*2, tr2, 0, false)") | |
288 | ||
289 | ||
290 | ||
291 | # Finally, MDegrain | |
292 | ||
293 | ||
294 | output = !GlobalO ? (interlaced ? | |
295 | \ ((lsb ? ( 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,lsb=true) : | |
296 | \ (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,lsb=true) : | |
297 | \ (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,lsb=true) : | |
298 | \ mfilter.MDegrain1(super_render, bv2, fv2, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true)): | |
299 | \ ( 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,lsb=false): | |
300 | \ (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) : | |
301 | \ (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) : | |
302 | \ mfilter.MDegrain1(super_render, bv2, fv2, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)))) : | |
303 | \ (lsb ? ( 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,lsb=true) : | |
304 | \ (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,lsb=true) : | |
305 | \ (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,lsb=true) : | |
306 | \ mfilter.MDegrain1(super_render, bv1, fv1, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar,lsb=true)): | |
307 | \ ( 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,lsb=false): | |
308 | \ (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) : | |
309 | \ (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) : | |
310 | \ mfilter.MDegrain1(super_render, bv1, fv1, thSAD=thSAD, thSADC=thSADC, thSCD1=thSCD1, thSCD2=thSCD2, limit=limit, limitc=limitc, plane=plane, planar=planar)))) : nop() | |
311 | ||
312 | ||
313 | # LSB_IN merging | |
314 | ||
315 | outputI= !GlobalO && planar && (lsb || ifC) ? output.Planar2Interleaved() : nop() | |
316 | !GlobalO && lsb ? eval(" | |
317 | blnkclp= lsb_in || (if2 && !planar) ? BlankClip (lsb_in?input8h:input8, pixel_type="+Chr(34)+"YV12"+Chr(34)+", color_yuv=0) : nop() | |
318 | output = lsb && planar ? Dither_YUY2toPlanar16(outputI) : output | |
319 | 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() | |
320 | ||
321 | ||
322 | ||
323 | ||
324 | # Contrasharp (only sharpens luma) | |
325 | ||
326 | ifC && if0 && if4 ? eval(" | |
327 | global Super = super_render | |
328 | global cb1 = !if3 ? (interlaced ? bv2 : bv1) : vmulti.SelectEvery (tr2, 0) | |
329 | global cf1 = !if3 ? (interlaced ? fv2 : fv1) : vmulti.SelectEvery (tr2, 1)") : nop() | |
330 | ||
331 | !GlobalO && if0 ? eval(" | |
332 | ||
333 | CCh = if1 ? CClip.height() : nop() | |
334 | ref8 = if1 ? (h == CCh*2) : nop() | |
335 | ref16 = if1 ? (h == CCh/2) : nop() | |
336 | ||
337 | interlaced && if1 ? Assert(!ref16, "+Chr(34)+"Interlaced 16 bit stacked CClip is not a recognized format"+Chr(34)+") : nop() | |
338 | ||
339 | CClip = planar ? (if1 ? (lsb_in ? (ref8 ? CClip.Interleaved2planar(true) : CClip.Dither_YUY2toPlanar16().DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true)) : \ | |
340 | (interlaced ? (if5 ? CClip.AssumeTFF().SeparateFields().Interleaved2planar(true) : CClip.AssumeBFF().SeparateFields().Interleaved2planar(true)) : \ | |
341 | (ref16 ? CClip.Dither_YUY2toPlanar16().DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true) : CClip.Interleaved2planar(true)))) : \ | |
342 | (lsb_in ? inputY.DitherPost(mode=-1,u=1,v=1).Dither_YUY2toInterleaved().Interleaved2planar(true) : \ | |
343 | inputP)) : \ | |
344 | (if1 ? (lsb_in ? (ref8 ? CClip : CClip.DitherPost(mode=-1,u=1,v=1)) : \ | |
345 | (interlaced ? (if5 ? CClip.AssumeTFF().SeparateFields() : CClip.AssumeBFF().SeparateFields()) : (ref16 ? CClip.DitherPost(mode=-1,u=1,v=1) : CClip))) : \ | |
346 | (lsb_in ? input.DitherPost(mode=-1,u=1,v=1) : \ | |
347 | inputP))") : nop() | |
348 | ||
349 | ||
350 | !GlobalO && if2 ? eval(" | |
351 | OutTO8 = output.DitherPost(mode=-1,u=1,v=1) | |
352 | OutTO8P = planar ? OutTO8.Dither_YUY2toInterleaved() : nop() | |
353 | ctr16 = ifC ? ContrasharpeningHD (planar ? OutTO8P.Interleaved2planar(true):OutTO8, CClip, planar=planar, HD=if4) : \ | |
354 | LSFmod(OutTO8,source=CClip,defaults="+Chr(34)+"slow"+Chr(34)+",strength=Contrasharp,soothe=false,Lmode=0,soft=-2,keep=0) | |
355 | ||
356 | ||
357 | ctr16P = planar ? ctr16.Planar2Interleaved(true) : ctr16 | |
358 | ctr16 = StackVertical (ctr16P, planar ? BlankClip (ctr16P, pixel_type="+Chr(34)+"YUY2"+Chr(34)+", color_yuv=0,length=1) : blnkclp ) | |
359 | 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) | |
360 | ctr16 = MergeChroma(ctr16, output) ") : nop() | |
361 | ||
362 | ||
363 | ||
364 | # Globals Output | |
365 | ||
366 | GlobalO || Globals == 2 ? (!if3 ? eval(" | |
367 | global Super = super_render | |
368 | global bv6 = bv6 | |
369 | global bv4 = bv4 | |
370 | global bv3 = bv3 | |
371 | global bv2 = bv2 | |
372 | global bv1 = bv1 | |
373 | ||
374 | global fv1 = fv1 | |
375 | global fv2 = fv2 | |
376 | global fv3 = fv3 | |
377 | global fv4 = fv4 | |
378 | global fv6 = fv6 | |
379 | ") : eval(" | |
380 | global bv1 = vmulti.SelectEvery (tr2, 0) | |
381 | global bv2 = interlaced ? bv1 : vmulti.SelectEvery (tr2, 2) | |
382 | global bv3 = vmulti.SelectEvery (tr2, 4) | |
383 | global bv4 = interlaced ? vmulti.SelectEvery (tr2, 2) : nop() | |
384 | global bv6 = interlaced ? bv3 : nop() | |
385 | ||
386 | global fv1 = vmulti.SelectEvery (tr2, 1) | |
387 | global fv2 = interlaced ? fv1 : vmulti.SelectEvery (tr2, 3) | |
388 | global fv3 = vmulti.SelectEvery (tr2, 5) | |
389 | global fv4 = interlaced ? vmulti.SelectEvery (tr2, 3) : nop() | |
390 | global fv6 = interlaced ? fv3 : nop() | |
391 | global Super = super_render | |
392 | global vmulti = vmulti | |
393 | global Rtr = tr")) : nop() | |
394 | ||
395 | ||
396 | ||
397 | # Output | |
398 | ||
399 | !GlobalO ? (lsb_out ? (if0 ? ctr16 : output) : \ | |
400 | (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)) : \ | |
401 | (interlaced ? (ifC ? ContraSharpeningHD(output, CClip, planar=planar, HD=if4).weave() : LSFmod(output,source=CClip,defaults="slow",strength=Contrasharp,soothe=false,Lmode=0,soft=-2,keep=0).weave()) : \ | |
402 | (ifC ? ContraSharpeningHD(output, CClip, planar=planar, HD=if4) : LSFmod(output,source=CClip,defaults="slow",strength=Contrasharp,soothe=false,Lmode=0,soft=-2,keep=0)))) : \ | |
403 | (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)) : (interlaced ? output.weave() : output)))) \ | |
404 | : input | |
405 | ||
406 | !GlobalO ? (planar ? (lsb ? Dither_YUY2toInterleaved() : (if0 ? MergeChroma(Planar2Interleaved(true), interlaced ? outputI.weave() : outputI) : Planar2Interleaved())) : last) : last """) : \ | |
407 | \ | |
408 | \ | |
409 | \ | |
410 | \ | |
411 | \ | |
412 | eval(""" | |
413 | ||
414 | ############## | |
415 | # SHOW PANEL # | |
416 | ############## | |
417 | ||
418 | ||
419 | # Common Variables | |
420 | ||
421 | h = lsb_in ? h/2 : h | |
422 | w2 = w*1.0 | |
423 | h2 = h*1.0 | |
424 | hi = interlaced ? round(h/2.0) : h | |
425 | AR = w2/h2 | |
426 | lsp = interlaced?15:30 | |
427 | lsp = AR < 1.9 ? lsp : floor(AR < 1.9 ? lsp : ((AR>2.4) ? 0 : lsp-((AR-1.9)*(lsp/(2.4-1.9))))) | |
428 | ys = round(lsb_in ? h2/6 : (interlaced?h2/15:h2/6)) | |
429 | s = floor(((interlaced?w2/1.6:w2)/720.0)*16.0) | |
430 | type = planar?"YUY2":"YV12" | |
431 | ||
432 | Wadd = w2/40 | |
433 | Wadd2 = Wadd/2 | |
434 | w1 = round(w2+Wadd+Wadd2) | |
435 | w3 = (w2/3)+Wadd/2.1 | |
436 | w2 = round(w1+w3) | |
437 | w3 = round(w1+(w3+Wadd2)*1.96) | |
438 | w3sq = string(round(w3*1.01)) | |
439 | w3s = string(w3) | |
440 | ||
441 | # Panel Separator | |
442 | ||
443 | blkclp = BlankClip(interlaced?assumeframebased(pref):pref,length=1,pixel_type=type,color=$161616) | |
444 | \.crop(0,interlaced?h/2%8:h%8,0,0).separatefields().assumeframebased().separatefields() | |
445 | ||
446 | Interleave(selecteven(blkclp).addborders(2,0,0,0,color=$7f7f7f).crop(0,0,-2,0),selectodd(blkclp)) | |
447 | ||
448 | WOut=weave().assumefieldbased().weave() | |
449 | sep=round((hi-height(WOut))/2.0) | |
450 | ||
451 | StackHorizontal(planar? pref.Planar2Interleaved() : pref,WOut.addborders(0,sep-sep%2,0,hi-(height(WOut)+(sep-sep%2)),color=$161616)) | |
452 | ||
453 | ||
454 | ||
455 | # Color Guide Squares | |
456 | ||
457 | a=interlaced?h*0.37:h*0.74 | |
458 | b=interlaced?h*0.40:h*0.80 | |
459 | c=interlaced?h*0.43:h*0.86 | |
460 | ||
461 | !planar ? 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() | |
462 | !planar ? 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() | |
463 | !planar ? 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() | |
464 | ||
465 | ||
466 | # Parameters List | |
467 | ||
468 | blue = sShow ? (show=="Speed" ? true : false) : false | |
469 | red = sShow ? (show=="Memory" ? true : false) : false | |
470 | yellow= sShow ? (show=="Quality" ? true : false) : false | |
471 | ||
472 | Color = sShow ? (blue ? $00aef0 : \ | |
473 | red ? $ff0000 : \ | |
474 | yellow ? $ffff00 : \ | |
475 | Assert(false, "Revise typo for possible color guide modes: 'Speed','Memory','Quality'")) : nop() | |
476 | ||
477 | ||
478 | ||
479 | varn = "\n\n\n\n\n" | |
480 | sp = !GlobalR && str==1.0 ? " " : "" | |
481 | ||
482 | 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)) | |
483 | ||
484 | Subtitle("BASIC" ,lsp=lsp,text_color=$ffffff,font="COURIER NEW",size=s,x=w1,y=ys) | |
485 | Subtitle( "\n\ntr = " + string(tr) + \ | |
486 | varn+varn+ "chroma = " + string(chroma) ,lsp=lsp,text_color=red||blue ?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys) | |
487 | Subtitle( "\n\n\nthSAD(C) = " + string( GlobalO?"bypass":string(thSAD) + "(" + string(plane0?thSADC:"bypass") + ")")+ \ | |
488 | varn+ "CClip = " + string( GlobalO?"bypass":(defined(CClip)?"defined":"undefined")) + \ | |
489 | "\n\nInterlaced = " + string(interlaced) ,lsp=lsp,text_color= $ffffff,font="COURIER NEW",size=s,x=w1,y=ys) | |
490 | Subtitle(varn+ "RefineMotion = " + string( GlobalO?"bypass":RefineMotion) ,lsp=lsp,text_color=yellow ?Color:$ffffff,font="COURIER NEW",size=s,x=w1,y=ys) | |
491 | 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) | |
492 | 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) | |
493 | 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)) | |
494 | ||
495 | Subtitle("ADVANCED",lsp=lsp,text_color=$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
496 | Subtitle( "\n\npel = " + string(pel) ,lsp=lsp,text_color=red ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
497 | 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) | |
498 | 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) | |
499 | 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) | |
500 | Subtitle(varn+ "\n\nStr = " + (GlobalR?string("bypass"):string(Str,"%1.2f"))+sp+" Brightness" + \ | |
501 | varn+ "search = " + string( GlobalR?"bypass":search) ,lsp=lsp,text_color=yellow&&!GlobalR ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
502 | Subtitle(varn+varn+ "blksize = " + string( GlobalR?"bypass":blksize) + \ | |
503 | "\noverlap = " + string( GlobalR?"bypass":overlap) ,lsp=lsp,text_color=(red||blue)&&!GlobalR ?Color:$7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
504 | 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)"))) + \ | |
505 | "\n\nAmp = " + (GlobalR||str==1.0?string("bypass"):string(Amp,"%1.2f"))+" Amplitude" + \ | |
506 | varn+ "\nlimit(C) = " + (GlobalO?string("bypass"):string(limit) + "(" + string(limitc) + ")") ,lsp=lsp,text_color= $7f7f7f,font="COURIER NEW",size=s,x=w2,y=ys) | |
507 | ||
508 | Subtitle("OTHERS" ,lsp=lsp,text_color=$494949,font="COURIER NEW",size=s,x=w3,y=ys) | |
509 | Subtitle( "\n\n\nthSCD1(2) = " + (GlobalO?string("bypass"):string(thSCD1) + "(" + string(thSCD2) + ")") + \ | |
510 | 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) | |
511 | Subtitle( varn+"\n\nslices = " + string(slices) ,lsp=lsp,text_color=blue ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys) | |
512 | 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) | |
513 | Subtitle(varn+ "lsb = " + string(lsb) ,lsp=lsp,text_color=yellow ?Color:$494949,font="COURIER NEW",size=s,x=w3,y=ys) | |
514 | 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) | |
515 | 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) | |
516 | ||
517 | Subtitle(" Speed" ,lsp=interlaced?15:30,text_color=planar?$00aef0:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(a-1)) | |
518 | Subtitle(" Memory" ,lsp=interlaced?17:34,text_color=planar?$ff0000:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(b-1)) | |
519 | Subtitle(" Quality" ,lsp=interlaced?19:38,text_color=planar?$ffff00:$7f7f7f,font="COURIER NEW",size=s,x=w3,y=int(c-1)) | |
520 | ||
521 | lsb_out ? StackVertical (last, BlankClip (last, pixel_type=type, color_yuv=0,length=1)) : last""")} | |
522 | ||
523 | ||
524 | ||
525 | ||
526 | ||
527 | ######################################################## | |
528 | # # | |
529 | # HELPER FUNCTIONS: For Contrasharp and YUY2 handling # | |
530 | # # | |
531 | ######################################################## | |
532 | ||
533 | ######################################## | |
534 | ## Didée's functions: | |
535 | ||
536 | # contra-sharpening: sharpen the denoised clip, but don't add more to any pixel than what was removed previously. | |
537 | # script function from Didée, at the VERY GRAINY thread (http://forum.doom9.org/showthread.php?p=1076491#post1076491) | |
538 | ||
539 | # In final version 2.0d ContraHD() was merged, to allow proper HD sharpening. | |
540 | # In this case global variables of (before denoising) source MSuper and forward and backward | |
541 | # compensated motion vectors are necessary as: Super, cb1 and cf1, if used as a stand alone function. | |
542 | # Don't know who made (mod) it, so I can't give proper credits, sorry. | |
543 | ||
544 | FUNCTION ContraSharpeningHD(clip denoised, clip original, bool "HD", bool "planar", int "overshoot"){ | |
545 | HD = default(HD ,false) | |
546 | planar = default(planar,false) | |
547 | overshoot = default(overshoot,0) | |
548 | avs26 = VersionNumber() < 2.60 ? false : true | |
549 | yuy26 = avs26 && Isyuy2(denoised) && planar | |
550 | ||
551 | HD ? eval(""" | |
552 | cb1=original.MCompensate(Super, cb1, planar=planar) | |
553 | cf1=original.MCompensate(Super, cf1, planar=planar) | |
554 | 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") | |
555 | 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() | |
556 | ||
557 | s = denoised.MinBlur(HD?2:1,1,planar=planar) # Damp down remaining spots of the denoised clip. | |
558 | s = yuy26 ? s.Planar2Interleaved().ConvertToYV16() : s | |
559 | original = yuy26 ? original.Planar2Interleaved().ConvertToYV16() : original | |
560 | denoised = yuy26 ? denoised.Planar2Interleaved().ConvertToYV16() : denoised | |
561 | allD = mt_makediff(original,denoised) # The difference achieved by the denoising. | |
562 | ssD = mt_makediff(s,HD?s.removegrain(20,-1,planar=planar).\ | |
563 | removegrain(20,-1,planar=planar):\ | |
564 | s.removegrain(11,-1,planar=planar)) # The difference of a simple kernel blur. | |
565 | allD = yuy26 ? allD.ConvertToYUY2().Interleaved2planar() : allD | |
566 | ssD = yuy26 ? ssD.ConvertToYUY2().Interleaved2planar() : ssD | |
567 | 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. | |
568 | ssDD = yuy26 ? ssDD.Planar2Interleaved().ConvertToYV16() : ssDD | |
569 | ssD = yuy26 ? ssD.Planar2Interleaved().ConvertToYV16() : ssD | |
570 | ssDD = SSDD.mt_lutxy(ssD,"x 128 - abs y 128 - abs < x y ?") # abs(diff) after limiting may not be bigger than before. | |
571 | ||
572 | denoised.mt_adddiff(ssDD,U=2,V=2) # Apply the limited difference. (Sharpening is just inverse blurring) | |
573 | HD ? mt_clamp(last,pmax,pmin,overshoot,overshoot,chroma="copy first") : last | |
574 | yuy26 ? last.ConvertToYUY2().Interleaved2planar() : last | |
575 | } | |
576 | ||
577 | # MinBlur by Didée (http://avisynth.org/mediawiki/MinBlur) | |
578 | # Nifty Gauss/Median combination (Modified for Planar input) | |
579 | ||
580 | function MinBlur(clip clp, int "r", int "uv", bool "planar"){ | |
581 | ||
582 | r = default(r,1) | |
583 | uv = default(uv,3) | |
584 | planar = default(planar,false) | |
585 | avs26 = VersionNumber() < 2.60 ? false : true | |
586 | yuy26 = avs26 && Isyuy2(clp) && planar | |
587 | ||
588 | uv2 = (uv==2) ? 1 : uv | |
589 | rg4 = (uv==3) ? 4 : -1 | |
590 | rg11 = (uv==3) ? 11 : -1 | |
591 | rg20 = (uv==3) ? 20 : -1 | |
592 | uvm2 = r==2 ? (uv==3?2:uv==2?0:-1) : nop() | |
593 | uvm3 = r==3 ? (uv==3?3:uv==2?0:-1) : nop() | |
594 | medf = (uv==3) ? 1 : -200 | |
595 | ||
596 | RG11D = (r==0) ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.sbr(planar=planar).Planar2Interleaved().ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.sbr(planar=planar),U=uv2,V=uv2) | |
597 | \ : (r==1) ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).Planar2Interleaved().ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar),U=uv2,V=uv2) | |
598 | \ : (r==2) ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).Planar2Interleaved().ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar),U=uv2,V=uv2) | |
599 | \ : yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).removegrain(20,rg20,planar=planar).Planar2Interleaved().ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.removegrain(11,rg11,planar=planar).removegrain(20,rg20,planar=planar).removegrain(20,rg20,planar=planar),U=uv2,V=uv2) | |
600 | RG4D = (r<=1) ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.removegrain(4,rg4,planar=planar).Planar2Interleaved().ConvertToYV16(),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.removegrain(4,rg4,planar=planar),U=uv2,V=uv2) | |
601 | \ : (r==2) ? avs26 ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.Planar2Interleaved().ConvertToYV16().medianblur(2,2*medf,2*medf),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.medianblur(2,2*medf,2*medf),U=uv2,V=uv2) : mt_makediff(clp,clp.Quantile(radius_y=2, radius_u=uvm2, radius_v=uvm2, planar=planar), U=uv2,V=uv2) | |
602 | \ : avs26 ? yuy26 ? mt_makediff(clp.Planar2Interleaved().ConvertToYV16(),clp.Planar2Interleaved().ConvertToYV16().medianblur(3,3*medf,3*medf),U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_makediff(clp,clp.medianblur(3,3*medf,3*medf),U=uv2,V=uv2) : mt_makediff(clp,clp.Quantile(radius_y=3, radius_u=uvm3, radius_v=uvm3, planar=planar), U=uv2,V=uv2) | |
603 | DD = yuy26 ? mt_lutxy(RG11D.Planar2Interleaved().ConvertToYV16(),RG4D.Planar2Interleaved().ConvertToYV16(),"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2).ConvertToYUY2().Interleaved2planar() : mt_lutxy(RG11D,RG4D,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=uv2,V=uv2) | |
604 | return (yuy26 ? clp.Planar2Interleaved().ConvertToYV16().mt_makediff(DD.Planar2Interleaved().ConvertToYV16(),U=uv,V=uv).ConvertToYUY2().Interleaved2planar() : clp.mt_makediff(DD,U=uv,V=uv)) } | |
605 | ||
606 | ||
607 | # helper function: make a highpass on a blur's difference (well, kind of that) | |
608 | # Highpass of spatial r=1 Gaussian (like blur(1.0)) (Modified for Planar input) | |
609 | ||
610 | function sbr(clip c, bool "planar") { | |
611 | ||
612 | planar = default(planar,false) | |
613 | avs26 = VersionNumber() < 2.60 ? false : true | |
614 | yuy26 = avs26 && Isyuy2(c) && planar | |
615 | ||
616 | rg11 = c.removegrain(11,-1,planar=planar) | |
617 | rg11D = yuy26 ? mt_makediff(c.Planar2Interleaved().ConvertToYV16(),rg11.Planar2Interleaved().ConvertToYV16()).ConvertToYUY2().Interleaved2planar() : mt_makediff(c,rg11) | |
618 | rg11DD = yuy26 ? mt_makediff(rg11D.Planar2Interleaved().ConvertToYV16(),rg11D.removegrain(11,-1,planar=planar).Planar2Interleaved().ConvertToYV16()).mt_lutxy(rg11D.Planar2Interleaved().ConvertToYV16(),"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?").ConvertToYUY2().Interleaved2planar() : 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 ? ?") | |
619 | yuy26 ? c.Planar2Interleaved().ConvertToYV16().mt_makediff(rg11DD.Planar2Interleaved().ConvertToYV16(),U=2,V=2).ConvertToYUY2().Interleaved2planar() : c.mt_makediff(rg11DD,U=2,V=2) } | |
620 | ||
621 | ######################################## | |
622 | ## cretindesalpes' functions: (http://forum.doom9.org/showthread.php?p=1505297#post1505297) | |
623 | ||
624 | # Converts 16 bit interleaved YUY2 to 16bit planar YUY2 suitable for Ditherpost. (Use right before Ditherpost; this format is not suitable for filtering) | |
625 | ||
626 | function Dither_YUY2toPlanar16(c){c | |
627 | yuy26 = !(VersionNumber() < 2.60) && isyuy2(c) | |
628 | my = !yuy26 ? Dither_get_msb().ConvertToYV12() : nop() | |
629 | ly = !yuy26 ? Dither_get_lsb().ConvertToYV12() : nop() | |
630 | u = !yuy26 ? UToY ().ConvertToYV12 () : nop() | |
631 | v = !yuy26 ? VToY ().ConvertToYV12 () : nop() | |
632 | yuy26 ? ConvertToYV16() : YToUV (u, v, StackVertical (StackVertical (my, my), StackVertical (ly, ly)))} | |
633 | ||
634 | ||
635 | # Converts 8 bit interleaved YUY2 to 8 bit planar YUY2 ready for either 8 or 16 bit processing also suitable for Ditherpost | |
636 | ||
637 | function Dither_YUY2toPlanar(c){c | |
638 | yuy26 = !(VersionNumber() < 2.60) && isyuy2(c) | |
639 | y = !yuy26 ? ConvertToYV12 () : nop() | |
640 | u = !yuy26 ? UToY ().ConvertToYV12 () : nop() | |
641 | v = !yuy26 ? VToY ().ConvertToYV12 () : nop() | |
642 | yuy26 ? ConvertToYV16() : YToUV (u, v, StackVertical (y, y))} | |
643 | ||
644 | ||
645 | # Converts back the above special planar formats to normal interleaved 16 bit YUY2 | |
646 | ||
647 | function Dither_YUY2toInterleaved16(c){c | |
648 | yuy26 = !(VersionNumber() < 2.60) | |
649 | y = !yuy26 ? StackVertical (Crop (0, 0, 0, (Height () /(4))), Crop (0, (Height () /(2))+(Height () /(4)), 0, 0)).ConvertToYUY2 () : nop() | |
650 | u = !yuy26 ? UToY ().ConvertToYUY2 () : nop() | |
651 | v = !yuy26 ? VToY ().ConvertToYUY2 () : nop() | |
652 | yuy26 ? ConvertToYUY2() : YToUV (u, v, y)} | |
653 | ||
654 | # Converts back the above special planar formats to normal interleaved YUY2 | |
655 | ||
656 | function Dither_YUY2toInterleaved(c){c | |
657 | yuy26 = !(VersionNumber() < 2.60) | |
658 | y = !yuy26 ? Crop (0, 0, 0, Height () /(2)).ConvertToYUY2 () : nop() | |
659 | u = !yuy26 ? UToY ().ConvertToYUY2 () : nop() | |
660 | v = !yuy26 ? VToY ().ConvertToYUY2 () : nop() | |
661 | yuy26 ? ConvertToYUY2() : YToUV (u, v, y)} | |
662 | ||
663 | ||
664 | ||
665 | # 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) | |
666 | # By courtesy of cretindesalpes. (http://forum.doom9.org/showthread.php?p=1548318#post1548318) | |
667 | ||
668 | 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"){ | |
669 | lsb_in = Default( lsb_in ,false) | |
670 | lsb_out = Default( lsb_out ,false) | |
671 | lsb = Default( lsb ,lsb_in || lsb_out) | |
672 | mode = Default( mode ,6) | |
673 | uv = Default(uv, 3) | |
674 | s0 = Default(s0, 2.0) | |
675 | c = Default(c, 1.0/16) | |
676 | ampn = Default(ampn, 0.0) | |
677 | slice = Default(slice, true) | |
678 | yuy26 = !(VersionNumber() < 2.60) && isyuy2(src) | |
679 | src = yuy26 ? src.Planar2Interleaved().ConvertToYV16() : src | |
680 | ||
681 | k = (s0 - 1) * c | |
682 | t = lsb_in ? "x 4096 - 56064 / 0 1 clip" : "x 16 - 219 / 0 1 clip" | |
683 | e = String(k)+" "+String(1+c)+" "+String((1+c)*c)+" "+t+" "+String(c) | |
684 | \ +" + / - * "+t+" 1 "+String(k)+" - * + "+String(lsb?65536:255)+" *" | |
685 | src | |
686 | lsb ? (lsb_in ? Dither_lut16 (yexpr=e,expr="x 32768 - 32768 * 28672 / 32768 +",y=3, u=uv, v=uv) : \ | |
687 | Dither_lut8 (yexpr=e,expr="x 128 - 32768 * 112 / 32768 +" ,y=3, u=uv, v=uv)) : \ | |
688 | mt_lut (yexpr=e,expr="x 128 - 128 * 112 / 128 +" ,y=3, u=uv, v=uv) | |
689 | lsb_out ? last : (lsb ? Ditherpost(mode=mode,ampn=ampn,slice=slice,staticnoise=ampn!=0.0?true:false,u=uv,v=uv) : last) | |
690 | return yuy26 ? last.ConvertToYUY2().Interleaved2planar() : last | |
691 | } |