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 ...
随机推荐
- 继承control的自定义TextBox
继承control的自定义TextBox 下面来介绍一下本人写的一个自定义的textbox,首先说一下写这个控件遇到的几个难点:第一.关联输入法:第二.画字符串和焦点线 先随便上两张效果图吧: 下面这 ...
- 性能测试工具比较:LoadRunner vs JMeter - 测试结果数据比较
对web请求(HTTP/HTML)进行性能测试,确认请求响应时间.分别使用Loadrunner和JMeter进行测试,比较测试结果. 1.LoadRunner测试web请求响应时间 1.1 编制(录 ...
- [每日一题] OCP1z0-047 :2013-07-19 Rules of Precedence――括号的使用
这道题目的意思是你的公司决定给所有呆到5年或5年以上的所有员工每个月加50美元,然后算出总的年薪.每个月薪水:salary,每个月加到:salary+50,总的年薪: (salary+50)*12. ...
- 更新android SDK的问题
由于我大天朝将google屏蔽的原因,在更新android SDK的时候,可能速度慢还是个小问题,重要的是你更新的时候出各种错误,比如错误 Failed to fetch URL https ...
- .NET基础——运算符
这一篇我们来讲解C#中的运算符 1. C#中的算术运算符 5个算数运算符:+ - * / % 它们都是二元运算符,* / % 的运算优先级相同,并且高于 + - ,+ - 的运 ...
- .NET并行与多线程学习系列一
并行与多线程学习系列一 一.并行初试: public static void test() { ; i < ; i++) { Console.WriteLine(i); } } public s ...
- oracle if else 判断
CREATE OR REPLACE FUNCTION fn_GetClassifyBymxmjazfs (v_azfs varchar2,v_mx varchar2,v_mj varchar2) re ...
- mac 显示隐藏文件方法
终端执行命令: 显示:#defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:#defaults write com.apple ...
- Hadoop入门实例——WordCount统计单词
首先要说明的是运行Hadoop需要jdk1.6或以上版本,如果你还没有搭建好Hadoop集群,请参考我的另一篇文章: Linux环境搭建Hadoop伪分布模式 马上进入正题. 1.启动Hadoop集群 ...
- JavaEE XML DOM创建
DOM创建XML @author ixenos 1.思路: 先封装构建一颗DOM树,然后将DOM树转换成XML文件 2.三种写DOM树到XML文件的方式: 1)使用DOM(或DOM4J.JDOM) 2 ...