Neil_baby
这个作者很懒,什么都没留下…
展开
-
MVP的推导过程
MbPartWidth和MbPartHeight分别为8和16,(xP,yP)为(15,0), 根据公式(1)计算得MbPartIdx =1,和 预期一致。原创 2024-08-29 17:45:44 · 188 阅读 · 0 评论 -
B宏块的MV预测
本文介绍B宏块的MV预测,旨在归纳B宏块预测的脉络,对一些特殊的情况可能并未涉及,详细的内容需要详细阅读[1]。B宏块的和P宏块的不同之处是B宏块可以有B宏块可以有两个参考帧,也可以有一个参考帧,且如果有两个参考帧,这两个参考帧可以一个在List0中,一个在List1中,也可以两个参考帧都在List0或者List1中。List0和List1中的参考帧并没有时序关系,没有规定List0是前向参考帧,List1中是后向参考帧。[1]中中例举了B Block的类型和B Block的划分方式图1。原创 2024-08-29 17:44:49 · 89 阅读 · 0 评论 -
AQ mode
复杂宏块使用大的QP,简单宏块使用小的QP。x264如何定义复杂?x264是根据宏块内像素值的方差来评价宏块复杂性,方差越大,宏块的越复杂,方差用亮度和色度的方差之和来计算。它这么做基于一个原则,即人眼对平坦的区域比较敏感,对细节较多的区域不敏感,所以对简单的宏块使用较小的QP保证图像质量;对复杂的宏块使用较大的QP,可以适当降低质量。原创 2024-07-05 17:57:50 · 75 阅读 · 0 评论 -
x264_ratecontrol_mb解析
为x264_ratecontrol_start中计算得来的最大frame size,max_frame_error为一个比例,设定这里计算出来的max frame size和x264_ratecontrol_start的误差系数,max_frame_error的范围时0.05-0.25,所以这里的max_frame_size应为x264_ratecontrol_start的75%- 95%之间,为了防止vbv buffer overflow,最终的max_frame_size还要加以限制。原创 2024-07-05 17:51:53 · 187 阅读 · 0 评论 -
环路滤波器
在粗略地估算滤波边界强度后,我们需要区分这个边界强度是由于对块进行DCT变换量化引起的块效应(虚假边界)还是视频图像原有的边界(真实边界)。环路滤波有两个预先要解决的问题,一个是计算边界强度(边界两边的像素差距),只有先预算出边界的强度才可以选择合适的参数进行滤波;块效应指视频边界不连续的变化,我们在观看视频的时候,在运动剧烈的场景常能观察到图像出现小方块,小方块在边界处呈现不连续的效果(如下图),这种现象被称为块效应(blocking artifact)。如果边界强度为0,不用进行滤波。原创 2024-06-26 16:53:16 · 92 阅读 · 0 评论 -
JM日志文件解析
JM代码是对H264协议支持最全面的,不但还有编码还包括解码,通过它生成的trace文件可以对码流做一个很好的解读,目前很多码流分析工具也是基于JM的trace文件进行分析,研究它可以更深刻的理解H264协议。标识的slice中第一个宏块的位置,目前设置了4个Slice,每个Slice 2040个MB,共编码5帧,所以共20个slice,每帧的first_mb_in_slice依次为0,2040,4080,6120.当前slice的第第一个MB的QP为。原创 2024-06-26 15:42:33 · 162 阅读 · 0 评论 -
x264 的各种码率控制方式
在"x264帧级码率控制解析"中提到,x264三种码率控制方式,CRF,ABR和CQP,本文再更深入地探讨这三种码率控制方式。原创 2024-06-03 09:47:30 · 81 阅读 · 0 评论 -
x264帧级码率控制解析
目前x264代码中表面看到的码率控制方式有CQP,CRF和ABR三种。x264的帧级码率控制涉及三个重点函数,。为码率控制的初始化参数配置,在x264_encoder_open中调用在一帧编码前调用;在一帧编码结束后调用。原创 2024-06-03 09:33:34 · 188 阅读 · 0 评论 -
x264码率控制基础
x264码率控制也是基于率失真模型即,D为失真,R为码率,为拉格朗日因子,当取值较大时,倾向于低码率高失真的情况;当取值较小时,倾向于高码率低失真的情况。由拉格朗日乘数法知,参考[1], x264采用的是高码率下码率和失真之间的关系为常数因子,由(2)得由(1)和(3)得,高码率下失真又近似满足(5)其中QUANT为,由(4)和(5)为常数,根据经验值,QUANT为量化因子,和QP存在转换关系,最终可以把表示为:通过公式(8)可以看出QP值和的关系,当QP增加时,增加;原创 2024-05-23 15:46:30 · 99 阅读 · 0 评论 -
HEVC预测编码
以上这句话如何理解?如果对于只存在一个参考帧的情况col_pic和cur_ref是同一帧,如果存在多参考帧,则col_pic和cur_ref可能不是同一帧,举例说明,假如当前有5个短期参考帧,分别是当前帧的前五帧,假如不存在B帧,当前帧的帧号是100,那么这五个参考帧的帧号分别为95,96,97,98,99。所不同的是,AMVP的候选列表长度为2,且存在MVD。的PU,它有两个候选位置,如下图所示,最大的实线框为CTU,C3为col_pic中和cur_PU同位置的PU,H为C3所在的CTU的右下方的PU。原创 2024-04-07 11:14:03 · 60 阅读 · 0 评论 -
HEVC的编码结构
CTU(Coding Tree Unit)和CU组成了一个四叉树的层级结构,CTU的尺寸为64 x 64,32 x 32,16 x 16,一个CTU可以分为一个或四个CTU,对标H264的MB。CU/CBCU/CB(Coding Unit/Coding Block),CU为亮度和色度编码单元的统称,CB特指某一个分量的的编码单元。CU包括一个亮度编码块和两个色度编码块。CU为预测模式划分的最小单位,一个CU只能是一种预测模式,不是帧内或者帧间。原创 2024-03-21 15:01:26 · 88 阅读 · 0 评论 -
ffmpeg深度学习滤镜
运行过程中会出现一些错误,主要是因为代码中用的tensorflow api和环境中的tensorflow版本不匹配导致,修改接口名称即可解决,最终生成srcnn.pb文件。当前所用显卡为NVIDIA的P6000,在英伟达的官网上查看对应的驱动, 下载NVIDIA-Linux-x86_64-535.104.05.run并安装。通过[2]查看cuda和tensorflow的对应关系,下载对应版本的tensorflow.用nvcc --version查看,cuda的版本为11.8,下载。所用ffmpeg版本为。原创 2024-02-23 16:54:57 · 232 阅读 · 0 评论 -
ffmpeg 硬件加速介绍
参考[2],基于windows的硬件加速都是基于DirectX API,我们可以用ffmpeg -hwaccels查看当前环境支持的硬件加速接口,如下为windows上的执行ffmpeg --hwaccels的结果。原创 2024-02-20 10:17:29 · 495 阅读 · 0 评论 -
H264中的DCT变换和量化
下图为intra16x16 block的正向变换和反向变换过程,和非intra16x16 block相比,intra16x16 会进一步把这16个小块的DC分量再做哈达玛变换,然后再量化,所以对于每个小块中的16个系数,DC系数为先做DCT变换再做哈达玛变换的结果,15个AC系数为DCT变换的结果。反向变换和正向变换的顺序相反。反向变换为先对16个小块的DC分量做反哈达玛变换,然后再把每个小块的DC分量和它的AC分量放在一起,组成16个系数,然后对它再做反量化,接着IDCT,恢复block中的像素值。原创 2024-01-09 10:12:19 · 903 阅读 · 0 评论 -
ooura fft库
注意Real DFT的反变换和频域之间系数是2.0 / n.这点可以这样理解:因为Real DFT的时域信号都是实数,所以它的频率肯定是关于X轴对称的,因为只有这样才可以在Y轴上相互抵消。可以看出,和cdft的结果一致,剩下频率的关于中心对称,但是特殊的,刚好频域有64这个中间位置,而相位只存了前面一半的值,所以用rdft的话采样频率一半的相位信息无法获得。注意输入数据长度为N,只含有实部,因为fft后的输出关于X轴对称,所以数据量也减少一半,数据长度也为N,也是实部虚部实部虚部......,这样存放。原创 2023-12-27 09:19:00 · 933 阅读 · 0 评论 -
H264一致性
以下是Decoder侧CBP的大小随时间变化的趋势,因为有0.8秒的缓冲,所以在0.8秒时,CPB的大小为5000x0.8=4000,下来每隔0.2秒Decoder会解一帧数据。中,因为每一帧的大小是不固定的,所以可以认为进入Encoder Buffer的速率是不固定的,但是我们希望能够控制H264的码率,所以希望从Encoder Buffer出来,进入CPB的速度的恒定的,然后Decoder从CPB中取出码流进行解码,解码的数据放入DPB,Decoder可能还要用DBP中的数据进行参考。原创 2023-12-26 09:55:07 · 795 阅读 · 0 评论 -
x264中的线程池
x264的线程池定义在threadpool.h/threadpool.c中。原创 2023-12-22 16:52:51 · 886 阅读 · 0 评论 -
H264帧间预测
所以它们的MV分别乘以对应的权值,更新后的mv为(+3,-3)和(+1.5,-2.5),smv(+3,-3)将被传输,此时list1和list0对应的mv之差为(-1.5,0.5),这个mv也将被传输。还有一种情况是A,B,C的被划分成更小的partition,如下图中第二个图所示,那么A,B,C都取和E最接近的partition,A取E的相邻宏块的右上方的partition,B取E上方宏块左下方的partition,C取E右上方宏块的左下方的partition。多个参考帧的情况会增加DPB的存储量。原创 2023-12-20 16:23:22 · 930 阅读 · 0 评论 -
Slice和MB
CAVLC熵编码的都是按照4x4的块进行的,但是当transform_size_8x8_flag为1时,CAVLC的编解码需要8x8,所以解码时按照4x4解码,对一个8x8的块对应4个4x4的块,然后再把这4个4x4块的解码结果合成为一个8x8的块的结果,如上图红色框所示。至于4x4到8x8的合成方法,这里不做深入讨论,后面另起章节讨论。原创 2023-12-12 09:24:33 · 797 阅读 · 0 评论 -
H264帧内预测介绍
如果rem_intra4x4_pred_mode大于等于当前的最大可能模式,最终预测模式设置为rem_intra4x4_pred_mode + 1,所以f rem intra4×4 pred mode的取值范围是0-7,3bit就可以表示,再加上pre intra4x4 pred mode,一共4bit,所以如果most probable prediction mode 命中,能够节省3/4的码流,否则没有节省码流。,最终的预测模式为rem_intra4x4_pred_mode;为A,B预测模式的最小值。原创 2023-12-11 14:05:54 · 1121 阅读 · 0 评论 -
CAVLC(基于上下文自适应的可变长编码)
最后一个非零系数前0的个数如下面红色表示,total_zeros为330 01 -1 -10通过Table9.7通过total_zeros和TotalCoeffs=5,查表得编码结果为111.当前得编码码流为通过Table9-7可知,最后一个非零系数前0的数目为3 ,1 1110 1100。原创 2023-12-11 11:17:44 · 952 阅读 · 0 评论 -
JM中ref_pic_list_modification bug记录
我用一些码流分析工具播放H264码流正常,用一些播放器播放也都存在花屏,不过大多数播放器都是调用的ffmpeg接口,所以需要定位为何ffmpeg播放会报错。看到17这个数字就很敏感了,因为设置的Log2MaxFNumMinus4=0,所以码流中内部帧号16帧一个循环,再看第17帧的码流结构,ref_pic_list_reordering句法中,而有的解码器做了些容错机制,所以用码流分析工具播放未见问题,ffmpeg中是严格遵循协议的,所以会报此错误。的情况,max_pic_num为16。原创 2023-12-07 16:39:51 · 901 阅读 · 0 评论 -
poc_order_cnt_type
如果解码顺序和播放顺序一致(不存在B帧),最好用poc_order_type=2,这样最省码流,推导也方便。如果解码顺序和播放顺序不一致(存在B帧),poc_order_cnt_type为0最灵活,也好推导,但是码流大些,如果poc_order_cnt_type为1,码流会小些,但是灵活度不够,解码帧必须呈周期性的关系才可以。原创 2023-11-30 10:51:11 · 998 阅读 · 0 评论 -
Coded Block Pattern
Coded Block Pattern简称CBP,在H264协议7.3.2.1中有介绍,CBP表征了MB中的亮度和色度块的残差做DCT后的系数是否为0的情况,CBP可以拆分为CodedBlockLuma和CodedBlockChroma,分别对应亮度和色度块的残差系数是否为0,它们的具体含义后面会做介绍,首先我们要获取CodedBlockLuma和CodedBlockChroma,协议中规定根据MB type类型的不同获取CodedBlockLuma和CodedBlockChroma的语法也相同。原创 2023-11-24 15:22:58 · 945 阅读 · 0 评论 -
H264短期参考帧和长期参考帧
从以上例子看,解码器内部帧号的循环范围是16,也就是说,如果多个短期参考帧存在并且最远的短期参考帧和当前帧的实际帧号大于等于16,会造成参考帧列表顺序错乱。在解码端,如果当前帧号为13,有两个参考帧帧号分别为9,10,那么解码器认为帧号10距离当前帧较近,它排序参考帧列表为[10,9];在大多数的帧都没有问题,但是在个别帧的位置会发生参考帧列表中帧的顺序和预期不一致的情况,我在第28帧的两个参考帧为13帧和27帧,然后把27帧unused,但是当第29帧时参考帧列表为[13,28]。X264代码中定义的。原创 2023-10-18 10:11:36 · 399 阅读 · 0 评论 -
vbv介绍
VBV即Video Buffer Verifier(视频缓冲区校验器)。本质是encoder端的一个虚拟buffer,可以将VBV当做一个容量受限的管道,有一个上限容量值和下限容量值,在经过此管道的调节之后能限制编码码率在上限容量值和下限容量值之间。VBV对标NetEq中的那几个buffer(decoder buffer,algorithm buffer,sync buffer),也可以对标WebRtc中的video jitter buffer。原创 2023-10-18 10:03:30 · 1141 阅读 · 0 评论 -
Open GOP 和close GOP
Close GOP是说在当前GOP中,所有的P帧和B帧只会参考GOP内部的I帧或P帧;而Open GOP是说当前GOP中的B帧会参考邻近GOP的I帧。因为GOP第一帧为IDR帧,会清空DPB,以下图Close GOP为例,当前GOP的最后一个frame为B帧,它要参考下一个GOP的I帧和它前面的P帧,所以要现对I帧编码,如果I帧为IDR帧,会把所有参考帧都清除,包括P帧,B帧没法参考P帧了,所以GOP的第一帧为IDR帧,它只能是Close GOP。原创 2023-10-08 09:37:06 · 276 阅读 · 0 评论 -
时域维纳滤波
时域维纳滤波介绍原创 2023-01-07 10:19:16 · 245 阅读 · 0 评论 -
NetEq(五) ---- 算法处理 expand
NetEq expnad的处理流程原创 2022-05-22 15:14:33 · 397 阅读 · 0 评论 -
NetEq(四)-算法处理(加速、减速、Merge)
NetEq的加速、减速,以及merge流程原创 2022-05-19 20:39:26 · 415 阅读 · 0 评论 -
NetEq(三) 算法处理(Normal)
如果经过前面介绍的决策判定,该帧需要正常播放,那么正常播放又分为以下几种情况:上一包是PLC (expand,丢包)需要计算平滑系数,使上一包和当前包"过渡自然".平滑系数计算:D为解码后的数据,即input中的数据,BNG为背景噪声(用默认的初始值)。muteFactor为expand中的muteFactor,64即为8ms数据。const int fs_mult = fs_hz_ / 8000; size_t energy_length = std:原创 2022-05-17 21:57:19 · 452 阅读 · 0 评论 -
NetEq(二) 决策判定
NetEq 决策判定原创 2022-05-05 20:50:22 · 526 阅读 · 0 评论 -
NetEq(一) 延迟估计
NetEq之延迟估计原创 2022-05-05 20:44:24 · 1220 阅读 · 2 评论