xref: /aosp_15_r20/external/autotest/client/cros/video/helper_logger.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Copyright 2017 The Chromium OS Authors. All rights reserved.
2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
3*9c5db199SXin Li# found in the LICENSE file.
4*9c5db199SXin Li
5*9c5db199SXin Liimport glob
6*9c5db199SXin Liimport os
7*9c5db199SXin Liimport logging
8*9c5db199SXin Liimport subprocess
9*9c5db199SXin Li
10*9c5db199SXin Lidef chrome_vmodule_flag():
11*9c5db199SXin Li    """Return vmodule flag for chrome to enable VDAs/VEAs/JDAs/V4L2IP logs"""
12*9c5db199SXin Li    logging_patterns = ['*/media/gpu/*video_decode_accelerator.cc=2',
13*9c5db199SXin Li                        '*/media/gpu/*video_encode_accelerator.cc=2',
14*9c5db199SXin Li                        '*/media/gpu/*jpeg_decode_accelerator.cc=2',
15*9c5db199SXin Li                        '*/media/gpu/*image_processor.cc=2',
16*9c5db199SXin Li                        '*/media/gpu/v4l2/v4l2_device.cc=2']
17*9c5db199SXin Li    chrome_video_vmodule_flag = '--vmodule=' + ','.join(logging_patterns)
18*9c5db199SXin Li    logging.info('chrome video vmodule flag: %s', chrome_video_vmodule_flag)
19*9c5db199SXin Li    return chrome_video_vmodule_flag
20*9c5db199SXin Li
21*9c5db199SXin Li
22*9c5db199SXin Lidef video_log_wrapper(func):
23*9c5db199SXin Li    """
24*9c5db199SXin Li    Return decorator that make verbose video logs enable
25*9c5db199SXin Li    before test and make them disable after completing test.
26*9c5db199SXin Li
27*9c5db199SXin Li    @param func: function, the test function, e.g., run_once
28*9c5db199SXin Li    @returns decorator function
29*9c5db199SXin Li    """
30*9c5db199SXin Li    vlog = VideoLog()
31*9c5db199SXin Li
32*9c5db199SXin Li    #videobuf2 log
33*9c5db199SXin Li    files = glob.glob('/sys/module/videobuf2_*/parameters/debug')
34*9c5db199SXin Li    vlog.add_log(files,
35*9c5db199SXin Li                 ['1'] * len(files),
36*9c5db199SXin Li                 ['0'] * len(files),
37*9c5db199SXin Li                 'videobuf2 log')
38*9c5db199SXin Li
39*9c5db199SXin Li    #s5p_mfc log
40*9c5db199SXin Li    fpath = '/sys/module/s5p_mfc/parameters/debug'
41*9c5db199SXin Li    if os.path.exists(fpath):
42*9c5db199SXin Li        vlog.add_log([fpath],
43*9c5db199SXin Li                     ['1'],
44*9c5db199SXin Li                     ['0'],
45*9c5db199SXin Li                     's5p_mfc log')
46*9c5db199SXin Li
47*9c5db199SXin Li    #rk3399 log
48*9c5db199SXin Li    #rk3399 debug level is controlled by bits.
49*9c5db199SXin Li    #Here, 3 means to enable log level 0 and 1.
50*9c5db199SXin Li    fpath = '/sys/module/rockchip_vpu/parameters/debug'
51*9c5db199SXin Li    if os.path.exists(fpath):
52*9c5db199SXin Li        vlog.add_log([fpath],
53*9c5db199SXin Li                     ['3'],
54*9c5db199SXin Li                     ['0'],
55*9c5db199SXin Li                     'rk3399 log')
56*9c5db199SXin Li
57*9c5db199SXin Li    #rk3288 log
58*9c5db199SXin Li    #rk3288 debug level is controlled by bits.
59*9c5db199SXin Li    #Here, 3 means to enable log level 0 and 1.
60*9c5db199SXin Li    fpath = '/sys/module/rk3288_vpu/parameters/debug'
61*9c5db199SXin Li    if os.path.exists(fpath):
62*9c5db199SXin Li        vlog.add_log([fpath],
63*9c5db199SXin Li                     ['3'],
64*9c5db199SXin Li                     ['0'],
65*9c5db199SXin Li                     'rk3288 log')
66*9c5db199SXin Li
67*9c5db199SXin Li    #go2001 log
68*9c5db199SXin Li    fpath = '/sys/module/go2001/parameters/go2001_debug_level'
69*9c5db199SXin Li    if os.path.exists(fpath):
70*9c5db199SXin Li        vlog.add_log([fpath],
71*9c5db199SXin Li                     ['1'],
72*9c5db199SXin Li                     ['0'],
73*9c5db199SXin Li                     'go2001 log')
74*9c5db199SXin Li
75*9c5db199SXin Li    def call(*args, **kwargs):
76*9c5db199SXin Li        """
77*9c5db199SXin Li        Enable logs before the test, execute the test and disable logs
78*9c5db199SXin Li        after the test.
79*9c5db199SXin Li
80*9c5db199SXin Li        In any case, it is guranteed to disable logs.
81*9c5db199SXin Li        """
82*9c5db199SXin Li        with vlog:
83*9c5db199SXin Li            return func(*args, **kwargs)
84*9c5db199SXin Li
85*9c5db199SXin Li    return call
86*9c5db199SXin Li
87*9c5db199SXin Li
88*9c5db199SXin Lidef cmdexec_with_log(cmd, info_message):
89*9c5db199SXin Li    """
90*9c5db199SXin Li    Execute command, logging infomation message.
91*9c5db199SXin Li
92*9c5db199SXin Li    @param cmd: string, command to be executed
93*9c5db199SXin Li    @param info_message: string, the messages to be shown in log message
94*9c5db199SXin Li    """
95*9c5db199SXin Li    try:
96*9c5db199SXin Li        logging.info('%s : %s', info_message, cmd)
97*9c5db199SXin Li        subprocess.check_call(cmd, shell=True)
98*9c5db199SXin Li    except subprocess.CalledProcessError:
99*9c5db199SXin Li        logging.warning('Fail to execute command [%s] : %s',
100*9c5db199SXin Li                        info_message, cmd)
101*9c5db199SXin Li
102*9c5db199SXin Li
103*9c5db199SXin Liclass VideoLog:
104*9c5db199SXin Li    """
105*9c5db199SXin Li    Enable/Disable video logs.
106*9c5db199SXin Li    """
107*9c5db199SXin Li    def __init__(self):
108*9c5db199SXin Li        self.logs = []
109*9c5db199SXin Li
110*9c5db199SXin Li    def add_log(self, files, enable_values, disable_values, log_name):
111*9c5db199SXin Li        """
112*9c5db199SXin Li        Add new log
113*9c5db199SXin Li
114*9c5db199SXin Li        @param files: list of string, file paths
115*9c5db199SXin Li        @param enable_values: list of string, the list of value
116*9c5db199SXin Li                              to write to each file path for enabling
117*9c5db199SXin Li        @param disable_values: list of string, the list of value
118*9c5db199SXin Li                               to write to each file path for disabling
119*9c5db199SXin Li        @param log_name: string, name to be shown in log message
120*9c5db199SXin Li        """
121*9c5db199SXin Li        self.logs.append({'files': files,
122*9c5db199SXin Li                          'enable values': enable_values,
123*9c5db199SXin Li                          'disable values': disable_values,
124*9c5db199SXin Li                          'log name': log_name})
125*9c5db199SXin Li
126*9c5db199SXin Li    def __enter__(self):
127*9c5db199SXin Li        """Enable logs"""
128*9c5db199SXin Li        for log in self.logs:
129*9c5db199SXin Li            log_name = log['log name']
130*9c5db199SXin Li            for f, ev in zip(log['files'], log['enable values']):
131*9c5db199SXin Li                cmdexec_with_log('echo %s > %s' % (ev, f),
132*9c5db199SXin Li                                 '%s enable' % log_name)
133*9c5db199SXin Li
134*9c5db199SXin Li    def __exit__(self, exception_type, exception_value, traceback):
135*9c5db199SXin Li        """Disable logs"""
136*9c5db199SXin Li        for log in self.logs:
137*9c5db199SXin Li            log_name = log['log name']
138*9c5db199SXin Li            for f, dv in zip(log['files'], log['disable values']):
139*9c5db199SXin Li                cmdexec_with_log('echo %s > %s' % (dv, f),
140*9c5db199SXin Li                                 '%s disable' % log_name)
141