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

#include "libvideostitch/frame.hpp"

namespace VideoStitch {

const char* getStringFromPixelFormat(const PixelFormat pixelFormat) {
  switch (pixelFormat) {
    case RGBA:
      return "RGBA";
    case RGB:
      return "RGB";
    case BGR:
      return "BGR";
    case BGRU:
      return "BGRU";
    case UYVY:
      return "UYVY";
    case YUY2:
      return "YUY2";
    case YV12:
      return "YV12";
    case Grayscale:
      return "Gray scale";
    case Grayscale16:
      return "Gray scale (16 Bit)";
    case F32_C1:
      return "Depth";
    case DEPTH:
      return "Depth YV12";
    default:
      return "";
  }
}

PixelFormat getPixelFormatFromString(const std::string& name) {
  if (name == "RGBA") {
    return PixelFormat::RGBA;
  } else if (name == "RGB") {
    return PixelFormat::RGB;
  } else if (name == "BGR") {
    return PixelFormat::BGR;
  } else if (name == "BGRU") {
    return PixelFormat::BGRU;
  } else if (name == "UYVY") {
    return PixelFormat::UYVY;
  } else if (name == "YUY2") {
    return PixelFormat::YUY2;
  } else if (name == "YV12") {
    return PixelFormat::YV12;
  } else if (name == "Gray scale") {
    return PixelFormat::Grayscale;
  } else if (name == "Gray scale (16 Bit)") {
    return PixelFormat::Grayscale16;
  } else if (name == "Depth") {
    return PixelFormat::F32_C1;
  } else if (name == "Depth YV12") {
    return PixelFormat::DEPTH;
  } else {
    return PixelFormat::Unknown;
  }
}

int32_t getFrameDataSize(int32_t width, int32_t height, const PixelFormat pixelFormat) {
  switch (pixelFormat) {
    // 32 bpp
    case RGBA:
    case BGRU:
    case YUV422P10:  // 20 bpp but 10 bits values are padded to 16 bits
    case F32_C1:
      return width * height * 4;
    // 24 bpp
    case RGB:
    case BGR:
      return width * height * 3;
    // 16 bpp
    case UYVY:
    case YUY2:
    case Grayscale16:
      return width * height * 2;
    // 12 bpp
    case YV12:
    case NV12:
    case DEPTH:
      return (width * height * 3) / 2;
    // 8 bpp
    case Grayscale:
      return (width * height);
    default:
      return 0;
  }
}

}  // namespace VideoStitch