diff options
author | Lajos Molnar <lajos@google.com> | 2015-07-10 19:17:45 -0700 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2015-07-13 16:33:59 -0700 |
commit | a81c6229638a4db56752dd77a6610e0f0971e877 (patch) | |
tree | b43408970894d5a5979ed0087ab1ee213144ac7c /media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp | |
parent | 4b33e0838fdb1b5e545449add02005916b512c99 (diff) | |
download | frameworks_av-a81c6229638a4db56752dd77a6610e0f0971e877.zip frameworks_av-a81c6229638a4db56752dd77a6610e0f0971e877.tar.gz frameworks_av-a81c6229638a4db56752dd77a6610e0f0971e877.tar.bz2 |
nuplayer: use codec->setSurface when possible to avoid seeking
Bug: 22414719
Change-Id: I0442e12af960f86a0fc090b4a469c62ba638a1a0
Diffstat (limited to 'media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp')
-rw-r--r-- | media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp index 99a2a84..dcc28c4 100644 --- a/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp +++ b/media/libmediaplayerservice/nuplayer/NuPlayerDecoder.cpp @@ -87,6 +87,22 @@ sp<AMessage> NuPlayer::Decoder::getStats() const { return mStats; } +status_t NuPlayer::Decoder::setVideoSurface(const sp<Surface> &surface) { + if (surface == NULL || ADebug::isExperimentEnabled("legacy-setsurface")) { + return BAD_VALUE; + } + + sp<AMessage> msg = new AMessage(kWhatSetVideoSurface, this); + + msg->setObject("surface", surface); + sp<AMessage> response; + status_t err = msg->postAndAwaitResponse(&response); + if (err == OK && response != NULL) { + CHECK(response->findInt32("err", &err)); + } + return err; +} + void NuPlayer::Decoder::onMessageReceived(const sp<AMessage> &msg) { ALOGV("[%s] onMessage: %s", mComponentName.c_str(), msg->debugString().c_str()); @@ -169,6 +185,46 @@ void NuPlayer::Decoder::onMessageReceived(const sp<AMessage> &msg) { break; } + case kWhatSetVideoSurface: + { + sp<AReplyToken> replyID; + CHECK(msg->senderAwaitsResponse(&replyID)); + + sp<RefBase> obj; + CHECK(msg->findObject("surface", &obj)); + sp<Surface> surface = static_cast<Surface *>(obj.get()); // non-null + int32_t err = INVALID_OPERATION; + // NOTE: in practice mSurface is always non-null, but checking here for completeness + if (mCodec != NULL && mSurface != NULL) { + // TODO: once AwesomePlayer is removed, remove this automatic connecting + // to the surface by MediaPlayerService. + // + // at this point MediaPlayerService::client has already connected to the + // surface, which MediaCodec does not expect + err = native_window_api_disconnect(surface.get(), NATIVE_WINDOW_API_MEDIA); + if (err == OK) { + err = mCodec->setSurface(surface); + ALOGI_IF(err, "codec setSurface returned: %d", err); + if (err == OK) { + // reconnect to the old surface as MPS::Client will expect to + // be able to disconnect from it. + (void)native_window_api_connect(mSurface.get(), NATIVE_WINDOW_API_MEDIA); + mSurface = surface; + } + } + if (err != OK) { + // reconnect to the new surface on error as MPS::Client will expect to + // be able to disconnect from it. + (void)native_window_api_connect(surface.get(), NATIVE_WINDOW_API_MEDIA); + } + } + + sp<AMessage> response = new AMessage; + response->setInt32("err", err); + response->postReply(replyID); + break; + } + default: DecoderBase::onMessageReceived(msg); break; |