Home | History | Annotate | Download | only in video
      1 # 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 
      5 import logging
      6 import os
      7 import xml.etree.ElementTree as ET
      8 
      9 from autotest_lib.client.common_lib import error
     10 from autotest_lib.client.common_lib.cros import arc
     11 
     12 
     13 class 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)
     52         arc_caps = dict.fromkeys(self.MEDIA_CODEC_TO_CAPABILITY.values(), 'no')
     53         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'
     87