OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / frameworks / base / include / media / Metadata.h
1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef ANDROID_MEDIA_METADATA_H__
18 #define ANDROID_MEDIA_METADATA_H__
19
20 #include <sys/types.h>
21 #include <utils/Errors.h>
22 #include <utils/RefBase.h>
23 #include <utils/SortedVector.h>
24
25 namespace android {
26 class Parcel;
27
28 namespace media {
29
30 // Metadata is a class to build/serialize a set of metadata in a Parcel.
31 //
32 // This class should be kept in sync with android/media/Metadata.java.
33 // It provides all the metadata ids available and methods to build the
34 // header, add records and adjust the set size header field.
35 //
36 // Typical Usage:
37 // ==============
38 //  Parcel p;
39 //  media::Metadata data(&p);
40 //
41 //  data.appendHeader();
42 //  data.appendBool(Metadata::kPauseAvailable, true);
43 //   ... more append ...
44 //  data.updateLength();
45 //
46
47 class Metadata {
48   public:
49     typedef int32_t Type;
50     typedef SortedVector<Type> Filter;
51
52     static const Type kAny = 0;
53
54     // Keep in sync with android/media/Metadata.java
55     static const Type kTitle = 1;           // String
56     static const Type kComment = 2;         // String
57     static const Type kCopyright = 3;       // String
58     static const Type kAlbum = 4;           // String
59     static const Type kArtist = 5;          // String
60     static const Type kAuthor = 6;          // String
61     static const Type kComposer = 7;        // String
62     static const Type kGenre = 8;           // String
63     static const Type kDate = 9;            // Date
64     static const Type kDuration = 10;       // Integer(millisec)
65     static const Type kCdTrackNum = 11;     // Integer 1-based
66     static const Type kCdTrackMax = 12;     // Integer
67     static const Type kRating = 13;         // String
68     static const Type kAlbumArt = 14;       // byte[]
69     static const Type kVideoFrame = 15;     // Bitmap
70     static const Type kCaption = 16;        // TimedText
71
72     static const Type kBitRate = 17;       // Integer, Aggregate rate of
73     // all the streams in bps.
74
75     static const Type kAudioBitRate = 18; // Integer, bps
76     static const Type kVideoBitRate = 19; // Integer, bps
77     static const Type kAudioSampleRate = 20; // Integer, Hz
78     static const Type kVideoframeRate = 21;  // Integer, Hz
79
80     // See RFC2046 and RFC4281.
81     static const Type kMimeType = 22;      // String
82     static const Type kAudioCodec = 23;    // String
83     static const Type kVideoCodec = 24;    // String
84
85     static const Type kVideoHeight = 25;   // Integer
86     static const Type kVideoWidth = 26;    // Integer
87     static const Type kNumTracks = 27;     // Integer
88     static const Type kDrmCrippled = 28;   // Boolean
89
90     // Playback capabilities.
91     static const Type kPauseAvailable = 29;        // Boolean
92     static const Type kSeekBackwardAvailable = 30; // Boolean
93     static const Type kSeekForwardAvailable = 31;  // Boolean
94     static const Type kSeekAvailable = 32;         // Boolean
95
96     // @param p[inout] The parcel to append the metadata records
97     // to. The global metadata header should have been set already.
98     explicit Metadata(Parcel *p);
99     ~Metadata();
100
101     // Rewind the underlying parcel, undoing all the changes.
102     void resetParcel();
103
104     // Append the size and 'META' marker.
105     bool appendHeader();
106
107     // Once all the records have been added, call this to update the
108     // lenght field in the header.
109     void updateLength();
110
111     // append* are methods to append metadata.
112     // @param key Is the metadata Id.
113     // @param val Is the value of the metadata.
114     // @return true if successful, false otherwise.
115     // TODO: add more as needed to handle other types.
116     bool appendBool(Type key, bool val);
117     bool appendInt32(Type key, int32_t val);
118
119   private:
120     Metadata(const Metadata&);
121     Metadata& operator=(const Metadata&);
122
123
124     // Checks the key is valid and not already present.
125     bool checkKey(Type key);
126
127     Parcel *mData;
128     size_t mBegin;
129 };
130
131 }  // namespace android::media
132 }  // namespace android
133
134 #endif  // ANDROID_MEDIA_METADATA_H__