x264 deblock filter 代码解读

在x264源码里,void x264_frame_deblock_row( x264_t *h, int mb_y )函数中定义了如下的宏片段,这段代码旨在完成对MB的deblocking 操作,其中针对edge 取不同的值的时候,有的做deblocking, 有的不做,看这部分代码的时候我也是存在疑惑,后面结合H.264 spec draft, 一切就清楚明了了。
防止自己忘记,记录一下。

#define FILTER( intra, dir, edge, qp, chroma_qp )\do\{\if( !(edge & 1) || !transform_8x8 )\{\deblock_edge##intra( h, pixy + 4*edge*(dir?stride2y:1),\stride2y, bs[dir][edge], qp, a, b, 0,\h->loopf.deblock_luma##intra[dir] );\if( chroma_format == CHROMA_444 )\{\deblock_edge##intra( h, pixuv          + 4*edge*(dir?stride2uv:1),\stride2uv, bs[dir][edge], chroma_qp, a, b, 0,\h->loopf.deblock_luma##intra[dir] );\deblock_edge##intra( h, pixuv + uvdiff + 4*edge*(dir?stride2uv:1),\stride2uv, bs[dir][edge], chroma_qp, a, b, 0,\h->loopf.deblock_luma##intra[dir] );\}\else if( chroma_format == CHROMA_420 && !(edge & 1) )\{\deblock_edge##intra( h, pixuv + edge*(dir?2*stride2uv:4),\stride2uv, bs[dir][edge], chroma_qp, a, b, 1,\h->loopf.deblock_chroma##intra[dir] );\}\}\if( chroma_format == CHROMA_422 && (dir || !(edge & 1)) )\{\deblock_edge##intra( h, pixuv + edge*(dir?4*stride2uv:4),\stride2uv, bs[dir][edge], chroma_qp, a, b, 1,\h->loopf.deblock_chroma##intra[dir] );\}\} while( 0 )

H.264 spec draft 中,针对哪些情况要做deblocking 有如下描述:
在这里插入图片描述
在这里插入图片描述
针对luma 做了如下约束:
若transform_8x8 没有打开,则luma 的 edge 0 1 2 3 均要做filter, 否则只有edge 0 2 做filter;

针对chroma 做了如下约束:
1.如果是4:2:0的YUV 格式,edge 0 2 做filter;
2.如果是4:2:2的YUV 格式,vertical 方向,edge 0 2 做filter, horizontal 方向, edge 0 1 2 3 均做filter;
3.如果是4:2:2的YUV 格式, transform_8x8=0时,均做滤波, 否则 edge 0 2 做滤波;
4.其他的YUV 格式(不存在chroma 分量),则不做chroma 滤波;

好记性不如烂笔头,希望这次能彻底记住不忘记~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/3305.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web概述

1.1 程序开发架构 1.1.1C/S体系结构介绍 C/S是Client/Server的缩写,即客户端/服务器结构。在这种结构中,服务器 通常采用高性能的机或工作站,并采用大型数据库系统(如Oracle或SQLServer)客户端 则需要安装专用的客户…

【SQL应知应会】分析函数的点点滴滴(一)

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 分析函数的点点滴滴 1.什么是分析函数:…

【系统开发】尚硅谷 - 谷粒商城项目笔记(七):消息队列

文章目录 消息队列概述两大种类RabbitMQ安装及基操Docker中安装添加用户创建Virtual Hosts设置权限添加交换机创建队列交换机绑定队列 五种消息模型SpringBoot整合MQ引入依赖properties配置开启RabbitMQ API使用创建交换机创建队列交换机绑定队列发送消息接收消息 消息确认机制…

【Spring Cloud Alibaba Seata 处理分布式事务】——每天一点小知识

💧 S p r i n g C l o u d A l i b a b a S e a t a 处理分布式事务 \color{#FF1493}{Spring Cloud Alibaba Seata 处理分布式事务} SpringCloudAlibabaSeata处理分布式事务💧 🌷 仰望天空,妳我亦是行人.✨ &#x1f98…

基于Elasticsearch + Fluentd + Kibana(EFK)搭建日志收集管理系统

目录 1、EFK简介 2、EFK框架 2.1、Fluentd系统架构 2.2、Elasticsearch系统架构 2.3、Kibana系统架构 3、Elasticsearch接口 4、EFK在虚拟机中安装步骤 4.1、安装elasticsearch 4.2、安装kibana 4.3、安装fluentd 4.4、进入kibana创建索引 5、Fluentd配置介绍 Elas…

WWDC 23 之后的 SwiftUI 有哪些新功能

文章目录 前言数据流动画ScrollView搜索新手势新增的小功能总结 前言 WWDC 23 已经到来,SwiftUI 框架中有很多改变和新增的功能。在本文中将主要介绍 SwiftUI 中数据流、动画、ScrollView、搜索、新手势等功能的新变化。 数据流 Swift 5.9 引入了宏功能&#xff…

【FPGA】Verilog:时序电路 | 触发器电路 | 上升沿触发 | 同步置位 | 异步置位

前言:本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:触发器电路 ​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片 配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度 存储器:…

VS2022 And QtCreator10 调试 Qt 源码教程

文章目录 背景IDE 调试 Qt 源码Visual Studio 2022Qt Creator 10.0.1 排查思路姊妹篇系列 简 述: 记录使用 Visual Studo 2022 和 QtCreator10 调试 Qt 5.15 源码和 加载 .pdb 的方法。 本文初发于 “偕臧的小站”,同步转载于此。 背景 源码:…

软考A计划-系统集成项目管理工程师-项目范围管理(一)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

C# Excel 表列序号

171 Excel 表列序号 给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如: A -> 1 B -> 2 C -> 3 … Z -> 26 AA -> 27 AB -> 28 … 示例 1: 输入: columnTitle “A” 输出: 1 示例 2: …

数据库原理之数据库事物

文章目录 一、事物介绍1.1 事物的目的是保证数据的一致性1.2 事物的ACID A、I、D是为了实现 C1.3 什么是本地事物(Local Transactions) 二、数据库系统如何实现ACID2.1 影响深远的ARIES理论2.2 本地事物如何实现原子性和持久性 A、D2.2.1 实现原子性和持久性的Commit Logging方…

基于物联网、区块链技术的质量管控防伪溯源系统源码

一物一码防伪溯源系统能准确获取产品生产经营各个环节的真实信息,利用物联网、云计算 、区块链、人工智能、5G等先进技术,结合特有的码码关联和RSA加密验证技术,建立区块链的“身份证”,针对产品生长到销售各环节的质量安全数据进…