BMetaData: Add missing functionality

* Add more metadata keys needed to support ffmpeg.
* Implement methods allowing to embed BMetaData into
BMetaData.
* Add methods to handle more types.
This commit is contained in:
Barrett17
2018-11-21 16:51:19 +01:00
parent f722040584
commit 9bbd53a288
2 changed files with 118 additions and 36 deletions
+34 -7
View File
@@ -6,6 +6,7 @@
#ifndef _META_DATA_H
#define _META_DATA_H
#include <Message.h>
@@ -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
+84 -29
View File
@@ -10,38 +10,56 @@
#include <stdio.h>
#include <stdlib.h>
#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;
}