blob: 81128d3a830ab6d6e0888e3584d968c1ac9edf3e [file] [log] [blame]
/*
* Copyright 2019 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "common/camera_metrics_impl.h"
#include <algorithm>
#include <string>
#include <utility>
#include <vector>
#include <base/files/file_path.h>
#include <base/files/file_util.h>
#include <base/strings/string_number_conversions.h>
#include <base/strings/string_split.h>
#include <base/strings/string_util.h>
#include <base/strings/stringprintf.h>
#include <base/system/sys_info.h>
#include <hardware/camera3.h>
#include <system/graphics.h>
#include "cros-camera/common.h"
namespace cros {
namespace {
constexpr char kCameraJpegProcessLatency[] =
"ChromeOS.Camera.Jpeg.Latency.%s.%s";
constexpr base::TimeDelta kMinLatency = base::TimeDelta::FromMicroseconds(1);
constexpr base::TimeDelta kMaxLatency = base::TimeDelta::FromSeconds(1);
constexpr int kBucketLatency = 100;
constexpr char kCameraJpegResolution[] =
"ChromeOS.Camera.Jpeg.Resolution.%s.%s";
constexpr int kMinResolutionInPixels = 1;
constexpr int kMaxResolutionInPixels = 15000000; // 15 MegaPixels.
constexpr int kBucketResolutionInPixels = 50;
constexpr char kCameraConfigureStreamsLatency[] =
"ChromeOS.Camera.ConfigureStreamsLatency";
constexpr char kCameraConfigureStreamsResolution[] =
"ChromeOS.Camera.ConfigureStreams.Output.Resolution.%s";
constexpr char kCameraOpenDeviceLatency[] = "ChromeOS.Camera.OpenDeviceLatency";
constexpr char kCameraErrorType[] = "ChromeOS.Camera.ErrorType";
constexpr char kCameraFacing[] = "ChromeOS.Camera.Facing";
// Includes CAMERA_FACING_BACK, CAMERA_FACING_FRONT and CAMERA_FACING_EXTERNAL.
constexpr int kNumCameraFacings = 3;
constexpr char kCameraSessionDuration[] = "ChromeOS.Camera.SessionDuration";
constexpr base::TimeDelta kMinCameraSessionDuration =
base::TimeDelta::FromSeconds(1);
constexpr base::TimeDelta kMaxCameraSessionDuration =
base::TimeDelta::FromDays(1);
constexpr int kBucketCameraSessionDuration = 100;
} // namespace
// static
std::unique_ptr<CameraMetrics> CameraMetrics::New() {
return std::make_unique<CameraMetricsImpl>();
}
CameraMetricsImpl::CameraMetricsImpl()
: metrics_lib_(std::make_unique<MetricsLibrary>()) {}
CameraMetricsImpl::~CameraMetricsImpl() = default;
void CameraMetricsImpl::SetMetricsLibraryForTesting(
std::unique_ptr<MetricsLibraryInterface> metrics_lib) {
metrics_lib_ = std::move(metrics_lib);
}
void CameraMetricsImpl::SendJpegProcessLatency(JpegProcessType process_type,
JpegProcessMethod process_layer,
base::TimeDelta latency) {
std::string action_name = base::StringPrintf(
kCameraJpegProcessLatency,
(process_layer == JpegProcessMethod::kHardware ? "Hardware" : "Software"),
(process_type == JpegProcessType::kDecode ? "Decode" : "Encode"));
metrics_lib_->SendToUMA(action_name, latency.InMicroseconds(),
kMinLatency.InMicroseconds(),
kMaxLatency.InMicroseconds(), kBucketLatency);
}
void CameraMetricsImpl::SendJpegResolution(JpegProcessType process_type,
JpegProcessMethod process_layer,
int width,
int height) {
std::string action_name = base::StringPrintf(
kCameraJpegResolution,
(process_layer == JpegProcessMethod::kHardware ? "Hardware" : "Software"),
(process_type == JpegProcessType::kDecode ? "Decode" : "Encode"));
metrics_lib_->SendToUMA(action_name, width * height, kMinResolutionInPixels,
kMaxResolutionInPixels, kBucketResolutionInPixels);
}
void CameraMetricsImpl::SendConfigureStreamsLatency(base::TimeDelta latency) {
metrics_lib_->SendToUMA(kCameraConfigureStreamsLatency,
latency.InMicroseconds(),
kMinLatency.InMicroseconds(),
kMaxLatency.InMicroseconds(), kBucketLatency);
}
void CameraMetricsImpl::SendConfigureStreamResolution(int width,
int height,
int format) {
std::string format_str;
switch (format) {
case HAL_PIXEL_FORMAT_RGBA_8888:
format_str = "RGBA_8888";
break;
case HAL_PIXEL_FORMAT_RGBX_8888:
format_str = "RGBX_8888";
break;
case HAL_PIXEL_FORMAT_BGRA_8888:
format_str = "BGRA_8888";
break;
case HAL_PIXEL_FORMAT_YCrCb_420_SP:
format_str = "YCrCb_420_SP";
break;
case HAL_PIXEL_FORMAT_YCbCr_422_I:
format_str = "YCbCr_422_I";
break;
case HAL_PIXEL_FORMAT_BLOB:
format_str = "BLOB";
break;
case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
format_str = "IMPLEMENTATION_DEFINED";
break;
case HAL_PIXEL_FORMAT_YCbCr_420_888:
format_str = "YCbCr_420_888";
break;
case HAL_PIXEL_FORMAT_YV12:
format_str = "YV12";
break;
}
std::string action_name =
base::StringPrintf(kCameraConfigureStreamsResolution, format_str.c_str());
metrics_lib_->SendToUMA(action_name, width * height, kMinResolutionInPixels,
kMaxResolutionInPixels, kBucketResolutionInPixels);
}
void CameraMetricsImpl::SendOpenDeviceLatency(base::TimeDelta latency) {
metrics_lib_->SendToUMA(kCameraOpenDeviceLatency, latency.InMicroseconds(),
kMinLatency.InMicroseconds(),
kMaxLatency.InMicroseconds(), kBucketLatency);
}
void CameraMetricsImpl::SendError(int error_code) {
metrics_lib_->SendEnumToUMA(kCameraErrorType, error_code,
CAMERA3_MSG_NUM_ERRORS);
}
void CameraMetricsImpl::SendCameraFacing(int facing) {
metrics_lib_->SendEnumToUMA(kCameraFacing, facing, kNumCameraFacings);
}
void CameraMetricsImpl::SendSessionDuration(base::TimeDelta duration) {
metrics_lib_->SendToUMA(kCameraSessionDuration, duration.InSeconds(),
kMinCameraSessionDuration.InSeconds(),
kMaxCameraSessionDuration.InSeconds(),
kBucketCameraSessionDuration);
}
} // namespace cros