// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm

#include "videocodecs.hpp"
#include <QApplication>

namespace VideoStitch {
namespace VideoCodec {

VideoCodecEnum getEnumFromString(const QString& codec) {
  for (auto it : VideoEncoderEnum::getDescriptorsList()) {
    if (it.at(1) == codec) {
      return VideoEncoderEnum::getEnumFromDescriptor(it).getValue();
    }
  }
  return VideoCodecEnum::UNKNOWN;
}

void VideoCodecClass::initDescriptions(QMap<Enum, QStringList>& enumToString) {
  enumToString[VideoCodecEnum::MPEG2] =
      QStringList({QApplication::translate("VideoCodec", "MPEG2"), QStringLiteral("mpeg2")});
  enumToString[VideoCodecEnum::MPEG4] =
      QStringList({QApplication::translate("VideoCodec", "MPEG4"), QStringLiteral("mpeg4")});
  enumToString[VideoCodecEnum::H264] =
      QStringList({QApplication::translate("VideoCodec", "H264"), QStringLiteral("h264")});
  enumToString[VideoCodecEnum::HEVC] =
      QStringList({QApplication::translate("VideoCodec", "HEVC"), QStringLiteral("hevc")});
  enumToString[VideoCodecEnum::MJPEG] =
      QStringList({QApplication::translate("VideoCodec", "Motion JPEG"), QStringLiteral("mjpeg")});
  enumToString[VideoCodecEnum::PRORES] =
      QStringList({QApplication::translate("VideoCodec", "ProRes"), QStringLiteral("prores")});
  enumToString[VideoCodecEnum::QUICKSYNC_H264] =
      QStringList({QApplication::translate("VideoCodec", "H264 (Intel QuickSync)"), QStringLiteral("h264_qsv")});
  enumToString[VideoCodecEnum::NVENC_H264] =
      QStringList({QApplication::translate("VideoCodec", "H264 (Nvidia NVENC)"), QStringLiteral("h264_nvenc")});
  enumToString[VideoCodecEnum::NVENC_HEVC] =
      QStringList({QApplication::translate("VideoCodec", "HEVC (Nvidia NVENC)"), QStringLiteral("hevc_nvenc")});
  enumToString[VideoCodecEnum::UNKNOWN] =
      QStringList({QApplication::translate("VideoCodec", "Unknown"), QStringLiteral("unknown")});
  // additionals descriptors
  VideoEncoderEnum::descriptorToEnum[QStringList(
      {QApplication::translate("VideoCodec", "H264"), QStringLiteral("h264_x264")})] = VideoCodecEnum::H264;
  VideoEncoderEnum::descriptorToEnum[QStringList(
      {QApplication::translate("VideoCodec", "H264"), QStringLiteral("x264")})] = VideoCodecEnum::H264;
  VideoEncoderEnum::descriptorToEnum[QStringList({QApplication::translate("VideoCodec", "H264 (Intel QuickSync)"),
                                                  QStringLiteral("qsv")})] = VideoCodecEnum::QUICKSYNC_H264;
  VideoEncoderEnum::descriptorToEnum[QStringList({QApplication::translate("VideoCodec", "H264 (Intel QuickSync)"),
                                                  QStringLiteral("qsv_h264")})] = VideoCodecEnum::QUICKSYNC_H264;
  VideoEncoderEnum::descriptorToEnum[QStringList({QApplication::translate("VideoCodec", "H264 (Nvidia NVENC)"),
                                                  QStringLiteral("nvenc")})] = VideoCodecEnum::NVENC_H264;
  VideoEncoderEnum::descriptorToEnum[QStringList({QApplication::translate("VideoCodec", "H264 (Nvidia NVENC)"),
                                                  QStringLiteral("nvenc_h264")})] = VideoCodecEnum::NVENC_H264;
  VideoEncoderEnum::descriptorToEnum[QStringList({QApplication::translate("VideoCodec", "HEVC (Nvidia NVENC)"),
                                                  QStringLiteral("nvenc_hevc")})] = VideoCodecEnum::NVENC_HEVC;
}

const VideoCodecClass::Enum VideoCodecClass::defaultValue = VideoCodecEnum::UNKNOWN;

}  // namespace VideoCodec
}  // namespace VideoStitch