View Full Version : CTools
Ceppo
11th February 2022, 17:30
GitHub:
https://github.com/CeppoTools/CTools
GitHub Release:
https://github.com/CeppoTools/CTools/releases/tag/v1.2.2
I'm not a programmer, so advices are gladly accepted.
CQTGMC needs:
rgTools.dll
masktools2.dll
mvtools2.dll
needi3.dll
### DEINTERLACER ###
# CQTGMC by Ceppo
# v1.0.0 first public release
# This function is an attempt to emulate QTGMC while retaining more details, removing more shimmering with as less blending as possible.
# PARAMETERS:
# Sharpeness (0.25): sharpening filter strength. Higher values give more sharpening.
# thSAD1: deshimmering strength, higher value give less shimmering, while lower values less blending.
# thSAD2: deshimmering strength in search clip, if you get combed pixels you may want to lower this and increase thSAD1.
# thSAD3: strength for restoring progressive content, if you get combed pixels you may want to lower this.
# thSAD3: MCompensate's thSAD for the sharpening filter limiter.
function CQTGMC(clip input, float "Sharpness", int "thSAD1", int "thSAD2", int "thSAD3", int "thSAD4")
{
thSAD1 = default(thSAD1, 192)
thSAD2 = default(thSAD2, 320)
thSAD3 = default(thSAD3, 128)
thSAD4 = default(thSAD4, 320)
Sharpness = default(Sharpness, 0.25)
padded = StackHorizontal(input,input.FlipHorizontal()).Crop(0,0,input.width()+input.width()%64,0)
padded = StackVertical(padded,padded.FlipVertical()).Crop(0,0,0,input.height()+input.height()%64)
bobbed = padded.nnedi3(-2)
bobbed
RemoveGrain(12)
GaussResize(width(),height(),0,0,width()+0.0001,height()+0.0001,p=2)
Merge(bobbed,0.25)
srchClip = last
super = MSuper()
bvec = MAnalyse(super,isb=true,blksize=64,overlap=32)
fvec = MAnalyse(super,isb=false,blksize=64,overlap=32)
Comp1 = MCompensate(super,bvec,thSAD=thSAD2)
Comp2 = MCompensate(super,fvec,thSAD=thSAD2)
Interleave(Comp1,last,Comp2)
super = MSuper()
bvec = MAnalyse(super,isb=true,blksize=64,overlap=32)
fvec = MAnalyse(super,isb=false,blksize=64,overlap=32)
Inter = MFlowInter(super,bvec,fvec,blend=false)
global CQTGMC_A = Inter.SelectEvery(3,0)
global CQTGMC_B = Inter.SelectEvery(3,1)
srchClip
ScriptClip("""
P = YDifferenceFromPrevious()
N = Trim(1,0).YDifferenceFromPrevious()
N < P ? CQTGMC_A : CQTGMC_B
""")
super = MSuper()
bVec1 = MAnalyse(super,isb=true,overlap=4,delta=1)
fVec1 = MAnalyse(super,isb=false,overlap=4,delta=1)
bVec2 = MAnalyse(super,isb=true,overlap=4,delta=2)
fVec2 = MAnalyse(super,isb=false,overlap=4,delta=2)
bVec3 = MAnalyse(super,isb=true,overlap=4,delta=3)
fVec3 = MAnalyse(super,isb=false,overlap=4,delta=3)
bobbed
super = MSuper(levels=1)
bComp1 = MCompensate(super,bVec1,thSAD=thSAD3)
fComp1 = MCompensate(super,fVec1,thSAD=thSAD3)
Interleave(\
SeparateFields(bobbed).SelectEvery(4,0),\
SeparateFields(fComp1).SelectEvery(4,1),\
SeparateFields(bComp1).SelectEvery(4,2),\
SeparateFields(bobbed).SelectEvery(4,3))
Weave()
super = MSuper(levels=1)
bComp1 = MCompensate(super, bVec1,thSAD=thSAD4)
fComp1 = MCompensate(super, fVec1,thSAD=thSAD4)
tMax = mt_logic(fComp1,"max",U=3,V=3).mt_logic(bComp1,"max",U=3,V=3)
tMin = mt_logic(fComp1,"min",U=3,V=3).mt_logic(bComp1,"min",U=3,V=3)
bComp3 = MCompensate(super,bVec3,thSAD=thSAD4)
fComp3 = MCompensate(super,fVec3,thSAD=thSAD4)
tMax = tMax.mt_logic(fComp3,"max", U=3,V=3 ).mt_logic(bComp3,"max", U=3,V=3 )
tMin = tMin.mt_logic(fComp3,"min", U=3,V=3 ).mt_logic(bComp3,"min", U=3,V=3 )
MDegrain3(super,bVec1,fVec1,bVec2,fVec2,bVec3,fVec3,thSAD=thSAD1)
sharpen = mt_adddiff(mt_makediff(Removegrain(20),u=3,v=3),u=3,v=3)
mt_clamp(sharpen,tMax,tMin,Sharpness,Sharpness,3,3,3)
super = MSuper(levels=1)
MDegrain3(super,bVec1,fVec1,bVec2,fVec2,bVec3,fVec3,thSAD=thSAD1)
Crop(0,0,-(input.width()%64),-(input.height()%64))
return last
}
New version needs also TDeint. x2 speed.
### DEINTERLACER ###
# CQTGMC by Ceppo
# v1.0.1
# - Added TDeint for search clip.
# - Changed MDegrain3 to MDegrain1 for speed.
# v1.0.0 first public release
#
# This function is an attempt to emulate QTGMC while retaining more details, removing more shimmering with as less blending as possible.
# PARAMETERS:
# Sharpeness (0.25): sharpening filter strength. Higher values give more sharpening.
# thSAD1: deshimmering strength, higher value give less shimmering, while lower values less blending.
# thSAD2: deshimmering strength in search clip, if you get combed pixels you may want to lower this and increase thSAD1.
# thSAD3: strength for restoring progressive content, if you get combed pixels you may want to lower this.
# thSAD3: MCompensate's thSAD for the sharpening filter limiter.
function CQTGMC(clip input, float "Sharpness", int "thSAD1", int "thSAD2", int "thSAD3", int "thSAD4")
{
thSAD1 = default(thSAD1, 192)
thSAD2 = default(thSAD2, 320)
thSAD3 = default(thSAD3, 128)
thSAD4 = default(thSAD4, 320)
Sharpness = default(Sharpness, 0.25)
padded = StackHorizontal(input,input.FlipHorizontal()).Crop(0,0,input.width()+input.width()%64,0)
padded = StackVertical(padded,padded.FlipVertical()).Crop(0,0,0,input.height()+input.height()%64)
bobbed = padded.nnedi3(-2)
padded
TDeint(mode=1,sharp=false,tryWeave=true,edeint=bobbed)
RemoveGrain(12).GaussResize(width(),height(),0,0,width()+0.0001,height()+0.0001,p=2).Merge(last,0.25)
srchClip = last
super = MSuper()
bvec = MAnalyse(super,isb=true,blksize=64,overlap=32)
fvec = MAnalyse(super,isb=false,blksize=64,overlap=32)
Comp1 = MCompensate(super,bvec,thSAD=thSAD2)
Comp2 = MCompensate(super,fvec,thSAD=thSAD2)
Interleave(Comp1,last,Comp2)
super = MSuper()
bvec = MAnalyse(super,isb=true,blksize=64,overlap=32)
fvec = MAnalyse(super,isb=false,blksize=64,overlap=32)
Inter = MFlowInter(super,bvec,fvec,blend=false)
global CQTGMC_A = Inter.SelectEvery(3,0)
global CQTGMC_B = Inter.SelectEvery(3,1)
srchClip
ScriptClip("""
P = YDifferenceFromPrevious()
N = Trim(1,0).YDifferenceFromPrevious()
N < P ? CQTGMC_A : CQTGMC_B
""")
super = MSuper()
bVec1 = MAnalyse(super,isb=true,overlap=4,delta=1)
fVec1 = MAnalyse(super,isb=false,overlap=4,delta=1)
bobbed
super = MSuper(levels=1)
bComp1 = MCompensate(super,bVec1,thSAD=thSAD3)
fComp1 = MCompensate(super,fVec1,thSAD=thSAD3)
Interleave(\
SeparateFields(bobbed).SelectEvery(4,0),\
SeparateFields(fComp1).SelectEvery(4,1),\
SeparateFields(bComp1).SelectEvery(4,2),\
SeparateFields(bobbed).SelectEvery(4,3))
Weave()
super = MSuper(levels=1)
bComp1 = MCompensate(super, bVec1,thSAD=thSAD4)
fComp1 = MCompensate(super, fVec1,thSAD=thSAD4)
tMax = mt_logic(fComp1,"max",U=3,V=3).mt_logic(bComp1,"max",U=3,V=3)
tMin = mt_logic(fComp1,"min",U=3,V=3).mt_logic(bComp1,"min",U=3,V=3)
MDegrain1(super,bVec1,fVec1,thSAD=thSAD1)
sharpen = mt_adddiff(mt_makediff(Removegrain(20),u=3,v=3),u=3,v=3)
mt_clamp(sharpen,tMax,tMin,Sharpness,Sharpness,3,3,3)
super = MSuper(levels=1)
MDegrain1(super,bVec1,fVec1,thSAD=thSAD1)
Crop(0,0,-(input.width()%64),-(input.height()%64))
return last
}
real.finder
11th February 2022, 21:20
thanks, so this is like an update for https://forum.doom9.org/showthread.php?p=1935471 ?
it will be nice if it can deal with cases like https://github.com/pinterf/TIVTC/issues/26 and https://github.com/pinterf/TIVTC/issues/27
Ceppo
11th February 2022, 22:17
Yes, CTelecine2() is telecinebob() with a minor update.
About the rest (I gave a quick look since I'm going to sleep) I can try to mod CDecimate to output a VFR framerate and a VFR file. For the moire effect, I need a source to understand the problem since I never encountered it in my experience.
kedautinh12
11th February 2022, 22:47
Here have sample moirr effect, good luck
https://forum.doom9.org/showthread.php?p=1684203#post1684203
Will happy if you add more colors space and HBD :D
real.finder
11th February 2022, 23:16
For the moire effect, I need a source to understand the problem since I never encountered it in my experience.
Here have sample moirr effect, good luck
https://forum.doom9.org/showthread.php?p=1684203#post1684203
also https://www.mediafire.com/file/tob9n5emimto8o6/Moire_Test.m2v/file
Ceppo
12th February 2022, 14:43
On it!
Edit:
I did the VFR mod and I found a way to do the right field matching when there is the moire effect. I lost an hour tracking a bug. I hope to finish the testing tomorrow.
Ceppo
13th February 2022, 17:34
I added VFR and created CFieldDuplicate. In the ReadMe.txt you will see how to use it for the moire effect.
On real.finder linked source I got a constant pattern correctly.
It won't work on Anime due to the duplicates. But it should improve field matching on non-anime sources. If someone has a source to test it. Mine are all progressive.
real.finder
13th February 2022, 20:50
I added VFR and created CFieldDuplicate. In the ReadMe.txt you will see how to use it for the moire effect.
On real.finder linked source I got a constant pattern correctly.
It won't work on Anime due to the duplicates. But it should improve field matching on non-anime sources. If someone has a source to test it. Mine are all progressive.
thanks
I did try to get vfr from http://www.solidfiles.com/v/NVqK6xkYK7ANM
CTelecine(thr2=2,edeint2=QTGMC(),write=true)
#CDecimate(true)
then after doing analysis pass
CTelecine(thr2=2,edeint2=QTGMC(),inputtxt=true)
CDecimate(true)
but I get errors "CDecimate: cycle at frame 180..."
I did edit CTelecine.txt but no luck
Ceppo
13th February 2022, 20:52
Can you upload your source elsewhere? I can't load the site. Thanks.
real.finder
13th February 2022, 20:56
Can you upload your source elsewhere? I can't load the site. Thanks.
is this ok https://xfl.jp/E5n90r ?
Ceppo
13th February 2022, 21:06
Yes, I will check it right away.
Ceppo
13th February 2022, 21:52
With anime is a pain, however I did it until frame 1500
#1-pass
#~ CTelecine(write=true)
#2-pass
#~ CDuplicate(nt=0,write=true)
#3-pass
#Copy CDuplicate first 1206 frames and replace them in CTelecine.txt
#An euristic to fix the wrong field matching is to look at the previous pattern.
#~ CTelecine(thr2=6,edeint2=QTGMC().SelectEven(),inputTxt=true)
#~ CDecimate(true)
0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
0 10
0 11
0 12
0 13
0 14
0 15
0 16
0 17
0 18
0 19
0 20
0 21
0 22
0 23
0 24
0 25
0 26
0 27
0 28
0 29
0 30
0 31
0 32
0 33
0 34
0 35
0 36
0 37
0 38
0 39
0 40
0 41
0 42
0 43
0 44
0 45
0 46
0 47
0 48
0 49
0 50
0 51
0 52
0 53
0 54
0 55
0 56
0 57
0 58
0 59
0 60
0 61
0 62
0 63
0 64
0 65
0 66
0 67
0 68
0 69
0 70
0 71
0 72
0 73
0 74
0 75
0 76
0 77
0 78
0 79
0 80
0 81
0 82
0 83
0 84
0 85
0 86
0 87
0 88
0 89
0 90
0 91
0 92
0 93
0 94
0 95
0 96
0 97
0 98
0 99
0 100
0 101
0 102
0 103
0 104
0 105
0 106
0 107
0 108
0 109
0 110
0 111
0 112
0 113
0 114
0 115
0 116
0 117
0 118
0 119
0 120
0 121
0 122
0 123
0 124
0 125
0 126
0 127
0 128
0 129
0 130
0 131
0 132
0 133
0 134
0 135
0 136
0 137
0 138
0 139
0 140
0 141
0 142
0 143
0 144
0 145
0 146
0 147
0 148
0 149
0 150
0 151
0 152
0 153
0 154
0 155
0 156
0 157
0 158
0 159
0 160
0 161
0 162
0 163
0 164
0 165
0 166
0 167
0 168
0 169
0 170
0 171
0 172
0 173
0 174
0 175
0 176
0 177
0 178
0 179
0 180
0 181
0 182
0 183
0 184
0 185
0 186
0 187
0 188
0 189
0 190
0 191
0 192
0 193
0 194
0 195
0 196
0 197
0 198
0 199
0 200
0 201
0 202
0 203
0 204
0 205
0 206
0 207
0 208
0 209
0 210
0 211
0 212
0 213
0 214
0 215
0 216
0 217
0 218
0 219
0 220
0 221
0 222
0 223
0 224
0 225
0 226
0 227
0 228
0 229
0 230
0 231
0 232
0 233
0 234
0 235
0 236
0 237
0 238
0 239
0 240
0 241
0 242
0 243
0 244
0 245
0 246
0 247
0 248
0 249
0 250
0 251
0 252
0 253
0 254
0 255
0 256
0 257
0 258
0 259
0 260
0 261
0 262
0 263
0 264
0 265
0 266
0 267
0 268
0 269
0 270
0 271
0 272
0 273
0 274
0 275
0 276
0 277
0 278
0 279
0 280
0 281
0 282
0 283
0 284
0 285
0 286
0 287
0 288
0 289
0 290
0 291
0 292
0 293
0 294
0 295
0 296
0 297
0 298
0 299
0 300
0 301
0 302
0 303
0 304
0 305
0 306
0 307
0 308
0 309
0 310
0 311
0 312
0 313
0 314
0 315
0 316
0 317
0 318
0 319
0 320
0 321
0 322
0 323
0 324
0 325
0 326
0 327
0 328
0 329
0 330
0 331
0 332
0 333
0 334
0 335
0 336
0 337
0 338
0 339
0 340
0 341
0 342
0 343
0 344
0 345
0 346
0 347
0 348
0 349
0 350
0 351
0 352
0 353
0 354
0 355
0 356
0 357
0 358
0 359
0 360
0 361
0 362
0 363
0 364
0 365
0 366
0 367
0 368
0 369
0 370
0 371
0 372
0 373
0 374
0 375
0 376
0 377
0 378
0 379
0 380
0 381
0 382
0 383
0 384
0 385
0 386
0 387
0 388
0 389
0 390
0 391
0 392
0 393
0 394
0 395
0 396
0 397
0 398
0 399
0 400
0 401
0 402
0 403
0 404
0 405
0 406
0 407
0 408
0 409
0 410
0 411
0 412
0 413
0 414
0 415
0 416
0 417
0 418
0 419
0 420
0 421
0 422
0 423
0 424
0 425
0 426
0 427
0 428
0 429
0 430
0 431
0 432
0 433
0 434
0 435
0 436
0 437
0 438
0 439
0 440
0 441
0 442
0 443
0 444
0 445
0 446
0 447
0 448
0 449
0 450
0 451
0 452
0 453
0 454
0 455
0 456
0 457
0 458
0 459
0 460
0 461
0 462
0 463
0 464
0 465
0 466
0 467
0 468
0 469
0 470
0 471
0 472
0 473
0 474
0 475
0 476
0 477
0 478
0 479
0 480
0 481
0 482
0 483
0 484
0 485
0 486
0 487
0 488
0 489
0 490
0 491
0 492
0 493
0 494
0 495
0 496
0 497
0 498
0 499
0 500
0 501
0 502
0 503
0 504
0 505
0 506
0 507
0 508
0 509
0 510
0 511
0 512
0 513
0 514
0 515
0 516
0 517
0 518
0 519
0 520
0 521
0 522
0 523
0 524
0 525
0 526
0 527
0 528
0 529
0 530
0 531
0 532
0 533
0 534
0 535
0 536
0 537
0 538
0 539
0 540
0 541
0 542
0 543
0 544
0 545
0 546
0 547
0 548
0 549
0 550
0 551
0 552
0 553
0 554
0 555
0 556
0 557
0 558
0 559
0 560
0 561
0 562
0 563
0 564
0 565
0 566
0 567
0 568
0 569
0 570
0 571
0 572
0 573
0 574
0 575
0 576
0 577
0 578
0 579
0 580
0 581
0 582
0 583
0 584
0 585
0 586
0 587
0 588
0 589
0 590
0 591
0 592
0 593
0 594
0 595
0 596
0 597
0 598
0 599
0 600
0 601
0 602
0 603
0 604
0 605
0 606
0 607
0 608
0 609
0 610
0 611
0 612
0 613
0 614
0 615
0 616
0 617
0 618
0 619
0 620
0 621
0 622
0 623
0 624
0 625
0 626
0 627
0 628
0 629
0 630
0 631
0 632
0 633
0 634
0 635
0 636
0 637
0 638
0 639
0 640
0 641
0 642
0 643
0 644
0 645
0 646
0 647
0 648
0 649
0 650
0 651
0 652
0 653
0 654
0 655
0 656
0 657
0 658
0 659
0 660
0 661
0 662
0 663
0 664
0 665
0 666
0 667
0 668
0 669
0 670
0 671
0 672
0 673
0 674
0 675
0 676
0 677
0 678
0 679
0 680
0 681
0 682
0 683
0 684
0 685
0 686
0 687
0 688
0 689
0 690
0 691
0 692
0 693
0 694
0 695
0 696
0 697
0 698
0 699
0 700
0 701
0 702
0 703
0 704
0 705
0 706
0 707
0 708
0 709
0 710
0 711
0 712
0 713
0 714
0 715
0 716
0 717
0 718
0 719
0 720
0 721
0 722
0 723
0 724
0 725
0 726
0 727
0 728
0 729
0 730
0 731
0 732
0 733
0 734
0 735
0 736
0 737
0 738
0 739
0 740
0 741
0 742
0 743
0 744
0 745
0 746
0 747
0 748
0 749
0 750
0 751
0 752
0 753
0 754
0 755
0 756
0 757
0 758
0 759
0 760
0 761
0 762
0 763
0 764
0 765
0 766
0 767
0 768
0 769
0 770
0 771
0 772
0 773
0 774
0 775
0 776
0 777
0 778
0 779
0 780
0 781
0 782
0 783
0 784
0 785
0 786
0 787
0 788
0 789
0 790
0 791
0 792
0 793
0 794
0 795
0 796
0 797
0 798
0 799
0 800
0 801
0 802
0 803
0 804
0 805
0 806
0 807
0 808
0 809
0 810
0 811
0 812
0 813
0 814
0 815
0 816
0 817
0 818
0 819
0 820
0 821
0 822
0 823
0 824
0 825
0 826
0 827
0 828
0 829
0 830
0 831
0 832
0 833
0 834
0 835
0 836
0 837
0 838
0 839
0 840
0 841
0 842
0 843
0 844
0 845
0 846
0 847
0 848
0 849
0 850
0 851
0 852
0 853
0 854
0 855
0 856
0 857
0 858
0 859
0 860
0 861
0 862
0 863
0 864
0 865
0 866
0 867
0 868
0 869
0 870
0 871
0 872
0 873
0 874
0 875
0 876
0 877
0 878
0 879
0 880
0 881
0 882
0 883
0 884
0 885
0 886
0 887
0 888
0 889
0 890
0 891
0 892
0 893
0 894
0 895
0 896
0 897
0 898
0 899
0 900
0 901
0 902
0 903
0 904
0 905
0 906
0 907
0 908
0 909
0 910
0 911
0 912
0 913
0 914
0 915
0 916
0 917
0 918
0 919
0 920
0 921
0 922
0 923
0 924
0 925
0 926
0 927
0 928
0 929
0 930
0 931
0 932
0 933
0 934
0 935
0 936
0 937
0 938
0 939
0 940
0 941
0 942
0 943
0 944
0 945
0 946
0 947
0 948
0 949
0 950
0 951
0 952
0 953
0 954
0 955
0 956
0 957
0 958
0 959
0 960
0 961
0 962
0 963
0 964
0 965
0 966
0 967
0 968
0 969
0 970
0 971
0 972
0 973
0 974
0 975
0 976
0 977
0 978
0 979
0 980
0 981
0 982
0 983
0 984
0 985
0 986
0 987
0 988
0 989
0 990
0 991
0 992
0 993
0 994
0 995
0 996
0 997
0 998
0 999
0 1000
0 1001
0 1002
0 1003
0 1004
0 1005
0 1006
0 1007
0 1008
0 1009
0 1010
0 1011
0 1012
0 1013
0 1014
0 1015
0 1016
0 1017
0 1018
0 1019
0 1020
0 1021
0 1022
0 1023
0 1024
0 1025
0 1026
0 1027
0 1028
0 1029
0 1030
0 1031
0 1032
0 1033
0 1034
0 1035
0 1036
0 1037
0 1038
0 1039
0 1040
0 1041
0 1042
0 1043
0 1044
0 1045
0 1046
0 1047
0 1048
0 1049
0 1050
0 1051
0 1052
0 1053
0 1054
0 1055
0 1056
0 1057
0 1058
0 1059
0 1060
0 1061
0 1062
0 1063
0 1064
0 1065
0 1066
0 1067
0 1068
0 1069
0 1070
0 1071
0 1072
0 1073
0 1074
0 1075
0 1076
0 1077
0 1078
0 1079
0 1080
0 1081
0 1082
0 1083
0 1084
0 1085
0 1086
0 1087
0 1088
0 1089
0 1090
0 1091
0 1092
0 1093
0 1094
0 1095
0 1096
0 1097
0 1098
0 1099
0 1100
0 1101
0 1102
0 1103
0 1104
0 1105
0 1106
0 1107
0 1108
0 1109
0 1110
0 1111
0 1112
0 1113
0 1114
0 1115
0 1116
0 1117
0 1118
0 1119
0 1120
0 1121
0 1122
0 1123
0 1124
0 1125
0 1126
0 1127
0 1128
0 1129
0 1130
0 1131
0 1132
0 1133
0 1134
0 1135
0 1136
0 1137
0 1138
0 1139
0 1140
0 1141
0 1142
0 1143
0 1144
0 1145
0 1146
0 1147
0 1148
0 1149
0 1150
0 1151
0 1152
0 1153
0 1154
0 1155
0 1156
0 1157
0 1158
0 1159
0 1160
0 1161
0 1162
0 1163
0 1164
0 1165
0 1166
0 1167
0 1168
0 1169
0 1170
0 1171
0 1172
0 1173
0 1174
0 1175
0 1176
0 1177
0 1178
0 1179
0 1180
0 1181
0 1182
0 1183
0 1184
0 1185
0 1186
0 1187
0 1188
0 1189
0 1190
0 1191
0 1192
0 1193
0 1194
0 1195
0 1196
0 1197
0 1198
0 1199
0 1200
0 1201
0 1202
0 1203
0 1204
0 1205
0 1206
0 1207
1 1208
1 1209
0 1210
0 1211
1 1212
1 1213
0 1214
0 1215
0 1216
0 1217
1 1218
1 1219
0 1220
0 1221
0 1222
1 1223
1 1224
0 1225
0 1226
0 1227
1 1228
1 1229
0 1230
0 1231
0 1232
1 1233
1 1234
0 1235
0 1236
0 1237
1 1238
1 1239
0 1240
0 1241
0 1242
1 1243
1 1244
0 1245
0 1246
0 1247
1 1248
1 1249
0 1250
0 1251
0 1252
1 1253
1 1254
0 1255
0 1256
0 1257
1 1258
1 1259
0 1260
0 1261
0 1262
1 1263
1 1264
0 1265
0 1266
0 1267
1 1268
1 1269
0 1270
0 1271
0 1272
1 1273
1 1274
0 1275
0 1276
0 1277
1 1278
1 1279
0 1280
0 1281
0 1282
1 1283
1 1284
0 1285
0 1286
0 1287
1 1288
1 1289
0 1290
0 1291
0 1292
1 1293
1 1294
0 1295
0 1296
0 1297
1 1298
1 1299
0 1300
0 1301
0 1302
1 1303
1 1304
0 1305
0 1306
0 1307
1 1308
1 1309
0 1310
0 1311
0 1312
1 1313
1 1314
0 1315
0 1316
0 1317
1 1318
1 1319
0 1320
0 1321
0 1322
1 1323
1 1324
0 1325
0 1326
0 1327
1 1328
1 1329
0 1330
0 1331
0 1332
1 1333
1 1334
0 1335
0 1336
0 1337
1 1338
1 1339
0 1340
0 1341
0 1342
1 1343
1 1344
0 1345
0 1346
0 1347
1 1348
1 1349
0 1350
0 1351
0 1352
1 1353
1 1354
0 1355
0 1356
0 1357
1 1358
1 1359
1 1360
0 1361
0 1362
0 1363
1 1364
1 1365
0 1366
0 1367
0 1368
1 1369
1 1370
0 1371
0 1372
0 1373
1 1374
1 1375
0 1376
0 1377
0 1378
1 1379
1 1380
0 1381
0 1382
0 1383
1 1384
1 1385
0 1386
0 1387
0 1388
1 1389
1 1390
0 1391
0 1392
0 1393
1 1394
1 1395
0 1396
0 1397
0 1398
1 1399
1 1400
0 1401
0 1402
0 1403
1 1404
1 1405
0 1406
0 1407
0 1408
1 1409
1 1410
0 1411
0 1412
0 1413
1 1414
1 1415
0 1416
0 1417
0 1418
1 1419
1 1420
0 1421
0 1422
0 1423
1 1424
1 1425
0 1426
0 1427
0 1428
1 1429
1 1430
0 1431
0 1432
0 1433
1 1434
1 1435
0 1436
0 1437
0 1438
1 1439
0 1440
0 1441
0 1442
0 1443
0 1444
0 1445
1 1446
1 1447
0 1448
0 1449
0 1450
0 1451
1 1452
1 1453
0 1454
0 1455
1 1456
1 1457
0 1458
0 1459
0 1460
0 1461
1 1462
1 1463
0 1464
0 1465
1 1466
1 1467
0 1468
0 1469
0 1470
1 1471
1 1472
0 1473
0 1474
0 1475
1 1476
1 1477
0 1478
0 1479
0 1480
1 1481
1 1482
0 1483
0 1484
0 1485
1 1486
1 1487
0 1488
0 1489
0 1490
1 1491
1 1492
0 1493
0 1494
0 1495
1 1496
1 1497
0 1498
0 1499
0 1500
1 1501
1 1502
0 1503
0 1504
0 1505
1 1506
1 1507
0 1508
0 1509
0 1510
1 1511
1 1512
0 1513
0 1514
0 1515
1 1516
1 1517
0 1518
0 1519
0 1520
0 1521
0 1522
0 1523
0 1524
0 1525
0 1526
0 1527
0 1528
0 1529
1 1530
1 1531
0 1532
0 1533
0 1534
1 1535
1 1536
0 1537
0 1538
0 1539
1 1540
1 1541
0 1542
0 1543
0 1544
1 1545
1 1546
0 1547
0 1548
0 1549
1 1550
1 1551
0 1552
0 1553
0 1554
1 1555
1 1556
If you want vfr you have to set it all to 0s. That stands for CCCCC match. Hope it helps. I will make a function to mod CTelecine.txt to set a constant pattern from frame x to y. SO by guessing what you get from CTelecine you can guess the pattern and set it without manually do it everytime.
EDIT: I will also make a guess pattern function.
real.finder
13th February 2022, 23:20
you use "CTelecine(thr2=6,edeint2=QTGMC().SelectEven(),inputTxt=true)"
so the vfr will be up to only 30 fps not 60 fps? the point of https://github.com/pinterf/TIVTC/issues/26 is to have vfr that go up to 60 fps in sources like the one in the sample
Ceppo
13th February 2022, 23:56
To output a mixed 60fps, the only way that I can think of is to hide the odd frame from the bobbed clip doubling the height, then have CDecimate put it all together. Is kind of tricky, I need some time to think about it.
Ceppo
15th February 2022, 22:36
I want to give an update: I have been able to make a guess pattern function with minimal error to reduce manual labor. Tomorrow I Will get to the 60fps business. I will make a fake 60fps and all fake frames will be dropped.
Ceppo
17th February 2022, 19:55
Done. But I didn't update the ReadMe file. Maybe tomorrow.
real.finder Source:
This source has no 60i content aside from the dissolve transition. And you won't never get thr2 to deinterlace it without deinterlacing other not 60i frames. You can try if you want. It's just a guess.
#1st pass
#~ CFieldDuplicate(thr2=10,nt=10,write=true)
#2nd pass
#~ Bob().SelectEven()
#~ CSceneChange(SCClip(true,800),write=true)
#3nd pass
#~ CGuessPattern()
#4th pass Check CDecimate and fix post telecine cuts.
CTelecine(inputTxt=true)
Cn(1900)#force n match on ccccc cycle.
Cn(2477)
Cn(2647)
#5th pass Fix wrong scene match due bad SC detection (my fault).
#~ CSetPattern(1360,1439,ncccn=true)
#~ CSetPattern(1445,1519,cnncc=true)
#~ CSetPattern(2535,2594,cnncc=true)
#~ CSetPattern(2595,2649,nnccc=true)
#~ CSetPattern(2650,2729,ccnnc=true)
#~ CSetPattern(2835,2954,ccnnc=true)
#~ CSetPattern(2955,2969,ncccn=true)
#6th pass All done!
CDecimate()
CTelecine(match=false,thr2=3,edeint2=QTGMC().SelectEven())
vinverse()
Result (https://www.mediafire.com/file/utqkylfffetyvyw/30pVFR.mkv/file)
CGuessPattern is all about getting right the scene change and having enough motion in it. Otherwise, it will output a nnccc pattern cuz is the first in the array.
60i VFR test: source and encode download (https://www.mediafire.com/file/bcd7jijr9mx2x1x/60i_test.zip/file)
#Pass-1
#~ CTelecine2(thr2=6,edeint2=QTGMC(),write=true)
#Pass-2 Rename CTelecine2.txt to CTelecine.txt and use CSetPattern and adjust 60i cycles (the ones with all 2s)
#~ CSetPattern(0,54,cccnn=true)
#~ CSetPattern(65,149,cnncc=true)
#Pass-3
CTelecine2(thr2=6,edeint2=QTGMC(),inputTxt=true)
CFieldDeBlend(0.005,bob=CTelecine2(thr=3,edeint=nnedi3(-2)))
CDecimate2()
reduceby2()#random resize
Also I fixed the mistakes in the VFR file.
Also, due to the anime problem, I came up with a new field matching method which is much better but a bit slower. It won't do random n match like TIVTC modes do so this reduces a lot of work, the worst you get is a single n match due to duplicates but is easy to fix with a function that looks backward and forward in search of a compatible pattern. This is the result at least in my tests.
From it comes a better comb detection that I have yet to hard test. And a bob filter that keeps all the progressive part of the picture.
I have yet to implement these. I want to write the filters from scratch because the code is getting noisy and add YV16 and YV24 support. So before I do that please tell me what you guys would like me to add.
kedautinh12
17th February 2022, 20:10
I think you need add HBD for this :D
Ceppo
17th February 2022, 20:26
There is a bug with CDecimate2 instead of taking the odd frame I took the even frame so the 24fps decimation is slightly wrong. I will post the one with the fix tomorrow with the ReadMe file updated.
I think you need add HBD for this
I can't do HBD, I need a sample plugin like invertneg that handles HBD, otherwise, I need to look at the API to understand, and is kind a lot of work since I need to learn a lot of new things :(
real.finder
17th February 2022, 23:59
I still get "cycle at frame ..." errors
I also note CTelecine2.txt start with 3 "0 0"
0 0
0 0
0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
0 10
0 11
if I did the analysis pass in avspmod, but they will be only 2 if I do it with Virtualdub2 analysis pass
also in case you need more 60i samples https://github.com/pinterf/TIVTC/issues/26
Ceppo
18th February 2022, 01:31
AvspMod does it wrong, for some reason it calls 3 times the first frame. I use x264 preset very fast. You can still use AvspMod if you edit the file, just delete the duplicates at the beginning since it says 3 times frame 0. You might also want to look at the last frame in the txt file.
Thanks for the sample.
real.finder
18th February 2022, 02:31
AvspMod does it wrong, for some reason it calls 3 times the first frame. I use x264 preset very fast. You can still use AvspMod if you edit the file, just delete the duplicates at the beginning since it says 3 times frame 0. You might also want to look at the last frame in the txt file.
Thanks for the sample.
yes with x264 it only one "0 0"
but "cycle at frame ..." errors still there!
Ceppo
18th February 2022, 17:36
I updated the ReadMe and fixed the CDecimate2 bug in the v1.0.3 you can find above. Now it should work correctly.
yes with x264 it only one "0 0"
but "cycle at frame ..." errors still there!
The point of CDecimate is to get the correct decimate. There is no metric to do it right. The only way is to get a 00000, 11000, 01100, 00110, 00011, 10001 pattern every 5 frames. If in the txt file is not so, it will give you an error. I'm working on a way to reduce and minimalize the amount of required editing in the txt file. If you have a live action you often get the right pattern since everything is moving (so you have to edit only the critical parts). On anime, due the duplicates, this doesn't happen so there is a lot of editing to do.
real.finder
19th February 2022, 19:39
The point of CDecimate is to get the correct decimate. There is no metric to do it right. The only way is to get a 00000, 11000, 01100, 00110, 00011, 10001 pattern every 5 frames. If in the txt file is not so, it will give you an error.
If you have a live action you often get the right pattern since everything is moving (so you have to edit only the critical parts). On anime, due the duplicates, this doesn't happen so there is a lot of editing to do.
so if someone work with anime he/she will need so much time edit the file!
isn't better to add an option to just ignore these cases for peoples that dont have time and patient to edit thousands of lines?
also gispos said this about avspmod problem (https://forum.doom9.org/showpost.php?p=1964189&postcount=20)
In my opinion, the error is due to a non-existent option of the plugins. "After initializing, don't write the same frame multiple times"
It would be easy to integrate this option into the plugins!
Programs that display frames or need to initialize other variables when creating the clip must call get_frame multiple times at the beginning.
For example, if the matrix is read, get_frame must be called first. And with each call the plugin writes the frame number.
and I agree with him, since tivtc and others don't have this problem
Ceppo
19th February 2022, 22:01
so if someone work with anime he/she will need so much time edit the file!
isn't better to add an option to just ignore these cases for peoples that dont have time and patient to edit thousands of lines?
also gispos said this about avspmod problem
I understand your concern and you are right. I'm working on it to reduce to the minimum the editing by increasing accuracy. I will also make the option to ignore the error and try some heuristic way to handle those cases.
In my opinion, the error is due to a non-existent option of the plugins. "After initializing, don't write the same frame multiple times"
It would be easy to integrate this option into the plugins!
Programs that display frames or need to initialize other variables when creating the clip must call get_frame multiple times at the beginning.
For example, if the matrix is read, get_frame must be called first. And with each call the plugin writes the frame number.
Thanks a lot for the feedback, I will follow the advice!
EDIT
Also, now I'm working on a new field matching mode, and I'm getting good results.
EDIT 2
I need only to implement the write only thing and write the ReadMe file for the new functions.
Here a preview: 60i VFR (https://www.mediafire.com/file/owa7i7dowhy4sgk/60i_VFR.mkv/file)
WIth this Script:
CTelecineNew(bob=true,inputTxt=true)
CPostProcessing(isbob=true)
CDecimateNew(isBob=true,error=false)
The release will be in the day.
Ceppo
20th February 2022, 17:21
Updated to v1.0.4, feedback is much appreciated.
EDIT
fix'd
real.finder
20th February 2022, 19:28
thanks
with this
#~ CTelecineNew(bob=true,write=true) #1st pass
CTelecineNew(bob=true,inputTxt=true)
CPostProcessing(isbob=true,edeint2=qtgmc)
CDecimateNew(isBob=true,error=false)
I got this
https://i.postimg.cc/kMTtxsC5/Untitled.png (https://postimages.org/)
Ceppo
21st February 2022, 16:40
Sorry, I was in a hurry and I didn't update CTools.avsi.
https://www.mediafire.com/file/tqrbkmv3v16krui/CTools_v1.0.4_%2528fixv2%2529.zip/file
real.finder
21st February 2022, 16:58
Sorry, I was in a hurry and I didn't update CTools.avsi.
https://www.mediafire.com/file/tqrbkmv3v16krui/CTools_v1.0.4_%2528fixv2%2529.zip/file
it work now but with https://xfl.jp/E5n90r I got same frame in all clip with this
#~ CTelecineNew(bob=true,write=true) #1st pass
CTelecineNew(bob=true,inputTxt=true)
CPostProcessing(isbob=true,edeint2=qtgmc)
CDecimateNew(isBob=true,error=false)
Ceppo
21st February 2022, 17:18
Test (https://www.mediafire.com/file/fvth16efk2b8t69/Zodiac_guys.mkv/file)
CTelecineNew(bob=true,inputTxt=true)
CPostProcessing(isbob=true)#QTGMC() is the default
CDecimateNew(isBob=true,error=false)
Aside missing the fade. It looks everything all right to me.
I can't recreate the problem :(
EDIT:
Maybe your CTelecine file is empty??? After the pass you have to close AVSPmod since I didn't yet included a close() function.
real.finder
21st February 2022, 17:54
Test (https://www.mediafire.com/file/fvth16efk2b8t69/Zodiac_guys.mkv/file)
CTelecineNew(bob=true,inputTxt=true)
CPostProcessing(isbob=true)#QTGMC() is the default
CDecimateNew(isBob=true,error=false)
Aside missing the fade. It looks everything all right to me.
I can't recreate the problem :(
EDIT:
Maybe your CTelecine file is empty??? After the pass you have to close AVSPmod since I didn't yet included a close() function.
it's not empty, do I need 3 passes in this case?
Ceppo
21st February 2022, 17:58
it's not empty, do I need 3 passes in this case?
No. There must some kind of other bug.
You are using 64bit or 32bit version? Just to track the problem.
real.finder
21st February 2022, 17:59
No. There must some kind of other bug.
You are using 64bit or 32bit version? Just to track the problem.
64bit
Ceppo
21st February 2022, 18:05
Do you have some people online to make them try on that source? I need to understand if it's a stack related problem.
real.finder
21st February 2022, 18:12
Do you have some people online to make them try on that source? I need to understand if it's a stack related problem.
I didn't get what you mean but I note in every experience some frames show randomly, like in avspmod if I hit f5 in some frame it will change to another
removing CDecimateNew(isBob=true,error=false) line will fix it but this not what we want
Ceppo
21st February 2022, 18:23
Ok, just curios remove inputTxt=true from CTelecine and try again. Also if you could please tell me how much RAM you have.
real.finder
21st February 2022, 18:32
Ok, just curios remove inputTxt=true from CTelecine and try again. Also if you could please tell me how much RAM you have.
it's same
it's rdp server with 64 gb ram
32bit seems ok
Ceppo
21st February 2022, 18:41
So it's a 64bit issue. I will make some changes to reduce the stack, since is the only lead I have at the moment. Hope to release it for tomorrow.
Ceppo
21st February 2022, 23:27
Updated. It was a 30min modification.
v1.0.5
- Reduced stack in CTelecineNew and CDecimateNew
- Now CTelecineNew closes automatically the txt file on last frame.
- Speed improvement.
Hope it works now.
real.finder
22nd February 2022, 00:43
thanks, seems work fine, but there are something
"# timestamp format v1" should be "# timecode format v1"
and with
D2VSource (https://github.com/Asd-g/MPEG2DecPlus#usage)("Hybrid_30p_+_24i_+60i_+_ifade.d2v")
i=last
bob=stgmc (https://github.com/realfinder/AVS-Stuff/blob/Community/avs%202.6%20and%20up/STGMC.avsi)(useEdiExt=2,EdiExt=sanimebob (https://github.com/realfinder/AVS-Stuff/blob/Community/avs%202.5%20and%20up/AnimeIVTC.avsi)(useBWDIF=true, FastNnediHBD=true),Sharpness=0,tr2=2,ESearchP=true, Refinemotion=true, fastma=true)
#~ CTelecineNew(bob=true,write=true,thr60i=0.1)
CTelecineNew(bob=true,thr60i=0.1)
CPostProcessing(0.1,0.9,isbob=true,edeint=i.CPostProcessingMask(bob=bob,nt=4),edeint2=bob)
CDecimateNew(isBob=true,error=false)
it still got some random frames replaced with last frame even in 32bit!
Ceppo
22nd February 2022, 02:28
thr60i in CTelecineNew and thr2 in CPostProcessing must have the same value. Try this way.
If still does that, tomorrow I will look into it (same clip I guess). Also, you are supposed to bob after CTelecineNew.
"# timestamp format v1" should be "# timecode format v1"
Last version of mkvtoolnix doesn't accept that.
real.finder
22nd February 2022, 12:34
thr60i in CTelecineNew and thr2 in CPostProcessing must have the same value. Try this way.
If still does that, tomorrow I will look into it (same clip I guess). Also, you are supposed to bob after CTelecineNew.
I did make thr60i in CTelecineNew and thr2 in CPostProcessing same and it still got problems
the output of CTelecineNew is already 60fps! I think it wrong to do bob with it! but anyway that seems work but the output of bob seems not ok (to many ghosting)
Last version of mkvtoolnix doesn't accept that.
weird, I don't use last mkvtoolnix but it always "# timecode format v1" and all old tools and plugins only work with "# timecode format v1" even the last x264!
Ceppo
22nd February 2022, 18:36
weird, I don't use last mkvtoolnix but it always "# timecode format v1" and all old tools and plugins only work with "# timecode format v1" even the last x264!
Could you please tell me how to input the vfr file with x264. I never done vfr before you asked for it so I don't know much. Since your suggestion seems more compatible I might change it.
I did make thr60i in CTelecineNew and thr2 in CPostProcessing same and it still got problems
the output of CTelecineNew is already 60fps! I think it wrong to do bob with it! but anyway that seems work but the output of bob seems not ok (to many ghosting)
We can do like that: if isBob false, expect double frame rate, if isBob true expect same frame rate, so you can use the bob from the original clip. Does this seems acceptable?
real.finder
22nd February 2022, 18:58
Could you please tell me how to input the vfr file with x264. I never done vfr before you asked for it so I don't know much. Since your suggestion seems more compatible I might change it.
We can do like that: if isBob false, expect double frame rate, if isBob true expect same frame rate, so you can use the bob from the original clip. Does this seems acceptable?
x264 has --tcfile-in for vfr timecode file
so this ok?
i=last
bob=stgmc(useEdiExt=2,EdiExt=sanimebob(useBWDIF=true, FastNnediHBD=true),Sharpness=0,tr2=2,ESearchP=true, Refinemotion=true, fastma=true)
#~ CTelecineNew(bob=true,write=true,thr60i=0.1)
CTelecineNew(bob=false,thr60i=0.1,inputTxt=true)
CPostProcessing(0.1,0.9,isbob=false,edeint=i.CPostProcessingMask(bob=bob,nt=4),edeint2=bob)
CDecimateNew(isBob=false,error=false)
it seems work
edit: and yes it should not act like this for isbob=true, I think for isbob=true case it should "if isBob true expect same frame rate" as you said
Ceppo
22nd February 2022, 21:28
Updated:
v1.0.6
- Fixed wrong frame count on CDecimateNew
- Now CPP expect same frame rate edeint/2 clip when isBob=true.
I didn't do much* testing, I have something going on.
Also you don't need to specify edeint with CCPMask with the same bob clip. It's automatic.
i=last
bob=stgmc(useEdiExt=2,EdiExt=sanimebob(useBWDIF=true, FastNnediHBD=true),Sharpness=0,tr2=2,ESearchP=true, Refinemotion=true, fastma=true)
#~ CTelecineNew(bob=true,write=true,thr60i=0.1)
CTelecineNew(bob=false,thr60i=0.1,inputTxt=true)
CPostProcessing(0.1,0.9,isbob=false,edeint=i.CPostProcessingMask(bob=bob,nt=4),edeint2=bob)
CDecimateNew(isBob=false,error=false)
If Bob false, thr60i is ignored.
real.finder
22nd February 2022, 22:15
thanks, work fine, but the timecode file still "# timestamp format v1"
anyway I will test more with some DVD later
Ceppo
22nd February 2022, 22:24
I forgot, sorry. Tomorrow I will add it with a new parameter for CDecimateNew.
real.finder
22nd February 2022, 23:08
one more thing, and it's about CTelecineNew
in CTelecineNew(bob=true) sometimes it show frame that not same as qtgmc and that makes some artifacts
also instead of just vinverse.dll can we have option to choose alternatives like https://github.com/Dogway/Avisynth-Scripts/blob/eb27d2e9bba62faed1fc0a7b1058d4c115f9b0a4/MIX%20mods/QTGMC.avsi#L1273 ?
Ceppo
22nd February 2022, 23:16
one more thing, and it's about CTelecineNew
in CTelecineNew(bob=true) sometimes it show frame that not same as qtgmc and that makes some artifacts
It does field matching. So 1 field might be dropped for the adiacent while QTGMC does not. And can you give me a picture of those artefacts? QTGMC VS CTelecine VS Original
EDIT: what I said makes no sense. Might be a bug. If you could provide a sample clip that does that and point out some frame.
also instead of just vinverse.dll can we have option to choose alternatives like https://github.com/Dogway/Avisynth-S...GMC.avsi#L1273 ?
It depends by the filter. If it does not blending, it won't work. I'm not feeling well atm, can you give me a comparison of a telecined frame with vinverse vs your vinverse?
real.finder
22nd February 2022, 23:37
It does field matching. So 1 field might be dropped for the adiacent while QTGMC does not. And can you give me a picture of those artefacts? QTGMC VS CTelecine VS Original
It depends by the filter. If it does not blending, it won't work. I'm not feeling well atm, can you give me a comparison of a telecined frame with vinverse vs your vinverse?
I know it do field matching, I didn't mean CTelecine did it but when using it like this
bob=stgmc(tr0=-2,useEdiExt=1,EdiExt=sanimebob(useBWDIF=true, FastNnediHBD=true),Sharpness=0,tr2=5, Refinemotion=true, fastma=true)
#~ CTelecineNew(bob=true,write=true,thr60i=0.2)
CTelecineNew(bob=true,thr60i=0.2,inputTxt=true)
CPostProcessing(0.1,0.9,isbob=true,edeint2=bob)
CDecimateNew(isBob=true,error=false)
https://i.postimg.cc/5tHX8YW9/Untitled.png (https://postimages.org/)
look at the Teeth
tfm kinda do same sometimes, but it's ok with
istff=GetParity()
bobclip=qtgmc
Interleave(TFM(field=istff ? 1 : 0, micmatching=0, mode=0, clip2=bobclip.selecteven()), TFM(field=istff ? 0 : 1, micmatching=0, mode=0, clip2=bobclip.selectodd()))
vinverse originally was a script function by Didée then tritical make it a plugin, but now the dll version is outdated in case of HBD and some other improvements so there are Vinverse_avsi and ex_vinverse since the dll didn't get any updated since 10 years, that why I asked about option to choose alternatives
Ceppo
22nd February 2022, 23:43
I don't have your bob filter to check. Try without using CPostProcessingMask as edeint clip. It might be it failing with your bob filter.
About vinverse, ok. There is a problem, I can't load the page anymore.
real.finder
22nd February 2022, 23:46
I don't have your bob filter to check. Try without using CPostProcessingMask as edeint clip. It might be it failing.
About vinverse, ok. There is a problem, I can't load the page anymore.
I already don't use CPostProcessingMask now :confused:
any bob can be a problem, you can use just
bob=qtgmc
and what page? this (https://github.com/Dogway/Avisynth-Scripts/blob/eb27d2e9bba62faed1fc0a7b1058d4c115f9b0a4/MIX%20mods/QTGMC.avsi#L1273) ?
Ceppo
22nd February 2022, 23:50
With
bob = QTGMC()
CTelecineNew(nt=2,bob=true,thr60i=0.2,inputTxt=true)
CPostProcessing(0.1,0.9,isbob=true,edeint2=bob)
I don't see any problem aside QTGMC ghosting.
I already don't use CPostProcessingMask now
If you don't specify an edeint clip, is default.
real.finder
22nd February 2022, 23:57
With
bob = QTGMC()
CTelecineNew(nt=2,bob=true,thr60i=0.2,inputTxt=true)
CPostProcessing(0.1,0.9,isbob=true,edeint2=bob)
I don't see any problem aside QTGMC ghosting.
If you don't specify an edeint clip, is default.
ok, so QTGMC was not a good replacment, bob=TDeint(1) should do it
Ceppo
22nd February 2022, 23:59
About CTelecineNew getting the wrong frame, can you point a frame number from that clip?
EDIT:
I don't have TDeint :(
EDIT2:
I think there is a misunderstanding here.
If you asked me to use TDeint, then what you should do is to check:
bob=stgmc(tr0=-2,useEdiExt=1,EdiExt=sanimebob(useBWDIF=true, FastNnediHBD=true),Sharpness=0,tr2=5, Refinemotion=true, fastma=true)
#~ CTelecineNew(bob=true,write=true,thr60i=0.2)
CTelecineNew(bob=true,thr60i=0.2,inputTxt=true)
CPostProcessing(0.1,0.9,isbob=true,edeint=bob,edeint2=bob)
CDecimateNew(isBob=true,error=false)
and see if it still does it.
real.finder
23rd February 2022, 00:17
About CTelecineNew getting the wrong frame, can you point a frame number from that clip?
you mean the image above? 1444
if you mean CTelecineNew(bob=true) vs bob then it's seems fine with any bob now! maybe I did something wrong in the first time
Ceppo
23rd February 2022, 00:20
I'm glad it works now. Tomorrow I will add ex_vinverse() as a mode.
EDIT:
I also need to rewrite the old modes and make a single CTelecine function and CDecimate function. For now, I will wait some days for bugs reports. Then I will get to it. I will also add old comb detection methods to CPostProcessing for everyone's tastes. And I will add yet another field matching mode.
real.finder
23rd February 2022, 00:27
About CTelecineNew getting the wrong frame, can you point a frame number from that clip?
EDIT:
I don't have TDeint :(
EDIT2:
I think there is a misunderstanding here.
If you asked me to use TDeint, then what you should do is to check:
bob=stgmc(tr0=-2,useEdiExt=1,EdiExt=sanimebob(useBWDIF=true, FastNnediHBD=true),Sharpness=0,tr2=5, Refinemotion=true, fastma=true)
#~ CTelecineNew(bob=true,write=true,thr60i=0.2)
CTelecineNew(bob=true,thr60i=0.2,inputTxt=true)
CPostProcessing(0.1,0.9,isbob=true,edeint=bob,edeint2=bob)
CDecimateNew(isBob=true,error=false)
and see if it still does it.
yes that what was missing, thanks
bob1=CTelecineNew(bob=true)
bob2=stgmc(useEdiExt=2,EdiExt=sanimebob(useBWDIF=true, FastNnediHBD=true),Sharpness=0,tr2=2,ESearchP=true, Refinemotion=true, fastma=true)
#~ CTelecineNew(bob=true,write=true,thr60i=0.2)
CTelecineNew(bob=true,thr60i=0.2,inputTxt=true)
CPostProcessing(0.1,0.9,isbob=true,edeint=bob1,edeint2=bob2)
CDecimateNew(isBob=true,error=false)
Ceppo
23rd February 2022, 00:38
Just wondering, you guys prefer 2 dlls, one with IVTC stuff and one with CDuplicate stuff or is fine a single one?
kedautinh12
23rd February 2022, 01:21
Tdeint here:
https://github.com/pinterf/TIVTC/releases
real.finder
23rd February 2022, 01:58
Just wondering, you guys prefer 2 dlls, one with IVTC stuff and one with CDuplicate stuff or is fine a single one?
I don't mind either case
I did vfr test with dvd, seems ok in everything for now but I note that the 60i detected not work good with some sources even with thr60i=0.1 here small sample https://www.sendspace.com/file/96xnbn
Ceppo
23rd February 2022, 03:17
You are not getting it because you are getting false n matches. With:
CTelecineNew(bob=true,nt=0,write=true)
I get all 2s with default thr60i.
Also, thanks for TDeint :)
real.finder
23rd February 2022, 04:45
You are not getting it because you are getting false n matches. With:
CTelecineNew(bob=true,nt=0,write=true)
I get all 2s with default thr60i.
perfect, :thanks:
Ceppo
23rd February 2022, 19:22
real.finder:
I want to add ex_vinverse but I don't have the "ex_" functions. They are not in the link you provided. Can you give me a link to those functions?
real.finder
23rd February 2022, 19:50
real.finder:
I want to add ex_vinverse but I don't have the "ex_" functions. They are not in the link you provided. Can you give me a link to those functions?
sure https://github.com/Dogway/Avisynth-Scripts/blob/master/ExTools.avsi
Ceppo
23rd February 2022, 20:35
v1.0.7
- Added VFR to CFR support to CDecimateNew.
- Fixed VFR file grammar.
- Added mode parameter to CTelecineNew. (mode=1 is ex_vinverse).
For the CFR clip:
https://www.mediafire.com/file/glpcaw80hmapdf9/VFRtoCFR.mkv/file
CDecimateNew(error=false,iClip=iClip3(0))
iClip3 will interpolate 30/60fps to 24fps.
real.finder
23rd February 2022, 21:34
thanks for the new update, this is a good idea for peoples who don't want vfr
I can't do HBD, I need a sample plugin like invertneg that handles HBD, otherwise, I need to look at the API to understand, and is kind a lot of work since I need to learn a lot of new things :(
what about https://github.com/pinterf/Average/commit/d2efdeea4d04a3eed52b46931bd4816cda1296df since it https://forum.doom9.org/showthread.php?p=1864943#post1864943
and as update for this case https://forum.doom9.org/showthread.php?p=1964470#post1964470 nt=0 make some frames with only move mouth have interlaced combs
Ceppo
23rd February 2022, 22:19
what about https://github.com/pinterf/Average/c...d4816cda1296df since it https://forum.doom9.org/showthread.p...43#post1864943
That's a good filter to study. Thanks a lot!
and as update for this case https://forum.doom9.org/showthread.p...70#post1964470 nt=0 make some frames with only move mouth have interlaced combs
The ancient "mouth problem". I have an idea to fix that, but I'm not going to add that before adding the other 3 matching modes. So before I try this new method some time will pass. ATM you can use a nt parameter to fix the mouth. Then give a quick look at the txt file and fix the sections which don't have all consecutive 2s due to false n matches.
EDIT:
I get a 100fps drop using mode=1, shouldn't it be faster? How is going for you?
real.finder
23rd February 2022, 23:20
EDIT:
I get a 100fps drop using mode=1, shouldn't it be faster? How is going for you?
not always since the dll may has asm code, anyway the point of ex_vinverse is the HBD and quality in general
Ceppo
24th February 2022, 07:57
v1.0.8
- Added mode=2 and mode2thr paramater in CTelecineNew.
- Fixed CTelecineNew(bob=true,inputTxt=true) bug.
- Minor speed up for mode=0/1. From 250 fps to 280fps.
Example of mode=2 for moire effect.
https://www.mediafire.com/file/vc6gkachguotlcp/mode2.mkv/file
#CFieldSofter()
#CTelecineNew(mode=2,write=true)
CTelecineNew(inputTxt=true)
CDecimateNew()
kedautinh12
24th February 2022, 09:31
With github account, you can update your script to this sever :D
Ceppo
24th February 2022, 10:23
I will do that in the future. I want to remove all the junk code first.
Ceppo
26th February 2022, 21:27
v1.0.9
- Added mode=3 and mode=4 to CTelecineNew.
- Added CDegrain.
- Added CSharpen.
Now I'm on the mouth problem.
Milardo
26th February 2022, 22:08
All filters are for YV12 8bit videos!
The plugins in CTools.avsi are not necessary. They are short and self explanatory.
You can mod/delete them if you want unless is stated so in the file.
Syntax=>
CSharpen(clip "blur", int "nt", bool "Sqrt")
CDegrain(int "radius", int "nt", int "thr", clip "dClip")
CTelecineNew(float "sstr", int "nt", bool "bob", bool "write", bool "inputTxt", float "thr60i", int "nt60i", float "mode2thr")
CDecimateNew(bool "isBob", bool "error", bool "heuristic", clip "iClip")
CPostProcessing(float "thr", float "thr2", float "sstr", int "ntC", int "ntM", bool "isBob", clip "edeint", clip "edeint2")
CDuplicate(float "thr", int "nt", clip "dClip", bool "write")
CFieldDuplicate(float "thr", float "thr2", int "nt", clip "dClip", bool "write", bool "inputTxt")
CDropFrame()
CReplaceFrame()
CInterpolate(float "thr", int "nt", clip "dClip", clip "iClip", bool "write", bool "inputTxt")
CTelecine(int "thr", int "thr2", int "blkthr", int "blksize", int "mode", int "metric", int "nt", bool "sse", clip "edeint", clip "edeint2", bool "write", bool "inputTxt", bool "match")
CTelecine2(int "thr", int "thr2", int "blkthr", int "blksize", int "mode", int "metric", int "nt", bool "sse", clip "edeint", clip "edeint2", bool "write", bool "inputTxt")
CFieldDeBlend(float "thr", int "nt", clip "dClip", bool "prev", bool "bob")
CDecimate(bool "CTelecine", bool "CDuplicate")
CDecimate2()
CSceneChange(bool "write")
CSetPattern(int "start", int "end", bool "CCCCC", bool "NNCCC", bool "CNNCC", bool "CCNNC", bool "CCCNN", bool "NCCCN")
CGuessPattern()
CFieldDifference(int "mode", int "nt", bool "sse", bool "write", clip "dClip")
v1.0.9 (https://www.mediafire.com/file/5l6jdc3ok0fhpa5/CTools_v1.0.9.zip/file)
Hi, I read the readme.txt file, but
what does "CInterpolate" actually do?
Is this some sort of something like SVP? If so, can you provide a sample avs file how to use it exactly?
Ceppo
26th February 2022, 22:14
Hi, I read the readme.txt file, but
what does "CInterpolate" actually do?
Is this some sort of something like SVP? If so, can you provide a sample avs file how to use it exactly?
Sorry, the name is misleading. It takes a MFlowInter clip (iClip parameter) from mvtools2 and replace frames that are duplicate with respect to the previous frame but are not duplicate with respect to the following frame. This is meant to smooth the motion of bobbed clip or 24fps anime while preserving the original animations (true 24/60fps).
Milardo
26th February 2022, 22:19
Sorry, the name is misleading. It takes a MFlowInter clip (iClip parameter) from mvtools2 and replace frames that are duplicate with respect to the previous frame but are not duplicate with respect to the following frame. This is meant to smooth the motion of bobbed clip or 24fps anime while preserving the original animations (true 24/60fps).
Ok. When you say smooth, it has nothing to do with motion interpolation though right? Even if one has 24 fps video source?
Ceppo
26th February 2022, 22:32
Ok. When you say smooth, it has nothing to do with motion interpolation though right? Even if one has 24 fps video source?
It takes the interpolated frame from MFlowInter, so a duplicate in the way a said above will be replaced with the interpolated frame, so the motion will be smoother (as long interpolation artifacts allow that).
Try:
src = last
super = MSuper()
backvec = MAnalyse(super,blksize=64,overlap=32,lambda=1000*64,isb=true,delta=1)
iClip = MCompensate(super,backvec,time=50)
CInterpolate(iClip=iClip)
last
On an anime clip @ 24fps. To see what I mean.
Ceppo
26th February 2022, 23:57
real.finder:
I was thinking maybe CDegrain can be used to replace TemporalSoften in QTGMC, something like :CDegrain(3,10,240,dClip=ex_reduceFlicker(3,true))
The QTGMC_KeepOnlyBobShimmerFixes function should work better on that.
real.finder
27th February 2022, 00:18
real.finder:
I was thinking maybe CDegrain can be used to replace TemporalSoften in QTGMC, something like :CDegrain(3,10,240,dClip=ex_reduceFlicker(3,true))
The QTGMC_KeepOnlyBobShimmerFixes function should work better on that.
the one who updating QTGMC now is Dogway not me :) https://forum.doom9.org/showthread.php?t=182881 so I think it's better to post there so Dogway will note it
edit: anyway after I see https://forum.doom9.org/showthread.php?t=183874 I am thinking about make sanimebob2 using your code and some others, so maybe I will add this to stgmc as an option to be used in sanimebob2
Ceppo
27th February 2022, 01:05
the one who updating QTGMC now is Dogway not me https://forum.doom9.org/showthread.php?t=182881 so I think it's better to post there so Dogway will note it
Will do. But what do you think about it?
edit: anyway after I see https://forum.doom9.org/showthread.php?t=183874 I am thinking about make sanimebob2 using your code and some others, so maybe I will add this to stgmc as an option to be used in sanimebob2
Glad to be of use.
EDIT:
Also can you link me the post with your filters? I can't find them.
Milardo
27th February 2022, 01:34
It takes the interpolated frame from MFlowInter, so a duplicate in the way a said above will be replaced with the interpolated frame, so the motion will be smoother (as long interpolation artifacts allow that).
Try:
src = last
super = MSuper()
backvec = MAnalyse(super,blksize=64,overlap=32,lambda=1000*64,isb=true,delta=1)
iClip = MCompensate(super,backvec,time=50)
CInterpolate(iClip=iClip)
last
On an anime clip @ 24fps. To see what I mean.
OK. Did you mention that this also works on 60 fps video source too?
I tried it on a live 60 fps video source and it made the video smoother in my opinion (motion interpolation).
Is that the point of the filter?
Can you show me an example with the other parameters to adjust for more interpolation/smoothness?
Ceppo
27th February 2022, 01:45
OK. Did you mention that this also works on 60 fps video source too?
I tried it on a live 60 fps video source and it made the video smoother in my opinion (motion interpolation).
Is that the point of the filter?
Can you show me an example with the other parameters to adjust for more interpolation/smoothness?
I'm currently encoding a source, so I can't encode, so, if you could wait, I will. Also if you upload a sample, I will tweak it for that sample so that I can better show you.
EDIT:
EXAMPLES (https://www.mediafire.com/file/zhja4ik2nizosvx/example.zip/file)
Messed a bit with mvtools. Came up with that to reduce artefacts.
MCompensate clip:
AddBorders(0,0,1280%64,720%64)
src = last
super = MSuper()
backvec1 = MAnalyse(super,blksize=4,overlap=2,isb=true,delta=1)
backvec2 = MAnalyse(super,blksize=8,overlap=4,isb=true,delta=1)
backvec3 = MAnalyse(super,blksize=16,overlap=8,isb=true,delta=1)
backvec4 = MAnalyse(super,blksize=32,overlap=16,isb=true,delta=1)
backvec5 = MAnalyse(super,blksize=64,overlap=32,lambda=1000*64,isb=true,delta=1)
iClip1 = MCompensate(super,backvec1,time=50)
iClip2 = MCompensate(super,backvec2,time=50)
iClip3 = MCompensate(super,backvec3,time=50)
iClip4 = MCompensate(super,backvec4,time=50)
iClip5 = MCompensate(super,backvec5,time=50)
ScriptClip("""
AverageLuma(MMask(backvec1,kind=1,ml=255)) < 1 ? iClip1 : \
AverageLuma(MMask(backvec2,kind=1,ml=255)) < 1 ? iClip2 : \
AverageLuma(MMask(backvec3,kind=1,ml=255)) < 1 ? iClip3 : \
AverageLuma(MMask(backvec4,kind=1,ml=255)) < 1 ? iClip4 : iClip5
""")
CInterpolate(src,iClip=last)
Crop(0,0,-(1280%64),-(720%64))
MFlowInter clip (slow)
AddBorders(0,0,1280%64,720%64)
src = last
super = MSuper()
backvec1 = MAnalyse(super,blksize=4,overlap=2,isb=true,delta=1)
forwvec1 = MAnalyse(super,blksize=4,overlap=2,isb=false,delta=1)
backvec2 = MAnalyse(super,blksize=8,overlap=4,isb=true,delta=1)
forwvec2 = MAnalyse(super,blksize=8,overlap=4,isb=false,delta=1)
backvec3 = MAnalyse(super,blksize=16,overlap=8,isb=true,delta=1)
forwvec3 = MAnalyse(super,blksize=16,overlap=8,isb=false,delta=1)
backvec4 = MAnalyse(super,blksize=32,overlap=16,isb=true,delta=1)
forwvec4 = MAnalyse(super,blksize=32,overlap=16,isb=false,delta=1)
backvec5 = MAnalyse(super,blksize=64,overlap=32,lambda=1000*64,isb=true,delta=1)
forwvec5 = MAnalyse(super,blksize=64,overlap=32,lambda=1000*64,isb=false,delta=1)
iClip1 = MFlowInter(super,backvec1,forwvec1,time=50,blend=false)
iClip2 = MFlowInter(super,backvec2,forwvec2,time=50,blend=false)
iClip3 = MFlowInter(super,backvec3,forwvec3,time=50,blend=false)
iClip4 = MFlowInter(super,backvec4,forwvec4,time=50,blend=false)
iClip5 = MFlowInter(super,backvec5,forwvec5,time=50,blend=false)
ScriptClip("""
AverageLuma(MMask(backvec1,kind=1,ml=255)) < 1 ? iClip1 : \
AverageLuma(MMask(backvec2,kind=1,ml=255)) < 1 ? iClip2 : \
AverageLuma(MMask(backvec3,kind=1,ml=255)) < 1 ? iClip3 : \
AverageLuma(MMask(backvec4,kind=1,ml=255)) < 1 ? iClip4 : iClip5
""")
CInterpolate(src,iClip=last)
Crop(0,0,-(1280%64),-(720%64))
@ 24fps the artefacts are easy to spot, but it should not be so if you use it on a bobbed clip @60fps.
real.finder
27th February 2022, 18:15
Will do. But what do you think about it?
I can't say unless I test
Also can you link me the post with your filters? I can't find them.
in my forum signature blow
gispos
27th February 2022, 18:54
Will do. But what do you think about it?
For me it's 3 FPS (16%) slower on full HD. It should also be renamed, ex_QTGMC or similar.
@real.finder please do not completely abandon support for the 'original' QTGMC!
Ceppo
27th February 2022, 23:18
For me it's 3 FPS (16%) slower on full HD. It should also be renamed, ex_QTGMC or similar.
Did you see some improvement like less ghosting or something? Once I have done with the plugin I might look into it.
in my forum signature blow
I checked there, but I can't find the 2 filters. I'm missing something... :)
real.finder
27th February 2022, 23:59
sanimebob is part of my animeivtc mod, stgmc and any new things https://github.com/realfinder/AVS-Stuff as the big note said there :)
Ceppo
28th February 2022, 01:26
Mystery solved! :)
real.finder
28th February 2022, 16:47
v1.0.9
- Added mode=3 and mode=4 to CTelecineNew.
what about adding mode 5 using IT method https://github.com/HomeOfVapourSynthEvolution/VapourSynth-IT ?
also the tfm method has slow parameter
slow -
Sets which field matching fuction is used. Possible settings:
0 - normal (should have the worst accuracy)
1 - slower
2 - slowest (should have the best accuracy)
This is basically a quality vs. speed option (the slower the function the more
accurate it should be). Prior to v0.9.9.1 of tfm this was a boolean value, true
from previous versions corresponds to a current value of 1 and false corresponds
to a current value of 0.
Default: 1 (int)
kedautinh12
28th February 2022, 16:59
Avs ver
http://avisynth.nl/index.php/IT
real.finder
28th February 2022, 17:15
Avs ver
http://avisynth.nl/index.php/IT
vs one based on avs one, and avs IT has no c code so it hard to read it
kedautinh12
28th February 2022, 17:31
vs one based on avs one, and avs IT has no c code so it hard to read it
I think CTools is avs ver so i share avs ver of IT is acceptable
Ceppo
1st March 2022, 01:03
Thanks guys. About mode 5, I can't read both avs and vs versions :), I might need some time. It would be easier if I knew the "concept" of that filter so that I can implement it my own way. About TFM slow parameter, when I did TelecineBob, I found it not much needed, but I might look into it again.
EDIT: mode 4 runs at 500fps to me. What's the point of making it faster and losing precision?
Ceppo
1st March 2022, 02:12
v1.1.0
- Removed Sqrt parameter from CSharpen.
- Added mode parameter to CSharpen + new sharpening mode.
- Added CDeHalo.
- Added CAntiAliasing.
- Added ntN parameter to CTelecineNew for mode 3, 4.
- CTelecineNew default mode is now 3.
My idea for the mouth problem didn't work on anime. So it was pointless :). I had another idea for mode 3 and mode 4. Just decrease ntN parameter to get less false n matches.
gispos
1st March 2022, 17:45
Did you see some improvement like less ghosting or something? Once I have done with the plugin I might look into it.
There are minimal differences in my default settings.
For me, there is no winner. In some areas STGMC is a bit more contoured and in others Dogway's QTGMC is a bit more contoured. By that I also mean ghosting or blurr removed.
But I haven't tested any other settings. You have to test it yourself, some like it that way, others like it differently.
Milardo
2nd March 2022, 23:17
I'm currently encoding a source, so I can't encode, so, if you could wait, I will. Also if you upload a sample, I will tweak it for that sample so that I can better show you.
EDIT:
EXAMPLES (https://www.mediafire.com/file/zhja4ik2nizosvx/example.zip/file)
Messed a bit with mvtools. Came up with that to reduce artefacts.
MCompensate clip:
AddBorders(0,0,1280%64,720%64)
src = last
super = MSuper()
backvec1 = MAnalyse(super,blksize=4,overlap=2,isb=true,delta=1)
backvec2 = MAnalyse(super,blksize=8,overlap=4,isb=true,delta=1)
backvec3 = MAnalyse(super,blksize=16,overlap=8,isb=true,delta=1)
backvec4 = MAnalyse(super,blksize=32,overlap=16,isb=true,delta=1)
backvec5 = MAnalyse(super,blksize=64,overlap=32,lambda=1000*64,isb=true,delta=1)
iClip1 = MCompensate(super,backvec1,time=50)
iClip2 = MCompensate(super,backvec2,time=50)
iClip3 = MCompensate(super,backvec3,time=50)
iClip4 = MCompensate(super,backvec4,time=50)
iClip5 = MCompensate(super,backvec5,time=50)
ScriptClip("""
AverageLuma(MMask(backvec1,kind=1,ml=255)) < 1 ? iClip1 : \
AverageLuma(MMask(backvec2,kind=1,ml=255)) < 1 ? iClip2 : \
AverageLuma(MMask(backvec3,kind=1,ml=255)) < 1 ? iClip3 : \
AverageLuma(MMask(backvec4,kind=1,ml=255)) < 1 ? iClip4 : iClip5
""")
CInterpolate(src,iClip=last)
Crop(0,0,-(1280%64),-(720%64))
MFlowInter clip (slow)
AddBorders(0,0,1280%64,720%64)
src = last
super = MSuper()
backvec1 = MAnalyse(super,blksize=4,overlap=2,isb=true,delta=1)
forwvec1 = MAnalyse(super,blksize=4,overlap=2,isb=false,delta=1)
backvec2 = MAnalyse(super,blksize=8,overlap=4,isb=true,delta=1)
forwvec2 = MAnalyse(super,blksize=8,overlap=4,isb=false,delta=1)
backvec3 = MAnalyse(super,blksize=16,overlap=8,isb=true,delta=1)
forwvec3 = MAnalyse(super,blksize=16,overlap=8,isb=false,delta=1)
backvec4 = MAnalyse(super,blksize=32,overlap=16,isb=true,delta=1)
forwvec4 = MAnalyse(super,blksize=32,overlap=16,isb=false,delta=1)
backvec5 = MAnalyse(super,blksize=64,overlap=32,lambda=1000*64,isb=true,delta=1)
forwvec5 = MAnalyse(super,blksize=64,overlap=32,lambda=1000*64,isb=false,delta=1)
iClip1 = MFlowInter(super,backvec1,forwvec1,time=50,blend=false)
iClip2 = MFlowInter(super,backvec2,forwvec2,time=50,blend=false)
iClip3 = MFlowInter(super,backvec3,forwvec3,time=50,blend=false)
iClip4 = MFlowInter(super,backvec4,forwvec4,time=50,blend=false)
iClip5 = MFlowInter(super,backvec5,forwvec5,time=50,blend=false)
ScriptClip("""
AverageLuma(MMask(backvec1,kind=1,ml=255)) < 1 ? iClip1 : \
AverageLuma(MMask(backvec2,kind=1,ml=255)) < 1 ? iClip2 : \
AverageLuma(MMask(backvec3,kind=1,ml=255)) < 1 ? iClip3 : \
AverageLuma(MMask(backvec4,kind=1,ml=255)) < 1 ? iClip4 : iClip5
""")
CInterpolate(src,iClip=last)
Crop(0,0,-(1280%64),-(720%64))
@ 24fps the artefacts are easy to spot, but it should not be so if you use it on a bobbed clip @60fps.
Ok. I don't really have any samples, i am testing using a live 60 fps video source capture card.
I don't know if your filter is designed to do this, but can you post an example for a source like mine, to get it as as smooth as possible, i'm doing this for realtime playback. Does adjusting any of the parameters like "thr" do anything for that?
Ceppo
3rd March 2022, 05:12
Ok. I don't really have any samples, i am testing using a live 60 fps video source capture card.
I don't know if your filter is designed to do this, but can you post an example for a source like mine, to get it as as smooth as possible, i'm doing this for realtime playback. Does adjusting any of the parameters like "thr" do anything for that?
I don't have a source like yours. Anyway the filter is designed for videos who have duplicate frames, a non anime source should not have duplicate unless your source is telecined and instead of dropping the duplicate you interpolate it with CInterpolate + mvtools. In other cases you don't need it. CInterpolate's parameters are all about finding duplicates, if you want more interpolation set an higher thr value so that more duplicates are detected. The interpolation job is done by mvtools, CInterpolate will just detect the duplicate.
Milardo
3rd March 2022, 06:02
I don't have a source like yours. Anyway the filter is designed for videos who have duplicate frames, a non anime source should not have duplicate unless your source is telecined and instead of dropping the duplicate you interpolate it with CInterpolate + mvtools. In other cases you don't need it. CInterpolate's parameters are all about finding duplicates, if you want more interpolation set an higher thr value so that more duplicates are detected. The interpolation job is done by mvtools, CInterpolate will just detect the duplicate.
src = last
super = MSuper()
backvec = MAnalyse(super,blksize=64,overlap=32,lambda=1000*64,isb=true,delta=1)
iClip = MCompensate(super,backvec,time=50)
CInterpolate(iClip=iClip, thr=1.00)
last
Would this script be the basic example and did i get "thr=1.00" a possible value?
Ceppo
3rd March 2022, 08:36
Use this presets. You should toy with mvtools to see what you like and what you don't like tho.
function iClip(clip src)
{
src
super = MSuper()
backvec = MAnalyse(super,blksize=4,overlap=2,isb=true,delta=1)
forwvec = MAnalyse(super,blksize=4,overlap=2,isb=false,delta=1)
MFlowInter(src,super,backvec,forwvec,blend=false,time=50)
return last
}
function iClip2(clip src)
{
src
super = MSuper()
backvec = MAnalyse(super,blksize=64,overlap=32,isb=true,delta=1)
forwvec = MAnalyse(super,blksize=64,overlap=32,isb=false,delta=1)
MFlowInter(src,super,backvec,forwvec,blend=false,time=50)
return last
}
So you do:
CInterpolate(iClip=iClip())
or
CInterpolate(iClip=iClip2())
You can use thr=1.0 if you want, sure. It will detect more frames as duplicates.
You can also set a denoise to get a better duplicate detection against noise.
CInterpolate(iClip=iClip2(),dClip=FFT3DFilter(sigma=4))
real.finder
3rd March 2022, 22:17
EDIT: mode 4 runs at 500fps to me. What's the point of making it faster and losing precision?
I was thinking about the opposite :) which is make it slower optionally
real.finder
3rd March 2022, 23:14
My idea for the mouth problem didn't work on anime. So it was pointless :). I had another idea for mode 3 and mode 4. Just decrease ntN parameter to get less false n matches.
is there a way to not match with n in first place? like mode=0 in tfm
0 = 2-way match (p/c)
I did try ntN=0 for https://forum.doom9.org/showthread.php?p=1964470#post1964470 but it not work well
edit: the n matching doesn't make sense for "tff: top field first" source anyway as the p matching doesn't make sense for "bff: bottom field first", maybe we need option to limit the matching for p/c for tff and p/n for bff
about idea for mouth problem I remember this was a good fix https://github.com/realfinder/AVS-Stuff/blob/c6a3ece311f825c346760cfae9ef518758b5d578/avs%202.5%20and%20up/AnimeIVTC.avsi#L84 and https://github.com/realfinder/AVS-Stuff/blob/c6a3ece311f825c346760cfae9ef518758b5d578/avs%202.5%20and%20up/AnimeIVTC.avsi#L289
the basic idea of it is to compare the output with the bob output using https://github.com/pinterf/TIVTC/blob/9c47880b3db1691ee928a6e1b953eedd852a6d1c/Doc_TIVTC/FrameDiff%20-%20READ%20ME.txt#L24
you can use the concept but instead of reverse the field it will be the output of "mode 4 (TIVTC)" vs "mode 3 (Decomb)" or optionally even better like mode 4 vs mode 3 vs mode 2
by maybe make "mode -1" mean "mode 4 vs mode 3" and "mode -2" mean "mode 4 vs mode 3 vs mode 2" and "mode -3" mean "mode 4 vs mode 3 vs mode 2 vs mode 1"
Ceppo
4th March 2022, 06:50
is there a way to not match with n in first place? like mode=0 in tfm
CTelecineNew(bob=true).SelectEven() is p match only.
edit: the n matching doesn't make sense for "tff: top field first" source anyway as the p matching doesn't make sense for "bff: bottom field first", maybe we need option to limit the matching for p/c for tff and p/n for bff
The parity is internally detected, if change the field order like AssumeBFF() for a TFF one. You are going to get the wrong result, I think it is b/u match from TFM. Which don't make any sense to me.
I was thinking about the opposite which is make it slower optionally
Well, it's the slowest formula already :).
the basic idea of it is to compare the output with the bob output using https://github.com/pinterf/TIVTC/blo...D%20ME.txt#L24
I think that's something to do after CPostProcessing, that I have yet to update with the other modes. But I will think about it.
real.finder
4th March 2022, 06:59
CTelecineNew(bob=true).SelectEven() is p match only.
that not work for vfr case with 60i :) and I need "2-way match" which mean (p/c) for tff or (c/n) for bff
Ceppo
4th March 2022, 08:12
that not work for vfr case with 60i and I need "2-way match" which mean (p/c) for tff or (c/n) for bff
Let me explain, so that we are sure we are comparing apple with apple, since I can't follow you when you say tff and bff.
The parity is checked internally, so you will get the correct n match whatever your source is tff or bff. If you use AssumeTFF on a BFF clip (or the inverse) you will get a TFM u match. So I don't understand why on TFF you get a p match and on BFF you get a n match. The use of that, what it is?
U,B,P matches are useless. Here why:
P match: it is useful only on the last telecined frame before a post telecine cut. If you match with the previous you will eliminate the telecined frame but you will end up with a duplicate. So it is better to deinterlace and save the field without a match to retain the original content of the source. Another use is on the first frame of a post telecine cut, if the first frame is telecined the n match will end up giving you a duplicate of the following frame. So you lose the field without match forever.
B match: makes no sense in any way possible.
U match: it may be usefull in one single case. You get a frame with the correct field order, BUT the field are swapped cronologically. A u match will fix that. But to check for it is slow for not much gain so I was thinking of making a function to use before CTelecine to fix the parity of the frame in the case a u match is what you need, so that CTelecine can get the u match by doing his standard n match.
So if I'm missing something please explain your point.
Ceppo
4th March 2022, 09:10
mua gmail edu hÃ*ng tốt giá rẻ có dịch vụ giao hÃ*ng thu tiá»n táº*n nÆ¡i đảm bảo cho khách hÃ*ng. phụ bạn má»™t tay chúc bạn ngÃ*y phát triển
Or is another language or my browser don't support the characters. So I can't read.
ChaosKing
4th March 2022, 09:22
It's a spam post! (not the first time)
Ceppo
4th March 2022, 09:41
It's a spam post! (not the first time)
I see, never seen that in my life. Thanks for clarifying.
kedautinh12
4th March 2022, 10:27
mua gmail edu hÃ*ng tốt giá rẻ có dịch vụ giao hÃ*ng thu tiá»n táº*n nÆ¡i đảm bảo cho khách hÃ*ng. phụ bạn má»™t tay chúc bạn ngÃ*y phát triển
Or is another language or my browser don't support the characters. So I can't read.
I knew that language. It's Vietnamese language. You can read it if forum support Vietnamese :D
real.finder
4th March 2022, 19:40
Let me explain, so that we are sure we are comparing apple with apple, since I can't follow you when you say tff and bff.
The parity is checked internally, so you will get the correct n match whatever your source is tff or bff. If you use AssumeTFF on a BFF clip (or the inverse) you will get a TFM u match. So I don't understand why on TFF you get a p match and on BFF you get a n match. The use of that, what it is?
U,B,P matches are useless. Here why:
P match: it is useful only on the last telecined frame before a post telecine cut. If you match with the previous you will eliminate the telecined frame but you will end up with a duplicate. So it is better to deinterlace and save the field without a match to retain the original content of the source. Another use is on the first frame of a post telecine cut, if the first frame is telecined the n match will end up giving you a duplicate of the following frame. So you lose the field without match forever.
B match: makes no sense in any way possible.
U match: it may be usefull in one single case. You get a frame with the correct field order, BUT the field are swapped cronologically. A u match will fix that. But to check for it is slow for not much gain so I was thinking of making a function to use before CTelecine to fix the parity of the frame in the case a u match is what you need, so that CTelecine can get the u match by doing his standard n match.
So if I'm missing something please explain your point.
ok, I forget that in bob case we need both (p/c) and (c/n) depending on which field we are in now, so your "CTelecineNew(bob=true).SelectEven() is p match only." is the answer I wanted
anyway, about the mouth problem, I note CTelecineNew(mode=4) kinda worst than tfm(pp=0), they should be same I think
edit: and what about adding optional clip parameter in CTelecineNew to make it do only match math from (and output from original of course), so we can use prefilterd clip with some denoise that fits the source we work on? also with it the nt will be 0 by default
Ceppo
4th March 2022, 20:44
anyway, about the mouth problem, I note CTelecineNew(mode=4) kinda worst than tfm(pp=0), they should be same I think
I will look into that. EDIT: Did you try sse=false? Is true by default, TFM default should be false. EDIT: you should match the nt setting as well.
edit: and what about adding optional clip parameter in CTelecineNew to make it do only match math from (and output from original of course), so we can use prefilterd clip with some denoise that fits the source we work on? also with it the nt will be 0 by default
Yes, I can add a dClip for that. Now I'm working on reworking the old functions and adding colorspaces. So I will need some days before releasing. About the nt default it must first tested, since noise is not the only source of error. The denoise might miss things like compression artefacts or whatever. Also the denoise should* be field based so it would not be very accurate.
real.finder
4th March 2022, 22:16
CTelecineNew(mode=4, sse=false) did it, thanks
About the nt default it must first tested, since noise is not the only source of error. The denoise might miss things like compression artefacts or whatever. Also the denoise should* be field based so it would not be very accurate.
indeed, who will using this dClip should already advanced enough to know these things
you should match the nt setting as well
how? tfm don't has nt
Ceppo
5th March 2022, 05:42
Strange, since FieldDiff has it, so why TFM doesn't have it :eek:
real.finder
6th March 2022, 08:08
the best what I got now for the mouth problem
bob1=stgmc(useEdiExt=2,EdiExt=sanimebob(useBWDIF=true, FastNnediHBD=true),Sharpness=0,tr2=2,ESearchP=true, Refinemotion=true, fastma=true)
istff=GetParity()
bob2=Interleave(TFM(field=istff ? 1 : 0, micmatching=0, mode=0, clip2=bob1.selecteven()), TFM(field=istff ? 0 : 1, micmatching=0, mode=0, clip2=bob1.selectodd()))
#~ CTelecineNew(bob=true,write=true,thr60i=0.2,nt=5,ntn=4,mode=4, sse=false)
CTelecineNew(bob=true,thr60i=0.2,inputTxt=true,nt=5,ntn=4,mode=4, sse=false)
CPostProcessing(0.1,0.2,isbob=true,edeint=bob1,edeint2=bob2)
mask = Sharpen(0,0.5).blur(1.58,0).Sharpen(0,0.2).blur(1.58,0).Sharpen(0,0.1).blur(1.58,0).CombMask (http://avisynth.nl/index.php/MTCombMask)(u=3,v=3)
last.MaskedMerge2 (http://avisynth.nl/index.php/CombMask)(bob2, mask,mi=30,blockx=8,blocky=8)
CDecimateNew(isBob=true,error=false)
Ceppo
6th March 2022, 08:55
What's the difference between TFM's bob and CTelecine's bob?
real.finder
6th March 2022, 14:33
What's the difference between TFM's bob and CTelecine's bob?
TFM cant do bob by itself, but anyway, as you can see, tfm got clip2, I know I can do CTelecineNew.CPostProcessing to get similar thing but not worth it since it's just a test
Ceppo
9th March 2022, 13:33
I want to give an update. I added colorspace support and rewritten most filters, but at the moment gas price increased and I'm cold. So I'm taking it slowly. You won't have to wait a whole month, but is not going to come out tomorrow. Also, I will upload everything to Github before releasing.
Selur
9th March 2022, 19:12
Any plans for a Vapoursynth version too?
Ceppo
9th March 2022, 21:15
Any plans for a Vapoursynth version too?
I don't use VapourSynth, BUT when I'm done with HBD and optimizations I might do it, but not sure.
Ceppo
21st March 2022, 16:23
v1.2.0 is out, please read the readme file.
Also, I adopted a dog that was abandoned and she cries every night and I can't sleep, and I can't figure out out to release the draft from GitHub, since my head hurts if someone can help :D
Also, there might be some semantic bug going on since I'm out of shape and time. Please, feedback is appreciated.
ChaosKing
21st March 2022, 17:22
and I can't figure out out to release the draft from GitHub, since my head hurts if someone can help :D
You just click on "Create a new release" under releases (right sidebar)
There is also no CTools repo!? Probably set to private? https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/managing-repository-settings/setting-repository-visibility#changing-a-repositorys-visibility
Ceppo
21st March 2022, 17:30
Thanks a lot, I made it public :)
About the release, I did it but it is stuck forever in draft mode and I'm not in the right mind to figure out how to change that :p
real.finder
22nd March 2022, 00:14
thanks for the update
will play with it later since I got no time now
Ceppo
22nd March 2022, 11:02
Thanks real.finder, I'm eager to hear your opinion.
Also, I couldn't make a release cuz I didn't put a tag, and I didn't get it cuz my brain capacity was at 1% yesterday.
ChaosKing
22nd March 2022, 14:23
Glad it's back at 2% again :D
Ceppo
22nd March 2022, 18:24
Truth hurts lol
real.finder
22nd March 2022, 22:09
did some tests but I think I find a bug
CTelecine(bob=true,write=true,thr60i=0.2,nt=5,ntn=4,mode=4, sse=false, dclip=SeparateFields().Removegrain(4).Weave())
it crash avspmod with WindowsError: exception: access violation reading 0x0000000000000000 in "Run analysis pass"
Ceppo
23rd March 2022, 14:43
Thanks,
seems to happen with bob=true, I will look into it.
Ceppo
23rd March 2022, 15:37
Fix'd.
v1.2.1 is out.
I hope everything is alright, I still need to figure out this GitHub stuff :D
Ceppo
27th March 2022, 12:19
@real.finder
Any new test you did with my filter? Also, if you have some filter of yours that needs to be tested today I have not much to do. :)
real.finder
27th March 2022, 14:57
@real.finder
Any new test you did with my filter? Also, if you have some filter of yours that needs to be tested today I have not much to do. :)
Not yet, I am kinda busy these days :) but I will do soon (maybe today)
btw, you still didn't give your Feedback about https://forum.doom9.org/showpost.php?p=1965813&postcount=843 output :rolleyes:
Ceppo
27th March 2022, 16:58
QTGMC()
https://i.ibb.co/09bx3Wt/qtgmc.png
sanimebob2()
https://i.ibb.co/8cg5zpZ/sanimebob2.png
bob = QTGMC()
CTelecine(bob=true,sse=false,dClip=CFieldSofter(4))
CPostProcessing(isBob=true,edeint2=bob)
https://i.ibb.co/2t68N0N/script.png
Your script has a problem on the mouth that qtgmc doesn't have (it still gets it wrong tho), also yours seems to retain a bit more details than my script however, my script is 250fps+ while sanimebob is about 4-5fps. For the rest didn't find much difference, could you try mod it, I'm interested in the details it retains :)
real.finder
27th March 2022, 22:19
QTGMC()
https://i.ibb.co/09bx3Wt/qtgmc.png
sanimebob2()
https://i.ibb.co/8cg5zpZ/sanimebob2.png
bob = QTGMC()
CTelecine(bob=true,sse=false,dClip=CFieldSofter(4))
CPostProcessing(isBob=true,edeint2=bob)
https://i.ibb.co/2t68N0N/script.png
Your script has a problem on the mouth that qtgmc doesn't have (it still gets it wrong tho), also yours seems to retain a bit more details than my script however, my script is 250fps+ while sanimebob is about 4-5fps. For the rest didn't find much difference, could you try mod it, I'm interested in the details it retains :)
can I got a short sample that have this frame?
Ceppo
28th March 2022, 10:28
https://www.mediafire.com/file/at0mup1flbkuutb/Pokimooon.m2v/file
I gave you bit larger sample, since there is a lot of stuff going on. This DVD has a lot of strange things, if you need other samples I will upload them.
That frame is probably a B/U match, it has the fields switched in chronological order.
real.finder
28th March 2022, 15:37
yes that kind of source is bad! it also got chroma blend, maybe we need dClip for CPostProcessing too in this case
real.finder
28th March 2022, 18:00
how about this?
# canimebob v1.0
function canimebob(clip i, int "stgmc_type", val "bobpresmooth", float "Str", float "Amp", bool "TV_range", int "tr2", bool "repblend", int "nnrep", string "tfm_params", int "NNSize", int "NNeurons", int "EdiQual", int "EdiMaxD", bool "FastNnediHBD") {
sisphbd = AvsPlusVersionNumber > 2294
SBitsn = sisphbd ? i.BitsPerComponent() : 8
FastNned = Default(FastNnediHBD, SBitsn > 8)
nnrep = default (nnrep, 2)
stgmc_type = default (stgmc_type, 0)
tfm_params = default(tfm_params, "")
Str = default (Str, 1.5)
tr2 = default (tr2, stgmc_type==0 ? 2 : 5)
STGMC_lsb = sisphbd ? SBitsn > 8 ? false : true : true
STGMC_n16 = STGMC_lsb && AvsPlusVersionNumber < 3382
STGMC_lsb = STGMC_n16 ? false : STGMC_lsb
istff=GetParity(i)
ii = FastNned ? i.convertbits(8, dither=1) : i
prefiltered_i = defined(bobpresmooth) ? isclip(bobpresmooth) ? bobpresmooth : IsString(bobpresmooth) ? Eval("i." + bobpresmooth) : undefined() : undefined()
iforbob = defined(prefiltered_i) ? prefiltered_i : ii.sh_bob(0,0.5).reduceflicker(strength=2).interlaced60or50(BFF=!istff)
iforbob = !defined(prefiltered_i) ? iforbob.SeparateFields().Repair(ii.SeparateFields()).weave() : iforbob
threads = sh_GetUserGlobalIMTint()
ib = FastNned ? i.sh_bob(0,0.5) : i
pni = iforbob.sh_Padding(2,4,2,4,threads=threads).nnedi3(-2, nsize=NNSize, nns=NNeurons, qual=EdiQual,threads=threads).crop(2,4,-2,-4,true)
ei = ii.eedi3(-2, mdis=EdiMaxD,sclip=pni,threads=threads)
pni = FastNned ? ib.slimit_dif(pni.convertbits(SBitsn), thr=1, elast=1.5) : pni
ei = FastNned ? ib.slimit_dif(ei.convertbits(SBitsn), thr=1, elast=1.5) : ei
ei = nnrep > 0 ? nnrep > 1 ? ei.slimit_dif2(pni,thr=4) : ei.Repair(pni,9) : ei
cbob = i.CTelecine(bob=true,nt=5,ntn=4,mode=4, sse=false,dclip=i.CFieldSofter(4))
cbob = cbob.CPostProcessing(isBob=true,edeint2=ei,mode=3)
bobclip = stgmc_type == 0 ? i.stgmc(tr0=-2,useEdiExt=1,EdiExt=cbob,Sharpness=0, Refinemotion=true, fastma=true, lsb=STGMC_lsb, n16=STGMC_n16, TV_range=TV_range, Str=Str, Amp=Amp, tr2=tr2, EdiThreads=threads) : i.stgmc(useEdiExt=2,EdiExt=cbob,Sharpness=0,ESearchP=true, Refinemotion=true, fastma=true, lsb=STGMC_lsb, n16=STGMC_n16, TV_range=TV_range, Str=Str, Amp=Amp, tr2=tr2, EdiThreads=threads)
i.sh_Padding(0,4,0,4,threads=threads).yadifmod2(mode=3, edeint=cbob.sh_Padding(0,4,0,4,threads=threads)).crop(0,4,-0,-4,true).Vinverse(clip2=pni).slimit_dif2(bobclip,thr=4)
}
originali = last
ffapp = originali.sh_bob(0,0.5).chroma_rep #or chroma_rep2
getparity(originali) ? ffapp.interlaced60or50 : ffapp.interlaced60or50(bff=true) #reinterlaced
MergeLuma(originali)
canimebob
when CPostProcessing got dClip it can be improved
edit: btw, I did update sanimebob2 too https://forum.doom9.org/showpost.php?p=1965813&postcount=843
real.finder
28th March 2022, 20:16
edit: and what about adding optional clip parameter in CTelecineNew to make it do only match math from (and output from original of course), so we can use prefilterd clip with some denoise that fits the source we work on? also with it the nt will be 0 by default
Yes, I can add a dClip for that. Now I'm working on reworking the old functions and adding colorspaces. So I will need some days before releasing. About the nt default it must first tested, since noise is not the only source of error. The denoise might miss things like compression artefacts or whatever. Also the denoise should* be field based so it would not be very accurate.
did some tests but I think I find a bug
CTelecine(bob=true,write=true,thr60i=0.2,nt=5,ntn=4,mode=4, sse=false, dclip=SeparateFields().Removegrain(4).Weave())
it crash avspmod with WindowsError: exception: access violation reading 0x0000000000000000 in "Run analysis pass"
Thanks,
seems to happen with bob=true, I will look into it.
Fix'd.
v1.2.1 is out.
I hope everything is alright, I still need to figure out this GitHub stuff :D
ok, I did test with
#~ CTelecine(bob=true,write=true,thr60i=0.2,nt=5,ntn=4,mode=4, sse=false,dclip=Blur(1.58,0))
CTelecine(bob=true,thr60i=0.2,inputTxt=true,nt=5,ntn=4,mode=4, sse=false)
CPostProcessing(3,6,isbob=true,edeint2=qtgmc(EdiMode="BWDIF+EEDI3",Sharpness=0, Refinemotion=true, n16=true, TV_range=true, tr2=2))
CDecimate(isBob=true,error=false)
with this https://forum.doom9.org/showthread.php?p=1964544#post1964544 (it was from Jigoku Shōjo 1st ep) and it fine in both "60i" and "false n matches" cases, dclip was very useful :) thanks for the fix btw
Ceppo
29th March 2022, 19:13
There are 2 problems with SAnimeBob2, 1. It has an interlaced leftover (look at the fade at the beginning of the clip I provided), 2. There is still that problem with the mouth.
About CAnimeBob, if you don't feed a QTGMC like clip to CPostProcessing it won't work well. With the default, I got 10fps and a much worst output than the script I made above. Also, it has an interlaced leftover problem as SAnimeBob2.
For the chroma blending, CFieldDeBlend should be able to fix most cases as long there is a duplicate field in the prev or next frame.
Can you elaborate on the use of dClip for CPostProcessing?
originali = last
ffapp = originali.sh_bob(0,0.5).chroma_rep #or chroma_rep2
getparity(originali) ? ffapp.interlaced60or50 : ffapp.interlaced60or50(bff=true) #reinterlaced
MergeLuma(originali)
canimebob
What does this code do?
Finally, aside bob, all the parameters of CTelecine are ignored when inputTxt=true, so if you are lazy you don't need to write down :). Also I advice CTelecine default or CTelecine(sse=false,dClip=CFIeldSofter(4)), you might want to test them.
Thanks for your support! :D
real.finder
29th March 2022, 19:23
this
originali = last
ffapp = originali.sh_bob(0,0.5).chroma_rep #or chroma_rep2
getparity(originali) ? ffapp.interlaced60or50 : ffapp.interlaced60or50(bff=true) #reinterlaced
MergeLuma(originali)
to fix chroma blending, see here https://forum.doom9.org/showthread.php?t=170364
Can you elaborate on the use of dClip for CPostProcessing?
CPostProcessing seems to have many false positive cases, that can be improved with filtered clip same as dClip in CTelecine
also, we need you here https://forum.doom9.org/showthread.php?p=1966602#post1966602 :)
Ceppo
29th March 2022, 20:09
CPostProcessing seems to have many false positive cases, that can be improved with filtered clip same as dClip in CTelecine
What kind of prefiltering would improve comb detection in your opinion?
originali = last
ffapp = originali.sh_bob(0,0.5).chroma_rep #or chroma_rep2
getparity(originali) ? ffapp.interlaced60or50 : ffapp.interlaced60or50(bff=true) #reinterlaced
MergeLuma(originali)
Tomorrow I will try, I my dog is cousing trouble :D Is all in AnimeIVTC.avsi?
real.finder
29th March 2022, 22:48
What kind of prefiltering would improve comb detection in your opinion?
something like this maybe
Sharpen(0,0.5).blur(1.58,0).Sharpen(0,0.2).blur(1.58,0).Sharpen(0,0.1).blur(1.58,0) (https://forum.doom9.org/showpost.php?p=1965247&postcount=111)
originali = last
ffapp = originali.sh_bob(0,0.5).chroma_rep #or chroma_rep2
getparity(originali) ? ffapp.interlaced60or50 : ffapp.interlaced60or50(bff=true) #reinterlaced
MergeLuma(originali)
Tomorrow I will try, I my dog is cousing trouble :D Is all in AnimeIVTC.avsi?
and https://github.com/realfinder/AVS-Stuff/blob/master/avs%202.5%20and%20up/Zs_RF_Shared.avsi ;)
Ceppo
30th March 2022, 13:17
Ok, I will add a dClip to CPostProcessing.
Also, I tried the chroma repair script, and it didn't work. Maybe I'm doing it wrong...
Script (nothing changes) (https://i.ibb.co/pKWPt3p/RFscript.png)
CFieldDeBlend() (https://i.ibb.co/m50wtqZ/CField-De-Blend.png)
real.finder
30th March 2022, 14:13
Ok, I will add a dClip to CPostProcessing.
Also, I tried the chroma repair script, and it didn't work. Maybe I'm doing it wrong...
Script (nothing changes) (https://i.ibb.co/pKWPt3p/RFscript.png)
CFieldDeBlend() (https://i.ibb.co/m50wtqZ/CField-De-Blend.png)
nope, you not doing it wrong, the method is not perfect in first place https://forum.doom9.org/showthread.php?p=1778933#post1778933 (until post #10) it kinda work in fast motion only and without 60i
Ceppo
30th March 2022, 14:23
Updated to v1.2.2 for CPP dClip.
Also I changed CResize default.
@real.finder
I think I will stick with CFieldDeBlend then.
real.finder
30th March 2022, 19:00
I did test with pokemon sample (frame 1570 to 2410) from you
originali = last
ffapp = originali.sh_bob(0,0.5).chroma_rep #or chroma_rep2 see dchr below
getparity(originali) ? ffapp.interlaced60or50 : ffapp.interlaced60or50(bff=true) #reinterlaced
MergeLuma(originali)
bob = qtgmc(EdiMode="BWDIF+EEDI3",Sharpness=0, Refinemotion=true, n16=true, TV_range=true, tr2=2)
CTelecine(dclip=Blur(1.58,0))
CPostProcessing(dclip=vsMSharpen().blur(1.58,0).RemoveGrain(),edeint2=bob.CFieldDeBlend())
it can be improved more, one of the problems is qtgmc don't like anime :devil:
Ceppo
30th March 2022, 20:04
Can you show me a frame in the source that the chroma repair can handle and CFieldDeBlend can't?
bob = qtgmc(EdiMode="BWDIF+EEDI3",Sharpness=0, Refinemotion=true, n16=true, TV_range=true, tr2=2)
CTelecine(dclip=Blur(1.58,0))
CFieldDeBlend() #CFieldDeBlend works only after fieldmatching
CPostProcessing(dclip=vsMSharpen().blur(1.58,0).RemoveGrain(),edeint2=bob) #This dClip gives me more false positive than default
Also, default CPostProcessing is meant to detect every mouth, so is very sensitive. You might want to change blksize/blkthr to get less of them, but some mouth might escape the check.
BTW, I think is good to use as fewer filters as possible, instead of vsMSharpen you might want to try CSharpen so that the script doesn't have much external dependency. As it is now you need:
1- QTGMC
2- vsMSharpen
3- Removegrain
4- BWDIF
5- EEDI3
6- CTools
Aside Removegrain/QTGMC, I don't think that the others are in everyone folders (I had to download them).
Also, I'm working on CTGMC, still alpha, when I'm done studing QTGMC we can try with that.
real.finder
30th March 2022, 22:57
Can you show me a frame in the source that the chroma repair can handle and CFieldDeBlend can't?
the point that I like to be safe and use all privileges from the filters, I didn't test much to know the Pros and Cons of CFieldDeBlend but anyway chroma_rep was based on srestore IIRC so I think it can not only replace Blend frame but also mix frames to get less Blend
BTW, I think is good to use as fewer filters as possible
I agree, but at the same time if I can get more quality I will mix some filters, at least this is the case that was in old sanimebob
Ceppo
31st March 2022, 14:29
@real.finder
Today I tried implementing my bob idea from scratch, looks there is less blending/shimmering. It lacks a lot of things, however, seems promising for Anime sources. Can I PM you the test script to hear your opinion?
real.finder
31st March 2022, 14:52
Can I PM you the test script to hear your opinion?
sure, why not?
Ceppo
31st March 2022, 15:43
I sent it (I hope), if you didn't get it, please tell me.
mastrboy
2nd April 2022, 13:50
These CTools plugins are great, thank you.
Any chance to get a 64bit version of IsCombedT (part of TCombMask) ?
Ceppo
2nd April 2022, 14:49
At the moment I'm full of stuff to do. Like HBD/linux/Vapursynth CTools then I have CTGMC and CBicubicResize to do, so I don't have time. Also, I never used that filter so I'm not interested in messing with it. I see that the creator is tritical and he probably used some C++ concept that I have yet to study. So you might want to make a request on the forum or something, hoping that some true programmer will help you out. :)
mastrboy
2nd April 2022, 18:31
At the moment I'm full of stuff to do. Like HBD/linux/Vapursynth CTools then I have CTGMC and CBicubicResize to do, so I don't have time. Also, I never used that filter so I'm not interested in messing with it. I see that the creator is tritical and he probably used some C++ concept that I have yet to study. So you might want to make a request on the forum or something, hoping that some true programmer will help you out. :)
Thanks for the fast reply, no problem, I'll try to solve this some other way.
Ceppo
2nd April 2022, 18:51
I posted CQTGMC in the first post. I will add parameters and stuff under request since it already does what I care about. :)
Ceppo
3rd April 2022, 17:13
Progressive Frame (https://i.ibb.co/rm70cWt/source.png)
QTGMC (https://i.ibb.co/nzkPnc3/QTGMC.png)
CQTGMC (https://i.ibb.co/4g1bMfC/CQTGMC.png)
Here are some screenshots to see the difference, as you can see CQTGMC does a better job than QTGMC, but it is slower. The intent is to use CQTGMC with CPostProcessing to reduce its usage to leftover combed so you don't need years to encode a movie. If you want a faster solution then you should stick to QTGMC, in the future, I might try some faster settings to see if it still does it better at the same speed.
ChaosKing
3rd April 2022, 18:23
As long it is not "feisty2 slow" (0.01 fps) I prefer quality over speed.
Result looks great, no artifacts + no oversharpened look like in the qtgmc version, very nice!
Ceppo
3rd April 2022, 18:30
To me it runs at 6 fps while QTGMC is 20fps, so I need to fix this speed gap. :)
guest
8th April 2022, 07:28
Can you show me a frame in the source that the chroma repair can handle and CFieldDeBlend can't?
bob = qtgmc(EdiMode="BWDIF+EEDI3",Sharpness=0, Refinemotion=true, n16=true, TV_range=true, tr2=2)
CTelecine(dclip=Blur(1.58,0))
CFieldDeBlend() #CFieldDeBlend works only after fieldmatching
CPostProcessing(dclip=vsMSharpen().blur(1.58,0).RemoveGrain(),edeint2=bob) #This dClip gives me more false positive than default
Also, default CPostProcessing is meant to detect every mouth, so is very sensitive. You might want to change blksize/blkthr to get less of them, but some mouth might escape the check.
BTW, I think is good to use as fewer filters as possible, instead of vsMSharpen you might want to try CSharpen so that the script doesn't have much external dependency. As it is now you need:
1- QTGMC
2- vsMSharpen
3- Removegrain
4- BWDIF
5- EEDI3
6- CTools
Aside Removegrain/QTGMC, I don't think that the others are in everyone folders (I had to download them).
Also, I'm working on CTGMC, still alpha, when I'm done studing QTGMC we can try with that.
Hi Ceppo,
I'm trying to get ### DEINTERLACER #### CQTGMC by Ceppo to run with RipBot...
Not having much luck, are these ALL the dependencies it needs ??
I keep getting errors in CQTGMC.avs
kedautinh12
8th April 2022, 07:42
Read from here and add vinverse.dll
https://forum.doom9.org/showthread.php?p=1966996#post1966996
guest
8th April 2022, 07:51
Read from here and add vinverse.dll
https://forum.doom9.org/showthread.php?p=1966996#post1966996
Thanks again, ked, you're the best :)
I was trying with this :-
LoadPlugin("%AVISYNTHPLUGINS%\BWDIF\BWDIF.dll")
LoadPlugin("%AVISYNTHPLUGINS%\CTools\CTools.dll")
LoadPlugin("%AVISYNTHPLUGINS%\EEDI3\EEDI3.dll")
LoadPlugin("%AVISYNTHPLUGINS%\mvtools\mvtools2.dll")
LoadPlugin("%AVISYNTHPLUGINS%\nnedi3\nnedi3.dll")
LoadPlugin("%AVISYNTHPLUGINS%\RemoveGrain\RemoveGrain64.dll")
Import("%AVISYNTHPLUGINS%\scripts\extras\QTGMC.avs")
Import("%AVISYNTHPLUGINS%\scripts\extras\CQTGMC.avs")
video=CQTGMC(video, Sharpness=0.25, thSAD1=192, thSAD2=320, thSAD3=128, thSAD4=320)
kedautinh12
8th April 2022, 09:33
You can use rgtools replace removegrain64
Ceppo
8th April 2022, 12:32
You need:
rgTools.dll
masktools2.dll
mvtools2.dll
nnedi3.dll
To run CQTGMC(), if you don't tell me what kind of error you are getting, I can't help :p
guest
9th April 2022, 02:01
You need:
rgTools.dll
masktools2.dll
mvtools2.dll
nnedi3.dll
To run CQTGMC(), if you don't tell me what kind of error you are getting, I can't help :p
Thanks Ceppo,
I was using these :-
https://forum.doom9.org/showthread.php?p=1966665#post1966665
As it was the only "list" of dependencies I could find, and that's now also why I was getting errors.
If I get some errors now, I will let you know.
UPDATE:-
I got it to work :)
#Custom
LoadPlugin("%AVISYNTHPLUGINS%\CTools\CTools.dll")
LoadPlugin("%AVISYNTHPLUGINS%\masktools\masktools2.dll")
LoadPlugin("%AVISYNTHPLUGINS%\mvtools\mvtools2.dll")
LoadPlugin("%AVISYNTHPLUGINS%\nnedi3\nnedi3.dll")
LoadPlugin("%AVISYNTHPLUGINS%\RgTools\RgTools.dll")
Import("%AVISYNTHPLUGINS%\scripts\extras\CQTGMC.avs")
Import("%AVISYNTHPLUGINS%\scripts\extras\QTGMC.avs")
video=CQTGMC(video, Sharpness=0.25, thSAD1=192, thSAD2=320, thSAD3=128, thSAD4=320)
Cheers
Ceppo
9th April 2022, 12:26
BTW, you don't need CTools and QTGMC to run CQTGMC :)
real.finder
12th April 2022, 18:21
there are many hybrid DVDs that got film (24 fps) and video (30 fps) content by different proportions
tivtc got d2v parameter for this case, but we are in avs+ age that got frame properties, more info https://github.com/pinterf/TIVTC/issues/18
so maybe CTools should use frame properties for these cases to not do an unnecessary matches or other unnecessary process if the frame is in film (24 fps) section or even video (30 fps) progressive
and in the future even VFR can be done with frame properties and that mean one pass and no log file at all! https://forum.doom9.org/showthread.php?p=1960041&highlight=vfr#post1960041 and https://forum.doom9.org/showthread.php?p=1960175&highlight=vfr#post1960175
Ceppo
13th April 2022, 11:34
Thanks for your support.
so maybe CTools should use frame properties for these cases to not do an unnecessary matches or other unnecessary process if the frame is in film (24 fps) section or even video (30 fps) progressive
Is the d2v file that tells you if the cycle is 24fps or 30fps? I use DGDECNV, since is the only "safe" way for h264 interlaced in my experience, does it supports that too?
In any case, frame proprieties have many disadvantages compared to a txt file. Once you did the analysis pass CTelecine and CDecimate become free, since they only call the frame and nothing more. By doing this you can decimate a CQTGMC/QTGMC output using CTelecine metrics with CDecimate, if I use frame properties I can't do that.
I don't know how frame properties work but if you need to call the frame to get them, you will need to call 5 frames every 4 frames, while CDecimate is currently free since it does everything at the startup. Also, with frame properties, I can't do the default startup error, which is the whole point of the filter.
However, I could use frame properties to skip calculation in the field matching, and get more correct results, if mpeg2source automatically adds them to the source when it loads the d2v file. And I also need sample plugin to see how this stuff is done :)
real.finder
13th April 2022, 13:37
Is the d2v file that tells you if the cycle is 24fps or 30fps?
I think so, if it soft telecine indeed, I don't know if DGDECNV file is the same but I think soft telecine can be found only in mpeg2 dvd
frame proprieties have many disadvantages compared to a txt file. Once you did the analysis pass CTelecine and CDecimate become free, since they only call the frame and nothing more. By doing this you can decimate a CQTGMC/QTGMC output using CTelecine metrics with CDecimate, if I use frame properties I can't do that.
yes, but in case someone hate doing analysis pass :) so it won't hurt if we got both
about others, I think you can PM/email pinterf for help
ChaosKing
13th April 2022, 13:43
However, I could use frame properties to skip calculation in the field matching, and get more correct results, if mpeg2source automatically adds them to the source when it loads the d2v file. And I also need sample plugin to see how this stuff is done :)
I would look at some repos by Asd-g.
https://github.com/Asd-g/MPEG2DecPlus/commit/30508c32477cad7e0dade724b3faa6d36911b0e5
https://github.com/Asd-g/AviSynthPlus-PropToClip/blob/main/src/PropToClip.cpp
Ceppo
13th April 2022, 14:09
Ok, I will do it. It's in my TODO list. But now I have to study that DSP book, so I know better what I'm doing :)
Ceppo
18th April 2022, 12:11
I update CQTGMC and I left also the prev version. It should be faster and more accurate. If someone can test them is appreciated.
Ceppo
26th April 2022, 13:55
Nobody was around at work and I did this, no field matching mouth problem:
D2VSource("VTS_01_1.d2v")
src = last
nnedi3(-2)
src_nnd = last
DoubleWeave(src).SelectOdd()
nxt = last
nnedi3(-2)
nxt_nnd = last
prv = nxt.DuplicateFrame(0)
src_nnd
src_A = mt_average(last,Trim(1,0),u=3,v=3)
src_B = mt_average(last,DuplicateFrame(0),u=3,v=3)
ScriptClip("""
src_P = YDifferenceFromPrevious()
src_N = Trim(1,0).YDifferenceFromPrevious()
src_N < src_P ? src_A : src_B
""")
src_C = mt_average(SelectEven(),SelectOdd(),u=3,v=3)
src_match = mt_lutxy(src_C,SelectEven(),"x y - abs",u=3,v=3)
nxt_nnd
nxt_A = mt_average(last,Trim(1,0),u=3,v=3)
nxt_B = mt_average(last,DuplicateFrame(0),u=3,v=3)
ScriptClip("""
nxt_P = YDifferenceFromPrevious()
nxt_N = Trim(1,0).YDifferenceFromPrevious()
nxt_N < nxt_P ? nxt_A : nxt_B
""")
nxt_C = mt_average(SelectEven(),SelectOdd(),u=3,v=3)
nxt_match = mt_lutxy(nxt_C,SelectEven(),"x y - abs",u=3,v=3)
prv_match = mt_lutxy(nxt_C.DuplicateFrame(0),SelectEven().DuplicateFrame(0),"x y - abs",u=3,v=3)
src
ScriptClip("""
CLuma = AverageLuma(src_match)
NLuma = AverageLuma(nxt_match)
PLuma = AverageLuma(prv_match)
NLuma < CLuma ? nxt.subtitle("nxt") : PLuma < CLuma ? prv.subtitle("prv") : src.subtitle("src")
""")
real.finder
26th April 2022, 18:12
Nobody was around at work and I did this, no field matching mouth problem:
even if it not a big problem with dClip, but will test and see, thanks
real.finder
19th May 2022, 14:22
Nobody was around at work and I did this, no field matching mouth problem:
D2VSource("VTS_01_1.d2v")
src = last
nnedi3(-2)
src_nnd = last
DoubleWeave(src).SelectOdd()
nxt = last
nnedi3(-2)
nxt_nnd = last
prv = nxt.DuplicateFrame(0)
src_nnd
src_A = mt_average(last,Trim(1,0),u=3,v=3)
src_B = mt_average(last,DuplicateFrame(0),u=3,v=3)
ScriptClip("""
src_P = YDifferenceFromPrevious()
src_N = Trim(1,0).YDifferenceFromPrevious()
src_N < src_P ? src_A : src_B
""")
src_C = mt_average(SelectEven(),SelectOdd(),u=3,v=3)
src_match = mt_lutxy(src_C,SelectEven(),"x y - abs",u=3,v=3)
nxt_nnd
nxt_A = mt_average(last,Trim(1,0),u=3,v=3)
nxt_B = mt_average(last,DuplicateFrame(0),u=3,v=3)
ScriptClip("""
nxt_P = YDifferenceFromPrevious()
nxt_N = Trim(1,0).YDifferenceFromPrevious()
nxt_N < nxt_P ? nxt_A : nxt_B
""")
nxt_C = mt_average(SelectEven(),SelectOdd(),u=3,v=3)
nxt_match = mt_lutxy(nxt_C,SelectEven(),"x y - abs",u=3,v=3)
prv_match = mt_lutxy(nxt_C.DuplicateFrame(0),SelectEven().DuplicateFrame(0),"x y - abs",u=3,v=3)
src
ScriptClip("""
CLuma = AverageLuma(src_match)
NLuma = AverageLuma(nxt_match)
PLuma = AverageLuma(prv_match)
NLuma < CLuma ? nxt.subtitle("nxt") : PLuma < CLuma ? prv.subtitle("prv") : src.subtitle("src")
""")
I did test with your sample https://www.mediafire.com/file/at0mup1flbkuutb/Pokimooon.m2v/file
https://i.postimg.cc/NjHtwrMk/New-File-19-001588.png (https://postimages.org/)
Hey Ash ... why so serious?!
Orikson
4th January 2023, 00:34
Just wanted to tell you that I just found your CQTGMC-Plugin and was surprised that is should be even better that QTGMC :thanks: I will test it with some old familiy videos (MiniDV for now, Video8 later) and am looking for the absolute best quality, no matter how slow it will be :p
anton_foy
12th January 2023, 19:59
This filter is a degrain that blends stationary parts of the picture.
It takes the chroma difference into account to reduce blending by using a block based approch.
So the non stationary(static?) parts will be motion/moving parts and left untouched by cdegrain?
Then I have a request, to have an option to spatial smooth the untouched parts, or better yet if possible option to use an external clip to feed to filter the untouched parts. Example: CDegrain(3,5,32,4,dClip=src.fft3dfilter(),sClip=src.blur(0.7))
Where the 'sClip' is for filtering the untouched parts.
Great stuff, really hope to see your plugin for HBD soon!
Selur
14th January 2023, 08:34
I don't use VapourSynth, BUT when I'm done with HBD and optimizations I might do it, but not sure.
Is there still hope for a Vapoursynth port?
Cu
Selur
kedautinh12
14th January 2023, 09:11
Is there still hope for a Vapoursynth port?
Cu
Selur
When PyTorch's Vapoursynth filters can port to avisynth. Maybe in "one dream" :D
Selur
14th January 2023, 13:53
btw. I get a small speedup to cqtgmc when adding an 'opencl' option, which when enabled would use nnedi3cl (https://github.com/Asd-g/AviSynthPlus-NNEDI3CL) instead of nneedi3.
# Added opencl parameter which, when enabled, will use NNEDI3CL instead of NNEDI3
function CQTGMC(clip input, float "Sharpness", int "thSAD1", int "thSAD2", int "thSAD3", int "thSAD4", bool "opencl")
{
thSAD1 = default(thSAD1, 192)
thSAD2 = default(thSAD2, 320)
thSAD3 = default(thSAD3, 128)
thSAD4 = default(thSAD4, 320)
Sharpness = default(Sharpness, 0.25)
opencl = default(opencl, false)
padded = StackHorizontal(input,input.FlipHorizontal()).Crop(0,0,input.width()+input.width()%64,0)
padded = StackVertical(padded,padded.FlipVertical()).Crop(0,0,0,input.height()+input.height()%64)
bobbed = opencl ? padded.NNEDI3CL(field=-2) : padded.nnedi3(field=-2)
padded
TDeint(mode=1,sharp=false,tryWeave=true,edeint=bobbed)
RemoveGrain(12).GaussResize(width(),height(),0,0,width()+0.0001,height()+0.0001,p=2).Merge(last,0.25)
srchClip = last
super = MSuper()
bvec = MAnalyse(super,isb=true,blksize=64,overlap=32)
fvec = MAnalyse(super,isb=false,blksize=64,overlap=32)
Comp1 = MCompensate(super,bvec,thSAD=thSAD2)
Comp2 = MCompensate(super,fvec,thSAD=thSAD2)
Interleave(Comp1,last,Comp2)
super = MSuper()
bvec = MAnalyse(super,isb=true,blksize=64,overlap=32)
fvec = MAnalyse(super,isb=false,blksize=64,overlap=32)
Inter = MFlowInter(super,bvec,fvec,blend=false)
global CQTGMC_A = Inter.SelectEvery(3,0)
global CQTGMC_B = Inter.SelectEvery(3,1)
srchClip
ScriptClip("""
P = YDifferenceFromPrevious()
N = Trim(1,0).YDifferenceFromPrevious()
N < P ? CQTGMC_A : CQTGMC_B
""")
super = MSuper()
bVec1 = MAnalyse(super,isb=true,overlap=4,delta=1)
fVec1 = MAnalyse(super,isb=false,overlap=4,delta=1)
bobbed
super = MSuper(levels=1)
bComp1 = MCompensate(super,bVec1,thSAD=thSAD3)
fComp1 = MCompensate(super,fVec1,thSAD=thSAD3)
Interleave(\
SeparateFields(bobbed).SelectEvery(4,0),\
SeparateFields(fComp1).SelectEvery(4,1),\
SeparateFields(bComp1).SelectEvery(4,2),\
SeparateFields(bobbed).SelectEvery(4,3))
Weave()
super = MSuper(levels=1)
bComp1 = MCompensate(super, bVec1,thSAD=thSAD4)
fComp1 = MCompensate(super, fVec1,thSAD=thSAD4)
tMax = mt_logic(fComp1,"max",U=3,V=3).mt_logic(bComp1,"max",U=3,V=3)
tMin = mt_logic(fComp1,"min",U=3,V=3).mt_logic(bComp1,"min",U=3,V=3)
MDegrain1(super,bVec1,fVec1,thSAD=thSAD1)
sharpen = mt_adddiff(mt_makediff(Removegrain(20),u=3,v=3),u=3,v=3)
mt_clamp(sharpen,tMax,tMin,Sharpness,Sharpness,3,3,3)
super = MSuper(levels=1)
MDegrain1(super,bVec1,fVec1,thSAD=thSAD1)
Crop(0,0,-(input.width()%64),-(input.height()%64))
return last
}
Reel.Deel
14th January 2023, 18:16
Is there still hope for a Vapoursynth port?
Sadly I don't think Ceppo is coming back; I believe he was discouraged after an argument on GitHub.
anton_foy
14th January 2023, 18:50
Sadly I don't think Ceppo is coming back; I believe he was discouraged after an argument on GitHub.
Very sad. I made a request to Asd-g today:
https://github.com/Asd-g/AviSynthPlus-Scripts/issues/15
Selur
14th January 2023, 20:09
Always sad to see when a developer leaves, but thanks for the info.
Cu
Selur
kedautinh12
15th January 2023, 01:31
Sadly I don't think Ceppo is coming back; I believe he was discouraged after an argument on GitHub.
Can you share me link about it??
anton_foy
17th January 2023, 15:01
Not sure this is the right place to ask but since Ceppo is out of doom9 (at least since 10 months ago) I think forking his plugin would be in ok. Also I have not yet recieved a reply from Asd-g if he/she wants to modify/fork CTools.
The question is about the source code and how to modify it for HBD. I also see that it has no specific code for avx, avx2, avx512 etc. but as I am not even familiar with C++ or programming I leave that for now.
Here is my no-knowledge attempt to modify CDegrain.
type.h-file:
//type.h
#ifndef AVS_TYPES_H
#define AVS_TYPES_H
// Define all types necessary for interfacing with avisynth.dll
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
#include <cstddef>
#include <cstdarg>
#else
#include <stddef.h>
#include <stdarg.h>
#endif
// Raster types used by VirtualDub & Avisynth
typedef uint32_t Pixel32;
typedef uint16_t Pixel16;
//?
typedef Pixel16 Y_PLANE;
typedef Pixel16 U_PLANE;
typedef Pixel16 V_PLANE;
//?
typedef uint14_t Pixel14;
typedef Pixel14 Y_PLANE;
typedef Pixel14 U_PLANE;
typedef Pixel14 V_PLANE;
//
typedef uint12_t Pixel12;
typedef Pixel12 Y_PLANE;
typedef Pixel12 U_PLANE;
typedef Pixel12 V_PLANE;
//
typedef uint10_t Pixel10;
typedef Pixel10 Y_PLANE;
typedef Pixel10 U_PLANE;
typedef Pixel10 V_PLANE;
//
typedef uint8_t BYTE;
typedef uint10_t BYTE;
typedef uint12_t BYTE;
typedef uint14_t BYTE;
typedef uint16_t BYTE;
// Audio Sample information
typedef float SFLOAT;
#endif //AVS_TYPES_H
CDegrain.h-file:
#pragma once
#include <cmath>
#include <windows.h>
#include "avisynth.h"
class CDegrain : public GenericVideoFilter
{
int radius;
int nt;
int thr;
int blksize;
PClip dClip;
public:
CDegrain(PClip _child, int _radius, int _nt, int _thr, int _blksize, PClip _dClip, IScriptEnvironment* env);
PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env);
};
void CDegrain_Y(PVideoFrame(&src)[15], PVideoFrame(&den)[15], PVideoFrame& dst, int nt, int thr, int radius, int blksize);
void CDegrain_YUV420(PVideoFrame(&src)[15], PVideoFrame(&den)[15], PVideoFrame& dst, int nt, int thr, int radius, int blksize);
void CDegrain_YUV422(PVideoFrame(&src)[15], PVideoFrame(&den)[15], PVideoFrame& dst, int nt, int thr, int radius, int blksize);
void CDegrain_YUV444(PVideoFrame(&src)[15], PVideoFrame(&den)[15], PVideoFrame& dst, int nt, int thr, int radius, int blksize);
End of part 1.
anton_foy
17th January 2023, 15:03
CDegrain.cpp:
#include "CDegrain.h"
CDegrain::CDegrain(PClip _child, int _radius, int _nt, int _thr, int _blksize, PClip _dClip, IScriptEnvironment* env) : GenericVideoFilter(_child), radius(_radius), nt(_nt), thr(_thr), blksize(_blksize), dClip(_dClip)
{
if (!vi.IsY() && !vi.IsYUV420() && !vi.IsYUV422() && !vi.IsYUV444())
{
env->ThrowError("CDegrain: supported colorspaces are Y, YUV420, YUV422, YUV444!");
}
else if ((vi.IsYUV420() || vi.IsYUV422()) && blksize < 2)
{
env->ThrowError("CDegrain: YUV420/YUV422 min. blksize is 2!");
}
else if (radius < 0 || radius > 7)
{
env->ThrowError("CDegrain: radius values must be in the [1, 7] range!");
}
}
PVideoFrame __stdcall CDegrain::GetFrame(int n, IScriptEnvironment* env) {
int i;
PVideoFrame dst = env->NewVideoFrame(vi);
PVideoFrame src[15];
for (i = 0; i < radius; i += 1)
{
src[i] = child->GetFrame(max(n - radius + i, 0), env);
}
src[radius] = child->GetFrame(n, env);
for (i = 0; i < radius; i += 1)
{
src[i + radius + 1] = child->GetFrame(min(n + i + 1, vi.num_frames - 1), env);
}
PVideoFrame den[15];
if (!dClip)
{
vi.IsY() ? CDegrain_Y(src, src, dst, nt, thr, radius, blksize) : NULL;
vi.IsYUV420() ? CDegrain_YUV420(src, src, dst, nt, thr, radius, blksize) : NULL;
vi.IsYUV422() ? CDegrain_YUV422(src, src, dst, nt, thr, radius, blksize) : NULL;
vi.IsYUV444() ? CDegrain_YUV444(src, src, dst, nt, thr, radius, blksize) : NULL;
}
else
{
for (i = 0; i < radius; i += 1)
{
den[i] = dClip->GetFrame(max(n - radius + i, 0), env);
}
den[radius] = dClip->GetFrame(n, env);
for (i = 0; i < radius; i += 1)
{
den[i + radius + 1] = dClip->GetFrame(min(n + i + 1, vi.num_frames - 1), env);
}
vi.IsY() ? CDegrain_Y(src, den, dst, nt, thr, radius, blksize) : NULL;
vi.IsYUV420() ? CDegrain_YUV420(src, den, dst, nt, thr, radius, blksize) : NULL;
vi.IsYUV422() ? CDegrain_YUV422(src, den, dst, nt, thr, radius, blksize) : NULL;
vi.IsYUV444() ? CDegrain_YUV444(src, den, dst, nt, thr, radius, blksize) : NULL;
}
return dst;
}
void CDegrain_Y(PVideoFrame(&src)[15], PVideoFrame(&den)[15], PVideoFrame& dst, int nt, int thr, int radius, int blksize)
{
int i;
unsigned char* dstp;
dstp = dst->GetWritePtr(PLANAR_Y);
const unsigned char* srcp[15];
const unsigned char* denp[15];
for (i = 0; i < 15; i += 1)
{
srcp[min(i, radius * 2)] = src[min(i, radius * 2)]->GetReadPtr(PLANAR_Y);
denp[min(i, radius * 2)] = den[min(i, radius * 2)]->GetReadPtr(PLANAR_Y);
}
int dst_pitch;
dst_pitch = dst->GetPitch(PLANAR_Y);
int src_pitch[15];
int den_pitch[15];
for (i = 0; i < 15; i += 1)
{
src_pitch[min(i, radius * 2)] = src[min(i, radius * 2)]->GetPitch(PLANAR_Y);
den_pitch[min(i, radius * 2)] = den[min(i, radius * 2)]->GetPitch(PLANAR_Y);
}
int height = dst->GetHeight(PLANAR_Y);
int row_size = dst->GetRowSize(PLANAR_Y);
int64_t BSY = 0;
int64_t BSX = 0;
BSY += min(1, height % blksize);
BSY += height / blksize;
BSX += min(1, row_size % blksize);
BSX += row_size / blksize;
auto SUM = new int[BSY * BSX][15];
memset(SUM, 0, BSY * BSX * 15 * sizeof(int));
int BX, BY;
int pixel_sum[2];
int x, y, a, b, temp;
//DIFFERENCE
for (y = 0; y < height; y += 1)
{
BY = y / blksize;
BY += y % blksize ? 1 : 0;
for (x = 0; x < row_size; x += 1)
{
BX = x / blksize;
BX += x % blksize ? 1 : 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
temp = abs(denp[i][x] - denp[radius][x]);
SUM[BY * BSY + BX][i] += temp > nt ? 255 : temp;
}
}
for (i = 0; i < radius * 2 + 1; i += 1)
{
denp[i] += den_pitch[i];
}
}
//BLENDING
for (y = 0; y < height; y += 1)
{
BY = y / blksize;
BY += y % blksize ? 1 : 0;
for (x = 0; x < row_size; x += 1)
{
BX = x / blksize;
BX += x % blksize ? 1 : 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
pixel_sum[0] = 0;
pixel_sum[1] = 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
pixel_sum[0] += SUM[BY * BSY + BX][i] <= thr ? 1 : 0;
pixel_sum[1] += SUM[BY * BSY + BX][i] <= thr ? srcp[i][x] : 0;
}
dstp[x] = int(pixel_sum[1] / static_cast<float>(pixel_sum[0]) + 0.5f);
}
}
dstp += dst_pitch;
for (i = 0; i < radius * 2 + 1; i += 1)
{
srcp[i] += src_pitch[i];
}
}
}
void CDegrain_YUV420(PVideoFrame(&src)[15], PVideoFrame(&den)[15], PVideoFrame& dst, int nt, int thr, int radius, int blksize)
{
int i;
unsigned char* dstp[3];
dstp[0] = dst->GetWritePtr(PLANAR_Y);
dstp[1] = dst->GetWritePtr(PLANAR_U);
dstp[2] = dst->GetWritePtr(PLANAR_V);
const unsigned char* srcp[3][15];
const unsigned char* denp[3][15];
for (i = 0; i < 15; i += 1)
{
srcp[0][min(i, radius * 2)] = src[min(i, radius * 2)]->GetReadPtr(PLANAR_Y);
denp[0][min(i, radius * 2)] = den[min(i, radius * 2)]->GetReadPtr(PLANAR_Y);
srcp[1][min(i, radius * 2)] = src[min(i, radius * 2)]->GetReadPtr(PLANAR_U);
denp[1][min(i, radius * 2)] = den[min(i, radius * 2)]->GetReadPtr(PLANAR_U);
srcp[2][min(i, radius * 2)] = src[min(i, radius * 2)]->GetReadPtr(PLANAR_V);
denp[2][min(i, radius * 2)] = den[min(i, radius * 2)]->GetReadPtr(PLANAR_V);
}
int dst_pitch[3];
dst_pitch[0] = dst->GetPitch(PLANAR_Y);
dst_pitch[1] = dst->GetPitch(PLANAR_U);
dst_pitch[2] = dst->GetPitch(PLANAR_V);
int src_pitch[3][15];
int den_pitch[3][15];
for (i = 0; i < 15; i += 1)
{
src_pitch[0][min(i, radius * 2)] = src[min(i, radius * 2)]->GetPitch(PLANAR_Y);
den_pitch[0][min(i, radius * 2)] = den[min(i, radius * 2)]->GetPitch(PLANAR_Y);
src_pitch[1][min(i, radius * 2)] = src[min(i, radius * 2)]->GetPitch(PLANAR_U);
den_pitch[1][min(i, radius * 2)] = den[min(i, radius * 2)]->GetPitch(PLANAR_U);
src_pitch[2][min(i, radius * 2)] = src[min(i, radius * 2)]->GetPitch(PLANAR_V);
den_pitch[2][min(i, radius * 2)] = den[min(i, radius * 2)]->GetPitch(PLANAR_V);
}
int height = dst->GetHeight(PLANAR_Y);
int row_size = dst->GetRowSize(PLANAR_Y);
int64_t BSY = 0;
int64_t BSX = 0;
BSY += min(1, height % blksize);
BSY += height / blksize;
BSX += min(1, row_size % blksize);
BSX += row_size / blksize;
auto SUM = new int[BSY * BSX][15];
memset(SUM, 0, BSY * BSX * 15 * sizeof(int));
int BX, BY;
int pixel_sum[3];
int x, y, a, b, temp;
//DIFFERENCE
for (y = 0; y < height; y += 1)
{
BY = y / blksize;
BY += y % blksize ? 1 : 0;
for (x = 0; x < row_size; x += 1)
{
BX = x / blksize;
BX += x % blksize ? 1 : 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
temp = abs(denp[0][i][x] - denp[0][radius][x]);
SUM[BY * BSY + BX][i] += temp > nt ? 255 : temp;
}
if (!(y % 2) && !(x % 2))
{
for (i = 0; i < radius * 2 + 1; i += 1)
{
temp = abs(denp[1][i][x / 2] - denp[1][radius][x / 2]);
SUM[BY * BSY + BX][i] += temp > nt ? 255 : temp;
temp = abs(denp[2][i][x / 2] - denp[2][radius][x / 2]);
SUM[BY * BSY + BX][i] += temp > nt ? 255 : temp;
}
}
}
for (i = 0; i < radius * 2 + 1; i += 1)
{
denp[0][i] += den_pitch[0][i];
}
if (!(y % 2))
{
for (i = 0; i < radius * 2 + 1; i += 1)
{
denp[1][i] += den_pitch[1][i];
denp[2][i] += den_pitch[2][i];
}
}
}
//BLENDING
for (y = 0; y < height; y += 1)
{
BY = y / blksize;
BY += y % blksize ? 1 : 0;
for (x = 0; x < row_size; x += 1)
{
BX = x / blksize;
BX += x % blksize ? 1 : 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
pixel_sum[0] = 0;
pixel_sum[1] = 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
pixel_sum[0] += SUM[BY * BSY + BX][i] <= thr ? 1 : 0;
pixel_sum[1] += SUM[BY * BSY + BX][i] <= thr ? srcp[0][i][x] : 0;
}
dstp[0][x] = int(pixel_sum[1] / static_cast<float>(pixel_sum[0]) + 0.5f);
// Continues in next post.
anton_foy
17th January 2023, 15:04
if (!(y % 2) && !(x % 2))
{
pixel_sum[0] = 0;
pixel_sum[1] = 0;
pixel_sum[2] = 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
pixel_sum[0] += SUM[BY * BSY + BX][i] <= thr ? 1 : 0;
pixel_sum[1] += SUM[BY * BSY + BX][i] <= thr ? srcp[1][i][x / 2] : 0;
pixel_sum[2] += SUM[BY * BSY + BX][i] <= thr ? srcp[2][i][x / 2] : 0;
}
dstp[1][x / 2] = int(pixel_sum[1] / static_cast<float>(pixel_sum[0]) + 0.5f);
dstp[2][x / 2] = int(pixel_sum[2] / static_cast<float>(pixel_sum[0]) + 0.5f);
}
}
}
dstp[0] += dst_pitch[0];
for (i = 0; i < radius * 2 + 1; i += 1)
{
srcp[0][i] += src_pitch[0][i];
}
if (!(y % 2))
{
dstp[1] += dst_pitch[1];
dstp[2] += dst_pitch[2];
for (i = 0; i < radius * 2 + 1; i += 1)
{
srcp[1][i] += src_pitch[1][i];
srcp[2][i] += src_pitch[2][i];
}
}
}
}
void CDegrain_YUV422(PVideoFrame(&src)[15], PVideoFrame(&den)[15], PVideoFrame& dst, int nt, int thr, int radius, int blksize)
{
int i;
unsigned char* dstp[3];
dstp[0] = dst->GetWritePtr(PLANAR_Y);
dstp[1] = dst->GetWritePtr(PLANAR_U);
dstp[2] = dst->GetWritePtr(PLANAR_V);
const unsigned char* srcp[3][15];
const unsigned char* denp[3][15];
for (i = 0; i < 15; i += 1)
{
srcp[0][min(i, radius * 2)] = src[min(i, radius * 2)]->GetReadPtr(PLANAR_Y);
denp[0][min(i, radius * 2)] = den[min(i, radius * 2)]->GetReadPtr(PLANAR_Y);
srcp[1][min(i, radius * 2)] = src[min(i, radius * 2)]->GetReadPtr(PLANAR_U);
denp[1][min(i, radius * 2)] = den[min(i, radius * 2)]->GetReadPtr(PLANAR_U);
srcp[2][min(i, radius * 2)] = src[min(i, radius * 2)]->GetReadPtr(PLANAR_V);
denp[2][min(i, radius * 2)] = den[min(i, radius * 2)]->GetReadPtr(PLANAR_V);
}
int dst_pitch[3];
dst_pitch[0] = dst->GetPitch(PLANAR_Y);
dst_pitch[1] = dst->GetPitch(PLANAR_U);
dst_pitch[2] = dst->GetPitch(PLANAR_V);
int src_pitch[3][15];
int den_pitch[3][15];
for (i = 0; i < 15; i += 1)
{
src_pitch[0][min(i, radius * 2)] = src[min(i, radius * 2)]->GetPitch(PLANAR_Y);
den_pitch[0][min(i, radius * 2)] = den[min(i, radius * 2)]->GetPitch(PLANAR_Y);
src_pitch[1][min(i, radius * 2)] = src[min(i, radius * 2)]->GetPitch(PLANAR_U);
den_pitch[1][min(i, radius * 2)] = den[min(i, radius * 2)]->GetPitch(PLANAR_U);
src_pitch[2][min(i, radius * 2)] = src[min(i, radius * 2)]->GetPitch(PLANAR_V);
den_pitch[2][min(i, radius * 2)] = den[min(i, radius * 2)]->GetPitch(PLANAR_V);
}
int height = dst->GetHeight(PLANAR_Y);
int row_size = dst->GetRowSize(PLANAR_Y);
int64_t BSY = 0;
int64_t BSX = 0;
BSY += min(1, height % blksize);
BSY += height / blksize;
BSX += min(1, row_size % blksize);
BSX += row_size / blksize;
auto SUM = new int[BSY * BSX][15];
memset(SUM, 0, BSY * BSX * 15 * sizeof(int));
int BX, BY;
int pixel_sum[3];
int x, y, a, b, temp;
//DIFFERENCE
for (y = 0; y < height; y += 1)
{
BY = y / blksize;
BY += y % blksize ? 1 : 0;
for (x = 0; x < row_size; x += 1)
{
BX = x / blksize;
BX += x % blksize ? 1 : 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
temp = abs(denp[0][i][x] - denp[0][radius][x]);
SUM[BY * BSY + BX][i] += temp > nt ? 255 : temp;
}
if (!(x % 2))
{
for (i = 0; i < radius * 2 + 1; i += 1)
{
temp = abs(denp[1][i][x / 2] - denp[1][radius][x / 2]);
SUM[BY * BSY + BX][i] += temp > nt ? 255 : temp;
temp = abs(denp[2][i][x / 2] - denp[2][radius][x / 2]);
SUM[BY * BSY + BX][i] += temp > nt ? 255 : temp;
}
}
}
for (i = 0; i < radius * 2 + 1; i += 1)
{
denp[0][i] += den_pitch[0][i];
denp[1][i] += den_pitch[1][i];
denp[2][i] += den_pitch[2][i];
}
}
//BLENDING
for (y = 0; y < height; y += 1)
{
BY = y / blksize;
BY += y % blksize ? 1 : 0;
for (x = 0; x < row_size; x += 1)
{
BX = x / blksize;
BX += x % blksize ? 1 : 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
pixel_sum[0] = 0;
pixel_sum[1] = 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
pixel_sum[0] += SUM[BY * BSY + BX][i] <= thr ? 1 : 0;
pixel_sum[1] += SUM[BY * BSY + BX][i] <= thr ? srcp[0][i][x] : 0;
}
dstp[0][x] = int(pixel_sum[1] / static_cast<float>(pixel_sum[0]) + 0.5f);
if (!(x % 2))
{
pixel_sum[0] = 0;
pixel_sum[1] = 0;
pixel_sum[2] = 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
pixel_sum[0] += SUM[BY * BSY + BX][i] <= thr ? 1 : 0;
pixel_sum[1] += SUM[BY * BSY + BX][i] <= thr ? srcp[1][i][x / 2] : 0;
pixel_sum[2] += SUM[BY * BSY + BX][i] <= thr ? srcp[2][i][x / 2] : 0;
}
dstp[1][x / 2] = int(pixel_sum[1] / static_cast<float>(pixel_sum[0]) + 0.5f);
dstp[2][x / 2] = int(pixel_sum[2] / static_cast<float>(pixel_sum[0]) + 0.5f);
}
}
}
dstp[0] += dst_pitch[0];
dstp[1] += dst_pitch[1];
dstp[2] += dst_pitch[2];
for (i = 0; i < radius * 2 + 1; i += 1)
{
srcp[0][i] += src_pitch[0][i];
srcp[1][i] += src_pitch[1][i];
srcp[2][i] += src_pitch[2][i];
}
}
}
void CDegrain_YUV444(PVideoFrame(&src)[15], PVideoFrame(&den)[15], PVideoFrame& dst, int nt, int thr, int radius, int blksize)
{
int i;
unsigned char* dstp[3];
dstp[0] = dst->GetWritePtr(PLANAR_Y);
dstp[1] = dst->GetWritePtr(PLANAR_U);
dstp[2] = dst->GetWritePtr(PLANAR_V);
const unsigned char* srcp[3][15];
const unsigned char* denp[3][15];
for (i = 0; i < 15; i += 1)
{
srcp[0][min(i, radius * 2)] = src[min(i, radius * 2)]->GetReadPtr(PLANAR_Y);
denp[0][min(i, radius * 2)] = den[min(i, radius * 2)]->GetReadPtr(PLANAR_Y);
srcp[1][min(i, radius * 2)] = src[min(i, radius * 2)]->GetReadPtr(PLANAR_U);
denp[1][min(i, radius * 2)] = den[min(i, radius * 2)]->GetReadPtr(PLANAR_U);
srcp[2][min(i, radius * 2)] = src[min(i, radius * 2)]->GetReadPtr(PLANAR_V);
denp[2][min(i, radius * 2)] = den[min(i, radius * 2)]->GetReadPtr(PLANAR_V);
}
int dst_pitch[3];
dst_pitch[0] = dst->GetPitch(PLANAR_Y);
dst_pitch[1] = dst->GetPitch(PLANAR_U);
dst_pitch[2] = dst->GetPitch(PLANAR_V);
int src_pitch[3][15];
int den_pitch[3][15];
for (i = 0; i < 15; i += 1)
{
src_pitch[0][min(i, radius * 2)] = src[min(i, radius * 2)]->GetPitch(PLANAR_Y);
den_pitch[0][min(i, radius * 2)] = den[min(i, radius * 2)]->GetPitch(PLANAR_Y);
src_pitch[1][min(i, radius * 2)] = src[min(i, radius * 2)]->GetPitch(PLANAR_U);
den_pitch[1][min(i, radius * 2)] = den[min(i, radius * 2)]->GetPitch(PLANAR_U);
src_pitch[2][min(i, radius * 2)] = src[min(i, radius * 2)]->GetPitch(PLANAR_V);
den_pitch[2][min(i, radius * 2)] = den[min(i, radius * 2)]->GetPitch(PLANAR_V);
}
int height = dst->GetHeight(PLANAR_Y);
int row_size = dst->GetRowSize(PLANAR_Y);
int64_t BSY = 0;
int64_t BSX = 0;
BSY += min(1, height % blksize);
BSY += height / blksize;
BSX += min(1, row_size % blksize);
BSX += row_size / blksize;
auto SUM = new int[BSY * BSX][15];
memset(SUM, 0, BSY * BSX * 15 * sizeof(int));
int BX, BY;
int pixel_sum[4];
int x, y, a, b, temp;
//DIFFERENCE
for (y = 0; y < height; y += 1)
{
BY = y / blksize;
BY += y % blksize ? 1 : 0;
for (x = 0; x < row_size; x += 1)
{
BX = x / blksize;
BX += x % blksize ? 1 : 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
temp = abs(denp[0][i][x] - denp[0][radius][x]);
SUM[BY * BSY + BX][i] += temp > nt ? 255 : temp;
temp = abs(denp[1][i][x] - denp[1][radius][x]);
SUM[BY * BSY + BX][i] += temp > nt ? 255 : temp;
temp = abs(denp[2][i][x] - denp[2][radius][x]);
SUM[BY * BSY + BX][i] += temp > nt ? 255 : temp;
}
}
for (i = 0; i < radius * 2 + 1; i += 1)
{
denp[0][i] += den_pitch[0][i];
denp[1][i] += den_pitch[1][i];
denp[2][i] += den_pitch[2][i];
}
}
//BLENDING
for (y = 0; y < height; y += 1)
{
BY = y / blksize;
BY += y % blksize ? 1 : 0;
for (x = 0; x < row_size; x += 1)
{
BX = x / blksize;
BX += x % blksize ? 1 : 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
pixel_sum[0] = 0;
pixel_sum[1] = 0;
pixel_sum[2] = 0;
pixel_sum[3] = 0;
for (i = 0; i < radius * 2 + 1; i += 1)
{
pixel_sum[0] += SUM[BY * BSY + BX][i] <= thr ? 1 : 0;
pixel_sum[1] += SUM[BY * BSY + BX][i] <= thr ? srcp[0][i][x] : 0;
pixel_sum[2] += SUM[BY * BSY + BX][i] <= thr ? srcp[1][i][x] : 0;
pixel_sum[3] += SUM[BY * BSY + BX][i] <= thr ? srcp[2][i][x] : 0;
}
dstp[0][x] = int(pixel_sum[1] / static_cast<float>(pixel_sum[0]) + 0.5f);
dstp[1][x] = int(pixel_sum[2] / static_cast<float>(pixel_sum[0]) + 0.5f);
dstp[2][x] = int(pixel_sum[3] / static_cast<float>(pixel_sum[0]) + 0.5f);
}
}
dstp[0] += dst_pitch[0];
dstp[1] += dst_pitch[1];
dstp[2] += dst_pitch[2];
for (i = 0; i < radius * 2 + 1; i += 1)
{
srcp[0][i] += src_pitch[0][i];
srcp[1][i] += src_pitch[1][i];
srcp[2][i] += src_pitch[2][i];
}
}
}
Someone who knows better could tell me where the BitsPerComponent should be? Or if this code is structured in another manner.
StainlessS
17th January 2023, 20:26
I once asked Pinterf if there was a good example for coding for AVS+ colorspace stuff, [I cant find the posts, but], see here reply suggested Average plugin :-
https://github.com/pinterf/Average/releases/tag/0.95
anton_foy
18th January 2023, 00:35
I once asked Pinterf if there was a good example for coding for AVS+ colorspace stuff, [I cant find the posts, but], see here reply suggested Average plugin :-
https://github.com/pinterf/Average/releases/tag/0.95
Thanks for the link! Way over my head atm but hopefully Im getting the hang of things later on.
Harassing the ChatGPT bot to spit out CUDA optimizations of CTools and hbd support. One can only dream I guess.
Edit: here I paste what the bot did. Gibberish or usable?
Cdegrain_cuda.cpp:
https://pastebin.com/cCsNN3Uh
Cdegrain.h (cuda):
https://pastebin.com/HDy5wS10
AvisynthpluginInit_cuda.cpp:
https://pastebin.com/VRAQhgri
types_cuda.h:
https://pastebin.com/SCnCWY3N
minmax_cuda.h:
https://pastebin.com/0MTCE2pB
cpuid_cuda.h:
https://pastebin.com/Ndu6wSJu
Alignment_cuda.h:
https://pastebin.com/xdh1hNM2
Ctemporalsoften_cuda.cpp:
https://pastebin.com/d4bBPxD2
Ceppo
18th January 2023, 22:47
I got the notification for this CDegrain stuff, glad someone found uselful my work and wants to improve it. BTW, it was not for the argument on github iyeah I was pissed, I admit it) that i leaved but because I'm tring to get a degree in philosophy in 1 year and I'm giving 3 exams for month, I also left my job, so I can't let myself get obsessed by my encoding obsession otherwise or I want be able to reach my goal. I won't answer to any replay to protect myself from the ipnoting power of avisynth.
Reel.Deel
18th January 2023, 22:56
@Ceppo
Glad that I was wrong that you won't return :) ... It just sounded that way from your last words on there, and then you went missing. But good to hear that all is fine with you!
anton_foy
19th January 2023, 00:38
I got the notification for this CDegrain stuff, glad someone found uselful my work and wants to improve it. BTW, it was not for the argument on github iyeah I was pissed, I admit it) that i leaved but because I'm tring to get a degree in philosophy in 1 year and I'm giving 3 exams for month, I also left my job, so I can't let myself get obsessed by my encoding obsession otherwise or I want be able to reach my goal. I won't answer to any replay to protect myself from the ipnoting power of avisynth.
Good to hear from you, sorry about the job but good luck with your goals!
Thanks for letting me/us improve your code.
Ceppo
23rd January 2023, 20:23
I have a good news, to get a degree I need to do only 2 exams and write the thesis. So if someone mods CSharpen or a simple plugin like that I can rewrite CTools for HBD (when I want to relax to not think about philosophy) but is not something that I will do in a few days. Also, I have no knowlodge of optimization and stuff, and unless someone makes me an easy tutorial to get started, someone else will have to do the optimization.
Hope that helps.
anton_foy
23rd January 2023, 22:30
I have a good news, to get a degree I need to do only 2 exams and write the thesis. So if someone mods CSharpen or a simple plugin like that I can rewrite CTools for HBD (when I want to relax to not think about philosophy) but is not something that I will do in a few days. Also, I have no knowlodge of optimization and stuff, and unless someone makes me an easy tutorial to get started, someone else will have to do the optimization.
Hope that helps.
Yay Ceppo awesome news! I wish I could help but I know nothing about programming. But I don't think just making it HBD should be so hard. If I understand correctly (which I probably don't) then what I modded in the helper headers and cpp-files for hbd is enough?
From old avisynth to avs+ I was thinking the change is
yv12 becomes YUV420, YV16 - YUV422, yv24 - YUV444, Y8 - Y. Then call bitspercomponent and probably use bitLshift when need of scaling 0-256.
Someone who really knows this please correct me.
Ceppo
23rd January 2023, 22:35
I'm not a programmer, I need working examples to make experiments and learn that way to get the hang of it. Sadly, I have a humanistic CV, so I lack a lot of information about programming. :eek:
AND ON STACKOVERFLOW NOBODY CARES ABOUT AVISYNTH; WHYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
of course I'm drunk :)
Ceppo
24th January 2023, 17:17
I have only 1 exam this month, so I'm making experiments since I'm rusty. Can someone help me figure out why this plugins makes AVSPMOD crash? It's probabily something stupid, but I can't figure it out.
#pragma once
#include <avisynth.h>
class CReadVideoFrame
{
public:
PVideoFrame frame;
const unsigned char* pixel[3];
int pitch[3];
int height[3];
int row_size[3];
CReadVideoFrame(PVideoFrame src)
{
this->frame = src;
this->pixel[0] = this->frame->GetReadPtr(PLANAR_Y);
this->pixel[1] = this->frame->GetReadPtr(PLANAR_U);
this->pixel[2] = this->frame->GetReadPtr(PLANAR_V);
this->pitch[0] = this->frame->GetPitch(PLANAR_Y);
this->pitch[1] = this->frame->GetPitch(PLANAR_U);
this->pitch[2] = this->frame->GetPitch(PLANAR_V);
this->height[0] = this->frame->GetHeight(PLANAR_Y);
this->height[1] = this->frame->GetHeight(PLANAR_U);
this->height[2] = this->frame->GetHeight(PLANAR_V);
this->row_size[0] = this->frame->GetRowSize(PLANAR_Y);
this->row_size[1] = this->frame->GetRowSize(PLANAR_U);
this->row_size[2] = this->frame->GetRowSize(PLANAR_V);
};
};
class CWriteVideoFrame
{
public:
PVideoFrame frame;
unsigned char* pixel[3];
int pitch[3];
CWriteVideoFrame(PVideoFrame dst)
{
this->frame = dst;
this->pixel[0] = this->frame->GetWritePtr(PLANAR_Y);
this->pixel[1] = this->frame->GetWritePtr(PLANAR_U);
this->pixel[2] = this->frame->GetWritePtr(PLANAR_V);
this->pitch[0] = this->frame->GetPitch(PLANAR_Y);
this->pitch[1] = this->frame->GetPitch(PLANAR_U);
this->pitch[2] = this->frame->GetPitch(PLANAR_V);
};
};
class SimpleCopy : public GenericVideoFilter
{
public:
SimpleCopy(PClip _child, IScriptEnvironment* env) : GenericVideoFilter(_child)
{ }
PVideoFrame __stdcall GetFrame(int n, IScriptEnvironment* env)
{
CReadVideoFrame src(child->GetFrame(n, env));
CWriteVideoFrame dst(env->NewVideoFrame(vi));
for (int p = 0; p < 3; p++)
{
for (int y = 0; y < src.height[p]; y++)
{
for (int x = 0; x < src.row_size[p]; x++)
{
dst.pixel[p][x] = src.pixel[p][x];
}
dst.pixel[p] += dst.pitch[p];
src.pixel[p] += src.pitch[p];
}
}
return dst.frame;
}
};
AVSValue __cdecl Create_SimpleCopy(AVSValue args, void* user_data, IScriptEnvironment* env)
{
return new SimpleCopy(args[0].AsClip(), env);
}
const AVS_Linkage* AVS_linkage = 0;
extern "C" __declspec(dllexport) const char* __stdcall AvisynthPluginInit3(IScriptEnvironment * env, const AVS_Linkage* const vectors)
{
AVS_linkage = vectors;
env->AddFunction("SimpleCopy", "c", Create_SimpleCopy, 0);
return "SimpleCopy";
}
PoeBear
7th March 2023, 05:40
even if it not a big problem with dClip, but will test and see, thanks
Can I ask what the fix is with dClip to solve the field matching problem?
I'm enjoying CQTGMC on my live-action DVDs, but it seems to affect nearly every Fox Animation DVD I have, though they are notorious for being poorly encoded (Simpsons, Family Guy, etc)
real.finder
15th July 2023, 05:03
Can I ask what the fix is with dClip to solve the field matching problem?
I'm enjoying CQTGMC on my live-action DVDs, but it seems to affect nearly every Fox Animation DVD I have, though they are notorious for being poorly encoded (Simpsons, Family Guy, etc)
you can search in this Thread and see
anyway, if Ceppo still care, I came across a source with a stubborn scene that has mouth problem, so I used animeivtc (https://raw.githubusercontent.com/realfinder/AVS-Stuff/master/avs%202.5%20and%20up/AnimeIVTC.avsi) but even the default autoAssufthr1 was not enough so I did use "autoAssuf=true, autoAssufthr1=0.3"
so Ceppo may like port the method to CTelecine https://github.com/realfinder/AVS-Stuff/blob/8db8a29a8cf70b9f1ff42087101add3a70985933/avs%202.5%20and%20up/AnimeIVTC.avsi#L290-L307 as mode=7 or as new parameter
real.finder
14th October 2023, 15:53
after more tests seems http://avisynth.nl/index.php/IT is the best for field matching mouth problem
also seems Ceppo delete his account in github and also the project go with it so here the archive like for it https://web.archive.org/web/20230118221708/https://github.com/CeppoTools/CTools
kedautinh12
15th October 2023, 02:34
@real.finder did you test new ideas from Ceppo???
https://forum.doom9.org/showthread.php?t=185104
real.finder
15th October 2023, 03:43
@real.finder did you test new ideas from Ceppo???
https://forum.doom9.org/showthread.php?t=185104
didn't note it, I am busy with other things these days so I kinda not check doom9 as before
anyway it seems interesting, but still I hope for a plugin update not only for better Field Matching but also for better VFR and frame properties support Plus HBD
vBulletin® v3.8.11, Copyright ©2000-2026, vBulletin Solutions Inc.