Compare commits

..

3 Commits

Author SHA1 Message Date
Leo Vasanko
fdbf9b2610 Attempt to reduce leak of ffmpeg previews 2023-11-21 12:26:16 +00:00
Leo Vasanko
8437c1f60e Attempt to reduce leak of ffmpeg previews 2023-11-21 12:23:24 +00:00
Leo Vasanko
02c5e484b5 Attempt to reduce leak of ffmpeg previews 2023-11-21 12:22:03 +00:00

View File

@ -10,6 +10,7 @@ from wsgiref.handlers import format_date_time
import av import av
import av.datasets import av.datasets
import fitz # PyMuPDF import fitz # PyMuPDF
from av.streams import SideData
from PIL import Image from PIL import Image
from sanic import Blueprint, empty, raw from sanic import Blueprint, empty, raw
from sanic.exceptions import NotFound from sanic.exceptions import NotFound
@ -97,24 +98,20 @@ def process_pdf(path, *, maxsize, maxzoom, quality, page_number=0):
def process_video(path, *, maxsize, quality): def process_video(path, *, maxsize, quality):
with av.open(str(path)) as container: with av.open(str(path)) as container:
stream = container.streams.video[0] stream = container.streams.video[0]
rotation = (
stream.side_data
and stream.side_data.get(av.stream.SideData.DISPLAYMATRIX)
or 0
)
stream.codec_context.skip_frame = "NONKEY" stream.codec_context.skip_frame = "NONKEY"
stream.codec_context.threads = 1
rot = stream.side_data and stream.side_data.get(SideData.DISPLAYMATRIX) or 0
container.seek(container.duration // 8) container.seek(container.duration // 8)
frame = next(container.decode(stream)) img = next(container.decode(stream)).to_image()
img = frame.to_image() del stream
del frame, stream
img.thumbnail((maxsize, maxsize)) img.thumbnail((maxsize, maxsize))
imgdata = io.BytesIO() imgdata = io.BytesIO()
if rotation: if rot:
img = img.rotate(rotation, expand=True) img = img.rotate(rot, expand=True)
img.save(imgdata, format="webp", quality=quality, method=4) img.save(imgdata, format="webp", quality=quality, method=4)
del img del img
ret = imgdata.getvalue() ret = imgdata.getvalue()
del imgdata
gc.collect() gc.collect()
return ret return ret