Conceptos del framework

Antes de usar el framework de MediaPipe, familiarízate con los siguientes conceptos.

Conceptos básicos

Paquete

Es la unidad básica de flujo de datos. Un paquete consta de una marca de tiempo numérica y un puntero compartido para una carga útil inmutable. La carga útil puede ser de cualquier tipo de C++, y el tipo de carga útil también se conoce como el tipo de paquete. Los paquetes son clases de valor y no se pueden copiar de forma económica. Cada copia comparte la propiedad de la carga útil, con semántica de recuento de referencias. Cada copia tiene su propia marca de tiempo. Consulta también Paquete.

Gráfico

El procesamiento de MediaPipe se lleva a cabo dentro de un gráfico, que define las rutas de flujo de paquetes entre los nodos. Un grafo puede tener cualquier cantidad de entradas y salidas, y el flujo de datos se puede ramificar y combinar. Por lo general, los datos fluyen hacia delante, pero es posible que se repitan bucles hacia atrás. Consulta Gráficos para obtener más detalles.

Nodos

Los nodos producen o consumen paquetes, y son donde se realiza la mayor parte del trabajo del grafo. También se las conoce como "calculadoras", por razones históricas. La interfaz de cada nodo define una cantidad de ports de entrada y salida, identificados por una etiqueta o un índice. Consulta Calculadoras para obtener más detalles.

Transmisiones

Una transmisión es una conexión entre dos nodos que lleva una secuencia de paquetes, cuyas marcas de tiempo deben aumentar de forma monótona.

Paquetes laterales

Una conexión de paquete lateral entre nodos lleva un solo paquete (con una marca de tiempo no especificada). Se puede usar para proporcionar algunos datos que permanecerán constantes, mientras que una transmisión representa un flujo de datos que cambia con el tiempo.

Puertos de paquetes

Un puerto tiene un tipo asociado; los paquetes que pasan por él deben ser de ese tipo. Un puerto de transmisión de salida se puede conectar a cualquier cantidad de puertos de transmisión de entrada del mismo tipo; cada consumidor recibe una copia separada de los paquetes de salida y tiene su propia cola, por lo que puede consumirlos a su propio ritmo. Del mismo modo, un puerto de salida de paquetes laterales puede conectarse a tantos puertos de entrada de paquetes laterales como desees.

Se puede requerir un puerto, lo que significa que se debe establecer una conexión para que el gráfico sea opcional o válido (es decir, puede permanecer desconectado).

INPUT y OUTPUT

El flujo de datos puede originarse desde nodos de origen, que no tienen transmisiones de entrada y producen paquetes espontáneamente (p.ej., mediante la lectura de un archivo), o desde flujos de entrada de gráfico, que permiten que una aplicación ingrese paquetes en un gráfico.

De manera similar, existen nodos receptores que reciben datos y los escriben en varios destinos (p.ej., un archivo, un búfer de memoria, etc.), y una aplicación también puede recibir resultados del gráfico mediante devoluciones de llamada.

Comportamiento del tiempo de ejecución

Duración del gráfico

Una vez que se inicializa un gráfico, se puede iniciar para comenzar a procesar datos y procesar una transmisión de paquetes hasta que se cierre cada transmisión o se cancele el gráfico. Luego, el gráfico se puede destruir o iniciar nuevamente.

Duración del nodo

Existen tres métodos principales de ciclo de vida que el framework llamará en un nodo:

  • Open: Se llama una vez, antes que los otros métodos. Cuando se lo llame, todos los paquetes de entrada que requiere el nodo estarán disponibles.
  • Proceso: Se lo llama varias veces, cuando hay un conjunto nuevo de entradas disponible, de acuerdo con la política de entrada del nodo.
  • Cerrar: se lo llama una vez al final.

Además, cada calculadora puede definir el constructor y el destructor, que son útiles para crear y desasignar recursos independientes de los datos procesados.

Políticas de entrada

La política de entrada predeterminada es la intercalación determinista de paquetes por marca de tiempo. Un nodo recibe todas las entradas para la misma marca de tiempo al mismo tiempo, en una invocación de su método de proceso. Los conjuntos de entrada sucesivos se reciben en el orden de la marca de tiempo. Esto puede requerir que se retrase el procesamiento de algunos paquetes hasta que se reciba un paquete con la misma marca de tiempo en todas las transmisiones de entrada o hasta que se garantice que un paquete con esa marca de tiempo no llegará a las transmisiones que no lo recibieron.

También hay otras políticas disponibles, que se implementan con un tipo de componente separado conocido como InputStreamHandler.

Consulta Sincronización para obtener más detalles.

Transmisiones en tiempo real

Los gráficos de la calculadora de MediaPipe suelen usarse para procesar transmisiones de fotogramas de audio o video en aplicaciones interactivas. Por lo general, cada calculadora se ejecuta en cuanto están disponibles todos sus paquetes de entrada para una marca de tiempo determinada. Las calculadoras que se usan en gráficos en tiempo real deben definir límites de marca de tiempo de salida según estos límites para permitir que las calculadoras descendentes se programen con rapidez. Consulta Transmisiones en tiempo real para obtener más información.