diff options
author | Andreas Huber <andih@google.com> | 2010-02-09 16:59:18 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-02-10 10:20:34 -0800 |
commit | 7d5b8a70c28c0d5746a600467b2887822dbff88e (patch) | |
tree | 886d7439311c8d76f00694123c06d3e21edb54b1 /media/libmediaplayerservice/MediaPlayerService.cpp | |
parent | 316f8352846a1470b0ffd1b94ac1ec535922a9f6 (diff) | |
download | frameworks_av-7d5b8a70c28c0d5746a600467b2887822dbff88e.zip frameworks_av-7d5b8a70c28c0d5746a600467b2887822dbff88e.tar.gz frameworks_av-7d5b8a70c28c0d5746a600467b2887822dbff88e.tar.bz2 |
Implementation of stagefright-enabled MediaPlayerService::decode functionality
related-to-bug: 2359268
Diffstat (limited to 'media/libmediaplayerservice/MediaPlayerService.cpp')
-rw-r--r-- | media/libmediaplayerservice/MediaPlayerService.cpp | 90 |
1 files changed, 85 insertions, 5 deletions
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 8e61011..55b06f4 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1597,9 +1597,12 @@ void MediaPlayerService::AudioOutput::CallbackWrapper( AudioOutput *me = (AudioOutput *)cookie; AudioTrack::Buffer *buffer = (AudioTrack::Buffer *)info; - (*me->mCallback)( + size_t actualSize = (*me->mCallback)( me, buffer->raw, buffer->size, me->mCallbackCookie); - me->snoopWrite(buffer->raw, buffer->size); + + if (actualSize > 0) { + me->snoopWrite(buffer->raw, actualSize); + } } #undef LOG_TAG @@ -1629,14 +1632,75 @@ status_t MediaPlayerService::AudioCache::getPosition(uint32_t *position) return NO_ERROR; } +//////////////////////////////////////////////////////////////////////////////// + +struct CallbackThread : public Thread { + CallbackThread(const wp<MediaPlayerBase::AudioSink> &sink, + MediaPlayerBase::AudioSink::AudioCallback cb, + void *cookie); + +protected: + virtual ~CallbackThread(); + + virtual bool threadLoop(); + +private: + wp<MediaPlayerBase::AudioSink> mSink; + MediaPlayerBase::AudioSink::AudioCallback mCallback; + void *mCookie; + void *mBuffer; + size_t mBufferSize; + + CallbackThread(const CallbackThread &); + CallbackThread &operator=(const CallbackThread &); +}; + +CallbackThread::CallbackThread( + const wp<MediaPlayerBase::AudioSink> &sink, + MediaPlayerBase::AudioSink::AudioCallback cb, + void *cookie) + : mSink(sink), + mCallback(cb), + mCookie(cookie), + mBuffer(NULL), + mBufferSize(0) { +} + +CallbackThread::~CallbackThread() { + if (mBuffer) { + free(mBuffer); + mBuffer = NULL; + } +} + +bool CallbackThread::threadLoop() { + sp<MediaPlayerBase::AudioSink> sink = mSink.promote(); + if (sink == NULL) { + return false; + } + + if (mBuffer == NULL) { + mBufferSize = sink->bufferSize(); + mBuffer = malloc(mBufferSize); + } + + size_t actualSize = + (*mCallback)(sink.get(), mBuffer, mBufferSize, mCookie); + + if (actualSize > 0) { + sink->write(mBuffer, actualSize); + } + + return true; +} + +//////////////////////////////////////////////////////////////////////////////// + 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; } @@ -1645,9 +1709,25 @@ status_t MediaPlayerService::AudioCache::open( mChannelCount = (uint16_t)channelCount; mFormat = (uint16_t)format; mMsecsPerFrame = 1.e3 / (float) sampleRate; + + if (cb != NULL) { + mCallbackThread = new CallbackThread(this, cb, cookie); + } return NO_ERROR; } +void MediaPlayerService::AudioCache::start() { + if (mCallbackThread != NULL) { + mCallbackThread->run("AudioCache callback"); + } +} + +void MediaPlayerService::AudioCache::stop() { + if (mCallbackThread != NULL) { + mCallbackThread->requestExitAndWait(); + } +} + ssize_t MediaPlayerService::AudioCache::write(const void* buffer, size_t size) { LOGV("write(%p, %u)", buffer, size); |