spice server mjpeg

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;


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值