120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#ifndef META_DATA_H_ 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define META_DATA_H_ 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <sys/types.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <stdint.h> 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/RefBase.h> 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/KeyedVector.h> 27feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen#include <utils/String8.h> 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber// The following keys map to int32_t data unless indicated otherwise. 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum { 3348c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber kKeyMIMEType = 'mime', // cstring 34b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong kKeyWidth = 'widt', // int32_t, image pixel 35b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong kKeyHeight = 'heig', // int32_t, image pixel 36b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong kKeyDisplayWidth = 'dWid', // int32_t, display/presentation 37b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong kKeyDisplayHeight = 'dHgt', // int32_t, display/presentation 38f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 39f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber // a rectangle, if absent assumed to be (0, 0, width - 1, height - 1) 40f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber kKeyCropRect = 'crop', 41f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 4230db2709395c73fb3b4ee334119ceba68c95ab13James Dong kKeyRotation = 'rotA', // int32_t (angle in degrees) 43ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong kKeyIFramesInterval = 'ifiv', // int32_t 44ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong kKeyStride = 'strd', // int32_t 45ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong kKeySliceHeight = 'slht', // int32_t 46ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong kKeyChannelCount = '#chn', // int32_t 47786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi kKeyChannelMask = 'chnm', // int32_t 48393410a441b6d06daf286ed496470e9d6b2b6ca8James Dong kKeySampleRate = 'srte', // int32_t (audio sampling rate Hz) 49393410a441b6d06daf286ed496470e9d6b2b6ca8James Dong kKeyFrameRate = 'frmR', // int32_t (video frame rate fps) 50b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber kKeyBitRate = 'brte', // int32_t (bps) 5148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber kKeyESDS = 'esds', // raw data 52aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke kKeyAACProfile = 'aacp', // int32_t 5348c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber kKeyAVCC = 'avcc', // raw data 54244ba87d20aeb29c9cad727820fa1e803ec3643cJames Dong kKeyD263 = 'd263', // raw data 55ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber kKeyVorbisInfo = 'vinf', // raw data 56ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber kKeyVorbisBooks = 'vboo', // raw data 57dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber kKeyWantsNALFragments = 'NALf', 5830ab66297501757d745b9ae10da61adcd891f497Andreas Huber kKeyIsSyncFrame = 'sync', // int32_t (bool) 5930ab66297501757d745b9ae10da61adcd891f497Andreas Huber kKeyIsCodecConfig = 'conf', // int32_t (bool) 6048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber kKeyTime = 'time', // int64_t (usecs) 61965e4239ca1cf6c824c1f8ce23116f9ba8cf6ebdJames Dong kKeyDecodingTime = 'decT', // int64_t (decoding timestamp in usecs) 6239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber kKeyNTPTime = 'ntpT', // uint64_t (ntp-timestamp) 63abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber kKeyTargetTime = 'tarT', // int64_t (usecs) 64d707fcb3e29707ca4a5935c294ef0b38eb5aba5fJames Dong kKeyDriftTime = 'dftT', // int64_t (usecs) 653c3763d2ee1cd1fba7fe522fbaf0faca315d8c2aJames Dong kKeyAnchorTime = 'ancT', // int64_t (usecs) 6648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber kKeyDuration = 'dura', // int64_t (usecs) 67dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber kKeyColorFormat = 'colf', 6848c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber kKeyPlatformPrivate = 'priv', // pointer 6948c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber kKeyDecoderComponent = 'decC', // cstring 70dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber kKeyBufferID = 'bfID', 71e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber kKeyMaxInputSize = 'inpS', 727e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber kKeyThumbnailTime = 'thbT', // int64_t (usecs) 73dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang kKeyTrackID = 'trID', 74dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang kKeyIsDRM = 'idrm', // int32_t (bool) 75b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen kKeyEncoderDelay = 'encd', // int32_t (frames) 76b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen kKeyEncoderPadding = 'encp', // int32_t (frames) 77fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 78fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber kKeyAlbum = 'albu', // cstring 79fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber kKeyArtist = 'arti', // cstring 8066ac4df65516ebfd0e500bfca75dc4b5ef8d674eMarco Nelissen kKeyAlbumArtist = 'aart', // cstring 81fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber kKeyComposer = 'comp', // cstring 82fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber kKeyGenre = 'genr', // cstring 83fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber kKeyTitle = 'titl', // cstring 84fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber kKeyYear = 'year', // cstring 85fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber kKeyAlbumArt = 'albA', // compressed image data 86fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber kKeyAlbumArtMIME = 'alAM', // cstring 87bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber kKeyAuthor = 'auth', // cstring 88bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber kKeyCDTrackNumber = 'cdtr', // cstring 896c8a9a4132337a3419a72a735f0b40df0b82061fMarco Nelissen kKeyDiscNumber = 'dnum', // cstring 90bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber kKeyDate = 'date', // cstring 9172b8c5ae6a5f97a4fcfc6d23d33159d6ae50179cAndreas Huber kKeyWriter = 'writ', // cstring 9211f8109ad8646d3acd9a0987613229cde59d52c1Marco Nelissen kKeyCompilation = 'cpil', // cstring 934948818cb91176df74c972ac27b2f392b5d148bcJames Dong kKeyLocation = 'loc ', // cstring 948f5f2fcee5c12d08df71d17017410c50951fc2e3James Dong kKeyTimeScale = 'tmsl', // int32_t 9593d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong 96145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong // video profile and level 97145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong kKeyVideoProfile = 'vprf', // int32_t 98145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong kKeyVideoLevel = 'vlev', // int32_t 99145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong 10093d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong // Set this key to enable authoring files in 64-bit offset 10193d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong kKey64BitFileOffset = 'fobt', // int32_t (bool) 102b4d5320bda29cd9694461c9b61d0211f801ff0afJames Dong kKey2ByteNalLength = '2NAL', // int32_t (bool) 10393d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong 10493d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong // Identify the file output format for authoring 10593d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong // Please see <media/mediarecorder.h> for the supported 10693d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong // file output formats. 10793d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong kKeyFileType = 'ftyp', // int32_t 10893d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong 10993d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong // Track authoring progress status 11093d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong // kKeyTrackTimeStatus is used to track progress in elapsed time 11193d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong kKeyTrackTimeStatus = 'tktm', // int64_t 11293d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong 113e259531ce59ab1f31de5a23124b22536f6a5a767James Dong kKeyNotRealTime = 'ntrt', // bool (int32_t) 114e259531ce59ab1f31de5a23124b22536f6a5a767James Dong 1158ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber // Ogg files can be tagged to be automatically looping... 1168ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber kKeyAutoLoop = 'autL', // bool (int32_t) 117db6222212528637d8f2afa7f49fc3c8c915bafbeAndreas Huber 118db6222212528637d8f2afa7f49fc3c8c915bafbeAndreas Huber kKeyValidSamples = 'valD', // int32_t 1192b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber 1202b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber kKeyIsUnreadable = 'unre', // bool (int32_t) 1216a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis 1226a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis // An indication that a video buffer has been rendered. 1236a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis kKeyRendered = 'rend', // bool (int32_t) 1247a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang 1257a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang // The language code for this media 1267a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang kKeyMediaLanguage = 'lang', // cstring 1273b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang 1283b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang // To store the timed text format data 1293b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang kKeyTextFormatData = 'text', // raw data 1300bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber 1310bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber kKeyRequiresSecureBuffers = 'secu', // bool (int32_t) 132ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber 133ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber kKeyIsADTS = 'adts', // bool (int32_t) 1345892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber 1355892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // If a MediaBuffer's data represents (at least partially) encrypted 1365892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // data, the following fields aid in decryption. 1375892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // The data can be thought of as pairs of plain and encrypted data 1385892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // fragments, i.e. plain and encrypted data alternate. 1395892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // The first fragment is by convention plain data (if that's not the 1405892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // case, simply specify plain fragment size of 0). 1415892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // kKeyEncryptedSizes and kKeyPlainSizes each map to an array of 1425892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // size_t values. The sum total of all size_t values of both arrays 1435892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // must equal the amount of data (i.e. MediaBuffer's range_length()). 1445892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // If both arrays are present, they must be of the same size. 1455892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // If only encrypted sizes are present it is assumed that all 1465892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // plain sizes are 0, i.e. all fragments are encrypted. 1475892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // To programmatically set these array, use the MetaData::setData API, i.e. 1485892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // const size_t encSizes[]; 1495892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // meta->setData( 1505892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // kKeyEncryptedSizes, 0 /* type */, encSizes, sizeof(encSizes)); 1515892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber // A plain sizes array by itself makes no sense. 1525892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber kKeyEncryptedSizes = 'encr', // size_t[] 1535892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber kKeyPlainSizes = 'plai', // size_t[] 1545892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber kKeyCryptoKey = 'cryK', // uint8_t[16] 1555892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber kKeyCryptoIV = 'cryI', // uint8_t[16] 156f69e53033f23f9f70fcdb28a3c2e650de0147459Andreas Huber kKeyCryptoMode = 'cryM', // int32_t 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum { 16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kTypeESDS = 'esds', 16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber kTypeAVCC = 'avcc', 162244ba87d20aeb29c9cad727820fa1e803ec3643cJames Dong kTypeD263 = 'd263', 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData : public RefBase { 16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic: 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MetaData(); 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MetaData(const MetaData &from); 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber enum Type { 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber TYPE_NONE = 'none', 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber TYPE_C_STRING = 'cstr', 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber TYPE_INT32 = 'in32', 17448c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber TYPE_INT64 = 'in64', 17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber TYPE_FLOAT = 'floa', 17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber TYPE_POINTER = 'ptr ', 177f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber TYPE_RECT = 'rect', 17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber }; 17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void clear(); 18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool remove(uint32_t key); 18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool setCString(uint32_t key, const char *value); 18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool setInt32(uint32_t key, int32_t value); 18548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber bool setInt64(uint32_t key, int64_t value); 18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool setFloat(uint32_t key, float value); 18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool setPointer(uint32_t key, void *value); 18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 189f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber bool setRect( 190f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber uint32_t key, 191f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t left, int32_t top, 192f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t right, int32_t bottom); 193f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 1942cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong bool findCString(uint32_t key, const char **value); 1952cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong bool findInt32(uint32_t key, int32_t *value); 1962cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong bool findInt64(uint32_t key, int64_t *value); 1972cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong bool findFloat(uint32_t key, float *value); 1982cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong bool findPointer(uint32_t key, void **value); 19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 200f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber bool findRect( 201f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber uint32_t key, 202f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t *left, int32_t *top, 2032cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong int32_t *right, int32_t *bottom); 204f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool setData(uint32_t key, uint32_t type, const void *data, size_t size); 20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool findData(uint32_t key, uint32_t *type, 20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void **data, size_t *size) const; 20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 210feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen void dumpToLog() const; 211feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprotected: 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber virtual ~MetaData(); 21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate: 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber struct typed_data { 21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typed_data(); 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ~typed_data(); 21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typed_data(const MetaData::typed_data &); 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typed_data &operator=(const MetaData::typed_data &); 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void clear(); 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void setData(uint32_t type, const void *data, size_t size); 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void getData(uint32_t *type, const void **data, size_t *size) const; 226feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen String8 asString() const; 22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber private: 22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t mType; 23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t mSize; 23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber union { 23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *ext_data; 23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber float reservoir; 23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } u; 23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool usesReservoir() const { 23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return mSize <= sizeof(u.reservoir); 23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void allocateStorage(size_t size); 24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void freeStorage(); 24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber void *storage() { 24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return usesReservoir() ? &u.reservoir : u.ext_data; 24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *storage() const { 24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return usesReservoir() ? &u.reservoir : u.ext_data; 25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber }; 25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 253f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber struct Rect { 254f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t mLeft, mTop, mRight, mBottom; 255f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber }; 256f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber KeyedVector<uint32_t, typed_data> mItems; 25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber // MetaData &operator=(const MetaData &); 26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}; 26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif // META_DATA_H_ 265