diff options
author | Chih-Yu Huang <akahuang@google.com> | 2020-09-17 04:04:34 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-09-17 04:04:34 +0000 |
commit | 25c3c32f40307e211630744ca03545c5bcaeb5fa (patch) | |
tree | b207ce2b6cb08f3ba9b14ea81e060885101abb7a | |
parent | d7097b95c41f9404a0778337c4676d0524fcf894 (diff) | |
parent | a44190e97ea8166d2f8f1705712734e17eaba10d (diff) | |
download | v4l2_codec2-25c3c32f40307e211630744ca03545c5bcaeb5fa.tar.gz |
V4L2Decoder: Handle V4L2 queue QBUF error am: fde4c9e1c0 am: a44190e97eandroid-11.0.0_r46android-11.0.0_r43android-11.0.0_r40android-11.0.0_r39android-11.0.0_r38android-11.0.0_r37android-11.0.0_r36android-11.0.0_r35android-11.0.0_r34android-11.0.0_r33android-11.0.0_r32android-11.0.0_r30android11-qpr3-s1-releaseandroid11-qpr3-releaseandroid11-qpr2-releaseandroid11-qpr1-c-release
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/v4l2_codec2/+/12593345
Change-Id: Ia784ebf7707546a0c63fd95f6398330f53fa5c39
-rw-r--r-- | components/V4L2Decoder.cpp | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/components/V4L2Decoder.cpp b/components/V4L2Decoder.cpp index b9b4f6c..d52bd6c 100644 --- a/components/V4L2Decoder.cpp +++ b/components/V4L2Decoder.cpp @@ -270,8 +270,9 @@ void V4L2Decoder::pumpDecodeRequest() { auto request = std::move(mDecodeRequests.front()); mDecodeRequests.pop(); - ALOGV("QBUF to input queue, bitstreadId=%d", request.buffer->id); - inputBuffer->SetTimeStamp({.tv_sec = request.buffer->id}); + const int32_t bitstreamId = request.buffer->id; + ALOGV("QBUF to input queue, bitstreadId=%d", bitstreamId); + inputBuffer->SetTimeStamp({.tv_sec = bitstreamId}); size_t planeSize = inputBuffer->GetPlaneSize(0); if (request.buffer->size > planeSize) { ALOGE("The input size (%zu) is not enough, we need %zu", planeSize, @@ -286,9 +287,13 @@ void V4L2Decoder::pumpDecodeRequest() { inputBuffer->SetPlaneBytesUsed(0, request.buffer->offset + request.buffer->size); std::vector<int> fds; fds.push_back(std::move(request.buffer->dmabuf_fd)); - std::move(*inputBuffer).QueueDMABuf(fds); + if (!std::move(*inputBuffer).QueueDMABuf(fds)) { + ALOGE("%s(): Failed to QBUF to input queue, bitstreamId=%d", __func__, bitstreamId); + onError(); + return; + } - mPendingDecodeCbs.insert(std::make_pair(request.buffer->id, std::move(request.decodeCb))); + mPendingDecodeCbs.insert(std::make_pair(bitstreamId, std::move(request.decodeCb))); } } @@ -414,7 +419,11 @@ void V4L2Decoder::serviceDeviceTask(bool event) { auto outputBuffer = mOutputQueue->GetFreeBuffer(bufferId); ALOG_ASSERT(outputBuffer, "V4L2 output queue slot %zu is not freed.", bufferId); - std::move(*outputBuffer).QueueDMABuf(frame->getFDs()); + if (!std::move(*outputBuffer).QueueDMABuf(frame->getFDs())) { + ALOGE("%s(): Failed to recycle empty buffer to output queue.", __func__); + onError(); + return; + } mFrameAtDevice.insert(std::make_pair(bufferId, std::move(frame))); } @@ -565,7 +574,12 @@ void V4L2Decoder::onVideoFrameReady( uint32_t v4l2Id = outputBuffer->BufferId(); ALOGV("QBUF to output queue, blockId=%u, V4L2Id=%u", blockId, v4l2Id); - std::move(*outputBuffer).QueueDMABuf(frame->getFDs()); + if (!std::move(*outputBuffer).QueueDMABuf(frame->getFDs())) { + ALOGE("%s(): Failed to QBUF to output queue, blockId=%u, V4L2Id=%u", __func__, blockId, + v4l2Id); + onError(); + return; + } if (mFrameAtDevice.find(v4l2Id) != mFrameAtDevice.end()) { ALOGE("%s(): V4L2 buffer %d already enqueued.", __func__, v4l2Id); onError(); |