blob: 5e433ea699bb92b3ca6eabd9f2092dde3cc99d4b [file] [log] [blame]
/*
* Copyright (C) 2010 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 ID3_H_
#define ID3_H_
#include <utils/RefBase.h>
namespace android {
class DataSourceBase;
class String8;
class DataSourceHelper;
struct ID3 {
enum Version {
ID3_UNKNOWN,
ID3_V1,
ID3_V1_1,
ID3_V2_2,
ID3_V2_3,
ID3_V2_4,
};
explicit ID3(DataSourceHelper *source, bool ignoreV1 = false, off64_t offset = 0);
explicit ID3(DataSourceBase *source, bool ignoreV1 = false, off64_t offset = 0);
ID3(const uint8_t *data, size_t size, bool ignoreV1 = false);
~ID3();
bool isValid() const;
Version version() const;
const void *getAlbumArt(size_t *length, String8 *mime) const;
struct Iterator {
Iterator(const ID3 &parent, const char *id);
~Iterator();
bool done() const;
void getID(String8 *id) const;
void getString(String8 *s, String8 *ss = NULL) const;
const uint8_t *getData(size_t *length) const;
void next();
private:
const ID3 &mParent;
char *mID;
size_t mOffset;
const uint8_t *mFrameData;
size_t mFrameSize;
void findFrame();
size_t getHeaderLength() const;
void getstring(String8 *s, bool secondhalf) const;
Iterator(const Iterator &);
Iterator &operator=(const Iterator &);
};
size_t rawSize() const { return mRawSize; }
private:
bool mIsValid;
uint8_t *mData;
size_t mSize;
size_t mFirstFrameOffset;
Version mVersion;
// size of the ID3 tag including header before any unsynchronization.
// only valid for IDV2+
size_t mRawSize;
bool parseV1(DataSourceBase *source);
bool parseV2(DataSourceBase *source, off64_t offset);
void removeUnsynchronization();
bool removeUnsynchronizationV2_4(bool iTunesHack);
static bool ParseSyncsafeInteger(const uint8_t encoded[4], size_t *x);
ID3(const ID3 &);
ID3 &operator=(const ID3 &);
};
} // namespace android
#endif // ID3_H_