H264的coded_block_pattern编码块模式
1 词汇约定
CodedBlockPatternLuma:一个宏块的亮度分量的coded_block_pattern
CodedBlockPatternChroma:一个宏块的色度分量的coded_block_pattern,Cb、Cr的CodedBlockPatternChroma相同。
宏块:一个 16X16 的亮度象素块和两个对应的色差象素块。
块:一个 MxN的象素数组(M列,N 行),或者一个 MxN 变换系数数组。
子宏块:一个宏块的1/4采样大小,即:对于有三个采样数组(即一个亮度分量两个色度分量比如YCbCr)的图像来说,
一个8x8的亮度块与两个的相应色度块,他们分别的一个角位于宏块的一个角,或者对于单色图像或每个分量单独编码的有
三个采样数组的图像(比如XYZ色彩格式)其一个8x8亮度块的一个角位于宏块的一个宏块的一个角。
2 coded_block_pattern
规定了一个宏块的4个8x8亮度子宏块(对于I_16x16是针对16个4x4块)与相关联的色度块中的哪些会包含非0变换系数。
3 chroma_format_idc

a)在单色采样中,仅存在一个采样阵列,其通常被认为是亮度阵列,没有色度阵列。
b)在4:2:0采样时,两个色度阵列中每一个的高度与宽度都是亮度阵列的一半,举例对于CIF:352x288,
其亮色阵列为352*288而两个色度阵列中的第一个都为176*144。
c) 在4:2:2采样时,两个色度阵列中每一个的高度等于亮度阵列的高度,其宽度等于亮度阵列的一半,
举例对于CIF:352x288,其亮色阵列为352*288而两个色度阵列中的第一个都为176*288。
d) 在4:4:4采样时,若separate_colour_plance_flag等于0表示色度阵列与亮度阵列的宽高是一样的,
否则也就是separate_colour_plance_flag等于1表示亮度陈列与两个色度阵列就像单色图像哪样分别单独编码,
即Y、Cb、Cr阵列都当成单色图像的采样阵列,然后按单色图像哪样编码。
e) chroma_format_idc如果在码流中不出现,其默认值为1即(4:2:0),separate_colour_plance_flag如果在码流中不出现默认值为0
5) ChromaArrayType
if (separate_colour_plance_flag == )
ChromaArrayType = chroma_format_idc
else
ChromaArrayType = ;
6) CodedBlockPatternLuma与CodedBlockPatternChroma
if (宏块预测模式为P_Skip、B_Skip、I_PCM)
;//不存在CodedBlockPatternLuma与CodedBlockPatternChroma
else if (宏块预测模式为Intra_16x16)
;//CodedBlockPatternLuma与CodedBlockPatternChroma的值隐藏在宏块类型中,
;//举例对于I条带的宏块类型7,其名称为I_16x16_0_c_l,其中c表示CodedBlockPatternChroma,l表示CodedBlockPatternLuma。
else
{
//码流中会出现coded_block_pattern,这样:
CodedBlockPatternLuma = coded_block_pattern % ;
CodedBlockPatternChroma = coded_block_pattern / ;
}
7 CodedBlockPatternLuma的语义
if (宏块预测模为Intra_16x16)
{
if (ChromaArrayType != )
{
if (CodedBlockPatternLuma == )
{
;//一个宏块的亮度分量的AC变换系数都为0,即对于一个16x16的亮度块其16个4x4块亮度分量的AC变换系数都为0,
;//不需要传送给解码器,解码器将这个宏块的亮度分量的AC变换系统全用默认值0代替。
}
else
{
;//一个宏块的亮度分量至少有一个AC变换系数不为0,这时对这个16x16的亮度块的16个4x4块(的亮度分量的)AC变换系数
;//都要被扫描,意味着AC变换系数需要编码进码流传送给解码器。
}
}
else //ChromaArrayType == 3
{
if (CodedBlockPatternLuma == )
{
;//一个宏块的亮度分量、两个色度分量的AC变换系数都为0,即对于一个16x16的亮度块、Cb色度块、Cr色度块
;//其相应的16个4x4块亮度分量、Cb色度分量、Cr色度分量的AC变换系数都为0,
;//不需要传送给解码器,解码器将这个宏块的相应分量的AC变换系统全用默认值0代替。
}
else
{
;//一个宏块的亮度分量、两个色度分量至少有一个AC变换系数不为0,这时
;//对这个16x16的亮度块、Cb色度块、Cr色度块的16个4x4块(相应的亮度分量或色度分量的)
;//AC变换系数都要被扫描,意味着AC变换系数需要编码进码流传送给解码器。
}
}
}
else
{ if (ChromaArrayType != )
{
;// CodedBlockPatternLuma低4位的每位按如下方式确定一个宏块的4个8x8块中的一个块的(编码模式)
if (CodedBlockPatternLuma的低4位的某位等于0)
{ ;//相应8x8块的亮度变换块的所有变换系数都为0,不需要编码进码流,即不需要发送给解码器 }
else
{
;//相应8x8块的一个或多个亮度变换块(比如8x4)的一个或多个变换系数不为0,这时这个8x8块的所有亮度变换块的变换系数
;//都要被扫描,需要编码进码流传送给解码器
}
}
else//ChromaArrayType ==3)
{
;// CodedBlockPatternLuma低4位的每位按如下方式确定一个宏块的4个8x8块中的一个块的(编码模式)
if (CodedBlockPatternLuma的低4位的某位等于0)
{
;//相应8x8块的亮度、色度Cb、色度Cr变换块(比如8x4)的所有变换系数都为0,不需要编码进码流,即不需要发送给解码器
}
else
{
;//相应8x8块的一个或多个亮度、色度Cb、色度Cr变换块(比如8x4)的一个或多个变换系数不为0,这时这个8x8块的所有亮度、色度Cb、色度Cr变换块的变换系数
;//都要被扫描,需要编码进码流传送给解码器
}
}
}
8 CodedBlockPatternChroma的语义
if (ChromaArrayType != & ChromaArrayType != )
{
switch (CodedBlockPatternChroma)
{
case :
;//表示所有色度变换系统都等于0,不需要传送给解码器,解码器按协议将这些系数赋为0
break;
case :
;//表示一个或多个色度DC变换系数不为0,而所有的色度AC变换系数都为0,需向解码器传送色度DC变换系数,不而传送色度AC变换系数
break;
case :
;//表示零个或多个色度DC变换系数不为0,一个或多个DC变换系数不为0,需向解码器传送色度DC与AC变换系数
}
}
else //ChromaArrayType == 0 或 ChromaArrayType == 3
{
;//码流中不存在色度分量的编码模式表示,ChromaArrayType==0(单色图像或含有三个颜色分量的图像每个分量都按照单色图像这样独立编码)时,压跟没有颜色分量,
;// ChromaArrayType == 3 ,亮度编码模式的含义已经包括了色度分量的编码模式,见这里1,这里2,这样对于非Intra_16x16、I_PCM、P_Skip、B_Skip时传送
;//的CodedBlockPattern由于不需要包括CodedBlockPatternChroma所以只需要4位范围的数即可表达,参见标准的me(v)解码过程
}
H264的coded_block_pattern编码块模式的更多相关文章
- 【H264】视频编码发展简史
一.常见视频编码格式 编码格式有很多,如下图: 目前比较常用的编码有: H26x系列:由ITU(国际电传视讯联盟)主导,侧重网络传输 MPEG系列:由ISO(国际标准组织机构)下属的MPEG(运动图象 ...
- 编码与模式------《Designing Data-Intensive Applications》读书笔记5
进入到第四章了,本篇主要聊的点是编码(也就是序列化)与代码升级的一些场景,来梳理存储之中涉及到的编解码的流程.目前主流的编解码便是来自Apache的Avro,来自Facebook的Thrift与Goo ...
- 嵌入式linux------ffmpeg移植 编码H264(am335x编码H264)
[cpp] view plaincopy <pre name="code" class="cpp"><pre name="code& ...
- windows下vim 块模式问题
VIM: gvim 使用 Ctrl+V 發表於 2005 年 10 月 27 日 由 Tsung vim 要做垂直選取的動作, 就要使用 "Ctrl + v", 但是 gvim 會 ...
- iOS音频AAC视频H264编码 推流最佳方案
iOS音频AAC视频H264编码 推流最佳方案 项目都是个人的调研与实验,可能很多不好或者不对的地方请多包涵. 1 功能概况 * 实现音视频的数据的采集 * 实现音视频数据的编码,视频编码成 ...
- FFMPEG H264/H265 编码延迟问题
最新使用FFmpeg进行H264的编码时,发现视频编码有延迟,不是实时编码.进过一番研究发现,仅仅要在调用avcodec_open2函数 打开编码器时,设置AVDictionary參数就可以.关键代码 ...
- day08文件操作的三步骤,基础的读,基础的写,with...open语法,文件的操作模式,文件的操作编码问题,文件的复制,游标操作
复习 ''' 类型转换 1.数字类型:int() | bool() | float() 2.str与int:int('10') | int('-10') | int('0') | float('-.5 ...
- cv_bridge中的编码模式与实现
image_encodings.cpp文件是关于图像编码模式的源文件,其中规定了RGB的图像以及深度图的编码模式 该编码文件image_encodings.cpp所依赖的头文件图 命令空间 sens ...
- HEVC学习之一编码框架
接触H265时间不是很长,看了一些东西,但是一直没有时间静下心来整理.H265的学习主要是参考万帅.杨付正的<新一代高效视频编码 H265/HEVC 原理.标准与实现>移书,这本书对H26 ...
随机推荐
- iMac 无线键盘 无法配对
正好小编手里也有一个 Apple wireless keyboard 键盘,经测试发现确实有他所说的问题.在互联网上找了一圈儿都没找到解决方案,苹果官方也没有给出相关方案.只好自己琢磨,还好终于研究出 ...
- 10277 - Boastin' Red Socks
描述:红黑袜子,给出的是红袜子被选到的概率,即为p/q,要计算的是在挑选出一对红袜子之前的红袜子和黑袜子的数目,假设红袜子数为n,黑袜子数为m,那么n(n-1)/(m(m-1))=p/q,求出红袜子数 ...
- .net基础收集
.net基础收集 最近的面试让我知道基础知识的重要性,而我也每天都在网上找一些基础题来看.其实面试无非都是一些理论基础,只有基础过关了,才会被问到技术性的问题,所以第一关一定要打好.下面是我收集的一些 ...
- 彩蛋 Python之道
彩蛋 Python之道 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 使用下面的语句可以调出Python中的一个彩蛋, impo ...
- C++malloc,calloc,realloc,free函数
在进行C/c++编程的时候,需要程序员对内存的了解比较清楚,经常需要操作的内存可分为下面几个类别: 1.堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等, ...
- Python高手之路【十三】socket网络编程
什么是客户/服务器架构? 什么是客户/服务器架构?不同的人有不同的答案.这要看你问的是什么人,以及指的是软件系统还是硬件系统了.但是,有一点是共通的:服务器是一个软件或硬件,用于提供客户需要的&quo ...
- Volt 模块引擎与phalcon框架组合使用指南
---- 近期工作中web页面使用由C语言编写的VOLT模板引擎,相比之前由js动态加载页面速度更快,更利于百度数据的抓取,现根据文档整理一下使用思路 (Volt是一个超快速和设计者友好的模板语言,C ...
- 【C#】Switch datatype between object and byte[]
This sample shows how to turn object to byte[], as well as turn byte[] to object. So,I can turn any ...
- C++ 处理 utf-8
类似"abc汉字"这样的字符串是以utf-8编码; C++ 的 cout执行的操作是把参数发送给stdout,因此如果终端支持utf-8, 汉字可以使用cout打印: 比较好的办法 ...
- Windows离开模式(AwayMode)
Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Man ...