From f722040584412cb7e6ce83d3041219c039f443da Mon Sep 17 00:00:00 2001 From: Barrett17 Date: Wed, 21 Nov 2018 12:45:09 +0100 Subject: [PATCH] BMetaData: Finalize implementation * Use string keys. I am still convinced we need BValue. * Use boolean instead of status_t in return, this is much more handy in pratical use given that there's no really a status to check. --- headers/os/codec/MetaData.h | 96 +++++++++++++++--------------- src/kits/codec/MetaData.cpp | 113 ++++++++++++++++++++++++------------ 2 files changed, 125 insertions(+), 84 deletions(-) diff --git a/headers/os/codec/MetaData.h b/headers/os/codec/MetaData.h index 5d2e31622d..ad8666b7b2 100644 --- a/headers/os/codec/MetaData.h +++ b/headers/os/codec/MetaData.h @@ -13,69 +13,71 @@ namespace BPrivate { namespace media { -enum MetaDataKeys { - // Playback capabilities - CanPause = 0x1000, // bool - CanSeekBackward, // bool - CanSeekForward, // bool - CanSeek, // bool +// Playback capabilities +extern const char* kCanPause; // bool +extern const char* kCanSeekBackward; // bool +extern const char* kCanSeekForward; // bool +extern const char* kCanSeek; // bool - // Bitrates - AudioBitRate, // uint32 (bps) - VideoBitRate, // uint32 (bps) - AudioSampleRate, // uint32 (hz) - VideoFrameRate, // uint32 (hz) +// Bitrates +extern const char* kAudioBitRate; // uint32 (bps) +extern const char* kVideoBitRate; // uint32 (bps) +extern const char* kAudioSampleRate; // uint32 (hz) +extern const char* kVideoFrameRate; // uint32 (hz) - // RFC2046 and RFC4281 - MimeType, // BString - AudioCodec, // BString - VideoCodec, // BString - VideoHeight, // uint32 - VideoWidth, // uint32 - NumTracks, // uint32 - DrmCrippled, // bool +// RFC2046 and RFC4281 +extern const char* kMimeType; // BString +extern const char* kAudioCodec; // BString +extern const char* kVideoCodec; // BString +extern const char* kVideoHeight; // uint32 +extern const char* kVideoWidth; // uint32 +extern const char* kNumTracks; // uint32 +extern const char* kDrmCrippled; // bool - // General use attributes - Title, // BString - Comment, // BString - Copyright, // BString - Album, // BString - Artist, // BString - Author, // BString - Composer, // BString - Genre, // BString - // TODO: what we would use for encoded dates? - // Date, // date - Duration, // uint32 (ms) - Rating, // BString - // TODO: BBitmap? uint8 array? - //AlbumArt, // - CDTrackNum, // uint32 - CDTrackMax // uint32 -}; +// General use attributes +extern const char* kTitle; // BString +extern const char* kComment; // BString +extern const char* kCopyright; // BString +extern const char* kAlbum; // BString +extern const char* kArtist; // BString +extern const char* kAuthor; // BString +extern const char* kComposer; // BString +extern const char* kGenre; // BString +// TODO: what we would use for encoded dates? +// Date, // date +extern const char* kDuration; // uint32 (ms) +extern const char* kRating; // BString +// TODO: BBitmap? uint8 array? +//AlbumArt, +extern const char* kCDTrackNum; // uint32 +extern const char* kCDTrackMax; // uint32 class BMetaData { public: BMetaData(); + BMetaData(const BMessage& msg); + ~BMetaData(); // Woah. It seems we need BValue there. - status_t SetString(uint32 key, const BString& value); - status_t SetBool(uint32 key, bool value); - status_t SetUInt32(uint32 key, uint32 value); + bool SetString(const char* key, const BString& value); + bool SetBool(const char* key, bool value); + bool SetUInt32(const char* key, uint32 value); - status_t FindString(uint32 key, BString* value) const; - status_t FindBool(uint32 key, bool* value) const; - status_t FindUInt32(uint32 key, uint32* value) const; + bool GetString(const char* key, BString* value) const; + bool GetBool(const char* key, bool* value) const; + bool GetUInt32(const char* key, uint32* value) const; - status_t RemoveValue(uint32 key); + bool RemoveValue(const char* key); // Clean up all keys - void Reset(); + void MakeEmpty(); + bool IsEmpty(); - status_t FromMessage(const BMessage& msg); - const BMessage& ToMessage(); + // Retain ownership of the object, be careful with that + // that's why we need to introduce smart pointers! + BMessage* Message(); private: // TODO: padding diff --git a/src/kits/codec/MetaData.cpp b/src/kits/codec/MetaData.cpp index 324052dd54..6ab895ab67 100644 --- a/src/kits/codec/MetaData.cpp +++ b/src/kits/codec/MetaData.cpp @@ -10,19 +10,38 @@ #include #include +#define P BPrivate::media:: -// TODO: probably we can do better -const char* -key_to_string(uint32 key) -{ - char buf[sizeof(char) * sizeof(uint32) * 4 + 1]; - if (buf) { - sprintf(buf, "%" B_PRId32, key); - } - BString ret(buf); - ret.Prepend("codec:metadata:"); - return ret.String(); -} +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 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"; BMetaData::BMetaData() @@ -33,65 +52,85 @@ BMetaData::BMetaData() } +BMetaData::BMetaData(const BMessage& msg) + : + fMessage(NULL) +{ + fMessage = new BMessage(msg); +} + + BMetaData::~BMetaData() { delete fMessage; } -status_t -BMetaData::SetString(uint32 key, const BString& value) +bool +BMetaData::SetString(const char* key, const BString& value) { - return fMessage->AddString(key_to_string(key), value); + return fMessage->SetString(key, value) == B_OK ? true : false; } -status_t -BMetaData::SetBool(uint32 key, bool value) +bool +BMetaData::SetBool(const char* key, bool value) { - return fMessage->AddBool(key_to_string(key), value); + return fMessage->SetBool(key, value) == B_OK ? true : false; } -status_t -BMetaData::SetUInt32(uint32 key, uint32 value) +bool +BMetaData::SetUInt32(const char* key, uint32 value) { - return fMessage->AddUInt32(key_to_string(key), value); + return fMessage->SetUInt32(key, value) == B_OK ? true : false; } -status_t -BMetaData::FindString(uint32 key, BString* value) const +bool +BMetaData::GetString(const char* key, BString* value) const { - return fMessage->FindString(key_to_string(key), value); + return fMessage->FindString(key, value) == B_OK ? true : false; } -status_t -BMetaData::FindBool(uint32 key, bool* value) const +bool +BMetaData::GetBool(const char* key, bool* value) const { - return fMessage->FindBool(key_to_string(key), value); + return fMessage->FindBool(key, value) == B_OK ? true : false; } -status_t -BMetaData::FindUInt32(uint32 key, uint32* value) const +bool +BMetaData::GetUInt32(const char* key, uint32* value) const { - return fMessage->FindUInt32(key_to_string(key), value); + return fMessage->FindUInt32(key, value) == B_OK ? true : false; } -status_t -BMetaData::RemoveValue(uint32 key) +bool +BMetaData::RemoveValue(const char* key) { - return fMessage->RemoveName(key_to_string(key)); + return fMessage->RemoveName(key) == B_OK ? true : false; } -// Clean up all keys void -BMetaData::Reset() +BMetaData::MakeEmpty() { - delete fMessage; - fMessage = new BMessage(); + fMessage->MakeEmpty(); +} + + +bool +BMetaData::IsEmpty() +{ + return fMessage->IsEmpty(); +} + + +BMessage* +BMetaData::Message() +{ + return fMessage; }