Rodar dados Ctypes em cadeia pitão tão rapidamente quanto possível
Pergunta
Eu estou tentando escrever um aplicativo de vídeo em PyQt4 e eu usei ctypes Python para ligar para uma biblioteca de decodificador de vídeo legado de idade. A biblioteca me dá dados ARGB de 32 bits e eu preciso transformar isso em um QImage. Eu tenho que trabalhar o seguinte:
# 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)
O problema é que ctypes saídas os dados como tipo "ctypes.c_char_Array_829440
" e eu preciso transformá-lo em uma corda python para que eu possa construir um QImage. Meu mecanismo de cópia está actualmente a quase 300ms por imagem, por isso é dolorosamente lento. O decodificar e exibir parte do processo só está levando cerca de 50ms.
Alguém pode pensar em quaisquer atalhos astutos I pode tomar para acelerar este processo e evitar a necessidade de copiar o buffer duas vezes como eu estou fazendo atualmente?
Solução
O exemplo ctypes.c_char_Array_829400
tem a propriedade .raw
que retorna uma cadeia de caracteres contendo possivelmente NUL bytes, e o .value
propriedade que devolve a cadeia de cima para o primeiro byte NUL se contiver uma ou mais.
No entanto, você também pode usar ctypes o acesso a corda em self.rgb_buffer_ptr
, como este:
ctypes.string_at(self.rgb_buffer_ptr, self.buffer_size)
; isso evitaria a necessidade da chamada memmove.