Commit 0127af1e authored by Alexandre Courbot's avatar Alexandre Courbot Committed by Commit Bot

media/gpu/v4l2: add and use V4L2Device::DequeueEvent()

Add a method to try and dequeue and event from a V4L2 device, so clients
don't need to call the ioctl directly.

BUG=b:149663704
TEST=vdatest passing on Hana.

Change-Id: Ib6a30f3003dde603b5dee2e9c2a7c26ea02ba260
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2131432Reviewed-by: default avatarChih-Yu Huang <akahuang@chromium.org>
Commit-Queue: Alexandre Courbot <acourbot@chromium.org>
Cr-Commit-Position: refs/heads/master@{#756627}
parent 368974e7
...@@ -1990,6 +1990,18 @@ void V4L2Device::SchedulePoll() { ...@@ -1990,6 +1990,18 @@ void V4L2Device::SchedulePoll() {
device_poller_->SchedulePoll(); device_poller_->SchedulePoll();
} }
base::Optional<struct v4l2_event> V4L2Device::DequeueEvent() {
DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_);
struct v4l2_event event = {};
if (Ioctl(VIDIOC_DQEVENT, &event) != 0) {
VPLOGF(3) << "Failed to dequeue event";
return base::nullopt;
}
return event;
}
V4L2RequestsQueue* V4L2Device::GetRequestsQueue() { V4L2RequestsQueue* V4L2Device::GetRequestsQueue() {
DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(client_sequence_checker_);
......
...@@ -713,6 +713,9 @@ class MEDIA_GPU_EXPORT V4L2Device ...@@ -713,6 +713,9 @@ class MEDIA_GPU_EXPORT V4L2Device
// to be called from V4L2Queue, clients should not need to call it directly. // to be called from V4L2Queue, clients should not need to call it directly.
void SchedulePoll(); void SchedulePoll();
// Attempt to dequeue a V4L2 event and return it.
base::Optional<struct v4l2_event> DequeueEvent();
// Returns requests queue to get free requests. A null pointer is returned if // Returns requests queue to get free requests. A null pointer is returned if
// the queue creation failed or if requests are not supported. // the queue creation failed or if requests are not supported.
V4L2RequestsQueue* GetRequestsQueue(); V4L2RequestsQueue* GetRequestsQueue();
......
...@@ -756,18 +756,16 @@ void V4L2MjpegDecodeAccelerator::DevicePollTask() { ...@@ -756,18 +756,16 @@ void V4L2MjpegDecodeAccelerator::DevicePollTask() {
bool V4L2MjpegDecodeAccelerator::DequeueSourceChangeEvent() { bool V4L2MjpegDecodeAccelerator::DequeueSourceChangeEvent() {
DCHECK(decoder_task_runner_->BelongsToCurrentThread()); DCHECK(decoder_task_runner_->BelongsToCurrentThread());
struct v4l2_event ev; if (base::Optional<struct v4l2_event> event = device_->DequeueEvent()) {
memset(&ev, 0, sizeof(ev)); if (event->type == V4L2_EVENT_SOURCE_CHANGE) {
VLOGF(2) << ": got source change event: " << event->u.src_change.changes;
if (device_->Ioctl(VIDIOC_DQEVENT, &ev) == 0) { if (event->u.src_change.changes & V4L2_EVENT_SRC_CH_RESOLUTION) {
if (ev.type == V4L2_EVENT_SOURCE_CHANGE) {
VLOGF(2) << ": got source change event: " << ev.u.src_change.changes;
if (ev.u.src_change.changes & V4L2_EVENT_SRC_CH_RESOLUTION) {
return true; return true;
} }
VLOGF(1) << "unexpected source change event."; VLOGF(1) << "unexpected source change event.";
} else { } else {
VLOGF(1) << "got an event (" << ev.type << ") we haven't subscribed to."; VLOGF(1) << "got an event (" << event->type
<< ") we haven't subscribed to.";
} }
} else { } else {
VLOGF(1) << "dequeue event failed."; VLOGF(1) << "dequeue event failed.";
......
...@@ -1391,17 +1391,15 @@ bool V4L2VideoDecodeAccelerator::DequeueResolutionChangeEvent() { ...@@ -1391,17 +1391,15 @@ bool V4L2VideoDecodeAccelerator::DequeueResolutionChangeEvent() {
DCHECK_NE(decoder_state_, kUninitialized); DCHECK_NE(decoder_state_, kUninitialized);
DVLOGF(3); DVLOGF(3);
struct v4l2_event ev; while (base::Optional<struct v4l2_event> event = device_->DequeueEvent()) {
memset(&ev, 0, sizeof(ev)); if (event->type == V4L2_EVENT_SOURCE_CHANGE) {
if (event->u.src_change.changes & V4L2_EVENT_SRC_CH_RESOLUTION) {
while (device_->Ioctl(VIDIOC_DQEVENT, &ev) == 0) {
if (ev.type == V4L2_EVENT_SOURCE_CHANGE) {
if (ev.u.src_change.changes & V4L2_EVENT_SRC_CH_RESOLUTION) {
VLOGF(2) << "got resolution change event."; VLOGF(2) << "got resolution change event.";
return true; return true;
} }
} else { } else {
VLOGF(1) << "got an event (" << ev.type << ") we haven't subscribed to."; VLOGF(1) << "got an event (" << event->type
<< ") we haven't subscribed to.";
} }
} }
return false; return false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment