#include #include #include "WriterManager.hpp" using namespace std; WriterManager::WriterManager(const map& parameters_type, const string& output_file, uint64_t n_frames): parameters_type(parameters_type), output_file(output_file), n_frames(n_frames), running_flag(true), killed_flag(false), n_received_frames(0), n_written_frames(0), n_lost_frames(0) { #ifdef DEBUG_OUTPUT cout << "[WriterManager::WriterManager] Writer manager for n_frames " << n_frames << endl; #endif } WriterManager::~WriterManager(){} void WriterManager::stop() { #ifdef DEBUG_OUTPUT cout << "[WriterManager::stop] Stopping the writer manager." << endl; #endif running_flag = false; } void WriterManager::kill() { #ifdef DEBUG_OUTPUT cout << "[WriterManager::kills] Killing writer manager." << endl; #endif killed_flag = true; stop(); } string WriterManager::get_status() { if (running_flag) { return "receiving"; } else if (n_received_frames.load() > n_written_frames) { return "writing"; } else if (!are_all_parameters_set()) { return "waiting for parameters"; } else { return "finished"; } } string WriterManager::get_output_file() { return output_file; } map WriterManager::get_statistics() { map result = {{"n_received_frames", n_received_frames.load()}, {"n_written_frames", n_written_frames.load()}, {"n_lost_frames", n_lost_frames.load()}, {"total_expected_frames", n_frames}}; return result; } map WriterManager::get_parameters() { lock_guard lock(parameters_mutex); return parameters; } void WriterManager::set_parameters(const map& new_parameters) { lock_guard lock(parameters_mutex); #ifdef DEBUG_OUTPUT stringstream output_message; output_message << "[WriterManager::set_parameters] Setting parameters: "; #endif for (const auto& parameter : new_parameters) { auto& parameter_name = parameter.first; auto& parameter_value = parameter.second; parameters[parameter_name] = parameter_value; #ifdef DEBUG_OUTPUT output_message << parameter_name << ", "; #endif } #ifdef DEBUG_OUTPUT cout << output_message.str() << endl; #endif } const map& WriterManager::get_parameters_type() { return parameters_type; } bool WriterManager::is_running() { // Take into account n_frames only if it is <> 0. if (n_frames && n_received_frames.load() >= n_frames) { running_flag = false; } return running_flag.load(); } bool WriterManager::is_killed() { return killed_flag.load(); } void WriterManager::received_frame(size_t frame_index) { n_received_frames++; } void WriterManager::written_frame(size_t frame_index) { n_written_frames++; } void WriterManager::lost_frame(size_t frame_index) { n_lost_frames++; } bool WriterManager::are_all_parameters_set() { lock_guard lock(parameters_mutex); for (const auto& parameter : parameters_type) { const auto& parameter_name = parameter.first; if (parameters.count(parameter_name) == 0) { #ifdef DEBUG_OUTPUT cout << "[WriterManager::are_all_parameters_set] Parameter " << parameter_name << " not set." << endl; #endif return false; } } return true; }