Welcome to Doom9's Forum, THE in-place to be for everyone interested in DVD conversion.

Before you start posting please read the forum rules. By posting to this forum you agree to abide by the rules.

 

Go Back   Doom9's Forum > Capturing and Editing Video > Avisynth Development

Closed Thread
 
Thread Tools Search this Thread Display Modes
Old 23rd March 2019, 13:47   #4601  |  Link
tuanden0
Registered User
 
Join Date: Oct 2016
Posts: 111
New version of AVS+ (2772 and older) got glitch with FFMS2 when using to encode audio.

I tried to use AVS+ to cut some scenes of video and audio to watch on my smartphone.
After encode, video is OK but audio got some "noise".

But when I tried to use "LWLibavAudioSource" instead of "FFAudioSource", It's OK.
I used FFMS2 from here: https://forum.doom9.org/showthread.p...11#post1866411
Here's my simple script:
Quote:
c=FFVideoSource("E:\Download\Source\Maria Ozawa Collection Vol-02.mkv",colorspace="YV12")
c=AssumeFPS(c, 24000, 1001)
a=FFAudioSource("E:\Download\Source\Maria Ozawa Collection Vol-02.mkv")
a=AssumeFPS(a, 24000, 1001)
AudioDub(c,a)
Trim(0,718) + Trim(2872,31877) + Trim(34036,0)
tuanden0 is offline  
Old 23rd March 2019, 14:17   #4602  |  Link
wonkey_monkey
Formerly davidh*****
 
wonkey_monkey's Avatar
 
Join Date: Jan 2004
Posts: 2,493
Quote:
Originally Posted by pinterf View Post
There is nothing wrong with copying PClips. In the above example, is tmp unused deliberately?
Yes, even if I make not further reference to tmp the problem manifests. If I comment out that line, no problem. If child and child2 are different clips, no problem. The problem is that I don't get the expected pixels (checking the pixels of tmp->GetReadPtr() and src->GetReadPtr() gives different results).

MT mode is not used. I'll try to whittle it down to a more minimal example, as currently I'm only seeing it happen with a combination of two filters.
__________________
My AviSynth filters / I'm the Doctor
wonkey_monkey is offline  
Old 23rd March 2019, 14:53   #4603  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
@Wonkey
Frame Accurate source ? (although I guess frame should be cached anyways).

EDIT:
Maybe as debug assist, double frame height in constructor (vi.height), and return both frames stacked, maybe try ColorBars.ShowFrameNumber as source.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 23rd March 2019 at 14:59.
StainlessS is offline  
Old 23rd March 2019, 17:53   #4604  |  Link
wonkey_monkey
Formerly davidh*****
 
wonkey_monkey's Avatar
 
Join Date: Jan 2004
Posts: 2,493
Ahhh, I think I've been an idiot. It didn't occur to me that, because my first filter is incomplete, it's not being entirely deterministic (only the first few columns are being written). And then it further didn't occur to me that when I call GetFrame on it twice, it is actually getting the frame twice, and not caching or anything - on the first GetFrame it's coming back with one set of garbage data and on the second GetFrame it's coming back with different garbage data. That was the discrepancy I was seeing with the second filter.

So the first filter is faulty (due to being a work in progress) but the second filter could also be a bit smarter.
__________________
My AviSynth filters / I'm the Doctor
wonkey_monkey is offline  
Old 1st April 2019, 00:04   #4605  |  Link
gaak
Registered User
 
Join Date: Apr 2016
Posts: 27
Can someone supply an updated 64 bit version of Variableblur?

My apologies in advance if this is the wrong thread to make such a request, but can someone supply a 0.7 64 bit version of Variableblur to replace the 0.5 version out there now? Thanks.
gaak is offline  
Old 1st April 2019, 00:36   #4606  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
I was gonna have a go at compile but requires VS2010 as per below

Quote:
** As of version 0.6 the Visual Studio 2010 Service Pack 1 redistributable is required due to OpenMP multithreading.
v0.7 Zip @ SendSpace below this post in my sig, 32 bit only + source (for anybody wants to compile).

The 64 bit zip (via Wiki) on Archive.org seem not to be available.

EDIT: The source has Assembler in it, so dont know if compilable for x64 on VS2010.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 1st April 2019 at 00:44.
StainlessS is offline  
Old 1st April 2019, 01:05   #4607  |  Link
Reel.Deel
Registered User
 
Join Date: Mar 2012
Location: Texas
Posts: 1,664
Quote:
Originally Posted by StainlessS View Post
The 64 bit zip (via Wiki) on Archive.org seem not to be available.
Some guy (Yakub2.X see here) messed up a handful of the links on the avs+ 64-bit plugin page, I have not had time to go over and find and correct those mistakes.

Correct link is here:
http://avisynth.nl/index.php/Variabl...ived_Downloads
Reel.Deel is offline  
Old 1st April 2019, 02:03   #4608  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
OK thanx RD, but v0.7 seems not available anywhere(wiki or d9, or archive.org) , so maybe somebody could do compile of SendSpace in my sig zip
(the v0.5 x64 source also has Assembler, so I presume that it is actually compilable in VS2010).

EDIT: I spent some time searching web but could not find v0.7 x64, dll or source.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 1st April 2019 at 02:06.
StainlessS is offline  
Old 1st April 2019, 06:01   #4609  |  Link
Reel.Deel
Registered User
 
Join Date: Mar 2012
Location: Texas
Posts: 1,664
Quote:
Originally Posted by StainlessS View Post
OK thanx RD, but v0.7 seems not available anywhere(wiki or d9, or archive.org).
Download link in the abstract box from wiki works for me, also mirror link in the archived downloads section works .

Quote:
Originally Posted by StainlessS View Post
EDIT: I spent some time searching web but could not find v0.7 x64, dll or source.
There is none, v0.5 is the only x64 version available .
Reel.Deel is offline  
Old 2nd April 2019, 14:55   #4610  |  Link
wonkey_monkey
Formerly davidh*****
 
wonkey_monkey's Avatar
 
Join Date: Jan 2004
Posts: 2,493
Sorry if this is yet another inane and obvious question, but is there a recommended/simple way to change video clip properties/colourspace/subsampling? Like if I get an 8-bit clip, but I want my filter to output a 16-bit or float clip while keeping all other properties the same (or doing something else like changing subsampling to 444, whatever the input is), is there a simple operation that will do this, and work for all inputs, including interleaved and planar RGB? Or are there always caveats?
__________________
My AviSynth filters / I'm the Doctor
wonkey_monkey is offline  
Old 2nd April 2019, 15:04   #4611  |  Link
ChaosKing
Registered User
 
Join Date: Dec 2005
Location: Germany
Posts: 1,795
http://avisynth.nl/index.php/AviSynth%2B
http://avisynth.nl/index.php/Convert

Easiest way to convert to 16bit is ConvertBits(16). But not all filters support filtering in 16bit.
__________________
AVSRepoGUI // VSRepoGUI - Package Manager for AviSynth // VapourSynth
VapourSynth Portable FATPACK || VapourSynth Database
ChaosKing is offline  
Old 2nd April 2019, 15:29   #4612  |  Link
wonkey_monkey
Formerly davidh*****
 
wonkey_monkey's Avatar
 
Join Date: Jan 2004
Posts: 2,493
I meant in filter development terms. Do I just have to monkey around with vi.pixel_type? I'm guessing so but I can't any proper documentation on it.
__________________
My AviSynth filters / I'm the Doctor
wonkey_monkey is offline  
Old 3rd April 2019, 08:20   #4613  |  Link
pinterf
Registered User
 
Join Date: Jan 2014
Posts: 2,309
Quote:
Originally Posted by wonkey_monkey View Post
I meant in filter development terms. Do I just have to monkey around with vi.pixel_type? I'm guessing so but I can't any proper documentation on it.
Yes, monkeying around is a probably a proper definition. In Avisynth.h you can see some masks, look for words "GENERIC" or e.g. CS_Sample_Bits_Mask.
Example for bit depth change
pinterf is offline  
Old 3rd April 2019, 14:57   #4614  |  Link
LigH
German doom9/Gleitz SuMo
 
LigH's Avatar
 
Join Date: Oct 2001
Location: Germany, rural Altmark
Posts: 6,753
Enabling MT together with returning a clip explicitly does not work as expected.

I created a test script for a more elaborate filtering, producing different alternative clips, and I let it return one of these clips to be able to switch quickly between different versions. The AviSynth Wiki – AviSynth+: Enabling MT tells:

Quote:
... You enable MT by placing a single call to Prefetch(X) at the end of your script, where X is the number of threads to use. If there is a return statement in your script it must be placed after Prefetch().
This explanation suggests that Prefetch() is somewhat independent of the clip assignment workflow. So I tried. But instead, I get a confusing error message about invalid arguments for Prefetch(). To condense the issue, I tested it with the following script:

PHP Code:
ColorBarsHD(1280720"YV24").KillAudio().AssumeFPS(251).Trim(0249)
return 

Works well. Now with a Prefetch before the return:

PHP Code:
ColorBarsHD(1280720"YV24").KillAudio().AssumeFPS(251).Trim(0249)
Prefetch(4)
return 

Code:
Script error: Invalid arguments to function 'Prefetch'.
(...\PrefetchTest.avs, line 2)
Did I misunderstand? Is Prefetch() a clip filter just like most functions in AviSynth+? I will probably have to use the workaround to implicitly assign the clip to last, instead of returning it explicitly:

PHP Code:
ColorBarsHD(1280720"YV24").KillAudio().AssumeFPS(251).Trim(0249)
c
Prefetch
(4
Or in a completely different way, concatenated with the dot:

PHP Code:
ColorBarsHD(1280720"YV24").KillAudio().AssumeFPS(251).Trim(0249)
return 
c.Prefetch(4
Yes, both work well. So better assume that Prefetch() is related to the context of the active filter chain.
__________________

New German Gleitz board
MediaFire: x264 | x265 | VPx | AOM | Xvid

Last edited by LigH; 3rd April 2019 at 15:01.
LigH is offline  
Old 3rd April 2019, 15:07   #4615  |  Link
Groucho2004
 
Join Date: Mar 2006
Location: Barcelona
Posts: 5,034
Quote:
Originally Posted by LigH View Post
Is Prefetch() a clip filter just like most functions in AviSynth+?
Yes it is. Ferenc will correct me if I'm wrong.
__________________
Groucho's Avisynth Stuff
Groucho2004 is offline  
Old 3rd April 2019, 15:12   #4616  |  Link
LigH
German doom9/Gleitz SuMo
 
LigH's Avatar
 
Join Date: Oct 2001
Location: Germany, rural Altmark
Posts: 6,753
Then I would vote for explaining that a bit better in the Wiki. IMHO, the current explanation is too ambiguous.
__________________

New German Gleitz board
MediaFire: x264 | x265 | VPx | AOM | Xvid
LigH is offline  
Old 3rd April 2019, 17:27   #4617  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
ProtoType extracted by RT_Stats Make_Avisynth_BuiltIn_FunctionList.avs

AviSynth+_0.1_(r2772,_MT,_i386)_ORDERED_Function_List.txt
Code:
        AviSynth+_0.1_(r2772,_MT,_i386)_ORDERED_Function_List


There follows a list of all function names together with CPP style argument specifiers that inform
Avisynth the argument types and optional names. Optional arguments have square brackets surrounding
their name as in [name] and are followed by a type specifier character that gives the type.
Unnamed arguments are not optional. eg "cc[arg1]b[arg2]i" would be two compulsory unnamed clip args,
followed by optional 'arg1' of type bool and optional 'arg2' of type int.

# Argument type specifier strings.
 c - Video Clip
 i - Integer number
 f - Float number
 s - String
 b - boolean
 . - Any type (dot)
# Array Specifiers
 i* - Integer Array, zero or more
 i+ - Integer Array, one or more
 .* - Any type Array, zero or more
 .+ - Any type Array, one or more
#    Etc
###################################

Prefetch                  "c[threads]i"
There may be more than one prototype, only one is exposed and extractable (sadly).
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 3rd April 2019 at 18:35.
StainlessS is offline  
Old 3rd April 2019, 18:33   #4618  |  Link
LigH
German doom9/Gleitz SuMo
 
LigH's Avatar
 
Join Date: Oct 2001
Location: Germany, rural Altmark
Posts: 6,753
This explains the error when called without a reference clip. In my examples, "last" was never assigned.
__________________

New German Gleitz board
MediaFire: x264 | x265 | VPx | AOM | Xvid
LigH is offline  
Old 3rd April 2019, 23:44   #4619  |  Link
Gavino
Avisynth language lover
 
Join Date: Dec 2007
Location: Spain
Posts: 3,431
What if the Prefetch call is followed by a return, but 'last' has been assigned somewhere earlier?
Code:
ColorBarsHD(1280, 720, "YV24")  # 'last' assigned here
c = KillAudio().AssumeFPS(25, 1).Trim(0, 249)
Prefetch(4)
return c
This won't give an error, but I suspect Prefetch won't work properly (or at all) since it is not in the final filter chain - its result is not used.

Does it ever make sense to follow Prefetch() by a return statement?

Perhaps instead of
Prefetch(4)
return x


you always need to write
return x.Prefetch(4)
__________________
GScript and GRunT - complex Avisynth scripting made easier

Last edited by Gavino; 3rd April 2019 at 23:49.
Gavino is offline  
Old 4th April 2019, 00:06   #4620  |  Link
StainlessS
HeartlessS Usurer
 
StainlessS's Avatar
 
Join Date: Dec 2009
Location: Over the rainbow
Posts: 10,980
Yo big G, thats a long walkabout that you're on, come back when you've found youself, yeh.

Quote:
you always need to write
return x.Prefetch(4)
Not a bad idea.

Here Differences between Avisynth NEO and Avisynth+ (current versions).
Seems that we are detecting multiple prototypes for builtins, but not detecting proper separate parameter strings for each, but still handy non the less.

No idea what NEO 'n' type specifiers are [perhaps array index or something].
Code:
There follows a list of all function names together with CPP style argument specifiers that inform
Avisynth the argument types and optional names. Optional arguments have square brackets surrounding
their name as in [name] and are followed by a type specifier character that gives the type.
Unnamed arguments are not optional. eg "cc[arg1]b[arg2]i" would be two compulsory unnamed clip args,
followed by optional 'arg1' of type bool and optional 'arg2' of type int.

# Argument type specifier strings.
 c - Video Clip
 i - Integer number
 f - Float number
 s - String
 b - boolean
 . - Any type (dot)
# Array Specifiers
 i* - Integer Array, zero or more
 i+ - Integer Array, one or more
 .* - Any type Array, zero or more
 .+ - Any type Array, one or more
#    Etc
###################################

                                                        Differences between Avisynth NEO and Avisynth+
                                                        ##############################################


AviSynth_Neo_0.1_(r2822,_Neo,_i386)_ORDERED_Function_List                                           AviSynth+_0.1_(r2772,_MT,_i386)_ORDERED_Function_List


AddProp                   "csn"
AlignedSplice             "cci"                                                                     AlignedSplice             "cc+"
AlignedSplice             "cci"


AverageChromaU            "c[offset]i"                                                              AverageChromaU            "ci"
AverageChromaV            "c[offset]i"                                                              AverageChromaV            "ci"

AverageLuma               "c[offset]i"                                                              AverageLuma               "ci"

AVIFileSource             "s+[audio]b[pixel_type]s[fourCC]s[vtrack]i[atrack]i"                      AVIFileSource             "s+[audio]b[pixel_type]s[fourCC]s[vtrack]i[atrack]i[utf8]b"
AVISource                 "s+[audio]b[pixel_type]s[fourCC]s[vtrack]i[atrack]i"                      AVISource                 "s+[audio]b[pixel_type]s[fourCC]s[vtrack]i[atrack]i[utf8]b"

ChromaUDifference         "cc"                                                                      ChromaUDifference         "cci"
ChromaVDifference         "cc"                                                                      ChromaVDifference         "cci"

ConditionalFilter         "cccn[show]b"                                                             ConditionalFilter         "cccs[showx]b[args]s[local]b"
ConditionalFilter         "cccn[show]b"                                                             ConditionalFilter         "cccs[showx]b[args]s[local]b"
ConditionalFilter         "cccn[show]b"

ConditionalSelect         "cnc+[show]b"                                                             ConditionalSelect         "csc+[show]b"
ConditionalSelect         "cnc+[show]b"

DumpFilterGraph           "c[outfile]s[mode]i[nframes]i[repeat]b"

FrameEvaluate             "cs[show]b[after_frame]b"                                                 FrameEvaluate             "cs[showx]b[after_frame]b[args]s[local]b"

Func                      "n"

GeneralConvolution        "c[bias]i[matrix]s[divisor]f[auto]b"                                      GeneralConvolution        "c[bias]f[matrix]s[divisor]f[auto]b[luma]b[chroma]b[alpha]b"

GetProp                   "cs[offset]i"

IsFunction                "."

LumaDifference            "cc"                                                                      LumaDifference            "cci"

OnCPU                     "n"
OnCPU                     "n"
OnCUDA                    "n[device_index]i"
OnCUDA                    "n[device_index]i"
OpenDMLSource             "s+[audio]b[pixel_type]s[fourCC]s[vtrack]i[atrack]i"                      OpenDMLSource             "s+[audio]b[pixel_type]s[fourCC]s[vtrack]i[atrack]i[utf8]b"

Prefetch                  "c[threads]i[frames]i"                                                    Prefetch                  "c[threads]i"

RGBDifference             "cc"                                                                      RGBDifference             "cci"
RGBDifferenceFromPrevious "c"                                                                       RGBDifferenceFromPrevious "ci"
RGBDifferenceToNext       "c[offset]i"                                                              RGBDifferenceToNext       "ci"

ScriptClip                "cn[show]b[after_frame]b"                                                 ScriptClip                "cs[showx]b[after_frame]b[args]s[local]b"
ScriptClip                "cn[show]b[after_frame]b"

SegmentedAVISource        "s+[audio]b[pixel_type]s[fourCC]s[vtrack]i[atrack]i"                      SegmentedAVISource        "s+[audio]b[pixel_type]s[fourCC]s[vtrack]i[atrack]i[utf8]b"

SetCacheMode              "[mode]i"
SetDeviceOpt              "[opt]i[val]i"

SetGraphAnalysis          "b"

SetMemoryMax              "[]i[type]i[index]i"                                                      SetMemoryMax              "[]i"

TypeName                  "."

UDifferenceFromPrevious   "c"                                                                       UDifferenceFromPrevious   "ci"
UDifferenceToNext         "c[offset]i"                                                              UDifferenceToNext         "ci"
UnalignedSplice           "cci"                                                                     UnalignedSplice           "cc+"
UnalignedSplice           "cci"

UPlaneMax                 "c[threshold]f[offset]i"                                                  UPlaneMax                 "c[threshold]fi"
UPlaneMedian              "c[offset]i"                                                              UPlaneMedian              "ci"
UPlaneMin                 "c[threshold]f[offset]i"                                                  UPlaneMin                 "c[threshold]fi"
UPlaneMinMaxDifference    "c[threshold]f[offset]i"                                                  UPlaneMinMaxDifference    "c[threshold]fi"
UseVar                    "cs+"

VDifferenceFromPrevious   "c"                                                                       VDifferenceFromPrevious   "ci"
VDifferenceToNext         "c[offset]i"                                                              VDifferenceToNext         "ci"

VPlaneMax                 "c[threshold]f[offset]i"                                                  VPlaneMax                 "c[threshold]fi"
VPlaneMedian              "c[offset]i"                                                              VPlaneMedian              "ci"
VPlaneMin                 "c[threshold]f[offset]i"                                                  VPlaneMin                 "c[threshold]fi"
VPlaneMinMaxDifference    "c[threshold]f[offset]i"                                                  VPlaneMinMaxDifference    "c[threshold]fi"

WAVSource                 "s+"                                                                      WAVSource                 "s+[utf8]b"

WriteFile                 "c[filename]sn+[append]b[flush]b"                                         WriteFile                 "c[filenamex]ss+[append]b[flush]b[args]s[local]b"
WriteFile                 "c[filename]sn+[append]b[flush]b"

WriteFileEnd              "c[filename]sn+[append]b"                                                 WriteFileEnd              "c[filename]ss+[append]b"
WriteFileEnd              "c[filename]sn+[append]b"
WriteFileIf               "c[filename]sn+[append]b[flush]b"                                         WriteFileIf               "c[filenamex]ss+[append]b[flush]b[args]s[local]b"
WriteFileIf               "c[filename]sn+[append]b[flush]b"
WriteFileStart            "c[filename]sn+[append]b"                                                 WriteFileStart            "c[filename]ss+[append]b"
WriteFileStart            "c[filename]sn+[append]b"
YDifferenceFromPrevious   "c"                                                                       YDifferenceFromPrevious   "ci"
YDifferenceToNext         "c[offset]i"                                                              YDifferenceToNext         "ci"
YPlaneMax                 "c[threshold]f[offset]i"                                                  YPlaneMax                 "c[threshold]fi"
YPlaneMedian              "c[offset]i"                                                              YPlaneMedian              "ci"
YPlaneMin                 "c[threshold]f[offset]i"                                                  YPlaneMin                 "c[threshold]fi"
YPlaneMinMaxDifference    "c[threshold]f[offset]i"                                                  YPlaneMinMaxDifference    "c[threshold]fi"
Here, RT_Stats scripts for making function lists, with a few mods done today for Avs NEO(~56KB):- http://www.mediafire.com/file/mdtte1...Lists.zip/file
Also contains complete function lists for these versions of avisynth.
Code:
# AviSynth v2.58
AviSynth 2.58, build:Dec 22 2008 [08:46:51]

# AviSynth v2.60
AviSynth 2.60, build:Mar 31 2015 [16:38:54]

# AviSynth v2.61 Alpha
AviSynth 2.61, build:May 17 2016 [16:06:18] VC2008Exp

# Avisynth v2.60 ICL
AviSynth 2.60 (ICL10)

# Avisynth V2.60 MT
AviSynth 2.60, build:Feb 20 2015 [03:16:45]

# Avisynth+ v2.60
AviSynth+ 0.1 (r2772, MT, i386)
AviSynth+ 0.1 (r2772, MT, x86_64)

# Avisynth NEO
AviSynth Neo 0.1 (r2822, Neo, i386)
AviSynth Neo 0.1 (r2822, Neo, x86_64)

# Avisynth NEO Forerunner Avisynth+ CUDA
AviSynth+ 0.1 (r2533, CUDA, i386)
AviSynth+ 0.1 (r2533, CUDA, x86_64)
x86/x64 function lists for same version avs should be identical, I think [EDIT: Yes, except for the embedded name, are identical].

EDIT: Perhaps 'n' is name, ie function name, variable name, device name.
__________________
I sometimes post sober.
StainlessS@MediaFire ::: AND/OR ::: StainlessS@SendSpace

"Some infinities are bigger than other infinities", but how many of them are infinitely bigger ???

Last edited by StainlessS; 4th April 2019 at 00:37.
StainlessS is offline  
Closed Thread

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +1. The time now is 21:32.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2024, vBulletin Solutions Inc.