Commit 1ec8bee8 authored by Chih-Yu Huang's avatar Chih-Yu Huang Committed by Commit Bot

media/gpu/v4l2: Get V4L2 free buffer with requested buffer ID

The V4L2 stateful API requires the caller pass the same buffers to the
output queue slot. This CL change V4L2Queue::GetFreeBuffer() signature
that allows the caller get a specific output queue slot.

BUG=b:159688625
TEST=video.DecodeAccel.h264 passes on Kukui.

Change-Id: I5245998b236dbb698df3d1ca11b6f269dd5de374
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2413943
Commit-Queue: Alexandre Courbot <acourbot@chromium.org>
Reviewed-by: default avatarFritz Koenig <frkoenig@chromium.org>
Reviewed-by: default avatarChih-Yu Huang <akahuang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#812556}
parent 2db66189
...@@ -285,6 +285,8 @@ class V4L2BuffersList : public base::RefCountedThreadSafe<V4L2BuffersList> { ...@@ -285,6 +285,8 @@ class V4L2BuffersList : public base::RefCountedThreadSafe<V4L2BuffersList> {
void ReturnBuffer(size_t buffer_id); void ReturnBuffer(size_t buffer_id);
// Get any of the buffers in the list. There is no order guarantee whatsoever. // Get any of the buffers in the list. There is no order guarantee whatsoever.
base::Optional<size_t> GetFreeBuffer(); base::Optional<size_t> GetFreeBuffer();
// Get the buffer with specified index.
base::Optional<size_t> GetFreeBuffer(size_t requested_buffer_id);
// Number of buffers currently in this list. // Number of buffers currently in this list.
size_t size() const; size_t size() const;
...@@ -319,6 +321,15 @@ base::Optional<size_t> V4L2BuffersList::GetFreeBuffer() { ...@@ -319,6 +321,15 @@ base::Optional<size_t> V4L2BuffersList::GetFreeBuffer() {
return buffer_id; return buffer_id;
} }
base::Optional<size_t> V4L2BuffersList::GetFreeBuffer(
size_t requested_buffer_id) {
base::AutoLock auto_lock(lock_);
return (free_buffers_.erase(requested_buffer_id) > 0)
? base::make_optional(requested_buffer_id)
: base::nullopt;
}
size_t V4L2BuffersList::size() const { size_t V4L2BuffersList::size() const {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
...@@ -1156,6 +1167,23 @@ base::Optional<V4L2WritableBufferRef> V4L2Queue::GetFreeBuffer() { ...@@ -1156,6 +1167,23 @@ base::Optional<V4L2WritableBufferRef> V4L2Queue::GetFreeBuffer() {
weak_this_factory_.GetWeakPtr()); weak_this_factory_.GetWeakPtr());
} }
base::Optional<V4L2WritableBufferRef> V4L2Queue::GetFreeBuffer(
size_t requested_buffer_id) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
// No buffers allocated at the moment?
if (!free_buffers_)
return base::nullopt;
auto buffer_id = free_buffers_->GetFreeBuffer(requested_buffer_id);
if (!buffer_id.has_value())
return base::nullopt;
return V4L2BufferRefFactory::CreateWritableRef(
buffers_[buffer_id.value()]->v4l2_buffer(),
weak_this_factory_.GetWeakPtr());
}
bool V4L2Queue::QueueBuffer(struct v4l2_buffer* v4l2_buffer, bool V4L2Queue::QueueBuffer(struct v4l2_buffer* v4l2_buffer,
scoped_refptr<VideoFrame> video_frame) { scoped_refptr<VideoFrame> video_frame) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
......
...@@ -367,6 +367,13 @@ class MEDIA_GPU_EXPORT V4L2Queue ...@@ -367,6 +367,13 @@ class MEDIA_GPU_EXPORT V4L2Queue
// If the caller discards the returned reference, the underlying buffer is // If the caller discards the returned reference, the underlying buffer is
// made available to clients again. // made available to clients again.
base::Optional<V4L2WritableBufferRef> GetFreeBuffer(); base::Optional<V4L2WritableBufferRef> GetFreeBuffer();
// Return the buffer at index |requested_buffer_id|, if it is available at
// this time.
//
// If the buffer is currently in use or the provided index is invalid,
// return |base::nullopt|.
base::Optional<V4L2WritableBufferRef> GetFreeBuffer(
size_t requested_buffer_id);
// Attempt to dequeue a buffer, and return a reference to it if one was // Attempt to dequeue a buffer, and return a reference to it if one was
// available. // available.
......
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