MetaData.cpp revision feba11fd788c99b0b63e0bce724730817688d82f
18eb69d60c09c1c4683066a94c889df28d0e9d233James Dong/* 28eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Copyright (C) 2009 The Android Open Source Project 38eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * 48eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 58eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * you may not use this file except in compliance with the License. 68eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * You may obtain a copy of the License at 78eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * 88eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * http://www.apache.org/licenses/LICENSE-2.0 98eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * 108eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Unless required by applicable law or agreed to in writing, software 118eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * distributed under the License is distributed on an "AS IS" BASIS, 128eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * See the License for the specific language governing permissions and 148eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * limitations under the License. 158eb69d60c09c1c4683066a94c889df28d0e9d233James Dong */ 168eb69d60c09c1c4683066a94c889df28d0e9d233James Dong 179a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber//#define LOG_NDEBUG 0 189a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber#define LOG_TAG "MetaData" 199a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber#include <utils/Log.h> 209a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 21e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <stdlib.h> 22e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <string.h> 23e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 24e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h> 25e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/MetaData.h> 2614acc736e336cbd6026df781d4f411e908831815Andreas Huber 27b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Hubernamespace android { 28b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 29b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas HuberMetaData::MetaData() { 30b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 31b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 32e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberMetaData::MetaData(const MetaData &from) 33e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber : RefBase(), 34e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mItems(from.mItems) { 35e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 36e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 37e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberMetaData::~MetaData() { 38e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber clear(); 39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 40e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 41e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MetaData::clear() { 42e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mItems.clear(); 43b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 44e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberbool MetaData::remove(uint32_t key) { 46e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber ssize_t i = mItems.indexOfKey(key); 47e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 48e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (i < 0) { 49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return false; 50e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 51e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mItems.removeItemsAt(i); 53e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 54e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return true; 55e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 579a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huberbool MetaData::setCString(uint32_t key, const char *value) { 58e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return setData(key, TYPE_C_STRING, value, strlen(value) + 1); 59e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 60e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 61e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberbool MetaData::setInt32(uint32_t key, int32_t value) { 62e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return setData(key, TYPE_INT32, &value, sizeof(value)); 63e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 64e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 65e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberbool MetaData::setInt64(uint32_t key, int64_t value) { 66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return setData(key, TYPE_INT64, &value, sizeof(value)); 67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 689a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 69e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberbool MetaData::setFloat(uint32_t key, float value) { 70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber return setData(key, TYPE_FLOAT, &value, sizeof(value)); 71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber} 72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberbool MetaData::setPointer(uint32_t key, void *value) { 74e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return setData(key, TYPE_POINTER, &value, sizeof(value)); 75e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 76b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 77b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::setRect( 78e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t key, 79e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber int32_t left, int32_t top, 80e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber int32_t right, int32_t bottom) { 81e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber Rect r; 82e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber r.mLeft = left; 83e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber r.mTop = top; 84e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber r.mRight = right; 85e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber r.mBottom = bottom; 86e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 87e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return setData(key, TYPE_RECT, &r, sizeof(r)); 88e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 89e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 90f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool MetaData::findCString(uint32_t key, const char **value) { 919a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber uint32_t type; 929a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber const void *data; 93df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block size_t size; 949a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_C_STRING) { 959a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber return false; 969a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber } 97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber *value = (const char *)data; 99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber 1009a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber return true; 1019a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber} 1029a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 103f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool MetaData::findInt32(uint32_t key, int32_t *value) { 1049a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber uint32_t type; 105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber const void *data; 1069a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber size_t size; 107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_INT32) { 1089a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber return false; 109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber } 110e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 111e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber CHECK_EQ(size, sizeof(*value)); 112e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 113e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber *value = *(int32_t *)data; 11414acc736e336cbd6026df781d4f411e908831815Andreas Huber 115e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return true; 116e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 1179a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 1189a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huberbool MetaData::findInt64(uint32_t key, int64_t *value) { 119e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t type; 120e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber const void *data; 121b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber size_t size; 122b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_INT64) { 123b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return false; 124b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber } 125b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 126b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber CHECK_EQ(size, sizeof(*value)); 127b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 128b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber *value = *(int64_t *)data; 129b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 130b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return true; 131b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 132b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 133b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::findFloat(uint32_t key, float *value) { 134b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber uint32_t type; 135b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber const void *data; 136b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber size_t size; 137b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_FLOAT) { 138b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return false; 139b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber } 140b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 141b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber CHECK_EQ(size, sizeof(*value)); 142b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 143b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber *value = *(float *)data; 144b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 145b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return true; 146b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 147b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 148b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::findPointer(uint32_t key, void **value) { 149b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber uint32_t type; 150b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber const void *data; 151b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber size_t size; 152b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_POINTER) { 153b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return false; 154b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber } 155b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 156b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber CHECK_EQ(size, sizeof(*value)); 157b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 158b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber *value = *(void **)data; 159b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 160b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return true; 161b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 162b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 163b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::findRect( 164b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber uint32_t key, 165b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber int32_t *left, int32_t *top, 166b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber int32_t *right, int32_t *bottom) { 167b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber uint32_t type; 168b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber const void *data; 169b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber size_t size; 170b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_RECT) { 171b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return false; 172b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber } 173b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 174b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber CHECK_EQ(size, sizeof(Rect)); 175b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 176b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber const Rect *r = (const Rect *)data; 177b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber *left = r->mLeft; 178b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber *top = r->mTop; 179b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber *right = r->mRight; 180b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber *bottom = r->mBottom; 181b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 182b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return true; 183b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 184b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 185b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::setData( 186b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber uint32_t key, uint32_t type, const void *data, size_t size) { 187b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber bool overwrote_existing = true; 188b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 189b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber ssize_t i = mItems.indexOfKey(key); 190b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber if (i < 0) { 191b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber typed_data item; 192b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber i = mItems.add(key, item); 193b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 194b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber overwrote_existing = false; 195b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber } 196b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 197b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber typed_data &item = mItems.editValueAt(i); 198b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 199b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber item.setData(type, data, size); 200b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 201b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return overwrote_existing; 202b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 203b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 204b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::findData(uint32_t key, uint32_t *type, 205b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber const void **data, size_t *size) const { 206b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber ssize_t i = mItems.indexOfKey(key); 207b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 208b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber if (i < 0) { 209b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return false; 210b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber } 211b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 212b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber const typed_data &item = mItems.valueAt(i); 213b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 214b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber item.getData(type, data, size); 215b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 216b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return true; 217b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 218b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 219b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas HuberMetaData::typed_data::typed_data() 220b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber : mType(0), 221b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber mSize(0) { 222b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 223b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 224b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas HuberMetaData::typed_data::~typed_data() { 225b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber clear(); 226b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 227b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 228b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas HuberMetaData::typed_data::typed_data(const typed_data &from) 229b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber : mType(from.mType), 230b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber mSize(0) { 231b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber allocateStorage(from.mSize); 232b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber memcpy(storage(), from.storage(), mSize); 233b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 234b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 235b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas HuberMetaData::typed_data &MetaData::typed_data::operator=( 236b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber const MetaData::typed_data &from) { 237b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber if (this != &from) { 238b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber clear(); 239b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber mType = from.mType; 240b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber allocateStorage(from.mSize); 241b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber memcpy(storage(), from.storage(), mSize); 242b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber } 243b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 244b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber return *this; 245b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 246b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 247b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Hubervoid MetaData::typed_data::clear() { 248b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber freeStorage(); 249b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 250b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber mType = 0; 251b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} 252b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 253b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Hubervoid MetaData::typed_data::setData( 254b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber uint32_t type, const void *data, size_t size) { 255b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber clear(); 256b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 257b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber mType = type; 258e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber allocateStorage(size); 259e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber memcpy(storage(), data, size); 260e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 261e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 262e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MetaData::typed_data::getData( 263e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber uint32_t *type, const void **data, size_t *size) const { 264e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber *type = mType; 265e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber *size = mSize; 266b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang *data = storage(); 267e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 268e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 269e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MetaData::typed_data::allocateStorage(size_t size) { 270e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mSize = size; 271e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 272e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (usesReservoir()) { 273e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return; 274e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 275e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 276e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber u.ext_data = malloc(mSize); 277e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 278e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 279e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MetaData::typed_data::freeStorage() { 280e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (!usesReservoir()) { 281e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber if (u.ext_data) { 282e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber free(u.ext_data); 283e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 284e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 285e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 286e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber mSize = 0; 287e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 288e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 289e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberString8 MetaData::typed_data::asString() const { 290e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber String8 out; 291e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber const void *data = storage(); 292e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber switch(mType) { 293e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case TYPE_NONE: 294e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber out = String8::format("no type, size %d)", mSize); 295e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 296e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case TYPE_C_STRING: 297e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber out = String8::format("(char*) %s", (const char *)data); 298b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber break; 299b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber case TYPE_INT32: 300e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber out = String8::format("(int32_t) %d", *(int32_t *)data); 301e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 302e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case TYPE_INT64: 303e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber out = String8::format("(int64_t) %lld", *(int64_t *)data); 304e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 305e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber case TYPE_FLOAT: 306e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber out = String8::format("(float) %f", *(float *)data); 307e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 3089a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber case TYPE_POINTER: 3099a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber out = String8::format("(void*) %p", *(void **)data); 3109a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber break; 3113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block case TYPE_RECT: 3129a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber { 313e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber const Rect *r = (const Rect *)data; 314e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber out = String8::format("Rect(%d, %d, %d, %d)", 315e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber r->mLeft, r->mTop, r->mRight, r->mBottom); 316e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 3179a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber } 3189a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber 319e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber default: 320e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber out = String8::format("(unknown type %d, size %d)", mType, mSize); 321e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber break; 322e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber } 323e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return out; 324e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 3252df788fb0c402938f827bf9c9ce2ca3ab1dcd464Mathias Agopian 32693d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huberstatic void MakeFourCCString(uint32_t x, char *s) { 327e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber s[0] = x >> 24; 3282df788fb0c402938f827bf9c9ce2ca3ab1dcd464Mathias Agopian s[1] = (x >> 16) & 0xff; 329e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber s[2] = (x >> 8) & 0xff; 330e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber s[3] = x & 0xff; 331e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber s[4] = '\0'; 332e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 333e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 334e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MetaData::dumpToLog() const { 335e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber for (int i = mItems.size(); --i >= 0;) { 336e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber int32_t key = mItems.keyAt(i); 337e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber char cc[5]; 338e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber MakeFourCCString(key, cc); 339b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber const typed_data &item = mItems.valueAt(i); 340b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber ALOGI("%s: %s", cc, item.asString().string()); 341b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber } 342e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 343b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 344b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber} // namespace android 345b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber 346e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber