[haiku-commits] haiku: hrev51306 - src/kits/media headers/private/media

  • From: jerome.duval@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 24 Jul 2017 12:00:46 +0200 (CEST)

hrev51306 adds 1 changeset to branch 'master'
old head: 13dbf471095bf5c991bce4d0a3ab3df3d56a9821
new head: dbad909b4e0d34bcc12d8a4818470584af90f7ad
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=dbad909b4e0d+%5E13dbf471095b

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

dbad909b4e0d: BMediaFile: fix MediaExtractor crash.
  
  * stop the extractor processing before deleting the source.
  * crash happened in MediaPlayer FilePlaylistItem::_CalculateDuration().
  * was a regression introduced in hrev50671.
  * fixes #13156.

                                   [ Jérôme Duval <jerome.duval@xxxxxxxxx> ]

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

Revision:    hrev51306
Commit:      dbad909b4e0d34bcc12d8a4818470584af90f7ad
URL:         http://cgit.haiku-os.org/haiku/commit/?id=dbad909b4e0d
Author:      Jérôme Duval <jerome.duval@xxxxxxxxx>
Date:        Mon Jul 24 09:50:06 2017 UTC

Ticket:      https://dev.haiku-os.org/ticket/13156

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

3 files changed, 27 insertions(+), 7 deletions(-)
headers/private/media/MediaExtractor.h |  3 +++
src/kits/media/MediaExtractor.cpp      | 25 ++++++++++++++++++-------
src/kits/media/MediaFile.cpp           |  6 ++++++

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

diff --git a/headers/private/media/MediaExtractor.h 
b/headers/private/media/MediaExtractor.h
index eb32203..eeefca7 100644
--- a/headers/private/media/MediaExtractor.h
+++ b/headers/private/media/MediaExtractor.h
@@ -72,6 +72,9 @@ public:
                        status_t                        GetStreamMetaData(int32 
stream,
                                                                        
BMessage* _data) const;
 
+                       void                            StopProcessing();
+
+
 private:
                        void                            _Init(BDataIO* source, 
int32 flags);
 
diff --git a/src/kits/media/MediaExtractor.cpp 
b/src/kits/media/MediaExtractor.cpp
index 1029c29..8696279 100644
--- a/src/kits/media/MediaExtractor.cpp
+++ b/src/kits/media/MediaExtractor.cpp
@@ -147,13 +147,8 @@ MediaExtractor::~MediaExtractor()
 {
        CALLED();
 
-#if !DISABLE_CHUNK_CACHE
-       // terminate extractor thread
-       delete_sem(fExtractorWaitSem);
-
-       status_t status;
-       wait_for_thread(fExtractorThread, &status);
-#endif
+       // stop the extractor thread, if still running
+       StopProcessing();
 
        // free all stream cookies
        // and chunk caches
@@ -413,6 +408,22 @@ MediaExtractor::GetStreamMetaData(int32 stream, BMessage* 
_data) const
 
 
 void
+MediaExtractor::StopProcessing()
+{
+#if !DISABLE_CHUNK_CACHE
+       if (fExtractorWaitSem > -1) {
+               // terminate extractor thread
+               delete_sem(fExtractorWaitSem);
+               fExtractorWaitSem = -1;
+
+               status_t status;
+               wait_for_thread(fExtractorThread, &status);
+       }
+#endif
+}
+
+
+void
 MediaExtractor::_RecycleLastChunk(stream_info& info)
 {
        if (info.lastChunk != NULL) {
diff --git a/src/kits/media/MediaFile.cpp b/src/kits/media/MediaFile.cpp
index ba81c5f..79b0f0e 100644
--- a/src/kits/media/MediaFile.cpp
+++ b/src/kits/media/MediaFile.cpp
@@ -471,6 +471,12 @@ BMediaFile::_UnInit()
        free(fTrackList);
        fTrackList = NULL;
        fTrackNum = 0;
+
+       // Tells the extractor to stop its asynchronous processing
+       // before deleting its source
+       if (fExtractor != NULL)
+               fExtractor->StopProcessing();
+
        if (fDeleteSource) {
                delete fSource;
                fSource = NULL;


Other related posts:

  • » [haiku-commits] haiku: hrev51306 - src/kits/media headers/private/media - jerome . duval