import win32event
import mmap
import array
import numpy
shared_memory_name = "Global\\OBSFRAME"
texture1_mutex_name = "Global\\OBSTEXTURE1_MUTEX"
texture2_mutex_name = "Global\\OBSTEXTURE2_MUTEX"
texture_ready_name = "Global\\OBSTEXTURE_READY"
META_INFO_SIZE=(1024)
TEXTURE_SIZE=(45 * 1024 * 1024)
TEXTURE_1_OFFSET=META_INFO_SIZE
TEXTURE_2_OFFSET=(TEXTURE_SIZE + TEXTURE_1_OFFSET)
SHARED_MEMORY_SIZE = TEXTURE_2_OFFSET + TEXTURE_SIZE
def getdata(memory, offset, size, height, width):
return numpy.frombuffer(memory[offset:offset+size], numpy.uint8).reshape(height, width, 4)
def getmeta(memory):
return array.array('L', memory[0:16])
INFINITY = 4294967295
sharedmemory = mmap.mmap(0, SHARED_MEMORY_SIZE, shared_memory_name, mmap.ACCESS_READ)
texture1_mutex = win32event.OpenMutex(win32event.SYNCHRONIZE, False, texture1_mutex_name)
texture2_mutex = win32event.OpenMutex(win32event.SYNCHRONIZE, False, texture2_mutex_name)
texture_ready_event = win32event.OpenEvent(win32event.SYNCHRONIZE, False, texture_ready_name);
print('test')
while True:
if win32event.WAIT_OBJECT_0 == win32event.WaitForSingleObject(texture_ready_event, -1):
meta = getmeta(sharedmemory)
data = numpy.array([])
data_size = meta[0]*meta[1]*4
height = meta[1]
width = meta[0]
print('start')
if meta[3] == 1:
if win32event.WaitForSingleObject(texture1_mutex, 0) == win32event.WAIT_OBJECT_0:
print('texture 1')
data = getdata(sharedmemory, TEXTURE_1_OFFSET, data_size, height, width)
win32event.ReleaseMutex(texture1_mutex)
elif win32event.WaitForSingleObject(texture2_mutex, 0) == win32event.WAIT_OBJECT_0:
print('texture 2')
data = getdata(sharedmemory, TEXTURE_2_OFFSET, data_size, height, width)
win32event.ReleaseMutex(texture2_mutex)
else:
continue
elif meta[3] == 2:
if win32event.WaitForSingleObject(texture2_mutex, 0) == win32event.WAIT_OBJECT_0:
print('texture 1')
data = getdata(sharedmemory, TEXTURE_2_OFFSET, data_size, height, width)
win32event.ReleaseMutex(texture2_mutex)
elif win32event.WaitForSingleObject(texture1_mutex, 0) == win32event.WAIT_OBJECT_0:
print('texture 2')
data = getdata(sharedmemory, TEXTURE_1_OFFSET, data_size, height, width)
win32event.ReleaseMutex(texture1_mutex)
else:
continue
else:
continue
print(data[0][0])