diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2010-01-12 15:18:53 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2010-01-12 15:18:53 -0800 |
commit | b0823224bf6b5dcd40645518af40f17044ad0d70 (patch) | |
tree | 3b09d720df002b724e30eec03a4e0caddcea7b10 | |
parent | 2ffcb6c4fe5be89b38b72803182cbc5f3fbad43a (diff) | |
download | frameworks_av-b0823224bf6b5dcd40645518af40f17044ad0d70.zip frameworks_av-b0823224bf6b5dcd40645518af40f17044ad0d70.tar.gz frameworks_av-b0823224bf6b5dcd40645518af40f17044ad0d70.tar.bz2 |
android-2.1_r1 snapshot
-rw-r--r-- | include/media/AudioRecord.h | 7 | ||||
-rw-r--r-- | include/media/AudioSystem.h | 8 | ||||
-rw-r--r-- | include/media/stagefright/MediaPlayerImpl.h | 4 | ||||
-rw-r--r-- | media/libmedia/AudioRecord.cpp | 73 | ||||
-rw-r--r-- | media/libmedia/AudioTrack.cpp | 41 | ||||
-rw-r--r-- | media/libmedia/IMediaMetadataRetriever.cpp | 87 | ||||
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 24 | ||||
-rw-r--r-- | media/libmediaplayerservice/MetadataRetrieverClient.cpp | 14 | ||||
-rw-r--r-- | media/libmediaplayerservice/MetadataRetrieverClient.h | 10 | ||||
-rw-r--r-- | media/libstagefright/MediaPlayerImpl.cpp | 58 |
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; } |