From: Steinar H. Gunderson Date: Thu, 14 Feb 2019 23:10:06 +0000 (+0100) Subject: Add MJPEG export metrics. X-Git-Tag: 1.8.3~38 X-Git-Url: https://git.sesse.net/?p=nageru;a=commitdiff_plain;h=a000a60dff370ed7e5e8ed9f959cec6ec10d158f Add MJPEG export metrics. --- diff --git a/nageru/mjpeg_encoder.cpp b/nageru/mjpeg_encoder.cpp index f920bf5..8192be4 100644 --- a/nageru/mjpeg_encoder.cpp +++ b/nageru/mjpeg_encoder.cpp @@ -16,6 +16,7 @@ extern "C" { #include "flags.h" #include "shared/httpd.h" #include "shared/memcpy_interleaved.h" +#include "shared/metrics.h" #include "pbo_frame_allocator.h" #include "shared/timebase.h" #include "va_display_with_cleanup.h" @@ -177,12 +178,26 @@ MJPEGEncoder::MJPEGEncoder(HTTPD *httpd, const string &va_display) va_receiver_thread = thread(&MJPEGEncoder::va_receiver_thread_func, this); } + global_metrics.add("mjpeg_frames", {{ "status", "dropped" }, { "reason", "zero_size" }}, &metric_mjpeg_frames_zero_size_dropped); + global_metrics.add("mjpeg_frames", {{ "status", "dropped" }, { "reason", "interlaced" }}, &metric_mjpeg_frames_interlaced_dropped); + global_metrics.add("mjpeg_frames", {{ "status", "dropped" }, { "reason", "unsupported_pixel_format" }}, &metric_mjpeg_frames_unsupported_pixel_format_dropped); + global_metrics.add("mjpeg_frames", {{ "status", "dropped" }, { "reason", "oversized" }}, &metric_mjpeg_frames_oversized_dropped); + global_metrics.add("mjpeg_frames", {{ "status", "dropped" }, { "reason", "overrun" }}, &metric_mjpeg_overrun_dropped); + global_metrics.add("mjpeg_frames", {{ "status", "submitted" }}, &metric_mjpeg_overrun_submitted); + running = true; } MJPEGEncoder::~MJPEGEncoder() { av_free(avctx->pb->buffer); + + global_metrics.remove("mjpeg_frames", {{ "status", "dropped" }, { "reason", "zero_size" }}); + global_metrics.remove("mjpeg_frames", {{ "status", "dropped" }, { "reason", "interlaced" }}); + global_metrics.remove("mjpeg_frames", {{ "status", "dropped" }, { "reason", "unsupported_pixel_format" }}); + global_metrics.remove("mjpeg_frames", {{ "status", "dropped" }, { "reason", "oversized" }}); + global_metrics.remove("mjpeg_frames", {{ "status", "dropped" }, { "reason", "overrun" }}); + global_metrics.remove("mjpeg_frames", {{ "status", "submitted" }}); } void MJPEGEncoder::stop() @@ -247,27 +262,33 @@ void MJPEGEncoder::upload_frame(int64_t pts, unsigned card_index, RefCountedFram { PBOFrameAllocator::Userdata *userdata = (PBOFrameAllocator::Userdata *)frame->userdata; if (video_format.width == 0 || video_format.height == 0) { + ++metric_mjpeg_frames_zero_size_dropped; return; } if (video_format.interlaced) { fprintf(stderr, "Card %u: Ignoring JPEG encoding for interlaced frame\n", card_index); + ++metric_mjpeg_frames_interlaced_dropped; return; } if (userdata->pixel_format != PixelFormat_8BitYCbCr || !frame->interleaved) { fprintf(stderr, "Card %u: Ignoring JPEG encoding for unsupported pixel format\n", card_index); + ++metric_mjpeg_frames_unsupported_pixel_format_dropped; return; } if (video_format.width > 4096 || video_format.height > 4096) { fprintf(stderr, "Card %u: Ignoring JPEG encoding for oversized frame\n", card_index); + ++metric_mjpeg_frames_oversized_dropped; return; } lock_guard lock(mu); if (frames_to_be_encoded.size() + frames_encoding.size() > 50) { fprintf(stderr, "WARNING: MJPEG encoding doesn't keep up, discarding frame.\n"); + ++metric_mjpeg_overrun_dropped; return; } + ++metric_mjpeg_overrun_submitted; frames_to_be_encoded.push(QueuedFrame{ pts, card_index, frame, video_format, y_offset, cbcr_offset }); any_frames_to_be_encoded.notify_all(); } diff --git a/nageru/mjpeg_encoder.h b/nageru/mjpeg_encoder.h index 3630d9f..6610e13 100644 --- a/nageru/mjpeg_encoder.h +++ b/nageru/mjpeg_encoder.h @@ -146,6 +146,13 @@ private: static std::unique_ptr try_open_va(const std::string &va_display, std::string *error, VAConfigID *config_id); uint8_t *tmp_y, *tmp_cbcr, *tmp_cb, *tmp_cr; // Private to the encoder thread. Used by the libjpeg backend only. + + std::atomic metric_mjpeg_frames_zero_size_dropped{0}; + std::atomic metric_mjpeg_frames_interlaced_dropped{0}; + std::atomic metric_mjpeg_frames_unsupported_pixel_format_dropped{0}; + std::atomic metric_mjpeg_frames_oversized_dropped{0}; + std::atomic metric_mjpeg_overrun_dropped{0}; + std::atomic metric_mjpeg_overrun_submitted{0}; }; #endif // !defined(_MJPEG_ENCODER_H)