本文就文AV1 Encoder源码剖析(一)的Encode流程继续深挖。
3. AV1编码流程
……
3.5 av1_encode_strategy
av1_encode_strategyav1_encode_strategy主要完成high-level编码策略如(frame type, frame placement, etc.)
主要包含:
- 非flush情况下,根据lookahead当前buffer填充情况,判断是否stuff更多的源图像帧。
- 决策当前帧是否是ARF帧。
- 帧率,PTS,帧类型,参考帧的决策和更新。
- 根据是否实时编码模式,如果是调用av1_encode,否则调用denoise_and_encode()。
- AV1_encode中,如果是2-pass编码,av1_first_pass() 执行其中的first_pass, 否则encode_frame_to_data_rate()直接执行the final pass。
上面提到了ARF, ARF帧的定义如下:
ARF
3.3 encode_frame_to_data_rate
image.pngencode_frame_to_data_rate主体是encode_with_recode_loop_and_filter,剩下的主要做了些target_rate设置,整像素MV,丢帧,CDF开关。
encode_with_recode_loop_and_filter()主要做的工作如下:
- 继续调用encode_with_recode_loop()/encode_without_recode()进行编码。
其中:
(1) encode_without_recode()通常应用在one-pass和realtime编码。
(2) encode_with_recode_loop()会对同一帧重复编码几次,主要目的是达到目标码率。
(3) 最后两者共同调用av1_encode_frame()进行下一步编码(预测变换等)。 - 执行in-loop滤波:
(1) 调用loopfilter_frame()进行deblocking filters。
(2) 调用cdef_restoration_frame()执行CDEF 滤波和restoration滤波。
3.4 av1_encode_frame
av1_encode_frameav1_encode_frame()执行:
- 参考帧缓存管理;
- 调用encode_frame_internal()执行无需获取其他帧的编码。encode_frame_internal()是开启partition搜索的时机。
- encode_frame_internal()内部开始tile的划分和对tile的遍历及编码,tile再细分会遍历执行对superblock的编码。
接下来的编码流程分析将在AV1 Encoder源码分析(三)中介绍。
未经声明,禁止转载,喜欢的给个赞吧!
网友评论