#include "player.h"
#include "shared/context.h"
#include "shared/httpd.h"
+#include "shared/metrics.h"
#include "shared/shared_defs.h"
#include "shared/mux.h"
#include "util.h"
using namespace std;
using namespace std::chrono;
+namespace {
+
+once_flag video_metrics_inited;
+Summary metric_jpeg_encode_time_seconds;
+Summary metric_fade_latency_seconds;
+Summary metric_interpolation_latency_seconds;
+Summary metric_fade_fence_wait_time_seconds;
+Summary metric_interpolation_fence_wait_time_seconds;
+
+} // namespace
+
extern HTTPD *global_httpd;
struct VectorDestinationManager {
string encode_jpeg(const uint8_t *y_data, const uint8_t *cb_data, const uint8_t *cr_data, unsigned width, unsigned height, const string exif_data)
{
+ steady_clock::time_point start = steady_clock::now();
VectorDestinationManager dest;
jpeg_compress_struct cinfo;
jpeg_finish_compress(&cinfo);
jpeg_destroy_compress(&cinfo);
+ steady_clock::time_point stop = steady_clock::now();
+ metric_jpeg_encode_time_seconds.count_event(duration<double>(stop - start).count());
+
return move(dest.dest);
}
VideoStream::VideoStream(AVFormatContext *file_avctx)
: avctx(file_avctx), output_fast_forward(file_avctx != nullptr)
{
+ call_once(video_metrics_inited, [] {
+ vector<double> quantiles{ 0.01, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99 };
+ metric_jpeg_encode_time_seconds.init(quantiles, 60.0);
+ global_metrics.add("jpeg_encode_time_seconds", &metric_jpeg_encode_time_seconds);
+ metric_fade_fence_wait_time_seconds.init(quantiles, 60.0);
+ global_metrics.add("fade_fence_wait_time_seconds", &metric_fade_fence_wait_time_seconds);
+ metric_interpolation_fence_wait_time_seconds.init(quantiles, 60.0);
+ global_metrics.add("interpolation_fence_wait_time_seconds", &metric_interpolation_fence_wait_time_seconds);
+ metric_fade_latency_seconds.init(quantiles, 60.0);
+ global_metrics.add("fade_latency_seconds", &metric_fade_latency_seconds);
+ metric_interpolation_latency_seconds.init(quantiles, 60.0);
+ global_metrics.add("interpolation_latency_seconds", &metric_interpolation_latency_seconds);
+ });
+
ycbcr_converter.reset(new YCbCrConverter(YCbCrConverter::OUTPUT_TO_DUAL_YCBCR, /*resource_pool=*/nullptr));
ycbcr_semiplanar_converter.reset(new YCbCrConverter(YCbCrConverter::OUTPUT_TO_SEMIPLANAR, /*resource_pool=*/nullptr));
// Set a fence we can wait for to make sure the CPU sees the read.
glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT);
check_error();
+ qf.fence_created = steady_clock::now();
qf.fence = RefCountedGLsync(GL_SYNC_GPU_COMMANDS_COMPLETE, /*flags=*/0);
check_error();
qf.resources = move(resources);
// Set a fence we can wait for to make sure the CPU sees the read.
glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT);
check_error();
+ qf.fence_created = steady_clock::now();
qf.fence = RefCountedGLsync(GL_SYNC_GPU_COMMANDS_COMPLETE, /*flags=*/0);
check_error();
qf.resources = move(resources);
add_audio_or_silence(qf);
} else if (qf.type == QueuedFrame::FADED) {
+ steady_clock::time_point start = steady_clock::now();
glClientWaitSync(qf.fence.get(), /*flags=*/0, GL_TIMEOUT_IGNORED);
+ steady_clock::time_point stop = steady_clock::now();
+ metric_fade_fence_wait_time_seconds.count_event(duration<double>(stop - start).count());
+ metric_fade_latency_seconds.count_event(duration<double>(stop - qf.fence_created).count());
shared_ptr<Frame> frame = frame_from_pbo(qf.resources->pbo_contents, global_flags.width, global_flags.height);
assert(frame->exif_data.empty());
add_audio_or_silence(qf);
} else if (qf.type == QueuedFrame::INTERPOLATED || qf.type == QueuedFrame::FADED_INTERPOLATED) {
+ steady_clock::time_point start = steady_clock::now();
glClientWaitSync(qf.fence.get(), /*flags=*/0, GL_TIMEOUT_IGNORED);
+ steady_clock::time_point stop = steady_clock::now();
+ metric_interpolation_fence_wait_time_seconds.count_event(duration<double>(stop - start).count());
+ metric_interpolation_latency_seconds.count_event(duration<double>(stop - qf.fence_created).count());
// Send it on to display.
shared_ptr<Frame> frame = frame_from_pbo(qf.resources->pbo_contents, global_flags.width, global_flags.height);