blob: ff799fbbc163ad5094316b0a35e0794917e9ae76 [file] [log] [blame]
Hirokazu Hondae7f13312018-05-23 17:08:30 +09001# Copyright 2018 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import logging
6import os
7import xml.etree.ElementTree as ET
8
9from autotest_lib.client.common_lib import error
10from autotest_lib.client.common_lib.cros import arc
11
12
13class ArcDeviceCapability(object):
14 """
15 Generates capabilities status on DUT from media_codecs.xml in Android
16 container. Answers from the capabilities whether some capability is
17 satisfied on DUT.
18 """
19 MEDIA_CODECS_XML_PATH = '/vendor/etc/media_codecs.xml'
20 MEDIA_CODEC_TO_CAPABILITY = {
21 'ARC.h264.decode': 'hw_dec_h264_arc',
22 'ARC.vp8.decode' : 'hw_dec_vp8_arc',
23 'ARC.vp9.decode' : 'hw_dec_vp9_arc',
24 'OMX.arc.h264.encode': 'hw_enc_h264_arc',
25 'OMX.arc.vp8.encode' : 'hw_enc_vp8_arc',
26 'OMX.arc.vp9.encode' : 'hw_enc_vp9_arc',
27 }
28
29
30 def __init__(self):
31 self.capabilities = self._get_arc_capability()
32
33 def _get_arc_capability(self):
34 """
35 Reads media_codecs.xml in android container and returns available ARC++
36 capability.
37
38 @returns list: Available ARC++ capabilities on DUT.
39 """
40 if not arc.is_android_container_alive():
41 raise error.TestFail('Android container is not alive.')
42
43 # Reads media_codecs.xml
44 media_codecs_data = arc.read_android_file(self.MEDIA_CODECS_XML_PATH)
45 if not media_codecs_data:
46 raise error.TestFail('media_codecs.xml is empty.')
47
48 logging.debug('%s', media_codecs_data)
49
50 # Parses media_codecs.xml
51 root = ET.fromstring(media_codecs_data)
Hirokazu Honda196a24b2018-08-10 11:54:35 +090052 arc_caps = dict.fromkeys(self.MEDIA_CODEC_TO_CAPABILITY.values(), 'no')
Hirokazu Hondae7f13312018-05-23 17:08:30 +090053 for mc in root.iter('MediaCodec'):
54 codec_name = mc.get('name')
55 if codec_name in self.MEDIA_CODEC_TO_CAPABILITY:
56 arc_caps[self.MEDIA_CODEC_TO_CAPABILITY[codec_name]] = 'yes'
57 logging.debug('%r', arc_caps)
58 return arc_caps
59
60 def get_capability(self, cap):
61 """
62 Decides if a device satisfies a required capability for an autotest.
63
64 @param cap: string, denoting one capability. It must be one of
65 self.MEDIA_CODEC_TO_CAPABILITY.
66 @returns 'yes' or 'no'.
67 """
68 try:
69 return self.capabilities[cap]
70 except KeyError:
71 raise error.TestFail('Unexpected capability: %s' % cap)
72
73 def ensure_capability(self, cap):
74 """
75 Raises TestNAError if a device doesn't satisfy cap.
76
77 @param cap: string, denoting one capability.
78 """
79 if not have_capability(cap):
80 raise error.TestNAError('Missing Capability: %s' % cap)
81
82 def have_capability(self, cap):
83 """
84 Return whether cap is available.
85 """
86 return self.get_capability(cap) == 'yes'