1.主要的数据结构
struct MJpegEncoder {
uint8_t *row; //分配大小等于图片的stride(每行像素所使用的字节数假设图片每行num个像素,那么stride=num*4(假设每个像素用32位表示))
uint32_t row_size; //大小等于图片的stride
int first_frame; //开始压缩,这个参数的是标志位在开始压缩的时候就设置为true
struct jpeg_compress_struct cinfo; //压缩使用的结构体
struct jpeg_error_mgr jerr;//错误输出标准结构体
unsigned int bytes_per_pixel; /* bytes per pixel of the input buffer */ //每个像素所占用的字节数
void (*pixel_converter)(uint8_t *src, uint8_t *dest); //转换函数,每个字节使用的像素数转换
int rate_control_is_active; //比特率是否要控制的标志
MJpegEncoderRateControl rate_control; //比特率控制的各种参数,里面包含很多信息,后面分析
MJpegEncoderRateControlCbs cbs; //回调函数,用于计算控制比特率的回调函数
void *cbs_opaque; //回调函数用的参数
/* stats */
uint64_t avg_quality; //用于质量统计的参数
uint32_t num_frames; //压缩帧数统计
};
typedef struct MJpegEncoderRateControl {
int during_quality_eval; //如果为true 那么我们对不同的帧数运用不同的压缩质量
MJpegEncoderQualityEval quality_eval_data;
MJpegEncoderBitRateInfo bit_rate_info;
MJpegEncoderClientState client_state;
MJpegEncoderServerState server_state;
uint64_t byte_rate; //比特率,关于这个的计算,后面再说
int quality_id; //标志编码质量的参数
uint32_t fps; // 帧数目 最大25 最小为1 会根据实际情况做调整
double adjusted_fps; //调整帧数
uint64_t adjusted_fps_start_time; //调整帧开始时间 把编码开始的时间设置为调整帧时间
uint64_t adjusted_fps_num_frames; //调整帧的数目
/* the encoded frame size which the quality and the fps evaluation was based upon */
uint64_t base_enc_size; //基础帧大小,大多数情况下为0 有时候要赋值 ???
uint64_t last_enc_size; // 上一个 ???
uint64_t sum_recent_enc_size; //last_enc_size的累计和
uint32_t num_recent_enc_frames; //last_enc_size的累计次数
uint64_t warmup_start_time;//记录开始的时间 纳秒数
} MJpegEncoderRateControl;
typedef struct MJpegEncoderQualityEval {
int type; //有三种类型 分别是 MJPEG_QUALITY_EVAL_TYPE_SET , MJPEG_QUALITY_EVAL_TYPE_UPGRADE , MJPEG_QUALITY_EVAL_TYPE_DOWNGRADE
int reason; //有两种类型 分别是 MJPEG_QUALITY_EVAL_REASON_SIZE_CHANGE ,, MJPEG_QUALITY_EVAL_REASON_RATE_CHANGE
uint64_t encoded_size_by_quality[MJPEG_QUALITY_SAMPLE_NUM]; //压缩质量,
/* lower limit for the current evaluation round */
int min_quality_id; //最小的quality_id
int min_quality_fps; // min fps for the given quality 最小的帧对于给定的质量id
/* upper limit for the current evaluation round */
int max_quality_id; //最大的quality_id
int max_quality_fps; // max fps for the given quality 最大的帧对于给定的质量id
/* tracking the best sampled fps so far */
int max_sampled_fps; //最大的帧采样数
int max_sampled_fps_quality_id;//最大的帧采样数质量id
} MJpegEncoderQualityEval;
typedef struct MJpegEncoderBitRateInfo {
uint64_t change_start_time; //开始压缩的时间 是一个64位纳秒数
uint64_t last_frame_time; //上一帧的时间
uint32_t change_start_mm_time; //改变开始的时间,是一个32位纳秒数
int was_upgraded; //是否更新的标志
/* gathering data about the frames that
* were encoded since the last bit rate change*/
uint32_t num_enc_frames; // 改变比特率之后,对编码帧数的统计
uint64_t sum_enc_size; // 压缩帧数的统计 ???
} MJpegEncoderBitRateInfo;
typedef struct MJpegEncoderClientState {
int max_video_latency; //最大视频延迟
uint32_t max_audio_latency; //最大音频延迟
} MJpegEncoderClientState;
typedef struct MJpegEncoderServerState {
uint32_t num_frames_encoded; //服务器压缩帧数统计
uint32_t num_frames_dropped; //服务器丢帧数统计
} MJpegEncoderServerState;
typedef struct MJpegEncoderRateControlCbs {
uint32_t (*get_roundtrip_ms)(void *opaque); //计算回还路径的时间 单位是ms
uint32_t (*get_source_fps)(void *opaque); //得到源帧数,从stream得到的 初始值为MAX_FPS=30
void (*update_client_playback_delay)(void *opaque, uint32_t delay_ms); //更新客户端playback延迟时间
} MJpegEncoderRateControlCbs;