Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions Android.bp
Original file line number Diff line number Diff line change
Expand Up @@ -3467,6 +3467,7 @@ filegroup {
"protos/perfetto/trace/android/surfaceflinger_transactions.proto",
"protos/perfetto/trace/android/typedef.proto",
"protos/perfetto/trace/android/user_list.proto",
"protos/perfetto/trace/android/video_frame.proto",
"protos/perfetto/trace/android/view/display.proto",
"protos/perfetto/trace/android/view/displaycutout.proto",
"protos/perfetto/trace/android/view/displayinfo.proto",
Expand Down Expand Up @@ -7626,6 +7627,7 @@ filegroup {
"protos/perfetto/trace/android/packages_list.proto",
"protos/perfetto/trace/android/pixel_modem_events.proto",
"protos/perfetto/trace/android/user_list.proto",
"protos/perfetto/trace/android/video_frame.proto",
],
}

Expand Down Expand Up @@ -7662,6 +7664,7 @@ genrule {
"external/perfetto/protos/perfetto/trace/android/packages_list.gen.cc",
"external/perfetto/protos/perfetto/trace/android/pixel_modem_events.gen.cc",
"external/perfetto/protos/perfetto/trace/android/user_list.gen.cc",
"external/perfetto/protos/perfetto/trace/android/video_frame.gen.cc",
],
}

Expand Down Expand Up @@ -7698,6 +7701,7 @@ genrule {
"external/perfetto/protos/perfetto/trace/android/packages_list.gen.h",
"external/perfetto/protos/perfetto/trace/android/pixel_modem_events.gen.h",
"external/perfetto/protos/perfetto/trace/android/user_list.gen.h",
"external/perfetto/protos/perfetto/trace/android/video_frame.gen.h",
],
export_include_dirs: [
".",
Expand Down Expand Up @@ -7726,6 +7730,7 @@ filegroup {
"protos/perfetto/trace/android/packages_list.proto",
"protos/perfetto/trace/android/pixel_modem_events.proto",
"protos/perfetto/trace/android/user_list.proto",
"protos/perfetto/trace/android/video_frame.proto",
],
}

Expand Down Expand Up @@ -7761,6 +7766,7 @@ genrule {
"external/perfetto/protos/perfetto/trace/android/packages_list.pb.cc",
"external/perfetto/protos/perfetto/trace/android/pixel_modem_events.pb.cc",
"external/perfetto/protos/perfetto/trace/android/user_list.pb.cc",
"external/perfetto/protos/perfetto/trace/android/video_frame.pb.cc",
],
}

Expand Down Expand Up @@ -7796,6 +7802,7 @@ genrule {
"external/perfetto/protos/perfetto/trace/android/packages_list.pb.h",
"external/perfetto/protos/perfetto/trace/android/pixel_modem_events.pb.h",
"external/perfetto/protos/perfetto/trace/android/user_list.pb.h",
"external/perfetto/protos/perfetto/trace/android/video_frame.pb.h",
],
export_include_dirs: [
".",
Expand Down Expand Up @@ -8415,6 +8422,7 @@ filegroup {
"protos/perfetto/trace/android/packages_list.proto",
"protos/perfetto/trace/android/pixel_modem_events.proto",
"protos/perfetto/trace/android/user_list.proto",
"protos/perfetto/trace/android/video_frame.proto",
],
}

Expand Down Expand Up @@ -8451,6 +8459,7 @@ genrule {
"external/perfetto/protos/perfetto/trace/android/packages_list.pbzero.cc",
"external/perfetto/protos/perfetto/trace/android/pixel_modem_events.pbzero.cc",
"external/perfetto/protos/perfetto/trace/android/user_list.pbzero.cc",
"external/perfetto/protos/perfetto/trace/android/video_frame.pbzero.cc",
],
}

Expand Down Expand Up @@ -8487,6 +8496,7 @@ genrule {
"external/perfetto/protos/perfetto/trace/android/packages_list.pbzero.h",
"external/perfetto/protos/perfetto/trace/android/pixel_modem_events.pbzero.h",
"external/perfetto/protos/perfetto/trace/android/user_list.pbzero.h",
"external/perfetto/protos/perfetto/trace/android/video_frame.pbzero.h",
],
export_include_dirs: [
".",
Expand Down Expand Up @@ -8760,6 +8770,7 @@ genrule {
"protos/perfetto/trace/android/surfaceflinger_layers.proto",
"protos/perfetto/trace/android/surfaceflinger_transactions.proto",
"protos/perfetto/trace/android/user_list.proto",
"protos/perfetto/trace/android/video_frame.proto",
"protos/perfetto/trace/android/winscope_extensions.proto",
"protos/perfetto/trace/chrome/chrome_benchmark_metadata.proto",
"protos/perfetto/trace/chrome/chrome_metadata.proto",
Expand Down Expand Up @@ -15904,6 +15915,7 @@ filegroup {
"src/trace_processor/importers/proto/track_event_tokenizer.cc",
"src/trace_processor/importers/proto/track_event_tracker.cc",
"src/trace_processor/importers/proto/user_tracker.cc",
"src/trace_processor/importers/proto/video_frame_module.cc",
],
}

Expand Down Expand Up @@ -16394,6 +16406,7 @@ filegroup {
"src/trace_processor/perfetto_sql/intrinsics/functions/structural_tree_partition.cc",
"src/trace_processor/perfetto_sql/intrinsics/functions/to_ftrace.cc",
"src/trace_processor/perfetto_sql/intrinsics/functions/type_builders.cc",
"src/trace_processor/perfetto_sql/intrinsics/functions/video_frame_image.cc",
],
}

Expand Down Expand Up @@ -16689,6 +16702,7 @@ genrule {
"src/trace_processor/perfetto_sql/stdlib/android/thread.sql",
"src/trace_processor/perfetto_sql/stdlib/android/user_list.sql",
"src/trace_processor/perfetto_sql/stdlib/android/version.sql",
"src/trace_processor/perfetto_sql/stdlib/android/video_frames.sql",
"src/trace_processor/perfetto_sql/stdlib/android/wakeups.sql",
"src/trace_processor/perfetto_sql/stdlib/android/winscope/inputmethod.sql",
"src/trace_processor/perfetto_sql/stdlib/android/winscope/rect.sql",
Expand Down Expand Up @@ -19003,6 +19017,7 @@ java_library {
"protos/perfetto/trace/android/surfaceflinger_layers.proto",
"protos/perfetto/trace/android/surfaceflinger_transactions.proto",
"protos/perfetto/trace/android/user_list.proto",
"protos/perfetto/trace/android/video_frame.proto",
"protos/perfetto/trace/android/winscope_extensions.proto",
"protos/perfetto/trace/chrome/chrome_benchmark_metadata.proto",
"protos/perfetto/trace/chrome/chrome_metadata.proto",
Expand Down
6 changes: 6 additions & 0 deletions BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -2952,6 +2952,8 @@ perfetto_filegroup(
"src/trace_processor/importers/proto/track_event_tracker.h",
"src/trace_processor/importers/proto/user_tracker.cc",
"src/trace_processor/importers/proto/user_tracker.h",
"src/trace_processor/importers/proto/video_frame_module.cc",
"src/trace_processor/importers/proto/video_frame_module.h",
],
)

Expand Down Expand Up @@ -3392,6 +3394,8 @@ perfetto_filegroup(
"src/trace_processor/perfetto_sql/intrinsics/functions/type_builders.cc",
"src/trace_processor/perfetto_sql/intrinsics/functions/type_builders.h",
"src/trace_processor/perfetto_sql/intrinsics/functions/utils.h",
"src/trace_processor/perfetto_sql/intrinsics/functions/video_frame_image.cc",
"src/trace_processor/perfetto_sql/intrinsics/functions/video_frame_image.h",
"src/trace_processor/perfetto_sql/intrinsics/functions/window_functions.h",
],
)
Expand Down Expand Up @@ -3718,6 +3722,7 @@ perfetto_filegroup(
"src/trace_processor/perfetto_sql/stdlib/android/thread.sql",
"src/trace_processor/perfetto_sql/stdlib/android/user_list.sql",
"src/trace_processor/perfetto_sql/stdlib/android/version.sql",
"src/trace_processor/perfetto_sql/stdlib/android/video_frames.sql",
"src/trace_processor/perfetto_sql/stdlib/android/wakeups.sql",
],
)
Expand Down Expand Up @@ -7265,6 +7270,7 @@ perfetto_proto_library(
"protos/perfetto/trace/android/packages_list.proto",
"protos/perfetto/trace/android/pixel_modem_events.proto",
"protos/perfetto/trace/android/user_list.proto",
"protos/perfetto/trace/android/video_frame.proto",
],
visibility = [
PERFETTO_CONFIG.proto_library_visibility,
Expand Down
1 change: 1 addition & 0 deletions protos/perfetto/trace/android/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ perfetto_proto_library("@TYPE@") {
"packages_list.proto",
"pixel_modem_events.proto",
"user_list.proto",
"video_frame.proto",
]
}

Expand Down
39 changes: 39 additions & 0 deletions protos/perfetto/trace/android/video_frame.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright (C) 2026 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

syntax = "proto2";

package perfetto.protos;

// A captured video frame (screenshot) from the device display.
// Used by the android.video_frames data source for continuous frame capture.
message VideoFrame {
// Sequential frame number within the capture session.
optional uint64 frame_number = 1;

// JPEG-compressed image data.
optional bytes jpg_image = 2;

// Display name for the track in the UI (e.g. "Front Camera").
optional string track_name = 3;

// Unique identifier for the stream. Frames with the same track_id are
// grouped into the same track.
optional uint32 track_id = 4;

// WebP-compressed image data. Used when jpg_image is not set.
optional bytes webp_image = 5;
}
26 changes: 26 additions & 0 deletions protos/perfetto/trace/perfetto_trace.proto
Original file line number Diff line number Diff line change
Expand Up @@ -7599,6 +7599,30 @@ message AndroidUserList {

// End of protos/perfetto/trace/android/user_list.proto

// Begin of protos/perfetto/trace/android/video_frame.proto

// A captured video frame (screenshot) from the device display.
// Used by the android.video_frames data source for continuous frame capture.
message VideoFrame {
// Sequential frame number within the capture session.
optional uint64 frame_number = 1;

// JPEG-compressed image data.
optional bytes jpg_image = 2;

// Display name for the track in the UI (e.g. "Front Camera").
optional string track_name = 3;

// Unique identifier for the stream. Frames with the same track_id are
// grouped into the same track.
optional uint32 track_id = 4;

// WebP-compressed image data. Used when jpg_image is not set.
optional bytes webp_image = 5;
}

// End of protos/perfetto/trace/android/video_frame.proto

// Begin of protos/perfetto/trace/android/winscope_extensions.proto

message WinscopeExtensions {
Expand Down Expand Up @@ -18723,6 +18747,8 @@ message TracePacket {

AndroidUserList user_list = 123;

VideoFrame video_frame = 129;

// This field is only used for testing.
// In previous versions of this proto this field had the id 268435455
// This caused many problems:
Expand Down
3 changes: 3 additions & 0 deletions protos/perfetto/trace/trace_packet.proto
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import "protos/perfetto/trace/android/shell_transition.proto";
import "protos/perfetto/trace/android/surfaceflinger_layers.proto";
import "protos/perfetto/trace/android/surfaceflinger_transactions.proto";
import "protos/perfetto/trace/android/user_list.proto";
import "protos/perfetto/trace/android/video_frame.proto";
import "protos/perfetto/trace/android/winscope_extensions.proto";
import "protos/perfetto/trace/chrome/chrome_benchmark_metadata.proto";
import "protos/perfetto/trace/chrome/chrome_metadata.proto";
Expand Down Expand Up @@ -296,6 +297,8 @@ message TracePacket {

AndroidUserList user_list = 123;

VideoFrame video_frame = 129;

// This field is only used for testing.
// In previous versions of this proto this field had the id 268435455
// This caused many problems:
Expand Down
37 changes: 37 additions & 0 deletions src/java_datasource/android_video_frames/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Android Video Frames Data Source

## Overview

A Perfetto data source that captures screen frames as JPEG images and stores
them as `VideoFrame` trace packets with native BLOB storage.

This data source lives in the Android tree (`frameworks/base`), not in this
repo. The Perfetto-side changes (trace processor module, UI plugin, tests) are
in this repo.

## Test data

- Trace generator: `test/trace_processor/diff_tests/parser/android/generate_video_trace.py`
- Diff tests: `test/trace_processor/diff_tests/parser/android/tests.py`
(see `test_video_frame_*`)

## Proto

`VideoFrame` is field 129 on `TracePacket`, defined in
`protos/perfetto/trace/android/video_frame.proto`.

Fields:
- `frame_number` (uint64): sequential frame number
- `jpg_image` (bytes): JPEG image data
- `track_name` (string): display name for the UI track
- `track_id` (uint32): groups frames into streams

## Trace config example

```proto
data_sources {
config {
name: "android.video_frames"
}
}
```
2 changes: 2 additions & 0 deletions src/trace_processor/importers/proto/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ source_set("minimal") {
"track_event_tracker.h",
"user_tracker.cc",
"user_tracker.h",
"video_frame_module.cc",
"video_frame_module.h",
]
public_deps = [ ":proto_importer_module" ]
deps = [
Expand Down
3 changes: 3 additions & 0 deletions src/trace_processor/importers/proto/additional_modules.cc
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
#include "src/trace_processor/importers/proto/trace.descriptor.h"
#include "src/trace_processor/importers/proto/translation_table_module.h"
#include "src/trace_processor/importers/proto/v8_module.h"
#include "src/trace_processor/importers/proto/video_frame_module.h"
#include "src/trace_processor/types/trace_processor_context.h"

#if PERFETTO_BUILDFLAG(PERFETTO_ENABLE_WINSCOPE)
Expand Down Expand Up @@ -89,6 +90,8 @@ void RegisterAdditionalModules(ProtoImporterModuleContext* module_context,
new AppWakelockModule(module_context, context));
module_context->modules.emplace_back(
new GenericKernelModule(module_context, context));
module_context->modules.emplace_back(
new VideoFrameModule(module_context, context));

#if PERFETTO_BUILDFLAG(PERFETTO_ENABLE_WINSCOPE)
module_context->modules.emplace_back(
Expand Down
Loading
Loading