| # Copyright 2017 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Get v4l2 interface, and chrome processes which access the video interface""" |
| |
| from __future__ import print_function |
| |
| import logging |
| |
| |
| LSOF_CHROME_VIDEO = { |
| '2bd9:0011': 3, |
| '046d:0843': 2, |
| '046d:082d': 2, |
| '046d:0853': 2, |
| '064e:9405': 2, |
| '046d:0853': 2 |
| } |
| |
| |
| def get_video_by_name(dut, name): |
| """ |
| Get v4l2 interface based on WebCamera |
| @param dut: The handle of the device under test. Should be initialized in |
| autotest. |
| @param name: The name of web camera |
| For example: 'Huddly GO' |
| 'Logitech Webcam C930e' |
| @returns: if video device v4l2 found, return True, |
| else return False. |
| """ |
| cmd = 'ls /sys/class/video4linux/' |
| video4linux_list = dut.run(cmd, ignore_status=True).stdout.split() |
| for video_dev in video4linux_list: |
| cmd = 'cat /sys/class/video4linux/{}/name'.format(video_dev) |
| video_dev_name = dut.run(cmd, ignore_status=True).stdout.strip() |
| logging.info('---%s', cmd) |
| logging.info('---%s', video_dev_name) |
| if name in video_dev_name and not 'overview' in video_dev_name: |
| logging.info('---found interface for %s', name) |
| return video_dev |
| return None |
| |
| |
| def get_lsof4_video(dut, video): |
| """ |
| Get output of chrome processes which attach to video device. |
| @param dut: The handle of the device under test. Should be initialized in |
| autotest. |
| @param video: video device name for camera. |
| @returns: output of lsof /dev/videox. |
| """ |
| cmd = 'lsof /dev/{} | grep chrome'.format(video) |
| lsof_output = dut.run(cmd, ignore_status=True).stdout.strip().split('\n') |
| logging.info('---%s', cmd) |
| logging.info('---%s', lsof_output) |
| return lsof_output |
| |
| |
| def get_video_streams(dut, name): |
| """ |
| Get output of chrome processes which attach to video device. |
| @param dut: The handle of the device under test. |
| @param name: name of camera. |
| @returns: output of lsof for v4l2 device. |
| """ |
| video_dev = get_video_by_name(dut, name) |
| lsof_output = get_lsof4_video(dut, video_dev) |
| return lsof_output |
| |
| |
| def check_v4l2_interface(dut, vidpid, camera): |
| """ |
| Check v4l2 interface exists for camera. |
| @param dut: The handle of the device under test. |
| @param vidpid: vidpid of camera. |
| @param camera: name of camera |
| @returns: True if v4l2 interface found for camera, |
| False if not found. |
| """ |
| logging.info('---check v4l2 interface for %s', camera) |
| if get_video_by_name(dut, camera): |
| return True, None |
| return False, '{} have no v4l2 interface.'.format(camera) |
| |
| |
| def check_video_stream(dut, is_muted, vidpid, camera): |
| """ |
| Check camera is streaming as expected. |
| @param dut: The handle of the device under test. |
| @is_streaming: True if camera is expected to be streaming, |
| False if not. |
| @param vidpid: vidpid of camera |
| @param camera: name of camera. |
| @returns: True if camera is streaming or not based on |
| expectation, |
| False, errMsg if not found. |
| """ |
| process_camera = get_video_streams(dut, camera) |
| if is_muted: |
| if len(process_camera) >= LSOF_CHROME_VIDEO[vidpid]: |
| return False, '{} fails to stop video streaming.'.format(camera) |
| else: |
| if not len(process_camera) >= LSOF_CHROME_VIDEO[vidpid]: |
| return False, '{} fails to start video streaming.'.format(camera) |
| return True, None |