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;


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章