MetaData.cpp revision 4650ff0e86f9e815e3152a806a06c700418d071d
1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/* 2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Copyright (C) 2009 The Android Open Source Project 3b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius * Licensed under the Apache License, Version 2.0 (the "License"); 5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * you may not use this file except in compliance with the License. 6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * You may obtain a copy of the License at 7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * http://www.apache.org/licenses/LICENSE-2.0 9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * 10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * Unless required by applicable law or agreed to in writing, software 11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * distributed under the License is distributed on an "AS IS" BASIS, 12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * See the License for the specific language governing permissions and 14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * limitations under the License. 15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */ 16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <stdlib.h> 18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <string.h> 19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <media/stagefright/MediaDebug.h> 21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include <media/stagefright/MetaData.h> 22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 23b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querunamespace android { 24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMetaData::MetaData() { 26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2883a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusMetaData::MetaData(const MetaData &from) 2983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius : RefBase(), 30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mItems(from.mItems) { 31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMetaData::~MetaData() { 34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru clear(); 35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid MetaData::clear() { 38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mItems.clear(); 39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::remove(uint32_t key) { 42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru ssize_t i = mItems.indexOfKey(key); 43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i < 0) { 45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return false; 46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru mItems.removeItemsAt(i); 49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::setCString(uint32_t key, const char *value) { 54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return setData(key, TYPE_C_STRING, value, strlen(value) + 1); 55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::setInt32(uint32_t key, int32_t value) { 5883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return setData(key, TYPE_INT32, &value, sizeof(value)); 5983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 6083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 6183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliusbool MetaData::setInt64(uint32_t key, int64_t value) { 6283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius return setData(key, TYPE_INT64, &value, sizeof(value)); 6383a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::setFloat(uint32_t key, float value) { 66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return setData(key, TYPE_FLOAT, &value, sizeof(value)); 67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::setPointer(uint32_t key, void *value) { 70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return setData(key, TYPE_POINTER, &value, sizeof(value)); 71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 7350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehobool MetaData::setRect( 7483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius uint32_t key, 7583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius int32_t left, int32_t top, 7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho int32_t right, int32_t bottom) { 7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho Rect r; 7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho r.mLeft = left; 7950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho r.mTop = top; 8050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho r.mRight = right; 8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho r.mBottom = bottom; 8283a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return setData(key, TYPE_RECT, &r, sizeof(r)); 8483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehobool MetaData::findCString(uint32_t key, const char **value) const { 8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uint32_t type; 8883a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius const void *data; 8983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius size_t size; 9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if (!findData(key, &type, &data, &size) || type != TYPE_C_STRING) { 9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return false; 9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 9450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho *value = (const char *)data; 9583a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius 9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return true; 9783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius} 9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 9950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehobool MetaData::findInt32(uint32_t key, int32_t *value) const { 100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t type; 101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const void *data; 102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size_t size; 103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!findData(key, &type, &data, &size) || type != TYPE_INT32) { 104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return false; 105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CHECK_EQ(size, sizeof(*value)); 108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *value = *(int32_t *)data; 110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 112b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::findInt64(uint32_t key, int64_t *value) const { 115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t type; 116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const void *data; 117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size_t size; 118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!findData(key, &type, &data, &size) || type != TYPE_INT64) { 119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return false; 120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CHECK_EQ(size, sizeof(*value)); 123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *value = *(int64_t *)data; 125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::findFloat(uint32_t key, float *value) const { 130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t type; 131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const void *data; 132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size_t size; 133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!findData(key, &type, &data, &size) || type != TYPE_FLOAT) { 134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return false; 135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CHECK_EQ(size, sizeof(*value)); 138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *value = *(float *)data; 140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::findPointer(uint32_t key, void **value) const { 145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t type; 146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru const void *data; 147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru size_t size; 148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!findData(key, &type, &data, &size) || type != TYPE_POINTER) { 149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return false; 150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CHECK_EQ(size, sizeof(*value)); 153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *value = *(void **)data; 155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return true; 157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querubool MetaData::findRect( 160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t key, 161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru int32_t *left, int32_t *top, 162b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru int32_t *right, int32_t *bottom) const { 163b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru uint32_t type; 164b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const void *data; 165b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru size_t size; 166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (!findData(key, &type, &data, &size) || type != TYPE_RECT) { 167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return false; 168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru CHECK_EQ(size, sizeof(Rect)); 171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 172b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const Rect *r = (const Rect *)data; 173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *left = r->mLeft; 174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *top = r->mTop; 175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *right = r->mRight; 176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *bottom = r->mBottom; 177b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 178b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return true; 179b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 180b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 181b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubool MetaData::setData( 182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru uint32_t key, uint32_t type, const void *data, size_t size) { 183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru bool overwrote_existing = true; 184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 185b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ssize_t i = mItems.indexOfKey(key); 186b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru if (i < 0) { 187b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru typed_data item; 188b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru i = mItems.add(key, item); 189b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 190b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru overwrote_existing = false; 191b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru } 192b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 193b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru typed_data &item = mItems.editValueAt(i); 194b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 195b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru item.setData(type, data, size); 196b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 197b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return overwrote_existing; 198b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 199b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 200b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Querubool MetaData::findData(uint32_t key, uint32_t *type, 201b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const void **data, size_t *size) const { 202b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru ssize_t i = mItems.indexOfKey(key); 203b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru if (i < 0) { 205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru return false; 206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru } 207b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 208b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru const typed_data &item = mItems.valueAt(i); 209b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 210b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru item.getData(type, data, size); 211b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 212b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru return true; 213b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 214b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 215b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste QueruMetaData::typed_data::typed_data() 216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru : mType(0), 217b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru mSize(0) { 218b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru} 219b0ac937921a2c196d8b9da665135bf6ba01a1ccfJean-Baptiste Queru 220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruMetaData::typed_data::~typed_data() { 221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru clear(); 222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru} 223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru 224b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoMetaData::typed_data::typed_data(const typed_data &from) 225b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho : mType(from.mType), 226b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho mSize(0) { 227b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho allocateStorage(from.mSize); 228b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho memcpy(storage(), from.storage(), mSize); 229b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 230b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 231b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehoMetaData::typed_data &MetaData::typed_data::operator=( 232b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho const MetaData::typed_data &from) { 233b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho if (this != &from) { 234b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho clear(); 235b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho mType = from.mType; 236b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho allocateStorage(from.mSize); 237b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho memcpy(storage(), from.storage(), mSize); 238b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho } 239b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 240b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho return *this; 241b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 242b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 243b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid MetaData::typed_data::clear() { 244b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho freeStorage(); 245b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 246b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho mType = 0; 247b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 248b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 249b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid MetaData::typed_data::setData( 250b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uint32_t type, const void *data, size_t size) { 251b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho clear(); 252b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 253b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho mType = type; 254b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho allocateStorage(size); 255b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho memcpy(storage(), data, size); 256b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho} 257b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho 258b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2clairehovoid MetaData::typed_data::getData( 259b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho uint32_t *type, const void **data, size_t *size) const { 260b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *type = mType; 261b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *size = mSize; 262b26ce3a7367e4ed2ee7ddddcdc3f3d3377a455c2claireho *data = storage(); 263} 264 265void MetaData::typed_data::allocateStorage(size_t size) { 266 mSize = size; 267 268 if (usesReservoir()) { 269 return; 270 } 271 272 u.ext_data = malloc(mSize); 273} 274 275void MetaData::typed_data::freeStorage() { 276 if (!usesReservoir()) { 277 if (u.ext_data) { 278 free(u.ext_data); 279 } 280 } 281 282 mSize = 0; 283} 284 285} // namespace android 286 287