MediaCodec: Use IProducerListener and MediaCodec's generation number
Use MediaCodec's generation number. And use IProducerListener when
connect to the surface if Codec implementation provides the listener.
Bug: 254050314
Test: atest android.media.decoder.cts.AdaptivePlaybackTest
Change-Id: If04c1b7be1cc7db39099c57a8905a702113833c5
diff --git a/media/codec2/sfplugin/CCodec.cpp b/media/codec2/sfplugin/CCodec.cpp
index cd3a80f..c102c4b 100644
--- a/media/codec2/sfplugin/CCodec.cpp
+++ b/media/codec2/sfplugin/CCodec.cpp
@@ -862,6 +862,8 @@
sp<Surface> surface;
if (msg->findObject("native-window", &obj)) {
surface = static_cast<Surface *>(obj.get());
+ int32_t generation;
+ (void)msg->findInt32("native-window-generation", &generation);
// setup tunneled playback
if (surface != nullptr) {
Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig);
@@ -896,7 +898,7 @@
}
}
}
- setSurface(surface);
+ setSurface(surface, (uint32_t)generation);
}
Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig);
@@ -2033,7 +2035,7 @@
}
}
-status_t CCodec::setSurface(const sp<Surface> &surface) {
+status_t CCodec::setSurface(const sp<Surface> &surface, uint32_t generation) {
bool pushBlankBuffer = false;
{
Mutexed<std::unique_ptr<Config>>::Locked configLocked(mConfig);
@@ -2062,7 +2064,7 @@
}
pushBlankBuffer = config->mPushBlankBuffersOnStop;
}
- return mChannel->setSurface(surface, pushBlankBuffer);
+ return mChannel->setSurface(surface, generation, pushBlankBuffer);
}
void CCodec::signalFlush() {
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index bddf3cb..f89e889 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -1121,6 +1121,10 @@
processRenderedFrames(delta);
}
+void CCodecBufferChannel::onBufferReleasedFromOutputSurface(uint32_t generation) {
+ mComponent->onBufferReleasedFromOutputSurface(generation);
+}
+
status_t CCodecBufferChannel::discardBuffer(const sp<MediaCodecBuffer> &buffer) {
ALOGV("[%s] discardBuffer: %p", mName, buffer.get());
bool released = false;
@@ -2265,12 +2269,8 @@
}
}
-status_t CCodecBufferChannel::setSurface(const sp<Surface> &newSurface, bool pushBlankBuffer) {
- static std::atomic_uint32_t surfaceGeneration{0};
- uint32_t generation = (getpid() << 10) |
- ((surfaceGeneration.fetch_add(1, std::memory_order_relaxed) + 1)
- & ((1 << 10) - 1));
-
+status_t CCodecBufferChannel::setSurface(const sp<Surface> &newSurface,
+ uint32_t generation, bool pushBlankBuffer) {
sp<IGraphicBufferProducer> producer;
int maxDequeueCount;
sp<Surface> oldSurface;
@@ -2284,7 +2284,6 @@
newSurface->setDequeueTimeout(kDequeueTimeoutNs);
newSurface->setMaxDequeuedBufferCount(maxDequeueCount);
producer = newSurface->getIGraphicBufferProducer();
- producer->setGenerationNumber(generation);
} else {
ALOGE("[%s] setting output surface to null", mName);
return INVALID_OPERATION;
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.h b/media/codec2/sfplugin/CCodecBufferChannel.h
index 2cdf59d..f23cb83 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.h
+++ b/media/codec2/sfplugin/CCodecBufferChannel.h
@@ -91,6 +91,7 @@
status_t renderOutputBuffer(
const sp<MediaCodecBuffer> &buffer, int64_t timestampNs) override;
void pollForRenderedBuffers() override;
+ void onBufferReleasedFromOutputSurface(uint32_t generation) override;
status_t discardBuffer(const sp<MediaCodecBuffer> &buffer) override;
void getInputBufferArray(Vector<sp<MediaCodecBuffer>> *array) override;
void getOutputBufferArray(Vector<sp<MediaCodecBuffer>> *array) override;
@@ -105,7 +106,7 @@
/**
* Set output graphic surface for rendering.
*/
- status_t setSurface(const sp<Surface> &surface, bool pushBlankBuffer);
+ status_t setSurface(const sp<Surface> &surface, uint32_t generation, bool pushBlankBuffer);
/**
* Set GraphicBufferSource object from which the component extracts input
diff --git a/media/codec2/sfplugin/include/media/stagefright/CCodec.h b/media/codec2/sfplugin/include/media/stagefright/CCodec.h
index 13713bc..ffae08d 100644
--- a/media/codec2/sfplugin/include/media/stagefright/CCodec.h
+++ b/media/codec2/sfplugin/include/media/stagefright/CCodec.h
@@ -56,7 +56,7 @@
virtual void initiateStart() override;
virtual void initiateShutdown(bool keepComponentAllocated = false) override;
- virtual status_t setSurface(const sp<Surface> &surface) override;
+ virtual status_t setSurface(const sp<Surface> &surface, uint32_t generation) override;
virtual void signalFlush() override;
virtual void signalResume() override;