From 7c0d20a753a930507bec09d7f89da83acc86d0da Mon Sep 17 00:00:00 2001 From: Dave Sparks Date: Mon, 26 Oct 2009 16:28:26 -0700 Subject: [PATCH] Run the metadataretriever at background priority. Bug 2187133. This change forces metadata retreiver threads to background priority. Uses an inner class to encapsulate the priority change so that it automatically restores priority when returning to the client. --- .../MetadataRetrieverClient.cpp | 27 +++++++++++++++++++ .../MetadataRetrieverClient.h | 10 +++++++ 2 files changed, 37 insertions(+) diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.cpp b/media/libmediaplayerservice/MetadataRetrieverClient.cpp index ddd4e24d9b7ed..8eabe5def29d1 100644 --- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp +++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -38,6 +39,18 @@ #include "MidiMetadataRetriever.h" #include "MetadataRetrieverClient.h" +/* desktop Linux needs a little help with gettid() */ +#if defined(HAVE_GETTID) && !defined(HAVE_ANDROID_OS) +#define __KERNEL__ +# include +#ifdef _syscall0 +_syscall0(pid_t,gettid) +#else +pid_t gettid() { return syscall(__NR_gettid);} +#endif +#undef __KERNEL__ +#endif + namespace android { extern player_type getPlayerType(const char* url); @@ -212,6 +225,7 @@ sp MetadataRetrieverClient::captureFrame() { LOGV("captureFrame"); Mutex::Autolock lock(mLock); + Priority priority(ANDROID_PRIORITY_BACKGROUND); mThumbnail.clear(); mThumbnailDealer.clear(); if (mRetriever == NULL) { @@ -253,6 +267,7 @@ sp MetadataRetrieverClient::extractAlbumArt() { LOGV("extractAlbumArt"); Mutex::Autolock lock(mLock); + Priority priority(ANDROID_PRIORITY_BACKGROUND); mAlbumArt.clear(); mAlbumArtDealer.clear(); if (mRetriever == NULL) { @@ -294,7 +309,19 @@ const char* MetadataRetrieverClient::extractMetadata(int keyCode) LOGE("retriever is not initialized"); return NULL; } + Priority priority(ANDROID_PRIORITY_BACKGROUND); return mRetriever->extractMetadata(keyCode); } +MetadataRetrieverClient::Priority::Priority(int newPriority) +{ + mOldPriority = getpriority(PRIO_PROCESS, 0); + setpriority(PRIO_PROCESS, 0, newPriority); +} + +MetadataRetrieverClient::Priority::~Priority() +{ + setpriority(PRIO_PROCESS, 0, mOldPriority); +} + }; // namespace android diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.h b/media/libmediaplayerservice/MetadataRetrieverClient.h index 8cb8ad13f1b07..852d73497fd48 100644 --- a/media/libmediaplayerservice/MetadataRetrieverClient.h +++ b/media/libmediaplayerservice/MetadataRetrieverClient.h @@ -54,6 +54,16 @@ public: private: friend class MediaPlayerService; + class Priority + { + public: + Priority(int newPriority); + ~Priority(); + private: + Priority(); + int mOldPriority; + }; + explicit MetadataRetrieverClient(pid_t pid); virtual ~MetadataRetrieverClient();