Codec2: Make surface change work
Enable attaching output buffer from old surface to new surface.
Bug: 121453508
Change-Id: Ie9a08b77f43ad787b0b6df347bd43c12493dd0de
(cherry picked from commit d1f21a86242b5b61c890d45763d97b92e7f561fa)
diff --git a/codec2/hidl/1.0/utils/types.cpp b/codec2/hidl/1.0/utils/types.cpp
index 56db4d5..90ceb13 100644
--- a/codec2/hidl/1.0/utils/types.cpp
+++ b/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/codec2/hidl/client/client.cpp b/codec2/hidl/client/client.cpp
index ff67681..9c041cf 100644
--- a/codec2/hidl/client/client.cpp
+++ b/codec2/hidl/client/client.cpp
@@ -1177,7 +1177,7 @@
uint32_t outputGeneration = mOutputGeneration;
mOutputBufferQueueMutex.unlock();
- status_t status = !attachToBufferQueue(block,
+ status_t status = attachToBufferQueue(block,
outputIgbp,
outputGeneration,
&bqSlot);
@@ -1209,14 +1209,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),