blob: 5684951bb565642579bf4262708dbebe579e16b9 [file] [log] [blame]
// Copyright 2019 The Fuchsia 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 "stats-mgr.h"
namespace camera {
int StatsManager::FrameProcessingThread() {
zxlogf(INFO, "%s start\n", __func__);
while (running_.load()) {
sync_completion_wait(&frame_processing_signal_, ZX_TIME_INFINITE);
// TODO(braval): Start processing the frame here
// Reset the signal
sync_completion_reset(&frame_processing_signal_);
}
return ZX_OK;
}
fbl::unique_ptr<StatsManager> StatsManager::Create(ddk::MmioView isp_mmio,
ddk::MmioView isp_mmio_local,
ddk::CameraSensorProtocolClient camera_sensor,
sync_completion_t frame_processing_signal) {
// First initialize all the modules
fbl::AllocChecker ac;
auto sensor = camera::Sensor::Create(isp_mmio, isp_mmio_local, camera_sensor);
if (sensor == nullptr) {
zxlogf(ERROR, "%s: Unable to start Sensor Module \n", __func__);
return nullptr;
}
auto worker_thunk = [](void* arg) -> int {
return reinterpret_cast<StatsManager*>(arg)->FrameProcessingThread();
};
// Once all modules are initialized, create the StatsManger instance
auto statsmanager = fbl::make_unique_checked<StatsManager>(&ac,
std::move(sensor),
frame_processing_signal);
if (!ac.check()) {
zxlogf(ERROR, "%s: Unable to start StatsManager \n", __func__);
return nullptr;
}
int ret = thrd_create_with_name(&statsmanager->frame_processing_thread_,
worker_thunk,
reinterpret_cast<void*>(statsmanager.get()),
"frame_processing thread");
ZX_DEBUG_ASSERT(ret == thrd_success);
statsmanager->running_.store(true);
return statsmanager;
}
StatsManager::~StatsManager() {
running_.store(false);
thrd_join(frame_processing_thread_, NULL);
}
} // namespace camera