digitalFAQ.com Forums [Archives]

digitalFAQ.com Forums [Archives] (http://www.digitalfaq.com/archives/)
-   Avisynth Scripting (http://www.digitalfaq.com/archives/avisynth/)
-   -   Avisynth: Motion adaptive filtering now possible? (http://www.digitalfaq.com/archives/avisynth/3594-avisynth-motion-adaptive.html)

DKruskie 05-29-2003 07:01 AM

I have to agree with jellygoose..It's awesome!!..Great job Kwag

David

Jellygoose 05-29-2003 07:24 AM

Back again...
Ok this new filter chain just throws me off my chair... The CQ value actually didn't raise too much, for me (by 1.6 points), but it seemed to be a lot sharper throughout the movie...
I'm currently testing "TemporalCleaner" against "TemporalSoften", while I'm using a very low y-Threshold, and a rather high c-Threshold!
I'll let you know the results! :wink:

black prince 05-29-2003 08:14 AM

@All,

Kawg wrote:
Quote:

Here you go guys
www.kvcd.net/small-adaptive-sampler.mpg (10 second clip)
That's what the complete movie looks like on one CD-R
That movie is 96 minutes long, and it was encoded at 528x480 and @CQ=71.2 with the current script ( For AviSynth 2.5x )

-kwag
I enjoyed the small clip, but the link to the full clip won't work. I'll
try to load avisynth 2.51 this evening and see if I have problems.
I stayed away from this because of 2.51, but this too good to
ignor. It would be very nice to have this as avisynth v2.08 :roll:
Wonder what BV shows against a video using adapative vs the
way it's done now. :?: Maybe a comparison of frames showing
how targeting has really improved picture quality :?: There's a lot
to discover here :D

-bp

DorvalCS 05-29-2003 08:37 AM

Hi Friends! Need Some help.

I have loaded AviSynth 2.5 (latest version)
Created a Script using Kwag's latest.

But when I try to load in Tmpgenc, it tells me that my file is not supported. When I load the script in VirtualDub I get this error message:
"Couldn't locate decompressor for format YV12"

Here is a copy of my Script:

LoadPlugin("C:\Filters2_5\MPEG2Dec3.dll")
LoadPlugin("C:\Filters2_5\STMedianFilter.dll")
LoadPlugin("C:\Filters2_5\UnFilter.dll")

Mpeg2Source("C:\My Documents\My Videos\movie.d2v")

MaxThreshold=1.58

UnFilter(50, 50)
BicubicResize(496, 334, 1/3, 1/3, 4, 0, 712, 480)
STMedianFilter(8, 32, 0, 0 )
TemporalSoften(2,7,7,3,2)
mergechroma(blur(1.50))
## Dynamic linear adaptive filtering ##
ScriptClip("val=YDifferenceFromPrevious()/14.55" + "val > MaxThreshold ? MergeLuma(blur(MaxThreshold)) : MergeLuma(blur( val ))")
##
AddBorders(16, 73, 16, 73)
Limiter()

What am I doing wrong? :oops:

Thanks for your help... I can't wait to try this new script... :wink:

bman 05-29-2003 08:48 AM

@ All
I see all of us are impressed with adaptive filtering method :D :D :D
According my quest KWAG implement this method on 2 filters MergeLuma and BlockBuster .
Thanx him for that !!!
I didn't made tests yet and can't say how much compression new filter can add to mpg but IF IT'S RIGHT and it helps to get higher compression then - WHY DON'T try adaptive on WHOLE SCRIPT( I mean without resizing and SUBS ) .
If its working on 2 filters then maybe it could be accomplish on all others in the script :?: :?: :wink: :wink:
What do u think ? It could be worked out KWAG :?: :?: :?:
Just an idea (maybe a stupid one )
bman

jorel 05-29-2003 09:04 AM

:?
i need some help ,

please, a full script posted here will be great....
i got errors like DorvalCS.

thanks in advance!
:)

kwag 05-29-2003 09:42 AM

Quote:

Originally Posted by bman
I didn't made tests yet and can't say how much compression new filter can add to mpg but IF IT'S RIGHT and it helps to get higher compression then - WHY DON'T try adaptive on WHOLE SCRIPT( I mean without resizing and SUBS ) .

Hi bman,

Yes, I mentioned this earlier in the thread, to incude filters that we can "plug" for different conditions. Some filters will need "static" values ( like temporal filters ) throughout the movie, unless sh0dan gives us a function similar to YDifferencefromPrevious, that instead of reporting a value change for activity, gives us a value change for "noise" activity per frame :idea: ( Hello sh0dan ;) )
Another thing I thought of last night was that instead of reporting the activity on a per-frame basis, divide the frame in a 16x16 array or so, and then the difference from previous frames would return a quadrant of information :idea: Then when adaptive filtering is used, it can also be applied selectively to each "quadrant". For example, you are watching a scene where the top half of the picture is a still sharp backgroung, and the bottom half is cars driving by (fast action). Right now, there would be an average of blur added to the complete frame, because it's the average applied from the value returned by the motion. With the quadrant approach, the blur would apply ONLY to the bottom area of the scene, and leave the top part untouched :!: So imaging that with this method, we could apply say a hight mergeluma to the bottom half of the screen, then the right top quadrants if it was pitch dark, we could apply some level of BlockBuster noise and if the left top quadrant doesn't need any filters, then that area is left alone. So we would have "Hybrid Adaptive Filtering" :mrgreen:
Maybe I'm asking too much, but if the function hooks are developed in AviSynth, then it's just a matter of plugging our filters either on a "frame level" or on a "quadrant level" per frame. The possibilities we could get with this would be just amazing 8)

@sh0dan,
Comments on this :?:

-kwag

Jellygoose 05-29-2003 09:58 AM

Kwag, I thought about the exact same thing this morning... :o
I thought this would be a lot to complicated in a way...
Am I right, that this procedure of analyzing every square in a frame would take a LOT of time?
However, it sounds extremely good, and I'm definately looking forward to further developments...
Well you're right about the TemporalFilters, but STMedianFilter as a Spatial Filter (at least that's how WE use it) can still be adjusted to the amount of motion in a frame right?

ARnet_tenRA 05-29-2003 10:02 AM

Quote:

Originally Posted by kwag
Another thing I thought of last night was that instead of reporting the activity on a per-frame basis, divide the frame in a 16x16 array or so, and then the difference from previous frames would return a quadrant of information :idea: Then when adaptive filtering is used, it can also be applied selectively to each "quadrant".

Here is a way to do it Kwag. I am sure you can optimize it more. I have added the GreyScale filter to show how each section is getting a different filter. Of course you can filter any way you want.
Code:

AviSource(" -Your movie here.- ")

aa=Crop(0*width/4,0*height/4,1*width/4,1*height/4).GreyScale()
ab=Crop(1*width/4,0*height/4,1*width/4,1*height/4)
ac=Crop(2*width/4,0*height/4,1*width/4,1*height/4).GreyScale()
ad=Crop(3*width/4,0*height/4,1*width/4,1*height/4)
ba=Crop(0*width/4,1*height/4,1*width/4,1*height/4)
bb=Crop(1*width/4,1*height/4,1*width/4,1*height/4).GreyScale()
bc=Crop(2*width/4,1*height/4,1*width/4,1*height/4)
bd=Crop(3*width/4,1*height/4,1*width/4,1*height/4).GreyScale()
ca=Crop(0*width/4,2*height/4,1*width/4,1*height/4).GreyScale()
cb=Crop(1*width/4,2*height/4,1*width/4,1*height/4)
cc=Crop(2*width/4,2*height/4,1*width/4,1*height/4).GreyScale()
cd=Crop(3*width/4,2*height/4,1*width/4,1*height/4)
da=Crop(0*width/4,3*height/4,1*width/4,1*height/4)
db=Crop(1*width/4,3*height/4,1*width/4,1*height/4).GreyScale()
dc=Crop(2*width/4,3*height/4,1*width/4,1*height/4)
dd=Crop(3*width/4,3*height/4,1*width/4,1*height/4).GreyScale()

StackVertical(StackHorizontal(aa,ab,ac,ad),StackHorizontal(ba,bb,bc,bd),StackHorizontal(ca,cb,cc,cd),StackHorizontal(da,db,dc,dd))

Regards, Tenra

kwag 05-29-2003 10:17 AM

Thanks Tenra,

That will sure divide the picture in slices fine, but we still need activity "per slice" from previous frames :!:
That would be the only way to apply selective filtering on a "slice", based on activity from the previous "slices" on prior frames.

-kwag

bman 05-29-2003 10:37 AM

@ KWAG , @ Tenra
What a BEAUTIFUL MIND , man , BEAUTIFUL MIND !!!!
It's just me or somebody else can smell something extraordinary is cooking here ??!!!
I have no patience to wait and see what will grow up from this :!: :!: :!:
bman

ARnet_tenRA 05-29-2003 10:49 AM

Quote:

Originally Posted by kwag
Thanks Tenra,

That will sure divide the picture in slices fine, but we still need activity "per slice" from previous frames :!:
That would be the only way to apply selective filtering on a "slice", based on activity from the previous "slices" on prior frames.

-kwag

I know. I am working on just that. I thought I would put this out there to get everyone's creative juices flowing.

Regards, Tenra

kwag 05-29-2003 11:01 AM

Quote:

Originally Posted by ARnet_tenRA
I know. I am working on just that. I thought I would put this out there to get everyone's creative juices flowing.

Oh yes :!:, we're all peeing on our pants right now :) Can't contain our emotions :lol:

-kwag

kwag 05-29-2003 11:04 AM

Quote:

Originally Posted by bman
It's just me or somebody else can smell something extraordinary is cooking here ??!!!

No, it's not only you :!:, my oven (memory) is in "broil" right now :mrgreen:

-kwag

Jellygoose 05-29-2003 11:10 AM

I can't believe no one of us had this kind of idea earlier... :o
It sounds so simple and logical to me... :!:
brilliant :!: :D

ovg64 05-29-2003 11:13 AM

Quote:

Originally Posted by jorel
:?
i need some help ,

please, a full script posted here will be great....
i got errors like DorvalCS.

thanks in advance!
:)

@ kwag, You guy are almost in California and we still here in florida.
can you post a sample script that is ready to cut and paste so we can have a better idea more or less how this works, I know What the Linear Adaptive Script is suppose to do, i just dont know how it works I dont have a programmer's mentallity so it will take 4 me more time to understand.
sorry to be a pain in the a.. :twisted:

thanks again :!:

## Dynamic linear adaptive filtering ##
ScriptClip("val=YDifferenceFromPrevious()/14.55" + "val > MaxThreshold ? MergeLuma(blur(MaxThreshold)) : MergeLuma(blur( val ))")
##

kwag 05-29-2003 11:17 AM

One of the BEST things I like of this, is that there are virtually no blocks on high speed motion :!:
Because of the heavy blur on high speed pannings, what the encoder "sees" is a a frame with no sharp edges at all, and the result is that there are barely any visible blocks seen :!: This brings me to another question: Maybe we don't need 2,300Kbps for MAX bitrate :idea:
Maybe we can drop the MAX to ~2000Kbps, and increase our play time per media :idea:
I'll have to try this 8)

-kwag

kwag 05-29-2003 11:24 AM

Here's the script I used for the sample:

Code:

LoadPlugin("C:\Filters25\MPEG2Dec3.dll")
LoadPlugin("C:\Filters25\STMedianFilter.dll")
LoadPlugin("C:\Filters25\UnFilter.dll")
LoadPlugin("C:\Filters25\BlockBuster.dll")

Mpeg2Source("K:\VIDEO_TS\project.d2v")

MaxThreshold=1.58

UnFilter(50, 50)
BicubicResize(528, 368, 0, 0.6, 16, 0, 688, 480)
STMedianFilter(8, 32, 0, 0 )
TemporalSoften(2,7,7,3,2)
mergechroma(blur(1.50))

### Dynamic Adaptive Filtering ###
val=0 # Initialize our motion variable.
N="noise"

FrameEvaluate("val=YDifferenceFromPrevious()/14.55") # Assign "val" with difference between current frame and last frame.
ScriptClip("val > MaxThreshold ? MergeLuma(blur(MaxThreshold)) : MergeLuma(blur( val )) ") # Adaptive mergeluma.
AddBorders(0, 56, 0, 56)
LetterBox(16, 16, 16, 16)
Limiter()


sbin 05-29-2003 11:34 AM

Man, I go away for a couple of days and you guys just tear everything up. :lol:

rendalunit 05-29-2003 12:18 PM

I'm going nowhere fast! :lol:

"Blockbuster.dll is not an Avisynth 2.5 plugin"
"STMedianFilter.dll is not an Avisynth 2.5 plugin"
"I don't know what subblur means"
"Unfilter.dll is not an Avisynth 2.5 plugin"

i installed Avisynth 2.51 build May 21, 2003
and the filters are for 2.5x

help!!
:lol:


All times are GMT -5. The time now is 02:18 AM  —  vBulletin © Jelsoft Enterprises Ltd

Site design, images and content © 2002-2024 The Digital FAQ, www.digitalFAQ.com
Forum Software by vBulletin · Copyright © 2024 Jelsoft Enterprises Ltd.