Convertir los datos ctypes en cadena de Python lo más rápido posible
Pregunta
Estoy tratando de escribir una aplicación de vídeo en PyQt4 y he utilizado Python ctypes para enganchar en una biblioteca decodificador de vídeo legado de edad. La biblioteca me da los datos ARGB de 32 bits y necesito convertir eso en un QImage. Tengo que trabajar de la siguiente manera:
# 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)
El problema es que ctypes salida a los datos como tipo "ctypes.c_char_Array_829440
" y tengo que convertirlo en una cadena de Python para que pueda construir un QImage. Mi mecanismo de copia se está llevando a imagen casi 300ms por lo que es muy lento. La parte de decodificación y visualización del proceso sólo está tomando aproximadamente 50 ms.
Puede alguien pensar en todos los accesos directos astucia que pueda tomar para acelerar este proceso y evitar la necesidad de copiar el búfer doble que estoy haciendo actualmente?
Solución
La instancia ctypes.c_char_Array_829400
tiene la .raw
propiedad que devuelve una cadena que contiene posiblemente bytes NUL, y el .value
propiedad que devuelve la cadena hasta el primer byte NUL si contiene uno o más.
Sin embargo, también se puede utilizar ctypes el acceso a la cuerda en self.rgb_buffer_ptr
, así:
ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size)
; esto evitaría la necesidad de que la llamada memmove.