Home | History | Annotate | Download | only in manual
      1 # Copyright 2017 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 """Get v4l2 interface, and chrome processes which access the video interface"""
      6 
      7 from __future__ import print_function
      8 
      9 import logging
     10 
     11 
     12 LSOF_CHROME_VIDEO = {
     13                     '2bd9:0011': 3,
     14                     '046d:0843': 2,
     15                     '046d:082d': 2,
     16                     '046d:0853': 2,
     17                     '064e:9405': 2,
     18                     '046d:0853': 2
     19                     }
     20 
     21 
     22 def get_video_by_name(dut, name):
     23     """
     24     Get v4l2 interface based on WebCamera
     25     @param dut: The handle of the device under test. Should be initialized in
     26                  autotest.
     27     @param name: The name of web camera
     28                  For example: 'Huddly GO'
     29                               'Logitech Webcam C930e'
     30     @returns:  if video device v4l2 found, return True,
     31                else return False.
     32     """
     33     cmd = 'ls /sys/class/video4linux/'
     34     video4linux_list = dut.run(cmd, ignore_status=True).stdout.split()
     35     for video_dev in video4linux_list:
     36         cmd = 'cat /sys/class/video4linux/{}/name'.format(video_dev)
     37         video_dev_name = dut.run(cmd, ignore_status=True).stdout.strip()
     38         logging.info('---%s', cmd)
     39         logging.info('---%s', video_dev_name)
     40         if name in video_dev_name and not 'overview' in video_dev_name:
     41             logging.info('---found interface for %s', name)
     42             return video_dev
     43     return None
     44 
     45 
     46 def get_lsof4_video(dut, video):
     47     """
     48     Get output of chrome processes which attach to video device.
     49     @param dut: The handle of the device under test. Should be initialized in
     50                 autotest.
     51     @param video: video device name for camera.
     52     @returns: output of lsof /dev/videox.
     53     """
     54     cmd = 'lsof /dev/{} | grep chrome'.format(video)
     55     lsof_output = dut.run(cmd, ignore_status=True).stdout.strip().split('\n')
     56     logging.info('---%s', cmd)
     57     logging.info('---%s', lsof_output)
     58     return lsof_output
     59 
     60 
     61 def get_video_streams(dut, name):
     62     """
     63     Get output of chrome processes which attach to video device.
     64     @param dut: The handle of the device under test.
     65     @param name: name of camera.
     66     @returns: output of lsof for v4l2 device.
     67     """
     68     video_dev = get_video_by_name(dut, name)
     69     lsof_output = get_lsof4_video(dut, video_dev)
     70     return lsof_output
     71 
     72 
     73 def check_v4l2_interface(dut, vidpid, camera):
     74     """
     75     Check v4l2 interface exists for camera.
     76     @param dut: The handle of the device under test.
     77     @param vidpid: vidpid of camera.
     78     @param camera: name of camera
     79     @returns: True if v4l2 interface found for camera,
     80               False if not found.
     81     """
     82     logging.info('---check v4l2 interface for %s', camera)
     83     if get_video_by_name(dut, camera):
     84         return True, None
     85     return False, '{} have no v4l2 interface.'.format(camera)
     86 
     87 
     88 def check_video_stream(dut, is_muted, vidpid, camera):
     89     """
     90     Check camera is streaming as expected.
     91     @param dut: The handle of the device under test.
     92     @is_streaming: True if camera is expected to be streaming,
     93                    False if not.
     94     @param vidpid: vidpid of camera
     95     @param camera: name of camera.
     96     @returns: True if camera is streaming or not based on
     97               expectation,
     98               False, errMsg if not found.
     99     """
    100     process_camera = get_video_streams(dut, camera)
    101     if is_muted:
    102         if len(process_camera) >= LSOF_CHROME_VIDEO[vidpid]:
    103             return False, '{} fails to stop video streaming.'.format(camera)
    104     else:
    105         if not len(process_camera) >= LSOF_CHROME_VIDEO[vidpid]:
    106             return False, '{} fails to start video streaming.'.format(camera)
    107     return True, None
    108