CodingIndependentCodePoints.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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 VideoFullRangeFlag : u8 {
  68. Studio = 0, // Y range 16..235, UV range 16..240
  69. Full = 1, // 0..255
  70. Unspecified = 2, // Not part of the spec, serenity-specific addition for convenience.
  71. };
  72. // https://en.wikipedia.org/wiki/Coding-independent_code_points
  73. struct CodingIndependentCodePoints {
  74. public:
  75. constexpr CodingIndependentCodePoints(ColorPrimaries color_primaries, TransferCharacteristics transfer_characteristics, MatrixCoefficients matrix_coefficients, VideoFullRangeFlag video_full_range_flag)
  76. : m_color_primaries(color_primaries)
  77. , m_transfer_characteristics(transfer_characteristics)
  78. , m_matrix_coefficients(matrix_coefficients)
  79. , m_video_full_range_flag(video_full_range_flag)
  80. {
  81. }
  82. constexpr ColorPrimaries color_primaries() const { return m_color_primaries; }
  83. constexpr void set_color_primaries(ColorPrimaries value) { m_color_primaries = value; }
  84. constexpr TransferCharacteristics transfer_characteristics() const { return m_transfer_characteristics; }
  85. constexpr void set_transfer_characteristics(TransferCharacteristics value) { m_transfer_characteristics = value; }
  86. constexpr MatrixCoefficients matrix_coefficients() const { return m_matrix_coefficients; }
  87. constexpr void set_matrix_coefficients(MatrixCoefficients value) { m_matrix_coefficients = value; }
  88. constexpr VideoFullRangeFlag video_full_range_flag() const { return m_video_full_range_flag; }
  89. constexpr void set_video_full_range_flag(VideoFullRangeFlag value) { m_video_full_range_flag = value; }
  90. constexpr void default_code_points_if_unspecified(CodingIndependentCodePoints cicp)
  91. {
  92. if (color_primaries() == ColorPrimaries::Unspecified)
  93. set_color_primaries(cicp.color_primaries());
  94. if (transfer_characteristics() == TransferCharacteristics::Unspecified)
  95. set_transfer_characteristics(cicp.transfer_characteristics());
  96. if (matrix_coefficients() == MatrixCoefficients::Unspecified)
  97. set_matrix_coefficients(cicp.matrix_coefficients());
  98. if (video_full_range_flag() == VideoFullRangeFlag::Unspecified)
  99. set_video_full_range_flag(cicp.video_full_range_flag());
  100. }
  101. constexpr void adopt_specified_values(CodingIndependentCodePoints cicp)
  102. {
  103. if (cicp.color_primaries() != ColorPrimaries::Unspecified)
  104. set_color_primaries(cicp.color_primaries());
  105. if (cicp.transfer_characteristics() != TransferCharacteristics::Unspecified)
  106. set_transfer_characteristics(cicp.transfer_characteristics());
  107. if (cicp.matrix_coefficients() != MatrixCoefficients::Unspecified)
  108. set_matrix_coefficients(cicp.matrix_coefficients());
  109. if (cicp.video_full_range_flag() != VideoFullRangeFlag::Unspecified)
  110. set_video_full_range_flag(cicp.video_full_range_flag());
  111. }
  112. private:
  113. ColorPrimaries m_color_primaries;
  114. TransferCharacteristics m_transfer_characteristics;
  115. MatrixCoefficients m_matrix_coefficients;
  116. VideoFullRangeFlag m_video_full_range_flag;
  117. };
  118. constexpr StringView color_primaries_to_string(ColorPrimaries color_primaries)
  119. {
  120. switch (color_primaries) {
  121. case ColorPrimaries::Reserved:
  122. return "Reserved"sv;
  123. case ColorPrimaries::BT709:
  124. return "BT.709"sv;
  125. case ColorPrimaries::Unspecified:
  126. return "Unspecified"sv;
  127. case ColorPrimaries::BT470M:
  128. return "BT.470 System M"sv;
  129. case ColorPrimaries::BT470BG:
  130. return "BT.470 System B, G"sv;
  131. case ColorPrimaries::BT601:
  132. return "BT.601"sv;
  133. case ColorPrimaries::SMPTE240:
  134. return "SMPTE ST 240"sv;
  135. case ColorPrimaries::GenericFilm:
  136. return "Generic film"sv;
  137. case ColorPrimaries::BT2020:
  138. return "BT.2020"sv;
  139. case ColorPrimaries::XYZ:
  140. return "CIE 1931 XYZ"sv;
  141. case ColorPrimaries::SMPTE431:
  142. return "SMPTE RP 431"sv;
  143. case ColorPrimaries::SMPTE432:
  144. return "SMPTE EG 432"sv;
  145. case ColorPrimaries::EBU3213:
  146. return "EBU Tech 3213"sv;
  147. }
  148. return "Reserved"sv;
  149. }
  150. constexpr StringView transfer_characteristics_to_string(TransferCharacteristics transfer_characteristics)
  151. {
  152. switch (transfer_characteristics) {
  153. case TransferCharacteristics::Reserved:
  154. return "Reserved"sv;
  155. case TransferCharacteristics::BT709:
  156. return "BT.709"sv;
  157. case TransferCharacteristics::Unspecified:
  158. return "Unspecified"sv;
  159. case TransferCharacteristics::BT470M:
  160. return "BT.470 System M"sv;
  161. case TransferCharacteristics::BT470BG:
  162. return "BT.470 System B, G"sv;
  163. case TransferCharacteristics::BT601:
  164. return "BT.601"sv;
  165. case TransferCharacteristics::SMPTE240:
  166. return "SMPTE ST 240"sv;
  167. case TransferCharacteristics::Linear:
  168. return "Linear"sv;
  169. case TransferCharacteristics::Log100:
  170. return "Logarithmic (100:1 range)"sv;
  171. case TransferCharacteristics::Log100Sqrt10:
  172. return "Logarithmic (100xSqrt(10):1 range)"sv;
  173. case TransferCharacteristics::IEC61966:
  174. return "IEC 61966"sv;
  175. case TransferCharacteristics::BT1361:
  176. return "BT.1361"sv;
  177. case TransferCharacteristics::SRGB:
  178. return "sRGB"sv;
  179. case TransferCharacteristics::BT2020BitDepth10:
  180. return "BT.2020 (10-bit)"sv;
  181. case TransferCharacteristics::BT2020BitDepth12:
  182. return "BT.2020 (12-bit)"sv;
  183. case TransferCharacteristics::SMPTE2084:
  184. return "SMPTE ST 2084 (PQ)"sv;
  185. case TransferCharacteristics::SMPTE428:
  186. return "SMPTE ST 428"sv;
  187. case TransferCharacteristics::HLG:
  188. return "ARIB STD-B67 (HLG, BT.2100)"sv;
  189. }
  190. return "Reserved"sv;
  191. }
  192. constexpr StringView matrix_coefficients_to_string(MatrixCoefficients matrix_coefficients)
  193. {
  194. switch (matrix_coefficients) {
  195. case MatrixCoefficients::Identity:
  196. return "Identity"sv;
  197. case MatrixCoefficients::BT709:
  198. return "BT.709"sv;
  199. case MatrixCoefficients::Unspecified:
  200. return "Unspecified"sv;
  201. case MatrixCoefficients::FCC:
  202. return "FCC (CFR 73.682)"sv;
  203. case MatrixCoefficients::BT470BG:
  204. return "BT.470 System B, G"sv;
  205. case MatrixCoefficients::BT601:
  206. return "BT.601"sv;
  207. case MatrixCoefficients::SMPTE240:
  208. return "SMPTE ST 240"sv;
  209. case MatrixCoefficients::YCgCo:
  210. return "YCgCo"sv;
  211. case MatrixCoefficients::BT2020NonConstantLuminance:
  212. return "BT.2020, non-constant luminance"sv;
  213. case MatrixCoefficients::BT2020ConstantLuminance:
  214. return "BT.2020, constant luminance"sv;
  215. case MatrixCoefficients::SMPTE2085:
  216. return "SMPTE ST 2085"sv;
  217. case MatrixCoefficients::ChromaticityDerivedNonConstantLuminance:
  218. return "Chromaticity-derived, non-constant luminance"sv;
  219. case MatrixCoefficients::ChromaticityDerivedConstantLuminance:
  220. return "Chromaticity-derived, constant luminance"sv;
  221. case MatrixCoefficients::ICtCp:
  222. return "BT.2100 ICtCp"sv;
  223. }
  224. return "Reserved"sv;
  225. }
  226. constexpr StringView video_full_range_flag_to_string(VideoFullRangeFlag video_full_range_flag)
  227. {
  228. switch (video_full_range_flag) {
  229. case VideoFullRangeFlag::Studio:
  230. return "Studio"sv;
  231. case VideoFullRangeFlag::Full:
  232. return "Full"sv;
  233. case VideoFullRangeFlag::Unspecified: // Not part of the spec, serenity-specific addition for convenience.
  234. return "Unspecified"sv;
  235. }
  236. return "Unknown"sv;
  237. }
  238. }