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:
@@ -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
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user