1fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber/* 2fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * 4fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * you may not use this file except in compliance with the License. 6fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * You may obtain a copy of the License at 7fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * 8fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * 10fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * Unless required by applicable law or agreed to in writing, software 11fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * See the License for the specific language governing permissions and 14fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber * limitations under the License. 15fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber */ 16fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 17fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#ifndef ID3_H_ 18fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 19fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#define ID3_H_ 20fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 21fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#include <utils/RefBase.h> 22fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 23fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Hubernamespace android { 24fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 2586a58cabe322b746ab0eb17f0cade34ed68ba60eBernhard Rosenkränzerclass DataSource; 2686a58cabe322b746ab0eb17f0cade34ed68ba60eBernhard Rosenkränzerclass String8; 27fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 28fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huberstruct ID3 { 29fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber enum Version { 30fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ID3_UNKNOWN, 3183e5850bdf9c8b5c36c364b367b039674eb827adAndreas Huber ID3_V1, 3283e5850bdf9c8b5c36c364b367b039674eb827adAndreas Huber ID3_V1_1, 33fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ID3_V2_2, 34bebd11b5a406bc4243cb7bd55f6849841bf911a7Andreas Huber ID3_V2_3, 35bebd11b5a406bc4243cb7bd55f6849841bf911a7Andreas Huber ID3_V2_4, 36fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber }; 37fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 38328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé ID3(const sp<DataSource> &source, bool ignoreV1 = false, off64_t offset = 0); 3914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber ID3(const uint8_t *data, size_t size, bool ignoreV1 = false); 40fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ~ID3(); 41fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 42fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber bool isValid() const; 43fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 44fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber Version version() const; 45fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 46fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber const void *getAlbumArt(size_t *length, String8 *mime) const; 47fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 48fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber struct Iterator { 49fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber Iterator(const ID3 &parent, const char *id); 50fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ~Iterator(); 51fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 52fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber bool done() const; 53fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber void getID(String8 *id) const; 54b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen void getString(String8 *s, String8 *ss = NULL) const; 55fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber const uint8_t *getData(size_t *length) const; 56fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber void next(); 57fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 58fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber private: 59fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber const ID3 &mParent; 60fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber char *mID; 61fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber size_t mOffset; 62fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 63fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber const uint8_t *mFrameData; 64fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber size_t mFrameSize; 65fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 66fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber void findFrame(); 67fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 68fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber size_t getHeaderLength() const; 69b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen void getstring(String8 *s, bool secondhalf) const; 70fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 71fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber Iterator(const Iterator &); 72fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber Iterator &operator=(const Iterator &); 73fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber }; 74fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 7514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber size_t rawSize() const { return mRawSize; } 7614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 77fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huberprivate: 78fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber bool mIsValid; 79fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber uint8_t *mData; 80fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber size_t mSize; 81fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber size_t mFirstFrameOffset; 82fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber Version mVersion; 83fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 8414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber // size of the ID3 tag including header before any unsynchronization. 8514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber // only valid for IDV2+ 8614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber size_t mRawSize; 8714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 8883e5850bdf9c8b5c36c364b367b039674eb827adAndreas Huber bool parseV1(const sp<DataSource> &source); 89328abde67f57c026ac44e927f9244c40832499c8Oscar Rydhé bool parseV2(const sp<DataSource> &source, off64_t offset); 90fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber void removeUnsynchronization(); 91428d96d5f882d01acb0abb7e1ceb51d4ccc48efaAndreas Huber bool removeUnsynchronizationV2_4(bool iTunesHack); 92fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 93bebd11b5a406bc4243cb7bd55f6849841bf911a7Andreas Huber static bool ParseSyncsafeInteger(const uint8_t encoded[4], size_t *x); 94bebd11b5a406bc4243cb7bd55f6849841bf911a7Andreas Huber 95fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ID3(const ID3 &); 96fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ID3 &operator=(const ID3 &); 97fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber}; 98fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 99fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber} // namespace android 100fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 101fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#endif // ID3_H_ 102fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 103