From 3f63b2c638c684a70963319925a0f09dd00b265c Mon Sep 17 00:00:00 2001 From: Brenno Date: Sun, 1 Nov 2020 20:02:46 -0300 Subject: [PATCH] Added error message handling for ClipProcessingJob --- src/CVObjectDetection.cpp | 26 ++++++++++++++++++++++++-- src/CVObjectDetection.h | 2 ++ src/CVTracker.cpp | 26 +++++++++++++++++++++----- src/CVTracker.h | 4 +++- src/ClipProcessingJobs.cpp | 16 +++++++++++++++- src/ClipProcessingJobs.h | 5 ++++- src/ProcessingController.h | 21 +++++++++++++++++++++ 7 files changed, 90 insertions(+), 10 deletions(-) diff --git a/src/CVObjectDetection.cpp b/src/CVObjectDetection.cpp index 1ef1d821f..36c628631 100644 --- a/src/CVObjectDetection.cpp +++ b/src/CVObjectDetection.cpp @@ -32,7 +32,6 @@ using namespace openshot; - CVObjectDetection::CVObjectDetection(std::string processInfoJson, ProcessingController &processingController) : processingController(&processingController), processingDevice("CPU"){ SetJson(processInfoJson); @@ -56,6 +55,10 @@ void CVObjectDetection::detectObjectsClip(openshot::Clip &video, size_t _start, video.Open(); + if(error){ + return; + } + // Load names of classes std::ifstream ifs(classesFile.c_str()); std::string line; @@ -381,13 +384,32 @@ void CVObjectDetection::SetJsonValue(const Json::Value root) { processingDevice = (root["processing_device"].asString()); } if (!root["model_configuration"].isNull()){ - modelConfiguration = (root["model_configuration"].asString()); + modelConfiguration = (root["model_configuration"].asString()); + std::ifstream infile(modelConfiguration); + if(!infile.good()){ + processingController->SetError(true, "Incorrect path to model config file"); + error = true; + } + } if (!root["model_weights"].isNull()){ modelWeights= (root["model_weights"].asString()); + std::ifstream infile(modelWeights); + if(!infile.good()){ + processingController->SetError(true, "Incorrect path to model weight file"); + error = true; + } + } if (!root["classes_file"].isNull()){ classesFile = (root["classes_file"].asString()); + + std::ifstream infile(classesFile); + if(!infile.good()){ + processingController->SetError(true, "Incorrect path to class name file"); + error = true; + } + } } diff --git a/src/CVObjectDetection.h b/src/CVObjectDetection.h index 8513b405c..4ca55fc6c 100644 --- a/src/CVObjectDetection.h +++ b/src/CVObjectDetection.h @@ -91,6 +91,8 @@ namespace openshot size_t start; size_t end; + bool error = false; + /// Will handle a Thread safely comutication between ClipProcessingJobs and the processing effect classes ProcessingController *processingController; diff --git a/src/CVTracker.cpp b/src/CVTracker.cpp index 48e84622f..073e07719 100644 --- a/src/CVTracker.cpp +++ b/src/CVTracker.cpp @@ -65,7 +65,6 @@ cv::Ptr CVTracker::selectTracker(std::string trackerType){ void CVTracker::trackClip(openshot::Clip& video, size_t _start, size_t _end, bool process_interval){ video.Open(); - if(!json_interval){ start = _start; end = _end; @@ -79,7 +78,12 @@ void CVTracker::trackClip(openshot::Clip& video, size_t _start, size_t _end, boo start = start + video.Start() * video.Reader()->info.fps.ToInt(); end = video.End() * video.Reader()->info.fps.ToInt(); } - + + if(error){ + return; + } + + processingController->SetError(false, ""); bool trackerInit = false; size_t frame; @@ -274,6 +278,7 @@ void CVTracker::SetJsonValue(const Json::Value root) { if (!root["tracker_type"].isNull()){ trackerType = (root["tracker_type"].asString()); } + if (!root["bbox"].isNull()){ double x = root["bbox"]["x"].asDouble(); double y = root["bbox"]["y"].asDouble(); @@ -282,9 +287,20 @@ void CVTracker::SetJsonValue(const Json::Value root) { cv::Rect2d prev_bbox(x,y,w,h); bbox = prev_bbox; } - if (!root["first_frame"].isNull()){ - start = root["first_frame"].asInt64(); - json_interval = true; + else{ + processingController->SetError(true, "No initial bounding box selected"); + error = true; + } + + if(root.isMember("first_frame")){ + if (!root["first_frame"].isNull()){ + start = root["first_frame"].asInt64(); + json_interval = true; + } + } + else{ + processingController->SetError(true, "No first_frame"); + error = true; } } diff --git a/src/CVTracker.h b/src/CVTracker.h index 7006263d0..8ea723710 100644 --- a/src/CVTracker.h +++ b/src/CVTracker.h @@ -103,10 +103,12 @@ namespace openshot /// Will handle a Thread safely comutication between ClipProcessingJobs and the processing effect classes ProcessingController *processingController; - + bool json_interval; size_t start; size_t end; + + bool error = false; // Initialize the tracker bool initTracker(cv::Mat &frame, size_t frameId); diff --git a/src/ClipProcessingJobs.cpp b/src/ClipProcessingJobs.cpp index 6a4b66898..fb64fd78b 100644 --- a/src/ClipProcessingJobs.cpp +++ b/src/ClipProcessingJobs.cpp @@ -5,7 +5,8 @@ ClipProcessingJobs::ClipProcessingJobs(std::string processingType, std::string p processingType(processingType), processInfoJson(processInfoJson){ } -void ClipProcessingJobs::processClip(Clip& clip){ +void ClipProcessingJobs::processClip(Clip& clip, std::string json){ + processInfoJson = json; // Process clip and save processed data if(processingType == "Stabilizer"){ @@ -83,11 +84,13 @@ void ClipProcessingJobs::stabilizeClip(Clip& clip, ProcessingController& control } } +// Get processing progress while iterating on the clip int ClipProcessingJobs::GetProgress(){ return (int)processingController.GetProgress(); } +// Check if processing finished bool ClipProcessingJobs::IsDone(){ if(processingController.GetFinished()){ @@ -96,6 +99,17 @@ bool ClipProcessingJobs::IsDone(){ return processingController.GetFinished(); } +// stop preprocessing before finishing it void ClipProcessingJobs::CancelProcessing(){ processingController.CancelProcessing(); +} + +// check if there is an error with the config +bool ClipProcessingJobs::GetError(){ + return processingController.GetError(); +} + +// get the error message +std::string ClipProcessingJobs::GetErrorMessage(){ + return processingController.GetErrorMessage(); } \ No newline at end of file diff --git a/src/ClipProcessingJobs.h b/src/ClipProcessingJobs.h index 835b29113..2a34d46e4 100644 --- a/src/ClipProcessingJobs.h +++ b/src/ClipProcessingJobs.h @@ -75,11 +75,14 @@ class ClipProcessingJobs{ // Constructor ClipProcessingJobs(std::string processingType, std::string processInfoJson); // Process clip accordingly to processingType - void processClip(Clip& clip); + void processClip(Clip& clip, std::string json); // Thread related variables and methods int GetProgress(); bool IsDone(); void CancelProcessing(); + bool GetError(); + std::string GetErrorMessage(); + }; \ No newline at end of file diff --git a/src/ProcessingController.h b/src/ProcessingController.h index 6071ee88a..98c77888b 100644 --- a/src/ProcessingController.h +++ b/src/ProcessingController.h @@ -41,10 +41,13 @@ class ProcessingController{ uint processingProgress; bool processingFinished; bool stopProcessing; + bool error = true; + std::string error_message; std::mutex mtxProgress; std::mutex mtxFinished; std::mutex mtxStop; + std::mutex mtxerror; public: @@ -87,6 +90,24 @@ class ProcessingController{ return s; } + void SetError(bool err, std::string message){ + std::lock_guard lck (mtxerror); + error = err; + error_message = message; + } + + bool GetError(){ + std::lock_guard lck (mtxerror); + bool e = error; + return e; + } + + std::string GetErrorMessage(){ + std::lock_guard lck (mtxerror); + std::string message = error_message; + return message; + } + }; #endif \ No newline at end of file