MetaData.h revision 46f80165c595d81dda68f8f3fea27f4fb04937dd
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
25b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen#include <binder/Parcel.h>
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/RefBase.h>
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/KeyedVector.h>
28feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen#include <utils/String8.h>
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber// The following keys map to int32_t data unless indicated otherwise.
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
3448c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyMIMEType          = 'mime',  // cstring
35b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    kKeyWidth             = 'widt',  // int32_t, image pixel
36b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    kKeyHeight            = 'heig',  // int32_t, image pixel
37b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    kKeyDisplayWidth      = 'dWid',  // int32_t, display/presentation
38b45c01c2b8588ff431b511151666a55a39f0a6aeJames Dong    kKeyDisplayHeight     = 'dHgt',  // int32_t, display/presentation
39e9810fae2ca6620337b75a787786cc0ea52adecdAndreas Huber    kKeySARWidth          = 'sarW',  // int32_t, sampleAspectRatio width
40e9810fae2ca6620337b75a787786cc0ea52adecdAndreas Huber    kKeySARHeight         = 'sarH',  // int32_t, sampleAspectRatio height
41f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
42f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    // a rectangle, if absent assumed to be (0, 0, width - 1, height - 1)
43f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    kKeyCropRect          = 'crop',
44f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
4530db2709395c73fb3b4ee334119ceba68c95ab13James Dong    kKeyRotation          = 'rotA',  // int32_t (angle in degrees)
46ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyIFramesInterval   = 'ifiv',  // int32_t
47ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyStride            = 'strd',  // int32_t
48ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeySliceHeight       = 'slht',  // int32_t
49ddcc4a66d848deef6fb4689e64e30cd9bd2684feJames Dong    kKeyChannelCount      = '#chn',  // int32_t
50786618ffe881aceb64d65a6a2e2d76ede6e01ec0Jean-Michel Trivi    kKeyChannelMask       = 'chnm',  // int32_t
51393410a441b6d06daf286ed496470e9d6b2b6ca8James Dong    kKeySampleRate        = 'srte',  // int32_t (audio sampling rate Hz)
5278bd91b15ee8ea5aa2ab5a8cad7e892cb2d01c1bLajos Molnar    kKeyPcmEncoding       = 'PCMe',  // int32_t (audio encoding enum)
53393410a441b6d06daf286ed496470e9d6b2b6ca8James Dong    kKeyFrameRate         = 'frmR',  // int32_t (video frame rate fps)
54b841f14f8e51f2365945281fbfa54ef6a1b1b5a6Andreas Huber    kKeyBitRate           = 'brte',  // int32_t (bps)
5546f80165c595d81dda68f8f3fea27f4fb04937ddLajos Molnar    kKeyMaxBitRate        = 'mxBr',  // int32_t (bps)
5648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyESDS              = 'esds',  // raw data
57aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke    kKeyAACProfile        = 'aacp',  // int32_t
5848c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyAVCC              = 'avcc',  // raw data
593b5a6b9fa6c6825a1d0b441429e2bb365b259827Harish Mahendrakar    kKeyHVCC              = 'hvcc',  // raw data
60244ba87d20aeb29c9cad727820fa1e803ec3643cJames Dong    kKeyD263              = 'd263',  // raw data
61ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber    kKeyVorbisInfo        = 'vinf',  // raw data
62ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber    kKeyVorbisBooks       = 'vboo',  // raw data
63bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    kKeyOpusHeader        = 'ohdr',  // raw data
64bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    kKeyOpusCodecDelay    = 'ocod',  // uint64_t (codec delay in ns)
65bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    kKeyOpusSeekPreRoll   = 'ospr',  // uint64_t (seek preroll in ns)
66d0d32c0d39b56d7e85fcaa61f3245ac7bbb1f9ebVignesh Venkatasubramanian    kKeyVp9CodecPrivate   = 'vp9p',  // raw data (vp9 csd information)
67dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber    kKeyWantsNALFragments = 'NALf',
6830ab66297501757d745b9ae10da61adcd891f497Andreas Huber    kKeyIsSyncFrame       = 'sync',  // int32_t (bool)
6930ab66297501757d745b9ae10da61adcd891f497Andreas Huber    kKeyIsCodecConfig     = 'conf',  // int32_t (bool)
7048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyTime              = 'time',  // int64_t (usecs)
71965e4239ca1cf6c824c1f8ce23116f9ba8cf6ebdJames Dong    kKeyDecodingTime      = 'decT',  // int64_t (decoding timestamp in usecs)
7239ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    kKeyNTPTime           = 'ntpT',  // uint64_t (ntp-timestamp)
73abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber    kKeyTargetTime        = 'tarT',  // int64_t (usecs)
74d707fcb3e29707ca4a5935c294ef0b38eb5aba5fJames Dong    kKeyDriftTime         = 'dftT',  // int64_t (usecs)
753c3763d2ee1cd1fba7fe522fbaf0faca315d8c2aJames Dong    kKeyAnchorTime        = 'ancT',  // int64_t (usecs)
7648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyDuration          = 'dura',  // int64_t (usecs)
77c93a13669ce1b5a9e6527b4c86c9d8f5e92be828Lajos Molnar    kKeyPixelFormat       = 'pixf',  // int32_t
78c93a13669ce1b5a9e6527b4c86c9d8f5e92be828Lajos Molnar    kKeyColorFormat       = 'colf',  // int32_t
79c93a13669ce1b5a9e6527b4c86c9d8f5e92be828Lajos Molnar    kKeyColorSpace        = 'cols',  // int32_t
8048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyPlatformPrivate   = 'priv',  // pointer
8148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyDecoderComponent  = 'decC',  // cstring
82dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber    kKeyBufferID          = 'bfID',
83e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    kKeyMaxInputSize      = 'inpS',
84a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang    kKeyMaxWidth          = 'maxW',
85a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang    kKeyMaxHeight         = 'maxH',
867e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber    kKeyThumbnailTime     = 'thbT',  // int64_t (usecs)
87dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    kKeyTrackID           = 'trID',
88dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    kKeyIsDRM             = 'idrm',  // int32_t (bool)
89b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen    kKeyEncoderDelay      = 'encd',  // int32_t (frames)
90b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen    kKeyEncoderPadding    = 'encp',  // int32_t (frames)
91fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
92fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbum             = 'albu',  // cstring
93fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyArtist            = 'arti',  // cstring
9466ac4df65516ebfd0e500bfca75dc4b5ef8d674eMarco Nelissen    kKeyAlbumArtist       = 'aart',  // cstring
95fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyComposer          = 'comp',  // cstring
96fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyGenre             = 'genr',  // cstring
97fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyTitle             = 'titl',  // cstring
98fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyYear              = 'year',  // cstring
99fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbumArt          = 'albA',  // compressed image data
100fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbumArtMIME      = 'alAM',  // cstring
101bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyAuthor            = 'auth',  // cstring
102bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyCDTrackNumber     = 'cdtr',  // cstring
1036c8a9a4132337a3419a72a735f0b40df0b82061fMarco Nelissen    kKeyDiscNumber        = 'dnum',  // cstring
104bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyDate              = 'date',  // cstring
10572b8c5ae6a5f97a4fcfc6d23d33159d6ae50179cAndreas Huber    kKeyWriter            = 'writ',  // cstring
10611f8109ad8646d3acd9a0987613229cde59d52c1Marco Nelissen    kKeyCompilation       = 'cpil',  // cstring
1074948818cb91176df74c972ac27b2f392b5d148bcJames Dong    kKeyLocation          = 'loc ',  // cstring
1088f5f2fcee5c12d08df71d17017410c50951fc2e3James Dong    kKeyTimeScale         = 'tmsl',  // int32_t
1098cfad968d5ec429b033caff9743f1ef15090be61Chong Zhang    kKeyCaptureFramerate  = 'capF',  // float (capture fps)
11093d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
111145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    // video profile and level
112145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    kKeyVideoProfile      = 'vprf',  // int32_t
113145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    kKeyVideoLevel        = 'vlev',  // int32_t
114145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong
11593d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Set this key to enable authoring files in 64-bit offset
11693d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKey64BitFileOffset   = 'fobt',  // int32_t (bool)
117b4d5320bda29cd9694461c9b61d0211f801ff0afJames Dong    kKey2ByteNalLength    = '2NAL',  // int32_t (bool)
11893d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
11993d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Identify the file output format for authoring
12093d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Please see <media/mediarecorder.h> for the supported
12193d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // file output formats.
12293d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKeyFileType          = 'ftyp',  // int32_t
12393d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
12493d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Track authoring progress status
12593d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // kKeyTrackTimeStatus is used to track progress in elapsed time
12693d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKeyTrackTimeStatus   = 'tktm',  // int64_t
12793d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
128e756d9753c7cffe2e9731a31fa98a3e8f37151c9ztenghui    kKeyRealTimeRecording = 'rtrc',  // bool (int32_t)
1290dff606f42292b8a31b9eee842877f9875279dabJames Dong    kKeyNumBuffers        = 'nbbf',  // int32_t
130e259531ce59ab1f31de5a23124b22536f6a5a767James Dong
1318ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    // Ogg files can be tagged to be automatically looping...
1328ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    kKeyAutoLoop          = 'autL',  // bool (int32_t)
133db6222212528637d8f2afa7f49fc3c8c915bafbeAndreas Huber
134db6222212528637d8f2afa7f49fc3c8c915bafbeAndreas Huber    kKeyValidSamples      = 'valD',  // int32_t
1352b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber
1362b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber    kKeyIsUnreadable      = 'unre',  // bool (int32_t)
1376a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    // An indication that a video buffer has been rendered.
1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    kKeyRendered          = 'rend',  // bool (int32_t)
1407a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1417a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    // The language code for this media
1427a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    kKeyMediaLanguage     = 'lang',  // cstring
1433b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang
1443b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang    // To store the timed text format data
1453b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang    kKeyTextFormatData    = 'text',  // raw data
1460bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber
1470bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber    kKeyRequiresSecureBuffers = 'secu',  // bool (int32_t)
148ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
149ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    kKeyIsADTS            = 'adts',  // bool (int32_t)
150db170bb1cae145d07efc803a3c208963de0c6087Eric Laurent    kKeyAACAOT            = 'aaot',  // int32_t
1515892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber
1525892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If a MediaBuffer's data represents (at least partially) encrypted
1535892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // data, the following fields aid in decryption.
1545892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // The data can be thought of as pairs of plain and encrypted data
1555892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // fragments, i.e. plain and encrypted data alternate.
1565892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // The first fragment is by convention plain data (if that's not the
1575892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // case, simply specify plain fragment size of 0).
1585892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // kKeyEncryptedSizes and kKeyPlainSizes each map to an array of
1595892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // size_t values. The sum total of all size_t values of both arrays
1605892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // must equal the amount of data (i.e. MediaBuffer's range_length()).
1615892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If both arrays are present, they must be of the same size.
1625892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If only encrypted sizes are present it is assumed that all
1635892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // plain sizes are 0, i.e. all fragments are encrypted.
1645892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // To programmatically set these array, use the MetaData::setData API, i.e.
1655892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // const size_t encSizes[];
1665892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // meta->setData(
1675892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    //  kKeyEncryptedSizes, 0 /* type */, encSizes, sizeof(encSizes));
1685892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // A plain sizes array by itself makes no sense.
1695892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyEncryptedSizes    = 'encr',  // size_t[]
1705892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyPlainSizes        = 'plai',  // size_t[]
1715892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyCryptoKey         = 'cryK',  // uint8_t[16]
1725892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyCryptoIV          = 'cryI',  // uint8_t[16]
173f69e53033f23f9f70fcdb28a3c2e650de0147459Andreas Huber    kKeyCryptoMode        = 'cryM',  // int32_t
1745544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen
1755544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen    kKeyCryptoDefaultIVSize = 'cryS',  // int32_t
1765544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen
1775544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen    kKeyPssh              = 'pssh',  // raw data
178dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih
179dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    // Please see MediaFormat.KEY_IS_AUTOSELECT.
180dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    kKeyTrackIsAutoselect = 'auto', // bool (int32_t)
181dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    // Please see MediaFormat.KEY_IS_DEFAULT.
182dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    kKeyTrackIsDefault    = 'dflt', // bool (int32_t)
183dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    // Similar to MediaFormat.KEY_IS_FORCED_SUBTITLE but pertains to av tracks as well.
184dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    kKeyTrackIsForced     = 'frcd', // bool (int32_t)
185f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih
186f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih    // H264 supplemental enhancement information offsets/sizes
187f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih    kKeySEI               = 'sei ', // raw data
1883694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung
1893694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung    // MPEG user data offsets
1903694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung    kKeyMpegUserData      = 'mpud', // size_t[]
1914f2559d3cdeb7187dedca186d5abc65af4bdb031Robert Shih
1924f2559d3cdeb7187dedca186d5abc65af4bdb031Robert Shih    // Size of NALU length in mkv/mp4
1934f2559d3cdeb7187dedca186d5abc65af4bdb031Robert Shih    kKeyNalLengthSize     = 'nals', // int32_t
194caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu
195caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    // HDR related
196caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    kKeyMinLuminance     = 'minL', // int32_t, min luminance of the content in cd/m2.
197caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    kKeyMaxLuminance     = 'maxL', // int32_t, max luminance of the content in cd/m2.
198caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu
199caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    // color aspects
200caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    kKeyColorRange       = 'cRng', // int32_t, color range, value defined by ColorAspects.Range
201caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    kKeyColorPrimaries   = 'cPrm', // int32_t,
202caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu                                   // color Primaries, value defined by ColorAspects.Primaries
203caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    kKeyTransferFunction = 'tFun', // int32_t,
204caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu                                   // transfer Function, value defined by ColorAspects.Transfer.
205caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    kKeyColorMatrix      = 'cMtx', // int32_t,
206caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu                                   // color Matrix, value defined by ColorAspects.MatrixCoeffs.
20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    kTypeESDS        = 'esds',
21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    kTypeAVCC        = 'avcc',
2123b5a6b9fa6c6825a1d0b441429e2bb365b259827Harish Mahendrakar    kTypeHVCC        = 'hvcc',
213244ba87d20aeb29c9cad727820fa1e803ec3643cJames Dong    kTypeD263        = 'd263',
21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData : public RefBase {
21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MetaData();
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MetaData(const MetaData &from);
22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enum Type {
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_NONE     = 'none',
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_C_STRING = 'cstr',
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_INT32    = 'in32',
22548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber        TYPE_INT64    = 'in64',
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_FLOAT    = 'floa',
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_POINTER  = 'ptr ',
228f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        TYPE_RECT     = 'rect',
22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void clear();
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool remove(uint32_t key);
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setCString(uint32_t key, const char *value);
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setInt32(uint32_t key, int32_t value);
23648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    bool setInt64(uint32_t key, int64_t value);
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setFloat(uint32_t key, float value);
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setPointer(uint32_t key, void *value);
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
240f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    bool setRect(
241f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            uint32_t key,
242f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t left, int32_t top,
243f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t right, int32_t bottom);
244f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
2452cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findCString(uint32_t key, const char **value);
2462cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findInt32(uint32_t key, int32_t *value);
2472cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findInt64(uint32_t key, int64_t *value);
2482cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findFloat(uint32_t key, float *value);
2492cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findPointer(uint32_t key, void **value);
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
251f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    bool findRect(
252f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            uint32_t key,
253f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t *left, int32_t *top,
2542cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong            int32_t *right, int32_t *bottom);
255f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setData(uint32_t key, uint32_t type, const void *data, size_t size);
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool findData(uint32_t key, uint32_t *type,
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                  const void **data, size_t *size) const;
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
261328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé    bool hasData(uint32_t key) const;
262328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé
26369d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    String8 toString() const;
264feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    void dumpToLog() const;
265feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen
266b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    status_t writeToParcel(Parcel &parcel);
267b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    status_t updateFromParcel(const Parcel &parcel);
268b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    static sp<MetaData> createFromParcel(const Parcel &parcel);
269b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen
27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprotected:
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MetaData();
27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    struct typed_data {
27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data();
27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        ~typed_data();
27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data(const MetaData::typed_data &);
27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data &operator=(const MetaData::typed_data &);
28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void clear();
28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void setData(uint32_t type, const void *data, size_t size);
28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void getData(uint32_t *type, const void **data, size_t *size) const;
28469d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        // may include hexdump of binary data if verbose=true
28569d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        String8 asString(bool verbose) const;
28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    private:
28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        uint32_t mType;
28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        size_t mSize;
29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        union {
29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *ext_data;
29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            float reservoir;
29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } u;
29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        bool usesReservoir() const {
29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return mSize <= sizeof(u.reservoir);
29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
300f26400c9d01a0e2f71690d5ebc644270f098d590Marco Nelissen        void *allocateStorage(size_t size);
30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void freeStorage();
30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void *storage() {
30420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return usesReservoir() ? &u.reservoir : u.ext_data;
30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const void *storage() const {
30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return usesReservoir() ? &u.reservoir : u.ext_data;
30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
312f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    struct Rect {
313f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t mLeft, mTop, mRight, mBottom;
314f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    };
315f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
31620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    KeyedVector<uint32_t, typed_data> mItems;
31720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // MetaData &operator=(const MetaData &);
31920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
32020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
32120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
32220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // META_DATA_H_
324