From e3d4800e4f0528a23e780bad73f192334871cb1a Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Wed, 17 May 2023 21:03:51 -0700 Subject: [PATCH] python-codecs: implement image close --- plugins/python-codecs/package-lock.json | 4 ++-- plugins/python-codecs/package.json | 2 +- plugins/python-codecs/src/gstreamer.py | 6 ++---- plugins/python-codecs/src/libav.py | 6 ++---- plugins/python-codecs/src/pilimage.py | 6 ++++++ plugins/python-codecs/src/vipsimage.py | 6 ++++++ sdk/types/scrypted_python/scrypted_sdk/types.py | 2 ++ sdk/types/src/types.input.ts | 1 + 8 files changed, 22 insertions(+), 11 deletions(-) diff --git a/plugins/python-codecs/package-lock.json b/plugins/python-codecs/package-lock.json index 04f293890..b41ff7542 100644 --- a/plugins/python-codecs/package-lock.json +++ b/plugins/python-codecs/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/python-codecs", - "version": "0.1.56", + "version": "0.1.57", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/python-codecs", - "version": "0.1.56", + "version": "0.1.57", "devDependencies": { "@scrypted/sdk": "file:../../sdk" } diff --git a/plugins/python-codecs/package.json b/plugins/python-codecs/package.json index 150c7c007..adefb9669 100644 --- a/plugins/python-codecs/package.json +++ b/plugins/python-codecs/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/python-codecs", - "version": "0.1.56", + "version": "0.1.57", "description": "Python Codecs for Scrypted", "keywords": [ "scrypted", diff --git a/plugins/python-codecs/src/gstreamer.py b/plugins/python-codecs/src/gstreamer.py index 7009898d4..af934d885 100644 --- a/plugins/python-codecs/src/gstreamer.py +++ b/plugins/python-codecs/src/gstreamer.py @@ -122,8 +122,7 @@ async def generateVideoFramesGstreamer(mediaObject: scrypted_sdk.MediaObject, op try: yield createVideoFrame(mo) finally: - vipsImage.vipsImage = None - vips.invalidate() + await vipsImage.close() else: pil = pilimage.new_from_memory(info.data, width, height, bands) @@ -135,7 +134,6 @@ async def generateVideoFramesGstreamer(mediaObject: scrypted_sdk.MediaObject, op try: yield createVideoFrame(mo) finally: - pilImage.pilImage = None - pil.close() + await pilImage.close() finally: gst_buffer.unmap(info) diff --git a/plugins/python-codecs/src/libav.py b/plugins/python-codecs/src/libav.py index e60588d95..aff3636d5 100644 --- a/plugins/python-codecs/src/libav.py +++ b/plugins/python-codecs/src/libav.py @@ -60,8 +60,7 @@ async def generateVideoFramesLibav(mediaObject: scrypted_sdk.MediaObject, option try: yield createVideoFrame(mo) finally: - vipsImage.vipsImage = None - vips.invalidate() + await vipsImage.close() else: if gray and frame.format.name.startswith('yuv') and frame.planes and len(frame.planes): pil = pilimage.new_from_memory(memoryview(frame.planes[0]), frame.width, frame.height, 1) @@ -82,7 +81,6 @@ async def generateVideoFramesLibav(mediaObject: scrypted_sdk.MediaObject, option try: yield createVideoFrame(mo) finally: - pilImage.pilImage = None - pil.close() + await pilImage.close() finally: container.close() diff --git a/plugins/python-codecs/src/pilimage.py b/plugins/python-codecs/src/pilimage.py index 375a6f01f..e6a642864 100644 --- a/plugins/python-codecs/src/pilimage.py +++ b/plugins/python-codecs/src/pilimage.py @@ -16,6 +16,12 @@ class PILImage(scrypted_sdk.Image): self.width = pilImage.width self.height = pilImage.height + async def close(self): + pil = self.pilImage + self.pilImage = None + if pil: + pil.close() + async def toBuffer(self, options: scrypted_sdk.ImageOptions = None) -> bytearray: pilImage: PILImage = await self.toPILImage(options) diff --git a/plugins/python-codecs/src/vipsimage.py b/plugins/python-codecs/src/vipsimage.py index c744c8932..2ccae7261 100644 --- a/plugins/python-codecs/src/vipsimage.py +++ b/plugins/python-codecs/src/vipsimage.py @@ -16,6 +16,12 @@ class VipsImage(scrypted_sdk.Image): self.width = vipsImage.width self.height = vipsImage.height + async def close(self): + vips = self.vipsImage + self.vipsImage = None + if vips: + vips.invalidate() + async def toBuffer(self, options: scrypted_sdk.ImageOptions = None) -> bytearray: vipsImage: VipsImage = await self.toVipsImage(options) diff --git a/sdk/types/scrypted_python/scrypted_sdk/types.py b/sdk/types/scrypted_python/scrypted_sdk/types.py index 575524ca9..c6e141270 100644 --- a/sdk/types/scrypted_python/scrypted_sdk/types.py +++ b/sdk/types/scrypted_python/scrypted_sdk/types.py @@ -2597,6 +2597,8 @@ class Image: format: ImageFormat height: float width: float + async def close(self) -> None: + pass async def toBuffer(self, options: ImageOptions = None) -> bytearray: pass async def toImage(self, options: ImageOptions = None) -> Union[Image, MediaObject]: diff --git a/sdk/types/src/types.input.ts b/sdk/types/src/types.input.ts index d50caffc7..90eced413 100644 --- a/sdk/types/src/types.input.ts +++ b/sdk/types/src/types.input.ts @@ -1363,6 +1363,7 @@ export interface Image { format?: ImageFormat; toBuffer(options?: ImageOptions): Promise; toImage(options?: ImageOptions): Promise; + close(): Promise; } export interface VideoFrame { __json_copy_serialize_children: true;