MetaData.cpp revision 5b5d1f87f1cfdd631c5d4ea5c60e1dae910a9203
10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2009 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville//#define LOG_NDEBUG 0 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#define LOG_TAG "MetaData" 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <inttypes.h> 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <utils/Log.h> 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <stdlib.h> 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <string.h> 24ded9c0af7fa49504c047275ed34c2d3b22bf0c3aWink Saville 258fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan#include <media/stagefright/foundation/ADebug.h> 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <media/stagefright/foundation/AString.h> 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <media/stagefright/foundation/hexdump.h> 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville#include <media/stagefright/MetaData.h> 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillenamespace android { 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 32d720945f2be5ea5fe0faf67e67d9ea0e184eba67Alex YakavenkaMetaData::MetaData() { 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 358fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit MahajanMetaData::MetaData(const MetaData &from) 368fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan : RefBase(), 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mItems(from.mItems) { 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 400825495a331bb44df395a0cdb79fab85e68db5d5Wink SavilleMetaData::~MetaData() { 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville clear(); 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillevoid MetaData::clear() { 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mItems.clear(); 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::remove(uint32_t key) { 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ssize_t i = mItems.indexOfKey(key); 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (i < 0) { 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mItems.removeItemsAt(i); 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::setCString(uint32_t key, const char *value) { 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return setData(key, TYPE_C_STRING, value, strlen(value) + 1); 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::setInt32(uint32_t key, int32_t value) { 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return setData(key, TYPE_INT32, &value, sizeof(value)); 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::setInt64(uint32_t key, int64_t value) { 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return setData(key, TYPE_INT64, &value, sizeof(value)); 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::setFloat(uint32_t key, float value) { 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return setData(key, TYPE_FLOAT, &value, sizeof(value)); 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::setPointer(uint32_t key, void *value) { 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return setData(key, TYPE_POINTER, &value, sizeof(value)); 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::setRect( 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t key, 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int32_t left, int32_t top, 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int32_t right, int32_t bottom) { 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Rect r; 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville r.mLeft = left; 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville r.mTop = top; 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville r.mRight = right; 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville r.mBottom = bottom; 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return setData(key, TYPE_RECT, &r, sizeof(r)); 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/** 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Note that the returned pointer becomes invalid when additional metadata is set. 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::findCString(uint32_t key, const char **value) { 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t type; 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const void *data; 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville size_t size; 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!findData(key, &type, &data, &size) || type != TYPE_C_STRING) { 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *value = (const char *)data; 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::findInt32(uint32_t key, int32_t *value) { 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t type = 0; 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const void *data; 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville size_t size; 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!findData(key, &type, &data, &size) || type != TYPE_INT32) { 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CHECK_EQ(size, sizeof(*value)); 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *value = *(int32_t *)data; 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::findInt64(uint32_t key, int64_t *value) { 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t type = 0; 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const void *data; 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville size_t size; 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!findData(key, &type, &data, &size) || type != TYPE_INT64) { 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CHECK_EQ(size, sizeof(*value)); 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *value = *(int64_t *)data; 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::findFloat(uint32_t key, float *value) { 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t type = 0; 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const void *data; 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville size_t size; 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!findData(key, &type, &data, &size) || type != TYPE_FLOAT) { 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CHECK_EQ(size, sizeof(*value)); 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *value = *(float *)data; 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::findPointer(uint32_t key, void **value) { 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t type = 0; 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const void *data; 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville size_t size; 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!findData(key, &type, &data, &size) || type != TYPE_POINTER) { 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CHECK_EQ(size, sizeof(*value)); 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *value = *(void **)data; 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::findRect( 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t key, 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int32_t *left, int32_t *top, 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int32_t *right, int32_t *bottom) { 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t type = 0; 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const void *data; 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville size_t size; 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!findData(key, &type, &data, &size) || type != TYPE_RECT) { 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CHECK_EQ(size, sizeof(Rect)); 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const Rect *r = (const Rect *)data; 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *left = r->mLeft; 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *top = r->mTop; 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *right = r->mRight; 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *bottom = r->mBottom; 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::setData( 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t key, uint32_t type, const void *data, size_t size) { 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville bool overwrote_existing = true; 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ssize_t i = mItems.indexOfKey(key); 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (i < 0) { 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville typed_data item; 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville i = mItems.add(key, item); 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville overwrote_existing = false; 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville typed_data &item = mItems.editValueAt(i); 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville item.setData(type, data, size); 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return overwrote_existing; 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::findData(uint32_t key, uint32_t *type, 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const void **data, size_t *size) const { 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ssize_t i = mItems.indexOfKey(key); 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (i < 0) { 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const typed_data &item = mItems.valueAt(i); 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville item.getData(type, data, size); 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillebool MetaData::hasData(uint32_t key) const { 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ssize_t i = mItems.indexOfKey(key); 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (i < 0) { 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return false; 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return true; 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink SavilleMetaData::typed_data::typed_data() 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville : mType(0), 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSize(0) { 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink SavilleMetaData::typed_data::~typed_data() { 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville clear(); 2420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2440825495a331bb44df395a0cdb79fab85e68db5d5Wink SavilleMetaData::typed_data::typed_data(const typed_data &from) 2450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville : mType(from.mType), 2460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSize(0) { 2470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void *dst = allocateStorage(from.mSize); 2490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (dst) { 2500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville memcpy(dst, from.storage(), mSize); 2510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2540825495a331bb44df395a0cdb79fab85e68db5d5Wink SavilleMetaData::typed_data &MetaData::typed_data::operator=( 2550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const MetaData::typed_data &from) { 2560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (this != &from) { 2570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville clear(); 2580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mType = from.mType; 2590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void *dst = allocateStorage(from.mSize); 2600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (dst) { 2610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville memcpy(dst, from.storage(), mSize); 2620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return *this; 2660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2680825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillevoid MetaData::typed_data::clear() { 2690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville freeStorage(); 2700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mType = 0; 2720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2740825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillevoid MetaData::typed_data::setData( 2750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t type, const void *data, size_t size) { 2760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville clear(); 2770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mType = type; 2790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville void *dst = allocateStorage(size); 2810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (dst) { 2820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville memcpy(dst, data, size); 2830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2860825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillevoid MetaData::typed_data::getData( 2870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville uint32_t *type, const void **data, size_t *size) const { 2880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *type = mType; 2890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *size = mSize; 2900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville *data = storage(); 2910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 2920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2930825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillevoid *MetaData::typed_data::allocateStorage(size_t size) { 2940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSize = size; 2950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (usesReservoir()) { 2970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return &u.reservoir; 2980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville u.ext_data = malloc(mSize); 3010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (u.ext_data == NULL) { 3020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ALOGE("Couldn't allocate %zu bytes for item", size); 3030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSize = 0; 3040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return u.ext_data; 3060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 3070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3080825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillevoid MetaData::typed_data::freeStorage() { 3090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (!usesReservoir()) { 3100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (u.ext_data) { 3110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville free(u.ext_data); 3120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville u.ext_data = NULL; 3130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mSize = 0; 3170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 3180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3190825495a331bb44df395a0cdb79fab85e68db5d5Wink SavilleString8 MetaData::typed_data::asString() const { 3200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville String8 out; 3210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const void *data = storage(); 3220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch(mType) { 3230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case TYPE_NONE: 3240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville out = String8::format("no type, size %zu)", mSize); 3250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case TYPE_C_STRING: 3270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville out = String8::format("(char*) %s", (const char *)data); 3280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case TYPE_INT32: 3300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville out = String8::format("(int32_t) %d", *(int32_t *)data); 3310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case TYPE_INT64: 3330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville out = String8::format("(int64_t) %" PRId64, *(int64_t *)data); 3340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case TYPE_FLOAT: 3360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville out = String8::format("(float) %f", *(float *)data); 3370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case TYPE_POINTER: 3390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville out = String8::format("(void*) %p", *(void **)data); 3400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case TYPE_RECT: 3420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville { 3430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville const Rect *r = (const Rect *)data; 3440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville out = String8::format("Rect(%d, %d, %d, %d)", 3450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville r->mLeft, r->mTop, r->mRight, r->mBottom); 3460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 3500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville out = String8::format("(unknown type %d, size %zu)", mType, mSize); 3510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville if (mSize <= 48) { // if it's less than three lines of hex data, dump it 3520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville AString foo; 3530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville hexdump(data, mSize, 0, &foo); 3540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville out.append("\n"); 3550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville out.append(foo.c_str()); 3560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville break; 3580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return out; 3600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 3610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3620825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillestatic void MakeFourCCString(uint32_t x, char *s) { 3630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville s[0] = x >> 24; 3640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville s[1] = (x >> 16) & 0xff; 3650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville s[2] = (x >> 8) & 0xff; 3660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville s[3] = x & 0xff; 3670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville s[4] = '\0'; 3680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 3690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3708fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajanvoid MetaData::dumpToLog() const { 3710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville for (int i = mItems.size(); --i >= 0;) { 3720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville int32_t key = mItems.keyAt(i); 3730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville char cc[5]; 3740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville MakeFourCCString(key, cc); 3758fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan const typed_data &item = mItems.valueAt(i); 3760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville ALOGI("%s: %s", cc, item.asString().string()); 3770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 3780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 3790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3808fa6dfb2cbdc35ea4d70add3f8d9172d2e18d650Amit Mahajan} // namespace android 3810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 3820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville