/*
 *  Copyright (c) 2010 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "api/video/video_common.h"

#include <cstdint>
#include <string>

#include "rtc_base/strings/string_builder.h"

namespace webrtc {

struct FourCCAliasEntry {
  uint32_t alias;
  uint32_t canonical;
};

static const FourCCAliasEntry kFourCCAliases[] = {
    {.alias = FOURCC_IYUV, .canonical = FOURCC_I420},
    {.alias = FOURCC_YU16, .canonical = FOURCC_I422},
    {.alias = FOURCC_YU24, .canonical = FOURCC_I444},
    {.alias = FOURCC_YUYV, .canonical = FOURCC_YUY2},
    {.alias = FOURCC_YUVS, .canonical = FOURCC_YUY2},
    {.alias = FOURCC_HDYC, .canonical = FOURCC_UYVY},
    {.alias = FOURCC_2VUY, .canonical = FOURCC_UYVY},
    {.alias = FOURCC_JPEG,
     .canonical = FOURCC_MJPG},  // Note: JPEG has DHT while MJPG does not.
    {.alias = FOURCC_DMB1, .canonical = FOURCC_MJPG},
    {.alias = FOURCC_BA81, .canonical = FOURCC_BGGR},
    {.alias = FOURCC_RGB3, .canonical = FOURCC_RAW},
    {.alias = FOURCC_BGR3, .canonical = FOURCC_24BG},
    {.alias = FOURCC_CM32, .canonical = FOURCC_BGRA},
    {.alias = FOURCC_CM24, .canonical = FOURCC_RAW},
};

uint32_t CanonicalFourCC(uint32_t fourcc) {
  for (const FourCCAliasEntry& entry : kFourCCAliases) {
    if (entry.alias == fourcc) {
      return entry.canonical;
    }
  }
  // Not an alias, so return it as-is.
  return fourcc;
}

// The C++ standard requires a namespace-scope definition of static const
// integral types even when they are initialized in the declaration (see
// [class.static.data]/4), but MSVC with /Ze is non-conforming and treats that
// as a multiply defined symbol error. See Also:
// http://msdn.microsoft.com/en-us/library/34h23df8.aspx
#ifndef _MSC_EXTENSIONS
const int64_t VideoFormat::kMinimumInterval;  // Initialized in header.
#endif

std::string VideoFormat::ToString() const {
  std::string fourcc_name = GetFourccName(fourcc) + " ";
  for (std::string::const_iterator i = fourcc_name.begin();
       i < fourcc_name.end(); ++i) {
    // Test character is printable; Avoid isprint() which asserts on negatives.
    if (*i < 32 || *i >= 127) {
      fourcc_name = "";
      break;
    }
  }

  StringBuilder sb;
  sb << fourcc_name << width << "x" << height << "x"
     << IntervalToFpsFloat(interval);
  return sb.Release();
}

}  // namespace webrtc
