View difference between Paste ID: P2TDCB7d and GWm5Bcf8
SHOW: | | - or go back to the newest paste.
1
################################################################################################
2
###                                                                                          ###
3
###                       LimitedSharpenFaster MOD : function LSFmod()                       ###
4
###                                                                                          ###
5
###                                Modded Version by LaTo INV.                               ###
6
###                                                                                          ###
7
###                                  v1.9 - 05 October 2009                                  ###
8
###                                                                                          ###
9
###                            another Modded Version by A.SONY.                             ###
10
###                                                                                          ###
11-
###                                   v2.183 - 31 Aug 2019                                   ###
11+
###                                v2.184 - 18 September 2019                                ###
12
###                                                                                          ###
13
################################################################################################
14
###
15
### +-----------+
16
### | CHANGELOG |
17
### +-----------+
18
###
19
### v2.184 : - some fix when using soruce and make sure it will not work with RGB
20
###
21
### v2.183 : - fix bugs when show=true cases
22
###
23
### v2.18 : - fix upscale, i.e. dest_x or dest_y are larger than the input clip
24
###
25
### v2.12 : - HBD in avs+
26
###         - some fixes
27
###
28
### v1.9 : - tweaked settings
29
###        - default preset is now defaults="fast" /!\
30
###
31
### v1.8 : - changed preblur to allow more tweaking (bool->string)
32
###        - tweaked settings
33
###        - cleaned the code
34
###        - updated documentation
35
###
36
### v1.7 : - changed Smethod=4 to "source"
37
###
38
### v1.6 : - added preblur option
39
###        - added new Smethod=4
40
###
41
### v1.5 : - fixed LUT expression (thanks to Didée)
42
###        - changed Smethod to Smethod+secure
43
###
44
### v1.4 : - changed defaults="new" to defaults="slow" & defaults="fast"
45
###        - added show parameter
46
###        - cleaned a little the code
47
###
48
### v1.3 : - changed a little Smethod=3&5 (same effect, but more precise)
49
###        - added new calculation for soft (soft=-2) [default on]
50
###        - added warning about bad settings (no more silent)
51
###        - updated the documentation
52
###
53
### v1.2 : - added new Lmode<0 (limit with repair)
54
###        - added 2 new Smode (unsharp masking)
55
###        - changed Smode order: now old Smode3-4 is new Smode3-4 to avoid mistake
56
###
57
### v1.1 : - fixed a bug with dest_x!=ox or dest_y!=oy
58
###        - replaced Lfactor by over/undershoot2
59
###
60
### v1.0 : - deleted old Smode(1-4), added new Smode(1-3) & Smethod(1-5)
61
###        - added parameters for nonlinear sharpening (S2zp,S2pwr,S2dmpLo,S2dmpHi)
62
###        - corrected the nonlinear formula
63
###        - added new Lmode 2 & 4 + fixed Lmode 0
64
###        - added faster edgemask
65
###        - added soothe temporal stabilization, 2 parameters: soothe & keep
66
###        - replaced lanczosresize by spline36resize
67
###        - moved "strength" parameter (first place)
68
###        - deleted wide, special and exborder
69
###        - changed some code (cosmetic)
70
###        - added "defaults" parameter (to switch between original and modded version)
71
###        - added documentation
72
###
73
###
74
###
75
### +--------------+
76
### | DEPENDENCIES |
77
### +--------------+
78
###
79
### -> Masktools    (v2.2.15 or up)
80
### -> Removegrain  (v1.0pre or up)
81-
### -> if you use avs+ then make sure it's it the last one
81+
82
### -> Variableblur (v0.30 or up)      [for Smode=2]
83
### -> if you use avs+ then make sure it's the last one
84
###
85
###
86
###
87
###
88
### +-------+
89
### | USAGE |
90
### +-------+
91
###
92
### LSFmod( strength, Smode, Smethod, kernel, 
93
###         preblur, secure, source,
94
###         Szrp, Spwr, SdmpLo, SdmpHi,
95
###         Lmode, overshoot, undershoot, overshoot2, undershoot2,
96
###         soft, soothe, keep,
97
###         edgemode, edgemaskHQ,
98
###         ss_x, ss_y, dest_x, dest_y,
99
###         show, screenW, screenH,
100
###         defaults )
101
###
102
###
103
###
104
### +---------+
105
### | GENERAL |
106
### +---------+
107
###
108
### strength [int]
109
### --------------
110
### Strength of the sharpening
111
###
112
### Smode [int: 1,2,3,4,5]
113
### ----------------------
114
### Sharpen mode:
115
###    =1 : Unsharp masking (from warpsharp)
116
###    =2 : Unsharp masking (from variableblur) 
117
###    =3 : Range sharpening
118
###    =4 : Nonlinear sharpening (original  version)
119
###    =5 : Nonlinear sharpening (corrected version)
120
###
121
### Smethod [int: 1,2,3]
122
### --------------------
123
### Sharpen method: (only used in Smode=3,4,5)
124
###    =1 : 3x3 kernel
125
###    =2 : Min/Max
126
###    =3 : Min/Max + 3x3 kernel
127
###
128
### kernel [int: 11,12,19,20]
129
### -------------------------
130
### Kernel used in Smethod=1&3
131
### In strength order: + 19 > 12 >> 20 > 11 -
132
###
133
###
134
###
135
### +---------+
136
### | SPECIAL |
137
### +---------+
138
###
139
### preblur [string: "ON","OFF",...]
140
### --------------------------------
141
### Mode to avoid noise sharpening & ringing (only used in Smode=3,4,5)
142
### "ON" is sufficient to prevent ringing, but to prevent noise sharpening you should set your own denoiser
143
###    Usage:   LSFmod(preblur="YourFavoriteDenoiser()")
144
###    Example: LSFmod(preblur="FFT3Dfilter(sigma=4,plane=0)")
145
###
146
###
147
### secure [bool]
148
### -------------
149
### Mode to avoid banding & oil painting (or face wax) effect of sharpening
150
### (only used in Smode=3,4,5)
151
###
152
### source [clip]
153
### -------------
154
### If source is defined, LSFmod doesn't sharp more a denoised clip than this source clip
155
### In this mode, you can safely set Lmode=0 & PP=off
156
###    Usage:   denoised.LSFmod(source=source)
157
###    Example: last.FFT3Dfilter().LSFmod(source=last,Lmode=0,soft=0)
158
###
159
###
160
###
161
### +----------------------+
162
### | NONLINEAR SHARPENING |
163
### +----------------------+
164
###
165
### Szrp [int]
166
### ----------
167
### Zero Point:
168
###    - differences below Szrp are amplified (overdrive sharpening)
169
###    - differences above Szrp are reduced   (reduced sharpening)
170
###
171
### Spwr [int]
172
### ----------
173
### Power: exponent for sharpener
174
###
175
### SdmpLo [int]
176
### ------------
177
### Damp Low: reduce sharpening for small changes [0:disable]
178
###
179
### SdmpHi [int]
180
### ------------
181
### Damp High: reduce sharpening for big changes [0:disable]
182
###
183
###
184
###
185
### +----------+
186
### | LIMITING |
187
### +----------+
188
###
189
### Lmode [int: ...,0,1,2,3,4]
190
### --------------------------
191
### Limit mode:
192
###    <0 : Limit with repair (ex: Lmode=-1 --> repair(1), Lmode=-5 --> repair(5)...)
193
###    =0 : No limit
194
###    =1 : Limit to over/undershoot
195
###    =2 : Limit to over/undershoot on edges and no limit on not-edges
196
###    =3 : Limit to zero on edges and to over/undershoot on not-edges
197
###    =4 : Limit to over/undershoot on edges and to over/undershoot2 on not-edges
198
###
199
### overshoot [int]
200
### ---------------
201
### Limit for pixels that get brighter during sharpening
202
###
203
### undershoot [int]
204
### ----------------
205
### Limit for pixels that get darker during sharpening
206
###
207
### overshoot2 [int]
208
### ----------------
209
### Same as overshoot, only for Lmode=4
210
###
211
### undershoot2 [int]
212
### -----------------
213
### Same as undershoot, only for Lmode=4
214
###
215
###
216
###
217
### +-----------------+
218
### | POST-PROCESSING |
219
### +-----------------+
220
###
221
### soft [int: -2,-1,0...100]
222
### -------------------------
223
### Soft the sharpening effect (-1 = old autocalculate, -2 = new autocalculate)
224
###
225
### soothe [bool]
226
### -------------
227
###    =true  : Enable soothe temporal stabilization
228
###    =false : Disable soothe temporal stabilization
229
###
230
### keep [int: 0...100]
231
### -------------------
232
### Minimum percent of the original sharpening to keep (only with soothe=true)
233
###
234
###
235
###
236
### +-------+
237
### | EDGES |
238
### +-------+
239
###
240
### edgemode [int: -1,0,1,2]
241
### ------------------------
242
###    =-1 : Show edgemask
243
###    = 0 : Sharpening all
244
###    = 1 : Sharpening only edges
245
###    = 2 : Sharpening only not-edges
246
###
247
### edgemaskHQ [bool]
248
### -----------------
249
###    =true  : Original edgemask
250
###    =false : Faster edgemask
251
###
252
###
253
###
254
### +------------+
255
### | UPSAMPLING |
256
### +------------+
257
###
258
### ss_x ; ss_y [float]
259
### -------------------
260
### Supersampling factor (reduce aliasing on edges)
261
###
262
### dest_x ; dest_y [int]
263
### ---------------------
264
### Output resolution after sharpening (avoid a resizing step)
265
###
266
###
267
###
268
### +-------+
269
### | DEBUG |
270
### +-------+
271
###
272
### show [bool]
273
### -----------
274
### Show debug clip & informations
275
###
276
### screenW ; screenH [int]
277
### -----------------------
278
### Screen resolution (for show clip)
279
###
280
###
281
###
282
### +----------+
283
### | SETTINGS |
284
### +----------+
285
###
286
### defaults [string: "old" or "slow" or "fast"]
287
### --------------------------------------------
288
###    = "old"  : Reset settings to original version (output will be THE SAME AS LSF)
289
###    = "slow" : Enable SLOW modded version settings
290
###    = "fast" : Enable FAST modded version settings
291
###  --> /!\ [default:"fast"]
292
###
293
###
294
### defaults="old" :  - strength    = 100
295
### ----------------  - Smode       = 3
296
###                   - Smethod     = Smode==3?2:1
297
###                   - kernel      = 11
298
###
299
###                   - preblur     = "OFF"
300
###                   - secure      = false
301
###                   - source      = undefined
302
###
303
###                   - Szrp        = 16
304
###                   - Spwr        = 2
305
###                   - SdmpLo      = strength/25
306
###                   - SdmpHi      = 0
307
###
308
###                   - Lmode       = 1
309
###                   - overshoot   = 1
310
###                   - undershoot  = overshoot
311
###                   - overshoot2  = overshoot*2
312
###                   - undershoot2 = overshoot2
313
###
314
###                   - soft        = 0
315
###                   - soothe      = false
316
###                   - keep        = 25
317
###
318
###                   - edgemode    = 0
319
###                   - edgemaskHQ  = true
320
###
321
###                   - ss_x        = Smode==3?1.50:1.25
322
###                   - ss_y        = ss_x
323
###                   - dest_x      = ox
324
###                   - dest_y      = oy
325
###
326
###                   - show        = false
327
###                   - screenW     = 1280
328
###                   - screenH     = 1024
329
###
330
###
331
### defaults="slow" : - strength    = 100
332
### ----------------- - Smode       = 5
333
###                   - Smethod     = 3
334
###                   - kernel      = 11
335
###
336
###                   - preblur     = "OFF"
337
###                   - secure      = true
338
###                   - source      = undefined
339
###
340
###                   - Szrp        = 16
341
###                   - Spwr        = 4
342
###                   - SdmpLo      = 4
343
###                   - SdmpHi      = 48
344
###
345
###                   - Lmode       = 4
346
###                   - overshoot   = strength/100
347
###                   - undershoot  = overshoot
348
###                   - overshoot2  = overshoot*2
349
###                   - undershoot2 = overshoot2
350
###
351
###                   - soft        = -2
352
###                   - soothe      = true
353
###                   - keep        = 20
354
###
355
###                   - edgemode    = 0
356
###                   - edgemaskHQ  = true
357
###
358
###                   - ss_x        = 1.50
359
###                   - ss_y        = ss_x
360
###                   - dest_x      = ox
361
###                   - dest_y      = oy
362
###
363
###                   - show        = false
364
###                   - screenW     = 1280
365
###                   - screenH     = 1024
366
###
367
###
368
### defaults="fast" : - strength    = 100
369
### ----------------- - Smode       = 3
370
###                   - Smethod     = 2
371
###                   - kernel      = 11
372
###
373
###                   - preblur     = "OFF"
374
###                   - secure      = true
375
###                   - source      = undefined
376
###
377
###                   - Szrp        = 16
378
###                   - Spwr        = 4
379
###                   - SdmpLo      = 4
380
###                   - SdmpHi      = 48
381
###
382
###                   - Lmode       = 1
383
###                   - overshoot   = strength/100
384
###                   - undershoot  = overshoot
385
###                   - overshoot2  = overshoot*2
386
###                   - undershoot2 = overshoot2
387
###
388
###                   - soft        = 0
389
###                   - soothe      = true
390
###                   - keep        = 20
391
###
392
###                   - edgemode    = 0
393
###                   - edgemaskHQ  = false
394
###
395
###                   - ss_x        = 1.25
396
###                   - ss_y        = ss_x
397
###                   - dest_x      = ox
398
###                   - dest_y      = oy
399
###
400
###                   - show        = false
401
###                   - screenW     = 1280
402
###                   - screenH     = 1024
403
###
404
################################################################################################
405
406
function LSFmod( clip inclip, float "strength", int "Smode", int "Smethod", int "kernel",
407
\                string "preblur", bool "secure", clip "source",
408
\                int "Szrp", int "Spwr", float "SdmpLo", float "SdmpHi",
409
\                int "Lmode", int "overshoot", int "undershoot", int "overshoot2", int "undershoot2",
410
\                int "soft", bool "soothe", int "keep",
411
\                int "edgemode", bool "edgemaskHQ",
412
\                float "ss_x", float "ss_y", int "dest_x", int "dest_y",
413
\                bool "show", int "screenW", int "screenH",
414
\                string "defaults" )
415
{
416
417
sisphbd = AvsPlusVersionNumber > 2294
418-
version  = "v2.182"
418+
419
### DEFAULTS
420
version  = "v2.184"
421
defaults = default(defaults,"fast")
422
num      = defaults=="old" ? 0 : defaults=="slow" ? 1 : defaults=="fast" ? 2 : 3
423
424
ox = inclip.width
425
oy = inclip.height
426
427
Assert(num         != 3      ? true : false, chr(10) + """Defaults must be "old" or "slow" or "fast" !""" + chr(10))
428
429
strength    = default( strength,    Select(num,                100 ,                100 ,                100 ) )
430
Smode       = default( Smode,       Select(num,                  3 ,                  5 ,                  3 ) )
431
Smethod     = default( Smethod,     Select(num,       Smode==3?2:1 ,                  3 ,                  2 ) )
432
kernel      = default( kernel,      Select(num,                 11 ,                 11 ,                 11 ) )
433
434
preblur     = default( preblur,     Select(num,              "OFF" ,              "OFF" ,              "OFF" ) )
435
secure      = default( secure,      Select(num,              false ,               true ,               true ) )
436
437
Szrp        = default( Szrp,        Select(num,                 16 ,                 16 ,                 16 ) )
438
Spwr        = default( Spwr,        Select(num,                  2 ,                  4 ,                  4 ) )
439
SdmpLo      = default( SdmpLo,      Select(num,        strength/25 ,                  4 ,                  4 ) )
440
SdmpHi      = default( SdmpHi,      Select(num,                  0 ,                 48 ,                 48 ) )
441
442
Lmode       = default( Lmode,       Select(num,                  1 ,                  4 ,                  1 ) )
443
overshoot   = default( overshoot,   Select(num,                  1 ,       strength/100 ,       strength/100 ) )
444
undershoot  = default( undershoot,  Select(num,          overshoot ,          overshoot ,          overshoot ) )
445
overshoot2  = default( overshoot2,  Select(num,        overshoot*2 ,        overshoot*2 ,        overshoot*2 ) )
446
undershoot2 = default( undershoot2, Select(num,         overshoot2 ,         overshoot2 ,         overshoot2 ) )
447
448
soft        = default( soft,        Select(num,                  0 ,                 -2 ,                  0 ) )
449
soothe      = default( soothe,      Select(num,              false ,               true ,               true ) )
450
keep        = default( keep,        Select(num,                 25 ,                 20 ,                 20 ) )
451
452
edgemode    = default( edgemode,    Select(num,                  0 ,                  0 ,                  0 ) )
453
edgemaskHQ  = default( edgemaskHQ,  Select(num,               true ,               true ,              false ) )
454
455
ss_x        = default( ss_x,        Select(num, Smode==3?1.50:1.25 ,               1.50 ,               1.25 ) )
456
ss_y        = default( ss_y,        Select(num,               ss_x ,               ss_x ,               ss_x ) )
457
dest_x      = default( dest_x,      Select(num,                 ox ,                 ox ,                 ox ) )
458
dest_y      = default( dest_y,      Select(num,                 oy ,                 oy ,                 oy ) )
459
460
show        = default( show,        Select(num,              false ,              false ,              false ) )
461
screenW     = default( screenW,     Select(num,               1280 ,               1280 ,               1280 ) )
462
screenH     = default( screenH,     Select(num,               1024 ,               1024 ,               1024 ) )
463
464
Assert(!isRGB(inclip), chr(10) + "LSFmod: not work with an RGB clip !" + chr(10))
465
Assert( ( strength >= 0 )                                                ? true : false, chr(10) + "'strength' have not a correct value! [>=0]" + chr(10))
466
Assert( ( Smode >= 1 && Smode <= 5 )                                     ? true : false, chr(10) + "'Smode' have not a correct value! [1,2,3,4,5]" + chr(10))
467
Assert( ( Smethod >= 1 && Smethod <= 4 )                                 ? true : false, chr(10) + "'Smethod' have not a correct value! [1,2,3,4]" + chr(10))
468
Assert( ( kernel == 19 || kernel == 20 || kernel == 11 || kernel == 12 ) ? true : false, chr(10) + "'kernel' have not a correct value! [19,20,11,12]" + chr(10))
469
Assert( ( Szrp >= 1 && Szrp <= 255 )                                     ? true : false, chr(10) + "'Szrp' have not a correct value! [1...255]" + chr(10))
470
Assert( ( Spwr >= 1 )                                                    ? true : false, chr(10) + "'Spwr' have not a correct value! [>=1]" + chr(10))
471
Assert( ( SdmpLo >= 0 && SdmpLo <= 255 )                                 ? true : false, chr(10) + "'SdmpLo' have not a correct value! [0...255]" + chr(10))
472
Assert( ( SdmpHi >= 0 && SdmpHi <= 255 )                                 ? true : false, chr(10) + "'SdmpHi' have not a correct value! [0...255]" + chr(10))
473
Assert( ( Lmode <= 4 )                                                   ? true : false, chr(10) + "'Lmode' have not a correct value! [...-1,0,1,2,3,4]" + chr(10))
474
Assert( ( overshoot >= 0 && overshoot <= 255 )                           ? true : false, chr(10) + "'overshoot' have not a correct value! [0...255]" + chr(10))
475
Assert( ( undershoot >= 0 && undershoot <= 255 )                         ? true : false, chr(10) + "'undershoot' have not a correct value! [0...255]" + chr(10))
476
Assert( ( overshoot2 >= 0 && overshoot2 <= 255 )                         ? true : false, chr(10) + "'overshoot2' have not a correct value! [0...255]" + chr(10))
477
Assert( ( undershoot2 >= 0 && undershoot2 <= 255 )                       ? true : false, chr(10) + "'undershoot2' have not a correct value! [0...255]" + chr(10))
478
Assert( ( soft >= -2 && soft <= 100 )                                    ? true : false, chr(10) + "'soft' have not a correct value! [-2,-1,0,1...100]" + chr(10))
479
Assert( ( keep >= 0 && keep <= 100 )                                     ? true : false, chr(10) + "'keep' have not a correct value! [0...100]" + chr(10))
480
Assert( ( edgemode >= -1 && edgemode <= 2 )                              ? true : false, chr(10) + "'edgemode' have not a correct value! [-1,0,1,2]" + chr(10))
481
Assert( ( ss_x >= 1.0 )                                                  ? true : false, chr(10) + "'ss_x' have not a correct value! [>=1.0]" + chr(10))
482
Assert( ( ss_y >= 1.0 )                                                  ? true : false, chr(10) + "'ss_y' have not a correct value! [>=1.0]" + chr(10))
483
484
soft = soft!=-1  ? soft : sqrt( (((ss_x+ss_y)/2.0-1.0)*100.0) ) * 10
485
soft = soft!=-2  ? soft : int( (1.0+(2.0/(ss_x+ss_y))) * sqrt(strength) )
486
soft = soft<=100 ? soft : 100
487
488
xxs  = round(ox*ss_x/8)*8
489
yys  = round(oy*ss_y/8)*8
490
491
str  = float(strength)/100.0
492
493
sisyuy2 = inclip.isyuy2()
494
495
sisavs26 = !(VersionNumber() < 2.6)
496-
sislumaonly = sisphbd ? inclip.isy() : VersionNumber() < 2.6 ? true : inclip.isy8()
496+
497
sisupscale = (dest_x != ox || dest_y != oy)
498
499
inclip = !sisupscale && sisyuy2 && sisphbd ? inclip.converttoyv16() : inclip
500-
input = defined(source) && !sisupscale ? input.pointresize(width(input),height(input)+8,0,-4,width(input),height(input)+8.0001) : input
500+
501
sislumaonly = sisphbd ? inclip.isy() : sisavs26 ? inclip.isy8() : true
502-
source = defined(source) ? sisupscale || sislumaonly ? source : sisphbd ? source.converttoy() : source.converttoy8() : source
502+
503
input = sisupscale || sislumaonly ? inclip : sisphbd ? inclip.converttoy() : inclip.converttoy8()
504-
source = defined(source) && !sisupscale ? source.pointresize(width(source),height(source)+8,0,-4,width(source),height(source)+8.0001) : source
504+
505
sode  = defined(source)
506-
Assert(!isYUY2(input), chr(10) + "not work with an YUY2 clip !" + chr(10))
506+
507
source = sode ? sisupscale || sislumaonly ? source : sisphbd ? source.converttoy() : source.converttoy8() : source
508
509
Assert(!isYUY2(input), chr(10) + "LSFmod: not work with an YUY2 clip !" + chr(10))
510
511-
\    : preblur=="ON"  ? VersionNumber() < 2.6 ? tmp.mt_makediff( mt_lutxy(mt_makediff(tmp,tmp.removegrain(11,-1),U=1,V=1)
511+
512
tmp  = ss_x > 1.0 || ss_y > 1.0 ? input.spline36resize(xxs,yys) : input
513
pre  = preblur=="OFF" ? tmp
514-
					      : tmp.mt_makediff( mt_lutxy(mt_makediff(tmp,tmp.removegrain(11,-1),U=1,V=1)
514+
\    : preblur=="ON"  ? !sisavs26 ? tmp.mt_makediff( mt_lutxy(mt_makediff(tmp,tmp.removegrain(11,-1),U=1,V=1)
515
\                                       			,mt_makediff(tmp,tmp.removegrain(4,-1),U=1,V=1)
516
\                                       			,"x 128 - y 128 - * 0 < 128 x 128 - abs y 128 - abs < x y ? ?",U=1,V=1) ,U=1,V=1) \
517
				  : tmp.mt_makediff( mt_lutxy(mt_makediff(tmp,tmp.removegrain(11,-1),U=1,V=1)
518
\                                       			,mt_makediff(tmp,tmp.removegrain(4,-1),U=1,V=1)
519
\                                       			,"x range_half - y range_half - * 0 < range_half x range_half - abs y range_half - abs < x y ? ?",use_expr=2,U=1,V=1) ,U=1,V=1)
520
\    : eval("tmp."+preblur)
521
522
dark_limit   = pre.mt_inpand(U=1,V=1)
523
bright_limit = pre.mt_expand(U=1,V=1)
524
minmaxavg    = mt_average(dark_limit,bright_limit,U=1,V=1)
525
526
method = Smethod==1   ? pre.removegrain(kernel,-1)
527-
method = secure==true ? VersionNumber() < 2.6 ? method.mt_lutxy(pre,"x y < x 1 + x y > x 1 - x ? ?",U=1,V=1) \
527+
528-
					      : method.mt_lutxy(pre,"x y < x 1 scalef + x y > x 1 scalef - x ? ?",use_expr=2,U=1,V=1)
528+
529
530
method = secure==true ? !sisavs26 ? method.mt_lutxy(pre,"x y < x 1 + x y > x 1 - x ? ?",U=1,V=1) \
531
				  : method.mt_lutxy(pre,"x y < x 1 scalef + x y > x 1 scalef - x ? ?",use_expr=2,U=1,V=1)
532
\      :                method
533
534
method = preblur=="OFF" ? method : tmp.mt_makediff(mt_makediff(pre,method,U=1,V=1),U=1,V=1)
535-
\         : Smode==3 ? VersionNumber() < 2.6 ? mt_lutxy(tmp, method, yexpr="x x y - "+string(str)+" * +",U=1,V=1) \
535+
536
normsharp = Smode==1 ? tmp.unsharpmask(strength=int(str*100),radius=round(1.0+((ss_x+ss_y)/2.0)),threshold=0)
537-
\         : Smode==4 ? VersionNumber() < 2.6 ? mt_lutxy(tmp, method, yexpr="x y == x x x y - abs "+string(Szrp)+" / 1 "+string(Spwr)+" / ^ "+string(Szrp)+" * "+string(str)+" * x y - 2 ^ x y - 2 ^ "
537+
538
\         : Smode==3 ? !sisavs26 ? mt_lutxy(tmp, method, yexpr="x x y - "+string(str)+" * +",U=1,V=1) \
539-
					     : mt_lutxy(tmp, method, yexpr="x y == x x x y - abs "+string(Szrp) +" scalef / 1 "+string(Spwr)+" / ^ "+string(Szrp) +" scalef * "+string(str)+" * x y - 2 ^ x y - 2 ^ "
539+
540
\         : Smode==4 ? !sisavs26 ? mt_lutxy(tmp, method, yexpr="x y == x x x y - abs "+string(Szrp)+" / 1 "+string(Spwr)+" / ^ "+string(Szrp)+" * "+string(str)+" * x y - 2 ^ x y - 2 ^ "
541-
\         :            VersionNumber() < 2.6 ? mt_lutxy(tmp, method, yexpr="x y == x x x y - abs "+string(Szrp)+" / 1 "+string(Spwr)+" / ^ "+string(Szrp)+" * "+string(str)+" * x y - x y - abs / * x y - 2 ^ "
541+
542
				 : mt_lutxy(tmp, method, yexpr="x y == x x x y - abs "+string(Szrp) +" scalef / 1 "+string(Spwr)+" / ^ "+string(Szrp) +" scalef * "+string(str)+" * x y - 2 ^ x y - 2 ^ "
543
\                                                   			    +string(SdmpLo)+" scalef scalef + / * x y - x y - abs / * 1 "+string(SdmpHi)+" scalef 0 == 0 x y - abs "+string(SdmpHi)+" scalef / 4 ^ ? + / + ?",use_expr=2,U=1,V=1)
544-
					     : mt_lutxy(tmp, method, yexpr="x y == x x x y - abs "+string(Szrp)+" / 1 "+string(Spwr)+" / ^ "+string(Szrp)+" * "+string(str)+" * x y - x y - abs / * x y - 2 ^ "
544+
\         :            !sisavs26 ? mt_lutxy(tmp, method, yexpr="x y == x x x y - abs "+string(Szrp)+" / 1 "+string(Spwr)+" / ^ "+string(Szrp)+" * "+string(str)+" * x y - x y - abs / * x y - 2 ^ "
545
\                                                   			    +string(Szrp)+" 2 ^ "+string(SdmpLo)+" + * x y - 2 ^ "+string(SdmpLo)+" + "+string(Szrp)+" 2 ^ * / * 1 "
546
\                                                   			    +string(SdmpHi)+" 0 == 0 "+string(Szrp)+" "+string(SdmpHi)+" / 4 ^ ? + 1 "+string(SdmpHi)+" 0 == 0 x y - abs "+string(SdmpHi)+" / 4 ^ ? + / * + ?",U=1,V=1) \
547
				 : mt_lutxy(tmp, method, yexpr="x y == x x x y - abs "+string(Szrp)+" / 1 "+string(Spwr)+" / ^ "+string(Szrp)+" * "+string(str)+" * x y - x y - abs / * x y - 2 ^ "
548
\                                                   			    +string(Szrp)+" 2 ^ "+string(SdmpLo)+" + * x y - 2 ^ "+string(SdmpLo)+" + "+string(Szrp)+" 2 ^ * / * 1 "
549
\                                                   			    +string(SdmpHi)+" 0 == 0 "+string(Szrp)+" "+string(SdmpHi)+" / 4 ^ ? + 1 "+string(SdmpHi)+" 0 == 0 x y - abs "+string(SdmpHi)+" / 4 ^ ? + / * + ?",U=1,V=1,use_expr=2,scale_inputs="allf")
550
551
552
### LIMIT
553
normal = mt_clamp(normsharp, bright_limit, dark_limit, overshoot,  undershoot,  U=1, V=1)
554
second = mt_clamp(normsharp, bright_limit, dark_limit, overshoot2, undershoot2, U=1, V=1)
555
zero   = mt_clamp(normsharp, bright_limit, dark_limit, 0,          0,           U=1, V=1)
556
557
edge  = edgemaskHQ ? mt_logic( tmp.mt_edge(thY1=0,thY2=255,"8 16 8 0 0 0 -8 -16 -8 4",U=1,V=1)
558
\                             ,tmp.mt_edge(thY1=0,thY2=255,"8 0 -8 16 0 -16 8 0 -8 4",U=1,V=1)
559-
edge  = edgemaskHQ ? VersionNumber() < 2.6 ? edge.mt_lut("x 128 / 0.86 ^ 255 *",U=1,V=1) \
559+
560-
					   : edge.mt_lut("x range_half / 0.86 ^ range_max *",use_expr=2,scale_inputs="floatf",U=1,V=1)
560+
561-
\     :              VersionNumber() < 2.6 ? edge.mt_lut("x 32 / 0.86 ^ range_max *",U=1,V=1) \
561+
562-
					   : edge.mt_lut("x 32 scalef / 0.86 ^ range_max *",use_expr=2,scale_inputs="floatf",U=1,V=1)
562+
edge  = edgemaskHQ ? !sisavs26 ? edge.mt_lut("x 128 / 0.86 ^ 255 *",U=1,V=1) \
563
			       : edge.mt_lut("x range_half / 0.86 ^ range_max *",use_expr=2,scale_inputs="floatf",U=1,V=1)
564
\     :              !sisavs26 ? edge.mt_lut("x 32 / 0.86 ^ range_max *",U=1,V=1) \
565
			       : edge.mt_lut("x 32 scalef / 0.86 ^ range_max *",use_expr=2,scale_inputs="floatf",U=1,V=1)
566
567
limit1 = Lmode<0  ? normsharp.repair(tmp,abs(Lmode),-1)
568
\      : Lmode==0 ? normsharp
569
\      : Lmode==1 ? normal
570
\      : Lmode==2 ? mt_merge(normsharp, normal, edge.mt_inflate(U=1,V=1), U=1, V=1)
571
\      : Lmode==3 ? mt_merge(normal,    zero,   edge.mt_inflate(U=1,V=1), U=1, V=1) 
572
\      :            mt_merge(second,    normal, edge.mt_inflate(U=1,V=1), U=1, V=1)
573
574
limit2 = edgemode==0 ? limit1
575
\      : edgemode==1 ? mt_merge(tmp,limit1,edge.mt_inflate(U=1,V=1).mt_inflate(U=1,V=1).removegrain(11,-1),U=1,V=1)
576
\      :               mt_merge(limit1,tmp,edge.mt_inflate(U=1,V=1).mt_inflate(U=1,V=1).removegrain(11,-1),U=1,V=1)
577
578-
sharpdiff = VersionNumber() < 2.6 ? mt_lutxy(sharpdiff,sharpdiff.removegrain(19,-1),
578+
579
### SOFT
580-
				  : mt_lutxy(sharpdiff,sharpdiff.removegrain(19,-1),
580+
581
sharpdiff = !sisavs26 ? mt_lutxy(sharpdiff,sharpdiff.removegrain(19,-1),
582
\                    			     "x 128 - abs y 128 - abs > y "+string(soft)+" * x "+string(100-soft)+" * + 100 / x ?",U=1,V=1) \
583
		      : mt_lutxy(sharpdiff,sharpdiff.removegrain(19,-1),
584
\                    			     "x range_half - abs y range_half - abs > y "+string(soft)+" * x "+string(100-soft)+" * + 100 / x ?",use_expr=2,clamp_float=true,U=1,V=1)
585
586
PP1 = soft==0 ? limit2 : mt_makediff(tmp,sharpdiff,U=1,V=1)
587
588
589-
diff3 = VersionNumber() < 2.6 ? mt_lutxy(diff,diff2,"x 128 - y 128 - * 0 < x 128 - 100 / "+string(keep)+
589+
590
diff  = mt_makediff(tmp,PP1,U=1,V=1)
591-
			      : mt_lutxy(diff,diff2,"x range_half - y range_half - * 0 < x range_half - 100 / "+string(keep)+
591+
592
diff3 = !sisavs26 ? mt_lutxy(diff,diff2,"x 128 - y 128 - * 0 < x 128 - 100 / "+string(keep)+
593
\                           			    " * 128 + x 128 - abs y 128 - abs > x "+string(keep)+" * y 100 "+string(keep)+" - * + 100 / x ? ?",U=1,V=1) \
594
		  : mt_lutxy(diff,diff2,"x range_half - y range_half - * 0 < x range_half - 100 / "+string(keep)+
595
\                           			    " * range_half + x range_half - abs y range_half - abs > x "+string(keep)+" * y 100 "+string(keep)+" - * + 100 / x ? ?",use_expr=2,clamp_float=true,U=1,V=1)
596
597
PP2 = soothe ? mt_makediff(tmp,diff3,U=1,V=1) : PP1
598
599-
\   : (ss_x > 1.0 || ss_y > 1.0)     ? input.mergeluma(PP2.spline36resize(dest_x,dest_y))
599+
600-
\   :                                  input.mergeluma(PP2)
600+
601
out = sisupscale ? tmp.mergeluma(PP2).spline36resize(dest_x,dest_y)
602-
src = defined(source)==false         ? nop()
602+
\   : (ss_x > 1.0 || ss_y > 1.0)     ? sisavs26 ? PP2.spline36resize(dest_x,dest_y) : input.mergeluma(PP2.spline36resize(dest_x,dest_y))
603
\   :                                  sisavs26 ? PP2 : input.mergeluma(PP2)
604
605
src = !sode      ? nop()
606
\   : sisupscale ? source.spline36resize(dest_x,dest_y)
607
\   :                                  source
608
in  = sisupscale ? input.spline36resize(dest_x,dest_y)
609-
shrpL  = defined(source) ? VersionNumber() < 2.6 ? shrpD.repair(mt_makediff(in,src,U=1,V=1),1,-1,-1).mt_lutxy(shrpD,"x 128 - abs y 128 - abs < x y ?",U=1,V=1) \
609+
610-
			       : shrpD.repair(mt_makediff(in,src,U=1,V=1),1,-1,-1).mt_lutxy(shrpD,"x range_half - abs y range_half - abs < x y ?",use_expr=1,U=1,V=1) : nop()
610+
611-
output = defined(source) ? mt_makediff(in,shrpL,U=2,V=2)
611+
612
shrpL  = sode ? !sisavs26 ? shrpD.Padding(4,4,4,4).repair(mt_makediff(in,src,U=1,V=1).Padding(4,4,4,4),1,-1,-1).crop(4,4,-4,-4,true).mt_lutxy(shrpD,"x 128 - abs y 128 - abs < x y ?",U=1,V=1) \
613
			  : shrpD.Padding(4,4,4,4).repair(mt_makediff(in,src,U=1,V=1).Padding(4,4,4,4),1,-1,-1).crop(4,4,-4,-4,true).mt_lutxy(shrpD,"x range_half - abs y range_half - abs < x y ?",use_expr=1,U=1,V=1) : nop()
614
output = sode ? mt_makediff(in,shrpL,U=2,V=2)
615-
\      :                   edge.spline36resize(dest_x,dest_y).greyscale()
615+
616
617
output = edgemode!=-1    ? output
618
\      :                   sisavs26 && !sisupscale ? edge.spline36resize(dest_x,dest_y) : edge.spline36resize(dest_x,dest_y).greyscale()
619
620
621
### SHOW
622
   function LSFM_Show(clip input, clip output, string "version", string "defaults",
623
   \                  float "strength", int "Smode", int "Smethod", int "kernel",
624
   \                  string "preblur", bool "secure", string "source",
625
   \                  int "Szrp", int "Spwr", float "SdmpLo", float "SdmpHi",
626
   \                  int "Lmode", int "overshoot", int "undershoot", int "overshoot2", int "undershoot2",
627
   \                  int "soft", bool "soothe", int "keep",
628
   \                  int "edgemode", bool "edgemaskHQ",
629
   \                  float "ss_x", float "ss_y", int "dest_x", int "dest_y",
630
   \                  bool "show", int "screenW", int "screenH")
631
   {
632
   resoW = screenW - 384
633
   resoH = screenH
634
635
   inW   = input.width()
636
   inH   = input.height()
637
   outW  = round( resoW / 4 ) * 4
638
   outH  = round( (outW * inH) / (4 * inW) ) * 4
639-
   i = scale > 0 ? i.addborders(0,scale/4,0,scale/4) : i
639+
640-
   i = scale < 0 ? i.crop(0,-scale/4,0,scale/4) : i
640+
641
   i = input.spline36resize(outW,outH)
642
   i = scale > 0 ? i.addborders(0,scale/4,0,scale/4,true) : i
643-
   o = scale > 0 ? o.addborders(0,scale/4,0,scale/4) : o
643+
   i = scale < 0 ? i.crop(0,-scale/4,0,scale/4,true) : i
644-
   o = scale < 0 ? o.crop(0,-scale/4,0,scale/4) : o
644+
645
   o = output.spline36resize(outW,outH)
646
   o = scale > 0 ? o.addborders(0,scale/4,0,scale/4,true) : o
647
   o = scale < 0 ? o.crop(0,-scale/4,0,scale/4,true) : o
648
649
   e = blankclip(input, width=384, height=resoH)
650
   e = e.SubTitle("LSFmod " + string(version)                ,text_color=$FFFFFF,font="COURIER NEW",size=24,x=40,y=40)
651
   e = e.SubTitle("DEFAULTS      = " + string(defaults)      ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=100)
652
653
   e = e.SubTitle("GENERAL:"                                 ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=150)
654
   e = e.SubTitle("--------"                                 ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=160)
655
   e = e.SubTitle("strength      = " + string(strength)      ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=180)
656
   e = e.SubTitle("Smode         = " + string(Smode)         ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=190)
657
   e = e.SubTitle("Smethod       = " + string(Smethod)       ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=200)
658
   e = e.SubTitle("kernel        = " + string(kernel)        ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=210)
659
660
   e = e.SubTitle("SPECIAL:"                                 ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=250)
661
   e = e.SubTitle("--------"                                 ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=260)
662
   e = e.SubTitle("preblur       = " + string(preblur)       ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=280)
663
   e = e.SubTitle("secure        = " + string(secure)        ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=290)
664
   e = e.SubTitle("source        = " + string(source)        ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=300)
665
666
   e = e.SubTitle("NONLINEAR SHARPENING:"                    ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=340)
667
   e = e.SubTitle("---------------------"                    ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=350)
668
   e = e.SubTitle("Szrp          = " + string(Szrp)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=370)
669
   e = e.SubTitle("Spwr          = " + string(Spwr)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=380)
670
   e = e.SubTitle("SdmpLo        = " + string(SdmpLo)        ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=390)
671
   e = e.SubTitle("SdmpHi        = " + string(SdmpHi)        ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=400)
672
673
   e = e.SubTitle("LIMITING:"                                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=440)
674
   e = e.SubTitle("---------"                                ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=450)
675
   e = e.SubTitle("Lmode         = " + string(Lmode)         ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=470)
676
   e = e.SubTitle("overshoot     = " + string(overshoot)     ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=480)
677
   e = e.SubTitle("undershoot    = " + string(undershoot)    ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=490)
678
   e = e.SubTitle("overshoot2    = " + string(overshoot2)    ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=500)
679
   e = e.SubTitle("undershoot2   = " + string(undershoot2)   ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=510)
680
681
   e = e.SubTitle("POST-PROCESSING:"                         ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=550)
682
   e = e.SubTitle("----------------"                         ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=560)
683
   e = e.SubTitle("soft          = " + string(soft)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=580)
684
   e = e.SubTitle("soothe        = " + string(soothe)        ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=590)
685
   e = e.SubTitle("keep          = " + string(keep)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=600)
686
687
   e = e.SubTitle("EDGES:"                                   ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=640)
688
   e = e.SubTitle("------"                                   ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=650)
689
   e = e.SubTitle("edgemode      = " + string(edgemode)      ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=670)
690
   e = e.SubTitle("edgemaskHQ    = " + string(edgemaskHQ)    ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=680)
691
692
   e = e.SubTitle("UPSAMPLING:"                              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=720)
693
   e = e.SubTitle("-----------"                              ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=730)
694
   e = e.SubTitle("ss_x          = " + string(ss_x)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=750)
695
   e = e.SubTitle("ss_y          = " + string(ss_y)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=760)
696
   e = e.SubTitle("dest_x        = " + string(dest_x)        ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=770)
697
   e = e.SubTitle("dest_y        = " + string(dest_y)        ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=780)
698
699
   e = e.SubTitle("DEBUG:"                                   ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=820)
700
   e = e.SubTitle("------"                                   ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=830)
701
   e = e.SubTitle("show          = " + string(show)          ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=850)
702
   e = e.SubTitle("screenW       = " + string(screenW)       ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=860)
703
   e = e.SubTitle("screenH       = " + string(screenH)       ,text_color=$FFFFFF,font="COURIER NEW",size=12,x=40,y=870)
704
705
   debug = stackhorizontal( e ,
706
   \                        stackvertical( i.subtitle("Input",text_color=$FFFFFF,size=20,x=40,y=20) ,
707
   \                                       o.subtitle("Output",text_color=$FFFFFF,size=20,x=40,y=20) )
708
   \                      )
709
710-
output = defined(source) ? output.crop(0,4,-0,-4) : output
710+
711
   }
712
713
output = sisupscale || sislumaonly ? output : sisphbd ? CombinePlanes(output,inclip,planes="YUV",sample_clip=inclip) : ytouv(inclip.utoy8(),inclip.vtoy8(),output)
714
715
output = show==false ? output
716
\                    : LSFM_Show(inclip, output, version, defaults,
717-
\                                preblur, secure, defined(source)?"defined":"undefined",
717+
718
\                                preblur, secure, sode?"defined":"undefined",
719
\                                Szrp, Spwr, SdmpLo, SdmpHi,
720
\                                Lmode, overshoot, undershoot, overshoot2, undershoot2,
721
\                                soft, soothe, keep,
722
\                                edgemode, edgemaskHQ,
723
\                                ss_x, ss_y, dest_x, dest_y,
724
\                                show, screenW, screenH)
725
726
output = sisyuy2 ? output.converttoyuy2() : output
727
728
return output
729
}