MetaData.cpp revision feba11fd788c99b0b63e0bce724730817688d82f
18eb69d60c09c1c4683066a94c889df28d0e9d233James Dong/*
28eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Copyright (C) 2009 The Android Open Source Project
38eb69d60c09c1c4683066a94c889df28d0e9d233James Dong *
48eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Licensed under the Apache License, Version 2.0 (the "License");
58eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * you may not use this file except in compliance with the License.
68eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * You may obtain a copy of the License at
78eb69d60c09c1c4683066a94c889df28d0e9d233James Dong *
88eb69d60c09c1c4683066a94c889df28d0e9d233James Dong *      http://www.apache.org/licenses/LICENSE-2.0
98eb69d60c09c1c4683066a94c889df28d0e9d233James Dong *
108eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * Unless required by applicable law or agreed to in writing, software
118eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * distributed under the License is distributed on an "AS IS" BASIS,
128eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * See the License for the specific language governing permissions and
148eb69d60c09c1c4683066a94c889df28d0e9d233James Dong * limitations under the License.
158eb69d60c09c1c4683066a94c889df28d0e9d233James Dong */
168eb69d60c09c1c4683066a94c889df28d0e9d233James Dong
179a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber//#define LOG_NDEBUG 0
189a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber#define LOG_TAG "MetaData"
199a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber#include <utils/Log.h>
209a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
21e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <stdlib.h>
22e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <string.h>
23e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
24e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/foundation/ADebug.h>
25e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber#include <media/stagefright/MetaData.h>
2614acc736e336cbd6026df781d4f411e908831815Andreas Huber
27b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Hubernamespace android {
28b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
29b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas HuberMetaData::MetaData() {
30b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
31b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
32e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberMetaData::MetaData(const MetaData &from)
33e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    : RefBase(),
34e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber      mItems(from.mItems) {
35e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
36e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
37e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberMetaData::~MetaData() {
38e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    clear();
39e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
40e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
41e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MetaData::clear() {
42e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    mItems.clear();
43b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
44e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
45e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberbool MetaData::remove(uint32_t key) {
46e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    ssize_t i = mItems.indexOfKey(key);
47e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
48e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    if (i < 0) {
49e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        return false;
50e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
51e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
52e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    mItems.removeItemsAt(i);
53e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
54e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return true;
55e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
56f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
579a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huberbool MetaData::setCString(uint32_t key, const char *value) {
58e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return setData(key, TYPE_C_STRING, value, strlen(value) + 1);
59e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
60e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
61e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberbool MetaData::setInt32(uint32_t key, int32_t value) {
62e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return setData(key, TYPE_INT32, &value, sizeof(value));
63e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
64e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
65e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberbool MetaData::setInt64(uint32_t key, int64_t value) {
66f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return setData(key, TYPE_INT64, &value, sizeof(value));
67f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
689a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
69e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberbool MetaData::setFloat(uint32_t key, float value) {
70f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    return setData(key, TYPE_FLOAT, &value, sizeof(value));
71f933441648ef6a71dee783d733aac17b9508b452Andreas Huber}
72f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberbool MetaData::setPointer(uint32_t key, void *value) {
74e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return setData(key, TYPE_POINTER, &value, sizeof(value));
75e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
76b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
77b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::setRect(
78e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        uint32_t key,
79e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        int32_t left, int32_t top,
80e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        int32_t right, int32_t bottom) {
81e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    Rect r;
82e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    r.mLeft = left;
83e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    r.mTop = top;
84e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    r.mRight = right;
85e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    r.mBottom = bottom;
86e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
87e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return setData(key, TYPE_RECT, &r, sizeof(r));
88e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
89e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
90f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool MetaData::findCString(uint32_t key, const char **value) {
919a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    uint32_t type;
929a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    const void *data;
93df64d15042bbd5e0e4933ac49bf3c177dd94752cSteve Block    size_t size;
949a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_C_STRING) {
959a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        return false;
969a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    }
97f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
98f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    *value = (const char *)data;
99f933441648ef6a71dee783d733aac17b9508b452Andreas Huber
1009a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    return true;
1019a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber}
1029a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
103f933441648ef6a71dee783d733aac17b9508b452Andreas Huberbool MetaData::findInt32(uint32_t key, int32_t *value) {
1049a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    uint32_t type;
105f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    const void *data;
1069a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber    size_t size;
107f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_INT32) {
1089a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        return false;
109f933441648ef6a71dee783d733aac17b9508b452Andreas Huber    }
110e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
111e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    CHECK_EQ(size, sizeof(*value));
112e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
113e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    *value = *(int32_t *)data;
11414acc736e336cbd6026df781d4f411e908831815Andreas Huber
115e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return true;
116e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
1179a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
1189a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huberbool MetaData::findInt64(uint32_t key, int64_t *value) {
119e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    uint32_t type;
120e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    const void *data;
121b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    size_t size;
122b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_INT64) {
123b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        return false;
124b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    }
125b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
126b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    CHECK_EQ(size, sizeof(*value));
127b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
128b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    *value = *(int64_t *)data;
129b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
130b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    return true;
131b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
132b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
133b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::findFloat(uint32_t key, float *value) {
134b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    uint32_t type;
135b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    const void *data;
136b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    size_t size;
137b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_FLOAT) {
138b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        return false;
139b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    }
140b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
141b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    CHECK_EQ(size, sizeof(*value));
142b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
143b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    *value = *(float *)data;
144b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
145b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    return true;
146b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
147b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
148b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::findPointer(uint32_t key, void **value) {
149b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    uint32_t type;
150b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    const void *data;
151b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    size_t size;
152b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_POINTER) {
153b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        return false;
154b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    }
155b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
156b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    CHECK_EQ(size, sizeof(*value));
157b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
158b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    *value = *(void **)data;
159b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
160b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    return true;
161b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
162b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
163b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::findRect(
164b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        uint32_t key,
165b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        int32_t *left, int32_t *top,
166b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        int32_t *right, int32_t *bottom) {
167b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    uint32_t type;
168b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    const void *data;
169b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    size_t size;
170b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    if (!findData(key, &type, &data, &size) || type != TYPE_RECT) {
171b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        return false;
172b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    }
173b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
174b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    CHECK_EQ(size, sizeof(Rect));
175b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
176b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    const Rect *r = (const Rect *)data;
177b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    *left = r->mLeft;
178b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    *top = r->mTop;
179b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    *right = r->mRight;
180b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    *bottom = r->mBottom;
181b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
182b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    return true;
183b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
184b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
185b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::setData(
186b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        uint32_t key, uint32_t type, const void *data, size_t size) {
187b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    bool overwrote_existing = true;
188b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
189b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    ssize_t i = mItems.indexOfKey(key);
190b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    if (i < 0) {
191b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        typed_data item;
192b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        i = mItems.add(key, item);
193b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
194b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        overwrote_existing = false;
195b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    }
196b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
197b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    typed_data &item = mItems.editValueAt(i);
198b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
199b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    item.setData(type, data, size);
200b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
201b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    return overwrote_existing;
202b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
203b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
204b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huberbool MetaData::findData(uint32_t key, uint32_t *type,
205b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber                        const void **data, size_t *size) const {
206b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    ssize_t i = mItems.indexOfKey(key);
207b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
208b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    if (i < 0) {
209b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        return false;
210b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    }
211b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
212b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    const typed_data &item = mItems.valueAt(i);
213b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
214b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    item.getData(type, data, size);
215b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
216b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    return true;
217b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
218b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
219b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas HuberMetaData::typed_data::typed_data()
220b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    : mType(0),
221b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber      mSize(0) {
222b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
223b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
224b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas HuberMetaData::typed_data::~typed_data() {
225b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    clear();
226b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
227b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
228b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas HuberMetaData::typed_data::typed_data(const typed_data &from)
229b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    : mType(from.mType),
230b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber      mSize(0) {
231b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    allocateStorage(from.mSize);
232b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    memcpy(storage(), from.storage(), mSize);
233b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
234b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
235b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas HuberMetaData::typed_data &MetaData::typed_data::operator=(
236b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        const MetaData::typed_data &from) {
237b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    if (this != &from) {
238b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        clear();
239b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        mType = from.mType;
240b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        allocateStorage(from.mSize);
241b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        memcpy(storage(), from.storage(), mSize);
242b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    }
243b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
244b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    return *this;
245b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
246b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
247b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Hubervoid MetaData::typed_data::clear() {
248b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    freeStorage();
249b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
250b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    mType = 0;
251b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}
252b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
253b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Hubervoid MetaData::typed_data::setData(
254b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        uint32_t type, const void *data, size_t size) {
255b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    clear();
256b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
257b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    mType = type;
258e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    allocateStorage(size);
259e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    memcpy(storage(), data, size);
260e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
261e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
262e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MetaData::typed_data::getData(
263e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        uint32_t *type, const void **data, size_t *size) const {
264e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    *type = mType;
265e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    *size = mSize;
266b483c4724846c0b8d4e82afcbb7c17f671bae81cGloria Wang    *data = storage();
267e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
268e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
269e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MetaData::typed_data::allocateStorage(size_t size) {
270e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    mSize = size;
271e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
272e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    if (usesReservoir()) {
273e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        return;
274e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
275e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
276e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    u.ext_data = malloc(mSize);
277e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
278e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
279e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MetaData::typed_data::freeStorage() {
280e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    if (!usesReservoir()) {
281e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        if (u.ext_data) {
282e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            free(u.ext_data);
283e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        }
284e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
285e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
286e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    mSize = 0;
287e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
288e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
289e2b1028852120bcfded33b8f06f66b780437fe92Andreas HuberString8 MetaData::typed_data::asString() const {
290e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    String8 out;
291e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    const void *data = storage();
292e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    switch(mType) {
293e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case TYPE_NONE:
294e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            out = String8::format("no type, size %d)", mSize);
295e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
296e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case TYPE_C_STRING:
297e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            out = String8::format("(char*) %s", (const char *)data);
298b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber            break;
299b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        case TYPE_INT32:
300e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            out = String8::format("(int32_t) %d", *(int32_t *)data);
301e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
302e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case TYPE_INT64:
303e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            out = String8::format("(int64_t) %lld", *(int64_t *)data);
304e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
305e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        case TYPE_FLOAT:
306e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            out = String8::format("(float) %f", *(float *)data);
307e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
3089a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        case TYPE_POINTER:
3099a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber            out = String8::format("(void*) %p", *(void **)data);
3109a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber            break;
3113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block        case TYPE_RECT:
3129a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        {
313e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            const Rect *r = (const Rect *)data;
314e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            out = String8::format("Rect(%d, %d, %d, %d)",
315e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber                                  r->mLeft, r->mTop, r->mRight, r->mBottom);
316e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
3179a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber        }
3189a442c1b9a051edc6d4ceb0daad2d0a8433e7b0bAndreas Huber
319e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        default:
320e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            out = String8::format("(unknown type %d, size %d)", mType, mSize);
321e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber            break;
322e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    }
323e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    return out;
324e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
3252df788fb0c402938f827bf9c9ce2ca3ab1dcd464Mathias Agopian
32693d5ab693626fa2700375e838e4bb90e4d50e605Andreas Huberstatic void MakeFourCCString(uint32_t x, char *s) {
327e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    s[0] = x >> 24;
3282df788fb0c402938f827bf9c9ce2ca3ab1dcd464Mathias Agopian    s[1] = (x >> 16) & 0xff;
329e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    s[2] = (x >> 8) & 0xff;
330e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    s[3] = x & 0xff;
331e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    s[4] = '\0';
332e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
333e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber
334e2b1028852120bcfded33b8f06f66b780437fe92Andreas Hubervoid MetaData::dumpToLog() const {
335e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber    for (int i = mItems.size(); --i >= 0;) {
336e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        int32_t key = mItems.keyAt(i);
337e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        char cc[5];
338e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber        MakeFourCCString(key, cc);
339b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        const typed_data &item = mItems.valueAt(i);
340b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber        ALOGI("%s: %s", cc, item.asString().string());
341b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber    }
342e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber}
343b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
344b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber}  // namespace android
345b26a1176517579bd4d23f2a2cc91eca2e59b245cAndreas Huber
346e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber