hrev50164 adds 21 changesets to branch 'master'
old head: 6a8276c4643accc4b70cbb80de2df6c978f2d231
new head: 8c7679851f61f3e9d32951ea7eff7a89c78f9442
overview:
http://cgit.haiku-os.org/haiku/log/?qt=range&q=8c7679851f61+%5E6a8276c4643a
----------------------------------------------------------------------------
7b79e0694e39: Add prototype BMediaIO interface
b42aac7bf552: PluginManager: Initial switch to BMediaIO
a6b34a8c45c4: ffmpeg: Initial switch to BMediaIO
6efbc4bb54d6: BMediaFile: Move BBufferIO usage into the plugin manager
* Add InitCheck for the wrapper status.
deb91660547c: PluginManager: Refactor of MediaIOWrapper
* Use BPositionIO version of Read/Write.
* Implementation of fallback buffering.
* Other cleanup.
ef167f1150e1: BMediaIOWrapper: Refer on fallback buffer Position()
* Write the data into the fallback buffer when emulating
pseudo seeked writes.
36ffce0a1479: BMediaIOWrapper: Delete data in destructor
382c78dface6: BMediaIOWrapper: Check if we can really seek the data.
050118ef531b: Remove TODOs
0d88bf3ac4e7: MediaIO: Review behavior regarding object inheritance
3d8e0d38e13e: Add initial design of StreamerPlugin
63e1708eeee0: Finalize StreamerPlugin
* Add cpp file.
* Make Sniff virtual.
b1ccc0586460: AddOnManager: Initial support for streamer addons
a2b3f126981f: MediaExtractor: Adapt to new BUrl functionality
20ae088fa5a7: MediaWriter: Add new BUrl functionality
b77760282767: MediaFile: Rework to support BUrl sources
3733e4b2ab6e: PluginManager/AddOnManager: Add streamers support code
22c93142552c: MediaExtractor/PluginManager: Add plugin deletion when extractor
die
25527aff5cb5: MediaIOWrapper: IsEndless was not used the right way
* The idea is to just identify when a BMediaIO is able
to tell the whole size of the data, but caching needs
more complex policies to be successful.
2250435e4cd0: PluginManager: Add debug to wrapper
8c7679851f61: Move MediaIO in it's own header
[ Dario Casalinuovo <b.vitruvio@xxxxxxxxx> ]
----------------------------------------------------------------------------
18 files changed, 650 insertions(+), 77 deletions(-)
headers/os/media/MediaFile.h | 17 +-
headers/private/media/MediaExtractor.h | 10 +
headers/private/media/MediaIO.h | 34 +++
headers/private/media/MediaWriter.h | 8 +
headers/private/media/PluginManager.h | 7 +-
headers/private/media/StreamerPlugin.h | 47 +++
.../media/plugins/ffmpeg/AVFormatReader.cpp | 40 ++-
.../media/plugins/ffmpeg/AVFormatWriter.cpp | 11 +-
src/kits/media/AddOnManager.cpp | 40 +++
src/kits/media/AddOnManager.h | 11 +
src/kits/media/Jamfile | 2 +
src/kits/media/MediaExtractor.cpp | 41 ++-
src/kits/media/MediaFile.cpp | 88 +++---
src/kits/media/MediaIO.cpp | 31 ++
src/kits/media/MediaWriter.cpp | 25 ++
src/kits/media/PluginManager.cpp | 289 ++++++++++++++++++-
src/kits/media/StreamerPlugin.cpp | 25 ++
src/kits/support/DataIO.cpp | 1 -
############################################################################
Commit: 7b79e0694e396d2bae190bd07acc6c2279e7b0d3
URL: http://cgit.haiku-os.org/haiku/commit/?id=7b79e0694e39
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Sun Mar 6 15:59:50 2016 UTC
Add prototype BMediaIO interface
----------------------------------------------------------------------------
diff --git a/headers/os/support/DataIO.h b/headers/os/support/DataIO.h
index d05a4c8..e110342 100644
--- a/headers/os/support/DataIO.h
+++ b/headers/os/support/DataIO.h
@@ -163,4 +163,29 @@ private:
};
+class BMediaIO : public BPositionIO {
+public:
+ BMediaIO();
+ virtual ~BMediaIO();
+
+ virtual bool IsSeekable() const = 0;
+ virtual bool IsFile() const = 0;
+
+ virtual bool IsEndless() const = 0;
+ virtual bool IsCached() const = 0;
+ virtual size_t CacheSize() const = 0;
+
+private:
+ BMediaIO(const
BMediaIO&);
+ BMallocIO& operator=(const
BMediaIO&);
+
+ virtual void _ReservedMediaIO1();
+ virtual void _ReservedMediaIO2();
+ virtual void _ReservedMediaIO3();
+ virtual void _ReservedMediaIO4();
+ virtual void _ReservedMediaIO5();
+
+ uint32 _reserved[1];
+};
+
#endif // _DATA_IO_H
diff --git a/src/kits/support/DataIO.cpp b/src/kits/support/DataIO.cpp
index e7033ab..1a647d2 100644
--- a/src/kits/support/DataIO.cpp
+++ b/src/kits/support/DataIO.cpp
@@ -602,3 +602,26 @@ BMallocIO::operator=(const BMallocIO &)
void BMallocIO::_ReservedMallocIO1() {}
void BMallocIO::_ReservedMallocIO2() {}
+
+BMediaIO::BMediaIO()
+{
+}
+
+
+BMediaIO::BMediaIO(const BMediaIO &)
+{
+ // copying not allowed...
+}
+
+
+BMediaIO::~BMediaIO()
+{
+}
+
+
+// FBC
+void BMediaIO::_ReservedMediaIO1() {}
+void BMediaIO::_ReservedMediaIO2() {}
+void BMediaIO::_ReservedMediaIO3() {}
+void BMediaIO::_ReservedMediaIO4() {}
+void BMediaIO::_ReservedMediaIO5() {}
############################################################################
Commit: b42aac7bf552a7a79416fec4f2bffb8d3bc86894
URL: http://cgit.haiku-os.org/haiku/commit/?id=b42aac7bf552
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Sun Mar 6 16:00:24 2016 UTC
PluginManager: Initial switch to BMediaIO
----------------------------------------------------------------------------
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index 332111b..e8d8aee 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -4,6 +4,8 @@
*/
#include <Path.h>
+#include <DataIO.h>
+#include <File.h>
#include <image.h>
#include <string.h>
@@ -16,6 +18,163 @@
PluginManager gPluginManager;
+class BMediaIOWrapper : public BMediaIO {
+public:
+ BMediaIOWrapper(BDataIO* source)
+ :
+ fData(NULL),
+ fPosition(NULL),
+ fMedia(NULL),
+ fFile(NULL)
+ {
+ fData = dynamic_cast<BDataIO*>(source);
+ fPosition = dynamic_cast<BPositionIO*>(source);
+ fMedia = dynamic_cast<BMediaIO*>(source);
+ fFile = dynamic_cast<BFile*>(source);
+ }
+
+ virtual ~BMediaIOWrapper()
+ {
+ }
+
+ virtual ssize_t Read(void* buffer, size_t size)
+ {
+ return fData->Read(buffer, size);
+ }
+
+ virtual ssize_t Write(const void* buffer,
size_t size)
+ {
+ return fData->Write(buffer, size);
+ }
+
+ virtual status_t Flush()
+ {
+ return fData->Flush();
+ }
+
+ virtual ssize_t ReadAt(off_t position, void*
buffer,
+ size_t
size)
+ {
+ if (IsSeekable())
+ return fPosition->ReadAt(position, buffer, size);
+
+ // if (IsCached()) {
+ //
+ // }
+
+ return B_NOT_SUPPORTED;
+ }
+
+ virtual ssize_t WriteAt(off_t position, const
void* buffer,
+ size_t
size)
+ {
+ if (IsSeekable())
+ return fPosition->WriteAt(position, buffer, size);
+
+ return B_NOT_SUPPORTED;
+ }
+
+ virtual off_t Seek(off_t position, uint32
seekMode)
+ {
+ if (IsSeekable())
+ return fPosition->Seek(position, seekMode);
+
+ // if (IsCached()) {
+ //
+ // }
+
+ return B_NOT_SUPPORTED;
+ }
+
+ virtual off_t Position() const
+ {
+ if (!IsEndless())
+ return fPosition->Position();
+
+ // TODO: buffering
+
+ return 0;
+ }
+
+ virtual status_t SetSize(off_t size)
+ {
+ if (IsEndless())
+ return B_NOT_SUPPORTED;
+
+ return fPosition->SetSize(size);
+ }
+
+ virtual status_t GetSize(off_t* size) const
+ {
+ if (IsEndless())
+ return B_NOT_SUPPORTED;
+
+ return fPosition->GetSize(size);
+ }
+
+ virtual bool IsSeekable() const
+ {
+ if (IsMedia())
+ return fMedia->IsSeekable();
+
+ return IsPosition();
+ }
+
+ virtual bool IsFile() const
+ {
+ return fFile != NULL;
+ }
+
+ virtual bool IsEndless() const
+ {
+ if (IsMedia())
+ return fMedia->IsEndless();
+ if (IsPosition())
+ return false;
+
+ return true;
+ }
+
+ virtual bool IsCached() const
+ {
+ return true;
+ }
+
+ virtual size_t CacheSize() const
+ {
+ // TODO: it should be another buffering level
+ // but we might to optimize with the underlying level
+ //if (IsMedia() && IsCached())
+ // return CacheSize();
+
+ return B_NOT_SUPPORTED;
+ }
+
+protected:
+ // Utility methods
+ bool IsData() const
+ {
+ return fData != NULL;
+ }
+
+ bool IsPosition() const
+ {
+ return fPosition != NULL;
+ }
+
+ bool IsMedia() const
+ {
+ return fMedia != NULL;
+ }
+
+private:
+ BDataIO* fData;
+ BPositionIO* fPosition;
+ BMediaIO* fMedia;
+ BFile* fFile;
+};
+
+
// #pragma mark - Readers/Decoders
@@ -25,12 +184,10 @@ PluginManager::CreateReader(Reader** reader, int32*
streamCount,
{
TRACE("PluginManager::CreateReader enter\n");
- BPositionIO *seekable_source = dynamic_cast<BPositionIO *>(source);
- if (seekable_source == 0) {
- printf("PluginManager::CreateReader: non-seekable sources not "
- "supported yet\n");
- return B_ERROR;
- }
+ // The wrapper class will present our source in a more useful
+ // way, we create an instance which is buffering our reads and
+ // writes.
+ BMediaIOWrapper* buffered_source = new BMediaIOWrapper(source);
// get list of available readers from the server
entry_ref refs[MAX_READERS];
@@ -67,8 +224,8 @@ PluginManager::CreateReader(Reader** reader, int32*
streamCount,
return B_ERROR;
}
- seekable_source->Seek(0, SEEK_SET);
- (*reader)->Setup(seekable_source);
+ buffered_source->Seek(0, SEEK_SET);
+ (*reader)->Setup(buffered_source);
(*reader)->fMediaPlugin = plugin;
if ((*reader)->Sniff(streamCount) == B_OK) {
############################################################################
Commit: a6b34a8c45c4edf7bdc6cd808c2beef34206deb8
URL: http://cgit.haiku-os.org/haiku/commit/?id=a6b34a8c45c4
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Sun Mar 6 16:00:58 2016 UTC
ffmpeg: Initial switch to BMediaIO
----------------------------------------------------------------------------
diff --git a/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp
b/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp
index 25c1bae..288aee7 100644
--- a/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp
+++ b/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp
@@ -126,7 +126,7 @@ avdictionary_to_message(AVDictionary* dictionary, BMessage*
message)
class StreamBase {
public:
-
StreamBase(BPositionIO* source,
+
StreamBase(BMediaIO* source,
BLocker* sourceLock, BLocker* streamLock);
virtual ~StreamBase();
@@ -156,17 +156,9 @@ public:
protected:
// I/O hooks for libavformat, cookie will be a Stream instance.
- // Since multiple StreamCookies use the same BPositionIO source, they
+ // Since multiple StreamCookies use the same BMediaIO source, they
// maintain the position individually, and may need to seek the source
// if it does not match anymore in _Read().
- // TODO: This concept prevents the use of a plain BDataIO that is not
- // seekable. There is a version of AVFormatReader in the SVN history
- // which implements packet buffering for other streams when reading
- // packets. To support non-seekable network streams for example, this
- // code should be resurrected. It will make handling seekable streams,
- // especially from different threads that read from totally independent
- // positions in the stream (aggressive pre-buffering perhaps), a lot
- // more difficult with potentially large memory overhead.
static int _Read(void* cookie,
uint8* buffer,
int
bufferSize);
static off_t _Seek(void* cookie, off_t
offset, int whence);
@@ -177,7 +169,7 @@ protected:
bigtime_t
_ConvertFromStreamTimeBase(int64_t time) const;
protected:
- BPositionIO* fSource;
+ BMediaIO* fSource;
off_t fPosition;
// Since different threads may read from the source,
// we need to protect the file position and I/O by a
lock.
@@ -201,7 +193,7 @@ protected:
};
-StreamBase::StreamBase(BPositionIO* source, BLocker* sourceLock,
+StreamBase::StreamBase(BMediaIO* source, BLocker* sourceLock,
BLocker* streamLock)
:
fSource(source),
@@ -474,8 +466,10 @@ StreamBase::Seek(uint32 flags, int64* frame, bigtime_t*
time)
BAutolock _(fSourceLock);
int64_t fileSize;
+
if (fSource->GetSize(&fileSize) != B_OK)
return B_NOT_SUPPORTED;
+
int64_t duration = Duration();
if (duration == 0)
return B_NOT_SUPPORTED;
@@ -762,11 +756,13 @@ StreamBase::_Read(void* cookie, uint8* buffer, int
bufferSize)
BAutolock _(stream->fSourceLock);
- TRACE_IO("StreamBase::_Read(%p, %p, %d) position: %lld/%lld\n",
- cookie, buffer, bufferSize, stream->fPosition,
- stream->fSource->Position());
+ TRACE_IO("StreamBase::_Read(%p, %p, %d) position: %lld\n",
+ cookie, buffer, bufferSize, stream->fPosition);
if (stream->fPosition != stream->fSource->Position()) {
+ TRACE_IO("StreamBase::_Read fSource position: %lld\n",
+ stream->fSource->Position());
+
off_t position
= stream->fSource->Seek(stream->fPosition, SEEK_SET);
if (position != stream->fPosition)
@@ -887,7 +883,7 @@ StreamBase::_ConvertFromStreamTimeBase(int64_t time) const
class AVFormatReader::Stream : public StreamBase {
public:
-
Stream(BPositionIO* source,
+
Stream(BMediaIO* source,
BLocker* streamLock);
virtual ~Stream();
@@ -924,7 +920,7 @@ private:
-AVFormatReader::Stream::Stream(BPositionIO* source, BLocker* streamLock)
+AVFormatReader::Stream::Stream(BMediaIO* source, BLocker* streamLock)
:
StreamBase(source, streamLock, &fLock),
fLock("stream lock"),
@@ -1472,9 +1468,9 @@ AVFormatReader::Sniff(int32* _streamCount)
{
TRACE("AVFormatReader::Sniff\n");
- BPositionIO* source = dynamic_cast<BPositionIO*>(Source());
+ BMediaIO* source = dynamic_cast<BMediaIO*>(Source());
if (source == NULL) {
- TRACE(" not a BPositionIO, but we need it to be one.\n");
+ TRACE(" not a BMediaIO, but we need it to be one.\n");
return B_NOT_SUPPORTED;
}
@@ -1647,9 +1643,9 @@ AVFormatReader::AllocateCookie(int32 streamIndex, void**
_cookie)
Stream* cookie = fStreams[streamIndex];
if (cookie == NULL) {
// Allocate the cookie
- BPositionIO* source = dynamic_cast<BPositionIO*>(Source());
+ BMediaIO* source = dynamic_cast<BMediaIO*>(Source());
if (source == NULL) {
- TRACE(" not a BPositionIO, but we need it to be
one.\n");
+ TRACE(" not a BMediaIO, but we need it to be one.\n");
return B_NOT_SUPPORTED;
}
diff --git a/src/add-ons/media/plugins/ffmpeg/AVFormatWriter.cpp
b/src/add-ons/media/plugins/ffmpeg/AVFormatWriter.cpp
index 983b4e0..842fcdf 100644
--- a/src/add-ons/media/plugins/ffmpeg/AVFormatWriter.cpp
+++ b/src/add-ons/media/plugins/ffmpeg/AVFormatWriter.cpp
@@ -640,19 +640,20 @@ AVFormatWriter::_Seek(void* cookie, off_t offset, int
whence)
AVFormatWriter* writer = reinterpret_cast<AVFormatWriter*>(cookie);
- BPositionIO* positionIO = dynamic_cast<BPositionIO*>(writer->fTarget);
- if (positionIO == NULL)
+ BMediaIO* mediaIO = dynamic_cast<BMediaIO*>(writer->fTarget);
+ if (mediaIO == NULL)
return -1;
// Support for special file size retrieval API without seeking anywhere:
if (whence == AVSEEK_SIZE) {
off_t size;
- if (positionIO->GetSize(&size) == B_OK)
+ if (mediaIO->GetSize(&size) == B_OK)
return size;
+
return -1;
}
- off_t position = positionIO->Seek(offset, whence);
+ off_t position = mediaIO->Seek(offset, whence);
TRACE_IO(" position: %lld\n", position);
if (position < 0)
return -1;
############################################################################
Commit: 6efbc4bb54d6eae2cc56e27d6301c0d5eae6191c
URL: http://cgit.haiku-os.org/haiku/commit/?id=6efbc4bb54d6
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Sun Mar 6 16:52:14 2016 UTC
BMediaFile: Move BBufferIO usage into the plugin manager
* Add InitCheck for the wrapper status.
----------------------------------------------------------------------------
diff --git a/src/kits/media/MediaFile.cpp b/src/kits/media/MediaFile.cpp
index 1356571..acedc12 100644
--- a/src/kits/media/MediaFile.cpp
+++ b/src/kits/media/MediaFile.cpp
@@ -11,7 +11,6 @@
#include <stdlib.h>
#include <string.h>
-#include <BufferIO.h>
#include <File.h>
#include <MediaTrack.h>
@@ -454,22 +453,6 @@ BMediaFile::_InitReader(BDataIO* source, int32 flags)
return;
}
- if (dynamic_cast<BBufferIO *>(source)) {
- // Already buffered
- } else {
- // Source needs to be at least a BPositionIO to wrap with a
BBufferIO
- if (dynamic_cast<BPositionIO *>(source)) {
- fSource = new(std::nothrow)
BBufferIO(dynamic_cast<BPositionIO *>(
- source), 65536, fDeleteSource);
- if (fSource == NULL) {
- fErr = B_NO_MEMORY;
- return;
- }
- fDeleteSource = true;
- } else
- TRACE("Unable to improve performance with a
BufferIO\n");
- }
-
fExtractor = new(std::nothrow) MediaExtractor(fSource, flags);
if (fExtractor == NULL)
fErr = B_NO_MEMORY;
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index e8d8aee..7247cde 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -3,10 +3,12 @@
* Distributed under the terms of the OpenBeOS License.
*/
-#include <Path.h>
+#include <BufferIO.h>
#include <DataIO.h>
#include <File.h>
#include <image.h>
+#include <Path.h>
+
#include <string.h>
#include "AddOnManager.h"
@@ -25,11 +27,32 @@ public:
fData(NULL),
fPosition(NULL),
fMedia(NULL),
- fFile(NULL)
+ fFile(NULL),
+ fErr(B_NO_ERROR)
{
- fData = dynamic_cast<BDataIO*>(source);
fPosition = dynamic_cast<BPositionIO*>(source);
fMedia = dynamic_cast<BMediaIO*>(source);
+
+ // No need to do additional buffering if we have
+ // a BBufferIO or a BMediaIO.
+ if (dynamic_cast<BBufferIO *>(source) == NULL
+ && fMedia == NULL) {
+ // Source needs to be at least a BPositionIO to wrap
with a BBufferIO
+ if (fPosition != NULL) {
+ fPosition = new(std::nothrow)
BBufferIO(fPosition, 65536, true);
+ // We have to reset our BDataIO reference
+ fData = dynamic_cast<BDataIO*>(fPosition);
+ if (fPosition == NULL) {
+ fErr = B_NO_MEMORY;
+ return;
+ }
+ } else {
+ TRACE("Unable to improve performance with a
BufferIO\n");
+ // TODO: fallback buffering
+ }
+ } else {
+ fData = source;
+ }
fFile = dynamic_cast<BFile*>(source);
}
@@ -150,6 +173,11 @@ public:
return B_NOT_SUPPORTED;
}
+ status_t InitCheck() const
+ {
+ return fErr;
+ }
+
protected:
// Utility methods
bool IsData() const
@@ -172,6 +200,8 @@ private:
BPositionIO* fPosition;
BMediaIO* fMedia;
BFile* fFile;
+
+ status_t fErr;
};
@@ -188,12 +218,15 @@ PluginManager::CreateReader(Reader** reader, int32*
streamCount,
// way, we create an instance which is buffering our reads and
// writes.
BMediaIOWrapper* buffered_source = new BMediaIOWrapper(source);
+ status_t ret = buffered_source->InitCheck();
+ if (ret != B_OK)
+ return ret;
// get list of available readers from the server
entry_ref refs[MAX_READERS];
int32 count;
- status_t ret = AddOnManager::GetInstance()->GetReaders(refs, &count,
+ ret = AddOnManager::GetInstance()->GetReaders(refs, &count,
MAX_READERS);
if (ret != B_OK) {
printf("PluginManager::CreateReader: can't get list of readers:
%s\n",
############################################################################
Commit: deb91660547c2077c373f474f04a2b2ff483bc2f
URL: http://cgit.haiku-os.org/haiku/commit/?id=deb91660547c
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Mar 25 21:00:27 2016 UTC
PluginManager: Refactor of MediaIOWrapper
* Use BPositionIO version of Read/Write.
* Implementation of fallback buffering.
* Other cleanup.
----------------------------------------------------------------------------
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index 7247cde..5db273d 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -19,6 +19,8 @@
PluginManager gPluginManager;
+#define BLOCK_SIZE 4096
+
class BMediaIOWrapper : public BMediaIO {
public:
@@ -28,10 +30,14 @@ public:
fPosition(NULL),
fMedia(NULL),
fFile(NULL),
+ fFallbackBuffer(NULL),
+ fFallbackPosition(0),
fErr(B_NO_ERROR)
{
fPosition = dynamic_cast<BPositionIO*>(source);
fMedia = dynamic_cast<BMediaIO*>(source);
+ fFile = dynamic_cast<BFile*>(source);
+ fData = source;
// No need to do additional buffering if we have
// a BBufferIO or a BMediaIO.
@@ -40,40 +46,29 @@ public:
// Source needs to be at least a BPositionIO to wrap
with a BBufferIO
if (fPosition != NULL) {
fPosition = new(std::nothrow)
BBufferIO(fPosition, 65536, true);
- // We have to reset our BDataIO reference
- fData = dynamic_cast<BDataIO*>(fPosition);
if (fPosition == NULL) {
fErr = B_NO_MEMORY;
return;
}
+ // We have to reset our BDataIO reference too
+ fData = dynamic_cast<BDataIO*>(fPosition);
} else {
- TRACE("Unable to improve performance with a
BufferIO\n");
// TODO: fallback buffering
+ // In this case we have to supply our own form
+ // of pseudo-seekable object from a non-seekable
+ // BDataIO.
+ fFallbackBuffer = new BMallocIO();
+ fFallbackBuffer->SetBlockSize(BLOCK_SIZE);
+ TRACE("Unable to improve performance with a
BufferIO\n");
}
- } else {
- fData = source;
}
- fFile = dynamic_cast<BFile*>(source);
}
virtual ~BMediaIOWrapper()
{
}
- virtual ssize_t Read(void* buffer, size_t size)
- {
- return fData->Read(buffer, size);
- }
-
- virtual ssize_t Write(const void* buffer,
size_t size)
- {
- return fData->Write(buffer, size);
- }
-
- virtual status_t Flush()
- {
- return fData->Flush();
- }
+ // BPositionIO interface
virtual ssize_t ReadAt(off_t position, void*
buffer,
size_t
size)
@@ -81,9 +76,22 @@ public:
if (IsSeekable())
return fPosition->ReadAt(position, buffer, size);
- // if (IsCached()) {
- //
- // }
+ if (IsEndless()) {
+ off_t nextPos = position+size;
+ off_t bufSize = 0;
+ fFallbackBuffer->GetSize(&bufSize);
+
+ if (fFallbackPosition == position
+ && nextPos > bufSize) {
+ fData->Read(buffer, size);
+ fFallbackBuffer->WriteAt(fFallbackPosition,
buffer, size);
+ fFallbackPosition = nextPos;
+ return size;
+ } else if (nextPos <= bufSize) {
+ fFallbackPosition = nextPos;
+ return fFallbackBuffer->ReadAt(position,
buffer, size);
+ }
+ }
return B_NOT_SUPPORTED;
}
@@ -94,6 +102,11 @@ public:
if (IsSeekable())
return fPosition->WriteAt(position, buffer, size);
+ if (IsEndless() && position == fFallbackPosition) {
+ fData->Write(buffer, size);
+ fFallbackPosition = position+size;
+ }
+
return B_NOT_SUPPORTED;
}
@@ -102,32 +115,34 @@ public:
if (IsSeekable())
return fPosition->Seek(position, seekMode);
- // if (IsCached()) {
- //
- // }
+ if (IsEndless())
+ return fFallbackBuffer->Seek(position, seekMode);
return B_NOT_SUPPORTED;
}
virtual off_t Position() const
{
- if (!IsEndless())
+ if (IsSeekable())
return fPosition->Position();
- // TODO: buffering
+ if (IsEndless())
+ return fFallbackBuffer->Position();
- return 0;
+ return B_NOT_SUPPORTED;
}
- virtual status_t SetSize(off_t size)
+ virtual status_t SetSize(off_t size)
{
if (IsEndless())
return B_NOT_SUPPORTED;
+ // TODO: What a non seekable stream should do here?
+
return fPosition->SetSize(size);
}
- virtual status_t GetSize(off_t* size) const
+ virtual status_t GetSize(off_t* size) const
{
if (IsEndless())
return B_NOT_SUPPORTED;
@@ -135,6 +150,8 @@ public:
return fPosition->GetSize(size);
}
+ // BMediaIO interface
+
virtual bool IsSeekable() const
{
if (IsMedia())
@@ -152,26 +169,14 @@ public:
{
if (IsMedia())
return fMedia->IsEndless();
+
if (IsPosition())
return false;
return true;
}
- virtual bool IsCached() const
- {
- return true;
- }
-
- virtual size_t CacheSize() const
- {
- // TODO: it should be another buffering level
- // but we might to optimize with the underlying level
- //if (IsMedia() && IsCached())
- // return CacheSize();
-
- return B_NOT_SUPPORTED;
- }
+ // Utility methods
status_t InitCheck() const
{
@@ -179,11 +184,6 @@ public:
}
protected:
- // Utility methods
- bool IsData() const
- {
- return fData != NULL;
- }
bool IsPosition() const
{
@@ -201,6 +201,8 @@ private:
BMediaIO* fMedia;
BFile* fFile;
+ BMallocIO* fFallbackBuffer;
+ off_t fFallbackPosition;
status_t fErr;
};
############################################################################
Commit: ef167f1150e109a20a13411110db961ec420aa65
URL: http://cgit.haiku-os.org/haiku/commit/?id=ef167f1150e1
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Mon Mar 7 23:04:23 2016 UTC
BMediaIOWrapper: Refer on fallback buffer Position()
* Write the data into the fallback buffer when emulating
pseudo seeked writes.
----------------------------------------------------------------------------
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index 5db273d..28f1457 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -31,7 +31,6 @@ public:
fMedia(NULL),
fFile(NULL),
fFallbackBuffer(NULL),
- fFallbackPosition(0),
fErr(B_NO_ERROR)
{
fPosition = dynamic_cast<BPositionIO*>(source);
@@ -77,19 +76,20 @@ public:
return fPosition->ReadAt(position, buffer, size);
if (IsEndless()) {
- off_t nextPos = position+size;
off_t bufSize = 0;
+ ssize_t ret = 0;
fFallbackBuffer->GetSize(&bufSize);
- if (fFallbackPosition == position
- && nextPos > bufSize) {
- fData->Read(buffer, size);
- fFallbackBuffer->WriteAt(fFallbackPosition,
buffer, size);
- fFallbackPosition = nextPos;
- return size;
- } else if (nextPos <= bufSize) {
- fFallbackPosition = nextPos;
- return fFallbackBuffer->ReadAt(position,
buffer, size);
+ if (fFallbackBuffer->Position() == position
+ && position+size > bufSize) {
+ ret = fData->Read(buffer, size);
+ fFallbackBuffer->Write(buffer, ret);
+ return ret;
+ }
+
+ if (position+size <= bufSize) {
+ ret = fFallbackBuffer->ReadAt(position, buffer,
size);
+ return ret;
}
}
@@ -102,9 +102,13 @@ public:
if (IsSeekable())
return fPosition->WriteAt(position, buffer, size);
- if (IsEndless() && position == fFallbackPosition) {
- fData->Write(buffer, size);
- fFallbackPosition = position+size;
+ if (IsEndless()) {
+ off_t bufSize = 0;
+ fFallbackBuffer->GetSize(&bufSize);
+ if (position == bufSize) {
+ fData->Write(buffer, size);
+ fFallbackBuffer->WriteAt(bufSize, buffer, size);
+ }
}
return B_NOT_SUPPORTED;
@@ -202,7 +206,6 @@ private:
BFile* fFile;
BMallocIO* fFallbackBuffer;
- off_t fFallbackPosition;
status_t fErr;
};
############################################################################
Commit: 36ffce0a14792aae74ec04bfaf93bafdf5b9cf0e
URL: http://cgit.haiku-os.org/haiku/commit/?id=36ffce0a1479
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Mon Mar 7 23:10:32 2016 UTC
BMediaIOWrapper: Delete data in destructor
----------------------------------------------------------------------------
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index 28f1457..c34e65d 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -65,6 +65,8 @@ public:
virtual ~BMediaIOWrapper()
{
+ delete fData;
+ delete fFallbackBuffer;
}
// BPositionIO interface
############################################################################
Commit: 382c78dface667f2d37099a979126940b5d5b9ca
URL: http://cgit.haiku-os.org/haiku/commit/?id=382c78dface6
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Mon Mar 7 23:26:53 2016 UTC
BMediaIOWrapper: Check if we can really seek the data.
----------------------------------------------------------------------------
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index c34e65d..a20f5d7 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -121,7 +121,9 @@ public:
if (IsSeekable())
return fPosition->Seek(position, seekMode);
- if (IsEndless())
+ off_t bufSize = 0;
+ fFallbackBuffer->GetSize(&bufSize);
+ if (IsEndless() && position <= bufSize)
return fFallbackBuffer->Seek(position, seekMode);
return B_NOT_SUPPORTED;
############################################################################
Commit: 050118ef531be9c9e10ad491f2221dd793a009c3
URL: http://cgit.haiku-os.org/haiku/commit/?id=050118ef531b
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Mon Mar 7 23:27:58 2016 UTC
Remove TODOs
----------------------------------------------------------------------------
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index a20f5d7..f4bf937 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -52,7 +52,6 @@ public:
// We have to reset our BDataIO reference too
fData = dynamic_cast<BDataIO*>(fPosition);
} else {
- // TODO: fallback buffering
// In this case we have to supply our own form
// of pseudo-seekable object from a non-seekable
// BDataIO.
@@ -145,8 +144,6 @@ public:
if (IsEndless())
return B_NOT_SUPPORTED;
- // TODO: What a non seekable stream should do here?
-
return fPosition->SetSize(size);
}
############################################################################
Commit: 0d88bf3ac4e708ae0f21087ae943030903d63471
URL: http://cgit.haiku-os.org/haiku/commit/?id=0d88bf3ac4e7
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Mar 11 01:03:39 2016 UTC
MediaIO: Review behavior regarding object inheritance
----------------------------------------------------------------------------
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index f4bf937..817335a 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -40,10 +40,9 @@ public:
// No need to do additional buffering if we have
// a BBufferIO or a BMediaIO.
- if (dynamic_cast<BBufferIO *>(source) == NULL
- && fMedia == NULL) {
+ if (dynamic_cast<BBufferIO *>(source) == NULL) {
// Source needs to be at least a BPositionIO to wrap
with a BBufferIO
- if (fPosition != NULL) {
+ if (IsSeekable() && (IsMedia() && !fMedia->IsCached()))
{
fPosition = new(std::nothrow)
BBufferIO(fPosition, 65536, true);
if (fPosition == NULL) {
fErr = B_NO_MEMORY;
@@ -51,7 +50,7 @@ public:
}
// We have to reset our BDataIO reference too
fData = dynamic_cast<BDataIO*>(fPosition);
- } else {
+ } else if (!IsMedia()) {
// In this case we have to supply our own form
// of pseudo-seekable object from a non-seekable
// BDataIO.
@@ -83,6 +82,8 @@ public:
if (fFallbackBuffer->Position() == position
&& position+size > bufSize) {
+ // TODO: Possibly part of the data we have
+ // to supply is cached.
ret = fData->Read(buffer, size);
fFallbackBuffer->Write(buffer, ret);
return ret;
@@ -120,11 +121,12 @@ public:
if (IsSeekable())
return fPosition->Seek(position, seekMode);
- off_t bufSize = 0;
- fFallbackBuffer->GetSize(&bufSize);
- if (IsEndless() && position <= bufSize)
- return fFallbackBuffer->Seek(position, seekMode);
-
+ if (IsEndless()) {
+ off_t bufSize = 0;
+ fFallbackBuffer->GetSize(&bufSize);
+ if (position <= bufSize)
+ return fFallbackBuffer->Seek(position,
seekMode);
+ }
return B_NOT_SUPPORTED;
}
@@ -162,12 +164,13 @@ public:
if (IsMedia())
return fMedia->IsSeekable();
- return IsPosition();
+ return fPosition != NULL;
}
- virtual bool IsFile() const
+ virtual bool IsCached() const
{
- return fFile != NULL;
+ // Our wrapper class is always cached
+ return true;
}
virtual bool IsEndless() const
@@ -175,7 +178,7 @@ public:
if (IsMedia())
return fMedia->IsEndless();
- if (IsPosition())
+ if (IsSeekable())
return false;
return true;
@@ -190,11 +193,6 @@ public:
protected:
- bool IsPosition() const
- {
- return fPosition != NULL;
- }
-
bool IsMedia() const
{
return fMedia != NULL;
############################################################################
Commit: 3d8e0d38e13e2dd95f17a09a49328cd8c2b8c5e5
URL: http://cgit.haiku-os.org/haiku/commit/?id=3d8e0d38e13e
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Mar 11 01:04:59 2016 UTC
Add initial design of StreamerPlugin
----------------------------------------------------------------------------
diff --git a/headers/private/media/StreamerPlugin.h
b/headers/private/media/StreamerPlugin.h
new file mode 100644
index 0000000..aaa63ae
--- /dev/null
+++ b/headers/private/media/StreamerPlugin.h
@@ -0,0 +1,43 @@
+#ifndef _STREAMER_PLUGIN_H
+#define _STREAMER_PLUGIN_H
+
+#include <MediaTrack.h>
+#include <Url.h>
+
+#include "MediaPlugin.h"
+
+namespace BPrivate { namespace media {
+
+class PluginManager;
+
+class Streamer {
+public:
+ Streamer();
+ virtual ~Streamer();
+
+ status_t Sniff(BUrl* url,
BMediaIO** source) = 0;
+private:
+ virtual void _ReservedStreamer1();
+ virtual void _ReservedStreamer2();
+ virtual void _ReservedStreamer3();
+ virtual void _ReservedStreamer4();
+ virtual void _ReservedStreamer5();
+
+ MediaPlugin* fMediaPlugin;
+ uint32 fReserved[5];
+
+ // needed for plug-in reference count management
+ friend class PluginManager;
+};
+
+
+class StreamerPlugin : public virtual MediaPlugin {
+public:
+ virtual Streamer* NewStreamer() = 0;
+};
+
+} } // namespace BPrivate::media
+
+using namespace BPrivate::media;
+
+#endif // _STREAMER_PLUGIN_H
############################################################################
Commit: 63e1708eeee05b37a184f60cff7ee50c263c5743
URL: http://cgit.haiku-os.org/haiku/commit/?id=63e1708eeee0
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Mar 25 21:16:36 2016 UTC
Finalize StreamerPlugin
* Add cpp file.
* Make Sniff virtual.
----------------------------------------------------------------------------
diff --git a/headers/private/media/StreamerPlugin.h
b/headers/private/media/StreamerPlugin.h
index aaa63ae..ab9ac7c 100644
--- a/headers/private/media/StreamerPlugin.h
+++ b/headers/private/media/StreamerPlugin.h
@@ -1,6 +1,7 @@
#ifndef _STREAMER_PLUGIN_H
#define _STREAMER_PLUGIN_H
+#include <DataIO.h>
#include <MediaTrack.h>
#include <Url.h>
@@ -15,7 +16,7 @@ public:
Streamer();
virtual ~Streamer();
- status_t Sniff(BUrl* url,
BMediaIO** source) = 0;
+ virtual status_t Sniff(BUrl* url, BMediaIO**
source) = 0;
private:
virtual void _ReservedStreamer1();
virtual void _ReservedStreamer2();
diff --git a/src/kits/media/Jamfile b/src/kits/media/Jamfile
index d885f46..ee97010 100644
--- a/src/kits/media/Jamfile
+++ b/src/kits/media/Jamfile
@@ -88,6 +88,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
MediaWriter.cpp
PluginManager.cpp
ReaderPlugin.cpp
+ StreamerPlugin.cpp
WriterPlugin.cpp
:
be localestub [ TargetLibsupc++ ] [ TargetLibstdc++ ]
diff --git a/src/kits/media/StreamerPlugin.cpp
b/src/kits/media/StreamerPlugin.cpp
new file mode 100644
index 0000000..d5690b0
--- /dev/null
+++ b/src/kits/media/StreamerPlugin.cpp
@@ -0,0 +1,44 @@
+
+#include "StreamerPlugin.h"
+
+
+Streamer::Streamer()
+{
+}
+
+
+Streamer::~Streamer()
+{
+}
+
+
+void
+Streamer::_ReservedStreamer1()
+{
+}
+
+
+void
+Streamer::_ReservedStreamer2()
+{
+}
+
+
+
+void
+Streamer::_ReservedStreamer3()
+{
+}
+
+
+
+void
+Streamer::_ReservedStreamer4()
+{
+}
+
+
+void
+Streamer::_ReservedStreamer5()
+{
+}
############################################################################
Commit: b1ccc0586460a8fa2d0738cba2aedb787ba6099d
URL: http://cgit.haiku-os.org/haiku/commit/?id=b1ccc0586460
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Mar 11 16:49:40 2016 UTC
AddOnManager: Initial support for streamer addons
----------------------------------------------------------------------------
diff --git a/src/kits/media/AddOnManager.cpp b/src/kits/media/AddOnManager.cpp
index caeb5e2..7b412ee 100644
--- a/src/kits/media/AddOnManager.cpp
+++ b/src/kits/media/AddOnManager.cpp
@@ -354,6 +354,10 @@ AddOnManager::_RegisterAddOn(const entry_ref& ref)
if (encoder != NULL)
_RegisterEncoder(encoder, ref);
+ StreamerPlugin* streamer = dynamic_cast<StreamerPlugin*>(plugin);
+ if (streamer != NULL)
+ _RegisterStreamer(streamer, ref);
+
delete plugin;
return B_OK;
@@ -549,6 +553,25 @@ AddOnManager::_RegisterEncoder(EncoderPlugin* plugin,
const entry_ref& ref)
}
+void
+AddOnManager::_RegisterStreamer(StreamerPlugin* streamer, const entry_ref& ref)
+{
+ BAutolock locker(fLock);
+
+ streamer_info* pInfo;
+ for (fStreamerList.Rewind(); fStreamerList.GetNext(&pInfo);) {
+ if (!strcmp(pInfo->ref.name, ref.name)) {
+ // We already know this streamer
+ return;
+ }
+ }
+
+ streamer_info info;
+ info.ref = ref;
+ fStreamerList.Insert(info);
+}
+
+
bool
AddOnManager::_FindDecoder(const media_format& format, const BPath& path,
entry_ref* _decoderRef)
diff --git a/src/kits/media/AddOnManager.h b/src/kits/media/AddOnManager.h
index 1b4180a..1fa428c 100644
--- a/src/kits/media/AddOnManager.h
+++ b/src/kits/media/AddOnManager.h
@@ -22,6 +22,7 @@
#include "DecoderPlugin.h"
#include "EncoderPlugin.h"
#include "ReaderPlugin.h"
+#include "StreamerPlugin.h"
#include "WriterPlugin.h"
@@ -73,6 +74,9 @@ private:
void
_RegisterEncoder(EncoderPlugin* encoder,
const
entry_ref& ref);
+ void
_RegisterStreamer(StreamerPlugin* streamer,
+ const
entry_ref& ref);
+
bool _FindDecoder(const
media_format& format,
const
BPath& path,
entry_ref* _decoderRef);
@@ -105,12 +109,16 @@ private:
media_format intputFormat;
media_format outputFormat;
};
+ struct streamer_info {
+ entry_ref ref;
+ };
BLocker fLock;
List<reader_info> fReaderList;
List<writer_info> fWriterList;
List<decoder_info> fDecoderList;
List<encoder_info> fEncoderList;
+ List<streamer_info> fStreamerList;
List<media_file_format> fWriterFileFormats;
############################################################################
Commit: a2b3f126981f0e9cfbe362796dcbaa01d7149604
URL: http://cgit.haiku-os.org/haiku/commit/?id=a2b3f126981f
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Mar 25 21:18:15 2016 UTC
MediaExtractor: Adapt to new BUrl functionality
----------------------------------------------------------------------------
diff --git a/headers/private/media/MediaExtractor.h
b/headers/private/media/MediaExtractor.h
index 942bf5b..91f65e3 100644
--- a/headers/private/media/MediaExtractor.h
+++ b/headers/private/media/MediaExtractor.h
@@ -10,7 +10,10 @@
#define _MEDIA_EXTRACTOR_H
+#include <Url.h>
+
#include "ReaderPlugin.h"
+#include "StreamerPlugin.h"
#include "DecoderPlugin.h"
@@ -37,10 +40,14 @@ struct stream_info {
class MediaExtractor {
public:
MediaExtractor(BDataIO* source, int32 flags);
+
MediaExtractor(BUrl* url, int32 flags);
+
~MediaExtractor();
status_t InitCheck();
+ BDataIO* Source() const;
+
void GetFileFormatInfo(
media_file_format* fileFormat) const;
status_t GetMetaData(BMessage*
_data) const;
@@ -70,6 +77,8 @@ public:
BMessage* _data) const;
private:
+ void _Init(BDataIO* source,
int32 flags);
+
void
_RecycleLastChunk(stream_info& info);
static int32 _ExtractorEntry(void* arg);
void _ExtractorThread();
@@ -82,6 +91,7 @@ private:
BDataIO* fSource;
Reader* fReader;
+ Streamer* fStreamer;
stream_info* fStreamInfo;
int32 fStreamCount;
diff --git a/src/kits/media/MediaExtractor.cpp
b/src/kits/media/MediaExtractor.cpp
index fdf7aeb..4f381b9 100644
--- a/src/kits/media/MediaExtractor.cpp
+++ b/src/kits/media/MediaExtractor.cpp
@@ -55,13 +55,39 @@ private:
MediaExtractor::MediaExtractor(BDataIO* source, int32 flags)
:
fExtractorThread(-1),
- fSource(source),
fReader(NULL),
+ fStreamer(NULL),
fStreamInfo(NULL),
fStreamCount(0)
{
+ _Init(source, flags);
+}
+
+
+MediaExtractor::MediaExtractor(BUrl* url, int32 flags)
+ :
+ fExtractorThread(-1),
+ fReader(NULL),
+ fStreamer(NULL),
+ fStreamInfo(NULL),
+ fStreamCount(0)
+{
+ BDataIO* source = NULL;
+ fInitStatus = gPluginManager.CreateStreamer(&fStreamer, url, &source);
+ if (fInitStatus != B_OK)
+ return;
+
+ _Init(source, flags);
+}
+
+
+void
+MediaExtractor::_Init(BDataIO* source, int32 flags)
+{
CALLED();
+ fSource = source;
+
#if !DISABLE_CHUNK_CACHE
// start extractor thread
fExtractorWaitSem = create_sem(1, "media extractor thread sem");
@@ -171,6 +197,13 @@ MediaExtractor::InitCheck()
}
+BDataIO*
+MediaExtractor::Source() const
+{
+ return fSource;
+}
+
+
void
MediaExtractor::GetFileFormatInfo(media_file_format* fileFormat) const
{
############################################################################
Commit: 20ae088fa5a75f3df5eaa65fd053e2b8f98bed73
URL: http://cgit.haiku-os.org/haiku/commit/?id=20ae088fa5a7
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Mar 25 21:19:03 2016 UTC
MediaWriter: Add new BUrl functionality
----------------------------------------------------------------------------
diff --git a/headers/private/media/MediaWriter.h
b/headers/private/media/MediaWriter.h
index e053401..df88014 100644
--- a/headers/private/media/MediaWriter.h
+++ b/headers/private/media/MediaWriter.h
@@ -6,7 +6,10 @@
#define _MEDIA_WRITER_H
+#include <Url.h>
+
#include "EncoderPlugin.h"
+#include "StreamerPlugin.h"
#include "TList.h"
#include "WriterPlugin.h"
@@ -19,10 +22,14 @@ class MediaWriter {
public:
MediaWriter(BDataIO* target,
const
media_file_format& fileFormat);
+
MediaWriter(BUrl* url,
+ const
media_file_format& fileFormat);
~MediaWriter();
status_t InitCheck();
+ BDataIO* Target() const;
+
void
GetFileFormatInfo(media_file_format* mfi) const;
status_t CreateEncoder(Encoder**
_encoder,
@@ -52,6 +59,7 @@ private:
private:
BDataIO* fTarget;
Writer* fWriter;
+ Streamer* fStreamer;
List<StreamInfo> fStreamInfos;
diff --git a/src/kits/media/MediaWriter.cpp b/src/kits/media/MediaWriter.cpp
index d7c9e50..b9e063e 100644
--- a/src/kits/media/MediaWriter.cpp
+++ b/src/kits/media/MediaWriter.cpp
@@ -48,6 +48,7 @@ MediaWriter::MediaWriter(BDataIO* target, const
media_file_format& fileFormat)
:
fTarget(target),
fWriter(NULL),
+ fStreamer(NULL),
fStreamInfos(),
fFileFormat(fileFormat)
{
@@ -57,6 +58,23 @@ MediaWriter::MediaWriter(BDataIO* target, const
media_file_format& fileFormat)
}
+MediaWriter::MediaWriter(BUrl* url, const media_file_format& fileFormat)
+ :
+ fTarget(NULL),
+ fWriter(NULL),
+ fStreamer(NULL),
+ fStreamInfos(),
+ fFileFormat(fileFormat)
+{
+ CALLED();
+
+ if (gPluginManager.CreateStreamer(&fStreamer, url, &fTarget) != B_OK)
+ return;
+
+ gPluginManager.CreateWriter(&fWriter, fFileFormat, fTarget);
+}
+
+
MediaWriter::~MediaWriter()
{
CALLED();
@@ -84,6 +102,13 @@ MediaWriter::InitCheck()
}
+BDataIO*
+MediaWriter::Target() const
+{
+ return fTarget;
+}
+
+
void
MediaWriter::GetFileFormatInfo(media_file_format* _fileFormat) const
{
############################################################################
Commit: b77760282767ad57eae913e054a84d07e91f2430
URL: http://cgit.haiku-os.org/haiku/commit/?id=b77760282767
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Mar 25 21:19:47 2016 UTC
MediaFile: Rework to support BUrl sources
----------------------------------------------------------------------------
diff --git a/headers/os/media/MediaFile.h b/headers/os/media/MediaFile.h
index c4f579e..0a48f80 100644
--- a/headers/os/media/MediaFile.h
+++ b/headers/os/media/MediaFile.h
@@ -26,6 +26,7 @@ namespace BPrivate {
class BMediaTrack;
class BMessage;
class BParameterWeb;
+class BUrl;
class BView;
@@ -69,10 +70,21 @@ public:
int32
flags = 0);
// set
file later using SetTo()
+ // Additional constructors used to stream data from protocols
+ // supported by the Streamer API
+
BMediaFile(BUrl* url);
+
BMediaFile(BUrl* url, int32 flags);
+ // Read-Write streaming constructor
+
BMediaFile(BUrl* destination,
+ const
media_file_format* mfi,
+ int32 flags
= 0);
+
virtual ~BMediaFile();
status_t SetTo(const entry_ref*
ref);
status_t SetTo(BDataIO*
destination);
+ // The streaming equivalent of SetTo
+ status_t SetTo(BUrl* url);
status_t InitCheck() const;
@@ -167,8 +179,9 @@ private:
void _Init();
void _UnInit();
- void _InitReader(BDataIO*
source, int32 flags = 0);
- void _InitWriter(BDataIO*
target,
+ void _InitReader(BDataIO*
source, BUrl* url = NULL,
+ int32
flags = 0);
+ void _InitWriter(BDataIO*
target, BUrl* url,
const
media_file_format* fileFormat,
int32
flags);
diff --git a/src/kits/media/MediaFile.cpp b/src/kits/media/MediaFile.cpp
index acedc12..af406bb 100644
--- a/src/kits/media/MediaFile.cpp
+++ b/src/kits/media/MediaFile.cpp
@@ -13,6 +13,7 @@
#include <File.h>
#include <MediaTrack.h>
+#include <Url.h>
#include "debug.h"
@@ -42,7 +43,7 @@ BMediaFile::BMediaFile(const entry_ref* ref, int32 flags)
CALLED();
_Init();
fDeleteSource = true;
- _InitReader(new(std::nothrow) BFile(ref, O_RDONLY), flags);
+ _InitReader(new(std::nothrow) BFile(ref, O_RDONLY), NULL, flags);
}
@@ -50,7 +51,7 @@ BMediaFile::BMediaFile(BDataIO* source, int32 flags)
{
CALLED();
_Init();
- _InitReader(source, flags);
+ _InitReader(source, NULL, flags);
}
@@ -61,7 +62,7 @@ BMediaFile::BMediaFile(const entry_ref* ref, const
media_file_format* mfi,
_Init();
fDeleteSource = true;
_InitWriter(new(std::nothrow) BFile(ref, B_CREATE_FILE | B_ERASE_FILE
- | B_WRITE_ONLY), mfi, flags);
+ | B_WRITE_ONLY), NULL, mfi, flags);
}
@@ -70,7 +71,7 @@ BMediaFile::BMediaFile(BDataIO* destination, const
media_file_format* mfi,
{
CALLED();
_Init();
- _InitWriter(destination, mfi, flags);
+ _InitWriter(destination, NULL, mfi, flags);
}
@@ -81,6 +82,31 @@ BMediaFile::BMediaFile(const media_file_format* mfi, int32
flags)
}
+BMediaFile::BMediaFile(BUrl* url)
+{
+ CALLED();
+ _Init();
+ _InitReader(NULL, url);
+}
+
+
+BMediaFile::BMediaFile(BUrl* url, int32 flags)
+{
+ CALLED();
+ _Init();
+ _InitReader(NULL, url, flags);
+}
+
+
+BMediaFile::BMediaFile(BUrl* destination, const media_file_format* mfi,
+ int32 flags)
+{
+ CALLED();
+ _Init();
+ _InitWriter(NULL, destination, mfi, flags);
+}
+
+
status_t
BMediaFile::SetTo(const entry_ref* ref)
{
@@ -436,24 +462,25 @@ BMediaFile::_UnInit()
void
-BMediaFile::_InitReader(BDataIO* source, int32 flags)
+BMediaFile::_InitReader(BDataIO* source, BUrl* url, int32 flags)
{
CALLED();
- if (source == NULL) {
+ if (source == NULL && url == NULL) {
fErr = B_NO_MEMORY;
return;
}
- fSource = source;
-
- if (BFile* file = dynamic_cast<BFile*>(source)) {
- fErr = file->InitCheck();
- if (fErr != B_OK)
- return;
- }
+ if (source != NULL) {
+ if (BFile* file = dynamic_cast<BFile*>(source)) {
+ fErr = file->InitCheck();
+ if (fErr != B_OK)
+ return;
+ }
+ fExtractor = new(std::nothrow) MediaExtractor(source, flags);
+ } else
+ fExtractor = new(std::nothrow) MediaExtractor(url, flags);
- fExtractor = new(std::nothrow) MediaExtractor(fSource, flags);
if (fExtractor == NULL)
fErr = B_NO_MEMORY;
else
@@ -461,6 +488,9 @@ BMediaFile::_InitReader(BDataIO* source, int32 flags)
if (fErr != B_OK)
return;
+ // Get the actual source from the extractor
+ fSource = fExtractor->Source();
+
fExtractor->GetFileFormatInfo(&fMFI);
fTrackNum = fExtractor->StreamCount();
fTrackList = (BMediaTrack**)malloc(fTrackNum * sizeof(BMediaTrack*));
@@ -473,8 +503,8 @@ BMediaFile::_InitReader(BDataIO* source, int32 flags)
void
-BMediaFile::_InitWriter(BDataIO* target, const media_file_format* fileFormat,
- int32 flags)
+BMediaFile::_InitWriter(BDataIO* target, BUrl* url,
+ const media_file_format* fileFormat, int32 flags)
{
CALLED();
@@ -483,15 +513,18 @@ BMediaFile::_InitWriter(BDataIO* target, const
media_file_format* fileFormat,
return;
}
- if (target == NULL) {
+ if (target == NULL && url == NULL) {
fErr = B_NO_MEMORY;
return;
}
fMFI = *fileFormat;
- fSource = target;
- fWriter = new(std::nothrow) MediaWriter(fSource, fMFI);
+ if (target != NULL)
+ fWriter = new(std::nothrow) MediaWriter(target, fMFI);
+ else
+ fWriter = new(std::nothrow) MediaWriter(url, fMFI);
+
if (fWriter == NULL)
fErr = B_NO_MEMORY;
else
@@ -499,6 +532,8 @@ BMediaFile::_InitWriter(BDataIO* target, const
media_file_format* fileFormat,
if (fErr != B_OK)
return;
+ // Get the actual source from the writer
+ fSource = fWriter->Target();
fTrackNum = 0;
}
############################################################################
Commit: 3733e4b2ab6e33db2e14eb32f4d2b81960ce0cfa
URL: http://cgit.haiku-os.org/haiku/commit/?id=3733e4b2ab6e
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Mar 11 22:54:43 2016 UTC
PluginManager/AddOnManager: Add streamers support code
----------------------------------------------------------------------------
diff --git a/headers/private/media/PluginManager.h
b/headers/private/media/PluginManager.h
index edd9221..6f08a3f 100644
--- a/headers/private/media/PluginManager.h
+++ b/headers/private/media/PluginManager.h
@@ -14,6 +14,7 @@
#include "DecoderPlugin.h"
#include "EncoderPlugin.h"
#include "ReaderPlugin.h"
+#include "StreamerPlugin.h"
#include "WriterPlugin.h"
#include <TList.h>
@@ -58,7 +59,11 @@ public:
const
media_format& format);
void DestroyEncoder(Encoder*
encoder);
-
+
+ status_t
CreateStreamer(Streamer** streamer,
+ BUrl*
url, BDataIO** source);
+ void
DestroyStreamer(Streamer* streamer);
+
private:
status_t _LoadPlugin(const
entry_ref& ref,
MediaPlugin** plugin, image_id* image);
diff --git a/src/kits/media/AddOnManager.cpp b/src/kits/media/AddOnManager.cpp
index 7b412ee..61abc71 100644
--- a/src/kits/media/AddOnManager.cpp
+++ b/src/kits/media/AddOnManager.cpp
@@ -204,6 +204,23 @@ AddOnManager::GetReaders(entry_ref* outRefs, int32*
outCount,
status_t
+AddOnManager::GetStreamers(entry_ref* outRefs, int32* outCount,
+ int32 maxCount)
+{
+ BAutolock locker(fLock);
+ RegisterAddOns();
+
+ streamer_info* info;
+ for (fStreamerList.Rewind(); fStreamerList.GetNext(&info);) {
+ *outRefs = info->ref;
+ outRefs++;
+ }
+
+ return B_ERROR;
+}
+
+
+status_t
AddOnManager::GetEncoder(entry_ref* _encoderRef, int32 id)
{
BAutolock locker(fLock);
diff --git a/src/kits/media/AddOnManager.h b/src/kits/media/AddOnManager.h
index 1fa428c..b947fc5 100644
--- a/src/kits/media/AddOnManager.h
+++ b/src/kits/media/AddOnManager.h
@@ -45,6 +45,9 @@ public:
status_t GetReaders(entry_ref*
_ref,
int32*
_count, int32 maxCount);
+ status_t GetStreamers(entry_ref*
_ref,
+ int32*
_count, int32 maxCount);
+
status_t GetEncoder(entry_ref*
_ref, int32 id);
status_t GetWriter(entry_ref*
_ref,
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index 817335a..ea43e95 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -20,6 +20,7 @@
PluginManager gPluginManager;
#define BLOCK_SIZE 4096
+#define MAX_STREAMERS 40
class BMediaIOWrapper : public BMediaIO {
@@ -580,6 +581,79 @@ PluginManager::DestroyEncoder(Encoder* encoder)
}
+status_t
+PluginManager::CreateStreamer(Streamer** streamer, BUrl* url, BDataIO** source)
+{
+ TRACE("PluginManager::CreateStreamer enter\n");
+
+ entry_ref refs[MAX_STREAMERS];
+ int32 count;
+
+ status_t ret = AddOnManager::GetInstance()->GetStreamers(refs, &count,
+ MAX_STREAMERS);
+ if (ret != B_OK) {
+ printf("PluginManager::CreateStreamer: can't get list of
readers: %s\n",
+ strerror(ret));
+ return ret;
+ }
+
+ // try each reader by calling it's Sniff function...
+ for (int32 i = 0; i < count; i++) {
+ entry_ref ref = refs[i];
+ MediaPlugin* plugin = GetPlugin(ref);
+ if (plugin == NULL) {
+ printf("PluginManager::CreateStreamer: GetPlugin
failed\n");
+ return B_ERROR;
+ }
+
+ StreamerPlugin* streamerPlugin =
dynamic_cast<StreamerPlugin*>(plugin);
+ if (streamerPlugin == NULL) {
+ printf("PluginManager::CreateStreamer: dynamic_cast
failed\n");
+ PutPlugin(plugin);
+ return B_ERROR;
+ }
+
+ *streamer = streamerPlugin->NewStreamer();
+ if (*streamer == NULL) {
+ printf("PluginManager::CreateStreamer: NewReader
failed\n");
+ PutPlugin(plugin);
+ return B_ERROR;
+ }
+
+ (*streamer)->fMediaPlugin = plugin;
+
+ BMediaIO* streamSource = NULL;
+ if ((*streamer)->Sniff(url, &streamSource) == B_OK) {
+ TRACE("PluginManager::CreateStreamer: Sniff success ");
+ *source = streamSource;
+ return B_OK;
+ }
+
+ DestroyStreamer(*streamer);
+ *streamer = NULL;
+ }
+
+ TRACE("PluginManager::CreateStreamer leave\n");
+ return B_MEDIA_NO_HANDLER;
+}
+
+
+void
+PluginManager::DestroyStreamer(Streamer* streamer)
+{
+ if (streamer != NULL) {
+ TRACE("PluginManager::DestroyStreamer(%p, plugin: %p)\n",
streamer,
+ streamer->fMediaPlugin);
+ // NOTE: We have to put the plug-in after deleting the encoder,
+ // since otherwise we may actually unload the code for the
+ // destructor...
+ MediaPlugin* plugin = streamer->fMediaPlugin;
+ delete streamer;
+ PutPlugin(plugin);
+ }
+}
+
+
// #pragma mark -
diff --git a/src/kits/media/StreamerPlugin.cpp
b/src/kits/media/StreamerPlugin.cpp
index d5690b0..86d2407 100644
--- a/src/kits/media/StreamerPlugin.cpp
+++ b/src/kits/media/StreamerPlugin.cpp
@@ -1,8 +1,14 @@
+/*
+ * Copyright 2016, Dario Casalinuovo. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
#include "StreamerPlugin.h"
Streamer::Streamer()
+ :
+ fMediaPlugin(NULL)
{
}
@@ -12,33 +18,8 @@ Streamer::~Streamer()
}
-void
-Streamer::_ReservedStreamer1()
-{
-}
-
-
-void
-Streamer::_ReservedStreamer2()
-{
-}
-
-
-
-void
-Streamer::_ReservedStreamer3()
-{
-}
-
-
-
-void
-Streamer::_ReservedStreamer4()
-{
-}
-
-
-void
-Streamer::_ReservedStreamer5()
-{
-}
+void Streamer::_ReservedStreamer1() {}
+void Streamer::_ReservedStreamer2() {}
+void Streamer::_ReservedStreamer3() {}
+void Streamer::_ReservedStreamer4() {}
+void Streamer::_ReservedStreamer5() {}
############################################################################
Commit: 22c93142552cf5563c5a8a1318a901f1d12326a0
URL: http://cgit.haiku-os.org/haiku/commit/?id=22c93142552c
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Mon Mar 14 23:54:45 2016 UTC
MediaExtractor/PluginManager: Add plugin deletion when extractor die
----------------------------------------------------------------------------
diff --git a/src/kits/media/AddOnManager.cpp b/src/kits/media/AddOnManager.cpp
index 61abc71..9be411a 100644
--- a/src/kits/media/AddOnManager.cpp
+++ b/src/kits/media/AddOnManager.cpp
@@ -216,7 +216,7 @@ AddOnManager::GetStreamers(entry_ref* outRefs, int32*
outCount,
outRefs++;
}
- return B_ERROR;
+ return B_OK;
}
diff --git a/src/kits/media/MediaExtractor.cpp
b/src/kits/media/MediaExtractor.cpp
index 4f381b9..e264977 100644
--- a/src/kits/media/MediaExtractor.cpp
+++ b/src/kits/media/MediaExtractor.cpp
@@ -184,6 +184,12 @@ MediaExtractor::~MediaExtractor()
gPluginManager.DestroyReader(fReader);
+ // If this is a streaming situation we own
+ // the source
+ if (fStreamer != NULL) {
+ delete fSource;
+ gPluginManager.DestroyStreamer(fStreamer);
+ }
delete[] fStreamInfo;
// fSource is owned by the BMediaFile
}
############################################################################
Commit: 25527aff5cb5365b3c87cb1ebb6102f2072913bb
URL: http://cgit.haiku-os.org/haiku/commit/?id=25527aff5cb5
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Thu Mar 17 12:05:12 2016 UTC
MediaIOWrapper: IsEndless was not used the right way
* The idea is to just identify when a BMediaIO is able
to tell the whole size of the data, but caching needs
more complex policies to be successful.
----------------------------------------------------------------------------
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index ea43e95..91dc32c 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -43,7 +43,7 @@ public:
// a BBufferIO or a BMediaIO.
if (dynamic_cast<BBufferIO *>(source) == NULL) {
// Source needs to be at least a BPositionIO to wrap
with a BBufferIO
- if (IsSeekable() && (IsMedia() && !fMedia->IsCached()))
{
+ if (IsSeekable()) {
fPosition = new(std::nothrow)
BBufferIO(fPosition, 65536, true);
if (fPosition == NULL) {
fErr = B_NO_MEMORY;
@@ -51,7 +51,7 @@ public:
}
// We have to reset our BDataIO reference too
fData = dynamic_cast<BDataIO*>(fPosition);
- } else if (!IsMedia()) {
+ } else {
// In this case we have to supply our own form
// of pseudo-seekable object from a non-seekable
// BDataIO.
@@ -76,27 +76,25 @@ public:
if (IsSeekable())
return fPosition->ReadAt(position, buffer, size);
- if (IsEndless()) {
- off_t bufSize = 0;
- ssize_t ret = 0;
- fFallbackBuffer->GetSize(&bufSize);
+ off_t bufSize = 0;
+ ssize_t ret = B_NOT_SUPPORTED;
+ fFallbackBuffer->GetSize(&bufSize);
- if (fFallbackBuffer->Position() == position
- && position+size > bufSize) {
- // TODO: Possibly part of the data we have
- // to supply is cached.
- ret = fData->Read(buffer, size);
+ if (fFallbackBuffer->Position() == position
+ && position+size > bufSize) {
+ // TODO: Possibly part of the data we have
+ // to supply is cached.
+ ret = fData->Read(buffer, size);
+ if (ret > 0)
fFallbackBuffer->Write(buffer, ret);
- return ret;
- }
- if (position+size <= bufSize) {
- ret = fFallbackBuffer->ReadAt(position, buffer,
size);
- return ret;
- }
+ return ret;
}
- return B_NOT_SUPPORTED;
+ if (position+size <= bufSize)
+ return fFallbackBuffer->ReadAt(position, buffer, size);
+
+ return ret;
}
virtual ssize_t WriteAt(off_t position, const
void* buffer,
@@ -105,13 +103,12 @@ public:
if (IsSeekable())
return fPosition->WriteAt(position, buffer, size);
- if (IsEndless()) {
- off_t bufSize = 0;
- fFallbackBuffer->GetSize(&bufSize);
- if (position == bufSize) {
- fData->Write(buffer, size);
- fFallbackBuffer->WriteAt(bufSize, buffer, size);
- }
+ off_t bufSize = 0;
+ fFallbackBuffer->GetSize(&bufSize);
+ if (position == bufSize) {
+ ssize_t ret = fData->Write(buffer, size);
+ fFallbackBuffer->WriteAt(bufSize, buffer, size);
+ return ret;
}
return B_NOT_SUPPORTED;
@@ -122,12 +119,11 @@ public:
if (IsSeekable())
return fPosition->Seek(position, seekMode);
- if (IsEndless()) {
- off_t bufSize = 0;
- fFallbackBuffer->GetSize(&bufSize);
- if (position <= bufSize)
- return fFallbackBuffer->Seek(position,
seekMode);
- }
+ off_t bufSize = 0;
+ fFallbackBuffer->GetSize(&bufSize);
+ if (position <= bufSize)
+ return fFallbackBuffer->Seek(position, seekMode);
+
return B_NOT_SUPPORTED;
}
@@ -136,10 +132,7 @@ public:
if (IsSeekable())
return fPosition->Position();
- if (IsEndless())
- return fFallbackBuffer->Position();
-
- return B_NOT_SUPPORTED;
+ return fFallbackBuffer->Position();
}
virtual status_t SetSize(off_t size)
@@ -168,12 +161,6 @@ public:
return fPosition != NULL;
}
- virtual bool IsCached() const
- {
- // Our wrapper class is always cached
- return true;
- }
-
virtual bool IsEndless() const
{
if (IsMedia())
@@ -592,8 +579,8 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl*
url, BDataIO** source)
status_t ret = AddOnManager::GetInstance()->GetStreamers(refs, &count,
MAX_STREAMERS);
if (ret != B_OK) {
- printf("PluginManager::CreateStreamer: can't get list of
readers: %s\n",
- strerror(ret));
+ printf("PluginManager::CreateStreamer: can't get list of
streamers:"
+ " %s\n", strerror(ret));
return ret;
}
############################################################################
Commit: 2250435e4cd0e1ee5ddea2042975f4801daa8977
URL: http://cgit.haiku-os.org/haiku/commit/?id=2250435e4cd0
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Thu Mar 24 18:31:21 2016 UTC
PluginManager: Add debug to wrapper
----------------------------------------------------------------------------
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index 91dc32c..2516b78 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -34,6 +34,8 @@ public:
fFallbackBuffer(NULL),
fErr(B_NO_ERROR)
{
+ CALLED();
+
fPosition = dynamic_cast<BPositionIO*>(source);
fMedia = dynamic_cast<BMediaIO*>(source);
fFile = dynamic_cast<BFile*>(source);
@@ -73,6 +75,8 @@ public:
virtual ssize_t ReadAt(off_t position, void*
buffer,
size_t
size)
{
+ CALLED();
+
if (IsSeekable())
return fPosition->ReadAt(position, buffer, size);
@@ -100,6 +104,8 @@ public:
virtual ssize_t WriteAt(off_t position, const
void* buffer,
size_t
size)
{
+ CALLED();
+
if (IsSeekable())
return fPosition->WriteAt(position, buffer, size);
@@ -116,6 +122,8 @@ public:
virtual off_t Seek(off_t position, uint32
seekMode)
{
+ CALLED();
+
if (IsSeekable())
return fPosition->Seek(position, seekMode);
@@ -129,6 +137,8 @@ public:
virtual off_t Position() const
{
+ CALLED();
+
if (IsSeekable())
return fPosition->Position();
@@ -137,6 +147,8 @@ public:
virtual status_t SetSize(off_t size)
{
+ CALLED();
+
if (IsEndless())
return B_NOT_SUPPORTED;
@@ -145,6 +157,8 @@ public:
virtual status_t GetSize(off_t* size) const
{
+ CALLED();
+
if (IsEndless())
return B_NOT_SUPPORTED;
############################################################################
Revision: hrev50164
Commit: 8c7679851f61f3e9d32951ea7eff7a89c78f9442
URL: http://cgit.haiku-os.org/haiku/commit/?id=8c7679851f61
Author: Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date: Fri Mar 25 21:44:56 2016 UTC
Move MediaIO in it's own header
----------------------------------------------------------------------------
diff --git a/headers/os/support/DataIO.h b/headers/os/support/DataIO.h
index e110342..d05a4c8 100644
--- a/headers/os/support/DataIO.h
+++ b/headers/os/support/DataIO.h
@@ -163,29 +163,4 @@ private:
};
-class BMediaIO : public BPositionIO {
-public:
- BMediaIO();
- virtual ~BMediaIO();
-
- virtual bool IsSeekable() const = 0;
- virtual bool IsFile() const = 0;
-
- virtual bool IsEndless() const = 0;
- virtual bool IsCached() const = 0;
- virtual size_t CacheSize() const = 0;
-
-private:
- BMediaIO(const
BMediaIO&);
- BMallocIO& operator=(const
BMediaIO&);
-
- virtual void _ReservedMediaIO1();
- virtual void _ReservedMediaIO2();
- virtual void _ReservedMediaIO3();
- virtual void _ReservedMediaIO4();
- virtual void _ReservedMediaIO5();
-
- uint32 _reserved[1];
-};
-
#endif // _DATA_IO_H
diff --git a/headers/private/media/MediaIO.h b/headers/private/media/MediaIO.h
new file mode 100644
index 0000000..55bb7e0
--- /dev/null
+++ b/headers/private/media/MediaIO.h
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2016 Haiku, Inc. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ */
+#ifndef _MEDIA_IO_H
+#define _MEDIA_IO_H
+
+
+#include <DataIO.h>
+#include <SupportDefs.h>
+
+
+class BMediaIO : public BPositionIO {
+public:
+ BMediaIO();
+ virtual ~BMediaIO();
+
+ virtual bool IsSeekable() const = 0;
+ virtual bool IsEndless() const = 0;
+
+private:
+ BMediaIO(const
BMediaIO&);
+ BMallocIO& operator=(const
BMediaIO&);
+
+ virtual void _ReservedMediaIO1();
+ virtual void _ReservedMediaIO2();
+ virtual void _ReservedMediaIO3();
+ virtual void _ReservedMediaIO4();
+ virtual void _ReservedMediaIO5();
+
+ uint32 _reserved[1];
+};
+
+#endif // _MEDIA_IO_H
diff --git a/headers/private/media/StreamerPlugin.h
b/headers/private/media/StreamerPlugin.h
index ab9ac7c..60f26ff 100644
--- a/headers/private/media/StreamerPlugin.h
+++ b/headers/private/media/StreamerPlugin.h
@@ -1,12 +1,14 @@
#ifndef _STREAMER_PLUGIN_H
#define _STREAMER_PLUGIN_H
-#include <DataIO.h>
+
+#include <MediaIO.h>
#include <MediaTrack.h>
#include <Url.h>
#include "MediaPlugin.h"
+
namespace BPrivate { namespace media {
class PluginManager;
@@ -41,4 +43,5 @@ public:
using namespace BPrivate::media;
+
#endif // _STREAMER_PLUGIN_H
diff --git a/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp
b/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp
index 288aee7..b28ead0 100644
--- a/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp
+++ b/src/add-ons/media/plugins/ffmpeg/AVFormatReader.cpp
@@ -15,7 +15,7 @@
#include <AutoDeleter.h>
#include <Autolock.h>
#include <ByteOrder.h>
-#include <DataIO.h>
+#include <MediaIO.h>
#include <MediaDefs.h>
#include <MediaFormats.h>
diff --git a/src/add-ons/media/plugins/ffmpeg/AVFormatWriter.cpp
b/src/add-ons/media/plugins/ffmpeg/AVFormatWriter.cpp
index 842fcdf..41d8dc2 100644
--- a/src/add-ons/media/plugins/ffmpeg/AVFormatWriter.cpp
+++ b/src/add-ons/media/plugins/ffmpeg/AVFormatWriter.cpp
@@ -15,7 +15,7 @@
#include <AutoDeleter.h>
#include <Autolock.h>
#include <ByteOrder.h>
-#include <DataIO.h>
+#include <MediaIO.h>
#include <MediaDefs.h>
#include <MediaFormats.h>
#include <Roster.h>
diff --git a/src/kits/media/Jamfile b/src/kits/media/Jamfile
index ee97010..4ab180e 100644
--- a/src/kits/media/Jamfile
+++ b/src/kits/media/Jamfile
@@ -24,6 +24,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
!missing_symbols.cpp
Deprecated.cpp
MediaRecorder.cpp
+ MediaIO.cpp
# Public Media Kit
Buffer.cpp
diff --git a/src/kits/media/MediaIO.cpp b/src/kits/media/MediaIO.cpp
new file mode 100644
index 0000000..1d8ec70
--- /dev/null
+++ b/src/kits/media/MediaIO.cpp
@@ -0,0 +1,31 @@
+/*
+ * Copyright 2016 Dario Casalinuovo. All rights reserved.
+ * Distributed under the terms of the MIT License.
+ *
+ */
+
+#include <MediaIO.h>
+
+
+BMediaIO::BMediaIO()
+{
+}
+
+
+BMediaIO::BMediaIO(const BMediaIO &)
+{
+ // copying not allowed...
+}
+
+
+BMediaIO::~BMediaIO()
+{
+}
+
+
+// FBC
+void BMediaIO::_ReservedMediaIO1() {}
+void BMediaIO::_ReservedMediaIO2() {}
+void BMediaIO::_ReservedMediaIO3() {}
+void BMediaIO::_ReservedMediaIO4() {}
+void BMediaIO::_ReservedMediaIO5() {}
diff --git a/src/kits/support/DataIO.cpp b/src/kits/support/DataIO.cpp
index 1a647d2..57a5796 100644
--- a/src/kits/support/DataIO.cpp
+++ b/src/kits/support/DataIO.cpp
@@ -601,27 +601,3 @@ BMallocIO::operator=(const BMallocIO &)
// FBC
void BMallocIO::_ReservedMallocIO1() {}
void BMallocIO::_ReservedMallocIO2() {}
-
-
-BMediaIO::BMediaIO()
-{
-}
-
-
-BMediaIO::BMediaIO(const BMediaIO &)
-{
- // copying not allowed...
-}
-
-
-BMediaIO::~BMediaIO()
-{
-}
-
-
-// FBC
-void BMediaIO::_ReservedMediaIO1() {}
-void BMediaIO::_ReservedMediaIO2() {}
-void BMediaIO::_ReservedMediaIO3() {}
-void BMediaIO::_ReservedMediaIO4() {}
-void BMediaIO::_ReservedMediaIO5() {}