tracer: Add memory tracer

Requires updating gstreamer-rs

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/2092>
This commit is contained in:
Thibault Saunier 2024-11-06 19:59:05 -03:00 committed by GStreamer Marge Bot
parent 93ee2ee70d
commit bd6be75107
9 changed files with 482 additions and 49 deletions

98
Cargo.lock generated
View file

@ -1860,7 +1860,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d"
dependencies = [
"libc",
"windows-sys 0.59.0",
"windows-sys 0.52.0",
]
[[package]]
@ -2318,7 +2318,7 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f"
[[package]]
name = "gio"
version = "0.21.0"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#a7079b6862891393e33c84dfb9111d848a1a39cc"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c87867050de49f540b08bd26ae559983fc701a5b"
dependencies = [
"futures-channel",
"futures-core",
@ -2334,19 +2334,19 @@ dependencies = [
[[package]]
name = "gio-sys"
version = "0.21.0"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#a7079b6862891393e33c84dfb9111d848a1a39cc"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c87867050de49f540b08bd26ae559983fc701a5b"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
"system-deps 7.0.3",
"windows-sys 0.59.0",
"windows-sys 0.52.0",
]
[[package]]
name = "glib"
version = "0.21.0"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#a7079b6862891393e33c84dfb9111d848a1a39cc"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c87867050de49f540b08bd26ae559983fc701a5b"
dependencies = [
"bitflags 2.8.0",
"futures-channel",
@ -2366,7 +2366,7 @@ dependencies = [
[[package]]
name = "glib-macros"
version = "0.21.0"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#a7079b6862891393e33c84dfb9111d848a1a39cc"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c87867050de49f540b08bd26ae559983fc701a5b"
dependencies = [
"heck 0.5.0",
"proc-macro-crate",
@ -2378,7 +2378,7 @@ dependencies = [
[[package]]
name = "glib-sys"
version = "0.21.0"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#a7079b6862891393e33c84dfb9111d848a1a39cc"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c87867050de49f540b08bd26ae559983fc701a5b"
dependencies = [
"libc",
"system-deps 7.0.3",
@ -2393,7 +2393,7 @@ checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
[[package]]
name = "gobject-sys"
version = "0.21.0"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#a7079b6862891393e33c84dfb9111d848a1a39cc"
source = "git+https://github.com/gtk-rs/gtk-rs-core?branch=main#c87867050de49f540b08bd26ae559983fc701a5b"
dependencies = [
"glib-sys",
"libc",
@ -3420,7 +3420,7 @@ dependencies = [
[[package]]
name = "gstreamer"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"cfg-if",
"futures-channel",
@ -3446,7 +3446,7 @@ dependencies = [
[[package]]
name = "gstreamer-allocators"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3457,7 +3457,7 @@ dependencies = [
[[package]]
name = "gstreamer-allocators-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gobject-sys",
@ -3469,7 +3469,7 @@ dependencies = [
[[package]]
name = "gstreamer-analytics"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3480,7 +3480,7 @@ dependencies = [
[[package]]
name = "gstreamer-analytics-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gstreamer-sys",
@ -3491,7 +3491,7 @@ dependencies = [
[[package]]
name = "gstreamer-app"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"futures-core",
"futures-sink",
@ -3505,7 +3505,7 @@ dependencies = [
[[package]]
name = "gstreamer-app-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gstreamer-base-sys",
@ -3517,7 +3517,7 @@ dependencies = [
[[package]]
name = "gstreamer-audio"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"cfg-if",
"glib",
@ -3532,7 +3532,7 @@ dependencies = [
[[package]]
name = "gstreamer-audio-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gobject-sys",
@ -3545,7 +3545,7 @@ dependencies = [
[[package]]
name = "gstreamer-base"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"atomic_refcell",
"cfg-if",
@ -3558,7 +3558,7 @@ dependencies = [
[[package]]
name = "gstreamer-base-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gobject-sys",
@ -3570,7 +3570,7 @@ dependencies = [
[[package]]
name = "gstreamer-check"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3580,7 +3580,7 @@ dependencies = [
[[package]]
name = "gstreamer-check-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gobject-sys",
@ -3592,7 +3592,7 @@ dependencies = [
[[package]]
name = "gstreamer-gl"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3605,7 +3605,7 @@ dependencies = [
[[package]]
name = "gstreamer-gl-egl"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3617,7 +3617,7 @@ dependencies = [
[[package]]
name = "gstreamer-gl-egl-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gstreamer-gl-sys",
@ -3628,7 +3628,7 @@ dependencies = [
[[package]]
name = "gstreamer-gl-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gobject-sys",
@ -3642,7 +3642,7 @@ dependencies = [
[[package]]
name = "gstreamer-gl-wayland"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3654,7 +3654,7 @@ dependencies = [
[[package]]
name = "gstreamer-gl-wayland-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gstreamer-gl-sys",
@ -3665,7 +3665,7 @@ dependencies = [
[[package]]
name = "gstreamer-gl-x11"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3677,7 +3677,7 @@ dependencies = [
[[package]]
name = "gstreamer-gl-x11-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gstreamer-gl-sys",
@ -3688,7 +3688,7 @@ dependencies = [
[[package]]
name = "gstreamer-net"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"gio",
"glib",
@ -3699,7 +3699,7 @@ dependencies = [
[[package]]
name = "gstreamer-net-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"gio-sys",
"glib-sys",
@ -3711,7 +3711,7 @@ dependencies = [
[[package]]
name = "gstreamer-pbutils"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3725,7 +3725,7 @@ dependencies = [
[[package]]
name = "gstreamer-pbutils-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gobject-sys",
@ -3739,7 +3739,7 @@ dependencies = [
[[package]]
name = "gstreamer-rtp"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3750,7 +3750,7 @@ dependencies = [
[[package]]
name = "gstreamer-rtp-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gstreamer-base-sys",
@ -3762,7 +3762,7 @@ dependencies = [
[[package]]
name = "gstreamer-sdp"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3772,7 +3772,7 @@ dependencies = [
[[package]]
name = "gstreamer-sdp-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gstreamer-sys",
@ -3783,7 +3783,7 @@ dependencies = [
[[package]]
name = "gstreamer-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"cfg-if",
"glib-sys",
@ -3795,7 +3795,7 @@ dependencies = [
[[package]]
name = "gstreamer-utils"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"gstreamer",
"gstreamer-app",
@ -3806,7 +3806,7 @@ dependencies = [
[[package]]
name = "gstreamer-video"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"cfg-if",
"futures-channel",
@ -3822,7 +3822,7 @@ dependencies = [
[[package]]
name = "gstreamer-video-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gobject-sys",
@ -3835,7 +3835,7 @@ dependencies = [
[[package]]
name = "gstreamer-webrtc"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib",
"gstreamer",
@ -3847,7 +3847,7 @@ dependencies = [
[[package]]
name = "gstreamer-webrtc-sys"
version = "0.24.0"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#5ac6c1e221d898c0949080281200e9cdf1b29210"
source = "git+https://gitlab.freedesktop.org/gstreamer/gstreamer-rs?branch=main#a9389208107871ef56549e4c840929b5b6d9c8c6"
dependencies = [
"glib-sys",
"gstreamer-sdp-sys",
@ -4765,7 +4765,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
dependencies = [
"cfg-if",
"windows-targets 0.52.6",
"windows-targets 0.48.5",
]
[[package]]
@ -5952,7 +5952,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4"
dependencies = [
"bytes",
"heck 0.5.0",
"heck 0.4.1",
"itertools 0.12.1",
"log",
"multimap",
@ -6125,7 +6125,7 @@ dependencies = [
"once_cell",
"socket2",
"tracing",
"windows-sys 0.59.0",
"windows-sys 0.52.0",
]
[[package]]
@ -6618,7 +6618,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.59.0",
"windows-sys 0.52.0",
]
[[package]]
@ -7513,7 +7513,7 @@ dependencies = [
"getrandom 0.3.1",
"once_cell",
"rustix",
"windows-sys 0.59.0",
"windows-sys 0.52.0",
]
[[package]]
@ -8487,7 +8487,7 @@ version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb"
dependencies = [
"windows-sys 0.59.0",
"windows-sys 0.48.0",
]
[[package]]

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

View file

@ -105,6 +105,7 @@ foreach plugin_name: list_plugin_res.stdout().split(':')
index: 'plugins/index.md',
gst_index: 'plugins/index.md',
include_paths: join_paths(meson.current_source_dir(), '..'),
extra_assets: [join_paths(meson.current_source_dir(), 'images')],
gst_smart_index: true,
gst_c_source_filters: [
'../target/*/*.rs',

View file

@ -12488,6 +12488,42 @@
}
}
},
"memory-tracer": {
"hierarchy": [
"GstMemoryTracer",
"GstTracer",
"GstObject",
"GInitiallyUnowned",
"GObject"
],
"properties": {
"file": {
"blurb": "Path to the file to write memory usage information",
"conditionally-available": false,
"construct": false,
"construct-only": false,
"controllable": false,
"default": "NULL",
"mutable": "null",
"readable": false,
"type": "gchararray",
"writable": true
}
},
"signals": {
"write-log": {
"action": true,
"args": [
{
"name": "arg0",
"type": "gchararray"
}
],
"return-type": "void",
"when": "last"
}
}
},
"pad-push-timings": {
"hierarchy": [
"GstPadPushTimings",

View file

@ -35,6 +35,7 @@ static = []
capi = []
doc = ["gst/v1_18"]
v1_22 = ["gst/v1_22"]
v1_26 = ["gst/v1_26"]
[package.metadata.capi]
min_version = "0.9.21"

View file

@ -0,0 +1,135 @@
import sys
import numpy as np
import pandas as pd
import plotly.graph_objects as go
from collections import defaultdict
# Read the CSV file
def parse_memory_data(csv_data):
# Read only required columns and use dtype specifications for better performance
df = pd.read_csv(
csv_data,
names=["timestamp", "operation", "pointer", "parent", "type", "size"],
dtype={
"timestamp": np.int64,
"operation": str,
"pointer": str,
"parent": str,
"type": str,
"size": np.float64,
},
usecols=["timestamp", "operation", "pointer", "parent", "type", "size"],
)
# Filter out entries with parents early
df = df[df["parent"].apply(lambda x: int(x, 16) == 0)]
# Convert size to MB once
df["size"] = df["size"] / (1024 * 1024)
# Sort by timestamp
df = df.sort_values("timestamp")
# Initialize data structures
memory_by_type = defaultdict(lambda: defaultdict(float))
memory_values_by_type = defaultdict(list)
# Process in chunks for better memory usage
chunk_size = 10000
for chunk_start in range(0, len(df), chunk_size):
chunk = df.iloc[chunk_start : chunk_start + chunk_size]
for _, row in chunk.iterrows():
mem_type = row["type"]
pointer = row["pointer"]
timestamp = row["timestamp"] / 1000000000.0 # Convert to seconds
# Update memory tracking
if row["operation"] == "alloc":
memory_by_type[mem_type][pointer] = row["size"]
elif pointer in memory_by_type[mem_type]:
del memory_by_type[mem_type][pointer]
# Calculate metrics for this timestamp
current_memory = sum(memory_by_type[mem_type].values())
buffer_count = len(memory_by_type[mem_type])
extra_info = ""
if row["operation"] == "alloc" or row["operation"] == "free":
extra_info = f"{row['operation']}(0x{pointer}={row['size']:.3f}MB)"
memory_values_by_type[mem_type].append(
(timestamp, current_memory, buffer_count, extra_info)
)
return memory_values_by_type
def create_memory_graph(csv_data):
memory_values_by_type = parse_memory_data(csv_data)
fig = go.Figure()
colors = {
"SystemMemory": "blue",
"GPU Memory": "red",
"GLBuffer": "orange",
"GLMemoryPBO": "darkorange",
"GLRenderBuffer": "darkturquoise",
"gst.cuda.memory": "green",
"DMABuf": "purple",
"fd": "magenta",
"shm": "darkviolet",
}
# Add traces for each memory type
for mem_type, values in memory_values_by_type.items():
color = colors.get(mem_type, "gray") # Default to gray for unknown types
decimation_factor = max(1, len(values) // 10000)
# Decimate the data points
decimated_values = values[::decimation_factor]
decimated_timestamps = [v[0] for v in decimated_values]
memory_values = [v[1] for v in decimated_values] # Extract memory values
buffer_counts = [v[2] for v in decimated_values] # Extract buffer counts
extra_info = [v[3] for v in decimated_values] # Extract extra info
extra_info = [v[2] for v in decimated_values] # Extract buffer counts
# Optimize hover text - only create it for visible points
hover_text = [
f"{mem_type}:<br>• Size: {mem:.2f}MB<br>• Buffers: {count}"
for mem, count, _ in zip(memory_values, buffer_counts, extra_info)
]
fig.add_trace(
go.Scatter(
x=decimated_timestamps,
y=memory_values,
mode="lines", # Removed markers for better performance
name=f"{mem_type}",
line=dict(color=color, width=2),
hovertext=hover_text,
hoverinfo="text",
hovertemplate="%{hovertext}<extra></extra>", # Optimized hover template
)
)
# Customize the layout
fig.update_layout(
title="GStreamer Memory Usage Over Time",
xaxis_title="Timestamp",
yaxis_title="Memory Usage (MB)",
hovermode="x unified",
showlegend=True,
template="plotly_white",
yaxis=dict(rangemode="nonnegative"), # Ensure y-axis doesn't go below 0
)
return fig
if __name__ == "__main__":
csv_data = sys.argv[1]
fig = create_memory_graph(csv_data)
fig.show()

View file

@ -15,6 +15,8 @@
use gst::glib;
mod buffer_lateness;
#[cfg(feature = "v1_26")]
mod memory_tracer;
mod pad_push_timings;
mod pcap_writer;
#[cfg(unix)]
@ -28,6 +30,8 @@ fn plugin_init(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
buffer_lateness::register(plugin)?;
pad_push_timings::register(plugin)?;
pcap_writer::register(plugin)?;
#[cfg(feature = "v1_26")]
memory_tracer::register(plugin)?;
Ok(())
}

View file

@ -0,0 +1,236 @@
// Copyright (C) 2024 Thibault Saunier <tsaunier@igalia.com>
//
// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at
// <https://mozilla.org/MPL/2.0/>.
//
// SPDX-License-Identifier: MPL-2.0
/**
* tracer-memory-tracer:
*
* This tracer provides an easy way to track memory allocations over time in a pipeline.
*
* ## Example:
*
* ### Log GstMemory allocation releases into the `tmp.memory.csv` file
*
* ```
* # Dropping allocation query so we can see both the GLMemory and the SystemMemory on the graph
*
* $ GST_TRACERS="memory-tracer(file=tmp.memory.cvs)" gst-launch-1.0 videotestsrc num-buffers=30 ! identity drop-allocation=true ! glimagesink
* ```
*
* ### lot memory usage per type
*
* ```
* python3 utils/tracers/scripts/memory_usage.py tmp.memory.cvs
* ```
*
* ### Result
*
* ![](images/memory_tracer_plot.png)
*
* Since: 0.14
*/
use gst::glib;
use gst::glib::Properties;
use gst::prelude::*;
use gst::subclass::prelude::*;
use std::path::PathBuf;
use std::sync::{LazyLock, Mutex};
static CAT: LazyLock<gst::DebugCategory> = LazyLock::new(|| {
gst::DebugCategory::new(
"memory-tracer",
gst::DebugColorFlags::empty(),
Some("Tracer to collect information about GStreamer memory allocations"),
)
});
struct MemoryEvent {
timestamp: u64,
ptr: usize,
parent: usize,
size: usize,
is_alloc: bool,
memory_type: &'static str,
}
impl MemoryEvent {
fn event_type(&self) -> &str {
if self.is_alloc {
"alloc"
} else {
"free"
}
}
}
#[derive(Debug)]
struct Settings {
file: PathBuf,
}
impl Default for Settings {
fn default() -> Self {
let mut file = gst::glib::tmp_dir();
file.push(format!("{:?}-memory_tracer.log", std::process::id()));
Self { file }
}
}
#[derive(Default)]
struct State {
log: Vec<MemoryEvent>,
logs_written: bool,
}
#[derive(Properties, Default)]
#[properties(wrapper_type = super::MemoryTracer)]
pub struct MemoryTracer {
state: Mutex<State>,
#[property(
name="file",
set = Self::set_file,
type = String,
blurb = "Path to the file to write memory usage information",
)]
settings: Mutex<Settings>,
}
#[glib::object_subclass]
impl ObjectSubclass for MemoryTracer {
const NAME: &'static str = "GstMemoryTracer";
type Type = super::MemoryTracer;
type ParentType = gst::Tracer;
}
impl MemoryTracer {
fn set_file(&self, file: String) {
let mut settings = self.settings.lock().unwrap();
settings.file = PathBuf::from(file);
}
fn write_log(&self, file_path: Option<String>) {
use std::io::prelude::*;
let settings = self.settings.lock().unwrap();
let mut file = match file_path.map_or_else(
|| std::fs::File::create(&settings.file),
|path| std::fs::File::create(PathBuf::from(path)),
) {
Ok(file) => file,
Err(err) => {
gst::error!(CAT, imp = self, "Failed to create file: {err}");
return;
}
};
gst::info!(CAT, imp = self, "Writing file {:?}", file);
drop(settings);
let mut state = self.state.lock().unwrap();
let log = std::mem::take(&mut state.log);
state.logs_written = true;
drop(state);
for event in &log {
if let Err(err) = writeln!(
&mut file,
"{},{},{},0x{:08x},{:?},{}",
event.timestamp,
event.event_type(),
event.ptr,
event.parent,
event.memory_type,
event.size
) {
gst::error!(CAT, imp = self, "Failed to write to file: {err}");
}
}
}
}
#[glib::derived_properties]
impl ObjectImpl for MemoryTracer {
fn signals() -> &'static [glib::subclass::Signal] {
static SIGNALS: LazyLock<Vec<glib::subclass::Signal>> = LazyLock::new(|| {
vec![glib::subclass::Signal::builder("write-log")
.action()
.param_types([Option::<String>::static_type()])
.class_handler(|args| {
let obj = args[0].get::<super::MemoryTracer>().unwrap();
let file = args[1].get::<Option<String>>().unwrap();
obj.imp().write_log(file);
None
})
.build()]
});
SIGNALS.as_ref()
}
fn constructed(&self) {
self.parent_constructed();
self.register_hook(TracerHook::MemoryInit);
self.register_hook(TracerHook::MemoryFreePre);
}
fn dispose(&self) {
if self.state.lock().unwrap().logs_written {
gst::info!(
CAT,
"Logs were written manually, not overwriting on dispose"
);
return;
}
self.write_log(None);
}
}
impl TracerImpl for MemoryTracer {
const USE_STRUCTURE_PARAMS: bool = true;
fn memory_init(&self, ts: u64, memory: &gst::MemoryRefTrace) {
let mut state = self.state.lock().unwrap();
let size = memory.maxsize();
let ptr = memory.as_ptr() as usize;
let parent = memory.parent().map_or(0_usize, |p| p.as_ptr() as usize);
state.log.push(MemoryEvent {
timestamp: ts,
ptr,
parent,
is_alloc: true,
memory_type: memory
.allocator()
.map_or("unknown", |alloc| alloc.memory_type()),
size,
});
}
fn memory_free_pre(&self, ts: u64, memory: &gst::MemoryRef) {
let mut state = self.state.lock().unwrap();
let ptr = memory.as_ptr() as usize;
let parent = memory.parent().map_or(0_usize, |p| p.as_ptr() as usize);
state.log.push(MemoryEvent {
timestamp: ts,
parent,
ptr,
is_alloc: false,
memory_type: memory
.allocator()
.map_or("unknown", |alloc| alloc.memory_type()),
size: memory.maxsize(),
});
}
}
impl GstObjectImpl for MemoryTracer {}

View file

@ -0,0 +1,20 @@
// Copyright (C) 2025 Thibault Saunier <tsaunier@igalia.com>
//
// This Source Code Form is subject to the terms of the Mozilla Public License, v2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at
// <https://mozilla.org/MPL/2.0/>.
//
// SPDX-License-Identifier: MPL-2.0
use gst::glib;
use gst::prelude::*;
mod imp;
glib::wrapper! {
pub struct MemoryTracer(ObjectSubclass<imp::MemoryTracer>) @extends gst::Tracer, gst::Object;
}
pub fn register(plugin: &gst::Plugin) -> Result<(), glib::BoolError> {
gst::Tracer::register(Some(plugin), "memory-tracer", MemoryTracer::static_type())
}