[haiku-commits] haiku: hrev50164 - src/kits/media src/add-ons/media/plugins/ffmpeg headers/private/media headers/os/media

  • From: b.vitruvio@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Fri, 25 Mar 2016 23:19:50 +0100 (CET)

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() {}


Other related posts:

  • » [haiku-commits] haiku: hrev50164 - src/kits/media src/add-ons/media/plugins/ffmpeg headers/private/media headers/os/media - b . vitruvio