summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2010-01-12 15:18:53 -0800
committerThe Android Open Source Project <initial-contribution@android.com>2010-01-12 15:18:53 -0800
commitb0823224bf6b5dcd40645518af40f17044ad0d70 (patch)
tree3b09d720df002b724e30eec03a4e0caddcea7b10
parent2ffcb6c4fe5be89b38b72803182cbc5f3fbad43a (diff)
downloadframeworks_av-b0823224bf6b5dcd40645518af40f17044ad0d70.zip
frameworks_av-b0823224bf6b5dcd40645518af40f17044ad0d70.tar.gz
frameworks_av-b0823224bf6b5dcd40645518af40f17044ad0d70.tar.bz2
android-2.1_r1 snapshot
-rw-r--r--include/media/AudioRecord.h7
-rw-r--r--include/media/AudioSystem.h8
-rw-r--r--include/media/stagefright/MediaPlayerImpl.h4
-rw-r--r--media/libmedia/AudioRecord.cpp73
-rw-r--r--media/libmedia/AudioTrack.cpp41
-rw-r--r--media/libmedia/IMediaMetadataRetriever.cpp87
-rw-r--r--media/libmediaplayerservice/MediaPlayerService.cpp24
-rw-r--r--media/libmediaplayerservice/MetadataRetrieverClient.cpp14
-rw-r--r--media/libmediaplayerservice/MetadataRetrieverClient.h10
-rw-r--r--media/libstagefright/MediaPlayerImpl.cpp58
10 files changed, 210 insertions, 116 deletions
diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h
index 008468c..622c596 100644
--- a/include/media/AudioRecord.h
+++ b/include/media/AudioRecord.h
@@ -268,7 +268,7 @@ public:
* Returned value:
* handle on audio hardware input
*/
- audio_io_handle_t getInput() { return mInput; }
+ audio_io_handle_t getInput();
/* obtains a buffer of "frameCount" frames. The buffer must be
* filled entirely. If the track is stopped, obtainBuffer() returns
@@ -318,7 +318,8 @@ private:
int format,
int channelCount,
int frameCount,
- uint32_t flags);
+ uint32_t flags,
+ audio_io_handle_t input);
sp<IAudioRecord> mAudioRecord;
sp<IMemory> mCblkMemory;
@@ -345,8 +346,8 @@ private:
bool mMarkerReached;
uint32_t mNewPosition;
uint32_t mUpdatePeriod;
- audio_io_handle_t mInput;
uint32_t mFlags;
+ uint32_t mChannels;
};
}; // namespace android
diff --git a/include/media/AudioSystem.h b/include/media/AudioSystem.h
index e066177..29aaa3f 100644
--- a/include/media/AudioSystem.h
+++ b/include/media/AudioSystem.h
@@ -239,15 +239,11 @@ public:
DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES = 0x100,
DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER = 0x200,
DEVICE_OUT_AUX_DIGITAL = 0x400,
- DEVICE_OUT_FM_HEADPHONE = 0x800,
- DEVICE_OUT_FM_SPEAKER = 0x1000,
- DEVICE_OUT_TTY = 0x2000,
DEVICE_OUT_DEFAULT = 0x8000,
DEVICE_OUT_ALL = (DEVICE_OUT_EARPIECE | DEVICE_OUT_SPEAKER | DEVICE_OUT_WIRED_HEADSET |
DEVICE_OUT_WIRED_HEADPHONE | DEVICE_OUT_BLUETOOTH_SCO | DEVICE_OUT_BLUETOOTH_SCO_HEADSET |
DEVICE_OUT_BLUETOOTH_SCO_CARKIT | DEVICE_OUT_BLUETOOTH_A2DP | DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
- DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | DEVICE_OUT_AUX_DIGITAL | DEVICE_OUT_FM_HEADPHONE |
- DEVICE_OUT_FM_SPEAKER | DEVICE_OUT_TTY | DEVICE_OUT_DEFAULT),
+ DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER | DEVICE_OUT_AUX_DIGITAL | DEVICE_OUT_DEFAULT),
// input devices
DEVICE_IN_COMMUNICATION = 0x10000,
@@ -286,6 +282,7 @@ public:
FORCE_BT_SCO,
FORCE_BT_A2DP,
FORCE_WIRED_ACCESSORY,
+ FORCE_BT_DOCK,
NUM_FORCE_CONFIG,
FORCE_DEFAULT = FORCE_NONE
};
@@ -295,6 +292,7 @@ public:
FOR_COMMUNICATION,
FOR_MEDIA,
FOR_RECORD,
+ FOR_DOCK,
NUM_FORCE_USE
};
diff --git a/include/media/stagefright/MediaPlayerImpl.h b/include/media/stagefright/MediaPlayerImpl.h
index 53a2088..7adf836 100644
--- a/include/media/stagefright/MediaPlayerImpl.h
+++ b/include/media/stagefright/MediaPlayerImpl.h
@@ -112,7 +112,9 @@ private:
MediaSource *makeShoutcastSource(const char *path);
- void displayOrDiscardFrame(MediaBuffer *buffer, int64_t pts_us);
+ void displayOrDiscardFrame(
+ MediaBuffer **lastBuffer, MediaBuffer *buffer, int64_t pts_us);
+
void populateISurface();
void depopulateISurface();
void sendFrameToISurface(MediaBuffer *buffer);
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp
index e63c0d2..f4165ff 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -46,7 +46,7 @@ namespace android {
// ---------------------------------------------------------------------------
AudioRecord::AudioRecord()
- : mStatus(NO_INIT), mInput(0)
+ : mStatus(NO_INIT)
{
}
@@ -60,7 +60,7 @@ AudioRecord::AudioRecord(
callback_t cbf,
void* user,
int notificationFrames)
- : mStatus(NO_INIT), mInput(0)
+ : mStatus(NO_INIT)
{
mStatus = set(inputSource, sampleRate, format, channels,
frameCount, flags, cbf, user, notificationFrames);
@@ -79,7 +79,6 @@ AudioRecord::~AudioRecord()
}
mAudioRecord.clear();
IPCThreadState::self()->flushCommands();
- AudioSystem::releaseInput(mInput);
}
}
@@ -123,10 +122,10 @@ status_t AudioRecord::set(
}
int channelCount = AudioSystem::popCount(channels);
- mInput = AudioSystem::getInput(inputSource,
+ audio_io_handle_t input = AudioSystem::getInput(inputSource,
sampleRate, format, channels, (AudioSystem::audio_in_acoustics)flags);
- if (mInput == 0) {
- LOGE("Could not get audio output for stream type %d", inputSource);
+ if (input == 0) {
+ LOGE("Could not get audio input for record source %d", inputSource);
return BAD_VALUE;
}
@@ -168,7 +167,7 @@ status_t AudioRecord::set(
// create the IAudioRecord
status_t status = openRecord(sampleRate, format, channelCount,
- frameCount, flags);
+ frameCount, flags, input);
if (status != NO_ERROR) {
return status;
@@ -187,6 +186,7 @@ status_t AudioRecord::set(
// Update buffer size in case it has been limited by AudioFlinger during track creation
mFrameCount = mCblk->frameCount;
mChannelCount = (uint8_t)channelCount;
+ mChannels = channels;
mActive = 0;
mCbf = cbf;
mNotificationFrames = notificationFrames;
@@ -265,28 +265,27 @@ status_t AudioRecord::start()
}
if (android_atomic_or(1, &mActive) == 0) {
- ret = AudioSystem::startInput(mInput);
- if (ret == NO_ERROR) {
- ret = mAudioRecord->start();
- if (ret == DEAD_OBJECT) {
- LOGV("start() dead IAudioRecord: creating a new one");
- ret = openRecord(mCblk->sampleRate, mFormat, mChannelCount,
- mFrameCount, mFlags);
- }
+ ret = mAudioRecord->start();
+ if (ret == DEAD_OBJECT) {
+ LOGV("start() dead IAudioRecord: creating a new one");
+ ret = openRecord(mCblk->sampleRate, mFormat, mChannelCount,
+ mFrameCount, mFlags, getInput());
if (ret == NO_ERROR) {
- mNewPosition = mCblk->user + mUpdatePeriod;
- mCblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
- mCblk->waitTimeMs = 0;
- if (t != 0) {
- t->run("ClientRecordThread", THREAD_PRIORITY_AUDIO_CLIENT);
- } else {
- setpriority(PRIO_PROCESS, 0, THREAD_PRIORITY_AUDIO_CLIENT);
- }
+ ret = mAudioRecord->start();
+ }
+ }
+ if (ret == NO_ERROR) {
+ mNewPosition = mCblk->user + mUpdatePeriod;
+ mCblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
+ mCblk->waitTimeMs = 0;
+ if (t != 0) {
+ t->run("ClientRecordThread", THREAD_PRIORITY_AUDIO_CLIENT);
} else {
- LOGV("start() failed");
- AudioSystem::stopInput(mInput);
- android_atomic_and(~1, &mActive);
+ setpriority(PRIO_PROCESS, 0, THREAD_PRIORITY_AUDIO_CLIENT);
}
+ } else {
+ LOGV("start() failed");
+ android_atomic_and(~1, &mActive);
}
}
@@ -318,7 +317,6 @@ status_t AudioRecord::stop()
} else {
setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_NORMAL);
}
- AudioSystem::stopInput(mInput);
}
if (t != 0) {
@@ -395,7 +393,8 @@ status_t AudioRecord::openRecord(
int format,
int channelCount,
int frameCount,
- uint32_t flags)
+ uint32_t flags,
+ audio_io_handle_t input)
{
status_t status;
const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
@@ -403,7 +402,7 @@ status_t AudioRecord::openRecord(
return NO_INIT;
}
- sp<IAudioRecord> record = audioFlinger->openRecord(getpid(), mInput,
+ sp<IAudioRecord> record = audioFlinger->openRecord(getpid(), input,
sampleRate, format,
channelCount,
frameCount,
@@ -425,7 +424,8 @@ status_t AudioRecord::openRecord(
mCblk = static_cast<audio_track_cblk_t*>(cblk->pointer());
mCblk->buffers = (char*)mCblk + sizeof(audio_track_cblk_t);
mCblk->out = 0;
-
+ mCblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
+ mCblk->waitTimeMs = 0;
return NO_ERROR;
}
@@ -466,10 +466,10 @@ status_t AudioRecord::obtainBuffer(Buffer* audioBuffer, int32_t waitCount)
if (result == DEAD_OBJECT) {
LOGW("obtainBuffer() dead IAudioRecord: creating a new one");
result = openRecord(cblk->sampleRate, mFormat, mChannelCount,
- mFrameCount, mFlags);
+ mFrameCount, mFlags, getInput());
if (result == NO_ERROR) {
cblk = mCblk;
- cblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
+ mAudioRecord->start();
}
}
cblk->lock.lock();
@@ -516,6 +516,14 @@ void AudioRecord::releaseBuffer(Buffer* audioBuffer)
cblk->stepUser(audioBuffer->frameCount);
}
+audio_io_handle_t AudioRecord::getInput()
+{
+ return AudioSystem::getInput(mInputSource,
+ mCblk->sampleRate,
+ mFormat, mChannels,
+ (AudioSystem::audio_in_acoustics)mFlags);
+}
+
// -------------------------------------------------------------------------
ssize_t AudioRecord::read(void* buffer, size_t userSize)
@@ -531,7 +539,6 @@ ssize_t AudioRecord::read(void* buffer, size_t userSize)
return BAD_VALUE;
}
- LOGV("read size: %d", userSize);
do {
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index 8529a8e..ad0f42e 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -97,7 +97,6 @@ AudioTrack::~AudioTrack()
}
mAudioTrack.clear();
IPCThreadState::self()->flushCommands();
- AudioSystem::releaseOutput(getOutput());
}
}
@@ -318,26 +317,35 @@ void AudioTrack::start()
}
if (android_atomic_or(1, &mActive) == 0) {
- audio_io_handle_t output = AudioTrack::getOutput();
+ mNewPosition = mCblk->server + mUpdatePeriod;
+ mCblk->bufferTimeoutMs = MAX_STARTUP_TIMEOUT_MS;
+ mCblk->waitTimeMs = 0;
+ if (t != 0) {
+ t->run("AudioTrackThread", THREAD_PRIORITY_AUDIO_CLIENT);
+ } else {
+ setpriority(PRIO_PROCESS, 0, THREAD_PRIORITY_AUDIO_CLIENT);
+ }
+
status_t status = mAudioTrack->start();
if (status == DEAD_OBJECT) {
LOGV("start() dead IAudioTrack: creating a new one");
status = createTrack(mStreamType, mCblk->sampleRate, mFormat, mChannelCount,
- mFrameCount, mFlags, mSharedBuffer, output);
+ mFrameCount, mFlags, mSharedBuffer, getOutput());
+ if (status == NO_ERROR) {
+ status = mAudioTrack->start();
+ if (status == NO_ERROR) {
+ mNewPosition = mCblk->server + mUpdatePeriod;
+ }
+ }
}
- if (status == NO_ERROR) {
- AudioSystem::startOutput(output, (AudioSystem::stream_type)mStreamType);
- mNewPosition = mCblk->server + mUpdatePeriod;
- mCblk->bufferTimeoutMs = MAX_STARTUP_TIMEOUT_MS;
- mCblk->waitTimeMs = 0;
+ if (status != NO_ERROR) {
+ LOGV("start() failed");
+ android_atomic_and(~1, &mActive);
if (t != 0) {
- t->run("AudioTrackThread", THREAD_PRIORITY_AUDIO_CLIENT);
+ t->requestExit();
} else {
- setpriority(PRIO_PROCESS, 0, THREAD_PRIORITY_AUDIO_CLIENT);
+ setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_NORMAL);
}
- } else {
- LOGV("start() failed");
- android_atomic_and(~1, &mActive);
}
}
@@ -374,7 +382,6 @@ void AudioTrack::stop()
} else {
setpriority(PRIO_PROCESS, 0, ANDROID_PRIORITY_NORMAL);
}
- AudioSystem::stopOutput(getOutput(), (AudioSystem::stream_type)mStreamType);
}
if (t != 0) {
@@ -409,9 +416,7 @@ void AudioTrack::pause()
{
LOGV("pause");
if (android_atomic_and(~1, &mActive) == 1) {
- mActive = 0;
mAudioTrack->pause();
- AudioSystem::stopOutput(getOutput(), (AudioSystem::stream_type)mStreamType);
}
}
@@ -649,7 +654,8 @@ status_t AudioTrack::createTrack(
}
mCblk->volumeLR = (int32_t(int16_t(mVolume[LEFT] * 0x1000)) << 16) | int16_t(mVolume[RIGHT] * 0x1000);
-
+ mCblk->bufferTimeoutMs = MAX_STARTUP_TIMEOUT_MS;
+ mCblk->waitTimeMs = 0;
return NO_ERROR;
}
@@ -700,6 +706,7 @@ status_t AudioTrack::obtainBuffer(Buffer* audioBuffer, int32_t waitCount)
if (result == NO_ERROR) {
cblk = mCblk;
cblk->bufferTimeoutMs = MAX_RUN_TIMEOUT_MS;
+ mAudioTrack->start();
}
}
cblk->lock.lock();
diff --git a/media/libmedia/IMediaMetadataRetriever.cpp b/media/libmedia/IMediaMetadataRetriever.cpp
index 397a55b..e529d25 100644
--- a/media/libmedia/IMediaMetadataRetriever.cpp
+++ b/media/libmedia/IMediaMetadataRetriever.cpp
@@ -21,6 +21,60 @@
#include <SkBitmap.h>
#include <media/IMediaMetadataRetriever.h>
+// The binder is supposed to propagate the scheduler group across
+// the binder interface so that remote calls are executed with
+// the same priority as local calls. This is currently not working
+// so this change puts in a temporary hack to fix the issue with
+// metadata retrieval which can be a huge CPU hit if done on a
+// foreground thread.
+#ifndef DISABLE_GROUP_SCHEDULE_HACK
+
+/* desktop Linux needs a little help with gettid() */
+#if defined(HAVE_GETTID) && !defined(HAVE_ANDROID_OS)
+#define __KERNEL__
+# include <linux/unistd.h>
+#ifdef _syscall0
+_syscall0(pid_t,gettid)
+#else
+pid_t gettid() { return syscall(__NR_gettid);}
+#endif
+#undef __KERNEL__
+#endif
+
+static int myTid() {
+#ifdef HAVE_GETTID
+ return gettid();
+#else
+ return getpid();
+#endif
+}
+
+#undef LOG_TAG
+#define LOG_TAG "IMediaMetadataRetriever"
+#include <utils/Log.h>
+#include <cutils/sched_policy.h>
+
+namespace android {
+
+static void sendSchedPolicy(Parcel& data)
+{
+ SchedPolicy policy;
+ get_sched_policy(myTid(), &policy);
+ data.writeInt32(policy);
+}
+
+static void setSchedPolicy(const Parcel& data)
+{
+ SchedPolicy policy = (SchedPolicy) data.readInt32();
+ set_sched_policy(myTid(), policy);
+}
+static void restoreSchedPolicy()
+{
+ set_sched_policy(myTid(), SP_FOREGROUND);
+}
+}; // end namespace android
+#endif
+
namespace android {
enum {
@@ -30,7 +84,7 @@ enum {
SET_MODE,
GET_MODE,
CAPTURE_FRAME,
- EXTARCT_ALBUM_ART,
+ EXTRACT_ALBUM_ART,
EXTRACT_METADATA,
};
@@ -92,6 +146,9 @@ public:
{
Parcel data, reply;
data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
+#ifndef DISABLE_GROUP_SCHEDULE_HACK
+ sendSchedPolicy(data);
+#endif
remote()->transact(CAPTURE_FRAME, data, &reply);
status_t ret = reply.readInt32();
if (ret != NO_ERROR) {
@@ -104,7 +161,10 @@ public:
{
Parcel data, reply;
data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
- remote()->transact(EXTARCT_ALBUM_ART, data, &reply);
+#ifndef DISABLE_GROUP_SCHEDULE_HACK
+ sendSchedPolicy(data);
+#endif
+ remote()->transact(EXTRACT_ALBUM_ART, data, &reply);
status_t ret = reply.readInt32();
if (ret != NO_ERROR) {
return NULL;
@@ -116,6 +176,9 @@ public:
{
Parcel data, reply;
data.writeInterfaceToken(IMediaMetadataRetriever::getInterfaceDescriptor());
+#ifndef DISABLE_GROUP_SCHEDULE_HACK
+ sendSchedPolicy(data);
+#endif
data.writeInt32(keyCode);
remote()->transact(EXTRACT_METADATA, data, &reply);
status_t ret = reply.readInt32();
@@ -169,6 +232,9 @@ status_t BnMediaMetadataRetriever::onTransact(
} break;
case CAPTURE_FRAME: {
CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
+#ifndef DISABLE_GROUP_SCHEDULE_HACK
+ setSchedPolicy(data);
+#endif
sp<IMemory> bitmap = captureFrame();
if (bitmap != 0) { // Don't send NULL across the binder interface
reply->writeInt32(NO_ERROR);
@@ -176,10 +242,16 @@ status_t BnMediaMetadataRetriever::onTransact(
} else {
reply->writeInt32(UNKNOWN_ERROR);
}
+#ifndef DISABLE_GROUP_SCHEDULE_HACK
+ restoreSchedPolicy();
+#endif
return NO_ERROR;
} break;
- case EXTARCT_ALBUM_ART: {
+ case EXTRACT_ALBUM_ART: {
CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
+#ifndef DISABLE_GROUP_SCHEDULE_HACK
+ setSchedPolicy(data);
+#endif
sp<IMemory> albumArt = extractAlbumArt();
if (albumArt != 0) { // Don't send NULL across the binder interface
reply->writeInt32(NO_ERROR);
@@ -187,10 +259,16 @@ status_t BnMediaMetadataRetriever::onTransact(
} else {
reply->writeInt32(UNKNOWN_ERROR);
}
+#ifndef DISABLE_GROUP_SCHEDULE_HACK
+ restoreSchedPolicy();
+#endif
return NO_ERROR;
} break;
case EXTRACT_METADATA: {
CHECK_INTERFACE(IMediaMetadataRetriever, data, reply);
+#ifndef DISABLE_GROUP_SCHEDULE_HACK
+ setSchedPolicy(data);
+#endif
int keyCode = data.readInt32();
const char* value = extractMetadata(keyCode);
if (value != NULL) { // Don't send NULL across the binder interface
@@ -199,6 +277,9 @@ status_t BnMediaMetadataRetriever::onTransact(
} else {
reply->writeInt32(UNKNOWN_ERROR);
}
+#ifndef DISABLE_GROUP_SCHEDULE_HACK
+ restoreSchedPolicy();
+#endif
return NO_ERROR;
} break;
default:
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 0a6c365..df673a4 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -1573,12 +1573,14 @@ status_t MediaPlayerService::AudioCache::open(
uint32_t sampleRate, int channelCount, int format, int bufferCount,
AudioCallback cb, void *cookie)
{
+ LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount);
if (cb != NULL) {
return UNKNOWN_ERROR; // TODO: implement this.
}
+ if (mHeap->getHeapID() < 0) {
+ return NO_INIT;
+ }
- LOGV("open(%u, %d, %d, %d)", sampleRate, channelCount, format, bufferCount);
- if (mHeap->getHeapID() < 0) return NO_INIT;
mSampleRate = sampleRate;
mChannelCount = (uint16_t)channelCount;
mFormat = (uint16_t)format;
@@ -1627,16 +1629,24 @@ void MediaPlayerService::AudioCache::notify(void* cookie, int msg, int ext1, int
AudioCache* p = static_cast<AudioCache*>(cookie);
// ignore buffering messages
- if (msg == MEDIA_BUFFERING_UPDATE) return;
-
- // set error condition
- if (msg == MEDIA_ERROR) {
+ switch (msg)
+ {
+ case MEDIA_ERROR:
LOGE("Error %d, %d occurred", ext1, ext2);
p->mError = ext1;
+ break;
+ case MEDIA_PREPARED:
+ LOGV("prepared");
+ break;
+ case MEDIA_PLAYBACK_COMPLETE:
+ LOGV("playback complete");
+ break;
+ default:
+ LOGV("ignored");
+ return;
}
// wake up thread
- LOGV("wakeup thread");
p->mCommandComplete = true;
p->mSignal.signal();
}
diff --git a/media/libmediaplayerservice/MetadataRetrieverClient.cpp b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
index 2cdc351..d51ce66 100644
--- a/media/libmediaplayerservice/MetadataRetrieverClient.cpp
+++ b/media/libmediaplayerservice/MetadataRetrieverClient.cpp
@@ -237,7 +237,6 @@ sp<IMemory> MetadataRetrieverClient::captureFrame()
{
LOGV("captureFrame");
Mutex::Autolock lock(mLock);
- Priority priority(ANDROID_PRIORITY_BACKGROUND);
mThumbnail.clear();
mThumbnailDealer.clear();
if (mRetriever == NULL) {
@@ -279,7 +278,6 @@ sp<IMemory> MetadataRetrieverClient::extractAlbumArt()
{
LOGV("extractAlbumArt");
Mutex::Autolock lock(mLock);
- Priority priority(ANDROID_PRIORITY_BACKGROUND);
mAlbumArt.clear();
mAlbumArtDealer.clear();
if (mRetriever == NULL) {
@@ -321,19 +319,7 @@ 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 852d734..8cb8ad1 100644
--- a/media/libmediaplayerservice/MetadataRetrieverClient.h
+++ b/media/libmediaplayerservice/MetadataRetrieverClient.h
@@ -54,16 +54,6 @@ public:
private:
friend class MediaPlayerService;
- class Priority
- {
- public:
- Priority(int newPriority);
- ~Priority();
- private:
- Priority();
- int mOldPriority;
- };
-
explicit MetadataRetrieverClient(pid_t pid);
virtual ~MetadataRetrieverClient();
diff --git a/media/libstagefright/MediaPlayerImpl.cpp b/media/libstagefright/MediaPlayerImpl.cpp
index 622ea7e..8300422 100644
--- a/media/libstagefright/MediaPlayerImpl.cpp
+++ b/media/libstagefright/MediaPlayerImpl.cpp
@@ -40,6 +40,13 @@
namespace android {
+static void releaseBufferIfNonNULL(MediaBuffer **buffer) {
+ if (*buffer) {
+ (*buffer)->release();
+ *buffer = NULL;
+ }
+}
+
MediaPlayerImpl::MediaPlayerImpl(const char *uri)
: mInitCheck(NO_INIT),
mTimeSource(NULL),
@@ -51,7 +58,7 @@ MediaPlayerImpl::MediaPlayerImpl(const char *uri)
mPlaying(false),
mPaused(false),
mSeeking(false) {
- LOGI("MediaPlayerImpl(%s)", uri);
+ LOGV("MediaPlayerImpl(%s)", uri);
DataSource::RegisterDefaultSniffers();
status_t err = mClient.connect();
@@ -103,7 +110,7 @@ MediaPlayerImpl::MediaPlayerImpl(int fd, int64_t offset, int64_t length)
mPlaying(false),
mPaused(false),
mSeeking(false) {
- LOGI("MediaPlayerImpl(%d, %lld, %lld)", fd, offset, length);
+ LOGV("MediaPlayerImpl(%d, %lld, %lld)", fd, offset, length);
DataSource::RegisterDefaultSniffers();
status_t err = mClient.connect();
@@ -140,7 +147,7 @@ MediaPlayerImpl::~MediaPlayerImpl() {
}
void MediaPlayerImpl::play() {
- LOGI("play");
+ LOGV("play");
if (mPlaying) {
if (mPaused) {
@@ -229,6 +236,8 @@ void MediaPlayerImpl::videoEntry() {
bool firstFrame = true;
bool eof = false;
+ MediaBuffer *lastBuffer = NULL;
+
status_t err = mVideoDecoder->start();
CHECK_EQ(err, OK);
@@ -241,7 +250,9 @@ void MediaPlayerImpl::videoEntry() {
{
Mutex::Autolock autoLock(mLock);
if (mSeeking) {
- LOGI("seek-options to %lld", mSeekTimeUs);
+ releaseBufferIfNonNULL(&lastBuffer);
+
+ LOGV("seek-options to %lld", mSeekTimeUs);
options.setSeekTo(mSeekTimeUs);
mSeeking = false;
@@ -301,19 +312,21 @@ void MediaPlayerImpl::videoEntry() {
firstFrame = false;
}
- displayOrDiscardFrame(buffer, pts_us);
+ displayOrDiscardFrame(&lastBuffer, buffer, pts_us);
}
+ releaseBufferIfNonNULL(&lastBuffer);
+
mVideoDecoder->stop();
}
void MediaPlayerImpl::displayOrDiscardFrame(
+ MediaBuffer **lastBuffer,
MediaBuffer *buffer, int64_t pts_us) {
for (;;) {
if (!mPlaying || mPaused) {
- buffer->release();
- buffer = NULL;
-
+ releaseBufferIfNonNULL(lastBuffer);
+ *lastBuffer = buffer;
return;
}
@@ -332,15 +345,13 @@ void MediaPlayerImpl::displayOrDiscardFrame(
if (delay_us < -15000) {
// We're late.
- LOGI("we're late by %lld ms, dropping a frame\n",
+ LOGV("we're late by %lld ms, dropping a frame\n",
-delay_us / 1000);
- buffer->release();
- buffer = NULL;
+ releaseBufferIfNonNULL(lastBuffer);
+ *lastBuffer = buffer;
return;
} else if (delay_us > 100000) {
- LOGI("we're much too early (by %lld ms)\n",
- delay_us / 1000);
usleep(100000);
continue;
} else if (delay_us > 0) {
@@ -352,13 +363,14 @@ void MediaPlayerImpl::displayOrDiscardFrame(
{
Mutex::Autolock autoLock(mLock);
+
if (mVideoRenderer.get() != NULL) {
sendFrameToISurface(buffer);
}
}
- buffer->release();
- buffer = NULL;
+ releaseBufferIfNonNULL(lastBuffer);
+ *lastBuffer = buffer;
}
void MediaPlayerImpl::init() {
@@ -410,7 +422,7 @@ void MediaPlayerImpl::init() {
}
void MediaPlayerImpl::setAudioSource(const sp<MediaSource> &source) {
- LOGI("setAudioSource");
+ LOGV("setAudioSource");
mAudioSource = source;
sp<MetaData> meta = source->getFormat();
@@ -420,7 +432,7 @@ void MediaPlayerImpl::setAudioSource(const sp<MediaSource> &source) {
}
void MediaPlayerImpl::setVideoSource(const sp<MediaSource> &source) {
- LOGI("setVideoSource");
+ LOGV("setVideoSource");
mVideoSource = source;
sp<MetaData> meta = source->getFormat();
@@ -441,7 +453,7 @@ void MediaPlayerImpl::setVideoSource(const sp<MediaSource> &source) {
}
void MediaPlayerImpl::setSurface(const sp<Surface> &surface) {
- LOGI("setSurface %p", surface.get());
+ LOGV("setSurface %p", surface.get());
Mutex::Autolock autoLock(mLock);
depopulateISurface();
@@ -455,7 +467,7 @@ void MediaPlayerImpl::setSurface(const sp<Surface> &surface) {
}
void MediaPlayerImpl::setISurface(const sp<ISurface> &isurface) {
- LOGI("setISurface %p", isurface.get());
+ LOGV("setISurface %p", isurface.get());
Mutex::Autolock autoLock(mLock);
depopulateISurface();
@@ -499,7 +511,7 @@ MediaSource *MediaPlayerImpl::makeShoutcastSource(const char *uri) {
host = string(host, 0, colon - host.c_str());
}
- LOGI("Connecting to host '%s', port %d, path '%s'",
+ LOGV("Connecting to host '%s', port %d, path '%s'",
host.c_str(), port, path.c_str());
HTTPStream *http = new HTTPStream;
@@ -533,7 +545,7 @@ MediaSource *MediaPlayerImpl::makeShoutcastSource(const char *uri) {
http->disconnect();
- LOGI("Redirecting to %s\n", location.c_str());
+ LOGV("Redirecting to %s\n", location.c_str());
host = string(location, 0, slashPos);
@@ -588,7 +600,7 @@ int64_t MediaPlayerImpl::getPosition() {
}
status_t MediaPlayerImpl::seekTo(int64_t time) {
- LOGI("seekTo %lld", time);
+ LOGV("seekTo %lld", time);
if (mPaused) {
return UNKNOWN_ERROR;
@@ -651,7 +663,7 @@ void MediaPlayerImpl::sendFrameToISurface(MediaBuffer *buffer) {
void MediaPlayerImpl::setAudioSink(
const sp<MediaPlayerBase::AudioSink> &audioSink) {
- LOGI("setAudioSink %p", audioSink.get());
+ LOGV("setAudioSink %p", audioSink.get());
mAudioSink = audioSink;
}