xref: /aosp_15_r20/external/webrtc/modules/video_coding/codecs/h264/h264_color_space.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 // Everything declared/defined in this header is only required when WebRTC is
12 // build with H264 support, please do not move anything out of the
13 // #ifdef unless needed and tested.
14 #ifdef WEBRTC_USE_H264
15 
16 #include "modules/video_coding/codecs/h264/h264_color_space.h"
17 
18 namespace webrtc {
19 
ExtractH264ColorSpace(AVCodecContext * codec)20 ColorSpace ExtractH264ColorSpace(AVCodecContext* codec) {
21   ColorSpace::PrimaryID primaries = ColorSpace::PrimaryID::kUnspecified;
22   switch (codec->color_primaries) {
23     case AVCOL_PRI_BT709:
24       primaries = ColorSpace::PrimaryID::kBT709;
25       break;
26     case AVCOL_PRI_BT470M:
27       primaries = ColorSpace::PrimaryID::kBT470M;
28       break;
29     case AVCOL_PRI_BT470BG:
30       primaries = ColorSpace::PrimaryID::kBT470BG;
31       break;
32     case AVCOL_PRI_SMPTE170M:
33       primaries = ColorSpace::PrimaryID::kSMPTE170M;
34       break;
35     case AVCOL_PRI_SMPTE240M:
36       primaries = ColorSpace::PrimaryID::kSMPTE240M;
37       break;
38     case AVCOL_PRI_FILM:
39       primaries = ColorSpace::PrimaryID::kFILM;
40       break;
41     case AVCOL_PRI_BT2020:
42       primaries = ColorSpace::PrimaryID::kBT2020;
43       break;
44     case AVCOL_PRI_SMPTE428:
45       primaries = ColorSpace::PrimaryID::kSMPTEST428;
46       break;
47     case AVCOL_PRI_SMPTE431:
48       primaries = ColorSpace::PrimaryID::kSMPTEST431;
49       break;
50     case AVCOL_PRI_SMPTE432:
51       primaries = ColorSpace::PrimaryID::kSMPTEST432;
52       break;
53     case AVCOL_PRI_JEDEC_P22:
54       primaries = ColorSpace::PrimaryID::kJEDECP22;
55       break;
56     case AVCOL_PRI_RESERVED0:
57     case AVCOL_PRI_UNSPECIFIED:
58     case AVCOL_PRI_RESERVED:
59     default:
60       break;
61   }
62 
63   ColorSpace::TransferID transfer = ColorSpace::TransferID::kUnspecified;
64   switch (codec->color_trc) {
65     case AVCOL_TRC_BT709:
66       transfer = ColorSpace::TransferID::kBT709;
67       break;
68     case AVCOL_TRC_GAMMA22:
69       transfer = ColorSpace::TransferID::kGAMMA22;
70       break;
71     case AVCOL_TRC_GAMMA28:
72       transfer = ColorSpace::TransferID::kGAMMA28;
73       break;
74     case AVCOL_TRC_SMPTE170M:
75       transfer = ColorSpace::TransferID::kSMPTE170M;
76       break;
77     case AVCOL_TRC_SMPTE240M:
78       transfer = ColorSpace::TransferID::kSMPTE240M;
79       break;
80     case AVCOL_TRC_LINEAR:
81       transfer = ColorSpace::TransferID::kLINEAR;
82       break;
83     case AVCOL_TRC_LOG:
84       transfer = ColorSpace::TransferID::kLOG;
85       break;
86     case AVCOL_TRC_LOG_SQRT:
87       transfer = ColorSpace::TransferID::kLOG_SQRT;
88       break;
89     case AVCOL_TRC_IEC61966_2_4:
90       transfer = ColorSpace::TransferID::kIEC61966_2_4;
91       break;
92     case AVCOL_TRC_BT1361_ECG:
93       transfer = ColorSpace::TransferID::kBT1361_ECG;
94       break;
95     case AVCOL_TRC_IEC61966_2_1:
96       transfer = ColorSpace::TransferID::kIEC61966_2_1;
97       break;
98     case AVCOL_TRC_BT2020_10:
99       transfer = ColorSpace::TransferID::kBT2020_10;
100       break;
101     case AVCOL_TRC_BT2020_12:
102       transfer = ColorSpace::TransferID::kBT2020_12;
103       break;
104     case AVCOL_TRC_SMPTE2084:
105       transfer = ColorSpace::TransferID::kSMPTEST2084;
106       break;
107     case AVCOL_TRC_SMPTE428:
108       transfer = ColorSpace::TransferID::kSMPTEST428;
109       break;
110     case AVCOL_TRC_ARIB_STD_B67:
111       transfer = ColorSpace::TransferID::kARIB_STD_B67;
112       break;
113     case AVCOL_TRC_RESERVED0:
114     case AVCOL_TRC_UNSPECIFIED:
115     case AVCOL_TRC_RESERVED:
116     default:
117       break;
118   }
119 
120   ColorSpace::MatrixID matrix = ColorSpace::MatrixID::kUnspecified;
121   switch (codec->colorspace) {
122     case AVCOL_SPC_RGB:
123       matrix = ColorSpace::MatrixID::kRGB;
124       break;
125     case AVCOL_SPC_BT709:
126       matrix = ColorSpace::MatrixID::kBT709;
127       break;
128     case AVCOL_SPC_FCC:
129       matrix = ColorSpace::MatrixID::kFCC;
130       break;
131     case AVCOL_SPC_BT470BG:
132       matrix = ColorSpace::MatrixID::kBT470BG;
133       break;
134     case AVCOL_SPC_SMPTE170M:
135       matrix = ColorSpace::MatrixID::kSMPTE170M;
136       break;
137     case AVCOL_SPC_SMPTE240M:
138       matrix = ColorSpace::MatrixID::kSMPTE240M;
139       break;
140     case AVCOL_SPC_YCGCO:
141       matrix = ColorSpace::MatrixID::kYCOCG;
142       break;
143     case AVCOL_SPC_BT2020_NCL:
144       matrix = ColorSpace::MatrixID::kBT2020_NCL;
145       break;
146     case AVCOL_SPC_BT2020_CL:
147       matrix = ColorSpace::MatrixID::kBT2020_CL;
148       break;
149     case AVCOL_SPC_SMPTE2085:
150       matrix = ColorSpace::MatrixID::kSMPTE2085;
151       break;
152     case AVCOL_SPC_CHROMA_DERIVED_NCL:
153     case AVCOL_SPC_CHROMA_DERIVED_CL:
154     case AVCOL_SPC_ICTCP:
155     case AVCOL_SPC_UNSPECIFIED:
156     case AVCOL_SPC_RESERVED:
157     default:
158       break;
159   }
160 
161   ColorSpace::RangeID range = ColorSpace::RangeID::kInvalid;
162   switch (codec->color_range) {
163     case AVCOL_RANGE_MPEG:
164       range = ColorSpace::RangeID::kLimited;
165       break;
166     case AVCOL_RANGE_JPEG:
167       range = ColorSpace::RangeID::kFull;
168       break;
169     case AVCOL_RANGE_UNSPECIFIED:
170     default:
171       break;
172   }
173   return ColorSpace(primaries, transfer, matrix, range);
174 }
175 
176 }  // namespace webrtc
177 
178 #endif  // WEBRTC_USE_H264
179