Подтвердить что ты не робот

Декодировать видео в малине Pi без использования OpenMAX?

Я ищу пример декодирования видео на Raspberry Pi напрямую, без использования OpenMAX.

Это объясняет различные уровни мультимедийного программного обеспечения:

Raspberry Pi Architecture

Существует дополнительный слой, который здесь не показан, слой MMAL, который (я считаю) Broadcom обертка вокруг OpenMAX. (Если нет, это была бы альтернатива OpenMAX, сидящая поверх драйвера ядра). Raspivid и raspistill, например, написаны с использованием MMAL.

Я хочу пример декодирования видео, где вход является сырым H.264, а выход - либо видео в памяти, либо видео на экране. Я хочу сделать это напрямую с помощью VCHIQ, не используя OpenMAX. (В основном, по соображениям производительности и гибкости)

Этот репозиторий github: https://github.com/raspberrypi/userland/ содержит источник для всего, что показано выше (оранжевые и зеленые поля, источник самого VCHIQ, OpenMAX Реализация IL поверх VCHIQ, а также реализации OpenGL и EGL,...). Поэтому теоретически этого должно быть достаточно, чтобы начать. Проблема в том, что очень неочевидно, как ее использовать, даже если вы хорошо знакомы с OpenMAX и с мультимедийными средами вообще.

Например: vchiq_bulk_transmit(), похоже, является функцией, которую можно использовать для отправки видео в декодер. Но как инициализировать первый аргумент типа VCHIQ_SERVICE_HANDLE_T? Куда идут результаты, в фреймбуфере или в дескрипторе результата, или...?

EDIT. Баунти можно собрать, либо предоставив рабочий пример декодирования видео, используя vchiq, прохождение API, которое показывает последовательность вызовов (даже если это не рабочий пример), или указатель на достаточную документацию для записи. Рабочий пример получит здоровую дополнительную награду:)

4b9b3361

Ответ 1

У меня нет рабочего примера, но у меня есть прохождение API. Сорт..

Ссылка на полный исходный код

Я нашел следующую функцию, которая демонстрирует, как вы можете вызвать 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);

Существует функция создания 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);

Но вам нужен VCHI_INSTANCE_T, который можно здесь инициализировать

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);

Ответ 2

Я думаю, что openmax дает больше производительности в обработке мультимедиа. Вы можете сравнить производительность для этих двух альтернатив, просто выполняющих соответствующие конвейеры для gstreamer. Для этих действий не требуется программирование, и вы можете использовать gst-launch для этих целей. Плагины Openmax для gstreamer начинаются с префикса "omx". Операции кодирования и декодирования отлично выполняются с помощью omx, в то время как основной процессор не загружается. Собственная реализация для кодирования или декодирования h264 является очень сложной проблемой и без использования библиотек, которые вы можете потратить на протяжении многих лет.