从您的查询和之前的讨论中,请找到将HEVC
组件集成到Android
框架中的步骤。由于您的组件是一个SW
组件,因此您必须集成与SoftVideoDecoderOMXComponent
.
是什么SoftVideoDecoderOMXComponent
?
在Android
Stagefright
框架的最新版本中,SW
加速编解码器使用OMX
类似的接口集成到框架中。早些时候,情况并非如此,并且有一些挑战。因此,谷歌简化了集成策略,并要求所有SW
编解码器都使用SoftOMXComponent
类似的接口。
大多数OMX IL
调用由基类处理,因此,新编解码器组件的实现相对容易,如下所述。
我将以AVC
编解码器集成为例进行概述。强烈建议读者熟悉OMX IL
1.1.2 规范,该规范描述了OMX IL
视频解码器组件的结构、功能和状态机。
注意: HEVC
还不是OMX IL
规范的一部分,因此,建议主要是了解组件的结构和功能。
创建SoftHEVC
组件
请参考 的头文件SoftAVC.h
和对应的源码SoftAVC.cpp
。
您将不得不实现一组类似的文件。AVC
由于某些固有的相似性,强烈建议重用整个实现。
SoftHEVC.cpp
执行
您必须定义一个派生SoftHEVC
自. 这将确保所有调用都由基类适当处理。SoftHEVC.h
SoftVideoDecoderOMXComponent
OMX
您必须定义一个支持组合表profile
,如.level
CodecProfileLevel
在 中constructor
,您可以以类似的方式初始化大部分变量。由于这是一个视频解码器组件,您必须初始化 2 个端口,即 .input
和output
. ctor
调用 ainitDecoder
来初始化组件。您还必须为您的编解码器实现类似的功能。
这dtor
是不言自明的,因此,我将跳过相同的解释。
onQueueFilled
当为端口上的处理提供一个充满一帧比特流数据的input
缓冲区或为output
. 这会调用主解码函数H264SwDecDecode
。现在,对于第一帧,与最初初始化的分辨率相比,您可能会遇到分辨率的变化。这由下一点中描述的 2 个场景处理。
你会观察到 2 个函数handlePortSettingsChanged
和handleCropRectEvent
. 从输出缓冲区的角度来看,这两个事件很重要。handlePortSettingsChanged
表示与最初初始化的大小相比,
输出缓冲区尺寸发生了变化,因此,向用户提供事件回调以释放当前分配并重新分配。handleCropRectEvent
表示向用户传达的__cropping window__。通常,这不需要缓冲区重新分配。
drainOneOutputBuffer
将解码帧复制到输出端口的缓冲区,并通知调用者解码缓冲区的可用性。
在onQueueFilled
中,成功解码后,已消耗的输入缓冲区也返回给调用者。
其余功能非常简单,我觉得您可以简单地重用大部分实现。
对于组件的注册,您必须执行createSoftOMXComponent
创建SoftHEVC
组件的方法,如下所示。
由于您已经处理了注册的组件,因此我将跳过该部分。仅供参考,我假设您已kComponents
在SoftOMXPlugin
. 此外,由于HEVC
不是已知MIME
类型,因此您必须注册相同的类型。将需要更改MediaDefs.cpp
您必须引入新条目的位置,MEDIA_MIMETYPE_VIDEO_HEVC
类似于现有格式,例如AVC
并支持 和 的OMXCodec.cpp
更改ACodec.cpp
。
通过这些步骤,我认为您应该能够集成您的SW
解码器并能够实现您的播放。