#ifndef WEBRTCPUSH_HW_SCALER_H
#define WEBRTCPUSH_HW_SCALER_H

// RGA 硬件缩放封装 (RV1106)
//   将 sensor 原始分辨率 (例如 SC3336 2304x1296) 缩放到目标分辨率 (例如 1280x720)
//   支持格式转换: NV12 -> NV12, SBGGR10/NV12 -> NV12 等
//
// 注意: 这是纯缩放 (无裁剪), 保持宽高比的 letterbox 模式由调用方计算 src/dst rect 决定,
//       当前实现是直接缩放整个源图到目标尺寸 (拉伸), 因为 SC3336 2304x1296 与 1280x720
//       比例相近 (16:9.0 vs 16:9), 视觉差异可忽略. 如需 letterbox 可扩展接口.

#include <cstdint>
#include <cstddef>
#include <memory>

namespace webrtcpush {

enum class PixelFmt {
    NV12,        // YUV420 semi-planar (RV1106 MPP 默认)
    SBGGR10,     // 10-bit Bayer BGGR (SC3336 sensor 原始输出)
    YUYV,
};

struct ScalerCfg {
    int       src_w;
    int       src_h;
    PixelFmt  src_fmt   = PixelFmt::NV12;
    int       src_hor_stride = 0;             // 0 = ALIGN16(src_w)
    int       src_ver_stride = 0;             // 0 = ALIGN16(src_h)
    int       dst_w;
    int       dst_h;
    PixelFmt  dst_fmt   = PixelFmt::NV12;     // MPP 编码器要求 NV12
    int       dst_hor_stride = 0;             // 0 = 自动 ALIGN16(dst_w)
    int       dst_ver_stride = 0;
};

class HwScaler {
public:
    explicit HwScaler(const ScalerCfg &cfg);
    ~HwScaler();

    bool valid() const;

    // RV1106 RGA 无 IOMMU，输入输出由缩放器使用连续 CMA DMA-BUF 分配。
    uint8_t *src_data() const;
    uint8_t *dst_data() const;
    size_t src_frame_size() const;

    // 将 src_data() 中的 NV12 缩放到 dst_data()；返回 0 成功。
    int scale();

    void get_dst_stride(int *hs, int *vs) const;
    size_t dst_frame_size() const;     // NV12: hs*vs*3/2

private:
    struct Impl;
    std::unique_ptr<Impl> impl_;
};

} // namespace webrtcpush

#endif // WEBRTCPUSH_HW_SCALER_H
