How to collect and view camera traces

We use Perfetto to record camera traces on Chrome and CrOS Camera Service. Therefore, we can collect camera traces from these components to evaluate the performance of each steps when setting up the camera stream and understand the journey of a camera capture request.

To do so, currently we can run perfetto command line tool while using the camera.

Step 1:

You can use the trace tool to automate trace recording on a remote DUT and sync the trace output to the host. For example, to record a 20 seconds trace on a remote DUT:

(host) $ tracing/bin/trace.py record -r <DUT> -t 20 -o /tmp/perfetto-trace

The output trace file will be stored in /tmp/perfetto-trace on the host. You can omit -t and the tool will record until you stop the tracing with Ctrl+C.

You can also run the perfetto command on the DUT directly. You can specify how long you want to record with the duration_ms field. For example, to record a 20 seconds camera trace:

(dut) $ perfetto -c - --txt -o /tmp/perfetto-trace \
<<EOF

# Buffer 0
buffers: {
    size_kb: 63488
    fill_policy: DISCARD
}

# Buffer 1
buffers: {
    size_kb: 63488
    fill_policy: DISCARD
}

# Events from cros-camera and Chrome. Enable more categories as you see fit.
# cros-camera use camera.*. Chrome uses "camera"

data_sources: {
    config {
        name: "track_event"
        target_buffer: 0
        track_event_config {
            enabled_categories: "camera"
            enabled_categories: "camera.*"
            disabled_categories: "*"
        }
    }
}

# Event-driven recording of frequency and idle state changes.
#
# The sched/* and task/* events produce a lot of noise. Disable them if you
# don't need them.

data_sources: {
    config {
        name: "linux.ftrace"
        target_buffer: 0
        ftrace_config {
            ftrace_events: "power/cpu_frequency"
            ftrace_events: "power/cpu_idle"
            ftrace_events: "power/suspend_resume"
            ftrace_events: "sched/sched_switch"
            ftrace_events: "sched/sched_process_exit"
            ftrace_events: "sched/sched_process_free"
            ftrace_events: "task/task_newtask"
            ftrace_events: "task/task_rename"
        }
    }
}

# Polling the current cpu frequency.

data_sources: {
    config {
        name: "linux.sys_stats"
        target_buffer: 1
        sys_stats_config {
            cpufreq_period_ms: 500
        }
    }
}

# Reporting the list of available frequency for each CPU.

data_sources {
    config {
        name: "linux.system_info"
        target_buffer: 1
    }
}

# This is to get full process name and thread<>process relationships.

data_sources: {
    config {
        name: "linux.process_stats"
        target_buffer: 1
    }
}

duration_ms: 20000

EOF

Step 2:

While perfetto command is recording, open up a camera application and exercise the camera function you are interested in. (e.g. Taking a picture or recording a video). Wait until perfetto flushes all the trace events when the tracing ends.

Step 3:

Go to Perfetto UI, click “Open trace file” and select the trace output file (in our example it's /tmp/perfetto-trace). The details of the tracing results should be shown on the UI.

The trace tool has a report subcommand that can be used to compute metrics from a recorded trace. To view the list of available metrics:

(host) $ tracing/bin/trace.py report --list_metrics

To compute metrics from a recorded trace stored in /tmp/perfetto-trace:

(host) $ tracing/bin/trace.py report -i /tmp/perfetto-trace --metrics <metric_names>