MetaData.cpp revision 2cf9c5073ca3342ee52673ad68763fadd2c2be79
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
6148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huberbool MetaData::setInt64(uint32_t key, int64_t value) {
6248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    return setData(key, TYPE_INT64, &value, sizeof(value));
6348c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber}
6448c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setFloat(uint32_t key, float value) {
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return setData(key, TYPE_FLOAT, &value, sizeof(value));
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setPointer(uint32_t key, void *value) {
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return setData(key, TYPE_POINTER, &value, sizeof(value));
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
73f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huberbool MetaData::setRect(
74f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        uint32_t key,
75f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t left, int32_t top,
76f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t right, int32_t bottom) {
77f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    Rect r;
78f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    r.mLeft = left;
79f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    r.mTop = top;
80f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    r.mRight = right;
81f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    r.mBottom = bottom;
82f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
83f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    return setData(key, TYPE_RECT, &r, sizeof(r));
84f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber}
85f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
862cf9c5073ca3342ee52673ad68763fadd2c2be79James Dongbool MetaData::findCString(uint32_t key, const char **value) {
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t type;
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    const void *data;
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t size;
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_C_STRING) {
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return false;
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *value = (const char *)data;
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return true;
9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
992cf9c5073ca3342ee52673ad68763fadd2c2be79James Dongbool MetaData::findInt32(uint32_t key, int32_t *value) {
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t type;
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    const void *data;
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t size;
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_INT32) {
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return false;
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1070c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK_EQ(size, sizeof(*value));
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *value = *(int32_t *)data;
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return true;
11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
11320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1142cf9c5073ca3342ee52673ad68763fadd2c2be79James Dongbool MetaData::findInt64(uint32_t key, int64_t *value) {
11548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    uint32_t type;
11648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    const void *data;
11748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    size_t size;
11848c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_INT64) {
11948c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber        return false;
12048c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    }
12148c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber
12248c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    CHECK_EQ(size, sizeof(*value));
12348c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber
12448c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    *value = *(int64_t *)data;
12548c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber
12648c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber    return true;
12748c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber}
12848c948b1137e7bbdb161b51908657ab72ac5e2daAndreas Huber
1292cf9c5073ca3342ee52673ad68763fadd2c2be79James Dongbool MetaData::findFloat(uint32_t key, float *value) {
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t type;
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    const void *data;
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t size;
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_FLOAT) {
13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return false;
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1370c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK_EQ(size, sizeof(*value));
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *value = *(float *)data;
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return true;
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1442cf9c5073ca3342ee52673ad68763fadd2c2be79James Dongbool MetaData::findPointer(uint32_t key, void **value) {
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    uint32_t type;
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    const void *data;
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    size_t size;
14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_POINTER) {
14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return false;
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1520c89199745bc1bf05b997fc7c342017807676b6fAndreas Huber    CHECK_EQ(size, sizeof(*value));
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *value = *(void **)data;
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return true;
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
159f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huberbool MetaData::findRect(
160f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        uint32_t key,
161f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        int32_t *left, int32_t *top,
1622cf9c5073ca3342ee52673ad68763fadd2c2be79James Dong        int32_t *right, int32_t *bottom) {
163f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    uint32_t type;
164f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    const void *data;
165f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    size_t size;
166f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_RECT) {
167f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber        return false;
168f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    }
169f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
170f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    CHECK_EQ(size, sizeof(Rect));
171f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
172f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    const Rect *r = (const Rect *)data;
173f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    *left = r->mLeft;
174f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    *top = r->mTop;
175f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    *right = r->mRight;
176f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    *bottom = r->mBottom;
177f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
178f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber    return true;
179f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber}
180f5ab57c2d5e02af7483c94eddb177e4f5c9e9892Andreas Huber
18120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::setData(
18220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        uint32_t key, uint32_t type, const void *data, size_t size) {
18320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    bool overwrote_existing = true;
18420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
18520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ssize_t i = mItems.indexOfKey(key);
18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (i < 0) {
18720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        typed_data item;
18820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        i = mItems.add(key, item);
18920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        overwrote_existing = false;
19120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
19220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    typed_data &item = mItems.editValueAt(i);
19420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    item.setData(type, data, size);
19620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
19720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return overwrote_existing;
19820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
19920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool MetaData::findData(uint32_t key, uint32_t *type,
20120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber                        const void **data, size_t *size) const {
20220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    ssize_t i = mItems.indexOfKey(key);
20320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (i < 0) {
20520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return false;
20620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
20720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
20820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    const typed_data &item = mItems.valueAt(i);
20920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    item.getData(type, data, size);
21120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return true;
21320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
21420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
21520111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::typed_data()
21620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    : mType(0),
21720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mSize(0) {
21820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
21920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22020111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::~typed_data() {
22120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    clear();
22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
22320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
22420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data::typed_data(const typed_data &from)
22520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    : mType(from.mType),
22620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber      mSize(0) {
22720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    allocateStorage(from.mSize);
22820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    memcpy(storage(), from.storage(), mSize);
22920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
23020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
23120111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberMetaData::typed_data &MetaData::typed_data::operator=(
23220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        const MetaData::typed_data &from) {
23320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (this != &from) {
23420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        clear();
23520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        mType = from.mType;
23620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        allocateStorage(from.mSize);
23720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        memcpy(storage(), from.storage(), mSize);
23820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
23920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return *this;
24120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
24220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24320111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::clear() {
24420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    freeStorage();
24520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mType = 0;
24720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
24820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
24920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::setData(
25020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        uint32_t type, const void *data, size_t size) {
25120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    clear();
25220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mType = type;
25420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    allocateStorage(size);
25520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    memcpy(storage(), data, size);
25620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
25720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
25820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::getData(
25920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        uint32_t *type, const void **data, size_t *size) const {
26020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *type = mType;
26120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *size = mSize;
26220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    *data = storage();
26320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
26420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::allocateStorage(size_t size) {
26620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mSize = size;
26720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
26820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (usesReservoir()) {
26920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return;
27020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
27120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    u.ext_data = malloc(mSize);
27320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
27420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
27520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid MetaData::typed_data::freeStorage() {
27620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (!usesReservoir()) {
27720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        if (u.ext_data) {
27820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber            free(u.ext_data);
27920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        }
28020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
28120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mSize = 0;
28320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
28420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
28520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
28620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
287