Инженеры и разработчики встраиваемых мультимедийных комплексов на базе вычислительного модуля NVIDIA Jetson AGX Xavier под управлением дистрибутива Jetson Linux 35.6.5 (входящего в состав пакета JetPack 5.1.7) столкнулись с систематическими аварийными сбоями процессов декодирования. Ошибка проявляется как сигнал SIGSEGV в библиотеке libnvmmlite_video.so при непрерывной обработке чересстрочных видеопотоков формата 1080i H.264 через аппаратно-ускоренный плагин nvv4l2decoder среды GStreamer.
При развертывании многопоточных видеосерверов видеонаблюдения и ретрансляции телевизионного вещания формата MPEG-TS с чересстрочной разверткой 1080i на платформе Jetson AGX Xavier инженеры фиксируют регулярное падение хост-процесса конвейера GStreamer. Сбой происходит с кодом завершения SIGSEGV в собственном рабочем потоке декодера. Трассировка вызовов указывает на обращение по нулевому или поврежденному указателю внутри закрытых библиотек libnvmmlite_video.so и libnvvideo.so, вызываемых через синтаксический анализатор libnvparser.so при штатном входном потоке без потерь пакетов.
Причины сбоя и механизм деградации буфера кадров
Анализ логики декодирования показал, что критическая уязвимость локализована в открытой части плагина gst-v4l2, а именно в функции gst_v4l2_video_dec_clean_older_frames исходного файла gstv4l2videodec.c. При обработке чересстрочных потоков H.264 отдельные полукадры или кадры-призраки могут формироваться без корректной временной метки представления PTS. В стандартной кодовой базе условие проверки отсекает кадры только по строгому сравнению tmp->pts < timestamp, игнорируя факт невалидности метки.
В результате кадры с некорректным состоянием таймстемпа остаются в пуле буферов декодера и не вычищаются вовремя. Когда внутренний менеджер памяти пытается передать такой буфер в аппаратный декодер через закрытые низкоуровневые интерфейсы libnvmmlite, происходит разыменование некорректного адреса памяти, приводящее к фатальному сбою всего приложения через несколько часов непрерывной эксплуатации.
Инструкция по наложению патча и сборке плагина
Официальные представители службы технической поддержки NVIDIA подтвердили наличие данной проблемы в ветке JetPack 5 и предоставили корректирующий патч для открытого исходного кода gst-v4l2, а также рекомендации по пересборке разделяемой библиотеки libgstnvvideo4linux2.so на целевой системе.
Для устранения проблемы необходимо скачать архив исходных кодов Driver Package (BSP) Sources со страницы выпуска Jetson Linux R35.6.5 и распаковать пакет gst-nvvideo4linux2_src.tbz2. После распаковки откройте файл gst-v4l2/gstv4l2videodec.c и найдите функцию очистки устаревших кадров gst_v4l2_video_dec_clean_older_frames. В теле цикла замените условие сравнения временных меток, добавив явную проверку макросом GST_CLOCK_TIME_IS_VALID. Новая конструкция должна отбрасывать кадр, если метка времени задана и при этом PTS является недействительным либо строго меньше текущего порога timestamp.
После внесения изменений выполните компиляцию библиотеки командой make в каталоге с исходными кодами плагина. Скомпилированный файл libgstnvvideo4linux2.so необходимо скопировать с заменой в системный каталог /usr/lib/aarch64-linux-gnu/gstreamer-1.0/, предварительно создав резервную копию оригинального файла. Завершающим шагом очистите кэш реестра плагинов GStreamer, удалив файл registry.aarch64.bin в домашнем каталоге пользователя, после чего перезапустите фоновые службы декодирования.
