/**
 * @file camera.h
 * @brief 摄像头封装 - 基于全志 MPP 库
 * 
 * 功能:
 * - 初始化 GC2083 MIPI CSI 摄像头
 * - 配置 ISP (Image Signal Processor)
 * - JPEG 硬件编码
 * - 动态调整分辨率和画质
 */

#ifndef CAMERA_H
#define CAMERA_H

#include <cstdint>
#include <string>

// MPP 库头文件 (根据 SDK 实际路径调整)
extern "C" {
#include <mpi_vi.h>
#include <mpi_isp.h>
#include <mpi_venc.h>
}

class Camera {
public:
    Camera();
    ~Camera();
    
    /**
     * @brief 初始化摄像头
     * @return true 成功, false 失败
     */
    bool init();
    
    /**
     * @brief 采集一帧 JPEG 图像
     * @param jpeg_data 输出参数，指向 JPEG 数据的指针
     * @param jpeg_size 输出参数，JPEG 数据大小（字节）
     * @return true 成功, false 失败
     * @note 调用后必须使用 release_frame() 释放
     */
    bool capture_frame(uint8_t** jpeg_data, size_t* jpeg_size);
    
    /**
     * @brief 释放帧缓冲
     * @param jpeg_data capture_frame() 返回的指针
     */
    void release_frame(uint8_t* jpeg_data);
    
    /**
     * @brief 设置分辨率
     * @param size "VGA" / "SVGA" / "XGA" / "SXGA"
     * @return true 成功, false 失败
     */
    bool set_framesize(const std::string& size);
    
    /**
     * @brief 设置 JPEG 压缩质量
     * @param quality 5-40 (数值越小越清晰)
     */
    void set_quality(int quality);
    
    /**
     * @brief 获取当前 FPS 统计
     */
    float get_fps() const { return m_fps; }
    
    /**
     * @brief 关闭摄像头（支持错误恢复后重新 init）
     * @note Day 11 新增：用于错误恢复
     */
    void deinit();

private:
    // MPP 句柄
    VI_DEV m_vi_dev;
    VI_CHN m_vi_chn;
    ISP_DEV m_isp_dev;
    VENC_CHN m_venc_chn;
    
    // 配置参数
    int m_width;
    int m_height;
    int m_quality;
    
    // 性能统计
    float m_fps;
    uint64_t m_frame_count;
    uint64_t m_last_time;
    
    // 内部方法
    bool init_vi();   // Video Input
    bool init_isp();  // Image Signal Processor
    bool init_venc(); // Video Encoder
    
    void update_fps_stats();
};

#endif // CAMERA_H
