/*
 *  Copyright (c) 2018 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 "modules/video_coding/codecs/h264/h264_color_space.h"

namespace webrtc {

ColorSpace ExtractH264ColorSpace(AVCodecContext* codec) {
  ColorSpace::PrimaryID primaries = ColorSpace::PrimaryID::kInvalid;
  switch (codec->color_primaries) {
    case AVCOL_PRI_BT709:
      primaries = ColorSpace::PrimaryID::kBT709;
      break;
    case AVCOL_PRI_BT470M:
      primaries = ColorSpace::PrimaryID::kBT470M;
      break;
    case AVCOL_PRI_BT470BG:
      primaries = ColorSpace::PrimaryID::kBT470BG;
      break;
    case AVCOL_PRI_SMPTE170M:
      primaries = ColorSpace::PrimaryID::kSMPTE170M;
      break;
    case AVCOL_PRI_SMPTE240M:
      primaries = ColorSpace::PrimaryID::kSMPTE240M;
      break;
    case AVCOL_PRI_FILM:
      primaries = ColorSpace::PrimaryID::kFILM;
      break;
    case AVCOL_PRI_BT2020:
      primaries = ColorSpace::PrimaryID::kBT2020;
      break;
    case AVCOL_PRI_SMPTE428:
      primaries = ColorSpace::PrimaryID::kSMPTEST428;
      break;
    case AVCOL_PRI_SMPTE431:
      primaries = ColorSpace::PrimaryID::kSMPTEST431;
      break;
    case AVCOL_PRI_SMPTE432:
      primaries = ColorSpace::PrimaryID::kSMPTEST432;
      break;
    case AVCOL_PRI_JEDEC_P22:
      primaries = ColorSpace::PrimaryID::kJEDECP22;
      break;
    case AVCOL_PRI_RESERVED0:
    case AVCOL_PRI_UNSPECIFIED:
    case AVCOL_PRI_RESERVED:
    default:
      break;
  }

  ColorSpace::TransferID transfer = ColorSpace::TransferID::kInvalid;
  switch (codec->color_trc) {
    case AVCOL_TRC_BT709:
      transfer = ColorSpace::TransferID::kBT709;
      break;
    case AVCOL_TRC_GAMMA22:
      transfer = ColorSpace::TransferID::kGAMMA22;
      break;
    case AVCOL_TRC_GAMMA28:
      transfer = ColorSpace::TransferID::kGAMMA28;
      break;
    case AVCOL_TRC_SMPTE170M:
      transfer = ColorSpace::TransferID::kSMPTE170M;
      break;
    case AVCOL_TRC_SMPTE240M:
      transfer = ColorSpace::TransferID::kSMPTE240M;
      break;
    case AVCOL_TRC_LINEAR:
      transfer = ColorSpace::TransferID::kLINEAR;
      break;
    case AVCOL_TRC_LOG:
      transfer = ColorSpace::TransferID::kLOG;
      break;
    case AVCOL_TRC_LOG_SQRT:
      transfer = ColorSpace::TransferID::kLOG_SQRT;
      break;
    case AVCOL_TRC_IEC61966_2_4:
      transfer = ColorSpace::TransferID::kIEC61966_2_4;
      break;
    case AVCOL_TRC_BT1361_ECG:
      transfer = ColorSpace::TransferID::kBT1361_ECG;
      break;
    case AVCOL_TRC_IEC61966_2_1:
      transfer = ColorSpace::TransferID::kIEC61966_2_1;
      break;
    case AVCOL_TRC_BT2020_10:
      transfer = ColorSpace::TransferID::kBT2020_10;
      break;
    case AVCOL_TRC_BT2020_12:
      transfer = ColorSpace::TransferID::kBT2020_12;
      break;
    case AVCOL_TRC_SMPTE2084:
      transfer = ColorSpace::TransferID::kSMPTEST2084;
      break;
    case AVCOL_TRC_SMPTE428:
      transfer = ColorSpace::TransferID::kSMPTEST428;
      break;
    case AVCOL_TRC_ARIB_STD_B67:
      transfer = ColorSpace::TransferID::kARIB_STD_B67;
      break;
    case AVCOL_TRC_RESERVED0:
    case AVCOL_TRC_UNSPECIFIED:
    case AVCOL_TRC_RESERVED:
    default:
      break;
  }

  ColorSpace::MatrixID matrix = ColorSpace::MatrixID::kInvalid;
  switch (codec->colorspace) {
    case AVCOL_SPC_RGB:
      matrix = ColorSpace::MatrixID::kRGB;
      break;
    case AVCOL_SPC_BT709:
      matrix = ColorSpace::MatrixID::kBT709;
      break;
    case AVCOL_SPC_FCC:
      matrix = ColorSpace::MatrixID::kFCC;
      break;
    case AVCOL_SPC_BT470BG:
      matrix = ColorSpace::MatrixID::kBT470BG;
      break;
    case AVCOL_SPC_SMPTE170M:
      matrix = ColorSpace::MatrixID::kSMPTE170M;
      break;
    case AVCOL_SPC_SMPTE240M:
      matrix = ColorSpace::MatrixID::kSMPTE240M;
      break;
    case AVCOL_SPC_YCGCO:
      matrix = ColorSpace::MatrixID::kYCOCG;
      break;
    case AVCOL_SPC_BT2020_NCL:
      matrix = ColorSpace::MatrixID::kBT2020_NCL;
      break;
    case AVCOL_SPC_BT2020_CL:
      matrix = ColorSpace::MatrixID::kBT2020_CL;
      break;
    case AVCOL_SPC_SMPTE2085:
      matrix = ColorSpace::MatrixID::kSMPTE2085;
      break;
    case AVCOL_SPC_CHROMA_DERIVED_NCL:
    case AVCOL_SPC_CHROMA_DERIVED_CL:
    case AVCOL_SPC_ICTCP:
    case AVCOL_SPC_UNSPECIFIED:
    case AVCOL_SPC_RESERVED:
    default:
      break;
  }

  ColorSpace::RangeID range = ColorSpace::RangeID::kInvalid;
  switch (codec->color_range) {
    case AVCOL_RANGE_MPEG:
      range = ColorSpace::RangeID::kLimited;
      break;
    case AVCOL_RANGE_JPEG:
      range = ColorSpace::RangeID::kFull;
      break;
    case AVCOL_RANGE_UNSPECIFIED:
    default:
      break;
  }
  return ColorSpace(primaries, transfer, matrix, range);
}

}  // namespace webrtc
