Log in

View Full Version : Fow can I force ImageWriter to write the frames?


konstantin1
28th August 2021, 01:24
I have a quite complex, and memory consuming script, in which I read images, and put them various layers, eg. arrows, text, etc.

I found out, that my script use much less memory, if at a point I write out the layered images to PNG files, and then read them back into variables, and then the following commands, filters use those PNG images in the script.

A sample from my script:


blank=blackness(text,$00000000).trim(0,-1).loop(k0)
image1x1.trim(0,-1).ImageWriter("png\image1x1\", type="png")++k4x4.trim(0,-1).ImageWriter("png\k4x4\", type="png")++text.trim(0,-1).ImageWriter("png\text\", type="png")

image1x1r=imagesource("png/image1x1/000000.png",pixel_type="RGB32",FPS=FPS).trim(0,-1).loop(k0)
k4x4r=imagesource("png/k4x4/000000.png",pixel_type="RGB32",FPS=FPS).trim(0,-1).loop(k0)
textr=imagesource("png/text/000000.png",pixel_type="RGB32",FPS=FPS).trim(0,-1).loop(k0)
stack=output=="gif" ? StackHorizontal(image1x1,k4x4,text,blank) : StackHorizontal(image1x1r,k4x4r,textr,blank)



The problem is that the images are written by ImageWriter only in that case, if ImageWriter is the last command (eg. inserting an __END__ ), and I visit, or let render every 3 frames, and then deleting the __END__ marker.

How can I force imagewriter to write those 3 frames as images?

StainlessS
28th August 2021, 01:53
Try insert RT_Stats, function RT_ForceProcess() on the blank line [EDIT #3].
It will force read every frame of Last clip [ie your Imagewriter stuff], and so force the images to be written.
Then the remainder of script will execute.

EDIT:You spell "How" with an 'H' :)

EDIT:
Below inserted where line 3 is should also work [I think, untested]


for(n=0,FrameCount-1) {
current_frame = n
AverageLuma # force read of Last clip, frame n, will force writing to image.
}


EDIT:
OK, maybe it dont work, AverageLuma only for YUV, yours probably RGB, so try instead

for(n=0,FrameCount-1) {
current_frame = n
(Last.IsRGB) ? AverageR : AverageLuma # force read of Last clip, frame n, will force writing to image.
}

Should work with either YUV or RGB Last clip [AverageR Requires AVS+]

EDIT: Or alternatively [Avs v2.58+]

ForceClip = Last.crop(4,4).ConvertToYV12()
for(n=0,FrameCount-1) {
current_frame = n
ForceClip.AverageLuma # force read of Last clip, frame n, will force writing to image.
}

konstantin1
29th August 2021, 13:44
Thank you very much, it really works!
I used second option, due to Avisynth+ 3.4

kedautinh12
29th August 2021, 14:44
Thank you very much, it really works!
I used second option, due to Avisynth+ 3.4

I think it's updated to avs+ 3.7.1 now

StainlessS
29th August 2021, 15:24
Oops, and the one for v2.58 of course would require GScript.