MetaData.cpp revision 0c89199745bc1bf05b997fc7c342017807676b6f
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber/* 220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Copyright (C) 2009 The Android Open Source Project 320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * you may not use this file except in compliance with the License. 620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * You may obtain a copy of the License at 720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * 1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * Unless required by applicable law or agreed to in writing, software 1120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * See the License for the specific language governing permissions and 1420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber * limitations under the License. 1520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber */ 1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <stdlib.h> 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <string.h> 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 200c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber#include <media/stagefright/MediaDebug.h> 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <media/stagefright/MetaData.h> 2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2520111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::MetaData() { 2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::MetaData(const MetaData &from) 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : RefBase(), 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mItems(from.mItems) { 3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::~MetaData() { 3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber clear(); 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::clear() { 3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mItems.clear(); 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 4020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::remove(uint32_t key) { 4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ssize_t i = mItems.indexOfKey(key); 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (i < 0) { 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mItems.removeItemsAt(i); 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setCString(uint32_t key, const char *value) { 5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return setData(key, TYPE_C_STRING, value, strlen(value) + 1); 5520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setInt32(uint32_t key, int32_t value) { 5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return setData(key, TYPE_INT32, &value, sizeof(value)); 5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setFloat(uint32_t key, float value) { 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return setData(key, TYPE_FLOAT, &value, sizeof(value)); 6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setPointer(uint32_t key, void *value) { 6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return setData(key, TYPE_POINTER, &value, sizeof(value)); 6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::findCString(uint32_t key, const char **value) { 7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t type; 7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *data; 7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size; 7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_C_STRING) { 7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *value = (const char *)data; 7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::findInt32(uint32_t key, int32_t *value) { 8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t type; 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *data; 8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size; 8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_INT32) { 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 900c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK_EQ(size, sizeof(*value)); 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *value = *(int32_t *)data; 9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::findFloat(uint32_t key, float *value) { 9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t type; 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *data; 10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size; 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_FLOAT) { 10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1050c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK_EQ(size, sizeof(*value)); 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *value = *(float *)data; 10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::findPointer(uint32_t key, void **value) { 11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t type; 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void *data; 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber size_t size; 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!findData(key, &type, &data, &size) || type != TYPE_POINTER) { 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1200c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber CHECK_EQ(size, sizeof(*value)); 12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *value = *(void **)data; 12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setData( 12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t key, uint32_t type, const void *data, size_t size) { 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber bool overwrote_existing = true; 13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ssize_t i = mItems.indexOfKey(key); 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (i < 0) { 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typed_data item; 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber i = mItems.add(key, item); 13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber overwrote_existing = false; 13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber typed_data &item = mItems.editValueAt(i); 14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber item.setData(type, data, size); 14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return overwrote_existing; 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::findData(uint32_t key, uint32_t *type, 14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const void **data, size_t *size) const { 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber ssize_t i = mItems.indexOfKey(key); 14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (i < 0) { 15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return false; 15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const typed_data &item = mItems.valueAt(i); 15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber item.getData(type, data, size); 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return true; 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16120111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::typed_data() 16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mType(0), 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSize(0) { 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16620111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::~typed_data() { 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber clear(); 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::typed_data(const typed_data &from) 17120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber : mType(from.mType), 17220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSize(0) { 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber allocateStorage(from.mSize); 17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber memcpy(storage(), from.storage(), mSize); 17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17720111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data &MetaData::typed_data::operator=( 17820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber const MetaData::typed_data &from) { 17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (this != &from) { 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber clear(); 18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mType = from.mType; 18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber allocateStorage(from.mSize); 18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber memcpy(storage(), from.storage(), mSize); 18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return *this; 18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::clear() { 19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber freeStorage(); 19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mType = 0; 19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::setData( 19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t type, const void *data, size_t size) { 19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber clear(); 19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mType = type; 20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber allocateStorage(size); 20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber memcpy(storage(), data, size); 20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::getData( 20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber uint32_t *type, const void **data, size_t *size) const { 20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *type = mType; 20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *size = mSize; 20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber *data = storage(); 20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::allocateStorage(size_t size) { 21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSize = size; 21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (usesReservoir()) { 21520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return; 21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber u.ext_data = malloc(mSize); 21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 22020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::freeStorage() { 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (!usesReservoir()) { 22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber if (u.ext_data) { 22420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber free(u.ext_data); 22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber mSize = 0; 22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 23120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 233