Loading media/libstagefright/foundation/MetaData.cpp +72 −20 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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; } Loading Loading @@ -192,15 +244,15 @@ bool MetaData::setData( 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); Loading @@ -209,13 +261,13 @@ bool MetaData::setData( 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); Loading @@ -223,7 +275,7 @@ bool MetaData::findData(uint32_t key, uint32_t *type, } 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; Loading Loading @@ -369,11 +421,11 @@ static void MakeFourCCString(uint32_t x, char *s) { 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(", "); Loading @@ -382,25 +434,25 @@ String8 MetaData::toString() const { 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; Loading media/libstagefright/include/media/stagefright/MetaData.h +4 −46 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ #include <binder/Parcel.h> #include <utils/RefBase.h> #include <utils/KeyedVector.h> #include <utils/String8.h> namespace android { Loading Loading @@ -287,51 +286,10 @@ protected: 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 Loading Loading
media/libstagefright/foundation/MetaData.cpp +72 −20 Original line number Diff line number Diff line Loading @@ -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> Loading @@ -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; } Loading Loading @@ -192,15 +244,15 @@ bool MetaData::setData( 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); Loading @@ -209,13 +261,13 @@ bool MetaData::setData( 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); Loading @@ -223,7 +275,7 @@ bool MetaData::findData(uint32_t key, uint32_t *type, } 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; Loading Loading @@ -369,11 +421,11 @@ static void MakeFourCCString(uint32_t x, char *s) { 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(", "); Loading @@ -382,25 +434,25 @@ String8 MetaData::toString() const { 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; Loading
media/libstagefright/include/media/stagefright/MetaData.h +4 −46 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ #include <binder/Parcel.h> #include <utils/RefBase.h> #include <utils/KeyedVector.h> #include <utils/String8.h> namespace android { Loading Loading @@ -287,51 +286,10 @@ protected: 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 Loading