/*
 *  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::kUnspecified;
  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::kUnspecified;
  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::kUnspecified;
  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
