]> git.sesse.net Git - nageru/commitdiff
Add some base x264 metrics.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 11 Jun 2017 13:55:20 +0000 (15:55 +0200)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Sun, 11 Jun 2017 13:55:20 +0000 (15:55 +0200)
x264_encoder.cpp
x264_encoder.h

index 8be53ceea635b8b832466d531007c65dfd69a093..3a3151068dfad9333efa46bec795f754f2e15c30 100644 (file)
@@ -11,6 +11,7 @@
 
 #include "defs.h"
 #include "flags.h"
+#include "metrics.h"
 #include "mux.h"
 #include "print_latency.h"
 #include "timebase.h"
@@ -57,6 +58,13 @@ X264Encoder::X264Encoder(AVOutputFormat *oformat)
                free_frames.push(frame_pool.get() + i * (global_flags.width * global_flags.height * 2 * bytes_per_pixel));
        }
        encoder_thread = thread(&X264Encoder::encoder_thread_func, this);
+
+       global_metrics.add("x264_queued_frames", &metric_x264_queued_frames, Metrics::TYPE_GAUGE);
+       global_metrics.add("x264_max_queued_frames", &metric_x264_max_queued_frames, Metrics::TYPE_GAUGE);
+       global_metrics.add("x264_dropped_frames", &metric_x264_dropped_frames);
+       global_metrics.add("x264_output_frames", {{ "type", "i" }}, &metric_x264_output_frames_i);
+       global_metrics.add("x264_output_frames", {{ "type", "p" }}, &metric_x264_output_frames_p);
+       global_metrics.add("x264_output_frames", {{ "type", "b" }}, &metric_x264_output_frames_b);
 }
 
 X264Encoder::~X264Encoder()
@@ -83,6 +91,7 @@ void X264Encoder::add_frame(int64_t pts, int64_t duration, YCbCrLumaCoefficients
                lock_guard<mutex> lock(mu);
                if (free_frames.empty()) {
                        fprintf(stderr, "WARNING: x264 queue full, dropping frame with pts %ld\n", pts);
+                       ++metric_x264_dropped_frames;
                        return;
                }
 
@@ -97,6 +106,7 @@ void X264Encoder::add_frame(int64_t pts, int64_t duration, YCbCrLumaCoefficients
                lock_guard<mutex> lock(mu);
                queued_frames.push(qf);
                queued_frames_nonempty.notify_all();
+               metric_x264_queued_frames = queued_frames.size();
        }
 }
        
@@ -249,6 +259,7 @@ void X264Encoder::encoder_thread_func()
                                qf.data = nullptr;
                        }
 
+                       metric_x264_queued_frames = queued_frames.size();
                        frames_left = !queued_frames.empty();
                }
 
@@ -344,6 +355,14 @@ void X264Encoder::encode_frame(X264Encoder::QueuedFrame qf)
 
        if (num_nal == 0) return;
 
+       if (IS_X264_TYPE_I(pic.i_type)) {
+               ++metric_x264_output_frames_i;
+       } else if (IS_X264_TYPE_B(pic.i_type)) {
+               ++metric_x264_output_frames_b;
+       } else {
+               ++metric_x264_output_frames_p;
+       }
+
        if (frames_being_encoded.count(pic.i_pts)) {
                ReceivedTimestamps received_ts = frames_being_encoded[pic.i_pts];
                frames_being_encoded.erase(pic.i_pts);
index 455bb1e96e822282c3dfd41162f6fe0304b7ceda..973b62ce5ba5353d74b82cf2b72f869a24325199 100644 (file)
@@ -32,6 +32,7 @@ extern "C" {
 
 #include <movit/image_format.h>
 
+#include "defs.h"
 #include "print_latency.h"
 #include "x264_dynamic.h"
 
@@ -113,6 +114,14 @@ private:
 
        // Key is the pts of the frame.
        std::unordered_map<int64_t, ReceivedTimestamps> frames_being_encoded;
+
+       // Metrics.
+       std::atomic<int64_t> metric_x264_queued_frames{0};
+       std::atomic<int64_t> metric_x264_max_queued_frames{X264_QUEUE_LENGTH};
+       std::atomic<int64_t> metric_x264_dropped_frames{0};
+       std::atomic<int64_t> metric_x264_output_frames_i{0};
+       std::atomic<int64_t> metric_x264_output_frames_p{0};
+       std::atomic<int64_t> metric_x264_output_frames_b{0};
 };
 
 #endif  // !defined(_X264ENCODE_H)