Я:
android::MediaBufferGroup
;buf_group.add_buffer(new android::MediaBuffer(bufsize));
при инициализации;buf_group->acquire_buffer(&buffer)
когда мне нужен буфер для отправки куда-то;buffer->data()
чтобы получить фактическую ячейку памяти для хранения данных, используйте set_range
и установить метаданные, затем передать буфер в другой компонент;release
буфер, возвращая их обратно в MediaBufferGroup.Это работает, но не надежно. Иногда приобретенный буфер data()
возвращает NULL, иногда происходит сбой программы release()
…
Как правильно использовать MediaBufferGroup? Должен ли я использовать некоторую синхронизацию?
Почти все ваши шаги верны. Единственный момент, который не ясен — шаг 4. Как правило, MediaBuffer
вытягивается потребителем от производителя через read
вызов. Итак, я полагаю, в вашей настройке,
Все вышеперечисленные шаги выполняются производителем
Потребитель призывает mSource->read(&newBuffer);
где newBuffer
определяется как MediaBuffer *newBuffer
;
В конце производителя, MediaBuffer *mBuffer;
, Вызов чтения будет обработан, а вывод будет заполнен как *out = mBuffer;
,
Для безопасности, пожалуйста, инициализируйте mBuffer
в NULL
после этого шага.
После использования буфера потребитель должен освободить буфер newBuffer->release;
Опять же, для безопасности, пожалуйста, инициализируйте newBuffer
в NULL
после этого шага.
С этими изменениями, я полагаю, ваш код должен нормально работать на основе вашего описания.
MediaBuffer — это базовый контейнер в среде stagefright.
Об использовании MediaBuffer / MediaBufferGroup / MediaSource, Есть несколько простых примеров кода под ASOP рамки / ау / CMDS / stagefright.
Обратите внимание на реализацию класса SineSource и его использование.