Я использую обратные вызовы MediaCodec OnAsyncInputAvailable и OnAsyncOutputAvailable, представленные в API 28.
void OnAsyncInputAvailable(
AMediaCodec *codec,
void *userdata,
int32_t index)
{
CallbackData* callbackData = (CallbackData *) (userdata);
callbackData->addInputBufferId(index);
}
void OnAsyncOutputAvailable(
AMediaCodec *codec,
void *userdata,
int32_t index,
AMediaCodecBufferInfo *bufferInfo)
{
CallbackData* callbackData = (CallbackData *) (userdata);
callbackData->addOutputBuffer(index, bufferInfo);
}
В моем приложении я создал очередь, в которую вводятся индексы доступных буферов при вызове обратного вызова в собственном потоке. Если другой поток, который выскочил из этой очереди, выполняет блокирующее ожидание, то я вижу, что вызов из NDK не приходит. Один поток ожидает выгрузить элемент, поскольку очередь пуста (он выполняет условное ожидание), а на другом конце собственный поток ожидает срабатывания обратного вызова. Таким образом, приложение переходит в состояние зависания. Это известная проблема с нативными API? Или я что-то упустил?