1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef VIDEO_API_H_ 18 19 #define VIDEO_API_H_ 20 21 namespace android { 22 23 /** 24 * Structure describing a media image (frame) 25 * Currently only supporting YUV 26 * @deprecated. Use MediaImage2 instead 27 */ 28 struct MediaImage { 29 enum Type { 30 MEDIA_IMAGE_TYPE_UNKNOWN = 0, 31 MEDIA_IMAGE_TYPE_YUV, 32 }; 33 34 enum PlaneIndex { 35 Y = 0, 36 U, 37 V, 38 MAX_NUM_PLANES 39 }; 40 41 Type mType; 42 uint32_t mNumPlanes; // number of planes 43 uint32_t mWidth; // width of largest plane (unpadded, as in nFrameWidth) 44 uint32_t mHeight; // height of largest plane (unpadded, as in nFrameHeight) 45 uint32_t mBitDepth; // useable bit depth 46 struct PlaneInfo { 47 uint32_t mOffset; // offset of first pixel of the plane in bytes 48 // from buffer offset 49 uint32_t mColInc; // column increment in bytes 50 uint32_t mRowInc; // row increment in bytes 51 uint32_t mHorizSubsampling; // subsampling compared to the largest plane 52 uint32_t mVertSubsampling; // subsampling compared to the largest plane 53 }; 54 PlaneInfo mPlane[MAX_NUM_PLANES]; 55 }; 56 57 /** 58 * Structure describing a media image (frame) 59 */ 60 struct __attribute__ ((__packed__)) MediaImage2 { 61 enum Type : uint32_t { 62 MEDIA_IMAGE_TYPE_UNKNOWN = 0, 63 MEDIA_IMAGE_TYPE_YUV, 64 MEDIA_IMAGE_TYPE_YUVA, 65 MEDIA_IMAGE_TYPE_RGB, 66 MEDIA_IMAGE_TYPE_RGBA, 67 MEDIA_IMAGE_TYPE_Y, 68 }; 69 70 enum PlaneIndex : uint32_t { 71 Y = 0, 72 U = 1, 73 V = 2, 74 R = 0, 75 G = 1, 76 B = 2, 77 A = 3, 78 MAX_NUM_PLANES = 4, 79 }; 80 81 Type mType; 82 uint32_t mNumPlanes; // number of planes 83 uint32_t mWidth; // width of largest plane (unpadded, as in nFrameWidth) 84 uint32_t mHeight; // height of largest plane (unpadded, as in nFrameHeight) 85 uint32_t mBitDepth; // useable bit depth (always MSB) 86 uint32_t mBitDepthAllocated; // bits per component (must be 8 or 16) 87 88 struct __attribute__ ((__packed__)) PlaneInfo { 89 uint32_t mOffset; // offset of first pixel of the plane in bytes 90 // from buffer offset 91 int32_t mColInc; // column increment in bytes 92 int32_t mRowInc; // row increment in bytes 93 uint32_t mHorizSubsampling; // subsampling compared to the largest plane 94 uint32_t mVertSubsampling; // subsampling compared to the largest plane 95 }; 96 PlaneInfo mPlane[MAX_NUM_PLANES]; 97 98 void initFromV1(const MediaImage&); // for internal use only 99 }; 100 101 static_assert(sizeof(MediaImage2::PlaneInfo) == 20, "wrong struct size"); 102 static_assert(sizeof(MediaImage2) == 104, "wrong struct size"); 103 104 /** 105 * Aspects of color. 106 */ 107 108 // NOTE: this structure is expected to grow in the future if new color aspects are 109 // added to codec bitstreams. OMX component should not require a specific nSize 110 // though could verify that nSize is at least the size of the structure at the 111 // time of implementation. All new fields will be added at the end of the structure 112 // ensuring backward compatibility. 113 struct __attribute__ ((__packed__, aligned(alignof(uint32_t)))) ColorAspects { 114 // this is in sync with the range values in graphics.h 115 enum Range : uint32_t { 116 RangeUnspecified, 117 RangeFull, 118 RangeLimited, 119 RangeOther = 0xff, 120 }; 121 122 enum Primaries : uint32_t { 123 PrimariesUnspecified, 124 PrimariesBT709_5, // Rec.ITU-R BT.709-5 or equivalent 125 PrimariesBT470_6M, // Rec.ITU-R BT.470-6 System M or equivalent 126 PrimariesBT601_6_625, // Rec.ITU-R BT.601-6 625 or equivalent 127 PrimariesBT601_6_525, // Rec.ITU-R BT.601-6 525 or equivalent 128 PrimariesGenericFilm, // Generic Film 129 PrimariesBT2020, // Rec.ITU-R BT.2020 or equivalent 130 PrimariesOther = 0xff, 131 }; 132 133 // this partially in sync with the transfer values in graphics.h prior to the transfers 134 // unlikely to be required by Android section 135 enum Transfer : uint32_t { 136 TransferUnspecified, 137 TransferLinear, // Linear transfer characteristics 138 TransferSRGB, // sRGB or equivalent 139 TransferSMPTE170M, // SMPTE 170M or equivalent (e.g. BT.601/709/2020) 140 TransferGamma22, // Assumed display gamma 2.2 141 TransferGamma28, // Assumed display gamma 2.8 142 TransferST2084, // SMPTE ST 2084 for 10/12/14/16 bit systems 143 TransferHLG, // ARIB STD-B67 hybrid-log-gamma 144 145 // transfers unlikely to be required by Android 146 TransferSMPTE240M = 0x40, // SMPTE 240M 147 TransferXvYCC, // IEC 61966-2-4 148 TransferBT1361, // Rec.ITU-R BT.1361 extended gamut 149 TransferST428, // SMPTE ST 428-1 150 TransferOther = 0xff, 151 }; 152 153 enum MatrixCoeffs : uint32_t { 154 MatrixUnspecified, 155 MatrixBT709_5, // Rec.ITU-R BT.709-5 or equivalent 156 MatrixBT470_6M, // KR=0.30, KB=0.11 or equivalent 157 MatrixBT601_6, // Rec.ITU-R BT.601-6 625 or equivalent 158 MatrixSMPTE240M, // SMPTE 240M or equivalent 159 MatrixBT2020, // Rec.ITU-R BT.2020 non-constant luminance 160 MatrixBT2020Constant, // Rec.ITU-R BT.2020 constant luminance 161 MatrixOther = 0xff, 162 }; 163 164 // this is in sync with the standard values in graphics.h 165 enum Standard : uint32_t { 166 StandardUnspecified, 167 StandardBT709, // PrimariesBT709_5 and MatrixBT709_5 168 StandardBT601_625, // PrimariesBT601_6_625 and MatrixBT601_6 169 StandardBT601_625_Unadjusted, // PrimariesBT601_6_625 and KR=0.222, KB=0.071 170 StandardBT601_525, // PrimariesBT601_6_525 and MatrixBT601_6 171 StandardBT601_525_Unadjusted, // PrimariesBT601_6_525 and MatrixSMPTE240M 172 StandardBT2020, // PrimariesBT2020 and MatrixBT2020 173 StandardBT2020Constant, // PrimariesBT2020 and MatrixBT2020Constant 174 StandardBT470M, // PrimariesBT470_6M and MatrixBT470_6M 175 StandardFilm, // PrimariesGenericFilm and KR=0.253, KB=0.068 176 StandardOther = 0xff, 177 }; 178 179 Range mRange; // IN/OUT 180 Primaries mPrimaries; // IN/OUT 181 Transfer mTransfer; // IN/OUT 182 MatrixCoeffs mMatrixCoeffs; // IN/OUT 183 }; 184 185 static_assert(sizeof(ColorAspects) == 16, "wrong struct size"); 186 187 /** 188 * HDR Metadata. 189 */ 190 191 // HDR Static Metadata Descriptor as defined by CTA-861-3. 192 struct __attribute__ ((__packed__)) HDRStaticInfo { 193 // Static_Metadata_Descriptor_ID 194 enum ID : uint8_t { 195 kType1 = 0, // Static Metadata Type 1 196 } mID; 197 198 struct __attribute__ ((__packed__)) Primaries1 { 199 // values are in units of 0.00002 200 uint16_t x; 201 uint16_t y; 202 }; 203 204 // Static Metadata Descriptor Type 1 205 struct __attribute__ ((__packed__)) Type1 { 206 Primaries1 mR; // display primary 0 207 Primaries1 mG; // display primary 1 208 Primaries1 mB; // display primary 2 209 Primaries1 mW; // white point 210 uint16_t mMaxDisplayLuminance; // in cd/m^2 211 uint16_t mMinDisplayLuminance; // in 0.0001 cd/m^2 212 uint16_t mMaxContentLightLevel; // in cd/m^2 213 uint16_t mMaxFrameAverageLightLevel; // in cd/m^2 214 }; 215 216 union { 217 Type1 sType1; 218 }; 219 }; 220 221 static_assert(sizeof(HDRStaticInfo::Primaries1) == 4, "wrong struct size"); 222 static_assert(sizeof(HDRStaticInfo::Type1) == 24, "wrong struct size"); 223 static_assert(sizeof(HDRStaticInfo) == 25, "wrong struct size"); 224 225 #ifdef STRINGIFY_ENUMS 226 227 inline static const char *asString(MediaImage::Type i, const char *def = "??") { 228 switch (i) { 229 case MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN: return "Unknown"; 230 case MediaImage::MEDIA_IMAGE_TYPE_YUV: return "YUV"; 231 default: return def; 232 } 233 } 234 235 inline static const char *asString(MediaImage::PlaneIndex i, const char *def = "??") { 236 switch (i) { 237 case MediaImage::Y: return "Y"; 238 case MediaImage::U: return "U"; 239 case MediaImage::V: return "V"; 240 default: return def; 241 } 242 } 243 244 inline static const char *asString(MediaImage2::Type i, const char *def = "??") { 245 switch (i) { 246 case MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN: return "Unknown"; 247 case MediaImage2::MEDIA_IMAGE_TYPE_YUV: return "YUV"; 248 case MediaImage2::MEDIA_IMAGE_TYPE_YUVA: return "YUVA"; 249 case MediaImage2::MEDIA_IMAGE_TYPE_RGB: return "RGB"; 250 case MediaImage2::MEDIA_IMAGE_TYPE_RGBA: return "RGBA"; 251 case MediaImage2::MEDIA_IMAGE_TYPE_Y: return "Y"; 252 default: return def; 253 } 254 } 255 256 inline static char asChar2( 257 MediaImage2::PlaneIndex i, MediaImage2::Type j, char def = '?') { 258 const char *planes = asString(j, NULL); 259 // handle unknown values 260 if (j == MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN || planes == NULL || i >= strlen(planes)) { 261 return def; 262 } 263 return planes[i]; 264 } 265 266 inline static const char *asString(ColorAspects::Range i, const char *def = "??") { 267 switch (i) { 268 case ColorAspects::RangeUnspecified: return "Unspecified"; 269 case ColorAspects::RangeFull: return "Full"; 270 case ColorAspects::RangeLimited: return "Limited"; 271 case ColorAspects::RangeOther: return "Other"; 272 default: return def; 273 } 274 } 275 276 inline static const char *asString(ColorAspects::Primaries i, const char *def = "??") { 277 switch (i) { 278 case ColorAspects::PrimariesUnspecified: return "Unspecified"; 279 case ColorAspects::PrimariesBT709_5: return "BT709_5"; 280 case ColorAspects::PrimariesBT470_6M: return "BT470_6M"; 281 case ColorAspects::PrimariesBT601_6_625: return "BT601_6_625"; 282 case ColorAspects::PrimariesBT601_6_525: return "BT601_6_525"; 283 case ColorAspects::PrimariesGenericFilm: return "GenericFilm"; 284 case ColorAspects::PrimariesBT2020: return "BT2020"; 285 case ColorAspects::PrimariesOther: return "Other"; 286 default: return def; 287 } 288 } 289 290 inline static const char *asString(ColorAspects::Transfer i, const char *def = "??") { 291 switch (i) { 292 case ColorAspects::TransferUnspecified: return "Unspecified"; 293 case ColorAspects::TransferLinear: return "Linear"; 294 case ColorAspects::TransferSRGB: return "SRGB"; 295 case ColorAspects::TransferSMPTE170M: return "SMPTE170M"; 296 case ColorAspects::TransferGamma22: return "Gamma22"; 297 case ColorAspects::TransferGamma28: return "Gamma28"; 298 case ColorAspects::TransferST2084: return "ST2084"; 299 case ColorAspects::TransferHLG: return "HLG"; 300 case ColorAspects::TransferSMPTE240M: return "SMPTE240M"; 301 case ColorAspects::TransferXvYCC: return "XvYCC"; 302 case ColorAspects::TransferBT1361: return "BT1361"; 303 case ColorAspects::TransferST428: return "ST428"; 304 case ColorAspects::TransferOther: return "Other"; 305 default: return def; 306 } 307 } 308 309 inline static const char *asString(ColorAspects::MatrixCoeffs i, const char *def = "??") { 310 switch (i) { 311 case ColorAspects::MatrixUnspecified: return "Unspecified"; 312 case ColorAspects::MatrixBT709_5: return "BT709_5"; 313 case ColorAspects::MatrixBT470_6M: return "BT470_6M"; 314 case ColorAspects::MatrixBT601_6: return "BT601_6"; 315 case ColorAspects::MatrixSMPTE240M: return "SMPTE240M"; 316 case ColorAspects::MatrixBT2020: return "BT2020"; 317 case ColorAspects::MatrixBT2020Constant: return "BT2020Constant"; 318 case ColorAspects::MatrixOther: return "Other"; 319 default: return def; 320 } 321 } 322 323 inline static const char *asString(ColorAspects::Standard i, const char *def = "??") { 324 switch (i) { 325 case ColorAspects::StandardUnspecified: return "Unspecified"; 326 case ColorAspects::StandardBT709: return "BT709"; 327 case ColorAspects::StandardBT601_625: return "BT601_625"; 328 case ColorAspects::StandardBT601_625_Unadjusted: return "BT601_625_Unadjusted"; 329 case ColorAspects::StandardBT601_525: return "BT601_525"; 330 case ColorAspects::StandardBT601_525_Unadjusted: return "BT601_525_Unadjusted"; 331 case ColorAspects::StandardBT2020: return "BT2020"; 332 case ColorAspects::StandardBT2020Constant: return "BT2020Constant"; 333 case ColorAspects::StandardBT470M: return "BT470M"; 334 case ColorAspects::StandardFilm: return "Film"; 335 case ColorAspects::StandardOther: return "Other"; 336 default: return def; 337 } 338 } 339 340 #endif 341 342 } // namespace android 343 344 #endif // VIDEO_API_H_ 345