MetaData.cpp revision 566c70caff87c710e659c5aaad0692e031d93ded
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 17feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen//#define LOG_NDEBUG 0 18feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen#define LOG_TAG "MetaData" 19feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen#include <utils/Log.h> 20feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <stdlib.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <string.h> 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24f1d5aa162c02a16b7195a43a9bcea4d592600ac4James Dong#include <media/stagefright/foundation/ADebug.h> 2556997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include <media/stagefright/foundation/AString.h> 2656997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen#include <media/stagefright/foundation/hexdump.h> 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h> 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::MetaData() { 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::MetaData(const MetaData &from) 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : RefBase(), 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mItems(from.mItems) { 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::~MetaData() { 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber clear(); 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::clear() { 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mItems.clear(); 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::remove(uint32_t key) { 4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ssize_t i = mItems.indexOfKey(key); 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (i < 0) { 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mItems.removeItemsAt(i); 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setCString(uint32_t key, const char *value) { 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return setData(key, TYPE_C_STRING, value, strlen(value) + 1); 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setInt32(uint32_t key, int32_t value) { 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return setData(key, TYPE_INT32, &value, sizeof(value)); 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huberbool MetaData::setInt64(uint32_t key, int64_t value) { 6848c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber return setData(key, TYPE_INT64, &value, sizeof(value)); 6948c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber} 7048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setFloat(uint32_t key, float value) { 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return setData(key, TYPE_FLOAT, &value, sizeof(value)); 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setPointer(uint32_t key, void *value) { 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return setData(key, TYPE_POINTER, &value, sizeof(value)); 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 79f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huberbool MetaData::setRect( 80f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber uint32_t key, 81f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t left, int32_t top, 82f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t right, int32_t bottom) { 83f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber Rect r; 84f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber r.mLeft = left; 85f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber r.mTop = top; 86f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber r.mRight = right; 87f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber r.mBottom = bottom; 88f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 89f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber return setData(key, TYPE_RECT, &r, sizeof(r)); 90f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber} 91f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 924256c970ad90bc555eccfd585048669bb69bca1cMarco Nelissen/** 934256c970ad90bc555eccfd585048669bb69bca1cMarco Nelissen * Note that the returned pointer becomes invalid when additional metadata is set. 944256c970ad90bc555eccfd585048669bb69bca1cMarco Nelissen */ 952cf9c5073ca3342ee52673ad68763fadd2c2be79James Dongbool MetaData::findCString(uint32_t key, const char **value) { 9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t type; 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *data; 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size; 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_C_STRING) { 10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *value = (const char *)data; 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1082cf9c5073ca3342ee52673ad68763fadd2c2be79James Dongbool MetaData::findInt32(uint32_t key, int32_t *value) { 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t type; 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *data; 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size; 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_INT32) { 11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1160c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK_EQ(size, sizeof(*value)); 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *value = *(int32_t *)data; 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1232cf9c5073ca3342ee52673ad68763fadd2c2be79James Dongbool MetaData::findInt64(uint32_t key, int64_t *value) { 12448c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber uint32_t type; 12548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber const void *data; 12648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber size_t size; 12748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_INT64) { 12848c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber return false; 12948c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber } 13048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber 13148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber CHECK_EQ(size, sizeof(*value)); 13248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber 13348c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber *value = *(int64_t *)data; 13448c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber 13548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber return true; 13648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber} 13748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber 1382cf9c5073ca3342ee52673ad68763fadd2c2be79James Dongbool MetaData::findFloat(uint32_t key, float *value) { 13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t type; 14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *data; 14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size; 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_FLOAT) { 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1460c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK_EQ(size, sizeof(*value)); 14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *value = *(float *)data; 14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1532cf9c5073ca3342ee52673ad68763fadd2c2be79James Dongbool MetaData::findPointer(uint32_t key, void **value) { 15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t type; 15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *data; 15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size; 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_POINTER) { 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1610c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK_EQ(size, sizeof(*value)); 16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *value = *(void **)data; 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 168f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huberbool MetaData::findRect( 169f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber uint32_t key, 170f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber int32_t *left, int32_t *top, 1712cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong int32_t *right, int32_t *bottom) { 172f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber uint32_t type; 173f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber const void *data; 174f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber size_t size; 175f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_RECT) { 176f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber return false; 177f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber } 178f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 179f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber CHECK_EQ(size, sizeof(Rect)); 180f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 181f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber const Rect *r = (const Rect *)data; 182f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber *left = r->mLeft; 183f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber *top = r->mTop; 184f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber *right = r->mRight; 185f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber *bottom = r->mBottom; 186f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 187f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber return true; 188f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber} 189f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber 19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setData( 19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t key, uint32_t type, const void *data, size_t size) { 19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool overwrote_existing = true; 19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ssize_t i = mItems.indexOfKey(key); 19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (i < 0) { 19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typed_data item; 19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber i = mItems.add(key, item); 19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber overwrote_existing = false; 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typed_data &item = mItems.editValueAt(i); 20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber item.setData(type, data, size); 20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return overwrote_existing; 20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::findData(uint32_t key, uint32_t *type, 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void **data, size_t *size) const { 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ssize_t i = mItems.indexOfKey(key); 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (i < 0) { 21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const typed_data &item = mItems.valueAt(i); 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber item.getData(type, data, size); 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::typed_data() 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mType(0), 22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSize(0) { 22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::~typed_data() { 23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber clear(); 23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 23320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::typed_data(const typed_data &from) 23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mType(from.mType), 23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSize(0) { 23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber allocateStorage(from.mSize); 23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber memcpy(storage(), from.storage(), mSize); 23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24020111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data &MetaData::typed_data::operator=( 24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const MetaData::typed_data &from) { 24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (this != &from) { 24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber clear(); 24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mType = from.mType; 24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber allocateStorage(from.mSize); 24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber memcpy(storage(), from.storage(), mSize); 24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return *this; 25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::clear() { 25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber freeStorage(); 25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mType = 0; 25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::setData( 25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t type, const void *data, size_t size) { 26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber clear(); 26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mType = type; 26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber allocateStorage(size); 264566c70caff87c710e659c5aaad0692e031d93dedMarco Nelissen void *dst = storage(); 265566c70caff87c710e659c5aaad0692e031d93dedMarco Nelissen if (!dst) { 266566c70caff87c710e659c5aaad0692e031d93dedMarco Nelissen ALOGE("Couldn't allocate %zu bytes for item", size); 267566c70caff87c710e659c5aaad0692e031d93dedMarco Nelissen return; 268566c70caff87c710e659c5aaad0692e031d93dedMarco Nelissen } 269566c70caff87c710e659c5aaad0692e031d93dedMarco Nelissen memcpy(dst, data, size); 27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::getData( 27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t *type, const void **data, size_t *size) const { 27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *type = mType; 27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *size = mSize; 27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *data = storage(); 27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::allocateStorage(size_t size) { 28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSize = size; 28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (usesReservoir()) { 28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return; 28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber u.ext_data = malloc(mSize); 28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::freeStorage() { 29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!usesReservoir()) { 29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (u.ext_data) { 29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber free(u.ext_data); 293fca812565cebd229fba8be32bad14983c5252a7bChrister Fletcher u.ext_data = NULL; 29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSize = 0; 29820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 300feba11fd788c99b0b63e0bce724730817688d82fMarco NelissenString8 MetaData::typed_data::asString() const { 301feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen String8 out; 302feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen const void *data = storage(); 303feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen switch(mType) { 304feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen case TYPE_NONE: 305feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen out = String8::format("no type, size %d)", mSize); 306feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen break; 307feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen case TYPE_C_STRING: 308feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen out = String8::format("(char*) %s", (const char *)data); 309feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen break; 310feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen case TYPE_INT32: 311feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen out = String8::format("(int32_t) %d", *(int32_t *)data); 312feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen break; 313feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen case TYPE_INT64: 314feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen out = String8::format("(int64_t) %lld", *(int64_t *)data); 315feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen break; 316feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen case TYPE_FLOAT: 317feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen out = String8::format("(float) %f", *(float *)data); 318feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen break; 319feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen case TYPE_POINTER: 320feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen out = String8::format("(void*) %p", *(void **)data); 321feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen break; 322feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen case TYPE_RECT: 323feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen { 324feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen const Rect *r = (const Rect *)data; 325feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen out = String8::format("Rect(%d, %d, %d, %d)", 326feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen r->mLeft, r->mTop, r->mRight, r->mBottom); 327feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen break; 328feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen } 329feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen 330feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen default: 331feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen out = String8::format("(unknown type %d, size %d)", mType, mSize); 33256997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen if (mSize <= 48) { // if it's less than three lines of hex data, dump it 33356997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen AString foo; 33456997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen hexdump(data, mSize, 0, &foo); 33556997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen out.append("\n"); 33656997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen out.append(foo.c_str()); 33756997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen } 338feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen break; 339feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen } 340feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen return out; 341feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen} 342feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen 343feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissenstatic void MakeFourCCString(uint32_t x, char *s) { 344feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen s[0] = x >> 24; 345feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen s[1] = (x >> 16) & 0xff; 346feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen s[2] = (x >> 8) & 0xff; 347feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen s[3] = x & 0xff; 348feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen s[4] = '\0'; 349feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen} 350feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen 351feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissenvoid MetaData::dumpToLog() const { 352feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen for (int i = mItems.size(); --i >= 0;) { 353feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen int32_t key = mItems.keyAt(i); 354feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen char cc[5]; 355feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen MakeFourCCString(key, cc); 356feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen const typed_data &item = mItems.valueAt(i); 357feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen ALOGI("%s: %s", cc, item.asString().string()); 358feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen } 359feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen} 360feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen 36120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 36220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 363