diff --git a/headers/os/codec/MetaData.h b/headers/os/codec/MetaData.h index ad8666b7b2..3ae0387c8d 100644 --- a/headers/os/codec/MetaData.h +++ b/headers/os/codec/MetaData.h @@ -6,6 +6,7 @@ #ifndef _META_DATA_H #define _META_DATA_H + #include @@ -40,34 +41,61 @@ extern const char* kComment; // BString extern const char* kCopyright; // BString extern const char* kAlbum; // BString extern const char* kArtist; // BString +extern const char* kAlbumArtist; // BString extern const char* kAuthor; // BString +extern const char* kPerformer; // BString extern const char* kComposer; // BString extern const char* kGenre; // BString -// TODO: what we would use for encoded dates? -// Date, // date +extern const char* kYear; // BString +extern const char* kEncodedBy; // BString +extern const char* kLanguage; // BString +extern const char* kDisc; // BString +extern const char* kPublisher; // BString +extern const char* kEncoder; // BString +extern const char* kTrack; +extern const char* kDate; // BString extern const char* kDuration; // uint32 (ms) extern const char* kRating; // BString -// TODO: BBitmap? uint8 array? -//AlbumArt, +// TODO: BBitmap? uint8 array? url? +//extern const char* kAlbumArt extern const char* kCDTrackNum; // uint32 extern const char* kCDTrackMax; // uint32 +extern const char* kChapter; // BMetaData +extern const char* kChapterStart; // int64 +extern const char* kChapterEnd; // int64 + +// Others +extern const char* kProgramData; // BMetaData + class BMetaData { public: BMetaData(); BMetaData(const BMessage& msg); + virtual ~BMetaData(); - ~BMetaData(); + BMetaData& operator=(const BMetaData& other); // Woah. It seems we need BValue there. bool SetString(const char* key, const BString& value); bool SetBool(const char* key, bool value); bool SetUInt32(const char* key, uint32 value); + bool SetInt32(const char* key, int32 value); + bool SetInt64(const char* key, int64 value); bool GetString(const char* key, BString* value) const; bool GetBool(const char* key, bool* value) const; bool GetUInt32(const char* key, uint32* value) const; + bool GetInt32(const char* key, int32* value) const; + bool GetInt64(const char* key, int64* value) const; + + // We allow embedding BMetaData into BMetaData. The BMetaData field + // is the only one allowed to have more occurrences for a single key + // so an index attribute is given for retrieving it. + bool AddMetaData(const char* key, BMetaData* data); + bool GetMetaData(const char* key, BMetaData* data, + uint32 index = 0); bool RemoveValue(const char* key); @@ -77,14 +105,13 @@ public: // Retain ownership of the object, be careful with that // that's why we need to introduce smart pointers! - BMessage* Message(); + const BMessage* Message(); private: // TODO: padding BMessage* fMessage; BMetaData(const BMetaData&); - BMetaData& operator=(const BMetaData&); }; } // namespace media diff --git a/src/kits/codec/MetaData.cpp b/src/kits/codec/MetaData.cpp index 6ab895ab67..9126b15c75 100644 --- a/src/kits/codec/MetaData.cpp +++ b/src/kits/codec/MetaData.cpp @@ -10,38 +10,56 @@ #include #include -#define P BPrivate::media:: +#define P BPrivate::media -const char* P kCanPause = "canpause"; -const char* P kCanSeekBackward = "canseekbackward"; -const char* P kCanSeekForward = "canseekforward"; -const char* P kCanSeek = "canseek"; +const char* P::kCanPause = "canpause"; +const char* P::kCanSeekBackward = "canseekbackward"; +const char* P::kCanSeekForward = "canseekforward"; +const char* P::kCanSeek = "canseek"; -const char* P kAudioBitRate = "audiobitrate"; -const char* P kVideoBitRate = "videobitrate"; -const char* P kAudioSampleRate = "audiosamplerate"; -const char* P kVideoFrameRate = "videoframerate"; +const char* P::kAudioBitRate = "audiobitrate"; +const char* P::kVideoBitRate = "videobitrate"; +const char* P::kAudioSampleRate = "audiosamplerate"; +const char* P::kVideoFrameRate = "videoframerate"; -const char* P kMimeType = "mime"; -const char* P kAudioCodec = "audiocodec"; -const char* P kVideoCodec = "videocodec"; -const char* P kVideoHeight = "videoheight"; -const char* P kVideoWidth = "videowidth"; -const char* P kNumTracks = "numtracks"; -const char* P kDrmCrippled = "drmcrippled"; +const char* P::kMimeType = "mime"; +const char* P::kAudioCodec = "audiocodec"; +const char* P::kVideoCodec = "videocodec"; +const char* P::kVideoHeight = "videoheight"; +const char* P::kVideoWidth = "videowidth"; +const char* P::kNumTracks = "numtracks"; +const char* P::kDrmCrippled = "drmcrippled"; -const char* P kTitle = "title"; -const char* P kComment = "comment"; -const char* P kCopyright = "copyright"; -const char* P kAlbum = "album"; -const char* P kArtist = "artist"; -const char* P kAuthor = "author"; -const char* P kComposer = "composer"; -const char* P kGenre = "genre"; -const char* P kDuration = "duration"; -const char* P kRating = "rating"; -const char* P kCDTrackNum = "cdtracknumber"; -const char* P kCDTrackMax = "cdtrackmax"; +const char* P::kTitle = "title"; +const char* P::kComment = "comment"; +const char* P::kCopyright = "copyright"; +const char* P::kAlbum = "album"; +const char* P::kArtist = "artist"; +const char* P::kAuthor = "author"; +const char* P::kComposer = "composer"; +const char* P::kGenre = "genre"; +const char* P::kDuration = "duration"; +const char* P::kRating = "rating"; +const char* P::kCDTrackNum = "cdtracknumber"; +const char* P::kCDTrackMax = "cdtrackmax"; +const char* P::kDate = "date"; +const char* P::kEncodedBy = "encoded_by"; +const char* P::kLanguage = "language"; +const char* P::kAlbumArtist = "album_artist"; +const char* P::kPerformer = "performer"; +const char* P::kDisc = "disc"; +const char* P::kPublisher = "publisher"; +const char* P::kTrack = "track"; +const char* P::kEncoder = "encoder"; +const char* P::kYear = "year"; + +const char* P::kChapter = "be:chapter"; +const char* P::kChapterStart = "be:chapter:start"; +const char* P::kChapterEnd = "be:chapter:end"; + +const char* P::kProgramData = "be:program"; + +#undef P BMetaData::BMetaData() @@ -87,6 +105,13 @@ BMetaData::SetUInt32(const char* key, uint32 value) } +bool +BMetaData::SetInt64(const char* key, int64 value) +{ + return fMessage->SetInt64(key, value) == B_OK ? true : false; +} + + bool BMetaData::GetString(const char* key, BString* value) const { @@ -108,6 +133,27 @@ BMetaData::GetUInt32(const char* key, uint32* value) const } +bool +BMetaData::AddMetaData(const char* key, BMetaData* data) +{ + return fMessage->AddMessage(key, data->Message()) + == B_OK ? true : false; +} + + +bool +BMetaData::GetMetaData(const char* key, BMetaData* data, uint32 index) +{ + BMessage msg; + status_t err = fMessage->FindMessage(key, index, &msg); + if (err == B_OK) { + *data = BMetaData(msg); + return true; + } + return false; +} + + bool BMetaData::RemoveValue(const char* key) { @@ -129,8 +175,17 @@ BMetaData::IsEmpty() } -BMessage* +const BMessage* BMetaData::Message() { return fMessage; } + + +BMetaData& +BMetaData::operator=(const BMetaData& other) +{ + delete fMessage; + fMessage = new BMessage(*other.fMessage); + return *this; +}