【H.264/AVC视频编解码技术详解】十二、解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构

本文主要是介绍【H.264/AVC视频编解码技术详解】十二、解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《H.264/AVC视频编解码技术详解》视频教程已经在“CSDN学院”上线,视频中详述了H.264的背景、标准协议和实现,并通过一个实战工程的形式对H.264的标准进行解析和实现,欢迎观看!

“纸上得来终觉浅,绝知此事要躬行”,只有自己按照标准文档以代码的形式操作一遍,才能对视频压缩编码标准的思想和方法有足够深刻的理解和体会!

链接地址:H.264/AVC视频编解码技术详解

GitHub代码地址:点击这里

在以H.264格式编码的视频码流中,宏块结构必然包含预测结构(I_PCM模式除外),该结构中包含了像素块的预测模式等信息。对于不同预测模式的宏块,其预测结构是不同的。从上篇的宏块结构中,可以看出,对于部分模式,预测信息保存于mb_pred()结构中,而对于另一部分模式则采用sub_mb_pred()结构。
在这里插入图片描述

在我们本系列的H.264分析器SimpleH264Analyzer项目中默认的全I帧测试码流中,我们所分析的第一个IDR帧的第一个宏块,其mb_type为I_NxN。实际上,对于除了I_PCM模式之外的所有Intra宏块,其预测结构均采用mb_pred()结构。

在标准文档中,mb_pred()的定义如下表所示(只看Intra模式下):
在这里插入图片描述

从表中可以看出,Intra预测模式的结构主要有两组,分别表示4×4和8×8模式,每一组包含两个元素,分别表示预测模式标识位和预测模式值,以及最后的色度分量预测模式。

  • prev_intra4x4_pred_mode_flag和prev_intra8x8_pred_mode_flag:表示帧内预测模式预测标识。如果该标识位为1,表示帧内预测模式的预测值就是实际的模式,否则就需要另外传递实际的帧内预测模式。
  • prev_intra4x4_pred_mode_flag和prev_intra8x8_pred_mode_flag:表示额外传递的实际帧内预测模式。
  • intra_chroma_pred_mode:表示色度分量的预测模式,取值范围为[0,3],分别代表DC、水平、垂直和平面模式。

在我们的demo中解析这部分的代码以下面的代码段实现:

if (m_mb_type == 25)
{// To do: I-PCM mode...
} 
else if (m_mb_type == 0)
{// Intra_NxN mode...if (m_pps_active->Get_transform_8x8_mode_flag()){m_transform_size_8x8_flag = Get_bit_at_position(m_pSODB, m_bypeOffset, m_bitOffset);}// Get prediction-block num...if (m_transform_size_8x8_flag){// Using intra_8x8m_pred_struct = new IntraPredStruct[4];	for (int luma8x8BlkIdx = 0; luma8x8BlkIdx < 4; luma8x8BlkIdx++){m_pred_struct[luma8x8BlkIdx].block_mode = 1;m_pred_struct[luma8x8BlkIdx].prev_intra_pred_mode_flag = Get_bit_at_position(m_pSODB, m_bypeOffset, m_bitOffset);if (!m_pred_struct[luma8x8BlkIdx].prev_intra_pred_mode_flag){m_pred_struct[luma8x8BlkIdx].rem_intra_pred_mode = Get_uint_code_num(m_pSODB, m_bypeOffset, m_bitOffset, 3);}}} else{// Using intra_4x4m_pred_struct = new IntraPredStruct[16];for (int luma4x4BlkIdx = 0; luma4x4BlkIdx < 16; luma4x4BlkIdx++){m_pred_struct[luma4x4BlkIdx].block_mode = 0;m_pred_struct[luma4x4BlkIdx].prev_intra_pred_mode_flag = Get_bit_at_position(m_pSODB, m_bypeOffset, m_bitOffset);if (!m_pred_struct[luma4x4BlkIdx].prev_intra_pred_mode_flag){m_pred_struct[luma4x4BlkIdx].rem_intra_pred_mode = Get_uint_code_num(m_pSODB, m_bypeOffset, m_bitOffset, 3);}}}// intra_chroma_pred_modem_intra_chroma_pred_mode = Get_uev_code_num(m_pSODB, m_bypeOffset, m_bitOffset);
}
else
{// To do: Intra_16x16 mode
}

更详细的信息可以到github下载完整的工程:
https://github.com/yinwenjie/SimpleH264Analyzer

这篇关于【H.264/AVC视频编解码技术详解】十二、解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/415369

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.