1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134

media / base / video_color_space.h [blame]

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_BASE_VIDEO_COLOR_SPACE_H_
#define MEDIA_BASE_VIDEO_COLOR_SPACE_H_

#include "media/base/media_export.h"
#include "ui/gfx/color_space.h"

namespace media {

// Described in ISO 23001-8:2016
class MEDIA_EXPORT VideoColorSpace {
 public:
  // Table 2
  //
  // TODO(https://crbug.com/380457000): Delete this enum and use
  // `SkNamedPrimaries::CicpId` instead.
  enum class PrimaryID : uint8_t {
    INVALID = 0,
    BT709 = 1,
    UNSPECIFIED = 2,
    BT470M = 4,
    BT470BG = 5,
    SMPTE170M = 6,
    SMPTE240M = 7,
    FILM = 8,
    BT2020 = 9,
    SMPTEST428_1 = 10,
    SMPTEST431_2 = 11,
    SMPTEST432_1 = 12,
    EBU_3213_E = 22,
    kMaxValue = EBU_3213_E,
  };

  // Table 3
  //
  // TODO(https://crbug.com/380457000): Delete this enum and use
  // `SkNamedTransferFn::CicpId` instead.
  enum class TransferID : uint8_t {
    INVALID = 0,
    BT709 = 1,
    UNSPECIFIED = 2,
    GAMMA22 = 4,
    GAMMA28 = 5,
    SMPTE170M = 6,
    SMPTE240M = 7,
    LINEAR = 8,
    LOG = 9,
    LOG_SQRT = 10,
    IEC61966_2_4 = 11,
    BT1361_ECG = 12,
    IEC61966_2_1 = 13,
    BT2020_10 = 14,
    BT2020_12 = 15,
    SMPTEST2084 = 16,
    SMPTEST428_1 = 17,

    // Not yet standardized
    ARIB_STD_B67 = 18,  // AKA hybrid-log gamma, HLG.

    kMaxValue = ARIB_STD_B67,
  };

  // Table 4
  enum class MatrixID : uint8_t {
    RGB = 0,
    BT709 = 1,
    UNSPECIFIED = 2,
    FCC = 4,
    BT470BG = 5,
    SMPTE170M = 6,
    SMPTE240M = 7,
    YCOCG = 8,
    BT2020_NCL = 9,
    // NOTE: BT2020_CL is no longer supported (b/333906350).
    BT2020_CL = 10,
    YDZDX = 11,
    INVALID = 255,
    kMaxValue = INVALID,
  };

  VideoColorSpace();
  VideoColorSpace(int primaries,
                  int transfer,
                  int matrix,
                  gfx::ColorSpace::RangeID range);
  VideoColorSpace(PrimaryID primaries,
                  TransferID transfer,
                  MatrixID matrix,
                  gfx::ColorSpace::RangeID range);

  bool operator==(const VideoColorSpace& other) const;
  bool operator!=(const VideoColorSpace& other) const;

  // Returns true if all of the fields have a value other
  // than INVALID or UNSPECIFIED.
  bool IsSpecified() const;

  // These will return INVALID if the number you give it
  // is not a valid enum value.
  static PrimaryID GetPrimaryID(int primary);
  static TransferID GetTransferID(int transfer);
  static MatrixID GetMatrixID(int matrix);

  static VideoColorSpace REC709();
  static VideoColorSpace REC601();
  static VideoColorSpace JPEG();

  gfx::ColorSpace ToGfxColorSpace() const;

  // Similar to ToGfxColorSpace(), but attempts to guess a gfx::ColorSpace from
  // a fully or partially specified VideoColorSpace. E.g., a completely invalid
  // VideoColorSpace will return a BT.709 gfx::ColorSpace.
  gfx::ColorSpace GuessGfxColorSpace() const;

  std::string ToString() const;

  static VideoColorSpace FromGfxColorSpace(const gfx::ColorSpace& color_space);

  // Note, these are public variables.
  PrimaryID primaries = PrimaryID::INVALID;
  TransferID transfer = TransferID::INVALID;
  MatrixID matrix = MatrixID::INVALID;
  gfx::ColorSpace::RangeID range = gfx::ColorSpace::RangeID::INVALID;

 private:
  gfx::ColorSpace ToGfxColorSpaceInternal(bool allow_guessing) const;
};

}  // namespace media

#endif  // MEDIA_BASE_VIDEO_COLOR_SPACE_H_