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