From 3670d3f7931ac21cc7b87b3649d811cfcd14166d Mon Sep 17 00:00:00 2001 From: Emiliana <38952746+emilianavt@users.noreply.github.com> Date: Wed, 30 Sep 2020 01:03:04 +0200 Subject: [PATCH] Added support for libminibmcapture input and the `OpenSeeWebcamInfo` example. --- Examples/OpenSeeWebcamInfo.cs | 10 +-- Unity/Plugins/libminibmcapture32.dll | Bin 34304 -> 34304 bytes Unity/Plugins/libminibmcapture64.dll | Bin 39424 -> 39424 bytes dshowcapture.py | 97 +++++++++++++++++++++++---- dshowcapture/libminibmcapture32.dll | Bin 34304 -> 34304 bytes dshowcapture/libminibmcapture64.dll | Bin 39424 -> 39424 bytes facetracker.py | 5 +- facetracker.spec | 2 +- input_reader.py | 24 ++++--- make_exe.bat | 13 +--- 10 files changed, 112 insertions(+), 39 deletions(-) diff --git a/Examples/OpenSeeWebcamInfo.cs b/Examples/OpenSeeWebcamInfo.cs index ecdf366..237c792 100644 --- a/Examples/OpenSeeWebcamInfo.cs +++ b/Examples/OpenSeeWebcamInfo.cs @@ -63,14 +63,14 @@ public class OpenSeeWebcam { private List> splitCaps = null; private int CompareCaps(OpenSeeWebcamCapability a, OpenSeeWebcamCapability b) { - if (a.rating < b.rating) - return -1; - if (a.rating > b.rating) - return 1; if (a.minCX * a.minCY > b.minCX * b.minCY) return -1; if (a.minCX * a.minCY < b.minCX * b.minCY) return 1; + if (a.rating < b.rating) + return -1; + if (a.rating > b.rating) + return 1; if (a.minInterval < b.minInterval) return -1; if (a.minInterval > b.minInterval) @@ -124,6 +124,7 @@ public class OpenSeeWebcam { OpenSeeWebcamCapability cap = new OpenSeeWebcamCapability(); cap.id = -1; cap.format = OpenSeeWebcamFormat.Any; + cap.minInterval = 10000000 / 60; return cap; } dshowOffset = 1; @@ -204,6 +205,7 @@ public class OpenSeeWebcamInfo : MonoBehaviour { int length = bm_get_json_length_x64(); StringBuilder buffer = new StringBuilder(length); bm_get_json_x64(buffer, length); + //return "[{\"id\": 0,\"name\": \"DeckLink Mini Recorder\",\"bmId\": 2592763504,\"bmFlags\": \"1\",\"caps\": [{\"id\": 0,\"minCX\": 720,\"minCY\": 486,\"maxCX\": 720,\"maxCY\": 486,\"granularityCX\": 1,\"granularityCY\": 1,\"minInterval\": 166833,\"maxInterval\": 166833,\"bmTimescale\": 60000,\"bmFrameduration\": 1001,\"bmModecode\": 1853125488,\"rating\": 1,\"format\": 100},{\"id\": 1,\"minCX\": 720,\"minCY\": 576,\"maxCX\": 720,\"maxCY\": 576,\"granularityCX\": 1,\"granularityCY\": 1,\"minInterval\": 200000,\"maxInterval\": 200000,\"bmTimescale\": 50000,\"bmFrameduration\": 1000,\"bmModecode\": 1885432944,\"rating\": 1,\"format\": 100},{\"id\": 2,\"minCX\": 1920,\"minCY\": 1080,\"maxCX\": 1920,\"maxCY\": 1080,\"granularityCX\": 1,\"granularityCY\": 1,\"minInterval\": 417083,\"maxInterval\": 417083,\"bmTimescale\": 24000,\"bmFrameduration\": 1001,\"bmModecode\": 842231923,\"rating\": 1,\"format\": 100},{\"id\": 3,\"minCX\": 1920,\"minCY\": 1080,\"maxCX\": 1920,\"maxCY\": 1080,\"granularityCX\": 1,\"granularityCY\": 1,\"minInterval\": 416666,\"maxInterval\": 416666,\"bmTimescale\": 24000,\"bmFrameduration\": 1000,\"bmModecode\": 842297459,\"rating\": 1,\"format\": 100},{\"id\": 4,\"minCX\": 1920,\"minCY\": 1080,\"maxCX\": 1920,\"maxCY\": 1080,\"granularityCX\": 1,\"granularityCY\": 1,\"minInterval\": 400000,\"maxInterval\": 400000,\"bmTimescale\": 25000,\"bmFrameduration\": 1000,\"bmModecode\": 1215312437,\"rating\": 1,\"format\": 100},{\"id\": 5,\"minCX\": 1920,\"minCY\": 1080,\"maxCX\": 1920,\"maxCY\": 1080,\"granularityCX\": 1,\"granularityCY\": 1,\"minInterval\": 333666,\"maxInterval\": 333666,\"bmTimescale\": 30000,\"bmFrameduration\": 1001,\"bmModecode\": 1215312441,\"rating\": 1,\"format\": 100},{\"id\": 6,\"minCX\": 1920,\"minCY\": 1080,\"maxCX\": 1920,\"maxCY\": 1080,\"granularityCX\": 1,\"granularityCY\": 1,\"minInterval\": 333333,\"maxInterval\": 333333,\"bmTimescale\": 30000,\"bmFrameduration\": 1000,\"bmModecode\": 1215312688,\"rating\": 1,\"format\": 100},{\"id\": 7,\"minCX\": 1280,\"minCY\": 720,\"maxCX\": 1280,\"maxCY\": 720,\"granularityCX\": 1,\"granularityCY\": 1,\"minInterval\": 200000,\"maxInterval\": 200000,\"bmTimescale\": 50000,\"bmFrameduration\": 1000,\"bmModecode\": 1752184112,\"rating\": 1,\"format\": 100},{\"id\": 8,\"minCX\": 1280,\"minCY\": 720,\"maxCX\": 1280,\"maxCY\": 720,\"granularityCX\": 1,\"granularityCY\": 1,\"minInterval\": 166833,\"maxInterval\": 166833,\"bmTimescale\": 60000,\"bmFrameduration\": 1001,\"bmModecode\": 1752184121,\"rating\": 1,\"format\": 100},{\"id\": 9,\"minCX\": 1280,\"minCY\": 720,\"maxCX\": 1280,\"maxCY\": 720,\"granularityCX\": 1,\"granularityCY\": 1,\"minInterval\": 166666,\"maxInterval\": 166666,\"bmTimescale\": 60000,\"bmFrameduration\": 1000,\"bmModecode\": 1752184368,\"rating\": 1,\"format\": 100}]}]"; return buffer.ToString(); } diff --git a/Unity/Plugins/libminibmcapture32.dll b/Unity/Plugins/libminibmcapture32.dll index 34d9c93ad86e4f2d9259f5b048877160b4747feb..dc409da3bdb5ee57ad22f0703b3dead8750d03a7 100644 GIT binary patch delta 3959 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 Z%z}pvnin-j%@&P8TcI_YcWhW_^Dil0-^Ty| delta 3870 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 diff --git a/Unity/Plugins/libminibmcapture64.dll b/Unity/Plugins/libminibmcapture64.dll index 9b7d1de8d30da97687a47da01bb0c8ce4417336c..658394757e28a66f82ac33324b9bfe02f99bd069 100644 GIT binary patch delta 9117 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 R<-n8tmwR&CeD{9s@ejC+tqcGF delta 8957 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 M>huhG{7TS207G196aWAK diff --git a/dshowcapture.py b/dshowcapture.py index cfb4e79..e1c5293 100644 --- a/dshowcapture.py +++ b/dshowcapture.py @@ -12,22 +12,30 @@ def resolve(name): return f lib = None +bm_lib = None -def create_frame_buffer(width, height): - buffer = bytearray(width * height * 4 * 4) +def create_frame_buffer(width, height, factor): + buffer = bytearray(width * height * 4 * factor) char_array = c_char * len(buffer) return char_array.from_buffer(buffer) class DShowCapture(): def __init__(self): global lib - if lib is None: + global bm_lib + if lib is None or bm_lib is None: if platform.architecture()[0] == '32bit': dll_path = resolve(os.path.join("dshowcapture", "dshowcapture_x86.dll")) lib = cdll.LoadLibrary(dll_path) + dll_path = resolve(os.path.join("dshowcapture", "libminibmcapture32.dll")) + bm_lib = cdll.LoadLibrary(dll_path) else: dll_path = resolve(os.path.join("dshowcapture", "dshowcapture_x64.dll")) lib = cdll.LoadLibrary(dll_path) + dll_path = resolve(os.path.join("dshowcapture", "libminibmcapture64.dll")) + bm_lib = cdll.LoadLibrary(dll_path) + + # DirectShow lib.create_capture.restype = c_void_p lib.get_devices.argtypes = [c_void_p] lib.get_device.argtypes = [c_void_p, c_int, c_char_p, c_int] @@ -47,7 +55,15 @@ class DShowCapture(): lib.get_json_length.argtypes = [c_void_p] lib.get_json.argtypes = [c_void_p, c_char_p, c_int] lib.destroy_capture.argtypes = [c_void_p] + + # Blackmagic + bm_lib.start_capture_single.argtypes = [c_int, c_int, c_void_p] + bm_lib.read_frame_bgra32_blocking.argtypes = [c_char_p, c_int] + bm_lib.stop_capture_single.argtypes = [] + bm_lib.get_json_length.argtypes = [] + bm_lib.get_json.argtypes = [c_char_p, c_int] self.lib = lib + self.bm_lib = bm_lib self.cap = lib.create_capture() self.name_buffer = create_string_buffer(255); self.buffer = None @@ -55,6 +71,7 @@ class DShowCapture(): self.size = None self.real_size = None self.info = None + self.type = None def __del__(self): if not self.buffer is None: @@ -72,11 +89,27 @@ class DShowCapture(): return name_str def get_info(self): + # DirectShow json_length = self.lib.get_json_length(self.cap); json_buffer = create_string_buffer(json_length) self.lib.get_json(self.cap, json_buffer, json_length); json_text = str(json_buffer.value.decode('utf8')) self.info = json.loads(json_text) + for cam in self.info: + cam["type"] = "DirectShow" + + # Blackmagic + json_length = self.bm_lib.get_json_length(); + json_buffer = create_string_buffer(json_length) + self.bm_lib.get_json(json_buffer, json_length); + json_text = str(json_buffer.value.decode('utf8')) + bm_info = json.loads(json_text) + dshow_len = len(self.info) + for cam in bm_info: + cam["type"] = "Blackmagic" + cam["id"] += dshow_len + self.info.extend(bm_info) + return self.info def capture_device(self, cam, width, height, fps): @@ -84,12 +117,15 @@ class DShowCapture(): self.get_devices() ret = self.lib.capture_device(self.cap, cam, width, height, fps) == 1 if ret: + self.type = "DirectShow" self.width = self.get_width() self.height = self.get_height() + self.fps = self.get_fps() self.flipped = self.get_flipped() self.colorspace = self.get_colorspace() + self.colorspace_internal = self.get_colorspace_internal() self.size = self.width * self.height * 4 - self.buffer = create_frame_buffer(self.width, self.height) + self.buffer = create_frame_buffer(self.width, self.height, 4) else: self.size = None self.real_size = None @@ -98,15 +134,35 @@ class DShowCapture(): def capture_device_by_dcap(self, cam, dcap, width, height, fps): if not self.have_devices: self.get_devices() + if self.info is None: + self.get_info() fps = int(10000000 / fps) - ret = self.lib.capture_device_by_dcap(self.cap, cam, dcap, width, height, fps) == 1 + ret = False + if self.info[cam]['type'] == "DirectShow": + ret = self.lib.capture_device_by_dcap(self.cap, cam, dcap, width, height, fps) == 1 + elif self.info[cam]['type'] == "Blackmagic": + ret = self.bm_lib.start_capture_single(self.info[cam]['bmId'], self.info[cam]['caps'][dcap]['bmModecode'], None) != 0 if ret: - self.width = self.get_width() - self.height = self.get_height() - self.flipped = self.get_flipped() - self.colorspace = self.get_colorspace() - self.size = self.width * self.height * 4 * 4 - self.buffer = create_frame_buffer(self.width, self.height) + self.type = self.info[cam]['type'] + if self.type == "DirectShow": + self.width = self.get_width() + self.height = self.get_height() + self.fps = self.get_fps() + self.flipped = self.get_flipped() + self.colorspace = self.get_colorspace() + self.colorspace_internal = self.get_colorspace_internal() + self.size = self.width * self.height * 4 * 4 + self.buffer = create_frame_buffer(self.width, self.height, 4) + elif self.type == "Blackmagic": + self.width = self.info[cam]['caps'][dcap]['minCX'] + self.height = self.info[cam]['caps'][dcap]['minCY'] + self.fps = int(10000000 / self.info[cam]['caps'][dcap]['minInterval']) + self.flipped = False + self.colorspace = 101 + self.colorspace_internal = self.colorspace + self.size = self.width * self.height * 4 + self.buffer = create_frame_buffer(self.width, self.height, 1) + self.real_size = self.size else: self.size = None self.real_size = None @@ -117,12 +173,15 @@ class DShowCapture(): self.get_devices() ret = self.lib.capture_device_default(self.cap, cam) == 1 if ret: + self.type = "DirectShow" self.width = self.get_width() self.height = self.get_height() + self.fps = self.get_fps() self.flipped = self.get_flipped() self.colorspace = self.get_colorspace() + self.colorspace_internal = self.get_colorspace_internal() self.size = self.width * self.height * 4 * 4 - self.buffer = create_frame_buffer(self.width, self.height) + self.buffer = create_frame_buffer(self.width, self.height, 4) else: self.size = None self.real_size = None @@ -155,7 +214,12 @@ class DShowCapture(): def get_frame(self, timeout): if self.size is None: return None - self.real_size = self.lib.get_frame(self.cap, timeout, self.buffer, self.size) + if self.type == "DirectShow": + self.real_size = self.lib.get_frame(self.cap, timeout, self.buffer, self.size) + elif self.type == "Blackmagic": + self.bm_lib.read_frame_bgra32_blocking(self.buffer, self.size) + else: + return None img = np.frombuffer(self.buffer, dtype=np.uint8)[0:self.real_size] if self.colorspace in [100, 101]: if self.real_size == self.height * self.width * 4: @@ -192,11 +256,16 @@ class DShowCapture(): def stop_capture(self): self.size = None self.real_size = None - return self.lib.stop_capture(self.cap) + if self.type == "DirectShow": + return self.lib.stop_capture(self.cap) + elif self.type == "Blackmagic": + return self.bm_lib.stop_capture_single() != 0 + return True def destroy_capture(self): if self.cap is None: return 0 + self.stop_capture() ret = self.lib.destroy_capture(self.cap) self.cap = None self.size = None diff --git a/dshowcapture/libminibmcapture32.dll b/dshowcapture/libminibmcapture32.dll index 34d9c93ad86e4f2d9259f5b048877160b4747feb..dc409da3bdb5ee57ad22f0703b3dead8750d03a7 100644 GIT binary patch delta 3959 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 Z%z}pvnin-j%@&P8TcI_YcWhW_^Dil0-^Ty| delta 3870 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 diff --git a/dshowcapture/libminibmcapture64.dll b/dshowcapture/libminibmcapture64.dll index 9b7d1de8d30da97687a47da01bb0c8ce4417336c..658394757e28a66f82ac33324b9bfe02f99bd069 100644 GIT binary patch delta 9117 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 R<-n8tmwR&CeD{9s@ejC+tqcGF delta 8957 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 M>huhG{7TS207G196aWAK diff --git a/facetracker.py b/facetracker.py index ed4c7e4..6ee0636 100644 --- a/facetracker.py +++ b/facetracker.py @@ -78,7 +78,10 @@ if os.name == 'nt' and (args.list_cameras > 0 or not args.list_dcaps is None): formats = {0: "Any", 1: "Unknown", 100: "ARGB", 101: "XRGB", 200: "I420", 201: "NV12", 202: "YV12", 203: "Y800", 300: "YVYU", 301: "YUY2", 302: "UYVY", 303: "HDYC (Unsupported)", 400: "MJPEG", 401: "H264" } for cam in info: if args.list_dcaps == -1: - print(f"{cam['id']}: {cam['name']}") + type = "" + if cam['type'] == "Blackmagic": + type = "Blackmagic: " + print(f"{cam['id']}: {type}{cam['name']}") if args.list_dcaps != -1 and args.list_dcaps != cam['id']: continue for caps in cam['caps']: diff --git a/facetracker.spec b/facetracker.spec index 1df151f..060d850 100644 --- a/facetracker.spec +++ b/facetracker.spec @@ -5,7 +5,7 @@ block_cipher = None a = Analysis(['facetracker.py'], pathex=['C:\\OpenSeeFaceBuild'], - binaries=[('dshowcapture/dshowcapture_x86.dll', '.'), ('dshowcapture/dshowcapture_x64.dll', '.'), ('escapi/escapi_x86.dll', '.'), ('escapi/escapi_x64.dll', '.'), ('run.bat', '.'), ('msvcp140.dll', '.'), ('vcomp140.dll', '.'), ('concrt140.dll', '.'), ('vccorlib140.dll', '.')], + binaries=[('dshowcapture/dshowcapture_x86.dll', '.'), ('dshowcapture/dshowcapture_x64.dll', '.'), ('dshowcapture/libminibmcapture32.dll', '.'), ('dshowcapture/libminibmcapture64.dll', '.'), ('escapi/escapi_x86.dll', '.'), ('escapi/escapi_x64.dll', '.'), ('run.bat', '.'), ('msvcp140.dll', '.'), ('vcomp140.dll', '.'), ('concrt140.dll', '.'), ('vccorlib140.dll', '.')], datas=[], hiddenimports=[], hookspath=[], diff --git a/input_reader.py b/input_reader.py index 709308d..30e7bb6 100644 --- a/input_reader.py +++ b/input_reader.py @@ -62,18 +62,26 @@ class DShowCaptureReader(VideoReader): self.dcap = dcap; self.device = dshowcapture.DShowCapture() self.device.get_devices() - self.name = self.device.get_device(capture) + info = self.device.get_info() + self.name = info[capture]['name'] + if info[capture]['type'] == "Blackmagic": + self.name = "Blackmagic: " + self.name + if dcap is None or dcap < 0: + dcap = 0 + ret = False if dcap is None: - print("Opening classic") - self.device.capture_device(capture, self.width, self.height, self.fps) + ret = self.device.capture_device(capture, self.width, self.height, self.fps) else: if dcap < 0: - print("Opening default") - self.device.capture_device_default(capture) + ret = self.device.capture_device_default(capture) else: - print("Opening exact") - self.device.capture_device_by_dcap(capture, dcap, self.width, self.height, self.fps) - print(f"Camera: \"{self.name}\" Capability ID: {dcap} Resolution: {self.device.get_width()}x{self.device.get_height()} Frame rate: {self.device.get_fps()} Colorspace: {self.device.get_colorspace()} Internal: {self.device.get_colorspace_internal()} Flipped: {self.device.get_flipped()}") + ret = self.device.capture_device_by_dcap(capture, dcap, self.width, self.height, self.fps) + if not ret: + raise Exception("Failed to start capture.") + self.width = self.device.width + self.height = self.device.height + self.fps = self.device.fps + print(f"Camera: \"{self.name}\" Capability ID: {dcap} Resolution: {self.device.width}x{self.device.height} Frame rate: {self.device.fps} Colorspace: {self.device.colorspace} Internal: {self.device.colorspace_internal} Flipped: {self.device.flipped}") self.timeout = 1000 def is_open(self): return self.device.capturing() diff --git a/make_exe.bat b/make_exe.bat index 8e436ae..a5ad490 100644 --- a/make_exe.bat +++ b/make_exe.bat @@ -1,17 +1,8 @@ -REM pyinstaller facetracker.spec --onefile ^ -REM --add-binary dshowcapture/dshowcapture_x86.dll;. ^ -REM --add-binary dshowcapture/dshowcapture_x64.dll;. ^ -REM --add-binary escapi/escapi_x86.dll;. ^ -REM --add-binary escapi/escapi_x64.dll;. ^ -REM --add-binary msvcp140.dll;. ^ -REM --add-binary vcomp140.dll;. ^ -REM --add-binary concrt140.dll;. ^ -REM --add-binary vccorlib140.dll;. ^ -REM --add-binary run.bat;. - pyinstaller facetracker.spec --onedir ^ --add-binary dshowcapture/dshowcapture_x86.dll;. ^ --add-binary dshowcapture/dshowcapture_x64.dll;. ^ + --add-binary dshowcapture/libminibmcapture32.dll;. ^ + --add-binary dshowcapture/libminibmcapture64.dll;. ^ --add-binary escapi/escapi_x86.dll;. ^ --add-binary escapi/escapi_x64.dll;. ^ --add-binary msvcp140.dll;. ^