#include <QMouseEvent>
#include <QScreen>
#include <atomic>
+#include <chrono>
#include <condition_variable>
#include <deque>
#include <jpeglib.h>
using namespace movit;
using namespace std;
+using namespace std::chrono;
namespace {
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 };
+Summary metric_jpeg_decode_time_seconds;
} // namespace
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");
}
++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;
}
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);
+ 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);
});
}