C2AIDL: Provide rendered frame history
Bug: 362409150
Test: presubmit
Change-Id: Ib65f46096efdc69f8a0977ac423f5b43c91d15b5
diff --git a/media/codec2/hal/client/GraphicBufferAllocator.cpp b/media/codec2/hal/client/GraphicBufferAllocator.cpp
index 6a6da0f..4506973 100644
--- a/media/codec2/hal/client/GraphicBufferAllocator.cpp
+++ b/media/codec2/hal/client/GraphicBufferAllocator.cpp
@@ -96,6 +96,10 @@
mGraphicsTracker->onAttached(generation);
}
+void GraphicBufferAllocator::pollForRenderedFrames(FrameEventHistoryDelta* delta) {
+ mGraphicsTracker->pollForRenderedFrames(delta);
+}
+
c2_status_t GraphicBufferAllocator::allocate(
uint32_t width, uint32_t height, ::android::PixelFormat format, uint64_t usage,
AHardwareBuffer **buf, ::android::sp<::android::Fence> *fence) {
diff --git a/media/codec2/hal/client/GraphicsTracker.cpp b/media/codec2/hal/client/GraphicsTracker.cpp
index bdfc409..2fa1b11 100644
--- a/media/codec2/hal/client/GraphicsTracker.cpp
+++ b/media/codec2/hal/client/GraphicsTracker.cpp
@@ -1003,6 +1003,19 @@
return C2_OK;
}
+void GraphicsTracker::pollForRenderedFrames(FrameEventHistoryDelta* delta) {
+ sp<IGraphicBufferProducer> igbp;
+ {
+ std::unique_lock<std::mutex> l(mLock);
+ if (mBufferCache) {
+ igbp = mBufferCache->mIgbp;
+ }
+ }
+ if (igbp) {
+ igbp->getFrameTimestamps(delta);
+ }
+}
+
void GraphicsTracker::onReleased(uint32_t generation) {
bool updateDequeue = false;
{
diff --git a/media/codec2/hal/client/client.cpp b/media/codec2/hal/client/client.cpp
index 9ee9b9e..2162c08 100644
--- a/media/codec2/hal/client/client.cpp
+++ b/media/codec2/hal/client/client.cpp
@@ -3407,7 +3407,11 @@
void Codec2Client::Component::pollForRenderedFrames(FrameEventHistoryDelta* delta) {
if (mAidlBase) {
- // TODO b/311348680
+ std::shared_ptr<AidlGraphicBufferAllocator> gba =
+ mGraphicBufferAllocators->current();
+ if (gba) {
+ gba->pollForRenderedFrames(delta);
+ }
return;
}
mOutputBufferQueue->pollForRenderedFrames(delta);
diff --git a/media/codec2/hal/client/include/codec2/aidl/GraphicBufferAllocator.h b/media/codec2/hal/client/include/codec2/aidl/GraphicBufferAllocator.h
index a797cb7..1af5095 100644
--- a/media/codec2/hal/client/include/codec2/aidl/GraphicBufferAllocator.h
+++ b/media/codec2/hal/client/include/codec2/aidl/GraphicBufferAllocator.h
@@ -85,6 +85,11 @@
void onBufferAttached(uint32_t generation);
/**
+ * Retrieve frame event history from the crurrent surface if any.
+ */
+ void pollForRenderedFrames(::android::FrameEventHistoryDelta* delta);
+
+ /**
* Allocates a buffer.
*
* @param width width of the requested buffer.
diff --git a/media/codec2/hal/client/include/codec2/aidl/GraphicsTracker.h b/media/codec2/hal/client/include/codec2/aidl/GraphicsTracker.h
index 9a4fa12..9d07672 100644
--- a/media/codec2/hal/client/include/codec2/aidl/GraphicsTracker.h
+++ b/media/codec2/hal/client/include/codec2/aidl/GraphicsTracker.h
@@ -35,6 +35,7 @@
using ::android::IGraphicBufferProducer;
using ::android::GraphicBuffer;
+using ::android::FrameEventHistoryDelta;
using ::android::Fence;
using ::android::PixelFormat;
using ::android::sp;
@@ -133,6 +134,11 @@
IGraphicBufferProducer::QueueBufferOutput *output);
/**
+ * Retrieve frame event history from the crurrent surface if any.
+ */
+ void pollForRenderedFrames(FrameEventHistoryDelta* delta);
+
+ /**
* Notifies when a Buffer is ready to allocate from Graphics.
* If generation does not match to the current, notifications via the interface
* will be ignored. (In the case, the notifications are from one of the old surfaces