64 lines
2.0 KiB
C
64 lines
2.0 KiB
C
|
|
#ifndef DRONESCREW_MJPEG_ENCODER_H
|
|||
|
|
#define DRONESCREW_MJPEG_ENCODER_H
|
|||
|
|
|
|||
|
|
#include <cstdint>
|
|||
|
|
#include <cstddef>
|
|||
|
|
#include <vector>
|
|||
|
|
#include <mutex>
|
|||
|
|
|
|||
|
|
// 基于 Rockchip MPP 硬件 MJPEG 的单帧编码器:Mono8 → JPEG 字节。
|
|||
|
|
// 用于检测/图传时把裸 Mono8 帧压缩后再走 ZMQ,显著降低网络带宽。
|
|||
|
|
//
|
|||
|
|
// 仅在 Linux/RK3588 平台真正可用;其它平台 EncodeMono8 始终返回 false,
|
|||
|
|
// 调用方据此回退为发送原始数据。
|
|||
|
|
//
|
|||
|
|
// 内部按 (width,height) 懒初始化/重建编码器;EncodeMono8 线程安全。
|
|||
|
|
class MppMjpegEncoder
|
|||
|
|
{
|
|||
|
|
public:
|
|||
|
|
MppMjpegEncoder() = default;
|
|||
|
|
~MppMjpegEncoder();
|
|||
|
|
|
|||
|
|
MppMjpegEncoder(const MppMjpegEncoder&) = delete;
|
|||
|
|
MppMjpegEncoder& operator=(const MppMjpegEncoder&) = delete;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 将一帧 Mono8(紧凑排列,stride=width)编码为整张 JPEG
|
|||
|
|
* @param mono Mono8 数据指针
|
|||
|
|
* @param monoSize 数据字节数(须 >= width*height)
|
|||
|
|
* @param width 图像宽
|
|||
|
|
* @param height 图像高
|
|||
|
|
* @param jpeg 输出:完整 JPEG 字节
|
|||
|
|
* @return true 成功;false 失败(调用方应回退原始数据)
|
|||
|
|
*/
|
|||
|
|
bool EncodeMono8(const uint8_t* mono, size_t monoSize,
|
|||
|
|
int width, int height,
|
|||
|
|
std::vector<uint8_t>& jpeg);
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @brief 设置 JPEG 质量因子(1~99,越大越清晰、体积越大)。
|
|||
|
|
* 改变后下一帧会自动重建编码器。默认 85(接近视觉无损,兼顾带宽)。
|
|||
|
|
*/
|
|||
|
|
void SetQuality(int q);
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
#if defined(__linux__)
|
|||
|
|
bool ensureInited(int width, int height);
|
|||
|
|
void release();
|
|||
|
|
|
|||
|
|
void* m_ctx{nullptr}; // MppCtx
|
|||
|
|
void* m_mpi{nullptr}; // MppApi*
|
|||
|
|
void* m_grp{nullptr}; // MppBufferGroup
|
|||
|
|
int m_w{0};
|
|||
|
|
int m_h{0};
|
|||
|
|
int m_hor{0};
|
|||
|
|
int m_ver{0};
|
|||
|
|
int m_quality{85};
|
|||
|
|
std::mutex m_mutex;
|
|||
|
|
#else
|
|||
|
|
int m_quality{85};
|
|||
|
|
#endif
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
#endif // DRONESCREW_MJPEG_ENCODER_H
|