]> git.sesse.net Git - nageru/blobdiff - futatabi/jpeg_frame_view.cpp
Add metrics for how many frames we are decoding, but did not have the time to display.
[nageru] / futatabi / jpeg_frame_view.cpp
index eb0ed0925947b5a1571d6ba0ff46a00d1bc5385f..ebcf509dbc91b470d18377e973d97874617093a0 100644 (file)
@@ -12,6 +12,7 @@
 #include <QMouseEvent>
 #include <QScreen>
 #include <atomic>
+#include <chrono>
 #include <condition_variable>
 #include <deque>
 #include <jpeglib.h>
@@ -29,6 +30,7 @@
 
 using namespace movit;
 using namespace std;
+using namespace std::chrono;
 
 namespace {
 
@@ -70,6 +72,9 @@ atomic<int64_t> metric_jpeg_software_decode_frames{ 0 };
 atomic<int64_t> metric_jpeg_software_fail_frames{ 0 };
 atomic<int64_t> metric_jpeg_vaapi_decode_frames{ 0 };
 atomic<int64_t> metric_jpeg_vaapi_fail_frames{ 0 };
+atomic<int64_t> metric_jpeg_prepared_frames{ 0 };
+atomic<int64_t> metric_jpeg_displayed_frames{ 0 };
+Summary metric_jpeg_decode_time_seconds;
 
 }  // namespace
 
@@ -82,11 +87,14 @@ extern atomic<bool> should_quit;
 
 shared_ptr<Frame> decode_jpeg(const string &jpeg)
 {
+       steady_clock::time_point start = steady_clock::now();
        shared_ptr<Frame> frame;
        if (vaapi_jpeg_decoding_usable) {
                frame = decode_jpeg_vaapi(jpeg);
                if (frame != nullptr) {
                        ++metric_jpeg_vaapi_decode_frames;
+                       steady_clock::time_point stop = steady_clock::now();
+                       metric_jpeg_decode_time_seconds.count_event(duration<double>(stop - start).count());
                        return frame;
                }
                fprintf(stderr, "VA-API hardware decoding failed; falling back to software.\n");
@@ -189,6 +197,8 @@ shared_ptr<Frame> decode_jpeg(const string &jpeg)
        }
 
        ++metric_jpeg_software_decode_frames;
+       steady_clock::time_point stop = steady_clock::now();
+       metric_jpeg_decode_time_seconds.count_event(duration<double>(stop - start).count());
        return frame;
 }
 
@@ -350,6 +360,11 @@ JPEGFrameView::JPEGFrameView(QWidget *parent)
                global_metrics.add("jpeg_decode_frames", { { "decoder", "software" }, { "result", "fail" } }, &metric_jpeg_software_fail_frames);
                global_metrics.add("jpeg_decode_frames", { { "decoder", "vaapi" }, { "result", "decode" } }, &metric_jpeg_vaapi_decode_frames);
                global_metrics.add("jpeg_decode_frames", { { "decoder", "vaapi" }, { "result", "fail" } }, &metric_jpeg_vaapi_fail_frames);
+               global_metrics.add("jpeg_frames", { { "action", "prepared" } }, &metric_jpeg_prepared_frames);
+               global_metrics.add("jpeg_frames", { { "action", "displayed" } }, &metric_jpeg_displayed_frames);
+               vector<double> quantiles{ 0.01, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99 };
+               metric_jpeg_decode_time_seconds.init(quantiles, 60.0);
+               global_metrics.add("jpeg_decode_time_seconds", &metric_jpeg_decode_time_seconds);
        });
 }
 
@@ -417,6 +432,11 @@ void JPEGFrameView::paintGL()
                return;
        }
 
+       if (!displayed_this_frame) {
+               ++metric_jpeg_displayed_frames;
+               displayed_this_frame = true;
+       }
+
        check_error();
        current_chain->render_to_screen();
 
@@ -447,6 +467,8 @@ void JPEGFrameView::setDecodedFrame(shared_ptr<Frame> frame, shared_ptr<Frame> s
                } else {
                        current_chain = ycbcr_converter->prepare_chain_for_conversion(frame);
                }
+               ++metric_jpeg_prepared_frames;
+               displayed_this_frame = false;
                update();
        });
 }