#ifndef WEBRTCPUSH_MPP_ENCODER_H
#define WEBRTCPUSH_MPP_ENCODER_H

#include <stdint.h>
#include <stddef.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef struct mpp_encoder mpp_encoder_t;

/**
 * 编码后 H.264 NAL 单元回调。
 * @param data      NAL 数据 (含 00 00 00 01 起始码 或 Annex-B 裸流)
 * @param len       数据长度
 * @param pts_us    时间戳 (微秒)
 * @param is_keyframe 是否关键帧 (IDR)
 * @param userdata  用户数据
 */
typedef void (*nalu_callback_t)(const uint8_t *data, size_t len,
                               uint64_t pts_us, int is_keyframe, void *userdata);

typedef struct {
    int width;
    int height;
    int fps;
    int bitrate_kbps;       /* 目标码率 kbps */
    int gop;                 /* GOP 长度 (帧) */
    const char *profile;     /* "baseline" | "main" | "high" */
} mpp_encoder_cfg_t;

/**
 * 创建 RV1106 MPP H.264 硬件编码器。
 * 成功返回句柄, 失败返回 NULL。
 * 首次启动会先回调输出 SPS+PPS 头。
 */
mpp_encoder_t *mpp_encoder_create(const mpp_encoder_cfg_t *cfg);

void mpp_encoder_destroy(mpp_encoder_t *e);

/** 设置编码输出回调 */
void mpp_encoder_set_nalu_callback(mpp_encoder_t *e, nalu_callback_t cb, void *userdata);

/**
 * 编码一帧 NV12 图像。
 * @param frame     NV12 数据 (尺寸需为 hor_stride*ver_stride*3/2)
 * @param size       数据大小
 * @param pts_us    时间戳 (微秒)
 * @return 0 成功, 负数失败
 */
int mpp_encoder_encode(mpp_encoder_t *e, const uint8_t *frame, size_t size, uint64_t pts_us);

/** 请求立即输出一个 IDR 帧 */
int mpp_encoder_request_idr(mpp_encoder_t *e);

/**
 * 动态调整目标码率 (用于根据网络状况自适应).
 * @param kbps 新的目标码率 kbps
 * @return 0 成功, 负数失败
 */
int mpp_encoder_set_bitrate(mpp_encoder_t *e, int kbps);

/** 获取内部对齐后的输入 stride (供上层准备 buffer) */
void mpp_encoder_get_stride(mpp_encoder_t *e, int *hor_stride, int *ver_stride);

#ifdef __cplusplus
}
#endif
#endif
