Merge "Hide MetaData internals"
diff --git a/media/libstagefright/foundation/MetaData.cpp b/media/libstagefright/foundation/MetaData.cpp
index a8965f0..2415c61 100644
--- a/media/libstagefright/foundation/MetaData.cpp
+++ b/media/libstagefright/foundation/MetaData.cpp
@@ -17,6 +17,7 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "MetaData"
#include <inttypes.h>
+#include <utils/KeyedVector.h>
#include <utils/Log.h>
#include <stdlib.h>
@@ -29,30 +30,81 @@
namespace android {
-MetaData::MetaData() {
+struct MetaData::typed_data {
+ typed_data();
+ ~typed_data();
+
+ typed_data(const MetaData::typed_data &);
+ typed_data &operator=(const MetaData::typed_data &);
+
+ void clear();
+ void setData(uint32_t type, const void *data, size_t size);
+ void getData(uint32_t *type, const void **data, size_t *size) const;
+ // may include hexdump of binary data if verbose=true
+ String8 asString(bool verbose) const;
+
+private:
+ uint32_t mType;
+ size_t mSize;
+
+ union {
+ void *ext_data;
+ float reservoir;
+ } u;
+
+ bool usesReservoir() const {
+ return mSize <= sizeof(u.reservoir);
+ }
+
+ void *allocateStorage(size_t size);
+ void freeStorage();
+
+ void *storage() {
+ return usesReservoir() ? &u.reservoir : u.ext_data;
+ }
+
+ const void *storage() const {
+ return usesReservoir() ? &u.reservoir : u.ext_data;
+ }
+};
+
+struct MetaData::Rect {
+ int32_t mLeft, mTop, mRight, mBottom;
+};
+
+
+struct MetaData::MetaDataInternal {
+ KeyedVector<uint32_t, MetaData::typed_data> mItems;
+};
+
+
+MetaData::MetaData()
+ : mInternalData(new MetaDataInternal()) {
}
MetaData::MetaData(const MetaData &from)
: RefBase(),
- mItems(from.mItems) {
+ mInternalData(new MetaDataInternal()) {
+ mInternalData->mItems = from.mInternalData->mItems;
}
MetaData::~MetaData() {
clear();
+ delete mInternalData;
}
void MetaData::clear() {
- mItems.clear();
+ mInternalData->mItems.clear();
}
bool MetaData::remove(uint32_t key) {
- ssize_t i = mItems.indexOfKey(key);
+ ssize_t i = mInternalData->mItems.indexOfKey(key);
if (i < 0) {
return false;
}
- mItems.removeItemsAt(i);
+ mInternalData->mItems.removeItemsAt(i);
return true;
}
@@ -192,15 +244,15 @@
uint32_t key, uint32_t type, const void *data, size_t size) {
bool overwrote_existing = true;
- ssize_t i = mItems.indexOfKey(key);
+ ssize_t i = mInternalData->mItems.indexOfKey(key);
if (i < 0) {
typed_data item;
- i = mItems.add(key, item);
+ i = mInternalData->mItems.add(key, item);
overwrote_existing = false;
}
- typed_data &item = mItems.editValueAt(i);
+ typed_data &item = mInternalData->mItems.editValueAt(i);
item.setData(type, data, size);
@@ -209,13 +261,13 @@
bool MetaData::findData(uint32_t key, uint32_t *type,
const void **data, size_t *size) const {
- ssize_t i = mItems.indexOfKey(key);
+ ssize_t i = mInternalData->mItems.indexOfKey(key);
if (i < 0) {
return false;
}
- const typed_data &item = mItems.valueAt(i);
+ const typed_data &item = mInternalData->mItems.valueAt(i);
item.getData(type, data, size);
@@ -223,7 +275,7 @@
}
bool MetaData::hasData(uint32_t key) const {
- ssize_t i = mItems.indexOfKey(key);
+ ssize_t i = mInternalData->mItems.indexOfKey(key);
if (i < 0) {
return false;
@@ -369,11 +421,11 @@
String8 MetaData::toString() const {
String8 s;
- for (int i = mItems.size(); --i >= 0;) {
- int32_t key = mItems.keyAt(i);
+ for (int i = mInternalData->mItems.size(); --i >= 0;) {
+ int32_t key = mInternalData->mItems.keyAt(i);
char cc[5];
MakeFourCCString(key, cc);
- const typed_data &item = mItems.valueAt(i);
+ const typed_data &item = mInternalData->mItems.valueAt(i);
s.appendFormat("%s: %s", cc, item.asString(false).string());
if (i != 0) {
s.append(", ");
@@ -382,25 +434,25 @@
return s;
}
void MetaData::dumpToLog() const {
- for (int i = mItems.size(); --i >= 0;) {
- int32_t key = mItems.keyAt(i);
+ for (int i = mInternalData->mItems.size(); --i >= 0;) {
+ int32_t key = mInternalData->mItems.keyAt(i);
char cc[5];
MakeFourCCString(key, cc);
- const typed_data &item = mItems.valueAt(i);
+ const typed_data &item = mInternalData->mItems.valueAt(i);
ALOGI("%s: %s", cc, item.asString(true /* verbose */).string());
}
}
status_t MetaData::writeToParcel(Parcel &parcel) {
status_t ret;
- size_t numItems = mItems.size();
+ size_t numItems = mInternalData->mItems.size();
ret = parcel.writeUint32(uint32_t(numItems));
if (ret) {
return ret;
}
for (size_t i = 0; i < numItems; i++) {
- int32_t key = mItems.keyAt(i);
- const typed_data &item = mItems.valueAt(i);
+ int32_t key = mInternalData->mItems.keyAt(i);
+ const typed_data &item = mInternalData->mItems.valueAt(i);
uint32_t type;
const void *data;
size_t size;
diff --git a/media/libstagefright/include/media/stagefright/MetaData.h b/media/libstagefright/include/media/stagefright/MetaData.h
index 3438c56..c6b3f4d 100644
--- a/media/libstagefright/include/media/stagefright/MetaData.h
+++ b/media/libstagefright/include/media/stagefright/MetaData.h
@@ -24,7 +24,6 @@
#include <binder/Parcel.h>
#include <utils/RefBase.h>
-#include <utils/KeyedVector.h>
#include <utils/String8.h>
namespace android {
@@ -287,51 +286,10 @@
virtual ~MetaData();
private:
- struct typed_data {
- typed_data();
- ~typed_data();
-
- typed_data(const MetaData::typed_data &);
- typed_data &operator=(const MetaData::typed_data &);
-
- void clear();
- void setData(uint32_t type, const void *data, size_t size);
- void getData(uint32_t *type, const void **data, size_t *size) const;
- // may include hexdump of binary data if verbose=true
- String8 asString(bool verbose) const;
-
- private:
- uint32_t mType;
- size_t mSize;
-
- union {
- void *ext_data;
- float reservoir;
- } u;
-
- bool usesReservoir() const {
- return mSize <= sizeof(u.reservoir);
- }
-
- void *allocateStorage(size_t size);
- void freeStorage();
-
- void *storage() {
- return usesReservoir() ? &u.reservoir : u.ext_data;
- }
-
- const void *storage() const {
- return usesReservoir() ? &u.reservoir : u.ext_data;
- }
- };
-
- struct Rect {
- int32_t mLeft, mTop, mRight, mBottom;
- };
-
- KeyedVector<uint32_t, typed_data> mItems;
-
- // MetaData &operator=(const MetaData &);
+ struct typed_data;
+ struct Rect;
+ struct MetaDataInternal;
+ MetaDataInternal *mInternalData;
};
} // namespace android