VideoAPI.h revision 7c357a75991d6b0ae260d9e2b730bcfe7181f899
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 21namespace android { 22 23/** 24 * Structure describing a media image (frame) 25 * Currently only supporting YUV 26 * @deprecated. Use MediaImage2 instead 27 */ 28struct 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 */ 60struct 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 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/** 102 * Aspects of color. 103 */ 104 105// NOTE: this structure is expected to grow in the future if new color aspects are 106// added to codec bitstreams. OMX component should not require a specific nSize 107// though could verify that nSize is at least the size of the structure at the 108// time of implementation. All new fields will be added at the end of the structure 109// ensuring backward compatibility. 110struct ColorAspects { 111 // this is in sync with the range values in graphics.h 112 enum Range : uint32_t { 113 RangeUnspecified, 114 RangeFull, 115 RangeLimited, 116 RangeOther = 0xff, 117 }; 118 119 enum Primaries : uint32_t { 120 PrimariesUnspecified, 121 PrimariesBT709_5, // Rec.ITU-R BT.709-5 or equivalent 122 PrimariesBT470_6M, // Rec.ITU-R BT.470-6 System M or equivalent 123 PrimariesBT601_6_625, // Rec.ITU-R BT.601-6 625 or equivalent 124 PrimariesBT601_6_525, // Rec.ITU-R BT.601-6 525 or equivalent 125 PrimariesGenericFilm, // Generic Film 126 PrimariesBT2020, // Rec.ITU-R BT.2020 or equivalent 127 PrimariesOther = 0xff, 128 }; 129 130 // this partially in sync with the transfer values in graphics.h prior to the transfers 131 // unlikely to be required by Android section 132 enum Transfer : uint32_t { 133 TransferUnspecified, 134 TransferLinear, // Linear transfer characteristics 135 TransferSRGB, // sRGB or equivalent 136 TransferSMPTE170M, // SMPTE 170M or equivalent (e.g. BT.601/709/2020) 137 TransferGamma22, // Assumed display gamma 2.2 138 TransferGamma28, // Assumed display gamma 2.8 139 TransferST2084, // SMPTE ST 2084 for 10/12/14/16 bit systems 140 TransferHLG, // ARIB STD-B67 hybrid-log-gamma 141 142 // transfers unlikely to be required by Android 143 TransferSMPTE240M = 0x40, // SMPTE 240M 144 TransferXvYCC, // IEC 61966-2-4 145 TransferBT1361, // Rec.ITU-R BT.1361 extended gamut 146 TransferST428, // SMPTE ST 428-1 147 TransferOther = 0xff, 148 }; 149 150 enum MatrixCoeffs : uint32_t { 151 MatrixUnspecified, 152 MatrixBT709_5, // Rec.ITU-R BT.709-5 or equivalent 153 MatrixBT470_6M, // KR=0.30, KB=0.11 or equivalent 154 MatrixBT601_6, // Rec.ITU-R BT.601-6 625 or equivalent 155 MatrixSMPTE240M, // SMPTE 240M or equivalent 156 MatrixBT2020, // Rec.ITU-R BT.2020 non-constant luminance 157 MatrixBT2020Constant, // Rec.ITU-R BT.2020 constant luminance 158 MatrixOther = 0xff, 159 }; 160 161 // this is in sync with the standard values in graphics.h 162 enum Standard : uint32_t { 163 StandardUnspecified, 164 StandardBT709, // PrimariesBT709_5 and MatrixBT709_5 165 StandardBT601_625, // PrimariesBT601_6_625 and MatrixBT601_6 166 StandardBT601_625_Unadjusted, // PrimariesBT601_6_625 and KR=0.222, KB=0.071 167 StandardBT601_525, // PrimariesBT601_6_525 and MatrixBT601_6 168 StandardBT601_525_Unadjusted, // PrimariesBT601_6_525 and MatrixSMPTE240M 169 StandardBT2020, // PrimariesBT2020 and MatrixBT2020 170 StandardBT2020Constant, // PrimariesBT2020 and MatrixBT2020Constant 171 StandardBT470M, // PrimariesBT470_6M and MatrixBT470_6M 172 StandardFilm, // PrimariesGenericFilm and KR=0.253, KB=0.068 173 StandardOther = 0xff, 174 }; 175 176 Range mRange; // IN/OUT 177 Primaries mPrimaries; // IN/OUT 178 Transfer mTransfer; // IN/OUT 179 MatrixCoeffs mMatrixCoeffs; // IN/OUT 180}; 181 182#ifdef STRINGIFY_ENUMS 183 184inline static const char *asString(MediaImage::Type i, const char *def = "??") { 185 switch (i) { 186 case MediaImage::MEDIA_IMAGE_TYPE_UNKNOWN: return "Unknown"; 187 case MediaImage::MEDIA_IMAGE_TYPE_YUV: return "YUV"; 188 default: return def; 189 } 190} 191 192inline static const char *asString(MediaImage::PlaneIndex i, const char *def = "??") { 193 switch (i) { 194 case MediaImage::Y: return "Y"; 195 case MediaImage::U: return "U"; 196 case MediaImage::V: return "V"; 197 default: return def; 198 } 199} 200 201inline static const char *asString(MediaImage2::Type i, const char *def = "??") { 202 switch (i) { 203 case MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN: return "Unknown"; 204 case MediaImage2::MEDIA_IMAGE_TYPE_YUV: return "YUV"; 205 case MediaImage2::MEDIA_IMAGE_TYPE_YUVA: return "YUVA"; 206 case MediaImage2::MEDIA_IMAGE_TYPE_RGB: return "RGB"; 207 case MediaImage2::MEDIA_IMAGE_TYPE_RGBA: return "RGBA"; 208 case MediaImage2::MEDIA_IMAGE_TYPE_Y: return "Y"; 209 default: return def; 210 } 211} 212 213inline static char asChar2( 214 MediaImage2::PlaneIndex i, MediaImage2::Type j, char def = '?') { 215 const char *planes = asString(j, NULL); 216 // handle unknown values 217 if (j == MediaImage2::MEDIA_IMAGE_TYPE_UNKNOWN || planes == NULL || i >= strlen(planes)) { 218 return def; 219 } 220 return planes[i]; 221} 222 223inline static const char *asString(ColorAspects::Range i, const char *def = "??") { 224 switch (i) { 225 case ColorAspects::RangeUnspecified: return "Unspecified"; 226 case ColorAspects::RangeFull: return "Full"; 227 case ColorAspects::RangeLimited: return "Limited"; 228 case ColorAspects::RangeOther: return "Other"; 229 default: return def; 230 } 231} 232 233inline static const char *asString(ColorAspects::Primaries i, const char *def = "??") { 234 switch (i) { 235 case ColorAspects::PrimariesUnspecified: return "Unspecified"; 236 case ColorAspects::PrimariesBT709_5: return "BT709_5"; 237 case ColorAspects::PrimariesBT470_6M: return "BT470_6M"; 238 case ColorAspects::PrimariesBT601_6_625: return "BT601_6_625"; 239 case ColorAspects::PrimariesBT601_6_525: return "BT601_6_525"; 240 case ColorAspects::PrimariesGenericFilm: return "GenericFilm"; 241 case ColorAspects::PrimariesBT2020: return "BT2020"; 242 case ColorAspects::PrimariesOther: return "Other"; 243 default: return def; 244 } 245} 246 247inline static const char *asString(ColorAspects::Transfer i, const char *def = "??") { 248 switch (i) { 249 case ColorAspects::TransferUnspecified: return "Unspecified"; 250 case ColorAspects::TransferLinear: return "Linear"; 251 case ColorAspects::TransferSRGB: return "SRGB"; 252 case ColorAspects::TransferSMPTE170M: return "SMPTE170M"; 253 case ColorAspects::TransferGamma22: return "Gamma22"; 254 case ColorAspects::TransferGamma28: return "Gamma28"; 255 case ColorAspects::TransferST2084: return "ST2084"; 256 case ColorAspects::TransferHLG: return "HLG"; 257 case ColorAspects::TransferSMPTE240M: return "SMPTE240M"; 258 case ColorAspects::TransferXvYCC: return "XvYCC"; 259 case ColorAspects::TransferBT1361: return "BT1361"; 260 case ColorAspects::TransferST428: return "ST428"; 261 case ColorAspects::TransferOther: return "Other"; 262 default: return def; 263 } 264} 265 266inline static const char *asString(ColorAspects::MatrixCoeffs i, const char *def = "??") { 267 switch (i) { 268 case ColorAspects::MatrixUnspecified: return "Unspecified"; 269 case ColorAspects::MatrixBT709_5: return "BT709_5"; 270 case ColorAspects::MatrixBT470_6M: return "BT470_6M"; 271 case ColorAspects::MatrixBT601_6: return "BT601_6"; 272 case ColorAspects::MatrixSMPTE240M: return "SMPTE240M"; 273 case ColorAspects::MatrixBT2020: return "BT2020"; 274 case ColorAspects::MatrixBT2020Constant: return "BT2020Constant"; 275 case ColorAspects::MatrixOther: return "Other"; 276 default: return def; 277 } 278} 279 280inline static const char *asString(ColorAspects::Standard i, const char *def = "??") { 281 switch (i) { 282 case ColorAspects::StandardUnspecified: return "Unspecified"; 283 case ColorAspects::StandardBT709: return "BT709"; 284 case ColorAspects::StandardBT601_625: return "BT601_625"; 285 case ColorAspects::StandardBT601_625_Unadjusted: return "BT601_625_Unadjusted"; 286 case ColorAspects::StandardBT601_525: return "BT601_525"; 287 case ColorAspects::StandardBT601_525_Unadjusted: return "BT601_525_Unadjusted"; 288 case ColorAspects::StandardBT2020: return "BT2020"; 289 case ColorAspects::StandardBT2020Constant: return "BT2020Constant"; 290 case ColorAspects::StandardBT470M: return "BT470M"; 291 case ColorAspects::StandardFilm: return "Film"; 292 case ColorAspects::StandardOther: return "Other"; 293 default: return def; 294 } 295} 296 297#endif 298 299} // namespace android 300 301#endif // VIDEO_API_H_ 302