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 ...
随机推荐
- 彩蛋 Python之道
彩蛋 Python之道 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 使用下面的语句可以调出Python中的一个彩蛋, impo ...
- 解析JSON、扩展Fiddler
解析JSON.扩展Fiddler 按文章结构,这部分应该给出WCFRest项目示例,我想WinForm示例足够详尽了,况且WCFRest还不需要使用插件AppDomain那一套,于是把最近写的Fidd ...
- 【Oracle】-【体系结构】-【DBWR】-DBWR进程相关理解
对DBWR的一些理解 首先从名称上,DBWR全称是Database Writer Process,属于Oracle后台进程的一种,有的地方也叫DBWn,我想这里是出于DBWR进程个数的原因,DBWR进 ...
- IP、子网的详述 ——IP分类、网关地址,子网掩码、子网作用(转)
IP地址 在Internet上连接的所有计算机,从大型机到微型计算机都是以独立的身份出现,我们称它为主机.为了实现各主机间的通信,每台主机都必须有一个唯一的网络地址.就好像每一个住宅都有唯一的门 ...
- IK分词器 IKAnalyzer 简单demo
所用IKAnalyzer:IK-Analyzer-2012FF 百度云:http://pan.baidu.com/s/1bne9UKf 实例代码: package com.test.ik.anal ...
- Linux中最受欢迎的邮件传输代理(MTA)
MTA(Mail transfer Agent) -对于服务器管理员来说,邮件传输代理是最为重要的工具.MTA的主要工作就是将电子邮件从一台主机发送到另一台主机.MTA使用SMTP(简单邮件传输协议) ...
- Thymeleaf 笔记
th:each=”aname : ${namelist}” th:if=”${name} == ‘SERVICED’” 页面使用Map集合 <div th:each="osl : ${ ...
- mysql建立、删除索引及使用
同步发布:http://www.yuanrengu.com/index.php/2017-01-13.html 一.索引的作用 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少 ...
- MVC源码解析 - 配置注册 / 动态注册 HttpModule
本来这一篇, 是要继续 Pipeline 的, 但是在 Pipeline之前, 我看到了InitModules()方法, 所以决定, 在中间穿插一篇进来. 这一篇来讲一下 IHttpModule 的加 ...
- 什么是MongoDB、特点、历史、下载和工具
什么是MongoDB ?MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨在为WEB应用提供可扩展 ...