Home | History | Annotate | Download | only in media
      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     // Playback capabilities.
     55     static const Type kPauseAvailable        = 1; // Boolean
     56     static const Type kSeekBackwardAvailable = 2; // Boolean
     57     static const Type kSeekForwardAvailable  = 3; // Boolean
     58     static const Type kSeekAvailable         = 4; // Boolean
     59 
     60     // Keep in sync with android/media/Metadata.java
     61     static const Type kTitle                 = 5; // String
     62     static const Type kComment               = 6; // String
     63     static const Type kCopyright             = 7; // String
     64     static const Type kAlbum                 = 8; // String
     65     static const Type kArtist                = 9; // String
     66     static const Type kAuthor                = 10; // String
     67     static const Type kComposer              = 11; // String
     68     static const Type kGenre                 = 12; // String
     69     static const Type kDate                  = 13; // Date
     70     static const Type kDuration              = 14; // Integer(millisec)
     71     static const Type kCdTrackNum            = 15; // Integer 1-based
     72     static const Type kCdTrackMax            = 16; // Integer
     73     static const Type kRating                = 17; // String
     74     static const Type kAlbumArt              = 18; // byte[]
     75     static const Type kVideoFrame            = 19; // Bitmap
     76 
     77     static const Type kBitRate               = 20; // Integer, Aggregate rate of
     78     // all the streams in bps.
     79 
     80     static const Type kAudioBitRate          = 21; // Integer, bps
     81     static const Type kVideoBitRate          = 22; // Integer, bps
     82     static const Type kAudioSampleRate       = 23; // Integer, Hz
     83     static const Type kVideoframeRate        = 24; // Integer, Hz
     84 
     85     // See RFC2046 and RFC4281.
     86     static const Type kMimeType              = 25; // String
     87     static const Type kAudioCodec            = 26; // String
     88     static const Type kVideoCodec            = 27; // String
     89 
     90     static const Type kVideoHeight           = 28; // Integer
     91     static const Type kVideoWidth            = 29; // Integer
     92     static const Type kNumTracks             = 30; // Integer
     93     static const Type kDrmCrippled           = 31; // Boolean
     94 
     95     // @param p[inout] The parcel to append the metadata records
     96     // to. The global metadata header should have been set already.
     97     explicit Metadata(Parcel *p);
     98     ~Metadata();
     99 
    100     // Rewind the underlying parcel, undoing all the changes.
    101     void resetParcel();
    102 
    103     // Append the size and 'META' marker.
    104     bool appendHeader();
    105 
    106     // Once all the records have been added, call this to update the
    107     // lenght field in the header.
    108     void updateLength();
    109 
    110     // append* are methods to append metadata.
    111     // @param key Is the metadata Id.
    112     // @param val Is the value of the metadata.
    113     // @return true if successful, false otherwise.
    114     // TODO: add more as needed to handle other types.
    115     bool appendBool(Type key, bool val);
    116     bool appendInt32(Type key, int32_t val);
    117 
    118   private:
    119     Metadata(const Metadata&);
    120     Metadata& operator=(const Metadata&);
    121 
    122 
    123     // Checks the key is valid and not already present.
    124     bool checkKey(Type key);
    125 
    126     Parcel *mData;
    127     size_t mBegin;
    128 };
    129 
    130 }  // namespace android::media
    131 }  // namespace android
    132 
    133 #endif  // ANDROID_MEDIA_METADATA_H__
    134