PlayerWidget.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "PlayerWidget.h"
  2. #include <algorithm>
  3. #include <QResizeEvent>
  4. #include <QPainter>
  5. PlayerWidget::PlayerWidget(QWidget *parent)
  6. {
  7. m_windowSize = QSize(0, 0);
  8. }
  9. PlayerWidget::~PlayerWidget()
  10. {
  11. }
  12. /* 刷新一帧 */
  13. void PlayerWidget::updateFrame(Image_YUV420& yuvData)
  14. {
  15. YUV420ToQImage(yuvData, m_image);
  16. if(m_windowSize.width() == 0 || m_windowSize.height() == 0)
  17. {
  18. m_imageWidth = yuvData.width;
  19. m_imageHeight = yuvData.height;
  20. }
  21. update();
  22. }
  23. void PlayerWidget::updateFrame(Image_QImage& imageData)
  24. {
  25. if(m_windowSize.width() == 0 || m_windowSize.height() == 0)
  26. {
  27. m_imageWidth = imageData.width;
  28. m_imageHeight = imageData.height;
  29. }
  30. m_image = std::move(imageData.image);
  31. update();
  32. }
  33. /* 绘画事件 */
  34. void PlayerWidget::paintEvent(QPaintEvent *event)
  35. {
  36. // SPDLOG_TRACE("开始绘制画面...");
  37. /* 对图像进行缩放 */
  38. if(m_windowSize.width() != m_imageWidth || m_windowSize.height() != m_imageHeight)
  39. {
  40. m_image = m_image.scaled(m_windowSize.width(), m_windowSize.height(), Qt::KeepAspectRatio, Qt::SmoothTransformation);
  41. }
  42. QPainter painter(this);
  43. painter.drawImage(0, 0, m_image);
  44. }
  45. /* 重新设置大小事件 */
  46. void PlayerWidget::resizeEvent(QResizeEvent *event)
  47. {
  48. m_windowSize.setWidth(event->size().width());
  49. m_windowSize.setHeight(event->size().height());
  50. QWidget::resizeEvent(event);
  51. }
  52. /* YUV420转QImage */
  53. void PlayerWidget::YUV420ToQImage(Image_YUV420& yuvData, QImage& image)
  54. {
  55. int width = yuvData.width;
  56. int height = yuvData.height;
  57. int frameSize = width * height;
  58. int chromaWidth = (width + 1) / 2;
  59. int chromaHeight = (height + 1) / 2;
  60. int chromaSize = chromaWidth * chromaHeight;
  61. QImage image_rgb(width, height, QImage::Format_RGB888);
  62. for (int y = 0; y < height; ++y) {
  63. for (int x = 0; x < width; ++x) {
  64. int yIndex = y * width + x;
  65. int uIndex = (y / 2) * chromaWidth + (x / 2);
  66. int vIndex = uIndex;
  67. uint8_t Y = 0;
  68. uint8_t U = 128;
  69. uint8_t V = 128;
  70. if (yIndex >= 0 && yIndex < yuvData.yData.size()) {
  71. Y = static_cast<uint8_t>(static_cast<unsigned char>(yuvData.yData.at(yIndex)));
  72. }
  73. if (uIndex >= 0 && uIndex < yuvData.uData.size()) {
  74. U = static_cast<uint8_t>(static_cast<unsigned char>(yuvData.uData.at(uIndex)));
  75. }
  76. if (vIndex >= 0 && vIndex < yuvData.vData.size()) {
  77. V = static_cast<uint8_t>(static_cast<unsigned char>(yuvData.vData.at(vIndex)));
  78. }
  79. int C = Y - 16;
  80. int D = U - 128;
  81. int E = V - 128;
  82. int R = (298 * C + 409 * E + 128) >> 8;
  83. int G = (298 * C - 100 * D - 208 * E + 128) >> 8;
  84. int B = (298 * C + 516 * D + 128) >> 8;
  85. R = std::clamp(R, 0, 255);
  86. G = std::clamp(G, 0, 255);
  87. B = std::clamp(B, 0, 255);
  88. image_rgb.setPixel(x, y, qRgb(R, G, B));
  89. }
  90. }
  91. image = image_rgb;
  92. }