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)20ColorSpace 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