PlayerWidget.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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 = yuvData.width * yuvData.height;
  58. int chromaSize = frameSize / 4;
  59. QImage image_rgb(width, height, QImage::Format_RGB888);
  60. for (int y = 0; y < height; ++y) {
  61. for (int x = 0; x < width; ++x) {
  62. int yIndex = y * width + x;
  63. int uIndex = (y / 2) * (width / 2) + (x / 2);
  64. int vIndex = uIndex;
  65. uint8_t Y = yuvData.yData.at(yIndex);
  66. uint8_t U = yuvData.uData[uIndex];
  67. uint8_t V = yuvData.vData[vIndex];
  68. int C = Y - 16;
  69. int D = U - 128;
  70. int E = V - 128;
  71. int R = (298 * C + 409 * E + 128) >> 8;
  72. int G = (298 * C - 100 * D - 208 * E + 128) >> 8;
  73. int B = (298 * C + 516 * D + 128) >> 8;
  74. R = std::clamp(R, 0, 255);
  75. G = std::clamp(G, 0, 255);
  76. B = std::clamp(B, 0, 255);
  77. image_rgb.setPixel(x, y, qRgb(R, G, B));
  78. }
  79. }
  80. image = image_rgb;
  81. }