From 577db6d42b8d83b3578c7e56b1391bdaca9cb705 Mon Sep 17 00:00:00 2001 From: Lajos Molnar Date: Tue, 11 Jun 2013 17:56:24 -0700 Subject: stagefright: synchronously change nativewindow crop Only change the nativewindow crop before queuing frames with the new crop. Change-Id: Icd8a84c82e66a8be3d6bc1675c777b1de8dc39b9 Signed-off-by: Lajos Molnar Bug: 9395753 --- media/libstagefright/ACodec.cpp | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'media/libstagefright/ACodec.cpp') diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 64e3885..cf41cf2 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -2229,7 +2229,7 @@ void ACodec::processDeferredMessages() { } } -void ACodec::sendFormatChange() { +void ACodec::sendFormatChange(const sp &reply) { sp notify = mNotify->dup(); notify->setInt32("what", kWhatOutputFormatChanged); @@ -2294,14 +2294,12 @@ void ACodec::sendFormatChange() { rect.nTop + rect.nHeight - 1); if (mNativeWindow != NULL) { - android_native_rect_t crop; - crop.left = rect.nLeft; - crop.top = rect.nTop; - crop.right = rect.nLeft + rect.nWidth; - crop.bottom = rect.nTop + rect.nHeight; - - CHECK_EQ(0, native_window_set_crop( - mNativeWindow.get(), &crop)); + reply->setRect( + "crop", + rect.nLeft, + rect.nTop, + rect.nLeft + rect.nWidth, + rect.nTop + rect.nHeight); } } break; @@ -3057,8 +3055,11 @@ bool ACodec::BaseState::onOMXFillBufferDone( break; } + sp reply = + new AMessage(kWhatOutputBufferDrained, mCodec->id()); + if (!mCodec->mSentFormat) { - mCodec->sendFormatChange(); + mCodec->sendFormatChange(reply); } info->mData->setRange(rangeOffset, rangeLength); @@ -3081,9 +3082,6 @@ bool ACodec::BaseState::onOMXFillBufferDone( notify->setBuffer("buffer", info->mData); notify->setInt32("flags", flags); - sp reply = - new AMessage(kWhatOutputBufferDrained, mCodec->id()); - reply->setPointer("buffer-id", info->mBufferID); notify->setMessage("reply", reply); @@ -3127,6 +3125,13 @@ void ACodec::BaseState::onOutputBufferDrained(const sp &msg) { mCodec->findBufferByID(kPortIndexOutput, bufferID, &index); CHECK_EQ((int)info->mStatus, (int)BufferInfo::OWNED_BY_DOWNSTREAM); + android_native_rect_t crop; + if (msg->findRect("crop", + &crop.left, &crop.top, &crop.right, &crop.bottom)) { + CHECK_EQ(0, native_window_set_crop( + mCodec->mNativeWindow.get(), &crop)); + } + int32_t render; if (mCodec->mNativeWindow != NULL && msg->findInt32("render", &render) && render != 0 -- cgit v1.1