Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 389f0fe4 authored by Marco Nelissen's avatar Marco Nelissen
Browse files

Hide MetaData internals

Bug: 67908544
Test: build, boot, record and playback video
Change-Id: I9d76bf3613c73d7680faf4419e11fbe638605951
parent ab7429b4
Loading
Loading
Loading
Loading
+72 −20
Original line number Diff line number Diff line
@@ -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 @@ 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);

@@ -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);

@@ -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;
@@ -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(", ");
@@ -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;
+4 −46
Original line number Diff line number Diff line
@@ -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 @@ 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