函数av1_encode_strategy会执行一些high-level的编码策略,包括选择帧的类型等。其中函数choose_frame_source,会根据当前帧是否为ARF or internal ARF,来对原始帧进行时域滤波,如果不是则用LAST代替或者从lookahead从得到。
show_existing_frame代表这一帧已经编码过.
tpl_model在第二次编码才会使用,是通过Look-ahead的方式记录inter和intra的cost, 通过类似MB-Tree的方法对实际编码的QP和lambda进行调整以提高性能。
av1_configure_buffer_updates,用于更新参考帧类型的数据,比如对于LAST_FRAME, 会被初始化为
case LF_UPDATE:
frame_params->refresh_last_frame = 1;
frame_params->refresh_golden_frame = 0;
frame_params->refresh_bwd_ref_frame = 0;
frame_params->refresh_alt2_ref_frame = 0;
frame_params->refresh_alt_ref_frame = 0;
而KEY_FRAME会把const int force_refresh_all设为1 ,结果就变成了
if (force_refresh_all) {
frame_params->refresh_last_frame = 1;
frame_params->refresh_golden_frame = 1;
frame_params->refresh_bwd_ref_frame = 1;
frame_params->refresh_alt2_ref_frame = 1;
frame_params->refresh_alt_ref_frame = 1;
}
函数的下一个入口是av1_encode
int av1_encode_strategy(AV1_COMP *const cpi, size_t *const size,
uint8_t *const dest, unsigned int *frame_flags,
int64_t *const time_stamp, int64_t *const time_end,
const aom_rational64_t *const timestamp_ratio,
int flush) {
const AV1EncoderConfig *const oxcf = &cpi->oxcf;
AV1_COMMON *const cm = &cpi->common;
EncodeFrameInput frame_input;
EncodeFrameParams frame_params;
EncodeFrameResults frame_results;
memset(&frame_input, 0, sizeof(frame_input));
memset(&frame_params, 0, sizeof(frame_params));
memset(&frame_results, 0, sizeof(frame_results));
if (oxcf->pass == 0 || oxcf->pass == 2) {
check_show_existing_frame(cpi, &frame_params);
frame_params.show_existing_frame &= allow_show_existing(cpi, *frame_flags);
} else {
frame_params.show_existing_frame = 0;
}
int temporal_filtered = 0;
struct lo