From f8bcf196d339c528e80916d784ea6c11b7bd80bb Mon Sep 17 00:00:00 2001 From: Koushik Dutta Date: Tue, 17 Oct 2023 10:38:14 -0700 Subject: [PATCH] python-codecs: use non hw accelerated h265 by default --- plugins/python-codecs/package-lock.json | 4 ++-- plugins/python-codecs/package.json | 2 +- plugins/python-codecs/src/gstreamer.py | 12 ++++++++++++ plugins/python-codecs/src/main.py | 18 +++++++++++++++++- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/plugins/python-codecs/package-lock.json b/plugins/python-codecs/package-lock.json index aa5529057..9ceea6732 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.86", + "version": "0.1.87", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@scrypted/python-codecs", - "version": "0.1.86", + "version": "0.1.87", "devDependencies": { "@scrypted/sdk": "file:../../sdk" } diff --git a/plugins/python-codecs/package.json b/plugins/python-codecs/package.json index 78edf57d5..3043eb0ce 100644 --- a/plugins/python-codecs/package.json +++ b/plugins/python-codecs/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/python-codecs", - "version": "0.1.86", + "version": "0.1.87", "description": "Python Codecs for Scrypted", "keywords": [ "scrypted", diff --git a/plugins/python-codecs/src/gstreamer.py b/plugins/python-codecs/src/gstreamer.py index b4bf0d409..6620d3242 100644 --- a/plugins/python-codecs/src/gstreamer.py +++ b/plugins/python-codecs/src/gstreamer.py @@ -316,6 +316,7 @@ async def generateVideoFramesGstreamer( options: scrypted_sdk.VideoFrameGeneratorOptions = None, filter: Any = None, h264Decoder: str = None, + h265Decoder: str = None, postProcessPipeline: str = None, ) -> scrypted_sdk.VideoFrame: ffmpegInput: scrypted_sdk.FFmpegInput = ( @@ -367,6 +368,17 @@ async def generateVideoFramesGstreamer( decoder = "vtdec_hw" else: decoder = "avdec_h264 output-corrupt=false" + elif videoCodec == "h265": + setDecoderClearDefault(h265Decoder) + + if not decoder: + # hw acceleration is "safe" to use on mac, but not + # on other hosts where it may crash. + # defaults must be safe. + if platform.system() == "Darwin": + decoder = "vtdec_hw" + else: + decoder = "avdec_h265 output-corrupt=false" else: # decodebin may pick a hardware accelerated decoder, which isn't ideal # so use a known software decoder for h264 and decodebin for anything else. diff --git a/plugins/python-codecs/src/main.py b/plugins/python-codecs/src/main.py index 527de75f1..a8df6daf5 100644 --- a/plugins/python-codecs/src/main.py +++ b/plugins/python-codecs/src/main.py @@ -62,6 +62,7 @@ class GstreamerGenerator( options, filter, self.storage.getItem("h264Decoder"), + self.storage.getItem("h265Decoder"), self.storage.getItem("postProcessPipeline"), ) @@ -81,6 +82,20 @@ class GstreamerGenerator( ], "combobox": True, }, + { + "key": "h265Decoder", + "title": "H25 Decoder", + "description": "The Gstreamer pipeline to use to decode H265 video.", + "value": self.storage.getItem("h265Decoder") or "Default", + "choices": [ + "Default", + "decodebin", + "vtdec_hw", + "nvh265dec", + "vaapih265dec", + ], + "combobox": True, + }, { "key": "postProcessPipeline", "title": "Post Process Pipeline", @@ -229,11 +244,12 @@ class CodecFork: options: scrypted_sdk.VideoFrameGeneratorOptions, filter: Any, h264Decoder: str, + h265Decoder: str, postProcessPipeline: str, ) -> scrypted_sdk.VideoFrame: async for data in self.generateVideoFrames( gstreamer.generateVideoFramesGstreamer( - mediaObject, options, filter, h264Decoder, postProcessPipeline + mediaObject, options, filter, h264Decoder, h265Decoder, postProcessPipeline ), "gstreamer", options and options.get("firstFrameOnly"),