H264标准学习-base1

2023-10-27

参考博文

https://blog.csdn.net/xiexingshishu/article/details/39323515
https://blog.csdn.net/fanbird2008/article/details/47122091

1.亮度和色度采样
参考此博文中对源、解码图像中色度采样结构,亮度数组和色度数组之间的关系的分析。

表格1-1 色度结构样式

chroma_format_idc 色彩格式 SubWidthC SubHeightC
0 单色
1 4:2:0 2 2
2 4:2:2 2 1
3 4:4:4 1 1

总结:样点是以宏块为单位进行处理的,每个宏块中的样点阵列的高和宽度均为16个采样点,变量MbWidthC和MbHeightC分别定义了每个宏块中色度阵列的高度和宽度:

MbWidthC = 16/SubWidthC;
MbHeightC= 16/SubHeightC;

2.反向扫描过程
2.1宏块扫描

  在非宏块对的情况下:A和B宏块序号不连续,相差图像一行宏块个数。即按光栅扫描顺序编号.

  在帧宏块对的情况下:A和B宏块序号连续,即按照锯齿扫描顺序编号。A、B组成不变。A称为顶帧宏块,B称为底帧宏块。

  在场宏块对的情况下:A、B宏块序号连续,即按照锯齿扫描顺序编号。但是这个时候A是由原来A、B两个宏块中的奇数行像素组成,称为顶场宏块;而B是由原来A、B两个宏块中偶数行像素组成,称为底场宏块。

      

场宏块对

2.1宏块相对位置计算
位置计算的输入一般是宏块地址、宏块分割的索引或者子宏块分割的索引、4x4亮度块索引、8x8亮度块索引、
  1. 输入为宏块地址addr,计算与图像相对x、y坐标
InverseRasterScan(a,b,c,d,e)
当e=0时, 结果为( a%(d/b) )*b
当e=1时, 结果为 ( a/(d/b) )*c
a:表示地址,地址是序号相关的,
反向扫描中addr序号对应的宏块的相对位置x,y
MbaffFrameFlag为0时,表示非宏块对出现
x=InverseRasterScan(addr,16,16,sampleWidth,0);
y=InverseRasterScan(addr,16,16,sampleWidth,1);
MbaffFrameFlag为1时,表示宏块对出现先计算x1、y1
x1 = InverseRasterScan(addr/2,16,32,sampleWidth,0);
y1 = InverseRasterScan(addr/2,16,32,sampleWidth,1);
接下来就是根据帧宏块和场宏块区分,如果是帧宏块那么y的值需要加上(addr%2)*16,场宏块y的值加上(addr%2)。
  1. 输入为宏块分割的索引mbPartIdx,计算与宏块相对x、y坐标
x= InverseRasterScan(mbPartIdx,MbPartWidth(mb_type),MbPartHeight(mb_type),16,0);
y= InverseRasterScan(mbPartIdx,MbPartWidth(mb_type),MbPartHeight(mb_type),16,1);
  1. 输入为子宏块分割的索引mbPartIdx和子宏块分割索引subMbPartIdx,计算子宏块分割subMbPartIdx中左上角亮度样点与所处子宏块相对x、y坐标
if mbtype in P_8x8、P_8x8ref()、B_8x8
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);
else 
x = InverseRasterScan(SubmbPartIdx,4,4,8,0);
y = InverseRasterScan(SubmbPartIdx,4,4,8,1);

4.反向4x4亮度块位置计算,输入为4x4亮度块的索引luma4x4Blkidx,输出对应的是其左上角相对于宏块左上角位置x、y坐标
在这里插入图片描述

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);

4.反向8x8亮度块位置计算,输入为4x4亮度块的索引luma8x8Blkidx,输出对应的是其左上角相对于宏块左上角位置x、y坐标

x= InverseRasterScan(luma8x8Blkidx,8,8,16,0) 
y=  InverseRasterScan(luma4x4Blkidx/4,8,8,16,1) 
2.1宏块可用性
2.1.1宏块地址及可用性推导
1.宏块地址可用性,输入是一个 宏块地址mbAddr,输出为可用性信息,存在以下条件时,宏块标志为不可用:
mbAddr <0 
mbAddr > CurrMbAddr
地址为mbAddr的宏块和地址为CurrMbAddr的宏块属于不同条带

2.相邻宏块地址可用性,输入是一个 宏块地址mbAddr,输出为可用性信息,存在以下条件时,宏块标志为不可用:
                          在这里插入图片描述
图示表示地址为mbAddr、mbAddrB、mbAddrC和mbAddrD的宏块与地址为CurrMbAddr的当前宏块在空间上的相对位置。

mbAddrA = CurrMbAddr -1,输出为mbAddr 宏块是否可用,当CurrMbAddr%PicWidthInMbs = 0时,mbAddrA标识为不可用
mbAddrB = CurrMbAddr -PicWidthInMbs ,输出为mbAddrB是否可用
mbAddrC = CurrMbAddr - PicWidthInMbs  +1 当(CurrMbAddr + 1)%PicWidthInMbs =0时,mbAddrC 标识为不可用
mbAddrD = CurrMbAddr  - PicWidthInMbs  -1 当CurrMbAddr  % PicWidthInMbs = 0时标识为不可用。

3.MBAFF帧中相邻宏块地址可用性推导,当MbaffFrameFlag为1,调用本过程
             在这里插入图片描述

mbAddrA =2*( CurrMbAddr /2-1),输出为mbAddr 宏块是否可用,当(CurrMbAddr/2)%PicWidthInMbs = 0时,mbAddrA标识为不可用
mbAddrB = 2*( CurrMbAddr /2 -PicWidthInMbs) ,输出为mbAddrB是否可用
mbAddrC = 2*( CurrMbAddr /2 - PicWidthInMbs  +1) 当( CurrMbAddr /2+ 1)%PicWidthInMbs =0时,mbAddrC 标识为不可用
mbAddrD = 2*( CurrMbAddr /2  - PicWidthInMbs  -1 )当( CurrMbAddr /2)% PicWidthInMbs = 0时标识为不可用。
2.1.2相邻宏块、块和分割块的推导过程
如下表规定了输入的亮度位置差分值(xd,yd)和N的对应关系。N表示输出的mbAddrN、mbPartIdxN、subMbPartIdxN、luma8x8BlkIdxN、luma4x4BlkIdxN和chroma4x4BlkIdxN中N的替换值。
N xD yD
A -1 -1
B 0 -1
C prePartWidth -1
D -1 -1
对应的与当前快的位置关系如下图

在这里插入图片描述下面重点描述相邻4x4色度快的推导以及相邻分割快的推导过程

  1. 4x4色度块的推导输入值为索引chroma4x4BlkIdx,输出为mbAddrA、chroma4x4BlkIdxA、mbAddrB、chroma4x4BlkIdxB可用性状态,计算方法如下:根据chroma_format_idc的不同取值,索引为chroma4x4BlkIdx的4x4色度快左上角位置(x,y)推导
chroma_format_idc == 1或者2时
x= InverseRasterScan(luma4x4Blkidx%4,4,4,8,0);
y= InverseRasterScan(luma4x4Blkidx%4,4,4,8,1);
chroma_format_idc == 3
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);
色度位置 xN = x + xD,yN=y+yD,调用下面2.2中相邻位置推导过程,以(xN,yN)作为输入,输出分别赋值给mbAddrN和(xW,yW)
  1. 相邻分割块的推导过程,本过程的输入为宏块分割索引mbPartIdx、当前子宏块类型currSubMbType、子宏块分割块的索引subMbPartIdx,输出为mbAddr/mbPartIdxA/subMbPartIdxA(当前宏块左侧的宏块或子宏块分割块机器可用性状态,或者是子宏块分割快CurMbAddr/mbPartIdx/subMbPartIdx左侧宏块或者子宏块分割快及可用性状态)
以mbPartIdx作为输入,计算得到反向宏块分割扫描的(x,y)坐标
以subMbPartIdx作为输入,调用反向子宏块分割的扫描过程计算得到(xS,yS)坐标
xN = x + xS +xD
yN = y + yS +yD
获取亮度位置,以(xN,yN)为输入,调用下面2.2中相邻位置推导过程,输出赋值给mbAddrN和(xW,yW)
如果mbAddrN不可用,将宏块或者子宏块标志为不可用
mbAddrN可用那么,宏块mbAddr中覆盖亮度位置(xW,yW)的宏块分割快被指定为mbPartIdxN,而且在宏块mbAddrN内,宏块分割mbPartIdxN中覆盖亮度位置(xW,yW)的子宏块分割快被指定为subMbPartIdxN
当mbPartIdxN和subMbPartIdxN还没有被解码时,将宏块分割块mbPartIdxN和子宏块分割块subMbPartIdxN标志为不可用。
2.2 相邻位置推导过程
xW = (xN + maxW)% maxW
yW = (yN+maxH)%maxH
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

H264标准学习-base1 的相关文章

  • 用Python写一个植物大战僵尸

    上次写了一个俄罗斯方块 感觉好像大家都看懂了 这次就更新一个植物大战僵尸吧 植物大战僵尸的话 Python源码 问题解答学习交流群 773162165 引入需要的模块 import pygame import random 配置图片地址 I
  • Spring中IOC详解

    一 IOC的原型 IOC 控制反转 比如我们有一个功能是获取用户数据 我们使用Dao层实现这个功能 再在Service层调用这个功能 但是我们每增加一个接口 比如获取mysql中的数据 就要修改原来的代码 如果再增加一个新的接口 又需要去s
  • 优质github项目集合-珍藏版

    这是是一个聚集优质github项目的整合 推荐收藏 宗旨 GitHubDaily 将于每日不定时推送一批 GitHub 上优秀的开源项目给开发者 帮助开发者们发现当下最火的开源项目 令开发者们得以掌控技术脉搏 扩大自己的技术视野 并从开源项
  • sharepoint 工作经验与技能总结

    可能是由于平时工作比较忙 博客也写得少了 最近偶尔被同行的同事朋友问起 我一直在做sharepoint方面的工作 没有打算换asp net C 方面的工作吗 有的还问了句网上很流行的话 你都会啥绝活 哈哈 被问多了之后 我也还真问自己 工作

随机推荐

  • 华为交换机、路由器设备怎样配置console登录密码

    华为交换机路由器设备怎样配置console密码 在对路由器交换机等网络进行管理中 为了安全起见经常需要为设备配置登录密码 尤其是使用串口线直连设备时 console线路密码认证有两种方式 1 只配置password 密码 2 aaa认证模式
  • 【STM32+cubemx】0024 HAL库开发:IAP(在应用编程)的实现

    IAP在应用编程 In Application Programming 指的是MCU在运行应用程序时 能接收新的烧写文件 并更新到自身的程序存储器中 即可以在应用程序运行时在线升级 本节我们通过一个简单的例子 来实现STM32的IAP功能
  • 大数据学习笔记——zookeeper在hadoop集群中的作用

    zookeeper主要是用来搭建高可用的Hadoop集群 即High Availability 简称 HA 测试中集群是可以不需要高可用的 即使用一个namenode即可 但是在生产环境中为了提高集群的可靠性 需要增加一个namenode备
  • 遇到的有关的二进制的题目整理

    前n个数字二进制中1的个数 解答来自评论区大佬 如果正整数 i 是一个偶数 那么 i 相当于将 i 2 左移一位的结果 因此偶数 i 和 i 2 的二进制形式 1 的个数是一样的 如果 i 是奇数 那么 i 相当于将 i 2 左移一位之后再
  • MySQL索引在关联查询中的作用

    索引关联理解 inner join left join 如果是inner join的话 一边有索引就可以了 如果是left join 主表可以不用索引 但另外张就要索引 切记 小表驱动大表 给被驱动表建立索引 EXPLAIN语句分析出来的第
  • 【剑指 Offer】剑指 Offer 22. 链表中倒数第k个节点

    目录标题 算法汇总 题目 关键点 代码 1 解体方法 思路 代码 时间和空间复杂度 2 解题方法 如暴力法 思路 代码 时间和空间复杂度 算法汇总 以下是所有算法汇总 包括GitHub源码地址链接 力扣算法练习汇总 持续更新 题目 剑指 O
  • 数据结构学习系列之单向链表的查找与修改

    单向链表的查找 根据单向链表数据结点的位置查找数据 代码如下 示例代码 int search link list node t phead int pos int data if NULL phead NULL data printf 入参
  • lua中使用json:table转json与json转table

    直接上代码 json lua JSON4Lua JSON encoding decoding support for the Lua language json Module Author Craig Mason Jones Homepag
  • 基于mybatis拦截器实现数据权限

    需求场景 业务要求对列表查询功能添加数据权限控制 比如 给用户A针对某些订单模块设置一些查询条件 比如地址 山东 运输方式 空运 商品大类 家电 当用户访问订单模块时 只能访问满足这些条件的数据 需求分析 要实现动态条件拼接 需要在执行查询
  • 解析LDO的基本原理与主要参数

    低压差线性稳压器 LDO 的基本电路如图1 1所示 该电路由串联调整管VT 取样电阻R1和R2 比较放大器A组成 取样电压加在比较器A的同相输入端 与加在反相输入端的基准电压Uref相比较 两者的差值经放大器A放大后 控制串联调整管的压降
  • 过滤器实现网站访问计数

    创建一个过滤器 实现网站访问计数器的功能 并在web xml文件的配置中将网站访问量的初始值设置为5000 创建名称为CountFilter的类 创建名称为CountFilter的类 该类实现javax servlet Filter接口 是
  • tf-faster-rcnn config.py 参数详解

    import os import os path as osp import numpy as np pip install easydict if you don t have it from easydict import EasyDi
  • Django 项目学习

    目录 一 环境问题 1 python环境安装 2 django安装 3 IDE选择 二 Django命令 实际使用在后面文章中介绍 三 Django项目和应用的关系 1 Django项目中目录介绍 3 Django应用中目录介绍 四 Dja
  • 嵌入式开发——uboot如何启动内核(以zImage详解)

    1 vmlinuz vmlinux Image zImage与uImage的区别 参考博客 vmlinuz vmlinux Image zImage与uImage的区别 uboot启动内核的大致步骤 1 首先uboot要通过读取SD卡 fl
  • 单路服务器芯片组的发展

    服务器的质保一般为3到5年 但是有的服务器会使用超过十年 所以学习服务器硬件知识 不仅要学习新的知识 还要学习老的 旧的知识 一 单路服务器芯片组发展简介 Q3 06 英特尔发布了3000系列芯片组 其中包括3000和3010芯片组 使用7
  • Android框架BRVAH使用指南

    BRVAH BaseRecyclerViewAdapterHelper 是一个强大并且灵活的RecyclerViewAdapter 集成了大部分列表常用需求解决方案 1 框架引入 将JitPack存储库添加到您的构建文件中 项目根目录下bu
  • Recat 鼠标移动实时显示坐标

    一 React实时显示鼠标坐标事件 从react解构两种方法 import useState useEffect from react 定义方法 状态管理 function useOnMouse var page setPage useSt
  • 机器学习之KNN和决策树

    1 K 临近算法 KNN算法 一 优缺点和适用范围 1 优点 精度高 对异常值不敏感 无数据输入假定 2 缺点 计算复杂度高 空间复杂度高 3 适用数据范围 数值型和标称型 二 原理和算法思想 原理 训练样本集中每个数据都存在标签 输入没有
  • 最新版校园招聘进大厂系列----------(5)百度篇 -----未完待续

    哈喽 大家好 我是 奇点 江湖人称 singularity 刚工作几年 想和大家一同进步 一位上进心十足的 Java ToB端大厂领域博主 喜欢java和python 平时比较懒 能用程序解决的坚决不手动解决 如果有对 java 感兴趣的
  • H264标准学习-base1

    参考博文 https blog csdn net xiexingshishu article details 39323515 https blog csdn net fanbird2008 article details 47122091