H.264标准----概念和定义

H264标准学习基础1 参考博文 https://blog.csdn.net/xiexingshishu/article/details/39323515 参考此博文中对源、解码图像中色度采样结构,亮度数组色度数组之间的关系的分析。 表格1-1 色度结构样式 chroma_format_idc 色彩格式 SubWidthC SubHeightC 0 单色 – – 1 4:2:0 2 2 2 4:... 阅读详情
  1.   访问单元:一系列NAL单元,包含一个primary coded picture,也可以包含一系列redundant coded pictures和一个auxiliary coded picture。
    
  2.   逐行扫描:每个frame进行frame coding
    

隔行扫描:每个frame可以选择frame coding还是field coding

  1.   inter预测的direct预测模式分为时域和空域预测两种,都不传MV
    
  2.   layer:序列层,图像层,片层,宏块层
    
  3.   宏块地址:非MBAFF的MB为光栅扫描序号;MBAFF的MB,每个宏块对的顶宏块为光栅扫描序号×2,底宏块为顶宏块+1.
    
  4.   宏块位置:(x,y)表示 每右移一次,x+1
    

非MBAFF的宏块,下移一次y+1

MBAFF的宏块对,下移一次y+2,如果是底宏块则再y+1

  1.   只有MBAFF才有宏块对(又分为帧/场宏块对) 其余分为宏块单独存在,分为帧编码和场编码
    
  2.   nal_ref_idc = 0表示该场/帧/图像不作参考使用
    
  3.   每个slice头部有pic_parameter_set_id,确定一个图像参数集
    
  4. 由对应图像参数集里的seq_parameter_set_id确定的序列参数集,图像参数集由slice header里面的pic_parameter_set_id确定

  5. POC(picture order count) 代表IDR后解码顺序的图像计数值,或者清空所有ref pic后的图像计数值

  6. run(游程)表示非零系数前0值系数的数目

  7. RBSP最后,加上一个一个截止位1

  8. SODB(string of data bits),代表语义元素,出现在RBSP截止位之前

SODB就是编码后的原始数据,封装成RBSP后装入NAL单元内

  1. 比特流格式:NAL单元流和字节流,其中,附录B讲述NAL单元的组成和NAL语义

字节流是NAL单元加上起始前缀和一系列零字节后得到的,可以相应地提取出NAL单元来;

NAL单元流由NAL单元构成。

  1. 辅助编码图片用于阿尔法混合(透明度混合)

  2. chroma_format_idc代表采样率,决定色度分量块的高SubHeightC和宽SubWidthC

separate_colour_plane_flag代表三个分量平面是否用独立的大小

MbWidthC = 16/SudWidthC 当c_f_i=0或者s_c_p_f = 1时为0

MbHeightC = 16/SubHeightC当c_f_i=0或者s_c_p_f = 1时为0

  1. 顺序:Y->Cb->Cr

  2. slice:非MBAFF,是一系列宏块;MBAFF,是一系列宏块对

  3. separate_colour_plane_flag = 1时,每个分量被分别调入各自的slice(由colour_plane_id区别);也就是说需要三个slice去储存每个原来一个slice的三个分量

  4. 宏块分割和扫描顺序

见标准Figure6-9 6-10 6-11

每个4×4或8×8的luma block则是raster scan顺序

  1. 反向扫描过程

InverseRasterScan(a,b,c,d,e)

当e=0时, 结果为( a%(d/b) )*b

当e=1时, 结果为 ( a/(d/b) )*c

a:宏块地址(宏块序号) b:宏块宽度 d:图像/区域/块宽度 c:宏块/宏块对高度 e:标志

返回的单位是像素,本宏块的相对像素起始(x,y)

宏块 => 图像/片/帧

宏块分割 => 宏块

子宏块分割 => 子宏块

MbaffFrameFlag = 0

MbaffFrameFlag = 1

x = InverseRasterScan(

mbAddr,16,16,PicWidthInSamples,0)

y = InverseRasterScan(

mbAddr,16,16,PicWidthInSamples,1)

x0 = InverseRasterScan(

mbAddr/2,16,32,PicWidthInSamples,0)

y0 = InverseRasterScan(

mbAddr/2,16,32,PicWidthInSamples,1)

frameMB:(宏块对里宏块没有重组)

    x = x0

    y = y0 + (mbAddr%2)*16

fieldMB:(宏块对里宏块已经重组)

    x = x0

    y = y0 + (mbAddr%2)
  1. 宏块分割 得到值MbPartWidth MbPartHeight

对应P_8×8,P_8×8ref0或者B_8×8,有SubMbPartWidth和SubMbPartHeight

  1. 反向宏块分割扫描

x = InverseRasterScan(

mbPartIdx, MbPartWidth( mb_type ), MbPartHeight( mb_type ), 16, 0 )

y = InverseRasterScan(

mbPartIdx, MbPartWidth( mb_type ), MbPartHeight( mb_type ), 16, 1 )

mbPartIdx表示宏块里面的分割块序号,可以有16×16,16×8,8×16,8×8四种分割

反向子宏块分割扫描

mb_type = P_8x8, P_8x8ref0, or B_8x8,

others

x = InverseRasterScan(

subMbPartIdx,

SubMbPartWidth(sub_mb_type[mbPartIdx])

SubMbPartHeight(sub_mb_type[mbPartIdx]),

8, 0 )

y = InverseRasterScan(

subMbPartIdx, SubMbPartWidth(sub_mb_type[mbPartIdx]),

SubMbPartHeight(sub_mb_type[mbPartIdx]),

8, 1 )

x = InverseRasterScan(

subMbPartIdx, 4, 4, 8, 0 )

y = InverseRasterScan(

subMbPartIdx, 4, 4, 8, 1 )

//----默认子宏块分割成4×4的块

此处 sub_mb_type为数组,分别记录了每个mbPartIdx对应的子宏块类型,此处mbPartIdx就是子宏块号,它的分割被subMbPartIdx索引

  1. 块扫描(得到每个分块相对于该宏块起点的起始偏移(x,y))
  1.     4×4luma
    

将16×16宏块分为4个8×8的块,再把8×8的块分成4个4×4的块

x = InverseRasterScan( luma4x4BlkIdx / 4, 8, 8, 16, 0 ) +

InverseRasterScan( luma4x4BlkIdx % 4, 4, 4, 8, 0 )

y = InverseRasterScan( luma4x4BlkIdx / 4, 8, 8, 16, 1 ) +

InverseRasterScan( luma4x4BlkIdx % 4, 4, 4, 8, 1 )

  1.     4×4chroma
    

当ChromaArrayType = 3时使用,同4×4luma

  1.     8×8luma
    

x = InverseRasterScan( luma8x8BlkIdx, 8, 8, 16, 0 )

y = InverseRasterScan( luma8x8BlkIdx, 8, 8, 16, 1 )

  1.     8×8chroma
    

当ChromaArrayType = 3时使用,同8×8luma

  1. 宏块地址可用性---------------获得mbAddr

当mbAddr < 0 ; mbAddr > CurrMbAddr ; mbAddr 与 CurrMbAddr属于不同Slice,则mbAddr不可用;

当MbaffFrameFlag = 0时

mbAddrX代表X的地址和其可用性

mbAddrA = CurrMbAddr – 1

当CurrMbAddr % PicWidthInMbs=0时不可用

mbAddrB = CurrMbAddr − PicWidthInMbs

mbAddrC = CurrMbAddr − PicWidthInMbs + 1

当( CurrMbAddr + 1 ) % PicWidthInMbs = 0时不可用

mbAddrD = CurrMbAddr − PicWidthInMbs – 1

当CurrMbAddr % PicWidthInMbs=0时不可用

  1. 相邻宏块,块,分割可用性的推导过程

N

xD

yD

A

-1

0

B

0

-1

C

predPartWidth

-1

D

-1

-1

MbaffFrameFlag = 0时

  1.   由相对于当前宏块左上角位置的偏移(xN,yN)得到可用性的过程:
    

亮度:maxW = maxH = 16

色度:maxW = MbWdithC,maxH = MbHeightC

由(xN,yN)得到对应mbAddr

xN

yN

mbAddrN

<0

<0

mbAddrD

<0

0…maxH-1

mbAddrA

0…maxW-1

<0

mbAddrB

0…maxW-1

0…maxH-1

CurrMbAddr

maxW-1

<0

mbAddrC

maxW-1

0…maxH-1

不可用

maxH-1

不可用

得到对应于mAddr里偏移的位置(xW,yW)

xW = (xN + maxW)%maxW

yW = (yN + maxH)%maxH

只要有mbAddrN,则该宏块就可用,相应信息比如mb_type等等写入该结构体

  1.   相邻宏块可用性
    

输出为mbAddrA和mbAddrB

xN = xD,yN = yD

计算mbAddrN

  1.   相邻8×8亮度块可用性
    

输入:luma8×8BlkIdx,当前宏块的8×8亮度块序号

输出:mbAddrA(可能等于CurrMbAddr,也可能是左边一个MbAddr),luma8×8BlkIdxA,mbAddrB,luma8×8BlkIdxB

步骤:

xN = (luma8×8BlkIdx%2)*8 + xD

yN = (luma8×8BlkIdx/2)*8 + yD

计算mbAddrN并得到(xW,yW);

计算luma8×8BlkIdxN(如果mbAddrN不可用,则它也不可用)

  1.   相邻8×8色度块可用性(ChromaArrayType = 3)
    

同8×8亮度块

  1.   相邻4×4亮度块可用性
    

输入:luma4×4BlkIdx

输出:mbAddrA,luma4×4BlkIdxA,mbAddrB,luma4×4BlkIdxB

步骤:

进行块扫描得到相对于当前宏块的起始偏移(x,y)

xN = x + xD; yN = y + yD

计算mbAddrN并得到(xW,yW)

计算luma4×4BlkIdxN

  1.   相邻4×4色度块可用性
    

ChromaArrayType = 1,2

输入:chroma4×4BlkIdx

输出:mbAddrA,chroma4×4BlkIdxA,mbAddrB,chroma4×4BlkIdxB

步骤:

  x = InverseRasterScan( chroma4x4BlkIdx, 4, 4, 8, 0 )

y = InverseRasterScan( chroma4x4BlkIdx, 4, 4, 8, 1 )

xN = x + xD; yN = y + yD

计算mbAddrN并得到(xW,yW)

计算chroma4×4BlkIdxN

ChromaArrayType = 3

同4×4亮度块

  1.   相邻分区(划分子宏块)可用性
    

输入:mbPartIdx (当前宏块分区号/当前子宏块号)

currSubMbType(当前子宏块类型)

subMbPartIdx(当前子宏块里面的分区号)

输出:mbAddrN/mbPartIdxN/subMbPartIdxN (N=A/B/C/D);

步骤:

(1)扫描出当前宏块分割相对于宏块的偏移(x,y),即子宏块相对于宏块的偏移

(2)如果mb_type为P_8x8, P_8x8ref0 or B_8x8,扫描出当前子宏块里分区相对于子宏块的偏移(xS,yS),否则(xS,yS) = (0,0)

(3) 表中predPartWidth的确定:

  mb_type = P_skip/B_skip/B_Direct_16×16:predPartWidth = 16

  mb_type = B_Direct_8×8:predPartWidth = 16

  mb_type = P_8×8/B_8×8(非B_Direct_8×8):

predPartWidth = SubMbPartWidth( sub_mb_type[ mbPartIdx ] )

    其他:predPartWidth = MbPartWidth( mb_type )

 (4) xN = x+xS+xD; yN = y+yS+yD

   计算mbAddrN,得到(xW,yW)

 (5)如果mbAddrN不可用,mbAddrN/mbPartIdxN/subMbPartIdxN不可用

   否则:   mbTypeN和相应submbtypeN(如果有)被赋给mbAddrN

宏块中,覆盖(xW,yW)的宏块分割块被指定为mbPartIdxN,相应覆盖(xW,yW)的子宏块分割块被指定为subPartIdxN,如果相应mbPartIdxN和subPartIdxN还没有被解码出来,则不可用

  1. 块和分区的index计算方法

输入:(xP,yP) 代表相对于该宏块(亮度/色度)的偏移

输出:

luma4×4BlkIdx = 4*(x/8) + ( (x%8)/4 ) + 8*(y/8) + 2*( (y%8) /4 )

chroma4×4BlkIdx = 2*(y/8) + (x/8) (ChromaArrayType = 1,2)

luma8×8BlkIdx = 2*(y/8) + (x/8)

mbPartIdx和subMbPartIdx

mbType为I宏块,mbPartIdx = 0 I宏块不分区,

否则,mbPartIdx = 2 * ( yP / MbPartHeight( mbType ) ) + ( xP / MbPartWidth( mbType ) )

mbType为非P_8×8,P_8×8ref0,B_8×8,B_skip,B_Direct_16×16,subMbPartIdx = 0

mbType为B_skip,B_Direct_16×16,subMbPartIdx = 2 * ( ( yP % 8 ) / 4 ) + ( ( xP % 8 ) / 4 )

mbType为P_8×8,P_8×8ref0,B_8×8,

subMbPartIdx = 2 * ( ( yP % 8 ) / SubMbPartHeight( subMbType[ mbPartIdx ] ) )

+( ( xP % 8 ) / SubMbPartWidth( subMbType[ mbPartIdx ] ) )

总结: I宏块中,只有luma4×4BlkIdx,luma8×8BlkIdx,mbPartIdx=0,宏块不分区

   P/SP/B宏块,如果不是8×8   subMbPartIdx = 0,无子宏块分区
  1. NAL单元:网络抽象层,包含一些信息,分为NAL头和RBSP

RBSP:有各种类型,如果是编码片(或分区)数据,形成的NAL单元就是VCL NAL单元

非VCL NAL单元的NAL单元,里面的RBSP就是一些信息,比如PPS和SPS等控制信息

访问单元:包含一个完整编码图像,由一些NAL单元组成

视频序列:包含一系列访问单元,第一个必须是IDR访问单元,并且有且只有一个IDR访问单元

视频:包含一些视频序列

H264——H264中的宏块(macroblock)、片(slice)、帧(frame) 这里写自定义目录标题前言宏块(macroblock)宏块种类片(slice)slice组帧(frame)序列 前言 若干个块组成宏块 若干个宏块组成条带 若干个条带组成一帧 若干帧组成一段视频 宏块(macroblock) H264中,以16x16的宏块为编码最小单元,一个宏块可以被分成多个4x4或8x8的块 当然,像素块越小,编码的复杂度也会随之增加,编码效率自然就会降低。但是这样是值得的,因为图像的压缩效率有了显著提高,也就是编码后得到的相同质量的图像,H.264的压缩比更大,占用的空间及带宽 阅读详情

相关推荐

H264---帧/场编码模式选择---PAFF MBAFF frame_mbs_only_flag mb_adaptive_frame_field_flag field_pic_flag

1、片头的field_pic_flag ,指定当前图像是帧编码(0)还是场编码(1)。这个元素在同一图像的所有片中应具有相同值。 2、sps中的frame_mbs_only_flag mb_adaptive_frame_field_flag再加上本句法元素共同决定图像的编码模式。 1、frame_mbs_only_flag (位于sps) = 0 表示编码视频序列的编码图像可能是编码场或编码帧。 = 1 表示编码视频序列的每个编码图像都是一个仅包含帧宏块的编码帧 2、mb_a

qq_42024067的博客 2227

HEVC熵编码原理解读之transform_tree(一)

HEVC熵编码原理解读之transform_tree(一)

verycoollv的博客 1403

2025东三省D题深圳杯数学建模实战解析:基于多模型融合的法医STR混合样本智能识别系统

本文深入解析了2025年东三省数学建模竞赛D题,即深圳杯赛题,聚焦于法医STR混合样本的智能识别挑战。文章系统阐述了构建一个基于多模型融合的智能识别系统的完整流程,涵盖贡献者人数判定、DNA贡献比例估计、个体基因型推断以及STR谱图去噪四大核心步骤。通过融合高斯混合模型、随机森林、非负矩阵分解、小波变换与深度学习等多种技术,并强调特征工程的重要性,为破解法医DNA混合样本分析这一行业难题提供了清晰的数学建模与AI实战思路。

weixin_29050271的博客 359

h264码流结构

H264 码流实际可以理解为由一个一个的 NALU 单元组成。一个NALU的组成结构如下:其中。

柳依依 2246

RTP Payload Format for H.264 Vide(1)

● 编码视频序列(coded video sequence):按解码顺序排列的访问单元序列,由一个瞬时解码刷新(IDR)访问单元开始,后面跟着零个或多个非IDR访问单元,直到下一个IDR访问单元(不包括该IDR单元)为止。但在存在错误或丢包的码流中,冗余编码图像的内容可用于解码处理。● 默认子配置(default sub-profile):编码工具的子集,可以是一个profile的全部编码工具,也可以是多个profile共有的编码工具子集,由 profile-level-id 参数指示。

Dada_ping的博客 990

H.264/AVC结构详解

http://blog.sina.com.cn/s/blog_b89b43b201017vob.html 名词解释 场帧:视频的一场或一帧可用来产生一个编码图像。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。 宏块、片::一个编码图像通常划分成若干宏块组成,一个宏块由一个16×16亮度像素附加的一个8×8 Cb一个8×8 Cr彩色像素块组成。每个图象中

Adrian 博客 1245

H.264宏块(Macroblock)概念(运动估计、变换编码、环路滤波)

在视频压缩技术中,宏块是最基本的处理单元。每个宏块通常包含16x16的像素点,这些像素点共享某些参数,例如运动矢量编码模式等。这种方式极大地减少了必须处理的数据量,同时也提高了编码效率1。

Dontla的博客 2597

H.264 H.264RTP发送接收

1.预备知识 RTP包头的格式。 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |V=2|P|X| CC |M| PT | sequencenumber |

DaLaoZi的专栏 714

iOS RTMP 视频直播开发笔记(3)- 了解 H.264 编码

iOS RTMP 视频直播开发笔记(3)- 了解 H.264 编码

qq_33777090的博客 2152

H264阅读笔记一——范围定义

记录阅读ITU-T H.264建议书 | ISO/IEC国际标准ISO/IEC 14496-10视频编码的读书笔记。

yupinghuang5192的博客 152

H265_HEVC编解码系列(2):CTB的四叉树分割语法

H265/HEVC编解码系列(2):CTB的四叉树分割一、CTU产生以及四叉树分割1、CTU的产成2、四叉树分割参考 一、CTU产生以及四叉树分割 1、CTU的产成   上篇大致看了一下CTU是如何一步步划分的。下面我们说说,CTU具体是怎样得到的。上面这个图,我们现在只需要看红框里的部分,图中的第①部就是接下来要讲的。如果是yuv420采样,CTU可以分为luma CTBchroma CTB,我们就统一按照CTB来分析吧,对两种CTB处理上都是一样的。首先一幅图片会被分割成许多个大小一样的CTB块,但

qq_39565868的博客 2350

从Slice_Header学习H.264(一)--片头语法元素介绍

从Slice_Header学习H.264   写在前面: $     H.264我是结合标准毕厚杰的书一块学的。看句法语义时最是头疼,一大堆的元素,很需要耐心。标准中在介绍某个元素的语义时,经常会突然冒出与之相关的另一个变量,这个变量一般都在前文中讲过,但那么多变量怎么可能看一遍就记住?这时我只能去前面重新找这个变量再看一遍。没办法,H.264这个庞大的结构内部肯定是环环相扣的,各个部分联

NewThinker_wei 的专栏 1万+

H264/AVC-帧内预测相邻像素推导过程

帧内预测过程会以相邻块的像素值做参考,来预测当前块的像素值。以Intra_4x4为例,如下图所示,需要用到的13个相邻像素值,那么如何获取这13个像素值? 本文要主要说明如何获取帧内预测所用到的相邻像素。对应参考文档6.4.5-6.4.9小节内容。 获取相邻像素的流程如下: 找到当前块(可以为4x4、8x8、16x16大小)的左、上、右上、左上相邻块 找到左、上、右上、左上相邻块所在宏块 根据当前宏块以及相邻块所在宏块确定相邻像素 在此之前需要先知道宏块地址是否可用,如果宏块地址不可用,则在该宏块的相

qq_42139383的博客 1775

h264编码概述四(宏块定义

一、宏块的定义 宏块是视频信息的主要承载者。一个编码图像通常划分为多个宏块组成.包含着每一个像素的亮度色度信息。视频解码最主要的工作则是提供高效的方式从码流中获得宏块中像素阵列。 一个宏块 = 一个16*16的亮度像素 + 一个8×8Cb + 一个8×8Cr彩色像素块组成。(YCbCr 是属于 YUV 家族的一员,在YCbCr 中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度...

CrystalShaw的博客 6137

H.264官方手册之帧间预测

只有解码 P B类型的宏块时才能调用该过程。该过程的输出为当前宏块的帧间预测采样点,是一个16x16的亮度采样点 pred(Luma)。以及当ChromaArrayType不等于0时输出 pred(Cb)与pred(Cr)如果mb_type为B_Skip或者B_Direct_16x16,mbPartIdx的范围为0~3,否则(mb_type不等于B_Skip或者B_Direct_16x16),mbPartIdx的范围为0到numMbPart (mb_type)-1。

gsp12356的博客 705

H264 CAVLC学习笔记

H.264 CAVLC学习笔记编码过程:1) 初始值设定:2) 编码coeff_token:3) 编码所有TrailingOnes的符号:4) 编码除了拖尾系数以外非零系数幅值Levels:(1)将有符号的Level转换成无符号的levelCode;(2)计算level_prefix:(3)计算level_suffix:(4)根据suffixLength的值来确定后缀的长度;(5)...

lichtenlade的博客 1268

2025资源从哪里来!

研究网络通信中的安全问题,如VLAN划分、路由协议(静态、动态如OSPF、BGP)、NAT转换、AAA认证、访问控制列表(ACL)等。‌Wi-Fi安全设置‌、‌密码破解原理‌(仅用于合法测试或教育目的)、‌常见Web安全问题‌如SQL注入、XSS跨站脚本攻击等的防范措施。在这个网站你可以找到你对应的专业-对应的路线-对应的资源-对应的百度网盘里面全是免费的资源------------------惊喜不?‌防火墙配置与策略‌、‌入侵检测与防御系统(IDS/IPS)‌、‌端口扫描与漏洞扫描技术‌等。

qq_56248592的博客 1875

3D Object Converter V4.4 汉化版

强大3D模型转换交互式查看软件软件介绍:是不是常常为不知道如何打开PLY、RAW、COB等3D文件格式而犯愁呢?3D Object Converter 是一个强大的3D文件浏览及转换工具,到目前的V4.0为止它已经可以支持多达468种3D文件格式!无论是像LWO(LightWave)、C4D(Cinema 4D)、XSI(Softimage XSI)、3DM(Rhinoceros)、LXO(Luxology Modo)等这样的常用三维软件文件格式,还是像MDX(Warcraft III)、MD3(Quake III)、3DO(3DO Builder)、P(Final Fantasy 7)等这样经典游戏内的模型三维格式它都可以读取或转换。软件可运行于 Windows95/98/Me/NT/2K/2003/XP/XP 64/VistaA powerful 3d model translation and interactive viewing shareware tool that allows arbitrary 3d model data to be imported from external sources, exported to various industry standard 3d file formats with great accuracy and quality. The program supports 468 file formats.It is available for Windows95/98/Me/NT/2K/2003/XP/XP 64/Vista.

上一篇: websocketpp实例
下一篇: 【H264/AVC 句法和语义详解】(三):NALU详解二(EBSP、RBSP与SODB)
NBA_1
博客等级 码龄15年 59粉丝 34原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值