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 25fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huberstruct DataSource; 26fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huberstruct 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 38fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ID3(const sp<DataSource> &source); 39fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ~ID3(); 40fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 41fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber bool isValid() const; 42fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 43fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber Version version() const; 44fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 45fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber const void *getAlbumArt(size_t *length, String8 *mime) const; 46fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 47fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber struct Iterator { 48fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber Iterator(const ID3 &parent, const char *id); 49fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ~Iterator(); 50fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 51fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber bool done() const; 52fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber void getID(String8 *id) const; 53b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen void getString(String8 *s, String8 *ss = NULL) const; 54fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber const uint8_t *getData(size_t *length) const; 55fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber void next(); 56fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 57fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber private: 58fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber const ID3 &mParent; 59fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber char *mID; 60fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber size_t mOffset; 61fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 62fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber const uint8_t *mFrameData; 63fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber size_t mFrameSize; 64fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 65fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber void findFrame(); 66fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 67fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber size_t getHeaderLength() const; 68b636abde14f2612ea236257846b9ab15d87d4623Marco Nelissen void getstring(String8 *s, bool secondhalf) const; 69fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 70fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber Iterator(const Iterator &); 71fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber Iterator &operator=(const Iterator &); 72fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber }; 73fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 74fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huberprivate: 75fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber bool mIsValid; 76fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber uint8_t *mData; 77fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber size_t mSize; 78fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber size_t mFirstFrameOffset; 79fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber Version mVersion; 80fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 8183e5850bdf9c8b5c36c364b367b039674eb827adAndreas Huber bool parseV1(const sp<DataSource> &source); 8283e5850bdf9c8b5c36c364b367b039674eb827adAndreas Huber bool parseV2(const sp<DataSource> &source); 83fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber void removeUnsynchronization(); 84428d96d5f882d01acb0abb7e1ceb51d4ccc48efaAndreas Huber bool removeUnsynchronizationV2_4(bool iTunesHack); 85fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 86bebd11b5a406bc4243cb7bd55f6849841bf911a7Andreas Huber static bool ParseSyncsafeInteger(const uint8_t encoded[4], size_t *x); 87bebd11b5a406bc4243cb7bd55f6849841bf911a7Andreas Huber 88fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ID3(const ID3 &); 89fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber ID3 &operator=(const ID3 &); 90fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber}; 91fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 92fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber} // namespace android 93fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 94fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber#endif // ID3_H_ 95fc9ba09e3bb368f823d473f5e2bb9aa32dba6289Andreas Huber 96