2012-09-03 27 views
5

Piszę program w Pythonie, który odczytuje dane YV12 klatka z kamery IP produkowanych przez Hikvision Ltd.Wracając strukturę przy użyciu ctypes w Pythonie

w SDK, pod warunkiem funkcjonalne połączenie, które pozwala mi skonfiguruj wywołanie zwrotne, aby pobrać dane ramki.

funkcja

My oddzwaniania jest tak:

def py_fDecodeCallBack(lPort, pBuffer, lSize, pFrameInfo, lReserved1, lReserved2): 
    print "lPort: %r" % lPort 
    print "lSize: %r " % lSize 
    print pFrameInfo 
    print pBuffer 
    print "pFrame Info: %r " % pFrameInfo.nWidth 

    return 0 

$ Struktura pFramInfo jest zdefiniowany następująco:

class FRAME_INFO(Structure): 
     _fields_ =[ 
        ('nWidth', c_long), 
        ('nHeight', c_long), 
        ('nStamp', c_long), 
        ('nType', c_long), 
        ('nFrameRate', c_long), 
        ('dwFrameNum', wintypes.DWORD) 
        ] 

$

używam następujący kod do instalacji zwrotnego funkcja:

FSETDECCALLBACK = WINFUNCTYPE(c_bool, c_long, POINTER(wintypes.BYTE), c_long, POINTER(FRAME_INFO), c_long, c_long) 
fSetDecCallBack = FSETDECCALLBACK(py_fDecodeCallBack)  

Następnie funkcja zwrotna jest wywoływana przez SDK, a drukuje się, co następuje:

Traceback (most recent call last): 
    File "_ctypes/callbacks.c", line 313, in 'calling callback function' 
lPort: 0 
lSize: 1382400 
<mytypes.LP_FRAME_INFO object at 0x03109CB0> 
<wintypes2.LP_c_byte object at 0x03109D00> 
    File "C:\Users\Rex\workspace\iSentry\hcnetsdkhelper.py", line 76, in py_fDecodeCallBack 
    print "pFrame Info: %r " % pFrameInfo.nWidth 
AttributeError: 'LP_FRAME_INFO' object has no attribute 'nWidth' 

typów prostych, takich jak c_long (lPort i lSize) są prawidłowo odczytać, ale struktura pFrameInfo nie posiada pola, które Zdefiniowałem. Nie mogę odczytać pFrameInfo.nWidth, ponieważ mówi, że nie ma takiego atrybutu ...

Moje pytanie brzmi: Jak mogę odczytać atrybuty w strukturze zwróconej z dll poprzez ctypes. Nie widzę żadnych przykładów na to, że Google robi to i znalazłem temat w python.org http://bugs.python.org/issue5710 mówiąc, że to nie może być zrobione, ale wiadomość jest napisana w 2009 roku.

Wierzę, że jak pFrameInfo jest już czytane z dll, czy istnieje sposób odzyskania danych c_long przechowywanych w strukturze pFrameInfo przez wycięcie i odczytanie bajtów w obszarze pamięci pFrameInfo? Ponieważ wszystkie atrybuty pFrameInfo to c_long, to czytanie bajtu struktury przez bajt może zrekonstruować wartość zmiennych c_long. Po prostu zgaduję. Proszę o pomoc, jest to naprawdę duży problem dla mnie ...

Odpowiedz

4

Chyba trzeba dereference wskaźnikiem do FRAME_INFO:

frameInfo = pFrameInfo.contents 
... 
print "pFrame Info: %r " % frameInfo.nWidth 
+0

Wow! Dziękuję bardzo!!! Zadziałało!! Teraz mogę uzyskać dostęp do całej zawartości w strukturze. –

Powiązane problemy