AV1代码学习
记录AV1代码的学习过程,可能会有一些错误,希望指正,十分感谢
Alanqin13
这个作者很懒,什么都没留下…
展开
-
AV1代码学习6:tpl_model之三
在完成mode_estimation模式选择之后,AV1会利用函数tpl_model_store对数据进行重新计算并更新到tpl_ptr指针里,特别注意:tpl_ptr是指向每个4×4块的左上角,也是AV1块划分的最小单位。这样不管是什么划分情况,都可以访问到里面的内容。static void tpl_model_store(TplDepStats *tpl_stats_ptr, int mi_row, int mi_col, BLOCK_SIZ原创 2020-07-24 16:33:30 · 747 阅读 · 0 评论 -
AV1代码学习6:tpl_model之二
mode_estimation字面意思就是模式估计,实质上是对帧内和帧间的模式进行遍历。帧内预测选取了13种模式,主要是DC模式、角度模式和新加入的PAETH模式。static void mode_estimation(AV1_COMP *cpi, MACROBLOCK *x, MACROBLOCKD *xd, struct scale_factors *sf, int frame_idx,原创 2020-07-24 15:52:48 · 1210 阅读 · 0 评论 -
AV1代码学习6:tpl_model之一
AV1的tpl_model是AV1的一个c文件,包含了一系列函数,其主要目的是为了利用lookahead design记录每个块的一些数据,包括失真等,在实际编码时利用这些数据建立模型,调整QP或者lambda以取得更好的编码性能。相关方面的论文是:《A Temporal Dependency Model for Rate-Distortion Optimization in ...原创 2019-12-24 16:39:50 · 2468 阅读 · 0 评论 -
AV1代码学习6:函数av1_encode和 av1_first_pass
av1_encode没什么特别好说的,会把在av1_encode_strategy的参数(EncodeFrameInput和EncodeFrameParams)赋给结构体AV1_COMP和AV1_COMMON,对当前帧的数据进行初始化 AV1_COMP *const cpi AV1_COMMON *const cm = &cpi->common; CurrentFra...原创 2019-12-23 16:14:47 · 2558 阅读 · 0 评论 -
AV1代码学习5:函数av1_encode_strategy
函数av1_encode_strategy会执行一些high-level的编码策略,包括选择帧的类型等。其中函数choose_frame_source,会根据当前帧是否为ARF or internal ARF,来对原始帧进行时域滤波,如果不是则用LAST代替或者从lookahead从得到。show_existing_frame代表这一帧已经编码过.tpl_model在第二次编码才会使用,是...原创 2019-12-10 15:48:23 · 1246 阅读 · 0 评论 -
AV1代码学习4:函数encoder_encode
进入函数encoder_encode,注意结构体AV1_COMP,基本上所有有关编码的具体信息都能从这里访问到,包括QP,POC等。av1_receive_raw_frame会对一系列结构体和buffer进行初始化,包括lookahead结构体以及参考帧列表等,下一个函数入口是av1_get_compressed_data,若返回-1则指的是没有帧被编码,因为AV1有lag-in-frame,...原创 2019-12-09 15:29:32 · 1152 阅读 · 1 评论 -
AV1代码学习3:函数aom_codec_encode
函数aom_codec_encode主要就是根据命令行参数--cpu-used来决定num_enc, 通常情况下,为了通测方便,--cpu-used都是设置为1. 提高--cpu-used的数值会加快编码器的速度,但也会降低编码质量。确定好num_enc之后,就会调用函数encoder_encodeaom_codec_err_t aom_codec_encode(aom_codec_ctx_...原创 2019-12-09 12:27:43 · 1274 阅读 · 2 评论 -
AV1代码学习2:函数encode_frame
之前代码学习1里有提到主要编码循环(while (frame_avail || got_data))里的函数encode_frame, 这个函数会做一些放缩的工作,以及计时器的启动,会把stream->encoder传入函数aom_codec_encode进行下一步工作,并判断返回值是否有error。需要注意的是av1默认是two-pass encoding,所以第一次编码是在大QP和低码...原创 2019-12-09 12:10:37 · 984 阅读 · 0 评论 -
AV1代码学习1:aomenc的main函数
这里使用的是AV1(Jun. 8, 2019version)。aomenc是编码器工程,完成视频序列的编码。运行时,首先调用aomenc.c中的main函数main函数中完成的工作主要有初始化,解析输入文件,打印数据,并且对编码过程进行计时,因为AV1是用C编写的,所以有很多地方看上去不是那么简洁。其中调用了函数encode_frame,是编码器的最上层的入口。主要过程是:...原创 2019-12-09 11:47:23 · 1428 阅读 · 1 评论 -
AV1代码学习0:libaom的配置以及码流分析
之所以写这个专栏,主要还是因为项目原因要学习AV1,之前也从未接触过工程量这么大的工程代码,所以这个专栏的形式可能会像学习笔记或者学习过程的一个记录。在学习AV1之前有接触过HEVC,很多基础的东西都是在岳麓吹雪大神的博客学到,受益匪浅。AOMedia Video 1(简称AV1)与HEVC最大的不同就是它是一个免专利的编解码器,由开源媒体联盟(AOM)开放,主要是谷歌牵头做的。AV1是还是基...原创 2019-12-06 20:35:17 · 6243 阅读 · 6 评论