import win32event
import mmap
import array
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):
return array.array('b', memory[offset:offset+size])
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);
while True:
if win32event.WAIT_OBJECT_0 == win32event.WaitForSingleObject(texture_ready_event, -1):
meta = getmeta(sharedmemory)
data = array.array('L')
data_size = meta[0]*meta[1]*4
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)
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)
win32event.ReleaseMutex(texture2_mutex)
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)
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)
win32event.ReleaseMutex(texture1_mutex)
print('end')
print(meta)