MetaData.h revision 8f5f2fcee5c12d08df71d17017410c50951fc2e3
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>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber// The following keys map to int32_t data unless indicated otherwise.
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
3248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyMIMEType          = 'mime',  // cstring
33ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyWidth             = 'widt',  // int32_t
34ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyHeight            = 'heig',  // int32_t
35ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyIFramesInterval   = 'ifiv',  // int32_t
36ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyStride            = 'strd',  // int32_t
37ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeySliceHeight       = 'slht',  // int32_t
38ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyChannelCount      = '#chn',  // int32_t
392dec2b5be2056c6d9428897dc672185872d30d17James Dong    kKeySampleRate        = 'srte',  // int32_t (also video frame rate)
40b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    kKeyBitRate           = 'brte',  // int32_t (bps)
4148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyESDS              = 'esds',  // raw data
4248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyAVCC              = 'avcc',  // raw data
43ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber    kKeyVorbisInfo        = 'vinf',  // raw data
44ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber    kKeyVorbisBooks       = 'vboo',  // raw data
45dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber    kKeyWantsNALFragments = 'NALf',
4630ab66297501757d745b9ae10da61adcd891f497Andreas Huber    kKeyIsSyncFrame       = 'sync',  // int32_t (bool)
4730ab66297501757d745b9ae10da61adcd891f497Andreas Huber    kKeyIsCodecConfig     = 'conf',  // int32_t (bool)
4848c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyTime              = 'time',  // int64_t (usecs)
4948c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyDuration          = 'dura',  // int64_t (usecs)
50dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber    kKeyColorFormat       = 'colf',
5148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyPlatformPrivate   = 'priv',  // pointer
5248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyDecoderComponent  = 'decC',  // cstring
53dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber    kKeyBufferID          = 'bfID',
54e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    kKeyMaxInputSize      = 'inpS',
557e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber    kKeyThumbnailTime     = 'thbT',  // int64_t (usecs)
56fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
57fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbum             = 'albu',  // cstring
58fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyArtist            = 'arti',  // cstring
5966ac4df65516ebfd0e500bfca75dc4b5ef8d674eMarco Nelissen    kKeyAlbumArtist       = 'aart',  // cstring
60fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyComposer          = 'comp',  // cstring
61fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyGenre             = 'genr',  // cstring
62fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyTitle             = 'titl',  // cstring
63fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyYear              = 'year',  // cstring
64fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbumArt          = 'albA',  // compressed image data
65fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbumArtMIME      = 'alAM',  // cstring
66bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyAuthor            = 'auth',  // cstring
67bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyCDTrackNumber     = 'cdtr',  // cstring
686c8a9a4132337a3419a72a735f0b40df0b82061fMarco Nelissen    kKeyDiscNumber        = 'dnum',  // cstring
69bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyDate              = 'date',  // cstring
7072b8c5ae6a5f97a4fcfc6d23d33159d6ae50179cAndreas Huber    kKeyWriter            = 'writ',  // cstring
718f5f2fcee5c12d08df71d17017410c50951fc2e3James Dong    kKeyTimeScale         = 'tmsl',  // int32_t
7293d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
73145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    // video profile and level
74145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    kKeyVideoProfile      = 'vprf',  // int32_t
75145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    kKeyVideoLevel        = 'vlev',  // int32_t
76145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong
7793d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Set this key to enable authoring files in 64-bit offset
7893d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKey64BitFileOffset   = 'fobt',  // int32_t (bool)
7993d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
8093d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Identify the file output format for authoring
8193d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Please see <media/mediarecorder.h> for the supported
8293d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // file output formats.
8393d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKeyFileType          = 'ftyp',  // int32_t
8493d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
8593d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Track authoring progress status
8693d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // kKeyTrackTimeStatus is used to track progress in elapsed time
8793d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // kKeyTrackFrameStatus is used to track progress in authored frames
8893d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKeyTrackFrameStatus  = 'tkfm',  // int32_t
8993d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKeyTrackTimeStatus   = 'tktm',  // int64_t
9093d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    kTypeESDS        = 'esds',
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    kTypeAVCC        = 'avcc',
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData : public RefBase {
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MetaData();
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MetaData(const MetaData &from);
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enum Type {
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_NONE     = 'none',
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_C_STRING = 'cstr',
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_INT32    = 'in32',
10748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber        TYPE_INT64    = 'in64',
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_FLOAT    = 'floa',
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_POINTER  = 'ptr ',
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void clear();
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool remove(uint32_t key);
11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setCString(uint32_t key, const char *value);
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setInt32(uint32_t key, int32_t value);
11748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    bool setInt64(uint32_t key, int64_t value);
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setFloat(uint32_t key, float value);
11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setPointer(uint32_t key, void *value);
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool findCString(uint32_t key, const char **value);
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool findInt32(uint32_t key, int32_t *value);
12348c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    bool findInt64(uint32_t key, int64_t *value);
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool findFloat(uint32_t key, float *value);
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool findPointer(uint32_t key, void **value);
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setData(uint32_t key, uint32_t type, const void *data, size_t size);
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool findData(uint32_t key, uint32_t *type,
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                  const void **data, size_t *size) const;
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprotected:
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MetaData();
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    struct typed_data {
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data();
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        ~typed_data();
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data(const MetaData::typed_data &);
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data &operator=(const MetaData::typed_data &);
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void clear();
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void setData(uint32_t type, const void *data, size_t size);
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void getData(uint32_t *type, const void **data, size_t *size) const;
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    private:
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        uint32_t mType;
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        size_t mSize;
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        union {
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *ext_data;
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            float reservoir;
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } u;
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        bool usesReservoir() const {
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return mSize <= sizeof(u.reservoir);
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void allocateStorage(size_t size);
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void freeStorage();
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void *storage() {
16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return usesReservoir() ? &u.reservoir : u.ext_data;
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const void *storage() const {
16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return usesReservoir() ? &u.reservoir : u.ext_data;
16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    KeyedVector<uint32_t, typed_data> mItems;
17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // MetaData &operator=(const MetaData &);
17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // META_DATA_H_
180