aboutsummaryrefslogtreecommitdiff
path: root/components/V4L2Decoder.cpp
diff options
context:
space:
mode:
authorChih-Yu Huang <akahuang@google.com>2020-09-14 14:51:45 +0900
committerChih-Yu Huang <akahuang@google.com>2020-09-17 10:31:52 +0900
commitfde4c9e1c00fe7cd726768351bff59cf58f030e7 (patch)
treeb207ce2b6cb08f3ba9b14ea81e060885101abb7a /components/V4L2Decoder.cpp
parentde446981800dceb87efe5657987dda625949c53c (diff)
downloadv4l2_codec2-fde4c9e1c00fe7cd726768351bff59cf58f030e7.tar.gz
V4L2Decoder: Handle V4L2 queue QBUF error
This CL handles the error when we enqueue buffers to V4L2 queues. Bug: 168557465 Test: pass android.media.cts.AdaptivePlaybackTest#testVP8_eosFlushSeek with related CLs Change-Id: I0e7fc9231e7533ee64d204ed02994f001865b085
Diffstat (limited to 'components/V4L2Decoder.cpp')
-rw-r--r--components/V4L2Decoder.cpp26
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();