1 #ifndef OPENPOSE_WRAPPER_WRAPPER_HPP
2 #define OPENPOSE_WRAPPER_WRAPPER_HPP
32 template<
typename TDatums = std::vector<Datum>,
33 typename TDatumsSP = std::shared_ptr<TDatums>,
34 typename TWorker = std::shared_ptr<Worker<TDatumsSP>>>
67 void setWorker(
const WorkerType workerType,
const TWorker& worker,
const bool workerOnNewThread =
true);
160 bool tryPush(
const TDatumsSP& tDatums);
177 bool tryPop(TDatumsSP& tDatums);
202 bool mMultiThreadEnabled;
212 std::array<bool, int(WorkerType::Size)> mUserWsOnNewThread;
230 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
232 mThreadManagerMode{threadManagerMode},
233 mThreadManager{threadManagerMode},
234 mMultiThreadEnabled{
true}
238 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
245 mThreadManager.reset();
247 for (
auto& userW : mUserWs)
250 catch (
const std::exception& e)
252 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
256 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
261 mMultiThreadEnabled =
false;
263 catch (
const std::exception& e)
265 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
269 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
271 const WorkerType workerType,
const TWorker& worker,
const bool workerOnNewThread)
276 if (worker ==
nullptr)
277 error(
"Your worker is a nullptr.", __LINE__, __FILE__, __FUNCTION__);
279 mUserWs[int(workerType)].clear();
280 mUserWs[int(workerType)].emplace_back(worker);
281 mUserWsOnNewThread[int(workerType)] = workerOnNewThread;
283 catch (
const std::exception& e)
285 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
289 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
294 mWrapperStructPose = wrapperStructPose;
296 catch (
const std::exception& e)
298 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
302 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
307 mWrapperStructFace = wrapperStructFace;
309 catch (
const std::exception& e)
311 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
315 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
320 mWrapperStructHand = wrapperStructHand;
322 catch (
const std::exception& e)
324 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
328 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
333 mWrapperStructExtra = wrapperStructExtra;
335 catch (
const std::exception& e)
337 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
341 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
346 mWrapperStructInput = wrapperStructInput;
348 catch (
const std::exception& e)
350 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
354 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
359 mWrapperStructOutput = wrapperStructOutput;
361 catch (
const std::exception& e)
363 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
367 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
372 mWrapperStructGui = wrapperStructGui;
374 catch (
const std::exception& e)
376 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
380 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
385 configureThreadManager<TDatums, TDatumsSP, TWorker>(
386 mThreadManager, mMultiThreadEnabled, mThreadManagerMode, mWrapperStructPose, mWrapperStructFace,
387 mWrapperStructHand, mWrapperStructExtra, mWrapperStructInput, mWrapperStructOutput, mWrapperStructGui,
388 mUserWs, mUserWsOnNewThread);
390 mThreadManager.exec();
392 catch (
const std::exception& e)
394 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
398 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
403 configureThreadManager<TDatums, TDatumsSP, TWorker>(
404 mThreadManager, mMultiThreadEnabled, mThreadManagerMode, mWrapperStructPose, mWrapperStructFace,
405 mWrapperStructHand, mWrapperStructExtra, mWrapperStructInput, mWrapperStructOutput, mWrapperStructGui,
406 mUserWs, mUserWsOnNewThread);
408 mThreadManager.start();
410 catch (
const std::exception& e)
412 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
416 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
421 mThreadManager.stop();
423 catch (
const std::exception& e)
425 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
429 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
434 return mThreadManager.isRunning();
436 catch (
const std::exception& e)
438 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
443 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
449 error(
"Emplace cannot be called if an input worker was already selected.",
450 __LINE__, __FUNCTION__, __FILE__);
451 return mThreadManager.tryEmplace(tDatums);
453 catch (
const std::exception& e)
455 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
460 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
466 error(
"Emplace cannot be called if an input worker was already selected.",
467 __LINE__, __FUNCTION__, __FILE__);
468 return mThreadManager.waitAndEmplace(tDatums);
470 catch (
const std::exception& e)
472 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
477 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
483 error(
"Push cannot be called if an input worker was already selected.",
484 __LINE__, __FUNCTION__, __FILE__);
485 return mThreadManager.tryPush(tDatums);
487 catch (
const std::exception& e)
489 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
494 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
500 error(
"Push cannot be called if an input worker was already selected.",
501 __LINE__, __FUNCTION__, __FILE__);
502 return mThreadManager.waitAndPush(tDatums);
504 catch (
const std::exception& e)
506 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
511 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
517 error(
"Pop cannot be called if an output worker was already selected.",
518 __LINE__, __FUNCTION__, __FILE__);
519 return mThreadManager.tryPop(tDatums);
521 catch (
const std::exception& e)
523 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
528 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
534 error(
"Pop cannot be called if an output worker was already selected.",
535 __LINE__, __FUNCTION__, __FILE__);
536 return mThreadManager.waitAndPop(tDatums);
538 catch (
const std::exception& e)
540 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
545 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
551 if (waitAndEmplace(tDatums))
552 return waitAndPop(tDatums);
555 catch (
const std::exception& e)
557 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
562 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
568 auto datumsPtr = std::make_shared<TDatums>();
569 datumsPtr->emplace_back();
570 auto& datum = datumsPtr->at(0);
572 datum.cvInputData = cvMat;
574 emplaceAndPop(datumsPtr);
578 catch (
const std::exception& e)
580 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
588 #endif // OPENPOSE_WRAPPER_WRAPPER_HPP
void setWorker(const WorkerType workerType, const TWorker &worker, const bool workerOnNewThread=true)
Definition: wrapper.hpp:270
WrapperT< DATUM_BASE_NO_PTR > Wrapper
Definition: wrapper.hpp:219
Definition: wrapperStructPose.hpp:17
bool tryPush(const TDatumsSP &tDatums)
Definition: wrapper.hpp:478
void start()
Definition: wrapper.hpp:399
bool waitAndEmplace(TDatumsSP &tDatums)
Definition: wrapper.hpp:461
Definition: wrapperStructFace.hpp:15
void configure(const WrapperStructPose &wrapperStructPose)
Definition: wrapper.hpp:290
OP_API void error(const std::string &message, const int line=-1, const std::string &function="", const std::string &file="")
void stop()
Definition: wrapper.hpp:417
bool isRunning() const
Definition: wrapper.hpp:430
bool waitAndPop(TDatumsSP &tDatums)
Definition: wrapper.hpp:529
WrapperT(const ThreadManagerMode threadManagerMode=ThreadManagerMode::Synchronous)
Definition: wrapper.hpp:231
Definition: wrapperStructGui.hpp:12
WorkerType
Definition: enumClasses.hpp:6
Definition: wrapper.hpp:35
OP_API void log(const std::string &message, const Priority priority=Priority::Max, const int line=-1, const std::string &function="", const std::string &file="")
void exec()
Definition: wrapper.hpp:381
Definition: wrapperStructHand.hpp:15
bool tryEmplace(TDatumsSP &tDatums)
Definition: wrapper.hpp:444
bool tryPop(TDatumsSP &tDatums)
Definition: wrapper.hpp:512
virtual ~WrapperT()
Definition: wrapper.hpp:239
ThreadManagerMode
Definition: enumClasses.hpp:9
bool emplaceAndPop(TDatumsSP &tDatums)
Definition: wrapper.hpp:546
void disableMultiThreading()
Definition: wrapper.hpp:257
Definition: wrapperStructOutput.hpp:13
bool waitAndPush(const TDatumsSP &tDatums)
Definition: wrapper.hpp:495