MppManager.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #include "MppManager.h"
  2. #include "../DataManager/DataManager.h"
  3. #include "../DataManager/DataPackage.h"
  4. #include "../RGAColorTransfer/RgaColorTransfer.h"
  5. #include <thread>
  6. #include "../ImageTest/ImageTest.h"
  7. // ...existing code...
  8. MppManager::~MppManager()
  9. {
  10. for (auto &thread : m_threads)
  11. {
  12. m_threadSwitch = false;
  13. if (thread.joinable())
  14. {
  15. thread.join();
  16. }
  17. }
  18. }
  19. void MppManager::addMppDecode()
  20. {
  21. m_threads.emplace_back(&MppManager::decodeThread, this);
  22. m_threads.emplace_back(&MppManager::decodeThread, this);
  23. m_threads.emplace_back(&MppManager::decodeThread, this);
  24. }
  25. void MppManager::decodeThread()
  26. {
  27. MppDecoder decoder;
  28. decoder.init();
  29. RgaColorTransfer colorTransfer;
  30. unsigned char *rgbData = nullptr;
  31. int width = 0, height = 0;
  32. m_threadSwitch = true;
  33. int index = decoder.getDecodeIndex();
  34. DataManager::getInstance().addDataPipe<DataPackagePtr>("resized" + std::to_string(index));
  35. while (m_threadSwitch)
  36. {
  37. DataPackagePtr dataPackage = nullptr;
  38. if (DataManager::getInstance().popData("uvc" + std::to_string(index), dataPackage))
  39. {
  40. decoder.decodeJpegToRgb((const char *)dataPackage->pJpegData, dataPackage->nJpegSize, (unsigned char **)&dataPackage->pRGBData, &width, &height);
  41. if (width != dataPackage->nWidth || height != dataPackage->nHeight)
  42. {
  43. std::cerr << "the decode result is different from defined !!" << std::endl;
  44. }
  45. // color transfer
  46. resize_image(dataPackage->pRGBData, width, height, dataPackage->pResizeData, dataPackage->nResizeWidth, dataPackage->nResizeHeight);
  47. // ImageTest::saveImageFromData((unsigned char *)dataPackage->pResizeData, dataPackage->nResizeWidth, dataPackage->nResizeHeight);
  48. // push data to the next pipe
  49. DataManager::getInstance().pushData("resized" + std::to_string(index), dataPackage);
  50. }
  51. // delay 10ms
  52. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  53. }
  54. // 释放资源
  55. if (rgbData)
  56. {
  57. delete[] rgbData;
  58. }
  59. DataManager::getInstance().eraseDataPipe("mpp" + std::to_string(index));
  60. }