我正在尝试将我的软件HEVC解码器添加到android源代码中。我希望生成 libstagefright.so 文件。
我提到了其他类似的问题,对我没什么帮助。我无法通过以下问题或参考指南得到清晰的图片。
1)将Codec集成到Android多媒体框架中。
2)集成自定义解码器以在Android上播放并同时显示fps。
3)如何注册OMX核心以添加新的解码器。
有人可以帮我解决将新的自定义解码器与Android集成的步骤。
现在,我刚刚在SoftOMXPlugin.cpp文件中添加了media_codecs.xml和{ "OMX.google.h265.decoder" , "hevcdec" , "video_decoder.hevc" }
。
需要编辑哪些其他文件才能将新格式添加到android源代码中? 哪些函数调用我的解码器源代码(softomxcplugin源文件是否调用我的解码器?)。
答案 0 :(得分:5)
从您的查询和之前的讨论中,请找到将HEVC
组件集成到Android
框架中的步骤。由于您的组件是SW
组件,因此您必须将其与SoftVideoDecoderOMXComponent
进行整合。
什么是SoftVideoDecoderOMXComponent
?
在Android
Stagefright
框架的最新版本中,使用SW
类似界面将OMX
个加速编解码器集成到框架中。早些时候,情况并非如此,并且有一些挑战。因此,Google简化了整合策略,并要求所有SW
编解码器都采用SoftOMXComponent
类似的界面。
大多数OMX IL
调用由基类处理,因此,新编解码器组件的实现相对容易,如下所述。
我将以AVC
编解码器集成为例提供概述。 强烈推荐,读者熟悉OMX IL
1.1.2 specification,其中描述了OMX IL
视频解码器组件的结构,功能和状态机。
注意: HEVC
尚未成为OMX IL
规范的一部分,因此,建议主要是了解组件的结构和功能。
创建SoftHEVC
组件
请参阅SoftAVC.h
的标题文件和相应的来源SoftAVC.cpp
。
您必须实现一组类似的文件。由于一些固有的相似性,强烈建议重用AVC
的整体实现。
SoftHEVC.cpp
实施
您必须在SoftHEVC
中定义SoftHEVC.h
组件,该组件派生自SoftVideoDecoderOMXComponent
。这将确保基类适当地处理所有OMX
调用。
您必须在CodecProfileLevel
中找到支持profile
- level
组合的表格。
在constructor
中,您可以以类似的方式初始化大多数变量。由于这是视频解码器组件,因此您必须初始化2个端口,即input
和output
。 ctor
调用initDecoder
来初始化组件。您还必须为您的编解码器实现类似的功能。
dtor
是不言自明的,因此,我将跳过解释相同的内容。
onQueueFilled
端口上的处理提供填充了一帧帧比特流数据的缓冲区或为input
提供空闲缓冲区时,将调用 output
。这将调用主解码函数H264SwDecDecode
。现在,对于第一帧,与最初初始化的分辨率相比,您可能会遇到分辨率的变化。这由2个场景处理,如下一点所述。
您会观察到2个函数handlePortSettingsChanged
和handleCropRectEvent
。从输出缓冲区的角度来看,这两个事件很重要。 handlePortSettingsChanged
表示与原始初始化大小相比<输出缓冲区维度的更改,因此,为用户提供事件回调以释放当前分配并重新分配相同的。
handleCropRectEvent
表示__cropping window__会传达给用户。通常,这不需要重新分配缓冲区。
drainOneOutputBuffer
会将解码后的帧复制到输出端口的缓冲区和解码缓冲区的notify the caller about the availability上。
在onQueueFilled
中,成功解码后,input buffer which has been consumed is also returned back发送给来电者。
其余功能非常简单,我觉得你可以简单地重复使用大部分功能。
要注册该组件,您必须实施createSoftOMXComponent
,以创建here所示的SoftHEVC
组件。
因为,您已经处理了已注册的组件,我正在跳过该部分。仅供参考,我假设您已在SoftOMXPlugin
中的kComponents
数组中注册了该组件。此外,由于HEVC
不是已知的MIME
类型,因此您必须注册相同的内容。 MediaDefs.cpp
需要进行更改,您必须在其中引入新条目MEDIA_MIMETYPE_VIDEO_HEVC
,类似于AVC
等现有格式,并支持OMXCodec.cpp
和{{1}中的更改}}
通过这些步骤,我认为您应该能够集成ACodec.cpp
解码器,并能够实现播放。