MetaData.cpp revision 328abde67f57c026ac44e927f9244c40832499c8
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
224328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhébool MetaData::hasData(uint32_t key) const {
225328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé    ssize_t i = mItems.indexOfKey(key);
226328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé
227328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé    if (i < 0) {
228328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé        return false;
229328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé    }
230328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé
231328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé    return true;
232328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé}
233328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::typed_data()
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    : mType(0),
23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mSize(0) {
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::~typed_data() {
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    clear();
24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::typed_data(const typed_data &from)
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    : mType(from.mType),
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mSize(0) {
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    allocateStorage(from.mSize);
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    memcpy(storage(), from.storage(), mSize);
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data &MetaData::typed_data::operator=(
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const MetaData::typed_data &from) {
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (this != &from) {
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        clear();
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mType = from.mType;
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        allocateStorage(from.mSize);
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        memcpy(storage(), from.storage(), mSize);
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return *this;
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::clear() {
26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    freeStorage();
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mType = 0;
26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::setData(
26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        uint32_t type, const void *data, size_t size) {
27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    clear();
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mType = type;
27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    allocateStorage(size);
27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    memcpy(storage(), data, size);
27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::getData(
27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        uint32_t *type, const void **data, size_t *size) const {
27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *type = mType;
28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *size = mSize;
28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *data = storage();
28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::allocateStorage(size_t size) {
28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mSize = size;
28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (usesReservoir()) {
28820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return;
28920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
29020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    u.ext_data = malloc(mSize);
29220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
29320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
29420111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::freeStorage() {
29520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (!usesReservoir()) {
29620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (u.ext_data) {
29720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            free(u.ext_data);
298fca812565cebd229fba8be32bad14983c5252a7bChrister Fletcher            u.ext_data = NULL;
29920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
30020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
30120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
30220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mSize = 0;
30320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
30420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
305feba11fd788c99b0b63e0bce724730817688d82fMarco NelissenString8 MetaData::typed_data::asString() const {
306feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    String8 out;
307feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    const void *data = storage();
308feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    switch(mType) {
309feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        case TYPE_NONE:
310feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            out = String8::format("no type, size %d)", mSize);
311feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            break;
312feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        case TYPE_C_STRING:
313feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            out = String8::format("(char*) %s", (const char *)data);
314feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            break;
315feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        case TYPE_INT32:
316feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            out = String8::format("(int32_t) %d", *(int32_t *)data);
317feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            break;
318feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        case TYPE_INT64:
319feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            out = String8::format("(int64_t) %lld", *(int64_t *)data);
320feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            break;
321feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        case TYPE_FLOAT:
322feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            out = String8::format("(float) %f", *(float *)data);
323feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            break;
324feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        case TYPE_POINTER:
325feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            out = String8::format("(void*) %p", *(void **)data);
326feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            break;
327feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        case TYPE_RECT:
328feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        {
329feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            const Rect *r = (const Rect *)data;
330feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            out = String8::format("Rect(%d, %d, %d, %d)",
331feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen                                  r->mLeft, r->mTop, r->mRight, r->mBottom);
332feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            break;
333feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        }
334feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen
335feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        default:
336feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            out = String8::format("(unknown type %d, size %d)", mType, mSize);
33756997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen            if (mSize <= 48) { // if it's less than three lines of hex data, dump it
33856997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen                AString foo;
33956997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen                hexdump(data, mSize, 0, &foo);
34056997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen                out.append("\n");
34156997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen                out.append(foo.c_str());
34256997121c5031598fbbba7b7c53980b7fd529c2dMarco Nelissen            }
343feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen            break;
344feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    }
345feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    return out;
346feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen}
347feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen
348feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissenstatic void MakeFourCCString(uint32_t x, char *s) {
349feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    s[0] = x >> 24;
350feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    s[1] = (x >> 16) & 0xff;
351feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    s[2] = (x >> 8) & 0xff;
352feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    s[3] = x & 0xff;
353feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    s[4] = '\0';
354feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen}
355feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen
356feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissenvoid MetaData::dumpToLog() const {
357feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    for (int i = mItems.size(); --i >= 0;) {
358feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        int32_t key = mItems.keyAt(i);
359feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        char cc[5];
360feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        MakeFourCCString(key, cc);
361feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        const typed_data &item = mItems.valueAt(i);
362feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen        ALOGI("%s: %s", cc, item.asString().string());
363feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen    }
364feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen}
365feba11fd788c99b0b63e0bce724730817688d82fMarco Nelissen
36620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
36720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
368