From bb32f75f089a4ea04447eb233bb78869be63ceb1 Mon Sep 17 00:00:00 2001
From: Alexandre Janniaux <ajanni@videolabs.io>
Date: Thu, 27 Feb 2025 11:33:57 +0100
Subject: [PATCH] input: decoder: trace input fifo buffer level

The decoder fifo level metric allows interpreting the situation that led
to the fifo from the decoder to be flushed (ie. the fifo reached 400MiB
of undecoded data stored). The metrics generates a lot of points though,
so be sure to aggregate when displaying it.

Example of query in flux language:

    from(bucket: v.defaultBucket)
    |> range(start: v.timeRangeStart, stop:v.timeRangeStop)
    |> filter(fn: (r) =>
      r._measurement == "measurement" and
      r._field == "fifo_size"
    )
    |> aggregateWindow(every: 1s, fn: max)

The size metrics are casted into uint64_t, but are always below the
uint64_t max value anyway given they represent lesser values than
400MiB.
---
 src/input/decoder.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/input/decoder.c b/src/input/decoder.c
index a496641f068f..95dab7504638 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -2474,6 +2474,20 @@ void vlc_input_decoder_DecodeWithStatus(vlc_input_decoder_t *p_owner, vlc_frame_
     vlc_fifo_QueueUnlocked( p_owner->p_fifo, frame );
     if (status != NULL)
         GetStatusLocked(p_owner, status);
+
+    struct vlc_tracer *tracer = vlc_object_get_tracer(&p_owner->dec.obj);
+    if (tracer != NULL)
+    {
+        size_t fifo_size = vlc_fifo_GetBytes(p_owner->p_fifo);
+        size_t fifo_count = vlc_fifo_GetCount(p_owner->p_fifo);
+        vlc_tracer_Trace(tracer,
+                         VLC_TRACE("id", p_owner->psz_id),
+                         VLC_TRACE("fifo_size", (uint64_t)fifo_size),
+                         VLC_TRACE("fifo_count", (uint64_t)fifo_count),
+                         VLC_TRACE_END);
+    }
+
+
     vlc_fifo_Unlock( p_owner->p_fifo );
 }
 
-- 
GitLab