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
|
#ifndef _META_DATA_H
|
||||||
#define _META_DATA_H
|
#define _META_DATA_H
|
||||||
|
|
||||||
|
|
||||||
#include <Message.h>
|
#include <Message.h>
|
||||||
|
|
||||||
|
|
||||||
@@ -40,34 +41,61 @@ extern const char* kComment; // BString
|
|||||||
extern const char* kCopyright; // BString
|
extern const char* kCopyright; // BString
|
||||||
extern const char* kAlbum; // BString
|
extern const char* kAlbum; // BString
|
||||||
extern const char* kArtist; // BString
|
extern const char* kArtist; // BString
|
||||||
|
extern const char* kAlbumArtist; // BString
|
||||||
extern const char* kAuthor; // BString
|
extern const char* kAuthor; // BString
|
||||||
|
extern const char* kPerformer; // BString
|
||||||
extern const char* kComposer; // BString
|
extern const char* kComposer; // BString
|
||||||
extern const char* kGenre; // BString
|
extern const char* kGenre; // BString
|
||||||
// TODO: what we would use for encoded dates?
|
extern const char* kYear; // BString
|
||||||
// Date, // date
|
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* kDuration; // uint32 (ms)
|
||||||
extern const char* kRating; // BString
|
extern const char* kRating; // BString
|
||||||
// TODO: BBitmap? uint8 array?
|
// TODO: BBitmap? uint8 array? url?
|
||||||
//AlbumArt,
|
//extern const char* kAlbumArt
|
||||||
extern const char* kCDTrackNum; // uint32
|
extern const char* kCDTrackNum; // uint32
|
||||||
extern const char* kCDTrackMax; // 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 {
|
class BMetaData {
|
||||||
public:
|
public:
|
||||||
BMetaData();
|
BMetaData();
|
||||||
BMetaData(const BMessage& msg);
|
BMetaData(const BMessage& msg);
|
||||||
|
virtual ~BMetaData();
|
||||||
|
|
||||||
~BMetaData();
|
BMetaData& operator=(const BMetaData& other);
|
||||||
|
|
||||||
// Woah. It seems we need BValue there.
|
// Woah. It seems we need BValue there.
|
||||||
bool SetString(const char* key, const BString& value);
|
bool SetString(const char* key, const BString& value);
|
||||||
bool SetBool(const char* key, bool value);
|
bool SetBool(const char* key, bool value);
|
||||||
bool SetUInt32(const char* key, uint32 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 GetString(const char* key, BString* value) const;
|
||||||
bool GetBool(const char* key, bool* value) const;
|
bool GetBool(const char* key, bool* value) const;
|
||||||
bool GetUInt32(const char* key, uint32* 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);
|
bool RemoveValue(const char* key);
|
||||||
|
|
||||||
@@ -77,14 +105,13 @@ public:
|
|||||||
|
|
||||||
// Retain ownership of the object, be careful with that
|
// Retain ownership of the object, be careful with that
|
||||||
// that's why we need to introduce smart pointers!
|
// that's why we need to introduce smart pointers!
|
||||||
BMessage* Message();
|
const BMessage* Message();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// TODO: padding
|
// TODO: padding
|
||||||
BMessage* fMessage;
|
BMessage* fMessage;
|
||||||
|
|
||||||
BMetaData(const BMetaData&);
|
BMetaData(const BMetaData&);
|
||||||
BMetaData& operator=(const BMetaData&);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace media
|
} // namespace media
|
||||||
|
|||||||
+84
-29
@@ -10,38 +10,56 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define P BPrivate::media::
|
#define P BPrivate::media
|
||||||
|
|
||||||
const char* P kCanPause = "canpause";
|
const char* P::kCanPause = "canpause";
|
||||||
const char* P kCanSeekBackward = "canseekbackward";
|
const char* P::kCanSeekBackward = "canseekbackward";
|
||||||
const char* P kCanSeekForward = "canseekforward";
|
const char* P::kCanSeekForward = "canseekforward";
|
||||||
const char* P kCanSeek = "canseek";
|
const char* P::kCanSeek = "canseek";
|
||||||
|
|
||||||
const char* P kAudioBitRate = "audiobitrate";
|
const char* P::kAudioBitRate = "audiobitrate";
|
||||||
const char* P kVideoBitRate = "videobitrate";
|
const char* P::kVideoBitRate = "videobitrate";
|
||||||
const char* P kAudioSampleRate = "audiosamplerate";
|
const char* P::kAudioSampleRate = "audiosamplerate";
|
||||||
const char* P kVideoFrameRate = "videoframerate";
|
const char* P::kVideoFrameRate = "videoframerate";
|
||||||
|
|
||||||
const char* P kMimeType = "mime";
|
const char* P::kMimeType = "mime";
|
||||||
const char* P kAudioCodec = "audiocodec";
|
const char* P::kAudioCodec = "audiocodec";
|
||||||
const char* P kVideoCodec = "videocodec";
|
const char* P::kVideoCodec = "videocodec";
|
||||||
const char* P kVideoHeight = "videoheight";
|
const char* P::kVideoHeight = "videoheight";
|
||||||
const char* P kVideoWidth = "videowidth";
|
const char* P::kVideoWidth = "videowidth";
|
||||||
const char* P kNumTracks = "numtracks";
|
const char* P::kNumTracks = "numtracks";
|
||||||
const char* P kDrmCrippled = "drmcrippled";
|
const char* P::kDrmCrippled = "drmcrippled";
|
||||||
|
|
||||||
const char* P kTitle = "title";
|
const char* P::kTitle = "title";
|
||||||
const char* P kComment = "comment";
|
const char* P::kComment = "comment";
|
||||||
const char* P kCopyright = "copyright";
|
const char* P::kCopyright = "copyright";
|
||||||
const char* P kAlbum = "album";
|
const char* P::kAlbum = "album";
|
||||||
const char* P kArtist = "artist";
|
const char* P::kArtist = "artist";
|
||||||
const char* P kAuthor = "author";
|
const char* P::kAuthor = "author";
|
||||||
const char* P kComposer = "composer";
|
const char* P::kComposer = "composer";
|
||||||
const char* P kGenre = "genre";
|
const char* P::kGenre = "genre";
|
||||||
const char* P kDuration = "duration";
|
const char* P::kDuration = "duration";
|
||||||
const char* P kRating = "rating";
|
const char* P::kRating = "rating";
|
||||||
const char* P kCDTrackNum = "cdtracknumber";
|
const char* P::kCDTrackNum = "cdtracknumber";
|
||||||
const char* P kCDTrackMax = "cdtrackmax";
|
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()
|
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
|
bool
|
||||||
BMetaData::GetString(const char* key, BString* value) const
|
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
|
bool
|
||||||
BMetaData::RemoveValue(const char* key)
|
BMetaData::RemoveValue(const char* key)
|
||||||
{
|
{
|
||||||
@@ -129,8 +175,17 @@ BMetaData::IsEmpty()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
BMessage*
|
const BMessage*
|
||||||
BMetaData::Message()
|
BMetaData::Message()
|
||||||
{
|
{
|
||||||
return fMessage;
|
return fMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
BMetaData&
|
||||||
|
BMetaData::operator=(const BMetaData& other)
|
||||||
|
{
|
||||||
|
delete fMessage;
|
||||||
|
fMessage = new BMessage(*other.fMessage);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user