Расшифровка Android MediaCodec очень медленная - PullRequest
0 голосов
/ 02 мая 2019

Android MediaCodec декодирование занимает очень много времени, около 115 до 118 мсек на кадр.Это кадр h264.Устройство Android оснащено процессором Qualcomm Snapdragon 845, поэтому я предполагаю, что API-интерфейсы Android MediaCodec предназначены для графического процессора Qualcomm, а не для центрального процессора ARM.Хотите знать, сталкивался ли кто-нибудь с такой проблемой раньше и может ли дать рекомендации о том, как ускорить этот процесс декодирования?

Код - это весь нативный код, а не Java.Без Java у меня нет ни активного окна, ни текстуры поверхности ... поэтому примеры Grafika здесь не помогают.Я использую AndroidP (9.0) API 28. NDK 19.2.5x.

Вот как настроен мой код:

Шаг 1: у меня есть два экземпляра кодека, настроенные в двух отдельных потоках, следующим образом:

codecData.codec = AMediaCodec_createDecoderByType("video/avc");
AMediaFormat_setString(codecData.format_eye, AMEDIAFORMAT_KEY_MIME, "video/avc");
AMediaFormat_setInt32(codecData.format_eye, AMEDIAFORMAT_KEY_HEIGHT, 1920);
AMediaFormat_setInt32(codecData.format_eye, AMEDIAFORMAT_KEY_WIDTH, 1080);
AMediaFormat_setFloat(codecData.format_eye, AMEDIAFORMAT_KEY_FRAME_RATE, 60.0f);

Шаг 2: Я ставлю кодированный буфер в очередь, используя эти вызовы, которые занимают от 14 до 17 мсек на входе 60 FPS с двумя отдельными потоками, заполняющими отдельный кодек Qs:

bufIdx = AMediaCodec_dequeueInputBuffer(codecData.codec, -1); //-1 makes it blocking call
auto buf = AMediaCodec_getInputBuffer(codecData.codec, bufIdx, &bufSize);
uint64_t presentTime = presentTimer.getTimeUs();
memcpy(buf, data, size);
AMediaCodec_queueInputBuffer(codecData.codec, bufIdx, 0, size, presentTime, 0);

Шаг 3: Iснять декодированный буфер с очереди следующим образом: от 115 до 118 мсек на кадр на кодек на выходе 60 FPS.Удаление очереди для обоих кодеков выполняется одним потребительским потоком, который проходит через оба экземпляра кодека по одному:

AMediaCodecBufferInfo info_eye;
bufIdx = AMediaCodec_dequeueOutputBuffer(codecData.codec, &info_eye, 1);
auto decodedBuf = AMediaCodec_getOutputBuffer(codecData.codec, bufIdx, &bufSize);

Шаг 4: декодированный буфер затем подается в шейдер NV12toRGBA в потоке рендеринга, которыйзаполняет текстуру, которая занимает около 2 мсек.Затем эта текстура отображается.

Я ожидаю 60 FPS, но получаю около 50 FPS из-за задержек в Шаге 3, т.е. задержка от 115 до 118 мсек убивает меня :-(

Есть идеи?Цени любую помощь.

...