Merge "resourcemanager: move common code into different source." into main
diff --git a/media/codec2/vndk/include/C2SurfaceSyncObj.h b/media/codec2/vndk/include/C2SurfaceSyncObj.h
index b193b4a..0005049 100644
--- a/media/codec2/vndk/include/C2SurfaceSyncObj.h
+++ b/media/codec2/vndk/include/C2SurfaceSyncObj.h
@@ -117,6 +117,11 @@
*/
void notifyAll();
+ /**
+ * Invalide current sync variables on the death of the other process.
+ */
+ void invalidate();
+
C2SyncVariables() {}
private:
diff --git a/media/codec2/vndk/platform/C2BqBuffer.cpp b/media/codec2/vndk/platform/C2BqBuffer.cpp
index 62b0ab5..43a3eb2 100644
--- a/media/codec2/vndk/platform/C2BqBuffer.cpp
+++ b/media/codec2/vndk/platform/C2BqBuffer.cpp
@@ -396,6 +396,12 @@
if (c2Fence) {
*c2Fence = _C2FenceFactory::CreateSurfaceFence(mSyncMem, waitId);
}
+ if (mInvalidated) {
+ if (c2Fence) {
+ *c2Fence = C2Fence();
+ }
+ return C2_BAD_STATE;
+ }
return C2_BLOCKING;
}
if (syncVar->getSyncStatusLocked() != C2SyncVariables::STATUS_ACTIVE) {
@@ -404,6 +410,12 @@
if (c2Fence) {
*c2Fence = _C2FenceFactory::CreateSurfaceFence(mSyncMem, waitId);
}
+ if (mInvalidated) {
+ if (c2Fence) {
+ *c2Fence = C2Fence();
+ }
+ return C2_BAD_STATE;
+ }
return C2_BLOCKING;
}
syncVar->notifyDequeuedLocked();
@@ -690,7 +702,6 @@
}
}
int migrated = 0;
- std::shared_ptr<C2SurfaceSyncMemory> oldMem;
// poolDatas dtor should not be called during lock is held.
std::shared_ptr<C2BufferQueueBlockPoolData>
poolDatas[NUM_BUFFER_SLOTS];
@@ -708,8 +719,22 @@
mGeneration = 0;
ALOGD("configuring null producer: igbp_information(%d)", bqInformation);
}
- oldMem = mSyncMem; // preven destruction while locked.
- mSyncMem = c2SyncMem;
+ if (mInvalidated) {
+ return;
+ }
+ {
+ std::unique_lock<std::mutex> memLock(mSyncMemMutex);
+ mOldMem = mSyncMem; // prevent destruction while locked.
+ // The waiters from the old memory will be
+ // woken up by the client after this
+ // configuration from HAL being finished.
+ // But we will keep this in case of the
+ // client being dead in between.
+ // In the case the death listener will wake
+ // up the wiators for the old memory using
+ // mOldMem here.
+ mSyncMem = c2SyncMem;
+ }
C2SyncVariables *syncVar = mSyncMem ? mSyncMem->mem() : nullptr;
if (syncVar) {
syncVar->lock();
@@ -736,6 +761,9 @@
// is no longer valid.
mIgbpValidityToken = std::make_shared<int>(0);
}
+ if (mInvalidated) {
+ mIgbpValidityToken = std::make_shared<int>(0);
+ }
for (int i = 0; i < NUM_BUFFER_SLOTS; ++i) {
mBuffers[i] = buffers[i];
mPoolDatas[i] = poolDatas[i];
@@ -754,8 +782,26 @@
}
void invalidate() {
- mInvalidated = true;
+ std::shared_ptr<C2SurfaceSyncMemory> syncMem;
+ std::shared_ptr<C2SurfaceSyncMemory> oldMem;
+ {
+ std::unique_lock<std::mutex> l(mSyncMemMutex);
+ bool old = mInvalidated.exchange(true);
+ if (old) {
+ return;
+ }
+ syncMem = mSyncMem;
+ oldMem = mOldMem;
+ }
mIgbpValidityToken.reset();
+ C2SyncVariables *syncVar = syncMem ? syncMem->mem(): nullptr;
+ if (syncVar) {
+ syncVar->invalidate();
+ }
+ C2SyncVariables *oldVar = oldMem ? oldMem->mem(): nullptr;
+ if (oldVar) {
+ oldVar->invalidate();
+ }
}
private:
@@ -780,7 +826,9 @@
sp<GraphicBuffer> mBuffers[NUM_BUFFER_SLOTS];
std::weak_ptr<C2BufferQueueBlockPoolData> mPoolDatas[NUM_BUFFER_SLOTS];
+ std::mutex mSyncMemMutex;
std::shared_ptr<C2SurfaceSyncMemory> mSyncMem;
+ std::shared_ptr<C2SurfaceSyncMemory> mOldMem;
// IGBP invalidation notification token.
// The buffers(C2BufferQueueBlockPoolData) has the reference to the IGBP where
diff --git a/media/codec2/vndk/platform/C2SurfaceSyncObj.cpp b/media/codec2/vndk/platform/C2SurfaceSyncObj.cpp
index d8c2292..0d8ed0b 100644
--- a/media/codec2/vndk/platform/C2SurfaceSyncObj.cpp
+++ b/media/codec2/vndk/platform/C2SurfaceSyncObj.cpp
@@ -284,6 +284,11 @@
this->unlock();
}
+void C2SyncVariables::invalidate() {
+ mCond++;
+ (void) syscall(__NR_futex, &mCond, FUTEX_REQUEUE, INT_MAX, (void *)INT_MAX, &mLock, 0);
+}
+
int C2SyncVariables::signal() {
mCond++;
diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp
index 829ee6b..c27cfc5 100644
--- a/media/libstagefright/MediaCodec.cpp
+++ b/media/libstagefright/MediaCodec.cpp
@@ -1199,6 +1199,7 @@
mTunneledInputHeight(0),
mTunneled(false),
mTunnelPeekState(TunnelPeekState::kLegacyMode),
+ mTunnelPeekEnabled(false),
mHaveInputSurface(false),
mHavePendingInputBuffers(false),
mCpuBoostRequested(false),
@@ -1744,6 +1745,7 @@
TunnelPeekState previousState = mTunnelPeekState;
if(tunnelPeek == 0){
+ mTunnelPeekEnabled = false;
switch (mTunnelPeekState) {
case TunnelPeekState::kLegacyMode:
msg->setInt32("android._tunnel-peek-set-legacy", 0);
@@ -1759,6 +1761,7 @@
return;
}
} else {
+ mTunnelPeekEnabled = true;
switch (mTunnelPeekState) {
case TunnelPeekState::kLegacyMode:
msg->setInt32("android._tunnel-peek-set-legacy", 0);
@@ -4945,10 +4948,11 @@
CHECK(msg->senderAwaitsResponse(&replyID));
TunnelPeekState previousState = mTunnelPeekState;
if (previousState != TunnelPeekState::kLegacyMode) {
- mTunnelPeekState = TunnelPeekState::kEnabledNoBuffer;
+ mTunnelPeekState = mTunnelPeekEnabled ? TunnelPeekState::kEnabledNoBuffer :
+ TunnelPeekState::kDisabledNoBuffer;
ALOGV("TunnelPeekState: %s -> %s",
asString(previousState),
- asString(TunnelPeekState::kEnabledNoBuffer));
+ asString(mTunnelPeekState));
}
mReplyID = replyID;
@@ -5447,10 +5451,11 @@
returnBuffersToCodec();
TunnelPeekState previousState = mTunnelPeekState;
if (previousState != TunnelPeekState::kLegacyMode) {
- mTunnelPeekState = TunnelPeekState::kEnabledNoBuffer;
+ mTunnelPeekState = mTunnelPeekEnabled ? TunnelPeekState::kEnabledNoBuffer :
+ TunnelPeekState::kDisabledNoBuffer;
ALOGV("TunnelPeekState: %s -> %s",
asString(previousState),
- asString(TunnelPeekState::kEnabledNoBuffer));
+ asString(mTunnelPeekState));
}
break;
}
@@ -5993,7 +5998,7 @@
if (isBufferDecodeOnly) {
buffer->meta()->setInt32("decode-only", true);
}
- if (mTunneled && !isBufferDecodeOnly) {
+ if (mTunneled && !isBufferDecodeOnly && !(flags & BUFFER_FLAG_CODECCONFIG)) {
TunnelPeekState previousState = mTunnelPeekState;
switch(mTunnelPeekState){
case TunnelPeekState::kEnabledNoBuffer:
diff --git a/media/libstagefright/include/media/stagefright/MediaCodec.h b/media/libstagefright/include/media/stagefright/MediaCodec.h
index f99a78b..baa5b7e 100644
--- a/media/libstagefright/include/media/stagefright/MediaCodec.h
+++ b/media/libstagefright/include/media/stagefright/MediaCodec.h
@@ -560,6 +560,7 @@
int32_t mTunneledInputHeight;
bool mTunneled;
TunnelPeekState mTunnelPeekState;
+ bool mTunnelPeekEnabled;
sp<IDescrambler> mDescrambler;