广义B帧GPB

HEVC通常有三种类型帧,I帧、P帧、B帧。

  • I帧:使用帧内预测。

  • P帧:使用单向帧间预测,参考帧来自前面已编码帧。

  • B帧:使用双向帧间预测,参考帧来自前面和后面已编码帧。

在HM中也为编码提供了三种配置:

  • All intra:所有帧都作为I帧编码。

  • Random access(RA):图像按层次结构编码,可以在约1秒内进行随机访问。

  • Low delay B(LDB):所有图像按播放顺序编码,除第一帧为I帧外,其余帧都是B帧,但是B帧参考图像都来自前面已编码帧。

Fig.1展示了RA和LDB配置的时域预测结构。RA配置专门针对需要随机访问的应用,例如广播、视频回播。LDB针对交互式实时通信,需要延迟更低,例如视频会议、视频电话。为了达到更低的延迟,LDB不允许参考后面的帧,如Fig.1(b),参考帧都来自前面。

LDB中的B帧称为广义B帧(GPB,generalized P and B)。和B帧一样,GPB也需要两个参考图像,但是其参考图像都来自前面(即参考图像POC小于当前图像POC)。且GPB的两个参考图像列表也是完全一样,即对于任意索引n:ref_list0[n] == ref_list1[n]。但是GPB的两个参考帧却不必相同,它们可以来自两个参考列表的不同位置。注意:RA中也可以有GPB帧。

运动信息相同的情况

有些时候双向预测的两个运动信息指向同一个参考块,此时双向预测的结果和仅使用其中一个进行单向预测相同。

在一般情况下,当L0和L1中两个参考图像相同且两个mv相同时,运动信息相同。在GPB情况下,仅需两个参考帧索引和mv相同,运动信息就相同。因为GPB的两个参考图像列表是相同的,refIdxL0 == refIdxL1也意味着RefPicL0 == RefPicL1

上表中统计了RA和LDB配置下的:1)双向预测百分比。2)双向预测中运动信息相同的百分比。可以看见RA和LDB的双向预测百分比接近,分别为70.4%和71.0%,但是双向预测中运动信息相同的百分比相差很大,分别为1.8%和42.2%。

分析

由上表可见在LDB配置中,双向预测中运动信息相同出现的更频繁。主要有下面几个原因:

  1. 在LDB配置下除了第一帧其他都是LDB帧。

  2. HEVC中可以使用merge模式来进行运动信息传输,使得可以从时域和空域邻近块继承MV和参考索引。在时域merge模式中,当从前面帧(按解码顺序)同位PU继承运动信息时,为了减少复杂度两个merge候选项的参考索引都设为0。对于GPB帧,此时造成两个参考图像相同。

  3. 在HEVC中,有时进行时域MV预测时其同位参考块是单向预测的仅有一个MV0,此时将另一个MV1设置为等于MV0。

  4. 由于上面3条,LDB配置下时域merge模式很容易出现运动信息相同的情况。一旦双向预测运动信息相同的情况发生了,很容易通过空域merge模式传播。

Fig.3展示了merge模式双向预测运动信息相同时空域传播。运动信息和模式信息来自BasketballDrive序列的第15帧的第278个CTU,该序列使用LDB配置编码,QP=32。

上表是Fig.3中块A的merge候选列表。在Fig.3例子中,最终选择了表中merge_index == 1的候选项作为块A的预测。比较Fig.3(c)(d)容易发现块A两个运动信息相同,且通过merge传播到相邻的B、C、D、W、X、Y、Z块。

参考文献

Kim K , Kim H , Choi J , et al. MC Complexity Reduction for Generalized P and B Pictures in HEVC[J]. IEEE Transactions on Circuits & Systems for Video Technology, 2014, 24(10):1723-1728.​

感兴趣的请关注微信公众号Video Coding

<think>好的,我现在需要帮助用户了解如何在Java中使用Google Protocol Buffers(GPB)。首先,我需要回忆一下自己之学过的关于Protocol Buffers的知识,以及用户提供的引用内容。 根据用户提供的引用,特别是引用[3],Protocol Buffers是谷歌开发的一种跨平台、语言中立的结构化数据序列化机制,比XML更小、更快、更简单。用户还提到Java的使用,所以需要重点放在Java环境下的步骤。 首先,使用Protocol Buffers通常需要几个步骤:定义.proto文件,生成Java代码,然后在项目中使用这些生成的类进行序列化和反序列化。引用[4]中的Go代码示例可能对理解流程有帮助,但用户需要的是Java版本,所以需要调整语法和依赖项。 接下来,我需要确保步骤清晰,结构正确。用户可能需要安装protobuf编译器,这在引用[3]中提到需要安装C++的Unix环境,但Java用户可能需要不同的安装步骤,或者使用Maven依赖来自动处理。比如,Java用户可能更倾向于使用protobuf-maven-plugin来自动生成代码,这样避免手动安装编译器。 然后,在代码示例部分,需要展示如何定义.proto文件,例如用户可能想定义一个简单的消息类型,比如User,包含username和age字段。之后,生成对应的Java类,并展示如何序列化和反序列化。引用[4]中的示例是用Go写的,但可以转换为Java的代码结构。 此外,用户可能关心GPB的用途,比如在RPC通信中的使用,如gRPC,但用户的问题主要集中在GPB本身的使用,所以需要专注于序列化部分。引用[1]提到GPB的用途超越简单的访问器和序列化,但用户的问题可能更基础,所以先介绍基本用法,再提及更高级的用途。 在注意事项部分,需要提到版本兼容性,因为不同版本的protobuf可能有不同的API,比如Java中使用的是proto2还是proto3,语法可能不同。引用[3]中提到定义结构化数据的方式,所以需要提醒用户注意.proto文件的语法版本。 最后,生成相关问题需要考虑用户可能的后续疑问,比如性能优化、与其他格式比较、在gRPC中的应用等。根据用户提供的引用,引用[2]提到了Java中的Protocol Buffers处理,可能涉及错误处理,如Unknown phone type的情况,所以在问题中可以包含如何处理未知字段的问题。 需要确保所有步骤正确,代码示例没有错误,并且符合Java的语法和最佳实践。同时,检查是否所有引用都被正确引用,例如引用[3]提供了安装和基本概念,引用[4]展示了序列化/反序列化的流程,但需要转换为Java代码。</think>### 如何在Java中使用Google Protocol Buffers (GPB) Google Protocol Buffers(GPB)是一种高效的结构化数据序列化工具,适用于跨语言通信和数据存储。以下是在Java中使用GPB的步骤: --- #### 1. **定义.proto文件** 首先创建一个`.proto`文件,定义数据结构。例如,定义一个`User`消息: ```protobuf syntax = "proto3"; // 指定语法版本[^3] message User { string username = 1; int32 age = 2; } ``` - `syntax = "proto3"` 表示使用Protocol Buffers的第三版语法。 - 字段后的数字(如`1`, `2`)是唯一标识符,不可重复[^3]。 --- #### 2. **生成Java类** 使用`protoc`编译器将`.proto`文件生成Java代码: ```bash protoc --java_out=./src/main/java user.proto ``` - 生成的Java类包含数据的构造、序列化和反序列化方法[^3]。 - 若使用Maven,可添加插件自动生成代码: ```xml <build> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.6.1</version> <configuration> <protoSourceRoot>src/main/resources/proto</protoSourceRoot> </configuration> </plugin> </plugins> </build> ``` --- #### 3. **在Java代码中使用** 引入依赖(Maven配置): ```xml <dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.21.12</version> </dependency> ``` 序列化与反序列化示例: ```java // 创建对象 User user = User.newBuilder() .setUsername("mszlu") .setAge(20) .build(); // 序列化为字节数组 byte[] data = user.toByteArray(); // 反序列化 User parsedUser = User.parseFrom(data); System.out.println(parsedUser); // 输出: username: "mszlu" age: 20 [^4] ``` --- #### 4. **高级功能** - **扩展性**:通过添加新字段(保留旧标识符)实现向后兼容。 - **RPC支持**:GPB可与gRPC结合,用于跨服务通信[^1]。 - **性能优化**:二进制格式比JSON/XML更小、解析更快。 --- #### 注意事项 - **版本一致性**:确保`protoc`编译器版本与Java依赖版本一致。 - **未知字段处理**:反序列化时忽略未知字段(不报错),可通过`getUnknownFields()`获取[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值