1 Cobalt

Cobalt是一个轻量级HTML5/CSS/JS应用程序容器,旨在以最少的资源消耗(部署大小,RAM,CPU,GPU)提供丰富的应用程序开发环境。同时,Cobalt在各种平台和设备上实现丰富,低延迟的用户体验
Cobalt描述
这些是Cobalt提供的其他一些好处

  • More platforms

    • Cobalt不需要平台来支持JIT编译,并且可以在不允许执行动态生成代码的平台上运行
    • Cobalt是一个单进程应用程序,不依赖于多个进程
    • Cobalt预编译一组足以表达所有图形效果的着色器,从而适应无法在运行时编译着色器的平台
    • Cobalt需要一个兼容的C++ 03编译器,允许它通过传统工具链访问平台
  • Small footprint

    • Cobalt针对内存进行了优化。 它的surface缓存永远不会超过预定义的预算,并且它永远不会创建重复的图层,从而减少了内存不足崩溃的可能性
    • Cobalt的小二进制文件旨在占用尽可能小的空间。 通过支持HTML5/CSS/JS的一个子集,Cobalt的缩小封装尺寸甚至允许在低端设备上捆绑CJK字体
  • Reduced input latency

    • Cobalt通过仅支持不影响布局的属性动画(如变换)并始终在单独的线程上运行动画来产生一致的60FPS动画
    • 由于渲染器和资源加载器不会与布局操作相竞争,因此Cobalt已针对单核CPU运行进行了优化,从而延长了输入延迟时间
    • 在支持GLES2的平台上,Cobalt通过在GPU上执行几乎所有的渲染操作来避免CPU绘图

2 Architecture

Cobalt作者分叉了H5VCC,删除了大部分Chromium代码 ,特别是WebCore和Chrome Renderer和Compositor,并且从零开始构建了一个简化的HTML子集的实现,用于布局的CSS Box模型以及Web API,这是真正需要建立一个全屏幕SPA浏览和播放应用程序,Cobalt的组件主要有以下几个部分

  1. Web Implementation
    这是实现W3C标准的地方,最终生成一个带注释的DOM树,该树可以传递到布局引擎以生成渲染树

  2. JavaScript Engine
    我们没有从头开始写自己的JavaScript引擎。 由于JITing约束,我们必须灵活地使用与我们合作的引擎。 我们有一个与JS Engine接口的绑定层,以便应用程序脚本可以与本机支持的对象(如DOM元素)交互

  3. Layout Engine
    布局引擎接收由Web实现和JavaScript引擎生成的带注释的DOM文档,并计算渲染命令的树以发送给渲染器(即渲染树)。 它缓存中间布局工件,以便后续的增量布局可以加快

  4. Renderer/Skia
    渲染器遍历由布局引擎生成的渲染树,使用第三方图形库Skia对其进行栅格化处理,并将其交换到前端缓冲区。 这里有两条主要路径,一条是在OpenGL ES 2.0上使用Hardware Skia,另一条是使用Software Skia和硬件加速的Starboard Blitter

    请注意,渲染器在与布局引擎不同的线程中运行,并且可以插入不需要重新布局的动画。这可以将Layout和JavaScript渲染分离出来,从而在具有各种功能的平台上实现流畅,一致的动画

  5. Net/Media
    这些是Chromium的网络和媒体引擎。 我们直接使用它们,因为它们不会引起上面列出的额外限制的任何特定问题

  6. Base
    这是Chromium的“Base”库,其中包含在Cobalt,Net和Media中使用的各种有用的东西。Cobalt使用标准C++容器(例如vector,string)和Base的组合作为其所有代码的基础库

  7. Other Third-party Libraries
    其中大部分是其他开放源代码软件中通常包含的straight-C开源库。 大多数格式的解码器和解析器(例如libpng,libxml2,zlib)。我们从Chromium中分离出来,因为我们希望它们成为这些库经过测试最多的版本

  8. Starboard/Glimp/ANGLE
    Starboard是Cobalt移植接口。Cobalt和Chromium之间的一个主要区别是我们创建了一个hard straight-C移植层,并且移植了所有编译后的代码,包括Base和所有第三方库,以使用它,而不是直接使用POSIX标准库,它们是即使在现代系统上也不一致(请参阅Android,Windows,MacOS X和iOS)。此外,Starboard还包括跨平台没有得到有效标准化的API,例如显示窗口创建,输入事件和媒体播放

    Glimp是由Cobalt团队直接在Starboard上构建的OpenGL ES 2.0实现框架,旨在将专有3D API修改为GLES2

    ANGLE是一种第三方库,可将DirectX与Glimp类似,但仅适用于DirectX

3 Display And Media

Cobalt框架图

Cobalt能够支持与加密媒体扩展兼容的任何DRM系统,但这仅在PlayReady和Widevine两种产品上得到充分验证。因为版权原因使得难以提供与Widevine或PlayReady的开源参考集成,所以目前由平台实施者来集成代码来生成许可证,安装密钥并在解码之前解密样本,请注意,不需要更改src/media中的任何代码来执行此操作,只需实现Starboard player/drm/media API即可完成此操作

目前Cobalt有OpenMax和ffmpeg的对接代码,没有Gstreamer的,显示部分Wayland+EFL、X11、Directfb、Win32都有集成,可以直接使用

3.1 Drm Implementing APIs

函数
SbDrmSessionUpdateRequestFunc
SbDrmSessionUpdatedFunc
SbDrmSessionKeyStatusesChangedFunc
SbDrmCreateSystem
SbDrmGenerateSessionUpdateRequest
SbDrmUpdateSession
SbDrmCloseSession
SbDrmGetKeyCount
SbDrmGetKeyStatus
SbDrmRemoveAllKeys
SbDrmDestroySystem

3.2 Video Implementing APIs

函数
SbPlayerDestroy
SbPlayerWriteEndOfStream
SbPlayerWriteSample
SbPlayerSetPlaybackRate
SbPlayerSeek
SbPlayerSetVolume
SbPlayerGetInfo
SbPlayerOutputModeSupported
SbPlayerCreate
SbPlayerGetCurrentFrame
SbPlayerSetBounds
GetAudioCodecFromString
SbMediaIsAudioSupported
GetVideoCodecFromString
ParseH264Info
SbMediaIsVideoSupported
IsAudioOutputSupported
GetTransferIdFromString
SbAudioSinkIsAudioFrameStorageTypeSupported
SbAudioSinkIsAudioSampleTypeSupported
SbAudioSinkGetMaxChannels
SbAudioSinkCreate
SbAudioSinkIsValid
SbAudioSinkDestroy
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐