timeoutUs na API MediaCodec Android
-
23-12-2019 - |
Pergunta
Estou usando a API MediaCodec em um dos meus aplicativos.Usei o código do bigflake e o aplicativo está funcionando muito bem.Mas ainda não consegui entender o parâmetro timeoutUs
em ambas as funções dequeueInputBuffer()
e a função dequeueOutputBuffer()
mesmo depois de ler sobre isso na referência da API.Seria ótimo se alguém pudesse explicar bem o uso e o efeito desse parâmetro.E deveria ser o mesmo em ambas as chamadas de função acima?
Solução
Bem, a ideia principal é que internamente, abaixo da camada MediaCodec, o trabalho dos componentes seja assíncrono.Então, quando você ligar dequeueInputBuffer()
ou dequeueOutputBuffer()
nenhum trabalho real é feito no thread de chamada, apenas verificando o estado do componente interno durante o tempo limite selecionado até que a resposta esteja pronta ou o tempo limite aconteça.Pela minha experiência, até a alocação de buffer é assíncrona; portanto, se nenhum buffer interno estiver pronto para retirada da fila ...um pequeno tempo limite pode resultar em INFO_TRY_AGAIN_LATER.Mas principalmente é para decodificação/codificação.Você envia o quadro de entrada para processamento por chamada sem bloqueio, o processamento acontece em outro thread e você verifica a prontidão do quadro de saída também com chamada sem bloqueio.Portanto, todo pipline não dorme para cada operação pesada (decodificação\codificação\etc) e pode realizar outras operações