mirror of
https://github.com/koush/scrypted.git
synced 2026-03-20 16:40:24 +00:00
python-codecs: implement hang protection
This commit is contained in:
8
plugins/python-codecs/.vscode/settings.json
vendored
8
plugins/python-codecs/.vscode/settings.json
vendored
@@ -1,8 +1,8 @@
|
||||
|
||||
{
|
||||
// docker installation
|
||||
"scrypted.debugHost": "koushik-ubuntu",
|
||||
"scrypted.serverRoot": "/server",
|
||||
// "scrypted.debugHost": "koushik-ubuntu",
|
||||
// "scrypted.serverRoot": "/server",
|
||||
|
||||
// windows installation
|
||||
// "scrypted.debugHost": "koushik-windows",
|
||||
@@ -13,8 +13,8 @@
|
||||
// "scrypted.serverRoot": "/home/pi/.scrypted",
|
||||
|
||||
// local checkout
|
||||
// "scrypted.debugHost": "127.0.0.1",
|
||||
// "scrypted.serverRoot": "/Users/koush/.scrypted",
|
||||
"scrypted.debugHost": "127.0.0.1",
|
||||
"scrypted.serverRoot": "/Users/koush/.scrypted",
|
||||
|
||||
"scrypted.pythonRemoteRoot": "${config:scrypted.serverRoot}/volume/plugin.zip",
|
||||
"python.analysis.extraPaths": [
|
||||
|
||||
4
plugins/python-codecs/package-lock.json
generated
4
plugins/python-codecs/package-lock.json
generated
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "@scrypted/python-codecs",
|
||||
"version": "0.1.73",
|
||||
"version": "0.1.74",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "@scrypted/python-codecs",
|
||||
"version": "0.1.73",
|
||||
"version": "0.1.74",
|
||||
"devDependencies": {
|
||||
"@scrypted/sdk": "file:../../sdk"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@scrypted/python-codecs",
|
||||
"version": "0.1.73",
|
||||
"version": "0.1.74",
|
||||
"description": "Python Codecs for Scrypted",
|
||||
"keywords": [
|
||||
"scrypted",
|
||||
|
||||
@@ -20,7 +20,6 @@ async def createPipelineIterator(pipeline: str, gst = None):
|
||||
print(pipeline)
|
||||
finished = concurrent.futures.Future()
|
||||
|
||||
newGst = not gst
|
||||
if gst:
|
||||
bin = Gst.parse_bin_from_description(pipeline, False)
|
||||
gst.add(bin)
|
||||
|
||||
@@ -149,30 +149,33 @@ def multiprocess_exit():
|
||||
os._exit(os.EX_OK)
|
||||
|
||||
class CodecFork:
|
||||
async def generateVideoFramesGstreamer(self, mediaObject: scrypted_sdk.MediaObject, options: scrypted_sdk.VideoFrameGeneratorOptions, filter: Any, h264Decoder: str, postProcessPipeline: str) -> scrypted_sdk.VideoFrame:
|
||||
async def generateVideoFrames(self, iter, src: str):
|
||||
start = time.time()
|
||||
loop = asyncio.get_event_loop()
|
||||
def timeoutExit():
|
||||
print('Frame yield timed out, exiting pipeline.')
|
||||
multiprocess_exit()
|
||||
|
||||
try:
|
||||
async for data in gstreamer.generateVideoFramesGstreamer(mediaObject, options, filter, h264Decoder, postProcessPipeline):
|
||||
while True:
|
||||
data = await asyncio.wait_for(iter.__anext__(), timeout=10)
|
||||
timeout = loop.call_later(10, timeoutExit)
|
||||
yield data
|
||||
except Exception as e:
|
||||
timeout.cancel()
|
||||
except Exception:
|
||||
traceback.print_exc()
|
||||
raise
|
||||
finally:
|
||||
print('gstreamer finished after %s' % (time.time() - start))
|
||||
print('%s finished after %s' % (src, time.time() - start))
|
||||
asyncio.get_event_loop().call_later(1, multiprocess_exit)
|
||||
|
||||
async def generateVideoFramesGstreamer(self, mediaObject: scrypted_sdk.MediaObject, options: scrypted_sdk.VideoFrameGeneratorOptions, filter: Any, h264Decoder: str, postProcessPipeline: str) -> scrypted_sdk.VideoFrame:
|
||||
async for data in self.generateVideoFrames(gstreamer.generateVideoFramesGstreamer(mediaObject, options, filter, h264Decoder, postProcessPipeline), "gstreamer"):
|
||||
yield data
|
||||
|
||||
async def generateVideoFramesLibav(self, mediaObject: scrypted_sdk.MediaObject, options: scrypted_sdk.VideoFrameGeneratorOptions = None, filter: Any = None) -> scrypted_sdk.VideoFrame:
|
||||
start = time.time()
|
||||
try:
|
||||
async for data in libav.generateVideoFramesLibav(mediaObject, options, filter):
|
||||
yield data
|
||||
except Exception as e:
|
||||
traceback.print_exc()
|
||||
raise
|
||||
finally:
|
||||
print('libav finished after %s' % (time.time() - start))
|
||||
asyncio.get_event_loop().call_later(1, multiprocess_exit)
|
||||
|
||||
async for data in self.generateVideoFrames(libav.generateVideoFramesLibav(mediaObject, options, filter), "libav"):
|
||||
yield data
|
||||
|
||||
async def fork():
|
||||
return CodecFork()
|
||||
|
||||
Reference in New Issue
Block a user