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;