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 ...
随机推荐
- 百度地图定位SDK 之构想
百度地图定位 前提 从香港旅游回来,心中油然升起一股热血滂湃,激励自己发现市场需求,向创业奋进,朝着梦想前进. 简介 百度Android定位SDK支持Android1.5以及以上设备,提供: 定位功能 ...
- 将SQL获取的信息传递到Email中
将SQL获取的信息传递到Email中 最近在为公司财务开发一个邮件通知时遇到了一个技术问题.原来我设计SSIS的是每天将ERP系统支付数据导出到财务支付平台后 Email 通知财务,然后财务到支付平台 ...
- HtmlParser应用
HtmlParser应用,使用Filter从爬取到的网页中获取需要的内容 { String url = "http://wenku.baidu.com/search?word=htmlpar ...
- 对C# 构造函数的理解
C#构造函数是在创建给定类型的对象时执行的类方法. 构造函数具有与类相同的名称,它通常初始化新对象的数据成员.不带参数的构造函数称为“默认构造函数”. 无论何时,只要使用 new 运算符实例化对象,并 ...
- 使用Pechkin将HTML网页转换为PDF
Pechkin开源组件使用wkhtmlbox,可以解析CSS样式,将网页转换为PDF文件, 支持URL,或者HTML字符串 1, 从NuGet程序管理器中获得Pechkin GlobalConfig ...
- js实现表格的增删改查
这份代码实现了对表格的增加,删除,更改,查询. 点击一次添加按钮,表格会增加一行. 点击重置按钮,输入框的内容会被清空. 添加一行后,最后两格为更改和删除.点击更改,原有内容会各自显示在一个输入框内, ...
- 使用idea Live Template实现eclipse syso自动提示代码功能
转载:http://blog.sina.com.cn/s/blog_4c4195e70102wh7e.html 具体步骤: 1.点击File-->Setting-->Live Templa ...
- Python批量重命名
某无聊的下午的一个小需求 import os dirPath = r'' #路径 format = r'' #后缀 name = 0 for file in os.listdir(dirPath): ...
- 【转】Oracle + PHP Cookbook(php oracle clob 长度超过4000如何写入)
在甲骨文LOB和PHP工作 由哈里Fuecks 达到4,000字节的限制?输入LOB ... 在这个"Oracle + PHP Cookbook"HowTo中,您将学习可用的L ...
- 运行机制和JVM
Java代码编译后生成一种与平台无关的字节码(也就是class文件).当然,这种字节码不是可执行的,必须使用Java解释器来解释执行. 负责解释执行字节码文件的是Java虚拟机,即JVM.JVM是可运 ...