一、 YUV 跨距 ( Stride ) 对齐
1、YUV 跨距 概念
Stride 跨距 , 指的是 在 内存中 每行像素 占用的空间 , 由于 系统 对 图像有 跨距对齐 的要求 , 这个 Stride 跨距 可能 大于等于 实际的 图像像素 所占用的 宽度 ;
分辨率为 638 x 480 的 RGB24 格式的图片 , 内存处理时 以 16 字节对齐 ;
RGB24 格式中 R ( 红 ) / G ( 绿 ) / B ( 蓝 ) 每个分量占用 8 位 ( 1 字节 ) , 一个像素总共占用 24 位 ( 3 字节 ) ;
每一行的 实际像素 所占用的内存是 638 * 3 = 1914 字节 ;
需要以 16 字节对齐 , 最后一个字节占用的实际 内存大小 是 1914 % 16 = 10 字节 ,
因此 还需要 额外补充 16 - 10 = 6 字节的填充字节 ,
最终达到 638 * 3 + 6 = 1920 字节 ;
2、YUV 跨距对齐 概念
YUV 跨距 ( Stride ) 对齐 是 图像处理 过程中 内存对齐 概念 ;
在 处理 YUV 格式的 图像 时 , 系统 或 硬件设备 要求 , YUV 图像的 每一行 像素 , 在 内存空间 中 需要 进行对齐操作 ;
Stride 跨距对齐 是 为了满足 特定 的 内存访问模式 的要求 , 有些系统要求 进行 跨距对齐 ,
- 要求 YUV 图像 的 每行内存宽度 必须是 " 内存对齐长度 " 的整数倍 ,
- 如果 YUV 图像 的 每行内存宽度 不是 " 内存对齐长度 " 的整数倍 , 就需要在 每行 的末尾添加 填充字节 , 以达到 跨距对齐 要求 ;
- 被填充的字节 , 没有实际意义 , 不包含图像数据 ;
- 这个 " 内存对齐长度 " 可能是 16 字节 / 32 字节 / 64 字节 等 ;
二、 YUV 跨距 ( Stride ) 对齐示例
要求 内存处理 YUV 图像时 , 以 16 字节对齐 , 现在有一张图片 638 x 480 像素的 YUV420P 图片 ;
1、YUV420P 数据存储
YUV420P 数据存储 格式如下图所示 , 不同类型的分量放在不同的数组中 ,
- Y 灰度值 分量 , 存储在 最上面的数组中 , 在下图的 Y0 ~ Y7 的 灰度值 就是存放在一个数组中 ;
- U 色度值 分量 , 存储在 中间数组中 , 在下图的 U0 ~ U3 的 色度值 就是存放在一个数组中 , U 的个数只有 4 个 , 是 Y 分量个数的一半 ;
- V 色度值 分量 , 存储在 最下面的数组中 , 在下图的 V0 ~ V3 的 色度值 就是存放在一个数组中 , V 分量 的个数只有 4 个 , 是 Y 分量 个数的一半 ;
上面的 YUV 图像 内存数据 中 ,
- Y0 , Y1 , Y4 , Y5 灰度值 使用 U0V0 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
- Y2 , Y3 , Y6 , Y7 灰度值 使用 U1V1 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
- Y8 , Y9 , Y12 , Y13 灰度值 使用 U2V2 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
- Y10 , Y11 , Y14 , Y15 灰度值 使用 U3V3 色度值 , 4 个像素用了 6 字节 , 一个像素 1.5 字节 ;
该图像是一个 4 x 4 大小的图片 , 每一行 占 4 字节 ;
2、跨距对齐分析
图片的像素格式是 638 x 480 像素 ;
在上面 YUV420P 格式的图像中 , 每一行 每个像素 只占 1 字节 , 那么 该图像 在内存中 , 每行的长度 是 638 字节 ;
每一行的 实际像素 所占用的内存是 638 字节 ;
需要以 16 字节对齐 , 最后一个字节占用的实际 内存大小 是 638 % 16 = 14 字节 ,
因此 每行 还需要 额外补充 16 - 14 = 2 字节的填充字节 ,
最终达到 638 + 2 = 640 字节 ;文章来源:https://www.toymoban.com/news/detail-826787.html
文章来源地址https://www.toymoban.com/news/detail-826787.html
到了这里,关于【音视频原理】图像相关概念 ⑦ ( YUV 跨距 Stride 对齐 | YUV 跨距 概念 | YUV 跨距对齐 概念 | YUV 跨距 Stride 对齐示例 )的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!