CodingIndependentCodePoints.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /*
  2. * Copyright (c) 2022, Gregory Bertilson <zaggy1024@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/StringView.h>
  8. namespace Video {
  9. // CICP is defined by H.273:
  10. // https://www.itu.int/rec/T-REC-H.273/en
  11. // See the Section 8.
  12. // Current edition is from 07/21.
  13. enum class ColorPrimaries : u8 {
  14. Reserved = 0,
  15. BT709 = 1,
  16. Unspecified = 2, // Used by codecs to indicate that an alternative value may be used
  17. BT470M = 4,
  18. BT470BG = 5,
  19. BT601 = 6,
  20. SMPTE240 = 7,
  21. GenericFilm = 8,
  22. BT2020 = 9,
  23. XYZ = 10,
  24. SMPTE431 = 11,
  25. SMPTE432 = 12,
  26. EBU3213 = 22,
  27. // All other values are also Reserved for later use.
  28. };
  29. enum class TransferCharacteristics : u8 {
  30. Reserved = 0,
  31. BT709 = 1,
  32. Unspecified = 2, // Used by codecs to indicate that an alternative value may be used
  33. BT470M = 4,
  34. BT470BG = 5,
  35. BT601 = 6, // BT.601 or Rec. 601
  36. SMPTE240 = 7,
  37. Linear = 8,
  38. Log100 = 9,
  39. Log100Sqrt10 = 10,
  40. IEC61966 = 11,
  41. BT1361 = 12,
  42. SRGB = 13,
  43. BT2020BitDepth10 = 14,
  44. BT2020BitDepth12 = 15,
  45. SMPTE2084 = 16, // Also known as PQ
  46. SMPTE428 = 17,
  47. HLG = 18,
  48. // All other values are also Reserved for later use.
  49. };
  50. enum class MatrixCoefficients : u8 {
  51. Identity = 0, // Applies no transformation to input values
  52. BT709 = 1,
  53. Unspecified = 2, // Used by codecs to indicate that an alternative value may be used
  54. FCC = 4,
  55. BT470BG = 5,
  56. BT601 = 6,
  57. SMPTE240 = 7,
  58. YCgCo = 8,
  59. BT2020NonConstantLuminance = 9,
  60. BT2020ConstantLuminance = 10,
  61. SMPTE2085 = 11,
  62. ChromaticityDerivedNonConstantLuminance = 12,
  63. ChromaticityDerivedConstantLuminance = 13,
  64. ICtCp = 14,
  65. // All other values are Reserved for later use.
  66. };
  67. enum class ColorRange : u8 {
  68. Studio = 0, // Y range 16..235, UV range 16..240
  69. Full = 1, // 0..255
  70. };
  71. // https://en.wikipedia.org/wiki/Coding-independent_code_points
  72. struct CodingIndependentCodePoints {
  73. public:
  74. constexpr CodingIndependentCodePoints(ColorPrimaries color_primaries, TransferCharacteristics transfer_characteristics, MatrixCoefficients matrix_coefficients, ColorRange color_range)
  75. : m_color_primaries(color_primaries)
  76. , m_transfer_characteristics(transfer_characteristics)
  77. , m_matrix_coefficients(matrix_coefficients)
  78. , m_color_range(color_range)
  79. {
  80. }
  81. constexpr ColorPrimaries color_primaries() const { return m_color_primaries; }
  82. constexpr void set_color_primaries(ColorPrimaries value) { m_color_primaries = value; }
  83. constexpr TransferCharacteristics transfer_characteristics() const { return m_transfer_characteristics; }
  84. constexpr void set_transfer_characteristics(TransferCharacteristics value) { m_transfer_characteristics = value; }
  85. constexpr MatrixCoefficients matrix_coefficients() const { return m_matrix_coefficients; }
  86. constexpr void set_matrix_coefficients(MatrixCoefficients value) { m_matrix_coefficients = value; }
  87. constexpr ColorRange color_range() const { return m_color_range; }
  88. constexpr void set_color_range(ColorRange value) { m_color_range = value; }
  89. constexpr void default_code_points_if_unspecified(ColorPrimaries cp, TransferCharacteristics tc, MatrixCoefficients mc)
  90. {
  91. if (color_primaries() == ColorPrimaries::Unspecified)
  92. set_color_primaries(cp);
  93. if (transfer_characteristics() == TransferCharacteristics::Unspecified)
  94. set_transfer_characteristics(tc);
  95. if (matrix_coefficients() == MatrixCoefficients::Unspecified)
  96. set_matrix_coefficients(mc);
  97. }
  98. private:
  99. ColorPrimaries m_color_primaries;
  100. TransferCharacteristics m_transfer_characteristics;
  101. MatrixCoefficients m_matrix_coefficients;
  102. ColorRange m_color_range;
  103. };
  104. constexpr StringView color_primaries_to_string(ColorPrimaries color_primaries)
  105. {
  106. switch (color_primaries) {
  107. case ColorPrimaries::Reserved:
  108. return "Reserved"sv;
  109. case ColorPrimaries::BT709:
  110. return "BT.709"sv;
  111. case ColorPrimaries::Unspecified:
  112. return "Unspecified"sv;
  113. case ColorPrimaries::BT470M:
  114. return "BT.470 System M"sv;
  115. case ColorPrimaries::BT470BG:
  116. return "BT.470 System B, G"sv;
  117. case ColorPrimaries::BT601:
  118. return "BT.601"sv;
  119. case ColorPrimaries::SMPTE240:
  120. return "SMPTE ST 240"sv;
  121. case ColorPrimaries::GenericFilm:
  122. return "Generic film"sv;
  123. case ColorPrimaries::BT2020:
  124. return "BT.2020"sv;
  125. case ColorPrimaries::XYZ:
  126. return "CIE 1931 XYZ"sv;
  127. case ColorPrimaries::SMPTE431:
  128. return "SMPTE RP 431"sv;
  129. case ColorPrimaries::SMPTE432:
  130. return "SMPTE EG 432"sv;
  131. case ColorPrimaries::EBU3213:
  132. return "EBU Tech 3213"sv;
  133. }
  134. return "Reserved"sv;
  135. };
  136. constexpr StringView transfer_characteristics_to_string(TransferCharacteristics transfer_characteristics)
  137. {
  138. switch (transfer_characteristics) {
  139. case TransferCharacteristics::Reserved:
  140. return "Reserved"sv;
  141. case TransferCharacteristics::BT709:
  142. return "BT.709"sv;
  143. case TransferCharacteristics::Unspecified:
  144. return "Unspecified"sv;
  145. case TransferCharacteristics::BT470M:
  146. return "BT.470 System M"sv;
  147. case TransferCharacteristics::BT470BG:
  148. return "BT.470 System B, G"sv;
  149. case TransferCharacteristics::BT601:
  150. return "BT.601"sv;
  151. case TransferCharacteristics::SMPTE240:
  152. return "SMPTE ST 240"sv;
  153. case TransferCharacteristics::Linear:
  154. return "Linear"sv;
  155. case TransferCharacteristics::Log100:
  156. return "Logarithmic (100:1 range)"sv;
  157. case TransferCharacteristics::Log100Sqrt10:
  158. return "Logarithmic (100xSqrt(10):1 range)"sv;
  159. case TransferCharacteristics::IEC61966:
  160. return "IEC 61966"sv;
  161. case TransferCharacteristics::BT1361:
  162. return "BT.1361"sv;
  163. case TransferCharacteristics::SRGB:
  164. return "sRGB"sv;
  165. case TransferCharacteristics::BT2020BitDepth10:
  166. return "BT.2020 (10-bit)"sv;
  167. case TransferCharacteristics::BT2020BitDepth12:
  168. return "BT.2020 (12-bit)"sv;
  169. case TransferCharacteristics::SMPTE2084:
  170. return "SMPTE ST 2084 (PQ)"sv;
  171. case TransferCharacteristics::SMPTE428:
  172. return "SMPTE ST 428"sv;
  173. case TransferCharacteristics::HLG:
  174. return "ARIB STD-B67 (HLG, BT.2100)"sv;
  175. }
  176. return "Reserved"sv;
  177. };
  178. constexpr StringView matrix_coefficients_to_string(MatrixCoefficients matrix_coefficients)
  179. {
  180. switch (matrix_coefficients) {
  181. case MatrixCoefficients::Identity:
  182. return "Identity"sv;
  183. case MatrixCoefficients::BT709:
  184. return "BT.709"sv;
  185. case MatrixCoefficients::Unspecified:
  186. return "Unspecified"sv;
  187. case MatrixCoefficients::FCC:
  188. return "FCC (CFR 73.682)"sv;
  189. case MatrixCoefficients::BT470BG:
  190. return "BT.470 System B, G"sv;
  191. case MatrixCoefficients::BT601:
  192. return "BT.601"sv;
  193. case MatrixCoefficients::SMPTE240:
  194. return "SMPTE ST 240"sv;
  195. case MatrixCoefficients::YCgCo:
  196. return "YCgCo"sv;
  197. case MatrixCoefficients::BT2020NonConstantLuminance:
  198. return "BT.2020, non-constant luminance"sv;
  199. case MatrixCoefficients::BT2020ConstantLuminance:
  200. return "BT.2020, constant luminance"sv;
  201. case MatrixCoefficients::SMPTE2085:
  202. return "SMPTE ST 2085"sv;
  203. case MatrixCoefficients::ChromaticityDerivedNonConstantLuminance:
  204. return "Chromaticity-derived, non-constant luminance"sv;
  205. case MatrixCoefficients::ChromaticityDerivedConstantLuminance:
  206. return "Chromaticity-derived, constant luminance"sv;
  207. case MatrixCoefficients::ICtCp:
  208. return "BT.2100 ICtCp"sv;
  209. }
  210. return "Reserved"sv;
  211. };
  212. }