媒体资源管理器的 OEM 依赖项

本文档旨在帮助原始设备制造商 (OEM) 正确实现对 Android 媒体资源管理器和相关 API 的支持。

1. 最大并发编解码器实例数量

CodecCapabilities.getMaxSupportedInstances 接口返回支持的并发编解码器实例的最大数量。

CTS 测试 testGetMaxSupportedInstances(android.media.cts.MediaCodecCapabilitiesTest) 用于强制在 /etc/media_codecs.xml 中设置合适的最大值。

示例如下:

...
<MediaCodecs>
    ...
    <Encoders>
        <MediaCodec name="OMX.<vendor>.video.encoder.avc" type="video/avc" >
           ...
            <Limit name="concurrent-instances" max="13" />
        </MediaCodec>
        ...
    </Encoders>
    ...
</MediaCodecs>

OEM 可以使用此测试来生成可通过测试的并发限制。具体操作步骤如下:

  1. 首先使用 cts-tradefed 运行测试。
  2. 评估生成的失败消息。示例如下:
    There was 1 failure:
    1) testGetMaxSupportedInstances(android.media.cts.MediaCodecCapabilitiesTest)
    junit.framework.AssertionFailedError: In order to pass the test, please publish
    following codecs' concurrent instances limit in /etc/media_codecs.xml:
    <MediaCodec name="OMX.<vendor>.video.encoder.mpeg4" type="video/mp4v-es" >
        <Limit name="concurrent-instances" max="13" />
    </MediaCodec>
    <MediaCodec name="OMX.<vendor>.video.encoder.h263" type="video/3gpp" >
        <Limit name="concurrent-instances" max="13" />
    </MediaCodec>
    <MediaCodec name="OMX.<vendor>.video.encoder.avc" type="video/avc" >
        <Limit name="concurrent-instances" max="13" />
    </MediaCodec>
    <MediaCodec name="OMX.<vendor>.video.encoder.vp8" type="video/x-vnd.on2.vp8" >
        <Limit name="concurrent-instances" max="13" />
    </MediaCodec>
    <MediaCodec name="OMX.<vendor>.video.decoder.avc" type="video/avc" >
        <Limit name="concurrent-instances" max="13" />
    </MediaCodec>
    <MediaCodec name="OMX.<vendor>.video.decoder.avc.secure" type="video/avc" >
        <Limit name="concurrent-instances" max="4" />
    </MediaCodec>
    <MediaCodec name="OMX.<vendor>.video.decoder.mpeg4" type="video/mp4v-es" >
        <Limit name="concurrent-instances" max="12" />
    </MediaCodec>
    <MediaCodec name="OMX.<vendor>.video.decoder.h263" type="video/3gpp" >
        <Limit name="concurrent-instances" max="12" />
    </MediaCodec>
    <MediaCodec name="OMX.<vendor>.video.decoder.vp8" type="video/x-vnd.on2.vp8" >
        <Limit name="concurrent-instances" max="12" />
    </MediaCodec>
    
  3. 将测试失败消息中建议的 concurrent-instances 行添加到 /etc/media_codecs.xml 文件。
  4. 重新运行测试以验证测试是否成功。

2. 视频编解码器可实现的帧速率

VideoCapabilities.getAchievableFrameRatesFor 接口针对某个视频大小返回可实现的视频帧率的范围。此信息必须由 OEM 通过位于 /etc/media_codecs_performance.xml 的 XML 文件为每个设备提供。这些设置由 com.android.cts.videoperf.VideoEncoderDecoderTestandroid.media.cts.VideoDecoderPerfTest CTS 测试进行测试。

OEM 可以使用 CTS 测试来生成可通过测试的 XML 文件。具体操作步骤如下:

  1. 首先使用 cts-tradefed 运行测试。鉴于 Android 性能的波动性,建议多次运行测试以获得更准确的最小值和最大值。
  2. 使用提供的 get_achievable_rates.py 脚本生成 XML 文件。
  3. 将 XML 文件放置在以下位置:/etc/media_codecs_performance.xml
    通常通过将 XML 文件放置在设备项目 (device/<vendor>/<product>) 中并将 PRODUCT_COPY_FILES 行添加到 device.mk 来完成此过程,如下所示:
    PRODUCT_COPY_FILES += \
    ...
       device/moto/shamu/media_codecs.xml:system/etc/media_codecs.xml \
    +    device/moto/shamu/media_codecs_performance.xml:system/etc/media_codecs_performance.xml
    
  4. 重新运行性能测试以验证测试是否成功。

3. 安全编解码器和非安全编解码器共存

  • supports-secure-with-non-secure-codec - 如果安全编解码器实例和非安全编解码器实例不能同时共存,则应在 media_codecs.xml 文件中作为全局设置指明。
    <MediaCodecs>
        <Settings>
            <Setting name="supports-secure-with-non-secure-codec" value="false" />
        </Settings>
        <Encoders>
    …
    
  • supports-multiple-secure-codecs - 如果不支持多个安全编解码器实例共存,则应在 media_codecs.xml 文件中作为全局设置指明。
    <MediaCodecs>
        <Settings>
            <Setting name="supports-multiple-secure-codecs" value="false" />
        </Settings>
        <Encoders>
    …
    
  • 请注意,默认情况下,两个设置都为 true,这意味着如果支持这些设置,则无需将设置行添加到 media_codecs.xml
  • 如果这两个设置未正确设置,ResourceManagerTest CTS 测试可能会失败。