Я борюсь с этой проблемой более недели, и, скорее всего, это ошибка в кодексе Qualcomm GPU/аппаратного видео. Поскольку мы вынуждены выпускать приложение, и их форумы разработчиков не предоставили никакой обратной связи, я также размещаю его здесь, надеясь, что кто-то сможет предоставить некоторые подсказки или, что еще лучше, обходное решение, так что ошибка в кодере не срабатывает.Ошибка кодера на графическом процессоре Adreno при кодировании с поверхности
Приложение кодируется с поверхности. Когда определенные изображения визуализируются на поверхности, кодер выходит из строя (100%) в одном и том же месте (когда кадр, который в настоящее время кодируется, является ключевым фреймом). Выход Logcat из кодера в момент аварии является (с последними линиями неоднократных на очень высокой скорости):
11-26 11:41:33.312: E/OMX-VENC-720p(25949): ERROR: async_msg_process() - Error statuscode = 1
11-26 11:41:33.312: E/ACodec(29317): [OMX.qcom.video.encoder.avc] ERROR(0x80001009)
11-26 11:41:33.312: E/MediaCodec(29317): Codec reported an error. (omx error 0x80001009, internalError -2147483648)
11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: venc_use_buf:set input buffer failed
11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: in dev_use_buf
11-26 11:41:33.362: E/OMX-VENC-720p(25949): ERROR: empty_buffer_done() failed!
11-26 11:41:33.372: E/OMX-VENC-720p(25949): m_fbd_count at o/p flush = 306
11-26 11:41:33.372: E/OMX-VENC-720p(25949): m_etb_count at i/p flush = 313
11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: ioctl VEN_IOCTL_CMD_FILL_OUTPUT_BUFFER failed
11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: dev_fill_buf() Failed
11-26 11:41:33.372: E/OMX-VENC-720p(25949): ERROR: FTBProxy() failed!
Я могу повторить его и на Grafika, просто заменив в приложении Record GL рисование двух геометрических форм с нанесением одного из проблемных изображений, полноэкранного режима, в альбомном режиме и изменение битрейта на более высокое значение (7 Мбит/с). Аварийный сигнал кодера происходит быстрее для увеличения битрейта.
Адрес: image Адрес: RecordFBOActivity.java с необходимыми изменениями.
С проверкой Grafika и сбором кодера на Samsung S4, международной версии и на оригинальном Nexus 4. С нашим программным обеспечением, которое немного сложнее, чем простое изображение, оно все равно падает на обоих. Не тестировалось на других устройствах Adreno. На Samsung S3 с графическим процессором Mali 400 он отлично работает.
При скорости 4 Мбит/с кодер в нашем приложении по-прежнему падает на обоих S4 и N4, но позже. Grafika падает на N4 в том же месте, но не на S4.
EDIT: Согласно комментариям ниже, он может быть воспроизведен также при кодировании одного и того же изображения из буфера. Различные тесты, судя по всему, сужают условия для их воспроизведения на: h264 hw encoder на устройствах Qualcomm, кодируя неподвижное изображение для многих кадров (это определяет очень низкие битрейты в кодере из-за похожих кадров), при появлении ошибки при кодировании ключевого кадра ошибка появляется только при кодировании определенных изображений, которые, как представляется, имеют более подробную информацию, т. е. требуется много бит для внутреннего кодирования).
Код ошибки 'omx'' 0x80001009' - это 'OMX_ErrorHardware', что означает, что компонент возвращает ошибку, связанную с базовым оборудованием. На поверхностной записи вы можете быстро проверить формат цвета фрейма, который предоставляется в базовом HW? Можете ли вы попробовать преобразовать из RGB в пространство YUV, скажем, 'YUV420 Planar' или' YUV420 Interleaved', а затем вызвать кодирование для кодирования? – Ganesh
Пожалуйста, попробуйте INDE Media для мобильных устройств, образец GLCapture: https://github.com/INDExOS/media-for-mobile. Это крушение? Это было определенно проверено для работы на S4. Также я помню, что на некоторых устройствах возникали проблемы с высокими битрейтами из-за слишком малых (более оптимальных) распределений буферов памяти для кодированных кадров, поэтому нам пришлось ограничить максимальный бит-бит – Marlon
@Ganesh: mEncoder.getCodecInfo(). GetCapabilitiesForType ("video/avc ") возвращает 0x7FA30C06 (не найден в определениях из статического класса CodecCapabilities, найден только COLOR_QCOM_FormatYUV420SemiPlanar, который на самом деле 0x7FA30C00), 0x7F000789 (COLOR_FormatSurface), 21 (COLOR_FormatYUV420SemiPlanar), -1320330260 (не смог идентифицировать его). Я использую COLOR_FormatSurface, когда настроен формат кодировщика, который «указывает, что данные будут ссылкой на метаданные GraphicBuffer». По RGB-> YUV, а затем кодировать, вы хотите использовать glReadPixels, выполнить преобразование и затем закодировать из буфера? Или? – user1592546