blob: 0eb5ffd51f5823b7a53589d79d5742f73361c83f [file] [log] [blame] [edit]
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CAMERA_DIAGNOSTICS_CAMERA_DIAGNOSTICS_SESSION_H_
#define CAMERA_DIAGNOSTICS_CAMERA_DIAGNOSTICS_SESSION_H_
#include <memory>
#include <optional>
#include <vector>
#include <base/memory/scoped_refptr.h>
#include <base/threading/thread_checker.h>
#include <mojo/public/cpp/bindings/remote.h>
#include "camera/mojo/camera_diagnostics.mojom.h"
#include "cros-camera/camera_thread.h"
#include "diagnostics/analyzers/frame_analyzer.h"
#include "diagnostics/camera_diagnostics_mojo_manager.h"
#include "diagnostics/camera_service_controller.h"
namespace cros {
// Each session is responsible to run one full diagnosis.
// To free resources, sessions should be destroyed when diagnosis
// is finished and result is retrieved.
// Thread-safe.
class CameraDiagnosticsSession {
public:
CameraDiagnosticsSession(CameraDiagnosticsMojoManager* mojo_manager,
const base::FilePath& blur_detector_dlc_path,
scoped_refptr<Future<void>> notify_finish);
CameraDiagnosticsSession(const CameraDiagnosticsSession&) = delete;
CameraDiagnosticsSession& operator=(const CameraDiagnosticsSession&) = delete;
CameraDiagnosticsSession(CameraDiagnosticsSession&&) = delete;
CameraDiagnosticsSession& operator=(CameraDiagnosticsSession&&) = delete;
~CameraDiagnosticsSession();
void QueueFrame(camera_diag::mojom::CameraFramePtr frame);
// When frame analysis starts, this calls camera service to start streaming.
// Triggers |notify_finish_| when diagnosis finishes.
void RunFrameAnalysis(camera_diag::mojom::FrameAnalysisConfigPtr config);
camera_diag::mojom::FrameAnalysisResultPtr StopAndGetResult();
private:
void RunFrameAnalysisOnThread(
camera_diag::mojom::FrameAnalysisConfigPtr config);
void OnStartStreaming(camera_diag::mojom::StartStreamingResultPtr result);
void QueueFrameOnThread(camera_diag::mojom::CameraFramePtr frame);
void PrepareResult();
CameraThread thread_;
CameraServiceController camera_service_controller_;
base::Lock lock_;
std::optional<camera_diag::mojom::FrameAnalysisResultPtr> result_
GUARDED_BY(lock_) = std::nullopt;
scoped_refptr<Future<void>> notify_finish_;
std::vector<std::unique_ptr<FrameAnalyzer>> frame_analyzers_;
int num_analyzed_frames_ = 0;
};
} // namespace cros
#endif // CAMERA_DIAGNOSTICS_CAMERA_DIAGNOSTICS_SESSION_H_