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;