Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2009 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 META_DATA_H_ |
| 18 | |
| 19 | #define META_DATA_H_ |
| 20 | |
| 21 | #include <sys/types.h> |
| 22 | |
| 23 | #include <stdint.h> |
| 24 | |
| 25 | #include <utils/RefBase.h> |
| 26 | #include <utils/KeyedVector.h> |
| 27 | |
| 28 | namespace android { |
| 29 | |
Andreas Huber | fa8de75 | 2009-10-08 10:07:49 -0700 | [diff] [blame] | 30 | // The following keys map to int32_t data unless indicated otherwise. |
Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 31 | enum { |
Andreas Huber | fa8de75 | 2009-10-08 10:07:49 -0700 | [diff] [blame] | 32 | kKeyMIMEType = 'mime', // cstring |
James Dong | 08adfd2 | 2011-01-16 11:30:13 -0800 | [diff] [blame] | 33 | kKeyWidth = 'widt', // int32_t, image pixel |
| 34 | kKeyHeight = 'heig', // int32_t, image pixel |
| 35 | kKeyDisplayWidth = 'dWid', // int32_t, display/presentation |
| 36 | kKeyDisplayHeight = 'dHgt', // int32_t, display/presentation |
Andreas Huber | 1bb0ffd | 2010-11-22 13:06:35 -0800 | [diff] [blame] | 37 | |
| 38 | // a rectangle, if absent assumed to be (0, 0, width - 1, height - 1) |
| 39 | kKeyCropRect = 'crop', |
| 40 | |
James Dong | 2bff839 | 2010-11-08 20:01:12 -0800 | [diff] [blame] | 41 | kKeyRotation = 'rotA', // int32_t (angle in degrees) |
James Dong | 1244eab | 2010-06-08 11:58:53 -0700 | [diff] [blame] | 42 | kKeyIFramesInterval = 'ifiv', // int32_t |
| 43 | kKeyStride = 'strd', // int32_t |
| 44 | kKeySliceHeight = 'slht', // int32_t |
| 45 | kKeyChannelCount = '#chn', // int32_t |
James Dong | aac193c | 2010-11-10 20:43:53 -0800 | [diff] [blame] | 46 | kKeySampleRate = 'srte', // int32_t (audio sampling rate Hz) |
| 47 | kKeyFrameRate = 'frmR', // int32_t (video frame rate fps) |
Andreas Huber | d49b526dd | 2009-12-11 15:07:25 -0800 | [diff] [blame] | 48 | kKeyBitRate = 'brte', // int32_t (bps) |
Andreas Huber | fa8de75 | 2009-10-08 10:07:49 -0700 | [diff] [blame] | 49 | kKeyESDS = 'esds', // raw data |
| 50 | kKeyAVCC = 'avcc', // raw data |
James Dong | fe84cf1 | 2011-02-11 15:21:45 -0800 | [diff] [blame] | 51 | kKeyD263 = 'd263', // raw data |
Andreas Huber | 388379f | 2010-05-07 10:35:13 -0700 | [diff] [blame] | 52 | kKeyVorbisInfo = 'vinf', // raw data |
| 53 | kKeyVorbisBooks = 'vboo', // raw data |
Andreas Huber | 4f5e602 | 2009-08-19 09:29:34 -0700 | [diff] [blame] | 54 | kKeyWantsNALFragments = 'NALf', |
Andreas Huber | ea6a38c | 2009-11-16 15:43:38 -0800 | [diff] [blame] | 55 | kKeyIsSyncFrame = 'sync', // int32_t (bool) |
| 56 | kKeyIsCodecConfig = 'conf', // int32_t (bool) |
Andreas Huber | fa8de75 | 2009-10-08 10:07:49 -0700 | [diff] [blame] | 57 | kKeyTime = 'time', // int64_t (usecs) |
Andreas Huber | 57648e4 | 2010-08-04 10:14:30 -0700 | [diff] [blame] | 58 | kKeyNTPTime = 'ntpT', // uint64_t (ntp-timestamp) |
Andreas Huber | 6624c9f | 2010-07-20 15:04:28 -0700 | [diff] [blame] | 59 | kKeyTargetTime = 'tarT', // int64_t (usecs) |
James Dong | 4c23815 | 2010-09-01 18:48:35 -0700 | [diff] [blame] | 60 | kKeyDriftTime = 'dftT', // int64_t (usecs) |
James Dong | d015ccf | 2010-09-08 15:07:21 -0700 | [diff] [blame] | 61 | kKeyAnchorTime = 'ancT', // int64_t (usecs) |
Andreas Huber | fa8de75 | 2009-10-08 10:07:49 -0700 | [diff] [blame] | 62 | kKeyDuration = 'dura', // int64_t (usecs) |
Andreas Huber | 4f5e602 | 2009-08-19 09:29:34 -0700 | [diff] [blame] | 63 | kKeyColorFormat = 'colf', |
Andreas Huber | fa8de75 | 2009-10-08 10:07:49 -0700 | [diff] [blame] | 64 | kKeyPlatformPrivate = 'priv', // pointer |
| 65 | kKeyDecoderComponent = 'decC', // cstring |
Andreas Huber | 4f5e602 | 2009-08-19 09:29:34 -0700 | [diff] [blame] | 66 | kKeyBufferID = 'bfID', |
Andreas Huber | da050cf2 | 2009-09-02 14:01:43 -0700 | [diff] [blame] | 67 | kKeyMaxInputSize = 'inpS', |
Andreas Huber | e981c33 | 2009-10-22 13:49:30 -0700 | [diff] [blame] | 68 | kKeyThumbnailTime = 'thbT', // int64_t (usecs) |
Gloria Wang | d577091 | 2010-06-22 13:55:38 -0700 | [diff] [blame] | 69 | kKeyTrackID = 'trID', |
| 70 | kKeyIsDRM = 'idrm', // int32_t (bool) |
Andreas Huber | aee3c63 | 2010-01-11 15:35:19 -0800 | [diff] [blame] | 71 | |
| 72 | kKeyAlbum = 'albu', // cstring |
| 73 | kKeyArtist = 'arti', // cstring |
Marco Nelissen | c5d5ee3 | 2010-02-11 13:31:44 -0800 | [diff] [blame] | 74 | kKeyAlbumArtist = 'aart', // cstring |
Andreas Huber | aee3c63 | 2010-01-11 15:35:19 -0800 | [diff] [blame] | 75 | kKeyComposer = 'comp', // cstring |
| 76 | kKeyGenre = 'genr', // cstring |
| 77 | kKeyTitle = 'titl', // cstring |
| 78 | kKeyYear = 'year', // cstring |
| 79 | kKeyAlbumArt = 'albA', // compressed image data |
| 80 | kKeyAlbumArtMIME = 'alAM', // cstring |
Andreas Huber | 3a3656c | 2010-01-13 10:45:49 -0800 | [diff] [blame] | 81 | kKeyAuthor = 'auth', // cstring |
| 82 | kKeyCDTrackNumber = 'cdtr', // cstring |
Marco Nelissen | 655306f | 2010-02-08 14:50:19 -0800 | [diff] [blame] | 83 | kKeyDiscNumber = 'dnum', // cstring |
Andreas Huber | 3a3656c | 2010-01-13 10:45:49 -0800 | [diff] [blame] | 84 | kKeyDate = 'date', // cstring |
Andreas Huber | c2c9dd3 | 2010-01-19 16:43:53 -0800 | [diff] [blame] | 85 | kKeyWriter = 'writ', // cstring |
Marco Nelissen | ee35aff | 2011-01-06 11:12:17 -0800 | [diff] [blame] | 86 | kKeyCompilation = 'cpil', // cstring |
James Dong | 52d13f0 | 2010-07-02 11:39:06 -0700 | [diff] [blame] | 87 | kKeyTimeScale = 'tmsl', // int32_t |
James Dong | 09936ed | 2010-06-24 19:04:27 -0700 | [diff] [blame] | 88 | |
James Dong | 81c929a | 2010-07-01 15:02:14 -0700 | [diff] [blame] | 89 | // video profile and level |
| 90 | kKeyVideoProfile = 'vprf', // int32_t |
| 91 | kKeyVideoLevel = 'vlev', // int32_t |
| 92 | |
James Dong | 09936ed | 2010-06-24 19:04:27 -0700 | [diff] [blame] | 93 | // Set this key to enable authoring files in 64-bit offset |
| 94 | kKey64BitFileOffset = 'fobt', // int32_t (bool) |
James Dong | 7755cdd | 2010-09-02 10:49:55 -0700 | [diff] [blame] | 95 | kKey2ByteNalLength = '2NAL', // int32_t (bool) |
James Dong | 09936ed | 2010-06-24 19:04:27 -0700 | [diff] [blame] | 96 | |
| 97 | // Identify the file output format for authoring |
| 98 | // Please see <media/mediarecorder.h> for the supported |
| 99 | // file output formats. |
| 100 | kKeyFileType = 'ftyp', // int32_t |
| 101 | |
| 102 | // Track authoring progress status |
| 103 | // kKeyTrackTimeStatus is used to track progress in elapsed time |
James Dong | 09936ed | 2010-06-24 19:04:27 -0700 | [diff] [blame] | 104 | kKeyTrackTimeStatus = 'tktm', // int64_t |
| 105 | |
James Dong | b720819 | 2010-08-02 19:13:40 -0700 | [diff] [blame] | 106 | kKeyNotRealTime = 'ntrt', // bool (int32_t) |
| 107 | |
Andreas Huber | 9fee0b2 | 2010-09-03 14:09:21 -0700 | [diff] [blame] | 108 | // Ogg files can be tagged to be automatically looping... |
| 109 | kKeyAutoLoop = 'autL', // bool (int32_t) |
Andreas Huber | 38ae220 | 2010-09-28 09:16:21 -0700 | [diff] [blame] | 110 | |
| 111 | kKeyValidSamples = 'valD', // int32_t |
Andreas Huber | 1e19416 | 2010-10-06 16:43:57 -0700 | [diff] [blame] | 112 | |
| 113 | kKeyIsUnreadable = 'unre', // bool (int32_t) |
Jamie Gennis | 58a36ad | 2010-10-07 14:08:38 -0700 | [diff] [blame] | 114 | |
| 115 | // An indication that a video buffer has been rendered. |
| 116 | kKeyRendered = 'rend', // bool (int32_t) |
Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 117 | }; |
| 118 | |
| 119 | enum { |
| 120 | kTypeESDS = 'esds', |
| 121 | kTypeAVCC = 'avcc', |
James Dong | fe84cf1 | 2011-02-11 15:21:45 -0800 | [diff] [blame] | 122 | kTypeD263 = 'd263', |
Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 123 | }; |
| 124 | |
| 125 | class MetaData : public RefBase { |
| 126 | public: |
| 127 | MetaData(); |
| 128 | MetaData(const MetaData &from); |
| 129 | |
| 130 | enum Type { |
| 131 | TYPE_NONE = 'none', |
| 132 | TYPE_C_STRING = 'cstr', |
| 133 | TYPE_INT32 = 'in32', |
Andreas Huber | fa8de75 | 2009-10-08 10:07:49 -0700 | [diff] [blame] | 134 | TYPE_INT64 = 'in64', |
Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 135 | TYPE_FLOAT = 'floa', |
| 136 | TYPE_POINTER = 'ptr ', |
Andreas Huber | 1bb0ffd | 2010-11-22 13:06:35 -0800 | [diff] [blame] | 137 | TYPE_RECT = 'rect', |
Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 138 | }; |
| 139 | |
| 140 | void clear(); |
| 141 | bool remove(uint32_t key); |
| 142 | |
| 143 | bool setCString(uint32_t key, const char *value); |
| 144 | bool setInt32(uint32_t key, int32_t value); |
Andreas Huber | fa8de75 | 2009-10-08 10:07:49 -0700 | [diff] [blame] | 145 | bool setInt64(uint32_t key, int64_t value); |
Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 146 | bool setFloat(uint32_t key, float value); |
| 147 | bool setPointer(uint32_t key, void *value); |
| 148 | |
Andreas Huber | 1bb0ffd | 2010-11-22 13:06:35 -0800 | [diff] [blame] | 149 | bool setRect( |
| 150 | uint32_t key, |
| 151 | int32_t left, int32_t top, |
| 152 | int32_t right, int32_t bottom); |
| 153 | |
Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 154 | bool findCString(uint32_t key, const char **value); |
| 155 | bool findInt32(uint32_t key, int32_t *value); |
Andreas Huber | fa8de75 | 2009-10-08 10:07:49 -0700 | [diff] [blame] | 156 | bool findInt64(uint32_t key, int64_t *value); |
Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 157 | bool findFloat(uint32_t key, float *value); |
| 158 | bool findPointer(uint32_t key, void **value); |
| 159 | |
Andreas Huber | 1bb0ffd | 2010-11-22 13:06:35 -0800 | [diff] [blame] | 160 | bool findRect( |
| 161 | uint32_t key, |
| 162 | int32_t *left, int32_t *top, |
| 163 | int32_t *right, int32_t *bottom); |
| 164 | |
Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 165 | bool setData(uint32_t key, uint32_t type, const void *data, size_t size); |
| 166 | |
| 167 | bool findData(uint32_t key, uint32_t *type, |
| 168 | const void **data, size_t *size) const; |
| 169 | |
| 170 | protected: |
| 171 | virtual ~MetaData(); |
| 172 | |
| 173 | private: |
| 174 | struct typed_data { |
| 175 | typed_data(); |
| 176 | ~typed_data(); |
| 177 | |
| 178 | typed_data(const MetaData::typed_data &); |
| 179 | typed_data &operator=(const MetaData::typed_data &); |
| 180 | |
| 181 | void clear(); |
| 182 | void setData(uint32_t type, const void *data, size_t size); |
| 183 | void getData(uint32_t *type, const void **data, size_t *size) const; |
| 184 | |
| 185 | private: |
| 186 | uint32_t mType; |
| 187 | size_t mSize; |
| 188 | |
| 189 | union { |
| 190 | void *ext_data; |
| 191 | float reservoir; |
| 192 | } u; |
| 193 | |
| 194 | bool usesReservoir() const { |
| 195 | return mSize <= sizeof(u.reservoir); |
| 196 | } |
| 197 | |
| 198 | void allocateStorage(size_t size); |
| 199 | void freeStorage(); |
| 200 | |
| 201 | void *storage() { |
| 202 | return usesReservoir() ? &u.reservoir : u.ext_data; |
| 203 | } |
| 204 | |
| 205 | const void *storage() const { |
| 206 | return usesReservoir() ? &u.reservoir : u.ext_data; |
| 207 | } |
| 208 | }; |
| 209 | |
Andreas Huber | 1bb0ffd | 2010-11-22 13:06:35 -0800 | [diff] [blame] | 210 | struct Rect { |
| 211 | int32_t mLeft, mTop, mRight, mBottom; |
| 212 | }; |
| 213 | |
Andreas Huber | e46b7be | 2009-07-14 16:56:47 -0700 | [diff] [blame] | 214 | KeyedVector<uint32_t, typed_data> mItems; |
| 215 | |
| 216 | // MetaData &operator=(const MetaData &); |
| 217 | }; |
| 218 | |
| 219 | } // namespace android |
| 220 | |
| 221 | #endif // META_DATA_H_ |