blob: abb45a9f09778d08fe15404b390b7633e7beed09 [file] [log] [blame]
/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef META_DATA_H_
#define META_DATA_H_
#include <sys/types.h>
#include <stdint.h>
#include <utils/RefBase.h>
#include <utils/KeyedVector.h>
namespace android {
enum {
kKeyMIMEType = 'mime',
kKeyWidth = 'widt',
kKeyHeight = 'heig',
kKeyChannelCount = '#chn',
kKeySampleRate = 'srte',
kKeyBitRate = 'brte',
kKeyESDS = 'esds',
kKeyAVCC = 'avcc',
kKeyTimeUnits = '#tim',
kKeyTimeScale = 'scal',
kKeyWantsNALFragments = 'NALf',
kKeyIsSyncFrame = 'sync',
kKeyDuration = 'dura',
kKeyColorFormat = 'colf',
kKeyPlatformPrivate = 'priv',
kKeyDecoderComponent = 'decC',
kKeyBufferID = 'bfID',
kKeyMaxInputSize = 'inpS',
};
enum {
kTypeESDS = 'esds',
kTypeAVCC = 'avcc',
};
class MetaData : public RefBase {
public:
MetaData();
MetaData(const MetaData &from);
enum Type {
TYPE_NONE = 'none',
TYPE_C_STRING = 'cstr',
TYPE_INT32 = 'in32',
TYPE_FLOAT = 'floa',
TYPE_POINTER = 'ptr ',
};
void clear();
bool remove(uint32_t key);
bool setCString(uint32_t key, const char *value);
bool setInt32(uint32_t key, int32_t value);
bool setFloat(uint32_t key, float value);
bool setPointer(uint32_t key, void *value);
bool findCString(uint32_t key, const char **value);
bool findInt32(uint32_t key, int32_t *value);
bool findFloat(uint32_t key, float *value);
bool findPointer(uint32_t key, void **value);
bool setData(uint32_t key, uint32_t type, const void *data, size_t size);
bool findData(uint32_t key, uint32_t *type,
const void **data, size_t *size) const;
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;
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;
}
};
KeyedVector<uint32_t, typed_data> mItems;
// MetaData &operator=(const MetaData &);
};
} // namespace android
#endif // META_DATA_H_