xref: /aosp_15_r20/external/perfetto/src/trace_processor/importers/ftrace/v4l2_tracker.h (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef SRC_TRACE_PROCESSOR_IMPORTERS_FTRACE_V4L2_TRACKER_H_
18 #define SRC_TRACE_PROCESSOR_IMPORTERS_FTRACE_V4L2_TRACKER_H_
19 
20 #include <stdint.h>
21 #include <cstdint>
22 #include <optional>
23 
24 #include "perfetto/ext/base/flat_hash_map.h"
25 
26 #include "perfetto/protozero/field.h"
27 #include "src/trace_processor/importers/common/args_tracker.h"
28 #include "src/trace_processor/storage/trace_storage.h"
29 #include "src/trace_processor/types/destructible.h"
30 #include "src/trace_processor/types/trace_processor_context.h"
31 
32 namespace perfetto {
33 namespace trace_processor {
34 
35 class TraceProcessorContext;
36 
37 class V4l2Tracker : public Destructible {
38  public:
39   // Declared public for testing only.
40   explicit V4l2Tracker(TraceProcessorContext*);
41   V4l2Tracker(const V4l2Tracker&) = delete;
42   V4l2Tracker& operator=(const V4l2Tracker&) = delete;
43   ~V4l2Tracker() override;
44 
GetOrCreate(TraceProcessorContext * context)45   static V4l2Tracker* GetOrCreate(TraceProcessorContext* context) {
46     if (!context->v4l2_tracker) {
47       context->v4l2_tracker.reset(new V4l2Tracker(context));
48     }
49     return static_cast<V4l2Tracker*>(context->v4l2_tracker.get());
50   }
51 
52   void ParseV4l2Event(uint64_t fld_id,
53                       int64_t timestamp,
54                       uint32_t pid,
55                       const protozero::ConstBytes&);
56 
57  private:
58   struct BufferEvent {
59    public:
60     int32_t device_minor;
61     std::optional<uint32_t> index;
62     std::optional<uint32_t> type;
63     std::optional<uint32_t> bytesused;
64     uint32_t flags;
65     uint32_t field;
66     int64_t timestamp;
67     uint32_t sequence;
68     uint32_t timecode_flags;
69     uint32_t timecode_frames;
70     uint32_t timecode_hours;
71     uint32_t timecode_minutes;
72     uint32_t timecode_seconds;
73     uint32_t timecode_type;
74     uint32_t timecode_userbits0;
75     uint32_t timecode_userbits1;
76     uint32_t timecode_userbits2;
77     uint32_t timecode_userbits3;
78   };
79 
80   struct BufferEventStringIds {
81     explicit BufferEventStringIds(TraceStorage& storage);
82 
83     const StringId v4l2;
84     const StringId v4l2_qbuf;
85     const StringId v4l2_dqbuf;
86     const StringId device_minor;
87     const StringId index;
88     const StringId type;
89     const StringId bytesused;
90     const StringId flags;
91     const StringId field;
92     const StringId timestamp;
93     const StringId timecode_type;
94     const StringId timecode_flags;
95     const StringId timecode_frames;
96     const StringId timecode_seconds;
97     const StringId timecode_minutes;
98     const StringId timecode_hours;
99     const StringId timecode_userbits0;
100     const StringId timecode_userbits1;
101     const StringId timecode_userbits2;
102     const StringId timecode_userbits3;
103     const StringId sequence;
104   };
105 
106   struct BufferTypeStringIds {
107     explicit BufferTypeStringIds(TraceStorage& storage);
108 
109     StringId Map(uint32_t type);
110 
111     const StringId video_capture;
112     const StringId video_output;
113     const StringId video_overlay;
114     const StringId vbi_capture;
115     const StringId vbi_output;
116     const StringId sliced_vbi_capture;
117     const StringId sliced_vbi_output;
118     const StringId video_output_overlay;
119     const StringId video_capture_mplane;
120     const StringId video_output_mplane;
121     const StringId sdr_capture;
122     const StringId sdr_output;
123     const StringId meta_capture;
124     const StringId meta_output;
125     const StringId priv;
126   };
127 
128   struct BufferFieldStringIds {
129     explicit BufferFieldStringIds(TraceStorage& storage);
130 
131     StringId Map(uint32_t field);
132 
133     const StringId any;
134     const StringId none;
135     const StringId top;
136     const StringId bottom;
137     const StringId interlaced;
138     const StringId seq_tb;
139     const StringId seq_bt;
140     const StringId alternate;
141     const StringId interlaced_tb;
142     const StringId interlaced_bt;
143   };
144 
145   struct TimecodeTypeStringIds {
146     explicit TimecodeTypeStringIds(TraceStorage& storage);
147 
148     StringId Map(uint32_t field);
149 
150     const StringId type_24fps;
151     const StringId type_25fps;
152     const StringId type_30fps;
153     const StringId type_50fps;
154     const StringId type_60fps;
155   };
156 
157   struct QueuedBuffer {
158     std::optional<SliceId> queue_slice_id;
159   };
160 
161   std::optional<SliceId> AddSlice(StringId buf_name_id,
162                                   int64_t timestamp,
163                                   uint32_t pid,
164                                   const BufferEvent& evt);
165 
166   void AddArgs(const BufferEvent& evt, ArgsTracker::BoundInserter* inserter);
167 
168   StringId InternBufFlags(uint32_t flags);
169   StringId InternTcFlags(uint32_t flags);
170 
171   TraceProcessorContext* const context_;
172   base::FlatHashMap<uint64_t, QueuedBuffer> queued_buffers_;
173 
174   BufferEventStringIds buf_event_ids_;
175   BufferTypeStringIds buf_type_ids_;
176   BufferFieldStringIds buf_field_ids_;
177   TimecodeTypeStringIds tc_type_ids_;
178 };
179 
180 }  // namespace trace_processor
181 }  // namespace perfetto
182 
183 #endif  // SRC_TRACE_PROCESSOR_IMPORTERS_FTRACE_V4L2_TRACKER_H_
184