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