`
isiqi
  • 浏览: 16483967 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

deblock 未曾想到的痛苦

阅读更多
那天摄像时背景是雪白的墙,结果解码时问题出现了。

问题现象:
解码的图像在墙壁部分有很明显的方块,其它图像变化大的地方(如人脸部分)情况还好。

问题分析:
以前没有这种情况的呀。改变了的只有编码速率。原来为了兼顾网络状况,我们将码率降得比较低。码率小,量化的精度就低,宏块与宏块之间的量化误差变大。当颜色变化很平缓时,这种很小的误差就变得明显了,图像上的体现就是宏块边界出现明显的颜色跳变,也就是方块。

问题解决:
还好mpeg4标准考虑到了这个现象,他们提供了一种叫deblock的解码后处理方法来弱化这种现象。实际将deblock添加后图像确实平滑许多,方块也没了。


deblock原理:
大概做法就是将每个点与它上下10个点和左右10个点的颜色平均。具体做法是将图像按8*8划分成块,按块的边界做平均。 如下图所示。

| |
| |
块1 | 块2|v0
v0 v1 v2 v3 v4|v5 v6 v7 v8 v9|v1
| | v2
| | v3
| | v4
----------------------------------------------------------------
|| v5
|| v6
|| v7
块3 | 块4| v8
|| v9
||
||
-----------------------------------------------------------------

每次计算取10个点,首先判断10个点的差别,如果差别很小就用默认模式将v4 v5做个细小的修正,如果差别很大则用DC offset模式修正v1-v8共8个点的值。判别的算法是:
eq_cnt = y(v0-v1) + y(v1-v2) + y(v2-v3) + y(v4-v5) + y(v5-v6)
+ y(v6-v7) + y(v7-v8)
其中if(x<= THR1) y(x) =0 else y(x) = 1; //THR1 是一个经验值 1

if(eq_cnt < THR2) //THR1 是一个经验值 6
default mode
else
DC offset mode

DC offset模式的规则:

max = MAX(v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8]);
min = MIN(v[1],v[2],v[3],v[4],v[5],v[6],v[7],v[8]);
if((max - min) < 2* quant)
颜色平均
else
什么也不做

按 1,1,2,2,4,2,2,1,1 的权重平均颜色。比如

s[1] = (uint8_t)((6*p0 +(v[1]<<2)+(v[2]<<1)+(v[3]<<1)+v[4]+v[5]+8)>>4);
s[2] = (uint8_t)(((p0<<2)+(v[1]<<1)+(v[2]<<2)+(v[3]<<1)+(v[4]<<1)+v[5]+v[6]+8)>>4);
s[3] = (uint8_t)(((p0<<1)+(v[1]<<1)+(v[2]<<1)+(v[3]<<2)+(v[4]<<1)+(v[5]<<1)+v[6]+v[7]+8)>>4);

类似的计算出s[1]-s[8],然后回写到v[1]-v[8]的位置。

计算量分析:
统计可以知道绝大部分使用了DC offset模式。如果图像尺寸是352*288,只分析亮度分量的计算量。
8*8块竖向分界线有352/8-1 = 43 条 ,每条分界线上有288个点,也就是竖向deblock要做43*288=12384个平均操作。
横向向分界线有288/8-1 = 35 条 ,每条分界线上有352个点,也就是竖向deblock要做35*352=12320个平均操作。
每个平均操作需要执行:
(1)从内存中读取10个byte, 竖向时10个byte是连续的,横向时每个byte相隔一行的宽度
(2)计算eq_cnt
(3)从v[1]-v[8]中找出最大的最小的值
(4)计算s[1]-s[8]
(5)将s[1]-s[8]存到v[1]-v[8]

另外,由于这些操作会修改图像的值,而如果图像是I或P帧,它还要作为后继帧的参考帧,图像数据不能变,所以需要将它拷贝到临时区中处理,这个拷贝也极耗时间。


天啦,每帧deblock将会大约读两遍帧数据和写一遍帧数据,将比yuv->rgb更恐怖的耗时间。实际的情况真是
令人沮丧,原本优化到32fbs了,加上deblock后直接降到16fbs。


优化分析:
(1)读取和写入内存会占大部分时间,不过这部分没什么好优化的。
(2)计算eq_cnt,这部分计算量很小,也不必在意
(3)从v[1]-v[8]中找出最大的最小的值

max = MAX(s[1],MAX(s[2],MAX(s[3],MAX(s[4],MAX(s[5],MAX(s[6],MAX(s[7],s[8])))))));
min = MIN(s[1],MIN(s[2],MIN(s[3],MIN(s[4],MIN(s[5],MIN(s[6],MIN(s[7],s[8])))))));

xvid给了两种方法计算MAX和MIN

#define MIN(X, Y) ((X)<(Y)?(X):(Y))
#define MAX(X, Y) ((X)>(Y)?(X):(Y))
#define FAST_MAX(x,y) ((x) - ((((x) - (y))>>(32 - 1)) & ((x) - (y))))
#define FAST_MIN(x,y) ((x) + ((((y) - (x))>>(32 - 1)) & ((y) - (x))))
第二种方法耗4条指令。
如果用汇编则只需3条指令

mov r1,r2 // r1 = max(r2,r3)
cmp r3,r1
movgt r1,r3

(4)计算s[1]-s[8],公式中有一些重复的计算,可以先计算重复部分后整体代换。


这些优化的都是耗时不太大的部分,真正耗时的是内存的存取部分。可以根据图像质量的状况适当减小计算的点数。标准中每次平均计算都取10点写8点,实际可以读8点写6点。

分享到:
评论

相关推荐

    Avisynth-Deblock:通过高位深度支持为Avisynth进行解块

    Deblock (clip, quant=25, aOffset=0, bOffset=0, planes="yuv") 量化-量化越高,解块效果越强。 取值范围是0到60。 aOffset-阻塞检测器阈值的量化修饰符。 将其设置得更高意味着将解开更多的边缘。 bOffset-另一...

    x264学习笔记(1)-函数调用流程

    x264学习笔记(1)-函数调用流程 1. x264概述: x264是开源的H.264/MPEG-4 AVC视频编码库,广泛用于编码高清视频。它支持多种操作系统和处理器架构,且具备高度的可配置性。x264实现了标准中的高级特性,如B帧、...

    HEVC Deblocking Filter

    ### HEVC Deblocking Filter:H.265 Deblock Standard #### 概述 HEVC(High Efficiency Video Coding)作为下一代视频编码标准,在减少压缩带来的视觉伪影方面采用了高效的循环内去块滤波器(In-loop Deblocking ...

    HEVC学习论文

    1. DeBlock滤波:在熵编码之前,对编码后的块边界进行平滑处理,减少由于块分割造成的视觉不连续性,提升视觉质量。 2. SAO:根据编码后的像素值进行自适应偏移校正,修复由于量化引起的像素级别的失真,进一步提高...

    PXA270基于H.264的嵌入式视频编码器的设计与应用

    - **关键模块汇编优化**:针对计算量最大的几个模块进行深入优化,如`read_one_macroblock`、`get_block`、`itrans`、`decode_one_macroblock`和`deblock`等。这些模块涉及到熵解码、图像插值、逆变换等多个复杂计算...

    x264YUANMA

    - `--no-deblock`:禁用循环滤波器。 - `--deblock`:循环滤波器参数。 - `--slices`:每帧的切片数量。 #### 结论 综上所述,x264 不仅提供了高效的视频压缩能力,还拥有丰富的命令行选项来满足不同场景的需求...

    PluginMaven-PowerapiCI

    阻燃剂 Powerapi MAVEN插件 ...艾德里安·德伯克(Adrien Deblock)/文森特·勒克莱尔(Vincent Leclercq) 该项目的任务是在戴维森咨询公司内完成我们的研究性实习。 执照 此项目已获得MIT许可-有关详细信

    5G常用指令及常用告警介绍.pdf

    5. `deb`(Deblock):解锁MO,恢复其正常操作。与`bl`相反,`deb cell/AAS/sector…`用于解锁定的小区、AAS或载波。 二、告警分析及处理 告警是网络运维中不可或缺的部分,它们提供了网络健康状况的实时反馈。...

    FFMpeg.zip

    - 文件如`libavcodec\x86\h264_deblock_sse2.asm`和`x86util.asm`揭示了针对x86架构的优化代码,特别是使用SSE2指令集进行H.264解块滤波器的优化。这有助于提高在Intel或AMD x86处理器上运行时的性能。 3. **...

    mpeg2编解码标准源代码

    2. 去块效应滤波器(Deblock Filter):减少因量化导致的块效应,提升视觉质量。 3. 量化:根据量化表对DCT系数进行调整,牺牲部分细节来降低数据量。 4. 变区间编码(Run-Length Encoding)与熵编码:通过统计连续...

    HEVC编码原理讲义.zip

    5. **环路后处理**:HEVC的环路后处理包括去方块滤波(Deblock Filter, DBK)和样点自适应滤波(Sample Adaptive Offset, SAO)。去方块滤波用于缓解块效应,提升视觉质量;SAO则通过对量化后的系数进行调整,进一步...

    MEGUI 教程

    还有一些次要参数,如消色块滤波器(Deblock Filter),过度使用可能导致画面质量下降。MB-Tree功能可显著降低码率,但旧版解码器可能会出现问题。搜索半径和搜索方式的选择影响编码速度和质量,推荐适中设置。像素...

    h.265验证代码kta

    7. **Loop Filter**:包括Deblock滤波和SAO滤波,进一步改善图像质量。 描述中提到的“实现了一些新的技术”,可能是指在KTA项目中具体实现了H.265标准的一些创新特性,例如增强的运动补偿、更复杂的熵编码、或者新...

    视频编码基础(H.264)

    边界强度是指在进行Deblock(去块效应)操作时,如何判断是否需要对某边界进行处理的指标。一般来说,边界强度越大,意味着该边界需要更强烈的去块效应处理。 ##### 2.12 Deblock 是先进行水平还是垂直?为什么? ...

    h265_c_reference.7z

    包括Deblock滤波、SAO(Sample Adaptive Offset)和ALF(Adaptive Loop Filter),用于消除编码过程中的块效应和噪声。 8. **工具增强**: 如多参考帧、双向预测、强预测模式、自适应量化等,都为HEVC提供了更高...

    04-x264.zip x264的官方最新源码

    5. **环路滤波器**:为了减少压缩过程中的块效应和 mosquito 效应,x264实现了deblock滤波器和SAO(样本自适应偏移)滤波器,提升解码后的画质。 6. **多线程优化**:x264利用多核CPU的并行计算能力,将编码任务...

    X264的时耗分析(详)and程序优化技术.docx

    以去块滤波器为例,x264_frame_deblocking_filter并非唯一的时间消耗源,还需考虑其调用的子函数如deblock_edge、x264_clip3等。这些函数在不同硬件平台上可能有不同的实现,例如Intel和AMD的CPU使用不同的指令集。...

    JM18.1源代码

    5. **环路滤波**:包括deblock滤波和SAO(Sample Adaptive Offset)滤波,用于改善压缩过程中引入的块效应和噪声。 6. **宏块处理**:如Intra预测和Inter预测,用于构建预测图像,减少需要传输的数据量。 在研究JM...

    X264的时耗分析(详)and程序优化技术.pdf

    以去块滤波器算法为例,x264_frame_deblocking_filter并非唯一的时间消耗源,它会调用一系列子函数,包括x264_clip3、x264_deblock_v8_luma_mmxext等。在计算去块滤波器的时间占比时,必须考虑所有相关函数的时间...

    x264源码带自己的注解

    6. **环路滤波**:除了去块效应滤波,x264还可能包含环路滤波器,如deblock滤波和SAO(Sample Adaptive Offset),它们在解码后对图像进行处理,以进一步提升图像质量。 7. **快速搜索算法**:为了减少计算复杂性,...

Global site tag (gtag.js) - Google Analytics