diff options
author | Andreas Huber <andih@google.com> | 2010-12-15 17:18:20 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2010-12-16 10:08:26 -0800 |
commit | 687b32d83e0145b0a684e3a9704ab50939260d60 (patch) | |
tree | 06e0e2efc101c5ff2434eaa942c125b88e676dfa /media/libmediaplayerservice/nuplayer | |
parent | 6a4d0a6af20d4ba88f8eeb658c68757c0926cbc5 (diff) | |
download | frameworks_base-687b32d83e0145b0a684e3a9704ab50939260d60.zip frameworks_base-687b32d83e0145b0a684e3a9704ab50939260d60.tar.gz frameworks_base-687b32d83e0145b0a684e3a9704ab50939260d60.tar.bz2 |
Properly announce decoder output format changes, make sure AMessage::dup does.
Change-Id: Ia77f6b6d5e5c5055583740dfe876b8a3c22be9b6
Diffstat (limited to 'media/libmediaplayerservice/nuplayer')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/DecoderWrapper.cpp | 109 | ||||
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayer.cpp | 27 |
2 files changed, 104 insertions, 32 deletions
diff --git a/media/libmediaplayerservice/nuplayer/DecoderWrapper.cpp b/media/libmediaplayerservice/nuplayer/DecoderWrapper.cpp index 89a5e69..9738e33 100644 --- a/media/libmediaplayerservice/nuplayer/DecoderWrapper.cpp +++ b/media/libmediaplayerservice/nuplayer/DecoderWrapper.cpp @@ -166,6 +166,9 @@ private: sp<MediaSource> mDecoder; sp<AMessage> mNotify; bool mEOS; + bool mSentFormat; + + void sendFormatChange(); DISALLOW_EVIL_CONSTRUCTORS(WrapperReader); }; @@ -174,7 +177,8 @@ DecoderWrapper::WrapperReader::WrapperReader( const sp<MediaSource> &decoder, const sp<AMessage> ¬ify) : mDecoder(decoder), mNotify(notify), - mEOS(false) { + mEOS(false), + mSentFormat(false) { } DecoderWrapper::WrapperReader::~WrapperReader() { @@ -215,12 +219,17 @@ void DecoderWrapper::WrapperReader::onMessageReceived( MediaBuffer *src; status_t err = mDecoder->read(&src, &options); - sp<AMessage> notify = mNotify->dup(); + if (err == OK) { + if (!mSentFormat) { + sendFormatChange(); + mSentFormat = true; + } - sp<AMessage> realNotify; - CHECK(notify->findMessage("real-notify", &realNotify)); + sp<AMessage> notify = mNotify->dup(); + + sp<AMessage> realNotify; + CHECK(notify->findMessage("real-notify", &realNotify)); - if (err == OK) { realNotify->setInt32("what", ACodec::kWhatDrainThisBuffer); sp<ABuffer> dst = new ABuffer(src->range_length()); @@ -236,12 +245,23 @@ void DecoderWrapper::WrapperReader::onMessageReceived( dst->meta()->setInt64("timeUs", timeUs); realNotify->setObject("buffer", dst); + + notify->post(); + } else if (err == INFO_FORMAT_CHANGED) { + sendFormatChange(); + + readMore(false /* flush */); } else { + sp<AMessage> notify = mNotify->dup(); + + sp<AMessage> realNotify; + CHECK(notify->findMessage("real-notify", &realNotify)); + realNotify->setInt32("what", ACodec::kWhatEOS); mEOS = true; - } - notify->post(); + notify->post(); + } break; } @@ -251,6 +271,46 @@ void DecoderWrapper::WrapperReader::onMessageReceived( } } +void DecoderWrapper::WrapperReader::sendFormatChange() { + sp<AMessage> notify = mNotify->dup(); + + sp<AMessage> realNotify; + CHECK(notify->findMessage("real-notify", &realNotify)); + + realNotify->setInt32("what", ACodec::kWhatOutputFormatChanged); + + sp<MetaData> meta = mDecoder->getFormat(); + + const char *mime; + CHECK(meta->findCString(kKeyMIMEType, &mime)); + + realNotify->setString("mime", mime); + + if (!strncasecmp("audio/", mime, 6)) { + int32_t numChannels; + CHECK(meta->findInt32(kKeyChannelCount, &numChannels)); + + int32_t sampleRate; + CHECK(meta->findInt32(kKeySampleRate, &sampleRate)); + + realNotify->setInt32("channel-count", numChannels); + realNotify->setInt32("sample-rate", sampleRate); + } else { + CHECK(!strncasecmp("video/", mime, 6)); + + int32_t width, height; + CHECK(meta->findInt32(kKeyWidth, &width)); + CHECK(meta->findInt32(kKeyHeight, &height)); + + realNotify->setInt32("width", width); + realNotify->setInt32("height", height); + } + + notify->post(); + + mSentFormat = true; +} + //////////////////////////////////////////////////////////////////////////////// DecoderWrapper::DecoderWrapper() @@ -327,24 +387,33 @@ void DecoderWrapper::onMessageReceived(const sp<AMessage> &msg) { case kWhatFillBufferDone: { - CHECK_GT(mNumPendingDecodes, 0); - --mNumPendingDecodes; - - if (mFlushing) { - completeFlushIfPossible(); - break; - } - sp<AMessage> notify; CHECK(msg->findMessage("real-notify", ¬ify)); - sp<AMessage> reply = - new AMessage(kWhatOutputBufferDrained, id()); + int32_t what; + CHECK(notify->findInt32("what", &what)); - notify->setMessage("reply", reply); - notify->post(); + if (what == ACodec::kWhatDrainThisBuffer) { + CHECK_GT(mNumPendingDecodes, 0); + --mNumPendingDecodes; + + sp<AMessage> reply = + new AMessage(kWhatOutputBufferDrained, id()); - ++mNumOutstandingOutputBuffers; + notify->setMessage("reply", reply); + + ++mNumOutstandingOutputBuffers; + } else if (what == ACodec::kWhatEOS) { + CHECK_GT(mNumPendingDecodes, 0); + --mNumPendingDecodes; + + if (mFlushing) { + completeFlushIfPossible(); + break; + } + } + + notify->post(); break; } diff --git a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp index 403029a..e99c24a 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayer.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayer.cpp @@ -198,6 +198,21 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) { mFlushingAudio = NONE; mFlushingVideo = NONE; } + } else if (what == ACodec::kWhatOutputFormatChanged) { + CHECK(audio); + + int32_t numChannels; + CHECK(codecRequest->findInt32("channel-count", &numChannels)); + + int32_t sampleRate; + CHECK(codecRequest->findInt32("sample-rate", &sampleRate)); + + LOGI("Audio output format changed to %d Hz, %d channels", + sampleRate, numChannels); + + mAudioSink->close(); + CHECK_EQ(mAudioSink->open(sampleRate, numChannels), (status_t)OK); + mAudioSink->start(); } else { CHECK_EQ((int)what, (int)ACodec::kWhatDrainThisBuffer); @@ -365,18 +380,6 @@ status_t NuPlayer::instantiateDecoder( const sp<MetaData> &meta = source->getFormat(); (*decoder)->configure(meta); - if (audio) { - int32_t sampleRate; - int32_t channelCount; - CHECK(meta->findInt32(kKeySampleRate, &sampleRate)); - CHECK(meta->findInt32(kKeyChannelCount, &channelCount)); - - channelCount = 2; // XXX - - CHECK_EQ(mAudioSink->open(sampleRate, channelCount), (status_t)OK); - mAudioSink->start(); - } - return OK; } |