// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "garnet/bin/mediaplayer/graph/types/stream_type.h"

#include "garnet/bin/mediaplayer/util/safe_clone.h"
#include "lib/fxl/logging.h"

namespace media_player {

// These must match the definitions in media_types.fidl. This is verfied by
// the KnownEncodingsMatch function in fidl/fidl_type_conversion.cc. Changes
// to this list should be reflected there.
const char StreamType::kMediaEncodingUnsupported[] =
    "fuchsia.media.unsupported";

const char StreamType::kAudioEncodingAac[] = "fuchsia.media.aac";
const char StreamType::kAudioEncodingAmrNb[] = "fuchsia.media.amrnb";
const char StreamType::kAudioEncodingAmrWb[] = "fuchsia.media.amrwb";
const char StreamType::kAudioEncodingAptX[] = "fuchsia.media.aptx";
const char StreamType::kAudioEncodingFlac[] = "fuchsia.media.flac";
const char StreamType::kAudioEncodingGsmMs[] = "fuchsia.media.gsmms";
const char StreamType::kAudioEncodingLpcm[] = "fuchsia.media.lpcm";
const char StreamType::kAudioEncodingMp3[] = "fuchsia.media.mp3";
const char StreamType::kAudioEncodingPcmALaw[] = "fuchsia.media.pcmalaw";
const char StreamType::kAudioEncodingPcmMuLaw[] = "fuchsia.media.pcmmulaw";
const char StreamType::kAudioEncodingSbc[] = "fuchsia.media.sbc";
const char StreamType::kAudioEncodingVorbis[] = "fuchsia.media.vorbis";

const char StreamType::kVideoEncodingH263[] = "fuchsia.media.h263";
const char StreamType::kVideoEncodingH264[] = "fuchsia.media.h264";
const char StreamType::kVideoEncodingMpeg4[] = "fuchsia.media.mpeg4";
const char StreamType::kVideoEncodingTheora[] = "fuchsia.media.theora";
const char StreamType::kVideoEncodingUncompressed[] =
    "fuchsia.media.uncompressed_video";
const char StreamType::kVideoEncodingVp3[] = "fuchsia.media.vp3";
const char StreamType::kVideoEncodingVp8[] = "fuchsia.media.vp8";
const char StreamType::kVideoEncodingVp9[] = "fuchsia.media.vp9";

StreamType::StreamType(Medium medium, const std::string& encoding,
                       std::unique_ptr<Bytes> encoding_parameters)
    : medium_(medium),
      encoding_(encoding),
      encoding_parameters_(std::move(encoding_parameters)) {}

StreamType::~StreamType() {}

const AudioStreamType* StreamType::audio() const {
  FXL_LOG(ERROR) << "audio method called on non-audio stream type";
  return nullptr;
}

const VideoStreamType* StreamType::video() const {
  FXL_LOG(ERROR) << "video method called on non-video stream type";
  return nullptr;
}

const TextStreamType* StreamType::text() const {
  FXL_LOG(ERROR) << "text method called on non-text stream type";
  return nullptr;
}

const SubpictureStreamType* StreamType::subpicture() const {
  FXL_LOG(ERROR) << "subpicture method called on non-subpicture stream type";
  return nullptr;
}

std::unique_ptr<StreamType> StreamType::Clone() const {
  return Create(medium(), encoding(), SafeClone(encoding_parameters()));
}

StreamTypeSet::StreamTypeSet(StreamType::Medium medium,
                             const std::vector<std::string>& encodings)
    : medium_(medium), encodings_(encodings) {}

StreamTypeSet::~StreamTypeSet() {}

const AudioStreamTypeSet* StreamTypeSet::audio() const {
  FXL_LOG(ERROR) << "audio method called on non-audio stream type set";
  return nullptr;
}

const VideoStreamTypeSet* StreamTypeSet::video() const {
  FXL_LOG(ERROR) << "video method called on non-video stream type set";
  return nullptr;
}

const TextStreamTypeSet* StreamTypeSet::text() const {
  FXL_LOG(ERROR) << "text method called on non-text stream type set";
  return nullptr;
}

const SubpictureStreamTypeSet* StreamTypeSet::subpicture() const {
  FXL_LOG(ERROR)
      << "subpicture method called on non-subpicture stream type set";
  return nullptr;
}

std::unique_ptr<StreamTypeSet> StreamTypeSet::Clone() const {
  return Create(medium(), encodings());
}

bool StreamTypeSet::IncludesEncoding(const std::string& encoding) const {
  for (const std::string set_encoding : encodings_) {
    if (set_encoding == encoding) {
      return true;
    }
  }

  return false;
}

bool StreamTypeSet::Includes(const StreamType& type) const {
  return medium_ == type.medium() && IncludesEncoding(type.encoding());
}

}  // namespace media_player
