AV1源码:libaom-2.0.0
一、什么时候会计算码率?encoder_init 和 encoder_ctrl_maps
二、如何计算初始化的编码比特数?
encoder_init 和 设置 rc_control 时会调用 av1_change_config 进行码率计算与设置:帧的比特率是如何分配的?
1、encoder_init --> create_context_and_bufferpool --> av1_create_compressor --> init_config --> av1_change_config --> av1_new_framerate
--> av1_rc_update_framerate
2、update_extra_cfg-->av1_change_config
av1_rc_update_framerate:计算平均带宽,最大、最小带宽,
平均带宽:avg_frame_bandwidth = target_bandwidth(250) / framerate(30);
最小带宽:min_frame_bandwidth = FRAME_OVERHEAD_BITS(200) 对于relatime:固定值
MAX_MB_RATE = 250
MAXRATE_1080P = 2025000
每个宏块的比特数:(宽*高)/ (16*16)
max1 = 每个宏块的比特数 * MAX_MB_RATE
maxMB = max(max1, MAXRATE_1080P);
vbr_max_btis = avg_frame_bandwidth * two_pass_vbrmax_section(2000,可设置) / 100;
最大带宽:max_frame_bandwidth = max(maxMB, vbr_max_btis);
三、计算了最大、最小和平均帧比特数后,如何计算当前帧的实际目标比特?
1、求每帧的实际目标数
keyframe:
如果设置了系数:rc_max_intra_bitrate_pct(默认值:300)
t1 = avg_frame_bandwidth * 25;
t2 = avg_frame_bandwidth * rc_max_intra_bitrate_pct / 100;
target = min(t1, t2);
否则:
target = t1
非keyframe:
GOP的第一帧(非IDR帧):baseline_gf_interval=8(默认值)
t1 = (avg_frame_bandwidth * baseline_gf_interval * 10 )/ (baseline_gf_interval + 10 -1)
非GOP第一帧:
t1 = (avg_frame_bandwidth * baseline_gf_interval) / (baseline_gf_interval + 10 -1)
t2 = min_frame_target = min(min_frame_bandwidth, avg_frame_bandwidth >> 5)
target = max(t1, t2) 即:如果比帧最小目标比特还小,则该帧的目标比特为t2.
2、如果没有缩放,则当前帧的目标比特数 = target;如果有缩放,则当前帧的目标比特数 = target * 缩放系数,