#ifndef AV_PLAYER_VIDEO_RENDERER_H #define AV_PLAYER_VIDEO_RENDERER_H #include #include #include #include #include #include #include extern "C" { #include #include #include } #include "../base/media_common.h" namespace av { namespace player { /** * 视频渲染器类 /** * 负责将解码后的视频帧渲染到Qt控件上 */ class VideoRenderer : public QLabel { Q_OBJECT public: explicit VideoRenderer(QWidget* parent = nullptr); ~VideoRenderer(); /** * 初始化视频渲染器 * @param width 视频宽度 * @param height 视频高度 * @param pixelFormat 像素格式 * @return 是否成功 */ bool initialize(int width, int height, AVPixelFormat pixelFormat); /** * 渲染视频帧 * @param frame 视频帧 * @return 是否成功 */ bool renderFrame(const AVFramePtr& frame); /** * 清空显示 */ void clear(); /** * 设置保持宽高比 * @param keepAspectRatio 是否保持宽高比 */ void setKeepAspectRatio(bool keepAspectRatio); /** * 获取是否保持宽高比 */ bool getKeepAspectRatio() const; /** * 设置背景颜色 * @param color 背景颜色 */ void setBackgroundColor(const QColor& color); /** * 获取视频尺寸 */ QSize getVideoSize() const; /** * 获取显示尺寸 */ QSize getDisplaySize() const; /** * 是否已初始化 */ bool isInitialized() const; protected: void paintEvent(QPaintEvent* event) override; void resizeEvent(QResizeEvent* event) override; private slots: void updateDisplay(); private: /** * 初始化图像转换器 */ bool initConverter(); /** * 清理图像转换器 */ void cleanupConverter(); /** * 转换视频帧为QImage */ QImage convertFrameToImage(const AVFramePtr& frame); /** * 计算显示矩形 */ QRect calculateDisplayRect() const; /** * 缩放图像 */ QPixmap scaleImage(const QImage& image) const; private: // 视频参数 int m_videoWidth; int m_videoHeight; AVPixelFormat m_inputFormat; // 图像转换器 SwsContext* m_swsContext; uint8_t* m_rgbBuffer; int m_rgbBufferSize; // 显示相关 QPixmap m_currentPixmap; QColor m_backgroundColor; bool m_keepAspectRatio; // 状态 std::atomic m_initialized; // 更新定时器 QTimer* m_updateTimer; mutable QMutex m_mutex; }; } // namespace player } // namespace av #endif // AV_PLAYER_VIDEO_RENDERER_H