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