MetaData.h revision 5544c66ba0aa789a997b376df503a5ffae425dc7
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
38e9810fae2ca6620337b75a787786cc0ea52adecdAndreas Huber    kKeySARWidth          = 'sarW',  // int32_t, sampleAspectRatio width
39e9810fae2ca6620337b75a787786cc0ea52adecdAndreas Huber    kKeySARHeight         = 'sarH',  // int32_t, sampleAspectRatio height
40f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
41f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    // a rectangle, if absent assumed to be (0, 0, width - 1, height - 1)
42f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    kKeyCropRect          = 'crop',
43f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
4430db2709395c73fb3b4ee334119ceba68c95ab13James Dong    kKeyRotation          = 'rotA',  // int32_t (angle in degrees)
45ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyIFramesInterval   = 'ifiv',  // int32_t
46ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyStride            = 'strd',  // int32_t
47ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeySliceHeight       = 'slht',  // int32_t
48ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyChannelCount      = '#chn',  // int32_t
49786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi    kKeyChannelMask       = 'chnm',  // int32_t
50393410a441b6d06daf286ed496470e9d6b2b6ca8James Dong    kKeySampleRate        = 'srte',  // int32_t (audio sampling rate Hz)
51393410a441b6d06daf286ed496470e9d6b2b6ca8James Dong    kKeyFrameRate         = 'frmR',  // int32_t (video frame rate fps)
52b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    kKeyBitRate           = 'brte',  // int32_t (bps)
5348c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyESDS              = 'esds',  // raw data
54aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke    kKeyAACProfile        = 'aacp',  // int32_t
5548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyAVCC              = 'avcc',  // raw data
56244ba87d20aeb29c9cad727820fa1e803ec3643cJames Dong    kKeyD263              = 'd263',  // raw data
57ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber    kKeyVorbisInfo        = 'vinf',  // raw data
58ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber    kKeyVorbisBooks       = 'vboo',  // raw data
59dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber    kKeyWantsNALFragments = 'NALf',
6030ab66297501757d745b9ae10da61adcd891f497Andreas Huber    kKeyIsSyncFrame       = 'sync',  // int32_t (bool)
6130ab66297501757d745b9ae10da61adcd891f497Andreas Huber    kKeyIsCodecConfig     = 'conf',  // int32_t (bool)
6248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyTime              = 'time',  // int64_t (usecs)
63965e4239ca1cf6c824c1f8ce23116f9ba8cf6ebdJames Dong    kKeyDecodingTime      = 'decT',  // int64_t (decoding timestamp in usecs)
6439ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    kKeyNTPTime           = 'ntpT',  // uint64_t (ntp-timestamp)
65abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber    kKeyTargetTime        = 'tarT',  // int64_t (usecs)
66d707fcb3e29707ca4a5935c294ef0b38eb5aba5fJames Dong    kKeyDriftTime         = 'dftT',  // int64_t (usecs)
673c3763d2ee1cd1fba7fe522fbaf0faca315d8c2aJames Dong    kKeyAnchorTime        = 'ancT',  // int64_t (usecs)
6848c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyDuration          = 'dura',  // int64_t (usecs)
69dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber    kKeyColorFormat       = 'colf',
7048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyPlatformPrivate   = 'priv',  // pointer
7148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyDecoderComponent  = 'decC',  // cstring
72dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber    kKeyBufferID          = 'bfID',
73e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    kKeyMaxInputSize      = 'inpS',
747e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber    kKeyThumbnailTime     = 'thbT',  // int64_t (usecs)
75dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    kKeyTrackID           = 'trID',
76dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    kKeyIsDRM             = 'idrm',  // int32_t (bool)
77b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen    kKeyEncoderDelay      = 'encd',  // int32_t (frames)
78b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen    kKeyEncoderPadding    = 'encp',  // int32_t (frames)
79fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
80fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbum             = 'albu',  // cstring
81fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyArtist            = 'arti',  // cstring
8266ac4df65516ebfd0e500bfca75dc4b5ef8d674eMarco Nelissen    kKeyAlbumArtist       = 'aart',  // cstring
83fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyComposer          = 'comp',  // cstring
84fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyGenre             = 'genr',  // cstring
85fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyTitle             = 'titl',  // cstring
86fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyYear              = 'year',  // cstring
87fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbumArt          = 'albA',  // compressed image data
88fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbumArtMIME      = 'alAM',  // cstring
89bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyAuthor            = 'auth',  // cstring
90bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyCDTrackNumber     = 'cdtr',  // cstring
916c8a9a4132337a3419a72a735f0b40df0b82061fMarco Nelissen    kKeyDiscNumber        = 'dnum',  // cstring
92bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyDate              = 'date',  // cstring
9372b8c5ae6a5f97a4fcfc6d23d33159d6ae50179cAndreas Huber    kKeyWriter            = 'writ',  // cstring
9411f8109ad8646d3acd9a0987613229cde59d52c1Marco Nelissen    kKeyCompilation       = 'cpil',  // cstring
954948818cb91176df74c972ac27b2f392b5d148bcJames Dong    kKeyLocation          = 'loc ',  // cstring
968f5f2fcee5c12d08df71d17017410c50951fc2e3James Dong    kKeyTimeScale         = 'tmsl',  // int32_t
9793d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
98145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    // video profile and level
99145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    kKeyVideoProfile      = 'vprf',  // int32_t
100145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    kKeyVideoLevel        = 'vlev',  // int32_t
101145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong
10293d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Set this key to enable authoring files in 64-bit offset
10393d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKey64BitFileOffset   = 'fobt',  // int32_t (bool)
104b4d5320bda29cd9694461c9b61d0211f801ff0afJames Dong    kKey2ByteNalLength    = '2NAL',  // int32_t (bool)
10593d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
10693d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Identify the file output format for authoring
10793d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Please see <media/mediarecorder.h> for the supported
10893d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // file output formats.
10993d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKeyFileType          = 'ftyp',  // int32_t
11093d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
11193d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Track authoring progress status
11293d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // kKeyTrackTimeStatus is used to track progress in elapsed time
11393d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKeyTrackTimeStatus   = 'tktm',  // int64_t
11493d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
115e259531ce59ab1f31de5a23124b22536f6a5a767James Dong    kKeyNotRealTime       = 'ntrt',  // bool (int32_t)
1160dff606f42292b8a31b9eee842877f9875279dabJames Dong    kKeyNumBuffers        = 'nbbf',  // int32_t
117e259531ce59ab1f31de5a23124b22536f6a5a767James Dong
1188ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    // Ogg files can be tagged to be automatically looping...
1198ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    kKeyAutoLoop          = 'autL',  // bool (int32_t)
120db6222212528637d8f2afa7f49fc3c8c915bafbeAndreas Huber
121db6222212528637d8f2afa7f49fc3c8c915bafbeAndreas Huber    kKeyValidSamples      = 'valD',  // int32_t
1222b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber
1232b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber    kKeyIsUnreadable      = 'unre',  // bool (int32_t)
1246a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1256a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    // An indication that a video buffer has been rendered.
1266a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    kKeyRendered          = 'rend',  // bool (int32_t)
1277a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1287a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    // The language code for this media
1297a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    kKeyMediaLanguage     = 'lang',  // cstring
1303b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang
1313b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang    // To store the timed text format data
1323b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang    kKeyTextFormatData    = 'text',  // raw data
1330bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber
1340bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber    kKeyRequiresSecureBuffers = 'secu',  // bool (int32_t)
135ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
136ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    kKeyIsADTS            = 'adts',  // bool (int32_t)
1375892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber
1385892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If a MediaBuffer's data represents (at least partially) encrypted
1395892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // data, the following fields aid in decryption.
1405892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // The data can be thought of as pairs of plain and encrypted data
1415892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // fragments, i.e. plain and encrypted data alternate.
1425892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // The first fragment is by convention plain data (if that's not the
1435892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // case, simply specify plain fragment size of 0).
1445892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // kKeyEncryptedSizes and kKeyPlainSizes each map to an array of
1455892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // size_t values. The sum total of all size_t values of both arrays
1465892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // must equal the amount of data (i.e. MediaBuffer's range_length()).
1475892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If both arrays are present, they must be of the same size.
1485892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If only encrypted sizes are present it is assumed that all
1495892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // plain sizes are 0, i.e. all fragments are encrypted.
1505892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // To programmatically set these array, use the MetaData::setData API, i.e.
1515892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // const size_t encSizes[];
1525892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // meta->setData(
1535892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    //  kKeyEncryptedSizes, 0 /* type */, encSizes, sizeof(encSizes));
1545892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // A plain sizes array by itself makes no sense.
1555892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyEncryptedSizes    = 'encr',  // size_t[]
1565892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyPlainSizes        = 'plai',  // size_t[]
1575892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyCryptoKey         = 'cryK',  // uint8_t[16]
1585892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyCryptoIV          = 'cryI',  // uint8_t[16]
159f69e53033f23f9f70fcdb28a3c2e650de0147459Andreas Huber    kKeyCryptoMode        = 'cryM',  // int32_t
1605544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen
1615544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen    kKeyCryptoDefaultIVSize = 'cryS',  // int32_t
1625544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen
1635544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen    kKeyPssh              = 'pssh',  // raw data
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    kTypeESDS        = 'esds',
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    kTypeAVCC        = 'avcc',
169244ba87d20aeb29c9cad727820fa1e803ec3643cJames Dong    kTypeD263        = 'd263',
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData : public RefBase {
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MetaData();
17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MetaData(const MetaData &from);
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enum Type {
17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_NONE     = 'none',
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_C_STRING = 'cstr',
18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_INT32    = 'in32',
18148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber        TYPE_INT64    = 'in64',
18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_FLOAT    = 'floa',
18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_POINTER  = 'ptr ',
184f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        TYPE_RECT     = 'rect',
18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void clear();
18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool remove(uint32_t key);
18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setCString(uint32_t key, const char *value);
19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setInt32(uint32_t key, int32_t value);
19248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    bool setInt64(uint32_t key, int64_t value);
19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setFloat(uint32_t key, float value);
19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setPointer(uint32_t key, void *value);
19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
196f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    bool setRect(
197f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            uint32_t key,
198f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t left, int32_t top,
199f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t right, int32_t bottom);
200f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
2012cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findCString(uint32_t key, const char **value);
2022cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findInt32(uint32_t key, int32_t *value);
2032cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findInt64(uint32_t key, int64_t *value);
2042cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findFloat(uint32_t key, float *value);
2052cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findPointer(uint32_t key, void **value);
20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
207f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    bool findRect(
208f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            uint32_t key,
209f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t *left, int32_t *top,
2102cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong            int32_t *right, int32_t *bottom);
211f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setData(uint32_t key, uint32_t type, const void *data, size_t size);
21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool findData(uint32_t key, uint32_t *type,
21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                  const void **data, size_t *size) const;
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
217feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    void dumpToLog() const;
218feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprotected:
22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MetaData();
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    struct typed_data {
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data();
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        ~typed_data();
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data(const MetaData::typed_data &);
22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data &operator=(const MetaData::typed_data &);
22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void clear();
23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void setData(uint32_t type, const void *data, size_t size);
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void getData(uint32_t *type, const void **data, size_t *size) const;
233feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        String8 asString() const;
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    private:
23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        uint32_t mType;
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        size_t mSize;
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        union {
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *ext_data;
24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            float reservoir;
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } u;
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        bool usesReservoir() const {
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return mSize <= sizeof(u.reservoir);
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void allocateStorage(size_t size);
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void freeStorage();
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void *storage() {
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return usesReservoir() ? &u.reservoir : u.ext_data;
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const void *storage() const {
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return usesReservoir() ? &u.reservoir : u.ext_data;
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
260f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    struct Rect {
261f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t mLeft, mTop, mRight, mBottom;
262f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    };
263f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    KeyedVector<uint32_t, typed_data> mItems;
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // MetaData &operator=(const MetaData &);
26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // META_DATA_H_
272