[haiku-commits] haiku: hrev50531 - src/kits/media src/add-ons/media/plugins/http_streamer headers/private/media

  • From: b.vitruvio@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 7 Sep 2016 18:34:09 +0200 (CEST)

hrev50531 adds 4 changesets to branch 'master'
old head: c6b4e47a504b154b1d726f4ab65502a449ae38ed
new head: 3ff901ac715531f0c3158c6a6884506c17198425
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=3ff901ac7155+%5Ec6b4e47a504b

----------------------------------------------------------------------------

95a5e6251580: MediaFile: Correctly delete the source on exit
  
  * The delete flag of BUrl constructors was reset by _Init,
  this lead to a zombie thread on the background under certain
  conditions.

79bd3b48377d: StreamerPlugin: Add reference count
  
  * Keep the Streamer around until everyone released it.

e3f2079964c3: AdapterIO: Remove unuseful Close()

3ff901ac7155: http_streamer: Fix different issues
  
  * Cleanup object management.
  * Remove Close() and use the destructor in place.
  * Release listener sem on exit.
  * Return when there's a request mismatch.
  * Add some debugging.
  * MediaPlayer crashes are fixed as result of the patchset.

                                [ Dario Casalinuovo <b.vitruvio@xxxxxxxxx> ]

----------------------------------------------------------------------------

8 files changed, 48 insertions(+), 46 deletions(-)
headers/private/media/AdapterIO.h                |  1 -
headers/private/media/StreamerPlugin.h           |  2 +
.../media/plugins/http_streamer/HTTPMediaIO.cpp  | 46 ++++++++++----------
.../media/plugins/http_streamer/HTTPMediaIO.h    |  1 -
.../plugins/http_streamer/HTTPStreamerPlugin.cpp |  7 +++
src/kits/media/AdapterIO.cpp                     | 12 -----
src/kits/media/MediaFile.cpp                     |  6 +--
src/kits/media/PluginManager.cpp                 | 19 +++++---

############################################################################

Commit:      95a5e62515808b415511be61fc318e627141f9b0
URL:         http://cgit.haiku-os.org/haiku/commit/?id=95a5e6251580
Author:      Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date:        Wed Sep  7 16:02:34 2016 UTC

MediaFile: Correctly delete the source on exit

* The delete flag of BUrl constructors was reset by _Init,
this lead to a zombie thread on the background under certain
conditions.

----------------------------------------------------------------------------

diff --git a/src/kits/media/MediaFile.cpp b/src/kits/media/MediaFile.cpp
index 447ab3a..ec02f08 100644
--- a/src/kits/media/MediaFile.cpp
+++ b/src/kits/media/MediaFile.cpp
@@ -85,8 +85,8 @@ BMediaFile::BMediaFile(const media_file_format* mfi, int32 
flags)
 BMediaFile::BMediaFile(const BUrl& url)
 {
        CALLED();
-       fDeleteSource = true;
        _Init();
+       fDeleteSource = true;
        _InitReader(NULL, &url);
 }
 
@@ -94,8 +94,8 @@ BMediaFile::BMediaFile(const BUrl& url)
 BMediaFile::BMediaFile(const BUrl& url, int32 flags)
 {
        CALLED();
-       fDeleteSource = true;
        _Init();
+       fDeleteSource = true;
        _InitReader(NULL, &url, flags);
 }
 
@@ -104,8 +104,8 @@ BMediaFile::BMediaFile(BUrl destination, const 
media_file_format* mfi,
        int32 flags)
 {
        CALLED();
-       fDeleteSource = true;
        _Init();
+       fDeleteSource = true;
        _InitWriter(NULL, &destination, mfi, flags);
        // TODO: Implement streaming server support, it's
        // a pretty complex thing compared to client mode

############################################################################

Commit:      79bd3b48377de014f9a3c52edf57acb40a9b7a83
URL:         http://cgit.haiku-os.org/haiku/commit/?id=79bd3b48377d
Author:      Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date:        Wed Sep  7 16:19:10 2016 UTC

StreamerPlugin: Add reference count

* Keep the Streamer around until everyone released it.

----------------------------------------------------------------------------

diff --git a/headers/private/media/StreamerPlugin.h 
b/headers/private/media/StreamerPlugin.h
index 4fdfef5..e25290c 100644
--- a/headers/private/media/StreamerPlugin.h
+++ b/headers/private/media/StreamerPlugin.h
@@ -4,6 +4,7 @@
 
 #include <MediaIO.h>
 #include <MediaTrack.h>
+#include <Referenceable.h>
 #include <Url.h>
 
 #include "MediaPlugin.h"
@@ -27,6 +28,7 @@ private:
        virtual void                            _ReservedStreamer5();
 
                        MediaPlugin*            fMediaPlugin;
+                       BReferenceable          fReference;
                        uint32                          fReserved[5];
 
        // needed for plug-in reference count management
diff --git a/src/kits/media/PluginManager.cpp b/src/kits/media/PluginManager.cpp
index c26fa3a..49cd9fe 100644
--- a/src/kits/media/PluginManager.cpp
+++ b/src/kits/media/PluginManager.cpp
@@ -25,8 +25,7 @@ PluginManager gPluginManager;
 #define MAX_STREAMERS 40
 
 
-class DataIOAdapter : public BAdapterIO
-{
+class DataIOAdapter : public BAdapterIO {
 public:
        DataIOAdapter(BDataIO* dataIO)
                :
@@ -78,8 +77,7 @@ private:
 };
 
 
-class BMediaIOWrapper : public BMediaIO
-{
+class BMediaIOWrapper : public BMediaIO {
 public:
        BMediaIOWrapper(BDataIO* source)
                :
@@ -639,6 +637,7 @@ PluginManager::CreateStreamer(Streamer** streamer, BUrl 
url, BDataIO** source)
                if ((*streamer)->Sniff(url, &streamSource) == B_OK) {
                        TRACE("PluginManager::CreateStreamer: Sniff success\n");
                        *source = streamSource;
+                       (*streamer)->fReference.AcquireReference();
                        return B_OK;
                }
 
@@ -657,12 +656,18 @@ 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,
+               // NOTE: We have to put the plug-in after deleting the streamer,
                // since otherwise we may actually unload the code for the
                // destructor...
+
                MediaPlugin* plugin = streamer->fMediaPlugin;
-               delete streamer;
-               PutPlugin(plugin);
+               streamer->fReference.ReleaseReference();
+
+               // Delete the streamer only when every reference is released
+               if (streamer->fReference.CountReferences() == 0) {
+                       delete streamer;
+                       PutPlugin(plugin);
+               }
        }
 }
 

############################################################################

Commit:      e3f2079964c3677552fca645602e6dc464622563
URL:         http://cgit.haiku-os.org/haiku/commit/?id=e3f2079964c3
Author:      Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date:        Wed Sep  7 16:21:13 2016 UTC

AdapterIO: Remove unuseful Close()

----------------------------------------------------------------------------

diff --git a/headers/private/media/AdapterIO.h 
b/headers/private/media/AdapterIO.h
index bf09c16..8191006 100644
--- a/headers/private/media/AdapterIO.h
+++ b/headers/private/media/AdapterIO.h
@@ -56,7 +56,6 @@ public:
        virtual status_t                                GetSize(off_t* size) 
const;
 
        virtual status_t                                Open();
-       virtual void                                    Close();
 
        virtual bool                                    IsRunning() const;
 
diff --git a/src/kits/media/AdapterIO.cpp b/src/kits/media/AdapterIO.cpp
index 8227a2f..56ccbb7 100644
--- a/src/kits/media/AdapterIO.cpp
+++ b/src/kits/media/AdapterIO.cpp
@@ -229,9 +229,6 @@ BAdapterIO::~BAdapterIO()
 {
        CALLED();
 
-       if (!fOpened)
-               Close();
-
        delete fInputAdapter;
        delete fBuffer;
 }
@@ -342,15 +339,6 @@ BAdapterIO::Open()
 }
 
 
-void
-BAdapterIO::Close()
-{
-       CALLED();
-
-       fOpened = false;
-}
-
-
 bool
 BAdapterIO::IsRunning() const
 {

############################################################################

Revision:    hrev50531
Commit:      3ff901ac715531f0c3158c6a6884506c17198425
URL:         http://cgit.haiku-os.org/haiku/commit/?id=3ff901ac7155
Author:      Dario Casalinuovo <b.vitruvio@xxxxxxxxx>
Date:        Wed Sep  7 16:21:52 2016 UTC

http_streamer: Fix different issues

* Cleanup object management.
* Remove Close() and use the destructor in place.
* Release listener sem on exit.
* Return when there's a request mismatch.
* Add some debugging.
* MediaPlayer crashes are fixed as result of the patchset.

----------------------------------------------------------------------------

diff --git a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp 
b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
index 7259af6..e672f9b 100644
--- a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
+++ b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.cpp
@@ -10,6 +10,8 @@
 #include <HttpRequest.h>
 #include <UrlProtocolRoster.h>
 
+#include "debug.h"
+
 
 // 10 seconds timeout
 #define HTTP_TIMEOUT 10000000
@@ -29,7 +31,10 @@ public:
                        fInitSem = create_sem(0, "http_streamer init sem");
                }
 
-               virtual ~FileListener() {};
+               virtual ~FileListener()
+               {
+                       _ReleaseInit();
+               }
 
                bool ConnectionSuccessful() const
                {
@@ -47,8 +52,10 @@ public:
                void DataReceived(BUrlRequest* request, const char* data,
                        off_t position, ssize_t size)
                {
-                       if (request != fRequest)
+                       if (request != fRequest) {
                                delete request;
+                               return;
+                       }
 
                        BHttpRequest* httpReq = 
dynamic_cast<BHttpRequest*>(request);
                        if (httpReq != NULL) {
@@ -111,16 +118,29 @@ HTTPMediaIO::HTTPMediaIO(BUrl url)
        BAdapterIO(B_MEDIA_STREAMING | B_MEDIA_SEEKABLE, HTTP_TIMEOUT),
        fContext(NULL),
        fReq(NULL),
-       fReqThread(-1),
        fListener(NULL),
+       fReqThread(-1),
        fUrl(url),
        fIsMutable(false)
 {
+       CALLED();
+
+       // The context has the same life time of the object
+       fContext = new BUrlContext();
+       fContext->AcquireReference();
 }
 
 
 HTTPMediaIO::~HTTPMediaIO()
 {
+       CALLED();
+
+       fReq->Stop();
+       status_t status;
+       wait_for_thread(fReqThread, &status);
+
+       fContext->ReleaseReference();
+       delete fContext;
 }
 
 
@@ -150,8 +170,7 @@ HTTPMediaIO::SetSize(off_t size)
 status_t
 HTTPMediaIO::Open()
 {
-       fContext = new BUrlContext();
-       fContext->AcquireReference();
+       CALLED();
 
        fListener = new FileListener(this);
 
@@ -173,23 +192,6 @@ HTTPMediaIO::Open()
 }
 
 
-void
-HTTPMediaIO::Close()
-{
-       fReq->Stop();
-       status_t status;
-       wait_for_thread(fReqThread, &status);
-
-       delete fReq;
-       delete fListener;
-
-       fContext->ReleaseReference();
-       delete fContext;
-
-       BAdapterIO::Close();
-}
-
-
 bool
 HTTPMediaIO::IsRunning() const
 {
diff --git a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h 
b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
index f844b18..f348ef8 100644
--- a/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
+++ b/src/add-ons/media/plugins/http_streamer/HTTPMediaIO.h
@@ -28,7 +28,6 @@ public:
        virtual status_t                                        SetSize(off_t 
size);
 
        virtual status_t                                        Open();
-       virtual void                                            Close();
 
        virtual bool                                            IsRunning() 
const;
 
diff --git a/src/add-ons/media/plugins/http_streamer/HTTPStreamerPlugin.cpp 
b/src/add-ons/media/plugins/http_streamer/HTTPStreamerPlugin.cpp
index 60f5dac..c821b3d 100644
--- a/src/add-ons/media/plugins/http_streamer/HTTPStreamerPlugin.cpp
+++ b/src/add-ons/media/plugins/http_streamer/HTTPStreamerPlugin.cpp
@@ -8,21 +8,28 @@
 
 #include "HTTPMediaIO.h"
 
+#include "debug.h"
+
 
 HTTPStreamer::HTTPStreamer()
 {
+       CALLED();
 }
 
 
 HTTPStreamer::~HTTPStreamer()
 {
+       CALLED();
 }
 
 
 status_t
 HTTPStreamer::Sniff(const BUrl& url, BDataIO** source)
 {
+       CALLED();
+
        HTTPMediaIO* outSource = new HTTPMediaIO(url);
+
        status_t ret = outSource->Open();
        if (ret == B_OK) {
                *source = outSource;


Other related posts:

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