Pregunta

Estoy escribiendo un reproductor de video en Linux y me gustaría separarlo en dos procesos:

A. proceso decodificador B. GUI

De esta manera, podría usar diferentes lenguajes de programación y cuando surge un problema, es más fácil saber dónde está el problema.

El problema es, ¿podría procesar A renderizar imágenes descodificadas directamente sobre la superficie de B? No quiero usar algún IPC para enviar B estos datos decodificados porque eso podría ser muy ineficiente.

¿Fue útil?

Solución

Puede usar la especificación XEmbed , que le permite para incrustar una ventana X11 dentro de otra, y pueden ser de procesos diferentes. Esto es lo que suelen hacer otras interfaces de reproductor de medios.

Tanto GTK como Qt son compatibles con XEmbed.

Otros consejos

IPC (especialmente una canalización de Unix) es mucho más eficiente de lo que cree y probablemente sea el mecanismo correcto para usar.

Sin embargo, ya que preguntó cómo hacerlo sin IPC (y lo analizo para que signifique sin copias y cambios de contexto), simplemente puede crear un segmento de memoria compartida entre los dos procesos:

fd = shm_open("/my_shmem", O_RDWR| O_CREAT, S_IWUSR);
if(fd == -1) abort(); 
ftruncate(fd, SHMEM_SIZE); 
p = mmap(NULL, SHMEM_SIZE, PROT_WRITE |  PROT_READ, MAP_SHARED, fd, 0); 
if(p == MAP_FAILED) abort()

Ahora p tiene la dirección de un segmento de memoria compartida compartida por los dos (o más) procesos.

¡Advertencia! el valor numérico de p (dirección virtual de la memoria) puede ser diferente entre los procesos, por lo que si desea colocar una lista vinculada en la memoria compartida, por ejemplo, tendrá que usar compensaciones.

Saludos, gby

Mira cómo se implementan mplayer y smplayer. mplayer decodifica y muestra el video, y smplayer es la GUI (opcional).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top