/*
 * 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 <memory>

#include "perfetto/ext/base/hash.h"
#include "perfetto/ext/base/string_utils.h"

#include "src/trace_processor/importers/common/args_tracker.h"
#include "src/trace_processor/importers/common/flow_tracker.h"
#include "src/trace_processor/importers/common/process_tracker.h"
#include "src/trace_processor/importers/common/slice_tracker.h"
#include "src/trace_processor/importers/common/track_tracker.h"
#include "src/trace_processor/importers/ftrace/v4l2_tracker.h"

#include "protos/perfetto/trace/ftrace/ftrace_event.pbzero.h"
#include "protos/perfetto/trace/ftrace/v4l2.pbzero.h"

#include "v4l2_tracker.h"

namespace perfetto {
namespace trace_processor {

namespace {
using protos::pbzero::FtraceEvent;
using protos::pbzero::V4l2DqbufFtraceEvent;
using protos::pbzero::V4l2QbufFtraceEvent;
using protos::pbzero::Vb2V4l2BufDoneFtraceEvent;
using protos::pbzero::Vb2V4l2BufQueueFtraceEvent;
using protos::pbzero::Vb2V4l2DqbufFtraceEvent;
using protos::pbzero::Vb2V4l2QbufFtraceEvent;
using protozero::ConstBytes;
}  // namespace

V4l2Tracker::V4l2Tracker(TraceProcessorContext* context)
    : context_(context),
      buf_event_ids_(*context->storage),
      buf_type_ids_(*context_->storage),
      buf_field_ids_(*context->storage),
      tc_type_ids_(*context->storage) {}

V4l2Tracker::~V4l2Tracker() = default;

void V4l2Tracker::ParseV4l2Event(uint64_t fld_id,
                                 int64_t timestamp,
                                 uint32_t pid,
                                 const ConstBytes& bytes) {
  switch (fld_id) {
    case FtraceEvent::kV4l2QbufFieldNumber: {
      V4l2QbufFtraceEvent::Decoder pb_evt(bytes.data, bytes.size);
      BufferEvent evt;
      evt.device_minor = pb_evt.minor();
      evt.index = pb_evt.index();
      evt.type = pb_evt.type();
      evt.bytesused = pb_evt.bytesused();
      evt.flags = pb_evt.flags();
      evt.field = pb_evt.field();
      evt.timestamp = pb_evt.timestamp();
      evt.sequence = pb_evt.sequence();
      evt.timecode_flags = pb_evt.timecode_flags();
      evt.timecode_frames = pb_evt.timecode_frames();
      evt.timecode_hours = pb_evt.timecode_hours();
      evt.timecode_minutes = pb_evt.timecode_minutes();
      evt.timecode_seconds = pb_evt.timecode_seconds();
      evt.timecode_type = pb_evt.timecode_type();
      evt.timecode_userbits0 = pb_evt.timecode_userbits0();
      evt.timecode_userbits1 = pb_evt.timecode_userbits1();
      evt.timecode_userbits2 = pb_evt.timecode_userbits2();
      evt.timecode_userbits3 = pb_evt.timecode_userbits3();

      base::StackString<64> buf_name(
          "VIDIOC_QBUF minor=%" PRIu32 " seq=%" PRIu32 " type=%" PRIu32
          " index=%" PRIu32,
          evt.device_minor, evt.sequence, *evt.type, *evt.index);

      StringId buf_name_id =
          context_->storage->InternString(buf_name.string_view());
      base::Optional<SliceId> slice_id =
          AddSlice(buf_name_id, timestamp, pid, evt);

      uint64_t hash = base::Hasher::Combine(evt.device_minor, evt.sequence,
                                            *evt.type, *evt.index);

      QueuedBuffer queued_buffer;
      queued_buffer.queue_slice_id = slice_id;

      queued_buffers_.Insert(hash, std::move(queued_buffer));
      break;
    }
    case FtraceEvent::kV4l2DqbufFieldNumber: {
      V4l2DqbufFtraceEvent::Decoder pb_evt(bytes.data, bytes.size);
      BufferEvent evt;
      evt.device_minor = pb_evt.minor();
      evt.index = pb_evt.index();
      evt.type = pb_evt.type();
      evt.bytesused = pb_evt.bytesused();
      evt.flags = pb_evt.flags();
      evt.field = pb_evt.field();
      evt.timestamp = pb_evt.timestamp();
      evt.sequence = pb_evt.sequence();
      evt.timecode_flags = pb_evt.timecode_flags();
      evt.timecode_frames = pb_evt.timecode_frames();
      evt.timecode_hours = pb_evt.timecode_hours();
      evt.timecode_minutes = pb_evt.timecode_minutes();
      evt.timecode_seconds = pb_evt.timecode_seconds();
      evt.timecode_type = pb_evt.timecode_type();
      evt.timecode_userbits0 = pb_evt.timecode_userbits0();
      evt.timecode_userbits1 = pb_evt.timecode_userbits1();
      evt.timecode_userbits2 = pb_evt.timecode_userbits2();
      evt.timecode_userbits3 = pb_evt.timecode_userbits3();

      base::StackString<64> buf_name(
          "VIDIOC_DQBUF minor=%" PRIu32 " seq=%" PRIu32 " type=%" PRIu32
          " index=%" PRIu32,
          evt.device_minor, evt.sequence, *evt.type, *evt.index);

      StringId buf_name_id =
          context_->storage->InternString(buf_name.string_view());
      base::Optional<SliceId> slice_id =
          AddSlice(buf_name_id, timestamp, pid, evt);

      uint64_t hash = base::Hasher::Combine(evt.device_minor, evt.sequence,
                                            *evt.type, *evt.index);

      const QueuedBuffer* queued_buffer = queued_buffers_.Find(hash);
      if (queued_buffer) {
        if (queued_buffer->queue_slice_id && slice_id) {
          context_->flow_tracker->InsertFlow(*queued_buffer->queue_slice_id,
                                             *slice_id);
        }

        queued_buffers_.Erase(hash);
      }
      break;
    }
    case FtraceEvent::kVb2V4l2BufQueueFieldNumber: {
      Vb2V4l2BufQueueFtraceEvent::Decoder pb_evt(bytes.data, bytes.size);
      BufferEvent evt;
      evt.device_minor = pb_evt.minor();
      evt.index = base::nullopt;
      evt.type = base::nullopt;
      evt.bytesused = base::nullopt;
      evt.flags = pb_evt.flags();
      evt.field = pb_evt.field();
      evt.timestamp = pb_evt.timestamp();
      evt.sequence = pb_evt.sequence();
      evt.timecode_flags = pb_evt.timecode_flags();
      evt.timecode_frames = pb_evt.timecode_frames();
      evt.timecode_hours = pb_evt.timecode_hours();
      evt.timecode_minutes = pb_evt.timecode_minutes();
      evt.timecode_seconds = pb_evt.timecode_seconds();
      evt.timecode_type = pb_evt.timecode_type();
      evt.timecode_userbits0 = pb_evt.timecode_userbits0();
      evt.timecode_userbits1 = pb_evt.timecode_userbits1();
      evt.timecode_userbits2 = pb_evt.timecode_userbits2();
      evt.timecode_userbits3 = pb_evt.timecode_userbits3();

      base::StackString<64> buf_name("vb2_v4l2_buf_queue minor=%" PRIu32
                                     " seq=%" PRIu32 " type=0 index=0",
                                     evt.device_minor, evt.sequence);

      StringId buf_name_id =
          context_->storage->InternString(buf_name.string_view());
      AddSlice(buf_name_id, timestamp, pid, evt);
      break;
    }
    case FtraceEvent::kVb2V4l2BufDoneFieldNumber: {
      Vb2V4l2BufDoneFtraceEvent::Decoder pb_evt(bytes.data, bytes.size);
      BufferEvent evt;
      evt.device_minor = pb_evt.minor();
      evt.index = base::nullopt;
      evt.type = base::nullopt;
      evt.bytesused = base::nullopt;
      evt.flags = pb_evt.flags();
      evt.field = pb_evt.field();
      evt.timestamp = pb_evt.timestamp();
      evt.sequence = pb_evt.sequence();
      evt.timecode_flags = pb_evt.timecode_flags();
      evt.timecode_frames = pb_evt.timecode_frames();
      evt.timecode_hours = pb_evt.timecode_hours();
      evt.timecode_minutes = pb_evt.timecode_minutes();
      evt.timecode_seconds = pb_evt.timecode_seconds();
      evt.timecode_type = pb_evt.timecode_type();
      evt.timecode_userbits0 = pb_evt.timecode_userbits0();
      evt.timecode_userbits1 = pb_evt.timecode_userbits1();
      evt.timecode_userbits2 = pb_evt.timecode_userbits2();
      evt.timecode_userbits3 = pb_evt.timecode_userbits3();

      base::StackString<64> buf_name("vb2_v4l2_buf_done minor=%" PRIu32
                                     " seq=%" PRIu32 " type=0 index=0",
                                     evt.device_minor, evt.sequence);

      StringId buf_name_id =
          context_->storage->InternString(buf_name.string_view());
      AddSlice(buf_name_id, timestamp, pid, evt);
      break;
    }
    case FtraceEvent::kVb2V4l2QbufFieldNumber: {
      Vb2V4l2QbufFtraceEvent::Decoder pb_evt(bytes.data, bytes.size);
      BufferEvent evt;
      evt.device_minor = pb_evt.minor();
      evt.index = base::nullopt;
      evt.type = base::nullopt;
      evt.bytesused = base::nullopt;
      evt.flags = pb_evt.flags();
      evt.field = pb_evt.field();
      evt.timestamp = pb_evt.timestamp();
      evt.sequence = pb_evt.sequence();
      evt.timecode_flags = pb_evt.timecode_flags();
      evt.timecode_frames = pb_evt.timecode_frames();
      evt.timecode_hours = pb_evt.timecode_hours();
      evt.timecode_minutes = pb_evt.timecode_minutes();
      evt.timecode_seconds = pb_evt.timecode_seconds();
      evt.timecode_type = pb_evt.timecode_type();
      evt.timecode_userbits0 = pb_evt.timecode_userbits0();
      evt.timecode_userbits1 = pb_evt.timecode_userbits1();
      evt.timecode_userbits2 = pb_evt.timecode_userbits2();
      evt.timecode_userbits3 = pb_evt.timecode_userbits3();

      base::StackString<64> buf_name("vb2_v4l2_qbuf minor=%" PRIu32
                                     " seq=%" PRIu32 " type=0 index=0",
                                     evt.device_minor, evt.sequence);

      StringId buf_name_id =
          context_->storage->InternString(buf_name.string_view());
      AddSlice(buf_name_id, timestamp, pid, evt);
      break;
    }
    case FtraceEvent::kVb2V4l2DqbufFieldNumber: {
      Vb2V4l2DqbufFtraceEvent::Decoder pb_evt(bytes.data, bytes.size);
      BufferEvent evt;
      evt.device_minor = pb_evt.minor();
      evt.index = base::nullopt;
      evt.type = base::nullopt;
      evt.bytesused = base::nullopt;
      evt.flags = pb_evt.flags();
      evt.field = pb_evt.field();
      evt.timestamp = pb_evt.timestamp();
      evt.sequence = pb_evt.sequence();
      evt.timecode_flags = pb_evt.timecode_flags();
      evt.timecode_frames = pb_evt.timecode_frames();
      evt.timecode_hours = pb_evt.timecode_hours();
      evt.timecode_minutes = pb_evt.timecode_minutes();
      evt.timecode_seconds = pb_evt.timecode_seconds();
      evt.timecode_type = pb_evt.timecode_type();
      evt.timecode_userbits0 = pb_evt.timecode_userbits0();
      evt.timecode_userbits1 = pb_evt.timecode_userbits1();
      evt.timecode_userbits2 = pb_evt.timecode_userbits2();
      evt.timecode_userbits3 = pb_evt.timecode_userbits3();

      base::StackString<64> buf_name("vb2_v4l2_qbuf minor=%" PRIu32
                                     " seq=%" PRIu32 " type=0 index=0",
                                     evt.device_minor, evt.sequence);

      StringId buf_name_id =
          context_->storage->InternString(buf_name.string_view());
      AddSlice(buf_name_id, timestamp, pid, evt);
      break;
    }
    default:
      break;
  }
}

base::Optional<SliceId> V4l2Tracker::AddSlice(StringId buf_name_id,
                                              int64_t timestamp,
                                              uint32_t pid,
                                              const BufferEvent& evt) {
  UniqueTid utid = context_->process_tracker->GetOrCreateThread(pid);
  TrackId track_id = context_->track_tracker->InternThreadTrack(utid);

  base::Optional<SliceId> slice_id = context_->slice_tracker->Scoped(
      timestamp, track_id, buf_event_ids_.v4l2, buf_name_id, 0,
      [this, &evt](ArgsTracker::BoundInserter* inserter) {
        this->AddArgs(evt, inserter);
      });

  return slice_id;
}

void V4l2Tracker::AddArgs(const BufferEvent& evt,
                          ArgsTracker::BoundInserter* inserter) {
  inserter->AddArg(buf_event_ids_.device_minor,
                   Variadic::Integer(evt.device_minor));

  if (evt.index)
    inserter->AddArg(buf_event_ids_.index, Variadic::Integer(*evt.index));
  if (evt.type)
    inserter->AddArg(buf_event_ids_.type,
                     Variadic::String(buf_type_ids_.Map(*evt.type)));
  if (evt.bytesused)
    inserter->AddArg(buf_event_ids_.bytesused,
                     Variadic::Integer(*evt.bytesused));

  inserter->AddArg(buf_event_ids_.flags,
                   Variadic::String(InternBufFlags(evt.flags)));
  inserter->AddArg(buf_event_ids_.field,
                   Variadic::String(buf_field_ids_.Map(evt.field)));
  inserter->AddArg(buf_event_ids_.timestamp, Variadic::Integer(evt.timestamp));
  inserter->AddArg(buf_event_ids_.timecode_type,
                   Variadic::String(tc_type_ids_.Map(evt.timecode_type)));
  inserter->AddArg(buf_event_ids_.timecode_flags,
                   Variadic::String(InternTcFlags(evt.timecode_flags)));
  inserter->AddArg(buf_event_ids_.timecode_frames,
                   Variadic::Integer(evt.timecode_frames));
  inserter->AddArg(buf_event_ids_.timecode_seconds,
                   Variadic::Integer(evt.timecode_seconds));
  inserter->AddArg(buf_event_ids_.timecode_minutes,
                   Variadic::Integer(evt.timecode_minutes));
  inserter->AddArg(buf_event_ids_.timecode_hours,
                   Variadic::Integer(evt.timecode_hours));
  inserter->AddArg(buf_event_ids_.timecode_userbits0,
                   Variadic::Integer(evt.timecode_userbits0));
  inserter->AddArg(buf_event_ids_.timecode_userbits1,
                   Variadic::Integer(evt.timecode_userbits1));
  inserter->AddArg(buf_event_ids_.timecode_userbits2,
                   Variadic::Integer(evt.timecode_userbits2));
  inserter->AddArg(buf_event_ids_.timecode_userbits3,
                   Variadic::Integer(evt.timecode_userbits3));
  inserter->AddArg(buf_event_ids_.sequence, Variadic::Integer(evt.sequence));
}

V4l2Tracker::BufferEventStringIds::BufferEventStringIds(TraceStorage& storage)
    : v4l2(storage.InternString("Video 4 Linux 2")),
      v4l2_qbuf(storage.InternString("v4l2_qbuf")),
      v4l2_dqbuf(storage.InternString("v4l2_dqbuf")),
      device_minor(storage.InternString("minor")),
      index(storage.InternString("index")),
      type(storage.InternString("type")),
      bytesused(storage.InternString("bytesused")),
      flags(storage.InternString("flags")),
      field(storage.InternString("field")),
      timestamp(storage.InternString("timestamp")),
      timecode_type(storage.InternString("timecode_type")),
      timecode_flags(storage.InternString("timecode_flags")),
      timecode_frames(storage.InternString("timecode_frames")),
      timecode_seconds(storage.InternString("timecode_seconds")),
      timecode_minutes(storage.InternString("timecode_minutes")),
      timecode_hours(storage.InternString("timecode_hours")),
      timecode_userbits0(storage.InternString("timecode_userbits0")),
      timecode_userbits1(storage.InternString("timecode_userbits1")),
      timecode_userbits2(storage.InternString("timecode_userbits2")),
      timecode_userbits3(storage.InternString("timecode_userbits3")),
      sequence(storage.InternString("sequence")) {}

V4l2Tracker::BufferTypeStringIds::BufferTypeStringIds(TraceStorage& storage)
    : video_capture(storage.InternString("VIDEO_CAPTURE")),
      video_output(storage.InternString("VIDEO_OUTPUT")),
      video_overlay(storage.InternString("VIDEO_OVERLAY")),
      vbi_capture(storage.InternString("VBI_CAPTURE")),
      vbi_output(storage.InternString("VBI_OUTPUT")),
      sliced_vbi_capture(storage.InternString("SLICED_VBI_CAPTURE")),
      sliced_vbi_output(storage.InternString("SLICED_VBI_OUTPUT")),
      video_output_overlay(storage.InternString("VIDEO_OUTPUT_OVERLAY")),
      video_capture_mplane(storage.InternString("VIDEO_CAPTURE_MPLANE")),
      video_output_mplane(storage.InternString("VIDEO_OUTPUT_MPLANE")),
      sdr_capture(storage.InternString("SDR_CAPTURE")),
      sdr_output(storage.InternString("SDR_OUTPUT")),
      meta_capture(storage.InternString("META_CAPTURE")),
      meta_output(storage.InternString("META_OUTPUT")),
      priv(storage.InternString("PRIVATE")) {}

StringId V4l2Tracker::BufferTypeStringIds::Map(uint32_t buf_type) {
  // Values taken from linux/videodev2.h
  switch (buf_type) {
    case 1:
      return video_capture;
    case 2:
      return video_output;
    case 3:
      return video_overlay;
    case 4:
      return vbi_capture;
    case 5:
      return vbi_output;
    case 6:
      return sliced_vbi_capture;
    case 7:
      return sliced_vbi_output;
    case 8:
      return video_output_overlay;
    case 9:
      return video_capture_mplane;
    case 10:
      return video_output_mplane;
    case 11:
      return sdr_capture;
    case 12:
      return sdr_output;
    case 13:
      return meta_capture;
    case 14:
      return meta_output;
    case 0x80:
      return priv;
    default:
      return kNullStringId;
  }
}

V4l2Tracker::BufferFieldStringIds::BufferFieldStringIds(TraceStorage& storage)
    : any(storage.InternString("ANY")),
      none(storage.InternString("NONE")),
      top(storage.InternString("TOP")),
      bottom(storage.InternString("BOTTOM")),
      interlaced(storage.InternString("INTERLACED")),
      seq_tb(storage.InternString("SEQ_TB")),
      seq_bt(storage.InternString("SEQ_BT")),
      alternate(storage.InternString("ALTERNATE")),
      interlaced_tb(storage.InternString("INTERLACED_TB")),
      interlaced_bt(storage.InternString("INTERLACED_BT")) {}

StringId V4l2Tracker::BufferFieldStringIds::Map(uint32_t field) {
  // Values taken from linux/videodev2.h
  switch (field) {
    case 0:
      return any;
    case 1:
      return none;
    case 2:
      return top;
    case 3:
      return bottom;
    case 4:
      return interlaced;
    case 5:
      return seq_tb;
    case 6:
      return seq_bt;
    case 7:
      return alternate;
    case 8:
      return interlaced_tb;
    case 9:
      return interlaced_bt;
    default:
      return kNullStringId;
  }
}

V4l2Tracker::TimecodeTypeStringIds::TimecodeTypeStringIds(TraceStorage& storage)
    : type_24fps(storage.InternString("24FPS")),
      type_25fps(storage.InternString("25FPS")),
      type_30fps(storage.InternString("30FPS")),
      type_50fps(storage.InternString("50FPS")),
      type_60fps(storage.InternString("60FPS")) {}

StringId V4l2Tracker::TimecodeTypeStringIds::Map(uint32_t type) {
  switch (type) {
    case 1:
      return type_24fps;
    case 2:
      return type_25fps;
    case 3:
      return type_30fps;
    case 4:
      return type_50fps;
    case 5:
      return type_60fps;
    default:
      return kNullStringId;
  }
}

StringId V4l2Tracker::InternBufFlags(uint32_t flags) {
  std::vector<std::string> present_flags;

  if (flags & 0x00000001)
    present_flags.push_back("MAPPED");
  if (flags & 0x00000002)
    present_flags.push_back("QUEUED");
  if (flags & 0x00000004)
    present_flags.push_back("DONE");
  if (flags & 0x00000008)
    present_flags.push_back("KEYFRAME");
  if (flags & 0x00000010)
    present_flags.push_back("PFRAME");
  if (flags & 0x00000020)
    present_flags.push_back("BFRAME");
  if (flags & 0x00000040)
    present_flags.push_back("ERROR");
  if (flags & 0x00000080)
    present_flags.push_back("IN_REQUEST");
  if (flags & 0x00000100)
    present_flags.push_back("TIMECODE");
  if (flags & 0x00000200)
    present_flags.push_back("M2M_HOLD_CAPTURE_BUF");
  if (flags & 0x00000400)
    present_flags.push_back("PREPARED");
  if (flags & 0x00000800)
    present_flags.push_back("NO_CACHE_INVALIDATE");
  if (flags & 0x00001000)
    present_flags.push_back("NO_CACHE_CLEAN");
  if (flags & 0x0000e000)
    present_flags.push_back("TIMESTAMP_MASK");
  if (flags == 0x00000000)
    present_flags.push_back("TIMESTAMP_UNKNOWN");
  if (flags & 0x00002000)
    present_flags.push_back("TIMESTAMP_MONOTONIC");
  if (flags & 0x00004000)
    present_flags.push_back("TIMESTAMP_COPY");
  if (flags & 0x00070000)
    present_flags.push_back("TSTAMP_SRC_MASK");
  if (flags == 0x00000000)
    present_flags.push_back("TSTAMP_SRC_EOF");
  if (flags & 0x00010000)
    present_flags.push_back("TSTAMP_SRC_SOE");
  if (flags & 0x00100000)
    present_flags.push_back("LAST");
  if (flags & 0x00800000)
    present_flags.push_back("REQUEST_FD");

  return context_->storage->InternString(
      base::Join(present_flags, "|").c_str());
}

StringId V4l2Tracker::InternTcFlags(uint32_t flags) {
  std::vector<std::string> present_flags;

  if (flags == 0x0000)
    present_flags.push_back("USERBITS_USERDEFINED");
  if (flags & 0x0001)
    present_flags.push_back("FLAG_DROPFRAME");
  if (flags & 0x0002)
    present_flags.push_back("FLAG_COLORFRAME");
  if ((flags & 0x000C) == 0x0004)
    present_flags.push_back("USERBITS_field(01)");
  if ((flags & 0x000C) == 0x0008)
    present_flags.push_back("USERBITS_field(10)");
  if ((flags & 0x000C) == 0x000C)
    present_flags.push_back("USERBITS_field(11)");
  if (flags & 0x0008)
    present_flags.push_back("USERBITS_8BITCHARS");

  return context_->storage->InternString(
      base::Join(present_flags, "|").c_str());
}

}  // namespace trace_processor
}  // namespace perfetto
