diff --git a/src/apps/mediaplayer/Controller.cpp b/src/apps/mediaplayer/Controller.cpp index f6549d274f..b1a147beda 100644 --- a/src/apps/mediaplayer/Controller.cpp +++ b/src/apps/mediaplayer/Controller.cpp @@ -30,8 +30,6 @@ #include #include #include -#include -#include #include #include // for debugging only @@ -48,6 +46,7 @@ #include "MediaTrackVideoSupplier.h" #include "ProxyAudioSupplier.h" #include "ProxyVideoSupplier.h" +#include "TrackSupplier.h" #include "VideoTrackSupplier.h" using std::nothrow; @@ -99,16 +98,13 @@ Controller::Controller() fMuted(false), fItem(NULL), - fMediaFile(NULL), + fTrackSupplier(NULL), fVideoSupplier(new ProxyVideoSupplier()), fAudioSupplier(new ProxyAudioSupplier(this)), fVideoTrackSupplier(NULL), fAudioTrackSupplier(NULL), - fAudioTrackList(4), - fVideoTrackList(2), - fCurrentFrame(0), fDuration(0), fVideoFrameRate(25.0), @@ -240,12 +236,8 @@ Controller::SetTo(const PlaylistItemRef& item) fAudioSupplier->SetSupplier(NULL, fVideoFrameRate); fVideoSupplier->SetSupplier(NULL); - fAudioTrackList.MakeEmpty(); - fVideoTrackList.MakeEmpty(); - - ObjectDeleter oldMediaFileDeleter(fMediaFile); - // BMediaFile destructor will call ReleaseAllTracks() - fMediaFile = NULL; + ObjectDeleter oldTrackSupplierDeleter(fTrackSupplier); + fTrackSupplier = NULL; // Do not delete the supplier chain until after we called // NodeManager::Init() to setup a new media node chain @@ -268,55 +260,27 @@ Controller::SetTo(const PlaylistItemRef& item) if (fItem.Get() == NULL) return B_BAD_VALUE; - BMediaFile* mf = fItem->CreateMediaFile(); - ObjectDeleter mediaFileDeleter(mf); + TrackSupplier* trackSupplier = fItem->CreateTrackSupplier(); + if (trackSupplier == NULL) { + _NotifyFileChanged(item.Get(), B_NO_MEMORY); + return B_NO_MEMORY; + } + ObjectDeleter trackSupplierDeleter(trackSupplier); - status_t err = mf->InitCheck(); + status_t err = trackSupplier->InitCheck(); if (err != B_OK) { printf("Controller::SetTo: initcheck failed\n"); _NotifyFileChanged(item.Get(), err); return err; } - int trackcount = mf->CountTracks(); - if (trackcount <= 0) { - printf("Controller::SetTo: trackcount %d\n", trackcount); + if (trackSupplier->CountAudioTracks() == 0 + && trackSupplier->CountVideoTracks() == 0) { _NotifyFileChanged(item.Get(), B_MEDIA_NO_HANDLER); return B_MEDIA_NO_HANDLER; } - for (int i = 0; i < trackcount; i++) { - BMediaTrack* t = mf->TrackAt(i); - media_format f; - err = t->EncodedFormat(&f); - if (err != B_OK) { - printf("Controller::SetTo: EncodedFormat failed for track index %d, error 0x%08lx (%s)\n", - i, err, strerror(err)); - mf->ReleaseTrack(t); - continue; - } - - if (t->Duration() <= 0) { - printf("Controller::SetTo: warning! track index %d has no duration\n", i); - } - - if (f.IsAudio()) { - if (!fAudioTrackList.AddItem(t)) - return B_NO_MEMORY; - } else if (f.IsVideo()) { - if (!fVideoTrackList.AddItem(t)) - return B_NO_MEMORY; - } else { - printf("Controller::SetTo: track index %d has unknown type\n", i); - mf->ReleaseTrack(t); - } - } - - //printf("Controller::SetTo: %d audio track, %d video track\n", - // AudioTrackCount(), VideoTrackCount()); - - fMediaFile = mf; - mediaFileDeleter.Detach(); + fTrackSupplier = trackSupplier; SelectAudioTrack(0); SelectVideoTrack(0); @@ -324,12 +288,13 @@ Controller::SetTo(const PlaylistItemRef& item) if (fAudioTrackSupplier == NULL && fVideoTrackSupplier == NULL) { printf("Controller::SetTo: no audio or video tracks found or " "no decoders\n"); + fTrackSupplier = NULL; _NotifyFileChanged(item.Get(), B_MEDIA_NO_HANDLER); - delete fMediaFile; - fMediaFile = NULL; return B_MEDIA_NO_HANDLER; } + trackSupplierDeleter.Detach(); + // prevent blocking the creation of new overlay buffers fVideoView->DisableOverlay(); @@ -451,7 +416,9 @@ Controller::AudioTrackCount() { BAutolock _(this); - return fAudioTrackList.CountItems(); + if (fTrackSupplier != NULL) + return fTrackSupplier->CountAudioTracks(); + return 0; } @@ -460,7 +427,9 @@ Controller::VideoTrackCount() { BAutolock _(this); - return fVideoTrackList.CountItems(); + if (fTrackSupplier != NULL) + return fTrackSupplier->CountVideoTracks(); + return 0; } @@ -468,16 +437,17 @@ status_t Controller::SelectAudioTrack(int n) { BAutolock _(this); - - BMediaTrack* track = (BMediaTrack *)fAudioTrackList.ItemAt(n); - if (!track) - return B_ERROR; + if (fTrackSupplier == NULL) + return B_NO_INIT; ObjectDeleter deleter(fAudioTrackSupplier); - fAudioTrackSupplier = new MediaTrackAudioSupplier(track, n); + fAudioTrackSupplier = fTrackSupplier->CreateAudioTrackForIndex(n); + if (fAudioTrackSupplier == NULL) + return B_BAD_INDEX; bigtime_t a = fAudioTrackSupplier->Duration(); - bigtime_t v = fVideoTrackSupplier ? fVideoTrackSupplier->Duration() : 0;; + bigtime_t v = fVideoTrackSupplier != NULL + ? fVideoTrackSupplier->Duration() : 0; fDuration = max_c(a, v); DurationChanged(); // TODO: notify duration changed! @@ -517,18 +487,13 @@ Controller::SelectVideoTrack(int n) { BAutolock _(this); - BMediaTrack* track = (BMediaTrack *)fVideoTrackList.ItemAt(n); - if (!track) - return B_ERROR; + if (fTrackSupplier == NULL) + return B_NO_INIT; - status_t initStatus; ObjectDeleter deleter(fVideoTrackSupplier); - fVideoTrackSupplier = new MediaTrackVideoSupplier(track, n, initStatus); - if (initStatus < B_OK) { - delete fVideoTrackSupplier; - fVideoTrackSupplier = NULL; - return initStatus; - } + fVideoTrackSupplier = fTrackSupplier->CreateVideoTrackForIndex(n); + if (fVideoTrackSupplier == NULL) + return B_BAD_INDEX; bigtime_t a = fAudioTrackSupplier ? fAudioTrackSupplier->Duration() : 0; bigtime_t v = fVideoTrackSupplier->Duration(); @@ -765,7 +730,7 @@ bool Controller::HasFile() { // you need to hold the data lock - return fMediaFile != NULL; + return fTrackSupplier != NULL; } @@ -773,9 +738,9 @@ status_t Controller::GetFileFormatInfo(media_file_format* fileFormat) { // you need to hold the data lock - if (!fMediaFile) + if (!fTrackSupplier) return B_NO_INIT; - return fMediaFile->GetFileFormatInfo(fileFormat); + return fTrackSupplier->GetFileFormatInfo(fileFormat); } @@ -783,10 +748,9 @@ status_t Controller::GetCopyright(BString* copyright) { // you need to hold the data lock - if (!fMediaFile) + if (!fTrackSupplier) return B_NO_INIT; - *copyright = fMediaFile->Copyright(); - return B_OK; + return fTrackSupplier->GetCopyright(copyright); } @@ -855,35 +819,30 @@ Controller::GetAudioCodecInfo(media_codec_info* info) status_t Controller::GetMetaData(BMessage* metaData) { - // TODO: Move API into supplier classes - if (fMediaFile == NULL) + // you need to hold the data lock + if (fTrackSupplier == NULL) return B_NO_INIT; - - return fMediaFile->GetMetaData(metaData); + return fTrackSupplier->GetMetaData(metaData); } status_t Controller::GetVideoMetaData(int32 index, BMessage* metaData) { - // TODO: Move API into supplier classes - BMediaTrack* track = (BMediaTrack*)fVideoTrackList.ItemAt(index); - if (track == NULL) - return B_BAD_INDEX; - - return track->GetMetaData(metaData); + // you need to hold the data lock + if (fTrackSupplier == NULL) + return B_NO_INIT; + return fTrackSupplier->GetVideoMetaData(index, metaData); } status_t Controller::GetAudioMetaData(int32 index, BMessage* metaData) { - // TODO: Move API into supplier classes - BMediaTrack* track = (BMediaTrack*)fAudioTrackList.ItemAt(index); - if (track == NULL) - return B_BAD_INDEX; - - return track->GetMetaData(metaData); + // you need to hold the data lock + if (fTrackSupplier == NULL) + return B_NO_INIT; + return fTrackSupplier->GetAudioMetaData(index, metaData); } diff --git a/src/apps/mediaplayer/Controller.h b/src/apps/mediaplayer/Controller.h index e0706543c5..5b3e048e56 100644 --- a/src/apps/mediaplayer/Controller.h +++ b/src/apps/mediaplayer/Controller.h @@ -36,13 +36,10 @@ class AudioTrackSupplier; -class BBitmap; -class BMediaFile; -class BMediaTrack; +class TrackSupplier; class PlaylistItem; class ProxyAudioSupplier; class ProxyVideoSupplier; -class SoundOutput; class VideoTrackSupplier; class VideoView; @@ -186,22 +183,20 @@ private: virtual void NotifySeekHandled(int64 seekedFrame) const; +private: VideoView* fVideoView; float fVolume; float fActiveVolume; bool fMuted; PlaylistItemRef fItem; - BMediaFile* fMediaFile; + TrackSupplier* fTrackSupplier; ProxyVideoSupplier* fVideoSupplier; ProxyAudioSupplier* fAudioSupplier; VideoTrackSupplier* fVideoTrackSupplier; AudioTrackSupplier* fAudioTrackSupplier; - BList fAudioTrackList; - BList fVideoTrackList; - mutable int64 fCurrentFrame; bigtime_t fDuration; float fVideoFrameRate; diff --git a/src/apps/mediaplayer/Jamfile b/src/apps/mediaplayer/Jamfile index b5d29c7e0c..e445b77c66 100644 --- a/src/apps/mediaplayer/Jamfile +++ b/src/apps/mediaplayer/Jamfile @@ -77,10 +77,12 @@ Application MediaPlayer : # supplier AudioTrackSupplier.cpp + MediaFileTrackSupplier.cpp MediaTrackAudioSupplier.cpp MediaTrackVideoSupplier.cpp ProxyAudioSupplier.cpp ProxyVideoSupplier.cpp + TrackSupplier.cpp VideoTrackSupplier.cpp # support diff --git a/src/apps/mediaplayer/playlist/FilePlaylistItem.cpp b/src/apps/mediaplayer/playlist/FilePlaylistItem.cpp index edb5b212ae..41a555aca7 100644 --- a/src/apps/mediaplayer/playlist/FilePlaylistItem.cpp +++ b/src/apps/mediaplayer/playlist/FilePlaylistItem.cpp @@ -1,5 +1,5 @@ /* - * Copyright © 2009 Stephan Aßmus + * Copyright 2009-2010 Stephan Aßmus * All rights reserved. Distributed under the terms of the MIT license. */ @@ -15,6 +15,8 @@ #include #include +#include "MediaFileTrackSupplier.h" + static const char* kPathKey = "path"; @@ -91,7 +93,39 @@ status_t FilePlaylistItem::SetAttribute(const Attribute& attribute, const BString& string) { - return B_NOT_SUPPORTED; + switch (attribute) { + case ATTR_STRING_NAME: + { + BEntry entry(&fRef, false); + return entry.Rename(string.String(), false); + } + + case ATTR_STRING_KEYWORDS: + return _SetAttribute("Meta:Keywords", B_STRING_TYPE, + string.String(), string.Length()); + + case ATTR_STRING_ARTIST: + return _SetAttribute("Audio:Artist", B_STRING_TYPE, + string.String(), string.Length()); + case ATTR_STRING_AUTHOR: + return _SetAttribute("Media:Author", B_STRING_TYPE, + string.String(), string.Length()); + case ATTR_STRING_ALBUM: + return _SetAttribute("Audio:Album", B_STRING_TYPE, + string.String(), string.Length()); + case ATTR_STRING_TITLE: + return _SetAttribute("Media:Title", B_STRING_TYPE, + string.String(), string.Length()); + case ATTR_STRING_AUDIO_BITRATE: + return _SetAttribute("Audio:Bitrate", B_STRING_TYPE, + string.String(), string.Length()); + case ATTR_STRING_VIDEO_BITRATE: + return _SetAttribute("Video:Bitrate", B_STRING_TYPE, + string.String(), string.Length()); + + default: + return B_NOT_SUPPORTED; + } } @@ -103,6 +137,7 @@ FilePlaylistItem::GetAttribute(const Attribute& attribute, string = fRef.name; return B_OK; } + return B_NOT_SUPPORTED; } @@ -111,7 +146,20 @@ status_t FilePlaylistItem::SetAttribute(const Attribute& attribute, const int32& value) { - return B_NOT_SUPPORTED; + switch (attribute) { + case ATTR_INT32_TRACK: + return _SetAttribute("Audio:Track", B_INT32_TYPE, &value, + sizeof(int32)); + case ATTR_INT32_YEAR: + return _SetAttribute("Media:Year", B_INT32_TYPE, &value, + sizeof(int32)); + case ATTR_INT32_RATING: + return _SetAttribute("Media:Rating", B_INT32_TYPE, &value, + sizeof(int32)); + + default: + return B_NOT_SUPPORTED; + } } @@ -292,9 +340,55 @@ BEntry entry(path.Path()); // #pragma mark - -BMediaFile* -FilePlaylistItem::CreateMediaFile() const +TrackSupplier* +FilePlaylistItem::CreateTrackSupplier() const { - return new (std::nothrow) BMediaFile(&fRef); + BMediaFile* mediaFile = new(std::nothrow) BMediaFile(&fRef); + if (mediaFile == NULL) + return NULL; + TrackSupplier* supplier + = new(std::nothrow) MediaFileTrackSupplier(mediaFile); + if (supplier == NULL) + delete mediaFile; + + return supplier; +} + + +status_t +FilePlaylistItem::_SetAttribute(const char* attrName, type_code type, + const void* data, size_t size) +{ + BEntry entry(&fRef, true); + BNode node(&entry); + if (node.InitCheck() != B_OK) + return node.InitCheck(); + + ssize_t written = node.WriteAttr(attrName, type, 0, data, size); + if (written != (ssize_t)size) { + if (written < 0) + return (status_t)written; + return B_IO_ERROR; + } + return B_OK; +} + + +status_t +FilePlaylistItem::_GetAttribute(const char* attrName, type_code type, + void* data, size_t size) +{ + BEntry entry(&fRef, true); + BNode node(&entry); + if (node.InitCheck() != B_OK) + return node.InitCheck(); + + ssize_t read = node.ReadAttr(attrName, type, 0, data, size); + if (read != (ssize_t)size) { + if (read < 0) + return (status_t)read; + return B_IO_ERROR; + } + return B_OK; } diff --git a/src/apps/mediaplayer/playlist/FilePlaylistItem.h b/src/apps/mediaplayer/playlist/FilePlaylistItem.h index 7e1017a12c..2272016cfd 100644 --- a/src/apps/mediaplayer/playlist/FilePlaylistItem.h +++ b/src/apps/mediaplayer/playlist/FilePlaylistItem.h @@ -1,5 +1,5 @@ /* - * Copyright © 2009 Stephan Aßmus + * Copyright 2009-2010 Stephan Aßmus * All rights reserved. Distributed under the terms of the MIT license. */ #ifndef FILE_PLAYLIST_ITEM_H @@ -48,10 +48,18 @@ public: virtual status_t RestoreFromTrash(); // playback - virtual BMediaFile* CreateMediaFile() const; + virtual TrackSupplier* CreateTrackSupplier() const; const entry_ref& Ref() const { return fRef; } +private: + status_t _SetAttribute(const char* attrName, + type_code type, const void* data, + size_t size); + status_t _GetAttribute(const char* attrName, + type_code type, void* data, + size_t size); + private: entry_ref fRef; BString fNameInTrash; diff --git a/src/apps/mediaplayer/playlist/PlaylistItem.cpp b/src/apps/mediaplayer/playlist/PlaylistItem.cpp index 5d24142b96..1bec6a7013 100644 --- a/src/apps/mediaplayer/playlist/PlaylistItem.cpp +++ b/src/apps/mediaplayer/playlist/PlaylistItem.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2009 Stephan Aßmus + * Copyright 2009-2010 Stephan Aßmus * All rights reserved. Distributed under the terms of the MIT license. */ @@ -100,26 +100,6 @@ PlaylistItem::TrackNumber() const } -int32 -PlaylistItem::BitRate() const -{ - int32 bitrate; - if (GetAttribute(ATTR_INT32_BIT_RATE, bitrate) != B_OK) - bitrate = 0; - return bitrate; -} - - -bigtime_t -PlaylistItem::Duration() const -{ - bigtime_t duration; - if (GetAttribute(ATTR_INT64_DURATION, duration) != B_OK) - duration = 0; - return duration; -} - - void PlaylistItem::SetPlaybackFailed() { diff --git a/src/apps/mediaplayer/playlist/PlaylistItem.h b/src/apps/mediaplayer/playlist/PlaylistItem.h index b702d19372..b896df5b77 100644 --- a/src/apps/mediaplayer/playlist/PlaylistItem.h +++ b/src/apps/mediaplayer/playlist/PlaylistItem.h @@ -1,22 +1,24 @@ /* - * Copyright 2009 Stephan Aßmus + * Copyright 2009-2010 Stephan Aßmus * All rights reserved. Distributed under the terms of the MIT license. */ #ifndef PLAYLIST_ITEM_H #define PLAYLIST_ITEM_H + #include #include #include #include #include -class BBitmap; -class BDataIO; -class BMediaFile; -class BMessage; -class PlaylistItem : public BArchivable, public Referenceable { +class BBitmap; +class BMessage; +class TrackSupplier; + + +class PlaylistItem : public BArchivable, public BReferenceable { public: class Listener { public: @@ -38,19 +40,20 @@ public: // attributes typedef enum { - ATTR_STRING_NAME = 'name', - ATTR_STRING_KEYWORDS = 'kwrd', + ATTR_STRING_NAME = 'name', + ATTR_STRING_KEYWORDS = 'kwrd', - ATTR_STRING_AUTHOR = 'auth', - ATTR_STRING_ALBUM = 'albm', - ATTR_STRING_TITLE = 'titl', + ATTR_STRING_ARTIST = 'arst', + ATTR_STRING_AUTHOR = 'auth', + ATTR_STRING_ALBUM = 'albm', + ATTR_STRING_TITLE = 'titl', + ATTR_STRING_AUDIO_BITRATE = 'abtr', + ATTR_STRING_VIDEO_BITRATE = 'vbtr', + ATTR_STRING_DURATION = 'drtn', - ATTR_INT32_TRACK = 'trck', - ATTR_INT32_YEAR = 'year', - ATTR_INT32_RATING = 'rtng', - ATTR_INT32_BIT_RATE = 'btrt', - - ATTR_INT64_DURATION = 'drtn' + ATTR_INT32_TRACK = 'trck', + ATTR_INT32_YEAR = 'year', + ATTR_INT32_RATING = 'rtng' } Attribute; virtual status_t SetAttribute(const Attribute& attribute, @@ -75,9 +78,6 @@ public: BString Title() const; int32 TrackNumber() const; - int32 BitRate() const; - - bigtime_t Duration() const; // methods virtual BString LocationURI() const = 0; @@ -88,7 +88,7 @@ public: virtual status_t RestoreFromTrash() = 0; // playback - virtual BMediaFile* CreateMediaFile() const = 0; + virtual TrackSupplier* CreateTrackSupplier() const = 0; void SetPlaybackFailed(); bool PlaybackFailed() const @@ -106,6 +106,6 @@ private: bool fPlaybackFailed; }; -typedef Reference PlaylistItemRef; +typedef BReference PlaylistItemRef; #endif // PLAYLIST_ITEM_H diff --git a/src/apps/mediaplayer/supplier/MediaFileTrackSupplier.cpp b/src/apps/mediaplayer/supplier/MediaFileTrackSupplier.cpp new file mode 100644 index 0000000000..68674ee39c --- /dev/null +++ b/src/apps/mediaplayer/supplier/MediaFileTrackSupplier.cpp @@ -0,0 +1,168 @@ +/* + * Copyright 2010, Stephan Aßmus . All rights reserved. + * Distributed under the terms of the MIT License. + */ + + +#include "MediaFileTrackSupplier.h" + +#include + +#include +#include + +#include +#include +#include + +#include "MediaTrackAudioSupplier.h" +#include "MediaTrackVideoSupplier.h" + + +MediaFileTrackSupplier::MediaFileTrackSupplier(BMediaFile* mediaFile) + : + TrackSupplier(), + fMediaFile(mediaFile) +{ + if (fMediaFile->InitCheck() != B_OK) + return; + int trackCount = fMediaFile->CountTracks(); + if (trackCount <= 0) + return; + + for (int i = 0; i < trackCount; i++) { + BMediaTrack* track = fMediaFile->TrackAt(i); + media_format format; + status_t status = track->EncodedFormat(&format); + if (status != B_OK) { + fprintf(stderr, "MediaFileTrackSupplier: EncodedFormat failed for " + "track index %d, error: %s\n", i, strerror(status)); + fMediaFile->ReleaseTrack(track); + continue; + } + + if (track->Duration() <= 0) { + fprintf(stderr, "MediaFileTrackSupplier: warning! track index %d " + "has no duration\n", i); + } + + if (format.IsAudio()) { + if (!fAudioTracks.AddItem(track)) { + fMediaFile->ReleaseTrack(track); + return; + } + } else if (format.IsVideo()) { + if (!fVideoTracks.AddItem(track)) { + fMediaFile->ReleaseTrack(track); + return; + } + } else { + printf("MediaFileTrackSupplier: track index %d has unknown " + "type\n", i); + fMediaFile->ReleaseTrack(track); + } + } +} + + +MediaFileTrackSupplier::~MediaFileTrackSupplier() +{ + delete fMediaFile; + // BMediaFile destructor will call ReleaseAllTracks() +} + + +status_t +MediaFileTrackSupplier::InitCheck() +{ + return fMediaFile->InitCheck(); +} + + +status_t +MediaFileTrackSupplier::GetFileFormatInfo(media_file_format* fileFormat) +{ + return fMediaFile->GetFileFormatInfo(fileFormat); +} + + +status_t +MediaFileTrackSupplier::GetCopyright(BString* copyright) +{ + *copyright = fMediaFile->Copyright(); + return B_OK; +} + + +status_t +MediaFileTrackSupplier::GetMetaData(BMessage* metaData) +{ + return fMediaFile->GetMetaData(metaData); +} + + +int32 +MediaFileTrackSupplier::CountAudioTracks() +{ + return fAudioTracks.CountItems(); +} + + +int32 +MediaFileTrackSupplier::CountVideoTracks() +{ + return fVideoTracks.CountItems(); +} + + +status_t +MediaFileTrackSupplier::GetAudioMetaData(int32 index, BMessage* metaData) +{ + BMediaTrack* track = (BMediaTrack*)fAudioTracks.ItemAt(index); + if (track == NULL) + return B_BAD_INDEX; + + return track->GetMetaData(metaData); +} + + +status_t +MediaFileTrackSupplier::GetVideoMetaData(int32 index, BMessage* metaData) +{ + BMediaTrack* track = (BMediaTrack*)fVideoTracks.ItemAt(index); + if (track == NULL) + return B_BAD_INDEX; + + return track->GetMetaData(metaData); +} + + +AudioTrackSupplier* +MediaFileTrackSupplier::CreateAudioTrackForIndex(int32 index) +{ + BMediaTrack* track = (BMediaTrack*)fAudioTracks.ItemAt(index); + if (track == NULL) + return NULL; + + return new(std::nothrow) MediaTrackAudioSupplier(track, index); +} + + +VideoTrackSupplier* +MediaFileTrackSupplier::CreateVideoTrackForIndex(int32 index) +{ + BMediaTrack* track = (BMediaTrack*)fVideoTracks.ItemAt(index); + if (track == NULL) + return NULL; + + status_t initStatus; + MediaTrackVideoSupplier* supplier + = new(std::nothrow) MediaTrackVideoSupplier(track, index, initStatus); + if (initStatus != B_OK) { + delete supplier; + return NULL; + } + + return supplier; +} + diff --git a/src/apps/mediaplayer/supplier/MediaFileTrackSupplier.h b/src/apps/mediaplayer/supplier/MediaFileTrackSupplier.h new file mode 100644 index 0000000000..1306557a1e --- /dev/null +++ b/src/apps/mediaplayer/supplier/MediaFileTrackSupplier.h @@ -0,0 +1,47 @@ +/* + * Copyright 2010, Stephan Aßmus . All rights reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef MEDIA_FILE_TRACK_SUPPLIER_H +#define MEDIA_FILE_TRACK_SUPPLIER_H + + +#include + +#include "TrackSupplier.h" + + +class BMediaFile; + + +class MediaFileTrackSupplier : public TrackSupplier { +public: + MediaFileTrackSupplier(BMediaFile* mediaFile); + virtual ~MediaFileTrackSupplier(); + + virtual status_t InitCheck(); + + virtual status_t GetFileFormatInfo( + media_file_format* fileFormat); + virtual status_t GetCopyright(BString* copyright); + virtual status_t GetMetaData(BMessage* metaData); + + virtual int32 CountAudioTracks(); + virtual int32 CountVideoTracks(); + + virtual status_t GetAudioMetaData(int32 index, + BMessage* metaData); + virtual status_t GetVideoMetaData(int32 index, + BMessage* metaData); + + virtual AudioTrackSupplier* CreateAudioTrackForIndex(int32 index); + virtual VideoTrackSupplier* CreateVideoTrackForIndex(int32 index); + +private: + BMediaFile* fMediaFile; + BList fAudioTracks; + BList fVideoTracks; +}; + + +#endif // MEDIA_FILE_TRACK_SUPPLIER_H diff --git a/src/apps/mediaplayer/supplier/TrackSupplier.cpp b/src/apps/mediaplayer/supplier/TrackSupplier.cpp new file mode 100644 index 0000000000..77fcf678e2 --- /dev/null +++ b/src/apps/mediaplayer/supplier/TrackSupplier.cpp @@ -0,0 +1,18 @@ +/* + * Copyright 2010, Stephan Aßmus . All rights reserved. + * Distributed under the terms of the MIT License. + */ + + +#include "TrackSupplier.h" + + +TrackSupplier::TrackSupplier() +{ +} + + +TrackSupplier::~TrackSupplier() +{ +} + diff --git a/src/apps/mediaplayer/supplier/TrackSupplier.h b/src/apps/mediaplayer/supplier/TrackSupplier.h new file mode 100644 index 0000000000..e686fba82b --- /dev/null +++ b/src/apps/mediaplayer/supplier/TrackSupplier.h @@ -0,0 +1,45 @@ +/* + * Copyright 2010, Stephan Aßmus . All rights reserved. + * Distributed under the terms of the MIT License. + */ +#ifndef TRACK_SUPPLIER_H +#define TRACK_SUPPLIER_H + + +#include +#include + +#include "AudioTrackSupplier.h" +#include "VideoTrackSupplier.h" + + +class BMessage; +class BString; + + +class TrackSupplier { +public: + TrackSupplier(); + virtual ~TrackSupplier(); + + virtual status_t InitCheck() = 0; + + virtual status_t GetFileFormatInfo( + media_file_format* fileFormat) = 0; + virtual status_t GetCopyright(BString* copyright) = 0; + virtual status_t GetMetaData(BMessage* metaData) = 0; + + virtual int32 CountAudioTracks() = 0; + virtual int32 CountVideoTracks() = 0; + + virtual status_t GetAudioMetaData(int32 index, + BMessage* metaData) = 0; + virtual status_t GetVideoMetaData(int32 index, + BMessage* metaData) = 0; + + virtual AudioTrackSupplier* CreateAudioTrackForIndex(int32 index) = 0; + virtual VideoTrackSupplier* CreateVideoTrackForIndex(int32 index) = 0; +}; + + +#endif // TRACK_SUPPLIER_H