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
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