ShaderYUV420.h 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #ifndef _SHADERYUV4210_H_
  2. #define _SHADERYUV4210_H_
  3. #include "ShaderBase.h"
  4. struct Image_YUV420P
  5. {
  6. int width; /* 宽度 */
  7. int height; /* 高度 */
  8. QByteArray yData; /* Y分量数据 */
  9. QByteArray uData; /* U分量数据 */
  10. QByteArray vData; /* V分量数据 */
  11. Image_YUV420P() : width(0), height(0) {}
  12. Image_YUV420P(Image_YUV420P&& other);
  13. Image_YUV420P(const Image_YUV420P& other);
  14. Image_YUV420P& operator=(Image_YUV420P&& other);
  15. Image_YUV420P& operator=(const Image_YUV420P& other);
  16. bool isValid() const;
  17. void clear();
  18. };
  19. class ShaderYUV420 : public ShaderBase
  20. {
  21. public:
  22. ShaderYUV420();
  23. ~ShaderYUV420() override;
  24. /* 初始化形状 */
  25. GLuint initShape() override;
  26. /* 初始化纹理对象 */
  27. bool initTextures() override;
  28. /* 绘制图形 */
  29. void drawShape() override;
  30. /* 刷新一帧 */
  31. bool refreshFrameYUV420(const Image_YUV420P& yuvData);
  32. /* 刷新一帧 */
  33. bool refreshFrameRGBA(const QImage& image, int textureUnit = 0);
  34. private:
  35. /* RGBA转换成YUV420 */
  36. bool convertRGBAToYUV420(const QImage& image, Image_YUV420P& yuvData);
  37. private:
  38. GLuint m_VAO = 0; // 顶点数组对象的ID
  39. GLuint m_VBO = 0; // 顶点缓冲对象的ID
  40. GLuint m_EBO = 0; // 索引缓冲对象的ID
  41. QSize m_lastSize; /* 上一张图片的大小 */
  42. Image_YUV420P m_yuvData; /* YUV420数据 */
  43. QSize m_lastYUVSize; /* 上一张YUV图片的大小 */
  44. const QString m_textureYName = "textureY"; // Y分量纹理名称
  45. const QString m_textureUName = "textureU"; // U分量纹理名称
  46. const QString m_textureVName = "textureV"; // V分量纹理名称
  47. };
  48. #endif // _SHADERYUV4210_H_