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)
560dc8be97f0fbee707b69b24b3a8d914f88c77423Lajos Molnar    kKeyStreamHeader      = 'stHd',  // raw data
5748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyESDS              = 'esds',  // raw data
58aeb8fd460ed87d032b3fb8bb61e21eb542ce0f5bDave Burke    kKeyAACProfile        = 'aacp',  // int32_t
5948c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyAVCC              = 'avcc',  // raw data
603b5a6b9fa6c6825a1d0b441429e2bb365b259827Harish Mahendrakar    kKeyHVCC              = 'hvcc',  // raw data
61244ba87d20aeb29c9cad727820fa1e803ec3643cJames Dong    kKeyD263              = 'd263',  // raw data
62ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber    kKeyVorbisInfo        = 'vinf',  // raw data
63ee7ff20e69498ebd53dd9717a0f984188341a75eAndreas Huber    kKeyVorbisBooks       = 'vboo',  // raw data
64bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    kKeyOpusHeader        = 'ohdr',  // raw data
65bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    kKeyOpusCodecDelay    = 'ocod',  // uint64_t (codec delay in ns)
66bf927f8ec7979f2b64331c2b2f12a6a5dba05bcaVignesh Venkatasubramanian    kKeyOpusSeekPreRoll   = 'ospr',  // uint64_t (seek preroll in ns)
67d0d32c0d39b56d7e85fcaa61f3245ac7bbb1f9ebVignesh Venkatasubramanian    kKeyVp9CodecPrivate   = 'vp9p',  // raw data (vp9 csd information)
68dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber    kKeyWantsNALFragments = 'NALf',
6930ab66297501757d745b9ae10da61adcd891f497Andreas Huber    kKeyIsSyncFrame       = 'sync',  // int32_t (bool)
7030ab66297501757d745b9ae10da61adcd891f497Andreas Huber    kKeyIsCodecConfig     = 'conf',  // int32_t (bool)
7148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyTime              = 'time',  // int64_t (usecs)
72965e4239ca1cf6c824c1f8ce23116f9ba8cf6ebdJames Dong    kKeyDecodingTime      = 'decT',  // int64_t (decoding timestamp in usecs)
7339ddf8e0f18766f7ba1e3246b774aa6ebd93eea8Andreas Huber    kKeyNTPTime           = 'ntpT',  // uint64_t (ntp-timestamp)
74abd1f4f870925d6776dbe4b930b759a1ab6595caAndreas Huber    kKeyTargetTime        = 'tarT',  // int64_t (usecs)
75d707fcb3e29707ca4a5935c294ef0b38eb5aba5fJames Dong    kKeyDriftTime         = 'dftT',  // int64_t (usecs)
763c3763d2ee1cd1fba7fe522fbaf0faca315d8c2aJames Dong    kKeyAnchorTime        = 'ancT',  // int64_t (usecs)
7748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyDuration          = 'dura',  // int64_t (usecs)
78c93a13669ce1b5a9e6527b4c86c9d8f5e92be828Lajos Molnar    kKeyPixelFormat       = 'pixf',  // int32_t
79c93a13669ce1b5a9e6527b4c86c9d8f5e92be828Lajos Molnar    kKeyColorFormat       = 'colf',  // int32_t
80c93a13669ce1b5a9e6527b4c86c9d8f5e92be828Lajos Molnar    kKeyColorSpace        = 'cols',  // int32_t
8148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyPlatformPrivate   = 'priv',  // pointer
8248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    kKeyDecoderComponent  = 'decC',  // cstring
83dbc03445db2bbf83b64f0c0a5dc62e61408864d7Andreas Huber    kKeyBufferID          = 'bfID',
84e5adbeee3401915ff8e1a983396ce3554436b11cAndreas Huber    kKeyMaxInputSize      = 'inpS',
85a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang    kKeyMaxWidth          = 'maxW',
86a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang    kKeyMaxHeight         = 'maxH',
877e04dcf8d6784dd56f53aa90bf34431ab4f0710cAndreas Huber    kKeyThumbnailTime     = 'thbT',  // int64_t (usecs)
88dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    kKeyTrackID           = 'trID',
89dcd25efb46c41c8d24a0a9cf61fb57f84149709eGloria Wang    kKeyIsDRM             = 'idrm',  // int32_t (bool)
90b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen    kKeyEncoderDelay      = 'encd',  // int32_t (frames)
91b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen    kKeyEncoderPadding    = 'encp',  // int32_t (frames)
92fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber
93fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbum             = 'albu',  // cstring
94fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyArtist            = 'arti',  // cstring
9566ac4df65516ebfd0e500bfca75dc4b5ef8d674eMarco Nelissen    kKeyAlbumArtist       = 'aart',  // cstring
96fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyComposer          = 'comp',  // cstring
97fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyGenre             = 'genr',  // cstring
98fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyTitle             = 'titl',  // cstring
99fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyYear              = 'year',  // cstring
100fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbumArt          = 'albA',  // compressed image data
101fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber    kKeyAlbumArtMIME      = 'alAM',  // cstring
102bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyAuthor            = 'auth',  // cstring
103bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyCDTrackNumber     = 'cdtr',  // cstring
1046c8a9a4132337a3419a72a735f0b40df0b82061fMarco Nelissen    kKeyDiscNumber        = 'dnum',  // cstring
105bd4bc59262df90dc85752684a1d4a92833a535a3Andreas Huber    kKeyDate              = 'date',  // cstring
10672b8c5ae6a5f97a4fcfc6d23d33159d6ae50179cAndreas Huber    kKeyWriter            = 'writ',  // cstring
10711f8109ad8646d3acd9a0987613229cde59d52c1Marco Nelissen    kKeyCompilation       = 'cpil',  // cstring
1084948818cb91176df74c972ac27b2f392b5d148bcJames Dong    kKeyLocation          = 'loc ',  // cstring
1098f5f2fcee5c12d08df71d17017410c50951fc2e3James Dong    kKeyTimeScale         = 'tmsl',  // int32_t
1108cfad968d5ec429b033caff9743f1ef15090be61Chong Zhang    kKeyCaptureFramerate  = 'capF',  // float (capture fps)
11193d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
112145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    // video profile and level
113145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    kKeyVideoProfile      = 'vprf',  // int32_t
114145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong    kKeyVideoLevel        = 'vlev',  // int32_t
115145bfe5eb3e08c9689c28f6bf3287a979438b04bJames Dong
11693d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Set this key to enable authoring files in 64-bit offset
11793d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKey64BitFileOffset   = 'fobt',  // int32_t (bool)
118b4d5320bda29cd9694461c9b61d0211f801ff0afJames Dong    kKey2ByteNalLength    = '2NAL',  // int32_t (bool)
11993d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
12093d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Identify the file output format for authoring
12193d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Please see <media/mediarecorder.h> for the supported
12293d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // file output formats.
12393d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKeyFileType          = 'ftyp',  // int32_t
12493d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
12593d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // Track authoring progress status
12693d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    // kKeyTrackTimeStatus is used to track progress in elapsed time
12793d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong    kKeyTrackTimeStatus   = 'tktm',  // int64_t
12893d6b102a13afa23bfa80d74c399d93d542e6ad6James Dong
129e756d9753c7cffe2e9731a31fa98a3e8f37151c9ztenghui    kKeyRealTimeRecording = 'rtrc',  // bool (int32_t)
1300dff606f42292b8a31b9eee842877f9875279dabJames Dong    kKeyNumBuffers        = 'nbbf',  // int32_t
131e259531ce59ab1f31de5a23124b22536f6a5a767James Dong
1328ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    // Ogg files can be tagged to be automatically looping...
1338ae49d87b98d57d6758b0c51b95e28a6581a79f1Andreas Huber    kKeyAutoLoop          = 'autL',  // bool (int32_t)
134db6222212528637d8f2afa7f49fc3c8c915bafbeAndreas Huber
135db6222212528637d8f2afa7f49fc3c8c915bafbeAndreas Huber    kKeyValidSamples      = 'valD',  // int32_t
1362b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber
1372b82e9652ba049e754c2cc74e381282f231d5fbfAndreas Huber    kKeyIsUnreadable      = 'unre',  // bool (int32_t)
1386a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis
1396a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    // An indication that a video buffer has been rendered.
1406a9da9fc558263548ebfbae2cbf177eb7454a41bJamie Gennis    kKeyRendered          = 'rend',  // bool (int32_t)
1417a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang
1427a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    // The language code for this media
1437a1e3e81264189e23a1db2b174e1b5a5d4c7d1c3Gloria Wang    kKeyMediaLanguage     = 'lang',  // cstring
1443b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang
1453b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang    // To store the timed text format data
1463b573f7bf1c5736d500e39013b8d32478a1429e6Gloria Wang    kKeyTextFormatData    = 'text',  // raw data
1470bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber
1480bb6b4c5da2451ee0973372b0a3858b15c742689Andreas Huber    kKeyRequiresSecureBuffers = 'secu',  // bool (int32_t)
149ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber
150ed3e3e046840d5bf1ca84a8c0cc097425e89d6d6Andreas Huber    kKeyIsADTS            = 'adts',  // bool (int32_t)
151db170bb1cae145d07efc803a3c208963de0c6087Eric Laurent    kKeyAACAOT            = 'aaot',  // int32_t
1525892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber
1535892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If a MediaBuffer's data represents (at least partially) encrypted
1545892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // data, the following fields aid in decryption.
1555892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // The data can be thought of as pairs of plain and encrypted data
1565892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // fragments, i.e. plain and encrypted data alternate.
1575892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // The first fragment is by convention plain data (if that's not the
1585892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // case, simply specify plain fragment size of 0).
1595892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // kKeyEncryptedSizes and kKeyPlainSizes each map to an array of
1605892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // size_t values. The sum total of all size_t values of both arrays
1615892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // must equal the amount of data (i.e. MediaBuffer's range_length()).
1625892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If both arrays are present, they must be of the same size.
1635892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // If only encrypted sizes are present it is assumed that all
1645892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // plain sizes are 0, i.e. all fragments are encrypted.
1655892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // To programmatically set these array, use the MetaData::setData API, i.e.
1665892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // const size_t encSizes[];
1675892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // meta->setData(
1685892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    //  kKeyEncryptedSizes, 0 /* type */, encSizes, sizeof(encSizes));
1695892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    // A plain sizes array by itself makes no sense.
1705892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyEncryptedSizes    = 'encr',  // size_t[]
1715892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyPlainSizes        = 'plai',  // size_t[]
1725892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyCryptoKey         = 'cryK',  // uint8_t[16]
1735892e3e173f20e01956f318ae7dce43d46c5fc1dAndreas Huber    kKeyCryptoIV          = 'cryI',  // uint8_t[16]
174f69e53033f23f9f70fcdb28a3c2e650de0147459Andreas Huber    kKeyCryptoMode        = 'cryM',  // int32_t
1755544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen
1765544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen    kKeyCryptoDefaultIVSize = 'cryS',  // int32_t
1775544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen
1785544c66ba0aa789a997b376df503a5ffae425dc7Marco Nelissen    kKeyPssh              = 'pssh',  // raw data
179bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang    kKeyCASystemID        = 'caid',  // int32_t
180bc7aae4ff7e72e5bf0fa888f946835840a4357bbChong Zhang    kKeyCASessionID       = 'seid',  // raw data
181dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih
182dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    // Please see MediaFormat.KEY_IS_AUTOSELECT.
183dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    kKeyTrackIsAutoselect = 'auto', // bool (int32_t)
184dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    // Please see MediaFormat.KEY_IS_DEFAULT.
185dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    kKeyTrackIsDefault    = 'dflt', // bool (int32_t)
186dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    // Similar to MediaFormat.KEY_IS_FORCED_SUBTITLE but pertains to av tracks as well.
187dd235727a1b4e283deeb581559f99c2c8889da07Robert Shih    kKeyTrackIsForced     = 'frcd', // bool (int32_t)
188f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih
189f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih    // H264 supplemental enhancement information offsets/sizes
190f8bd851cc652501239a8e3759b21890dfa2afdeaRobert Shih    kKeySEI               = 'sei ', // raw data
1913694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung
1923694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung    // MPEG user data offsets
1933694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung    kKeyMpegUserData      = 'mpud', // size_t[]
1944f2559d3cdeb7187dedca186d5abc65af4bdb031Robert Shih
1954f2559d3cdeb7187dedca186d5abc65af4bdb031Robert Shih    // Size of NALU length in mkv/mp4
1964f2559d3cdeb7187dedca186d5abc65af4bdb031Robert Shih    kKeyNalLengthSize     = 'nals', // int32_t
197caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu
198caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    // HDR related
199d637d296bb0954756d3d231633fad73fadd70316Lajos Molnar    kKeyHdrStaticInfo    = 'hdrS', // HDRStaticInfo
200caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu
201caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    // color aspects
202caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    kKeyColorRange       = 'cRng', // int32_t, color range, value defined by ColorAspects.Range
203caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    kKeyColorPrimaries   = 'cPrm', // int32_t,
204caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu                                   // color Primaries, value defined by ColorAspects.Primaries
205caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    kKeyTransferFunction = 'tFun', // int32_t,
206caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu                                   // transfer Function, value defined by ColorAspects.Transfer.
207caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu    kKeyColorMatrix      = 'cMtx', // int32_t,
208caaa15b1c8ca1632100cf8e64e82007239210339Ronghua Wu                                   // color Matrix, value defined by ColorAspects.MatrixCoeffs.
2094dbff11975e737482537e1636051690188f3fbc4Praveen Chavan    kKeyTemporalLayerId  = 'iLyr', // int32_t, temporal layer-id. 0-based (0 => base layer)
2104dbff11975e737482537e1636051690188f3fbc4Praveen Chavan    kKeyTemporalLayerCount = 'cLyr', // int32_t, number of temporal layers encoded
21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberenum {
21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    kTypeESDS        = 'esds',
21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    kTypeAVCC        = 'avcc',
2163b5a6b9fa6c6825a1d0b441429e2bb365b259827Harish Mahendrakar    kTypeHVCC        = 'hvcc',
217244ba87d20aeb29c9cad727820fa1e803ec3643cJames Dong    kTypeD263        = 'd263',
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberclass MetaData : public RefBase {
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberpublic:
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MetaData();
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MetaData(const MetaData &from);
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    enum Type {
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_NONE     = 'none',
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_C_STRING = 'cstr',
22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_INT32    = 'in32',
22948c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber        TYPE_INT64    = 'in64',
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_FLOAT    = 'floa',
23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        TYPE_POINTER  = 'ptr ',
232f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        TYPE_RECT     = 'rect',
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    void clear();
23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool remove(uint32_t key);
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setCString(uint32_t key, const char *value);
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setInt32(uint32_t key, int32_t value);
24048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    bool setInt64(uint32_t key, int64_t value);
24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setFloat(uint32_t key, float value);
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setPointer(uint32_t key, void *value);
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
244f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    bool setRect(
245f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            uint32_t key,
246f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t left, int32_t top,
247f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t right, int32_t bottom);
248f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
2492cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findCString(uint32_t key, const char **value);
2502cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findInt32(uint32_t key, int32_t *value);
2512cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findInt64(uint32_t key, int64_t *value);
2522cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findFloat(uint32_t key, float *value);
2532cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong    bool findPointer(uint32_t key, void **value);
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
255f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    bool findRect(
256f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            uint32_t key,
257f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber            int32_t *left, int32_t *top,
2582cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong            int32_t *right, int32_t *bottom);
259f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool setData(uint32_t key, uint32_t type, const void *data, size_t size);
26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool findData(uint32_t key, uint32_t *type,
26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                  const void **data, size_t *size) const;
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
265328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé    bool hasData(uint32_t key) const;
266328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé
26769d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen    String8 toString() const;
268feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    void dumpToLog() const;
269feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen
270b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    status_t writeToParcel(Parcel &parcel);
271b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    status_t updateFromParcel(const Parcel &parcel);
272b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen    static sp<MetaData> createFromParcel(const Parcel &parcel);
273b2487f03f12dcafdb801fc0007c8df8412397f44Marco Nelissen
27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprotected:
27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    virtual ~MetaData();
27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberprivate:
27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    struct typed_data {
27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data();
28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        ~typed_data();
28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data(const MetaData::typed_data &);
28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data &operator=(const MetaData::typed_data &);
28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void clear();
28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void setData(uint32_t type, const void *data, size_t size);
28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void getData(uint32_t *type, const void **data, size_t *size) const;
28869d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        // may include hexdump of binary data if verbose=true
28969d3d8a9540b0da787ea0beccad2517f057dd54dMarco Nelissen        String8 asString(bool verbose) const;
29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    private:
29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        uint32_t mType;
29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        size_t mSize;
29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        union {
29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            void *ext_data;
29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            float reservoir;
29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        } u;
29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        bool usesReservoir() const {
30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return mSize <= sizeof(u.reservoir);
30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
304f26400c9d01a0e2f71690d5ebc644270f098d590Marco Nelissen        void *allocateStorage(size_t size);
30520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void freeStorage();
30620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        void *storage() {
30820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return usesReservoir() ? &u.reservoir : u.ext_data;
30920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
31020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
31120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const void *storage() const {
31220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            return usesReservoir() ? &u.reservoir : u.ext_data;
31320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
31420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    };
31520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
316f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    struct Rect {
317f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t mLeft, mTop, mRight, mBottom;
318f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    };
319f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
32020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    KeyedVector<uint32_t, typed_data> mItems;
32120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
32220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    // MetaData &operator=(const MetaData &);
32320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber};
32420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
32520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
32620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
32720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#endif  // META_DATA_H_
328