MppManager.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. // test
  36. ImageTest::HighResolutionTimer timer;
  37. while (m_threadSwitch)
  38. {
  39. DataPackagePtr dataPackage = nullptr;
  40. if (DataManager::getInstance().popData("uvc" + std::to_string(index), dataPackage))
  41. {
  42. decoder.decodeJpegToRgb((const char *)dataPackage->pJpegData, dataPackage->nJpegSize, (unsigned char **)&dataPackage->pRGBData, &width, &height);
  43. if (width != dataPackage->nWidth || height != dataPackage->nHeight)
  44. {
  45. std::cerr << "the decode result is different from defined !!" << std::endl;
  46. }
  47. // color transfer
  48. resize_image(dataPackage->pRGBData, width, height, dataPackage->pResizeData, dataPackage->nResizeWidth, dataPackage->nResizeHeight);
  49. // ImageTest::saveImageFromData((unsigned char *)dataPackage->pResizeData, dataPackage->nResizeWidth, dataPackage->nResizeHeight);
  50. // push data to the next pipe
  51. DataManager::getInstance().pushData("resized" + std::to_string(index), dataPackage);
  52. }
  53. // delay 10ms
  54. std::this_thread::sleep_for(std::chrono::milliseconds(10));
  55. }
  56. // 释放资源
  57. if (rgbData)
  58. {
  59. delete[] rgbData;
  60. }
  61. DataManager::getInstance().eraseDataPipe("mpp" + std::to_string(index));
  62. }