1 #ifndef OPENPOSE_WRAPPER_WRAPPER_HPP
2 #define OPENPOSE_WRAPPER_WRAPPER_HPP
31 template<
typename TDatums = std::vector<Datum>,
32 typename TDatumsSP = std::shared_ptr<TDatums>,
33 typename TWorker = std::shared_ptr<Worker<TDatumsSP>>>
66 void setWorker(
const WorkerType workerType,
const TWorker& worker,
const bool workerOnNewThread =
true);
154 bool tryPush(
const TDatumsSP& tDatums);
171 bool tryPop(TDatumsSP& tDatums);
196 bool mMultiThreadEnabled;
205 std::array<bool, int(WorkerType::Size)> mUserWsOnNewThread;
223 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
225 mThreadManagerMode{threadManagerMode},
226 mThreadManager{threadManagerMode},
227 mMultiThreadEnabled{
true}
231 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
238 mThreadManager.reset();
240 for (
auto& userW : mUserWs)
243 catch (
const std::exception& e)
245 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
249 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
254 mMultiThreadEnabled =
false;
256 catch (
const std::exception& e)
258 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
262 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
264 const WorkerType workerType,
const TWorker& worker,
const bool workerOnNewThread)
269 if (worker ==
nullptr)
270 error(
"Your worker is a nullptr.", __LINE__, __FILE__, __FUNCTION__);
272 mUserWs[int(workerType)].clear();
273 mUserWs[int(workerType)].emplace_back(worker);
274 mUserWsOnNewThread[int(workerType)] = workerOnNewThread;
276 catch (
const std::exception& e)
278 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
282 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
287 mWrapperStructPose = wrapperStructPose;
289 catch (
const std::exception& e)
291 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
295 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
300 mWrapperStructFace = wrapperStructFace;
302 catch (
const std::exception& e)
304 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
308 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
313 mWrapperStructHand = wrapperStructHand;
315 catch (
const std::exception& e)
317 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
321 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
326 mWrapperStructExtra = wrapperStructExtra;
328 catch (
const std::exception& e)
330 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
334 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
339 mWrapperStructInput = wrapperStructInput;
341 catch (
const std::exception& e)
343 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
347 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
352 mWrapperStructOutput = wrapperStructOutput;
354 catch (
const std::exception& e)
356 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
360 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
365 configureThreadManager<TDatums, TDatumsSP, TWorker>(
366 mThreadManager, mMultiThreadEnabled, mThreadManagerMode, mWrapperStructPose, mWrapperStructFace,
367 mWrapperStructHand, mWrapperStructExtra, mWrapperStructInput, mWrapperStructOutput,
368 mUserWs, mUserWsOnNewThread);
370 mThreadManager.exec();
372 catch (
const std::exception& e)
374 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
378 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
383 configureThreadManager<TDatums, TDatumsSP, TWorker>(
384 mThreadManager, mMultiThreadEnabled, mThreadManagerMode, mWrapperStructPose, mWrapperStructFace,
385 mWrapperStructHand, mWrapperStructExtra, mWrapperStructInput, mWrapperStructOutput,
386 mUserWs, mUserWsOnNewThread);
388 mThreadManager.start();
390 catch (
const std::exception& e)
392 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
396 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
401 mThreadManager.stop();
403 catch (
const std::exception& e)
405 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
409 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
414 return mThreadManager.isRunning();
416 catch (
const std::exception& e)
418 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
423 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
429 error(
"Emplace cannot be called if an input worker was already selected.",
430 __LINE__, __FUNCTION__, __FILE__);
431 return mThreadManager.tryEmplace(tDatums);
433 catch (
const std::exception& e)
435 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
440 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
446 error(
"Emplace cannot be called if an input worker was already selected.",
447 __LINE__, __FUNCTION__, __FILE__);
448 return mThreadManager.waitAndEmplace(tDatums);
450 catch (
const std::exception& e)
452 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
457 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
463 error(
"Push cannot be called if an input worker was already selected.",
464 __LINE__, __FUNCTION__, __FILE__);
465 return mThreadManager.tryPush(tDatums);
467 catch (
const std::exception& e)
469 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
474 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
480 error(
"Push cannot be called if an input worker was already selected.",
481 __LINE__, __FUNCTION__, __FILE__);
482 return mThreadManager.waitAndPush(tDatums);
484 catch (
const std::exception& e)
486 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
491 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
497 error(
"Pop cannot be called if an output worker was already selected.",
498 __LINE__, __FUNCTION__, __FILE__);
499 return mThreadManager.tryPop(tDatums);
501 catch (
const std::exception& e)
503 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
508 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
514 error(
"Pop cannot be called if an output worker was already selected.",
515 __LINE__, __FUNCTION__, __FILE__);
516 return mThreadManager.waitAndPop(tDatums);
518 catch (
const std::exception& e)
520 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
525 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
531 if (waitAndEmplace(tDatums))
532 return waitAndPop(tDatums);
535 catch (
const std::exception& e)
537 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
542 template<
typename TDatums,
typename TDatumsSP,
typename TWorker>
548 auto datumsPtr = std::make_shared<TDatums>();
549 datumsPtr->emplace_back();
550 auto& datum = datumsPtr->at(0);
552 datum.cvInputData = cvMat;
554 emplaceAndPop(datumsPtr);
558 catch (
const std::exception& e)
560 error(e.what(), __LINE__, __FUNCTION__, __FILE__);
568 #endif // OPENPOSE_WRAPPER_WRAPPER_HPP
void setWorker(const WorkerType workerType, const TWorker &worker, const bool workerOnNewThread=true)
Definition: wrapper.hpp:263
WrapperT< DATUM_BASE_NO_PTR > Wrapper
Definition: wrapper.hpp:212
Definition: wrapperStructPose.hpp:17
bool tryPush(const TDatumsSP &tDatums)
Definition: wrapper.hpp:458
void start()
Definition: wrapper.hpp:379
bool waitAndEmplace(TDatumsSP &tDatums)
Definition: wrapper.hpp:441
Definition: wrapperStructFace.hpp:15
void configure(const WrapperStructPose &wrapperStructPose)
Definition: wrapper.hpp:283
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:397
bool isRunning() const
Definition: wrapper.hpp:410
bool waitAndPop(TDatumsSP &tDatums)
Definition: wrapper.hpp:509
WrapperT(const ThreadManagerMode threadManagerMode=ThreadManagerMode::Synchronous)
Definition: wrapper.hpp:224
WorkerType
Definition: enumClasses.hpp:6
Definition: wrapper.hpp:34
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:361
Definition: wrapperStructHand.hpp:15
bool tryEmplace(TDatumsSP &tDatums)
Definition: wrapper.hpp:424
bool tryPop(TDatumsSP &tDatums)
Definition: wrapper.hpp:492
virtual ~WrapperT()
Definition: wrapper.hpp:232
ThreadManagerMode
Definition: enumClasses.hpp:9
bool emplaceAndPop(TDatumsSP &tDatums)
Definition: wrapper.hpp:526
void disableMultiThreading()
Definition: wrapper.hpp:250
Definition: wrapperStructOutput.hpp:14
bool waitAndPush(const TDatumsSP &tDatums)
Definition: wrapper.hpp:475