MediaCodec Async Callback не происходит, если другой поток имеет ожидание блокировки - PullRequest
0 голосов
/ 22 марта 2019

Я использую обратные вызовы 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? Или я что-то упустил?

...