raspistill - ¿Decodificar video en Raspberry Pi sin usar OpenMAX?
raspbian omxplayer tutorial (2)
Estoy buscando un ejemplo de decodificación de video en Raspberry Pi directamente , sin usar OpenMAX.
Esto explica las diferentes capas de software multimedia:
Hay una capa adicional que no se muestra aquí, la capa " MMAL " que es (creo) una envoltura de Broadcom alrededor de OpenMAX. (Si no, sería una alternativa de OpenMAX, que se encuentra en la parte superior del controlador del kernel) raspivid y raspistill, por ejemplo, se escriben usando MMAL.
Quiero un ejemplo de decodificación de video donde la entrada es en bruto H.264, y la salida es video en memoria o video en pantalla. Quiero hacer esto usando VCHIQ directamente , no usando OpenMAX. (Principalmente por razones de rendimiento y flexibilidad)
Este repositorio de github: https://github.com/raspberrypi/userland/ contiene la fuente para todo lo que se muestra arriba (las casillas verde y naranja; fuente para VCHIQ, la implementación de OpenMAX IL sobre VCHIQ, también las implementaciones de OpenGL y EGL,. ..). Así que en teoría debería ser suficiente para empezar. El problema es que no es muy obvio cómo usarlo, incluso si uno está muy familiarizado con OpenMAX y con los marcos multimedia en general.
Por ejemplo: vchiq_bulk_transmit () parece ser la función que se usaría para enviar video al decodificador. Pero, ¿cómo inicializar el primer argumento del tipo VCHIQ_SERVICE_HANDLE_T
? ¿A dónde van los resultados, en el framebuffer, o en un manejador de resultados, o ...?
EDITAR La recompensa puede obtenerse ya sea proporcionando un ejemplo funcional de decodificación de video usando vchiq, un tutorial de API que muestra la secuencia de llamada (aunque no sea un ejemplo funcional) o un puntero a la documentación suficiente para escribir esto. Un ejemplo de trabajo obtendrá una gran recompensa extra :)
Creo que openmax da más rendimiento en el procesamiento multimedia. Puede comparar el rendimiento de estas dos alternativas simples ejecutando las respectivas canalizaciones para gstreamer. Para estas acciones no es necesaria la programación y puede usar gst-launch para este propósito. Los complementos de Openmax para gstreamer comienzan con el prefijo ''omx''. Las operaciones de codificación y decodificación se ejecutan perfectamente con omx mientras que la CPU principal no se carga. La implementación patentada para la codificación o decodificación h264 es un problema muy difícil y sin usar bibliotecas puede gastar durante tantos años.
No tengo un ejemplo práctico, pero tengo un tutorial de API. Tipo de ...
Enlace al código fuente completo
Encontré la siguiente función que demuestra cómo puedes llamar a vchiq_bulk_transmit
int32_t vchi_bulk_queue_transmit(VCHI_SERVICE_HANDLE_T handle,
void *data_src,
uint32_t data_size,
VCHI_FLAGS_T flags,
void *bulk_handle)
{
SHIM_SERVICE_T *service = (SHIM_SERVICE_T *)handle;
..
status = vchiq_bulk_transmit(service->handle, data_src,
data_size, bulk_handle, mode);
..
return vchiq_status_to_vchi(status);
}
EXPORT_SYMBOL(vchi_bulk_queue_transmit);
Hay una función para crear VCHI_SERVICE_HANDLE_T
int32_t vchi_service_create(VCHI_INSTANCE_T instance_handle,
SERVICE_CREATION_T *setup,
VCHI_SERVICE_HANDLE_T *handle)
{
VCHIQ_INSTANCE_T instance = (VCHIQ_INSTANCE_T)instance_handle;
SHIM_SERVICE_T *service = service_alloc(instance, setup);
*handle = (VCHI_SERVICE_HANDLE_T)service;
..
return (service != NULL) ? 0 : -1;
}
EXPORT_SYMBOL(vchi_service_create);
Pero necesitas un VCHI_INSTANCE_T
que se puede inicializar aquí
int32_t vchi_initialise(VCHI_INSTANCE_T *instance_handle)
{
VCHIQ_INSTANCE_T instance;
VCHIQ_STATUS_T status;
status = vchiq_initialise(&instance);
*instance_handle = (VCHI_INSTANCE_T)instance;
return vchiq_status_to_vchi(status);
}
EXPORT_SYMBOL(vchi_initialise);