У меня есть собственный конвейер, который выглядит примерно так в краткой записи gstreamer:
gst-launch-1.0 rtspsrc location=rtsp://<url-for-stream> ! rtph264depay ! h264parse ! imxvpudec ! *any-sink*
- любой сток не имеет значения, может быть fakesink, imxipusink или чем-то еще (я нахожусь наПлатформа imx6 с использованием бесплатных плагинов imx).Я могу вывести на тот приемник, который захочу, и проблема та же.
Этот тип конвейера отлично работает в gst-launch-1.0, потому что ему не нужно очищать себя должным образом, но янужно использовать его в моем приложении C ++, используя прямой GST API.Это означает, что я использую myPipeline = gst_pipeline_new("custom-pipeline")
, затем назначаю каждый плагин по имени, связываю их и запускаю конвейер.Позже у меня есть требование остановить конвейер и вызвать gst_object_unref(myPipeline)
.При этом я наблюдаю, как дескрипторы файлов остаются позади.Позже мне нужно снова начать конвейер, и утечка накапливается.Это должно происходить достаточно часто, чтобы дескрипторы утечки давали мне исключение:
GLib-ERROR **: Creating pipes for GWakeup: Too many open files
Я могу профилировать открытые файлы с помощью lsof
...
lsof +E -aUc myGstApplication
lsof: netlink UNIX socket msg peer info error
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
myGstApplication 5943 root 3u unix 0xabfb6c00 0t0 11200335 type=STREAM
myGstApplication 5943 root 11u unix 0xd9d47180 0t0 11207020 type=STREAM
... еще много, в зависимости от того, как долго это выполняется ...
myGstApplication 5943 root 50u unix 0xabe99080 0t0 11211987 type=STREAM
Кажется, я получаю два новых файловых дескриптора 'type = STREAM' каждый раз, когда я отменяю () и перестраиваю конвейер.
Это прекрасно и замечательно видеть дескрипторы в lsof, но я не знаю, как отследить, откуда эти файлы поступают в коде.Может ли какой-нибудь вывод lsof привести меня к лучшей отладочной информации, например?,Как я могу отследить, откуда на самом деле происходят эти утечки, и остановить их?Должен быть лучший путь ... верно?
Я подозреваю, что rtspsrc
элемент конвейера gstreamer как-то связан с этим, но rtspsrc сам по себе является болотом базовой реализации gstreamer (udpsrcs, demuxers и т. Д. И т. Д.). Я не уверен, что этоошибка в rtspsrc, потому что многие другие люди используют его, не воспроизводя то же самое.Могу ли я сделать что-то в своем коде приложения, которое может вызвать такое поведение неочевидным способом?
Любая помощь очень ценится, спасибо!