Make change and version bump to frc_340819030 for mainline module file: apex/manifest_codec.json
Make change and version bump to frc_340819030 for mainline module file: apex/manifest.json
Merge cherrypicks of ['googleplex-android-review.googlesource.com/24343415'] into sparse-10586669-L16700000962435537.
SPARSE_CHANGE: I54d2b7193b4ce059769258926958927797632137
Change-Id: Ia1a55da1baf7afdb642227b53000277094b51616
diff --git a/apex/manifest.json b/apex/manifest.json
index f3ee3f2..5f17b44 100644
--- a/apex/manifest.json
+++ b/apex/manifest.json
@@ -3,7 +3,7 @@
// Placeholder module version to be replaced during build.
// Do not change!
- "version": 340819010,
+ "version": 340819030,
"requireNativeLibs": [
"libandroid.so",
diff --git a/apex/manifest_codec.json b/apex/manifest_codec.json
index 9186fff..f838a85 100644
--- a/apex/manifest_codec.json
+++ b/apex/manifest_codec.json
@@ -3,7 +3,7 @@
// Placeholder module version to be replaced during build.
// Do not change!
- "version": 340819010,
+ "version": 340819030,
"requireNativeLibs": [
":sphal"
diff --git a/media/codec2/hal/hidl/1.0/utils/Component.cpp b/media/codec2/hal/hidl/1.0/utils/Component.cpp
index df30dba..0aeed08 100644
--- a/media/codec2/hal/hidl/1.0/utils/Component.cpp
+++ b/media/codec2/hal/hidl/1.0/utils/Component.cpp
@@ -222,6 +222,21 @@
return mInit;
}
+void Component::onDeathReceived() {
+ {
+ std::lock_guard<std::mutex> lock(mBlockPoolsMutex);
+ mClientDied = true;
+ for (auto it = mBlockPools.begin(); it != mBlockPools.end(); ++it) {
+ if (it->second->getAllocatorId() == C2PlatformAllocatorStore::BUFFERQUEUE) {
+ std::shared_ptr<C2BufferQueueBlockPool> bqPool =
+ std::static_pointer_cast<C2BufferQueueBlockPool>(it->second);
+ bqPool->invalidate();
+ }
+ }
+ }
+ release();
+}
+
// Methods from ::android::hardware::media::c2::V1_0::IComponent
Return<Status> Component::queue(const WorkBundle& workBundle) {
std::list<std::unique_ptr<C2Work>> c2works;
@@ -409,9 +424,19 @@
blockPool = nullptr;
}
if (blockPool) {
- mBlockPoolsMutex.lock();
- mBlockPools.emplace(blockPool->getLocalId(), blockPool);
- mBlockPoolsMutex.unlock();
+ bool emplaced = false;
+ {
+ mBlockPoolsMutex.lock();
+ if (!mClientDied) {
+ mBlockPools.emplace(blockPool->getLocalId(), blockPool);
+ emplaced = true;
+ }
+ mBlockPoolsMutex.unlock();
+ }
+ if (!emplaced) {
+ blockPool.reset();
+ status = C2_BAD_STATE;
+ }
} else if (status == C2_OK) {
status = C2_CORRUPTED;
}
@@ -494,8 +519,8 @@
) override {
auto strongComponent = mComponent.promote();
if (strongComponent) {
- LOG(INFO) << "Client died ! release the component !!";
- strongComponent->release();
+ LOG(INFO) << "Client died ! notify and release the component !!";
+ strongComponent->onDeathReceived();
} else {
LOG(ERROR) << "Client died ! no component to release !!";
}
diff --git a/media/codec2/hal/hidl/1.0/utils/include/codec2/hidl/1.0/Component.h b/media/codec2/hal/hidl/1.0/utils/include/codec2/hidl/1.0/Component.h
index e343655..3f55618 100644
--- a/media/codec2/hal/hidl/1.0/utils/include/codec2/hidl/1.0/Component.h
+++ b/media/codec2/hal/hidl/1.0/utils/include/codec2/hidl/1.0/Component.h
@@ -66,6 +66,8 @@
const sp<::android::hardware::media::bufferpool::V2_0::
IClientManager>& clientPoolManager);
c2_status_t status() const;
+ // Receives a death notification of the client.
+ void onDeathReceived();
typedef ::android::hardware::graphics::bufferqueue::V1_0::
IGraphicBufferProducer HGraphicBufferProducer1;
@@ -135,6 +137,7 @@
using HwDeathRecipient = ::android::hardware::hidl_death_recipient;
sp<HwDeathRecipient> mDeathRecipient;
+ bool mClientDied{false};
};
} // namespace utils
diff --git a/media/codec2/hal/hidl/1.1/utils/Component.cpp b/media/codec2/hal/hidl/1.1/utils/Component.cpp
index 2dd922f..d0f4f19 100644
--- a/media/codec2/hal/hidl/1.1/utils/Component.cpp
+++ b/media/codec2/hal/hidl/1.1/utils/Component.cpp
@@ -222,6 +222,21 @@
return mInit;
}
+void Component::onDeathReceived() {
+ {
+ std::lock_guard<std::mutex> lock(mBlockPoolsMutex);
+ mClientDied = true;
+ for (auto it = mBlockPools.begin(); it != mBlockPools.end(); ++it) {
+ if (it->second->getAllocatorId() == C2PlatformAllocatorStore::BUFFERQUEUE) {
+ std::shared_ptr<C2BufferQueueBlockPool> bqPool =
+ std::static_pointer_cast<C2BufferQueueBlockPool>(it->second);
+ bqPool->invalidate();
+ }
+ }
+ }
+ release();
+}
+
// Methods from ::android::hardware::media::c2::V1_1::IComponent
Return<Status> Component::queue(const WorkBundle& workBundle) {
std::list<std::unique_ptr<C2Work>> c2works;
@@ -409,9 +424,19 @@
blockPool = nullptr;
}
if (blockPool) {
- mBlockPoolsMutex.lock();
- mBlockPools.emplace(blockPool->getLocalId(), blockPool);
- mBlockPoolsMutex.unlock();
+ bool emplaced = false;
+ {
+ mBlockPoolsMutex.lock();
+ if (!mClientDied) {
+ mBlockPools.emplace(blockPool->getLocalId(), blockPool);
+ emplaced = true;
+ }
+ mBlockPoolsMutex.unlock();
+ }
+ if (!emplaced) {
+ blockPool.reset();
+ status = C2_BAD_STATE;
+ }
} else if (status == C2_OK) {
status = C2_CORRUPTED;
}
@@ -501,8 +526,8 @@
) override {
auto strongComponent = component.promote();
if (strongComponent) {
- LOG(INFO) << "Client died ! release the component !!";
- strongComponent->release();
+ LOG(INFO) << "Client died ! notify and release the component !!";
+ strongComponent->onDeathReceived();
} else {
LOG(ERROR) << "Client died ! no component to release !!";
}
diff --git a/media/codec2/hal/hidl/1.1/utils/include/codec2/hidl/1.1/Component.h b/media/codec2/hal/hidl/1.1/utils/include/codec2/hidl/1.1/Component.h
index 1c8c20c..f16de24 100644
--- a/media/codec2/hal/hidl/1.1/utils/include/codec2/hidl/1.1/Component.h
+++ b/media/codec2/hal/hidl/1.1/utils/include/codec2/hidl/1.1/Component.h
@@ -69,6 +69,8 @@
const sp<::android::hardware::media::bufferpool::V2_0::
IClientManager>& clientPoolManager);
c2_status_t status() const;
+ // Receives a death notification of the client.
+ void onDeathReceived();
typedef ::android::hardware::graphics::bufferqueue::V1_0::
IGraphicBufferProducer HGraphicBufferProducer1;
@@ -140,6 +142,7 @@
using HwDeathRecipient = ::android::hardware::hidl_death_recipient;
sp<HwDeathRecipient> mDeathRecipient;
+ bool mClientDied{false};
};
} // namespace utils
diff --git a/media/codec2/hal/hidl/1.2/utils/Component.cpp b/media/codec2/hal/hidl/1.2/utils/Component.cpp
index 7994d32..036c900 100644
--- a/media/codec2/hal/hidl/1.2/utils/Component.cpp
+++ b/media/codec2/hal/hidl/1.2/utils/Component.cpp
@@ -222,6 +222,21 @@
return mInit;
}
+void Component::onDeathReceived() {
+ {
+ std::lock_guard<std::mutex> lock(mBlockPoolsMutex);
+ mClientDied = true;
+ for (auto it = mBlockPools.begin(); it != mBlockPools.end(); ++it) {
+ if (it->second->getAllocatorId() == C2PlatformAllocatorStore::BUFFERQUEUE) {
+ std::shared_ptr<C2BufferQueueBlockPool> bqPool =
+ std::static_pointer_cast<C2BufferQueueBlockPool>(it->second);
+ bqPool->invalidate();
+ }
+ }
+ }
+ release();
+}
+
// Methods from ::android::hardware::media::c2::V1_1::IComponent
Return<Status> Component::queue(const WorkBundle& workBundle) {
std::list<std::unique_ptr<C2Work>> c2works;
@@ -409,9 +424,19 @@
blockPool = nullptr;
}
if (blockPool) {
- mBlockPoolsMutex.lock();
- mBlockPools.emplace(blockPool->getLocalId(), blockPool);
- mBlockPoolsMutex.unlock();
+ bool emplaced = false;
+ {
+ mBlockPoolsMutex.lock();
+ if (!mClientDied) {
+ mBlockPools.emplace(blockPool->getLocalId(), blockPool);
+ emplaced = true;
+ }
+ mBlockPoolsMutex.unlock();
+ }
+ if (!emplaced) {
+ blockPool.reset();
+ status = C2_BAD_STATE;
+ }
} else if (status == C2_OK) {
status = C2_CORRUPTED;
}
@@ -532,8 +557,8 @@
) override {
auto strongComponent = component.promote();
if (strongComponent) {
- LOG(INFO) << "Client died ! release the component !!";
- strongComponent->release();
+ LOG(INFO) << "Client died ! notify and release the component !!";
+ strongComponent->onDeathReceived();
} else {
LOG(ERROR) << "Client died ! no component to release !!";
}
diff --git a/media/codec2/hal/hidl/1.2/utils/include/codec2/hidl/1.2/Component.h b/media/codec2/hal/hidl/1.2/utils/include/codec2/hidl/1.2/Component.h
index d0972ee..6a73392 100644
--- a/media/codec2/hal/hidl/1.2/utils/include/codec2/hidl/1.2/Component.h
+++ b/media/codec2/hal/hidl/1.2/utils/include/codec2/hidl/1.2/Component.h
@@ -69,6 +69,8 @@
const sp<::android::hardware::media::bufferpool::V2_0::
IClientManager>& clientPoolManager);
c2_status_t status() const;
+ // Receives a death notification of the client.
+ void onDeathReceived();
typedef ::android::hardware::graphics::bufferqueue::V1_0::
IGraphicBufferProducer HGraphicBufferProducer1;
@@ -145,7 +147,7 @@
using HwDeathRecipient = ::android::hardware::hidl_death_recipient;
sp<HwDeathRecipient> mDeathRecipient;
-
+ bool mClientDied{false};
};
} // namespace utils
diff --git a/media/codec2/vndk/include/C2BqBufferPriv.h b/media/codec2/vndk/include/C2BqBufferPriv.h
index 29aad5e..320b192 100644
--- a/media/codec2/vndk/include/C2BqBufferPriv.h
+++ b/media/codec2/vndk/include/C2BqBufferPriv.h
@@ -103,6 +103,13 @@
virtual void getConsumerUsage(uint64_t *consumerUsage);
+ /**
+ * Invalidate the class.
+ *
+ * After the call, fetchGraphicBlock() will return C2_BAD_STATE.
+ */
+ virtual void invalidate();
+
private:
const std::shared_ptr<C2Allocator> mAllocator;
const local_id_t mLocalId;
diff --git a/media/codec2/vndk/platform/C2BqBuffer.cpp b/media/codec2/vndk/platform/C2BqBuffer.cpp
index f2cd585..5fb0c8f 100644
--- a/media/codec2/vndk/platform/C2BqBuffer.cpp
+++ b/media/codec2/vndk/platform/C2BqBuffer.cpp
@@ -601,6 +601,9 @@
static int kMaxIgbpRetryDelayUs = 10000;
std::unique_lock<std::mutex> lock(mMutex);
+ if (mInvalidated) {
+ return C2_BAD_STATE;
+ }
if (mLastDqLogTs == 0) {
mLastDqLogTs = getTimestampNow();
} else {
@@ -746,6 +749,11 @@
*consumeUsage = mConsumerUsage;
}
+ void invalidate() {
+ std::scoped_lock<std::mutex> lock(mMutex);
+ mInvalidated = true;
+ }
+
private:
friend struct C2BufferQueueBlockPoolData;
@@ -783,6 +791,7 @@
// if the token has been expired, the buffers will not call IGBP::cancelBuffer()
// when they are no longer used.
std::shared_ptr<int> mIgbpValidityToken;
+ bool mInvalidated{false};
};
C2BufferQueueBlockPoolData::C2BufferQueueBlockPoolData(
@@ -1103,3 +1112,9 @@
}
}
+void C2BufferQueueBlockPool::invalidate() {
+ if (mImpl) {
+ mImpl->invalidate();
+ }
+}
+