/*
 * Copyright (C) 2022 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.
 */

#include "src/trace_processor/importers/proto/android_camera_event_module.h"

#include "perfetto/ext/base/string_utils.h"
#include "protos/perfetto/trace/android/camera_event.pbzero.h"
#include "protos/perfetto/trace/trace_packet.pbzero.h"
#include "src/trace_processor/importers/common/async_track_set_tracker.h"
#include "src/trace_processor/importers/common/parser_types.h"
#include "src/trace_processor/importers/common/slice_tracker.h"
#include "src/trace_processor/importers/common/track_tracker.h"
#include "src/trace_processor/importers/proto/packet_sequence_state.h"
#include "src/trace_processor/sorter/trace_sorter.h"
#include "src/trace_processor/storage/trace_storage.h"

namespace perfetto {
namespace trace_processor {

using perfetto::protos::pbzero::TracePacket;

AndroidCameraEventModule::AndroidCameraEventModule(
    TraceProcessorContext* context)
    : context_(context) {
  RegisterForField(TracePacket::kAndroidCameraFrameEventFieldNumber, context);
}

AndroidCameraEventModule::~AndroidCameraEventModule() = default;

ModuleResult AndroidCameraEventModule::TokenizePacket(
    const protos::pbzero::TracePacket::Decoder& decoder,
    TraceBlobView* packet,
    int64_t /*packet_timestamp*/,
    PacketSequenceState* state,
    uint32_t field_id) {
  if (field_id != TracePacket::kAndroidCameraFrameEventFieldNumber) {
    return ModuleResult::Ignored();
  }
  const auto android_camera_frame_event =
      protos::pbzero::AndroidCameraFrameEvent::Decoder(
          decoder.android_camera_frame_event());
  context_->sorter->PushTracePacket(
      android_camera_frame_event.request_processing_started_ns(),
      state->current_generation(), std::move(*packet));
  return ModuleResult::Handled();
}

void AndroidCameraEventModule::ParseTracePacketData(
    const TracePacket::Decoder& decoder,
    int64_t /*ts*/,
    const TracePacketData&,
    uint32_t field_id) {
  if (field_id != TracePacket::kAndroidCameraFrameEventFieldNumber) {
    return;
  }
  InsertCameraFrameSlice(decoder.android_camera_frame_event());
}

void AndroidCameraEventModule::InsertCameraFrameSlice(
    protozero::ConstBytes bytes) {
  const auto android_camera_frame_event =
      protos::pbzero::AndroidCameraFrameEvent::Decoder(bytes);
  StringId track_name = context_->storage->InternString(
      base::StackString<32>("Camera %d Frames",
                            android_camera_frame_event.camera_id())
          .string_view());
  StringId slice_name = context_->storage->InternString(
      base::StackString<32>("Frame %" PRId64,
                            android_camera_frame_event.frame_number())
          .string_view());
  int64_t ts = android_camera_frame_event.request_processing_started_ns();
  int64_t dur = android_camera_frame_event.responses_all_sent_ns() -
                android_camera_frame_event.request_processing_started_ns();
  auto track_set_id =
      context_->async_track_set_tracker->InternGlobalTrackSet(track_name);
  auto track_id =
      context_->async_track_set_tracker->Scoped(track_set_id, ts, dur);
  context_->slice_tracker->Scoped(ts, track_id, /*category=*/kNullStringId,
                                  slice_name, dur);
}

}  // namespace trace_processor
}  // namespace perfetto
