import time
import unittest
import threading
import vapoursynth as vs
from concurrent.futures import Future
class FilterTestSequence(unittest.TestCase):
def setUp(self):
self.core = vs.core
self.filter = self.core.std.BlankClip(length=20)
self.slow_filter = self.filter.std.FrameEval(self.slow_filter_fe)
self.fail_filter = self.filter.std.FrameEval(self.fail_filter_fe)
self.condition = threading.Event()
self.cb_called = False
self.cb_result = None
self.cb_node = None
self.cb_n = None
self.mv_called = False
def slow_filter_fe(self, n):
time.sleep(1)
return self.filter
def fail_filter_fe(self, n):
time.sleep(1)
raise RuntimeError("Fail")
def cb_old(self, node, n, result):
self.cb_called = True
self.cb_result = result
self.cb_node = node
self.cb_n = n
self.condition.set()
def cb(self, result, error):
self.cb_result = (result, error)
self.cb_called = True
self.cb_node = None
self.cb_n = None
self.condition.set()
def mv(self, func, *args, **kwargs):
self.mv_called = func
return func(*args, **kwargs)
def test_raw_cb_slow(self):
self.slow_filter.get_frame_async(0, self.cb)
self.condition.wait(2)
self.assertTrue(self.cb_called)
self.assertIsInstance(self.cb_result, tuple)
self.assertEqual(len(self.cb_result), 2)
self.assertIsInstance(self.cb_result[0], vs.VideoFrame)
self.assertIsNone(self.cb_result[1])
def test_raw_cb_fail(self):
self.fail_filter.get_frame_async(0, self.cb)
self.condition.wait(2)
self.assertTrue(self.cb_called)
self.assertIsInstance(self.cb_result, tuple)
self.assertEqual(len(self.cb_result), 2)
self.assertIsInstance(self.cb_result[1], vs.Error)
self.assertIsNone(self.cb_result[0])
def test_async_slow(self):
fut = self.slow_filter.get_frame_async(1)
self.assertIsInstance(fut.result(2), vs.VideoFrame)
def test_async_fail(self):
fut = self.fail_filter.get_frame_async(1)
with self.assertRaisesRegex(vs.Error, "Fail"):
fut.result(2)
if __name__ == '__main__':
unittest.main()