Как правильно использовать MediaBuffer libstagefright?

Я:

  1. Создайте android::MediaBufferGroup;
  2. Заполните его несколькими buf_group.add_buffer(new android::MediaBuffer(bufsize)); при инициализации;
  3. Делать buf_group->acquire_buffer(&buffer) когда мне нужен буфер для отправки куда-то;
  4. использование buffer->data() чтобы получить фактическую ячейку памяти для хранения данных, используйте set_range и установить метаданные, затем передать буфер в другой компонент;
  5. Этот другой компонент releaseбуфер, возвращая их обратно в MediaBufferGroup.

Это работает, но не надежно. Иногда приобретенный буфер data() возвращает NULL, иногда происходит сбой программы release()

Как правильно использовать MediaBufferGroup? Должен ли я использовать некоторую синхронизацию?

0

Решение

Почти все ваши шаги верны. Единственный момент, который не ясен — шаг 4. Как правило, MediaBuffer вытягивается потребителем от производителя через read вызов. Итак, я полагаю, в вашей настройке,

  1. Все вышеперечисленные шаги выполняются производителем

  2. Потребитель призывает mSource->read(&newBuffer); где newBuffer определяется как MediaBuffer *newBuffer;

  3. В конце производителя, MediaBuffer *mBuffer;, Вызов чтения будет обработан, а вывод будет заполнен как *out = mBuffer;,

  4. Для безопасности, пожалуйста, инициализируйте mBuffer в NULL после этого шага.

  5. После использования буфера потребитель должен освободить буфер newBuffer->release;

  6. Опять же, для безопасности, пожалуйста, инициализируйте newBuffer в NULL после этого шага.

С этими изменениями, я полагаю, ваш код должен нормально работать на основе вашего описания.

0

Другие решения

MediaBuffer — это базовый контейнер в среде stagefright.

Об использовании MediaBuffer / MediaBufferGroup / MediaSource, Есть несколько простых примеров кода под ASOP рамки / ау / CMDS / stagefright.

Обратите внимание на реализацию класса SineSource и его использование.

0

По вопросам рекламы [email protected]