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)
1140dff606f42292b8a31b9eee842877f9875279dabJames Dong    kKeyNumBuffers        = 'nbbf',  // int32_t
115e259531ce59ab1f31de5a23124b22536f6a5a767James Dong
1168ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    // Ogg files can be tagged to be automatically looping...
1178ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    kKeyAutoLoop          = 'autL',  // bool (int32_t)
118db6222212528637d8f2afa7f49fc3c8c915bafbeAndreas Huber
119db6222212528637d8f2afa7f49fc3c8c915bafbeAndreas Huber    kKeyValidSamples      = 'valD',  // int32_t
1202b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber
1212b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber    kKeyIsUnreadable      = 'unre',  // bool (int32_t)
1226a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1236a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    // An indication that a video buffer has been rendered.
1246a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    kKeyRendered          = 'rend',  // bool (int32_t)
1257a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1267a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    // The language code for this media
1277a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    kKeyMediaLanguage     = 'lang',  // cstring
1283b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang
1293b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang    // To store the timed text format data
1303b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang    kKeyTextFormatData    = 'text',  // raw data
1310bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber
1320bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber    kKeyRequiresSecureBuffers = 'secu',  // bool (int32_t)
133ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
134ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    kKeyIsADTS            = 'adts',  // bool (int32_t)
1355892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber
1365892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If a MediaBuffer's data represents (at least partially) encrypted
1375892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // data, the following fields aid in decryption.
1385892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // The data can be thought of as pairs of plain and encrypted data
1395892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // fragments, i.e. plain and encrypted data alternate.
1405892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // The first fragment is by convention plain data (if that's not the
1415892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // case, simply specify plain fragment size of 0).
1425892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // kKeyEncryptedSizes and kKeyPlainSizes each map to an array of
1435892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // size_t values. The sum total of all size_t values of both arrays
1445892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // must equal the amount of data (i.e. MediaBuffer's range_length()).
1455892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If both arrays are present, they must be of the same size.
1465892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If only encrypted sizes are present it is assumed that all
1475892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // plain sizes are 0, i.e. all fragments are encrypted.
1485892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // To programmatically set these array, use the MetaData::setData API, i.e.
1495892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // const size_t encSizes[];
1505892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // meta->setData(
1515892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    //  kKeyEncryptedSizes, 0 /* type */, encSizes, sizeof(encSizes));
1525892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // A plain sizes array by itself makes no sense.
1535892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyEncryptedSizes    = 'encr',  // size_t[]
1545892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyPlainSizes        = 'plai',  // size_t[]
1555892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyCryptoKey         = 'cryK',  // uint8_t[16]
1565892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyCryptoIV          = 'cryI',  // uint8_t[16]
157f69e53033f23f9f70fcdb28a3c2e650de0147459Andreas Huber    kKeyCryptoMode        = 'cryM',  // int32_t
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    kTypeESDS        = 'esds',
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    kTypeAVCC        = 'avcc',
163244ba87d20aeb29c9cad727820fa1e803ec3643cJames Dong    kTypeD263        = 'd263',
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData : public RefBase {
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MetaData();
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MetaData(const MetaData &from);
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enum Type {
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_NONE     = 'none',
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_C_STRING = 'cstr',
17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_INT32    = 'in32',
17548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber        TYPE_INT64    = 'in64',
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_FLOAT    = 'floa',
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_POINTER  = 'ptr ',
178f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        TYPE_RECT     = 'rect',
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void clear();
18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool remove(uint32_t key);
18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setCString(uint32_t key, const char *value);
18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setInt32(uint32_t key, int32_t value);
18648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    bool setInt64(uint32_t key, int64_t value);
18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setFloat(uint32_t key, float value);
18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setPointer(uint32_t key, void *value);
18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
190f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    bool setRect(
191f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            uint32_t key,
192f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t left, int32_t top,
193f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t right, int32_t bottom);
194f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
1952cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findCString(uint32_t key, const char **value);
1962cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findInt32(uint32_t key, int32_t *value);
1972cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findInt64(uint32_t key, int64_t *value);
1982cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findFloat(uint32_t key, float *value);
1992cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findPointer(uint32_t key, void **value);
20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
201f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    bool findRect(
202f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            uint32_t key,
203f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t *left, int32_t *top,
2042cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong            int32_t *right, int32_t *bottom);
205f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setData(uint32_t key, uint32_t type, const void *data, size_t size);
20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool findData(uint32_t key, uint32_t *type,
20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                  const void **data, size_t *size) const;
21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
211feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    void dumpToLog() const;
212feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen
21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprotected:
21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MetaData();
21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    struct typed_data {
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data();
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        ~typed_data();
22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data(const MetaData::typed_data &);
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data &operator=(const MetaData::typed_data &);
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void clear();
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void setData(uint32_t type, const void *data, size_t size);
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void getData(uint32_t *type, const void **data, size_t *size) const;
227feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        String8 asString() const;
22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    private:
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        uint32_t mType;
23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        size_t mSize;
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        union {
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *ext_data;
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            float reservoir;
23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } u;
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        bool usesReservoir() const {
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return mSize <= sizeof(u.reservoir);
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void allocateStorage(size_t size);
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void freeStorage();
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void *storage() {
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return usesReservoir() ? &u.reservoir : u.ext_data;
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const void *storage() const {
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return usesReservoir() ? &u.reservoir : u.ext_data;
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
254f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    struct Rect {
255f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t mLeft, mTop, mRight, mBottom;
256f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    };
257f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    KeyedVector<uint32_t, typed_data> mItems;
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // MetaData &operator=(const MetaData &);
26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // META_DATA_H_
266