2009-04-03 3 views
3

J'essaye d'écrire une application vidéo dans PyQt4 et j'ai utilisé des ctypes Python pour me connecter à une ancienne bibliothèque de décodeurs vidéo. La bibliothèque me donne des données ARGB 32 bits et je dois transformer cela en QImage. Je l'ai travaillé comme suit:Transformer les données ctypes en chaîne python le plus rapidement possible


# Copy the rgb image data from the pointer into the buffer 
memmove(self.rgb_buffer, self.rgb_buffer_ptr, self.buffer_size) 

# Copy the buffer to a python string 
imgdata = "" 
for a in self.rgb_buffer: 
    imgdata = imgdata + a 

# Create a QImage from the string data 
img = QImage(imgdata, 720, 288, QImage.Format_ARGB32) 

Le problème est que ctypes délivre les données en tant que type « ctypes.c_char_Array_829440 » et je dois en faire une chaîne de python afin que je puisse construire un QImage. Mon mécanisme de copie prend actuellement près de 300ms par image, donc c'est terriblement lent. La partie décodage et affichage du processus ne prend que 50ms environ.

Quelqu'un peut-il penser à des raccourcis rusés que je peux prendre pour accélérer ce processus et éviter le besoin de copier le tampon deux fois comme je le fais actuellement?

Répondre

6

L'exemple ctypes.c_char_Array_829400 a la propriété .raw qui retourne une chaîne contenant éventuellement des octets NUL, et la propriété .value qui renvoie la chaîne jusqu'au premier octet NUL si elle contient une ou plusieurs.

Toutefois, vous pouvez également utiliser ctypes l'accès à la chaîne à self.rgb_buffer_ptr, comme ceci: ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size); cela éviterait la nécessité de l'appel memmove.

+0

Merci beaucoup, la fonction string_at a fait l'affaire. J'ai vraiment besoin de mieux lire les docs. Je les ai vérifiés plusieurs fois et j'ai raté celui-là! – chrism1

Questions connexes