Codec2: Make surface change work
Enable attaching output buffer from old surface to new surface.
Bug: 121453508
Change-Id: Ie9a08b77f43ad787b0b6df347bd43c12493dd0de
diff --git a/media/codec2/hidl/1.0/utils/types.cpp b/media/codec2/hidl/1.0/utils/types.cpp
index c053bc1..a128a9d 100644
--- a/media/codec2/hidl/1.0/utils/types.cpp
+++ b/media/codec2/hidl/1.0/utils/types.cpp
@@ -1693,11 +1693,11 @@
if (result != OK) {
ALOGW("attachToBufferQueue -- attachBuffer failed. Error code = %d",
static_cast<int>(result));
- return false;
+ return result;
}
ALOGV("attachToBufferQueue -- attachBuffer returned slot %d",
static_cast<int>(*bqSlot));
- return true;
+ return OK;
}
bool getBufferQueueAssignment(const C2ConstGraphicBlock& block,
@@ -1779,7 +1779,7 @@
static_cast<int>(bqSlot),
static_cast<unsigned>(generation));
_C2BlockFactory::AssignBlockToBufferQueue(
- data, getHgbp(igbp), bqId, bqSlot, true);
+ data, getHgbp(igbp), generation, bqId, bqSlot, true);
return true;
}
diff --git a/media/codec2/hidl/client/client.cpp b/media/codec2/hidl/client/client.cpp
index f5cc9ff..cd374b0 100644
--- a/media/codec2/hidl/client/client.cpp
+++ b/media/codec2/hidl/client/client.cpp
@@ -1186,7 +1186,7 @@
uint32_t outputGeneration = mOutputGeneration;
mOutputBufferQueueMutex.unlock();
- status_t status = !attachToBufferQueue(block,
+ status_t status = attachToBufferQueue(block,
outputIgbp,
outputGeneration,
&bqSlot);
@@ -1218,14 +1218,15 @@
return NO_INIT;
}
- if (bqId != outputBqId) {
- ALOGV("queueToOutputSurface -- bufferqueue ids mismatch.");
- return DEAD_OBJECT;
- }
-
- if (generation != outputGeneration) {
- ALOGV("queueToOutputSurface -- generation numbers mismatch.");
- return DEAD_OBJECT;
+ if (bqId != outputBqId || generation != outputGeneration) {
+ if (!holdBufferQueueBlock(block, mOutputIgbp, mOutputBqId, mOutputGeneration)) {
+ ALOGE("queueToOutputSurface -- migration fialed");
+ return DEAD_OBJECT;
+ }
+ if (!getBufferQueueAssignment(block, &generation, &bqId, &bqSlot)) {
+ ALOGE("queueToOutputSurface -- corrupted bq assignment");
+ return UNKNOWN_ERROR;
+ }
}
status_t status = outputIgbp->queueBuffer(static_cast<int>(bqSlot),