Quote:Das heisst -pix_fmt yuv420p10le beim ffmpeg Aufruf sagt nicht ffmpeg was es für eine Quelle liest, sondern was es für einen output an x264 piped?!?
Ja, da pix_fmt ist hier ein Parameter für das Outputformat. (Achtung, die Position von Parametern ist in FFmpeg wichtig!)
Cu Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.
Die niedrige CPU-Auslastung bei mir hatte nichts mit avs2yuv64 zu tun. Bin nicht dahinter gestiegen was der Grund für die Limitierung ist, die GPU limitiert da im mode 0 von fft3dgpu noch lange nicht.
Hab mal ffmpeg, avs2yuv64 und Vapoursynth/Vspipe mit verschiedenen vielen MT threads mit meinem benchmark batchfile gegeneinander antreten lassen. Jede MT thread Einstellung wurde durch eine Wiederholungsmessung bestätigt und der höhere Wert gespeichert:
ffmpeg skript:
REM ### First 3 lines will be skipped when generating AVS/VPY script from this file. 2nd line must have vspipe/ffmpeg/avs2yuv64 call. Do not remove GOTO :EOF in 3rd line!
"%hybridFolderWin%\64bit\ffmpeg.exe" -y -loglevel fatal -noautorotate -nostdin -threads 8 -i "%cd%\%dynFileName%.avs" -an -sn -vf zscale=rangein=tv:range=tv -pix_fmt yuv420p10le -strict -1 -vsync 0 -f rawvideo - | "%hybridFolderWin%\64bit\x264.exe" --crf 19.00 --profile high10 --level 5.2 --ref 1 --no-mixed-refs --keyint 250 --min-keyint 0 --scenecut 40 --bframes 3 --b-bias 0 --b-pyramid normal --direct spatial --b-adapt 1 --sync-lookahead 16 --cplxblur 20.0 --qcomp 0.60 --qblur 0.50 --mbtree --rc-lookahead 10 --ipratio 1.40 --pbratio 1.30 --chroma-qp-offset 0 --qpmin 0 --qpmax 69 --qpstep 4 --partitions i4x4,i8x8,p8x8,b8x8 --8x8dct --me hex --merange 16 --mvrange -1 --subme 2 --cabac --trellis 0 --weightp 1 --aq-mode 1 --aq-strength 1.00 --vbv-maxrate 240000 --vbv-bufsize 720000 --nr 0 --deadzone-inter 21 --deadzone-intra 11 --cqm flat --threads 16 --sar 1:1 --deblock 0:0 --non-deterministic --range tv --colormatrix bt709 --demuxer raw --input-res 1920x1012 --input-csp i420 --input-range tv --input-depth 10 --fps 24/1 --output-depth 10 --output "%cd%\%dynFileName%.264" -
goto :EOF
ClearAutoloadDirs()
SetFilterMTMode("DEFAULT_MT_MODE", MT_MULTI_INSTANCE)
LoadPlugin("$$HYBRIDFOLDER$$\64bit\Avisynth\avisynthPlugins\LoadDll.dll")
LoadDLL("$$HYBRIDFOLDER$$\64bit\Avisynth\avisynthPlugins\d3d9.dll")
LoadPlugin("$$HYBRIDFOLDER$$\64bit\Avisynth\avisynthPlugins\LSMASHSource.dll")
LoadCPlugin("$$HYBRIDFOLDER$$\64bit\Avisynth\avisynthPlugins\ffms2.dll")
LoadPlugin("$$HYBRIDFOLDER$$\64bit\Avisynth\avisynthPlugins\FFT3dGPU.dll")
# loading source: $$SOURCEVID$$
# color sampling YV24@10, matrix: bt709, scantyp: progressive, luminance scale: limited
#####
LWLibavVideoSource("$$SOURCEVID$$",cache=false,format="YUV444P16", prefer_hw=0,repeat=true)
# FFVideoSource("$$SOURCEVID$$",colorspace="YV12")
#####
# current resolution:
# denoising using fft3dgpu
#####
# ConvertToYUY2(interlaced=false)
FFT3DGPU(bw=$$BW$$,bh=$$BH$$,plane=$$PLANE$$,mode=$$MODE$$,bordersize=$$BORDERSIZE$$,precision=$$PRECISION$$)
#####
# Dithering from 16 to 10bit for encoder
ConvertBits(10)
# adjust color to YV12 (color matrix: Rec709)
ConvertToYUV420()
#####
PreFetch($$MTTHREADS$$)
# setting output fps to 24.000fps
AssumeFPS(24,1)
#####
# output: color sampling YUY2@10, matrix: bt709, scantyp: progressive, luminance scale: limited
return last
# LOADING SOURCE VIA LSMASH OR FFINDEX
clip = core.lsmas.LWLibavSource(source="$$SOURCEVID_VS$$", format="YUV444P10", cache=0, prefer_hw=0)
# Setting color matrix to 709.
clip = core.std.SetFrameProps(clip, _Matrix=1)
clip = clip if not core.text.FrameProps(clip,'_Transfer') else core.std.SetFrameProps(clip, _Transfer=1)
clip = clip if not core.text.FrameProps(clip,'_Primaries') else core.std.SetFrameProps(clip, _Primaries=1)
# Setting color range to TV (limited) range.
clip = core.std.SetFrameProp(clip=clip, prop="_ColorRange", intval=1)
# making sure frame rate is set to 24
clip = core.std.AssumeFPS(clip=clip, fpsnum=24, fpsden=1)
-> Avs2yuv ist bei mir auch 4,9% schneller als ffmpeg, aber irgendwas limitiert hier. Normalerweise ist auch VapourSynth mehr als 5,5% schneller als ffmpeg.
Mir ist aufgefallen, dass distributor() nicht von Hybrid ins AVS-skript eingefügt wird, egal ob er unter filtering->avisynth->misc->script->miscellaneous aktiv ist oder nicht.
Würde generell auch mal antesten wie es aussieht, wenn LWLibavVideoSource mit preferHW=1 bzw. 2 oder DGDecNV genutzt wird.
Wie schnell ist denn bei Dir fft3dfilter?
Sehe da auch nicht bei der GPU sondern eher im Filter bzw. was er macht das Problem.
Nicht alles was man macht ist multithreading tauglich,...
Cu Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.
Der verwendete MTMode hat bei non-plus avisynth teilweise auch nen Unterschied gemacht, weiß nicht wie das bei Avisynth+ ist.
EDIT: DGDecNV geht mangels Nvidia-HW nicht...
Hab mal das skript angehangen, welches ich aktuell verwende. Ist allerdings noch sehr quick 'n dirty, ich weiß nicht, ob man das checkt, wenn man's nicht selber geschrieben hat.
Generell kann man die Anzahl von threads in beliebigen Schritten ansteigen lassen und jede Messung mit einer bestimmten Anzahl von threads wird 1-x mal wiederholt (winner takes all prinzip).
Außerdem wird die CPU-Auslastung vor der Messung ermittelt, und nur gestartet, wenn diese unter 5% liegt.
Es ist ursprünglich für fft3dgpu geschrieben, vom Prinzip her kann man aber jede Art von AVS/VPS Skript benchen, die Werte in den AVS/VPS Skripten in $$GROSSBUCHSTABEN$$ werden automatisch ersetzt, wenn sie vom batchfile im AVS/VPY skript gefunden werden, wenn nicht dann nicht.
Die avs/vpy skripte müssen aber so modifiziert sein, dass in den ersten 3 Zeilen der Kommandozeilenaufruf für ffmpeg/vspipe/avs2yuv64 gefolgt von goto :EOF in der nächsten Zeile enthalten sein muß. Die ersten 3 Zeilen werden dann bei der dynamischen Generierung von skripten zum benchmarken einfach übersprungen.
Naja, wie gesagt, ich weiß nicht ob man das gleich kapiert, wie das funktioniert.
Kann auch mal fft3dfilter laufen lassen, aber ich vermute, dass der jedenfalls bei diesem video, wo aus irgendwelchen Gründen die CPU Auslastung beim encoding <50% ist, einen "unfairen" Vorteil hat.
(08.05.2022, 21:09)Selur Wrote: Kannst auch mal schauen, was passiert, wenn Du Prefetch auf X,0 setzt.
Man kann das Prefetch auch öfter im Skript aufrufen.
Das sorgt dafür, dass keine Frames gecached werden, was bei Filtern welche eh die Frames immer nur der Reihe nach abfragen eher hilft. Bei komplexeren Skripten bremst es aber.
Cu Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.
Bin noch einer anderen Sache nachgegangen, die mir in Hybrid bei AviSynth usage aufgefallen ist.
Hat jetzt nichts mit fft3dgpu zu tun, sondern rein damit wie 10bit yuv444p10 files gehandelt werden.
Sowohl die 1080p version, als auch die 4K version des files, das ich häufiger gebencht habe wird nämlich - im Gegensatz zur Umsetzung in VapourSynth - immer als YUV444p16 file identifiziert und anschließend wird deswegen unnötigerweise converBits(10) und ConvertToYUV444() ausgeführt.
Hab hier mal die Version die der Hybrid AviSynth Umsetzung gebencht (wieder 3 Wiederholungsmessungen pro prefetch setting für bessere Genauigkeit):
REM ### First 3 lines will be skipped when generating AVS/VPY script from this file. 2nd line must have vspipe/ffmpeg/avs2yuv64 call. Do not remove GOTO :EOF in 3rd line!
"%hybridFolderWin%\64bit\Avisynth\avs2yuv64.exe" -depth 10 -nstdr "%cd%\%dynFileName%.avs" -o - | "%hybridFolderWin%\64bit\x264.exe" --crf 19.00 --profile high444 --level 5.2 --ref 1 --no-mixed-refs --keyint 250 --min-keyint 0 --scenecut 40 --bframes 3 --b-bias 0 --b-pyramid normal --direct spatial --b-adapt 1 --sync-lookahead 16 --cplxblur 20.0 --qcomp 0.60 --qblur 0.50 --mbtree --rc-lookahead 10 --ipratio 1.40 --pbratio 1.30 --chroma-qp-offset 0 --qpmin 0 --qpmax 69 --qpstep 4 --partitions i4x4,i8x8,p8x8,b8x8 --8x8dct --me hex --merange 16 --mvrange -1 --subme 2 --cabac --trellis 0 --weightp 1 --aq-mode 1 --aq-strength 1.00 --vbv-maxrate 240000 --vbv-bufsize 720000 --nr 0 --deadzone-inter 21 --deadzone-intra 11 --cqm flat --threads 16 --sar 1:1 --deblock 0:0 --non-deterministic --range tv --colormatrix bt709 --demuxer y4m --input-range tv --fps 24/1 --output-csp i444 --output-depth 10 --output "%cd%\%dynFileName%.264" -
goto :EOF
# Converting from 16 to 10bit for encoder
ConvertBits(10)
# adjust color to YV24 (color matrix: Rec709)
ConvertToYUV444()
PreFetch($$DYNMEASUREVAR$$)
#####
# setting output fps to 24.000fps
AssumeFPS(24,1)
#####
# output: color sampling YUY2@10, matrix: bt709, scantyp: progressive, luminance scale: limited
return last
--------------------------------------------------------------------------------
REPLACEMENTS:
$$SIGMA$$ replaced with '2.00'
$$BW$$ replaced with '32'
$$BH$$ replaced with '32'
$$BT$$ replaced with '3'
$$PLANE$$ replaced with '4'
$$MODE$$ replaced with '0'
$$PRECISION$$ replaced with '1'
$$BORDERSIZE$$ replaced with '1'
$$HYBRIDFOLDER$$ replaced with 'C:\Program Files\Hybrid'
$$HYBRIDFOLDER_VS$$ replaced with 'C:/Program Files/Hybrid'
$$SOURCEVID$$ replaced with 'C:\BENCH_AVS_VPS_FILTER\Hybrid YUV444P10 handling\cut_TGM_TLR2_IMAX_3840x2025_H265_YUV444_10BIT-thedigitaltheater.mkv'
$$SOURCEVID_VS$$ replaced with 'C:/BENCH_AVS_VPS_FILTER/Hybrid YUV444P10 handling/cut_TGM_TLR2_IMAX_3840x2025_H265_YUV444_10BIT-thedigitaltheater.mkv'
$$DYNMEASUREVAR$$ replaced dynamically [start,step,end] with '0,2,8'
$$DYNMEASUREVARGAP$$ replaced dynamically [start,step,end] with '0,2,8' +- gap of '+1'
x0 convertbits(10)-ConvertToYUV444 - lsmash - avs2yuv - 4K YUV444P16 in YUV444P10 out 0-8T
encoded 1666 frames, 6.62 fps, 28606.15 kb/s
x2 convertbits(10)-ConvertToYUV444 - lsmash - avs2yuv - 4K YUV444P16 in YUV444P10 out 0-8T
encoded 1666 frames, 6.69 fps, 28607.94 kb/s
x4 convertbits(10)-ConvertToYUV444 - lsmash - avs2yuv - 4K YUV444P16 in YUV444P10 out 0-8T
encoded 1666 frames, 6.68 fps, 28612.34 kb/s
x6 convertbits(10)-ConvertToYUV444 - lsmash - avs2yuv - 4K YUV444P16 in YUV444P10 out 0-8T
encoded 1666 frames, 6.69 fps, 28609.66 kb/s
x8 convertbits(10)-ConvertToYUV444 - lsmash - avs2yuv - 4K YUV444P16 in YUV444P10 out 0-8T
encoded 1666 frames, 6.64 fps, 28607.28 kb/s
Und hier eine Variante, die der Umsetzung in VapourSynth entsprechen würde, bei welcher das file korrekt als YUV444P10 identifiziert wird, und die 2 zusätzlichen Umwandlungsschritte wegfallen:
REM ### First 3 lines will be skipped when generating AVS/VPY script from this file. 2nd line must have vspipe/ffmpeg/avs2yuv64 call. Do not remove GOTO :EOF in 3rd line!
"%hybridFolderWin%\64bit\Avisynth\avs2yuv64.exe" -depth 10 -nstdr "%cd%\%dynFileName%.avs" -o - | "%hybridFolderWin%\64bit\x264.exe" --crf 19.00 --profile high444 --level 5.2 --ref 1 --no-mixed-refs --keyint 250 --min-keyint 0 --scenecut 40 --bframes 3 --b-bias 0 --b-pyramid normal --direct spatial --b-adapt 1 --sync-lookahead 16 --cplxblur 20.0 --qcomp 0.60 --qblur 0.50 --mbtree --rc-lookahead 10 --ipratio 1.40 --pbratio 1.30 --chroma-qp-offset 0 --qpmin 0 --qpmax 69 --qpstep 4 --partitions i4x4,i8x8,p8x8,b8x8 --8x8dct --me hex --merange 16 --mvrange -1 --subme 2 --cabac --trellis 0 --weightp 1 --aq-mode 1 --aq-strength 1.00 --vbv-maxrate 240000 --vbv-bufsize 720000 --nr 0 --deadzone-inter 21 --deadzone-intra 11 --cqm flat --threads 16 --sar 1:1 --deblock 0:0 --non-deterministic --range tv --colormatrix bt709 --demuxer y4m --input-range tv --fps 24/1 --output-csp i444 --output-depth 10 --output "%cd%\%dynFileName%.264" -
goto :EOF
# Converting from 16 to 10bit for encoder
# ConvertBits(10)
# adjust color to YV24 (color matrix: Rec709)
# ConvertToYUV444()
PreFetch($$DYNMEASUREVAR$$)
#####
# setting output fps to 24.000fps
AssumeFPS(24,1)
#####
# output: color sampling YUY2@10, matrix: bt709, scantyp: progressive, luminance scale: limited
return last
--------------------------------------------------------------------------------
REPLACEMENTS:
$$SIGMA$$ replaced with '2.00'
$$BW$$ replaced with '32'
$$BH$$ replaced with '32'
$$BT$$ replaced with '3'
$$PLANE$$ replaced with '4'
$$MODE$$ replaced with '0'
$$PRECISION$$ replaced with '1'
$$BORDERSIZE$$ replaced with '1'
$$HYBRIDFOLDER$$ replaced with 'C:\Program Files\Hybrid'
$$HYBRIDFOLDER_VS$$ replaced with 'C:/Program Files/Hybrid'
$$SOURCEVID$$ replaced with 'C:\BENCH_AVS_VPS_FILTER\Hybrid YUV444P10 handling\cut_TGM_TLR2_IMAX_3840x2025_H265_YUV444_10BIT-thedigitaltheater.mkv'
$$SOURCEVID_VS$$ replaced with 'C:/BENCH_AVS_VPS_FILTER/Hybrid YUV444P10 handling/cut_TGM_TLR2_IMAX_3840x2025_H265_YUV444_10BIT-thedigitaltheater.mkv'
$$DYNMEASUREVAR$$ replaced dynamically [start,step,end] with '0,2,8'
$$DYNMEASUREVARGAP$$ replaced dynamically [start,step,end] with '0,2,8' +- gap of '+1'
x0 lsmash - avs2yuv - 4K YUV444P10 in YUV444P10 out 0-8T
encoded 1666 frames, 6.76 fps, 28592.31 kb/s
x2 lsmash - avs2yuv - 4K YUV444P10 in YUV444P10 out 0-8T
encoded 1666 frames, 6.79 fps, 28589.79 kb/s
x4 lsmash - avs2yuv - 4K YUV444P10 in YUV444P10 out 0-8T
encoded 1666 frames, 6.83 fps, 28592.18 kb/s
x6 lsmash - avs2yuv - 4K YUV444P10 in YUV444P10 out 0-8T
encoded 1666 frames, 6.79 fps, 28590.56 kb/s
x8 lsmash - avs2yuv - 4K YUV444P10 in YUV444P10 out 0-8T
encoded 1666 frames, 6.71 fps, 28591.17 kb/s
Sind 2.1% Unterschied bei den Bestwerten und jedes einzelne prefetch setting ist ebenfalls schneller.
Vermutlich wäre der Unterschied noch etwas deutlicher ausgefallen, hätte ich ein x264 preset verwendet, welches dazu führt, dass meine CPU beim encoding wirklich konstant mit 100% ausgelastet ist, aber das kostet bei 3 Wiederholungsmessungen auf ner lahmen CPU halt wieder jede Menge Zeit...
Ich weiß, hört sich auf den ersten Blick etwas pingelig an, aber sollte man in diesen Zeiten nicht versuchen jeden (Energie) Effizienzgewinn zu heben, der "auf der Straße" bzw. im Code liegt?
Im Anhang nochmal die aktuellste Version des bench-batchfiles mit den dafür gemoddeten Skripten und Messergebnissen, falls du oder jemand anderes das auf seinem System nachvollziehen will.
Oder das ganze hier zusammen mit der entsprechenden YUV444P10 version des Videos: Link
15.05.2022, 19:34 (This post was last modified: 15.05.2022, 19:35 by Selur.)
ConvertTo444() bei 4:4:4 Material sollte nichts machen. (muss ich mal drauf schauen, ist vermutlich nocht ein Artefakt was daher stammt, dass man theoretisch noch Avisynth MT nutzen kann)
Das YUV444P16 ist glaub ich noch ein überbleibsel daher, dass LWLibAVSource früher 8 und 16 bit ordentlich unterstützt hatte. (bei FFVideoSource tritt das meine ich nicht auf)
2,1% ist nicht gerade viel, erscheint mir vernachlässigbar,...
Cu Selur
----
Dev versions are in the 'experimental'-folder of my GoogleDrive, which is linked on the download page.