Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Unified Diff: content/common/gpu/media/v4l2_slice_video_decode_accelerator.cc

Issue 1207043002: Introduce a client minimum picture pool size (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved constant to shared header, validate min_picture_size now in resource proxy as well as host co… Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/common/gpu/media/v4l2_slice_video_decode_accelerator.cc
diff --git a/content/common/gpu/media/v4l2_slice_video_decode_accelerator.cc b/content/common/gpu/media/v4l2_slice_video_decode_accelerator.cc
index a09f089a942252dd2777bb10fa3b96ec7bdf164c..dafcf7ecf371ad1770bed82e01577491e5ea8200 100644
--- a/content/common/gpu/media/v4l2_slice_video_decode_accelerator.cc
+++ b/content/common/gpu/media/v4l2_slice_video_decode_accelerator.cc
@@ -729,28 +729,14 @@ bool V4L2SliceVideoDecodeAccelerator::CreateOutputBuffers() {
return false;
}
- struct v4l2_requestbuffers reqbufs;
- memset(&reqbufs, 0, sizeof(reqbufs));
- reqbufs.count = num_pictures;
- reqbufs.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
- reqbufs.memory = V4L2_MEMORY_MMAP;
- IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_REQBUFS, &reqbufs);
-
- if (reqbufs.count < num_pictures) {
- PLOG(ERROR) << "Could not allocate enough output buffers";
- return false;
- }
-
- output_buffer_map_.resize(reqbufs.count);
-
- DVLOGF(3) << "buffer_count=" << output_buffer_map_.size()
+ DVLOGF(3) << "buffer_count=" << num_pictures
<< ", visible size=" << visible_size_.ToString()
<< ", coded size=" << coded_size_.ToString();
child_task_runner_->PostTask(
FROM_HERE,
base::Bind(&VideoDecodeAccelerator::Client::ProvidePictureBuffers,
- client_, output_buffer_map_.size(), coded_size_,
+ client_, num_pictures, coded_size_,
device_->GetTextureTarget()));
// Wait for the client to call AssignPictureBuffers() on the Child thread.
@@ -1432,10 +1418,12 @@ void V4L2SliceVideoDecodeAccelerator::AssignPictureBuffers(
DVLOGF(3);
DCHECK(child_task_runner_->BelongsToCurrentThread());
- if (buffers.size() != output_buffer_map_.size()) {
+ const uint32_t req_buffer_count = decoder_->GetRequiredNumOfPictures();
+
+ if (buffers.size() < req_buffer_count) {
DLOG(ERROR) << "Failed to provide requested picture buffers. "
<< "(Got " << buffers.size()
- << ", requested " << output_buffer_map_.size() << ")";
+ << ", requested " << req_buffer_count << ")";
NOTIFY_ERROR(INVALID_ARGUMENT);
return;
}
@@ -1450,6 +1438,23 @@ void V4L2SliceVideoDecodeAccelerator::AssignPictureBuffers(
// It's safe to manipulate all the buffer state here, because the decoder
// thread is waiting on pictures_assigned_.
+
+ // Allocate the output buffers.
+ struct v4l2_requestbuffers reqbufs;
+ memset(&reqbufs, 0, sizeof(reqbufs));
+ reqbufs.count = buffers.size();
+ reqbufs.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ reqbufs.memory = V4L2_MEMORY_MMAP;
+ IOCTL_OR_ERROR_RETURN(VIDIOC_REQBUFS, &reqbufs);
+
+ if (reqbufs.count != buffers.size()) {
+ DLOG(ERROR) << "Could not allocate enough output buffers";
+ NOTIFY_ERROR(PLATFORM_FAILURE);
+ return;
+ }
+
+ output_buffer_map_.resize(buffers.size());
+
DCHECK(free_output_buffers_.empty());
for (size_t i = 0; i < output_buffer_map_.size(); ++i) {
DCHECK(buffers[i].size() == coded_size_);
« no previous file with comments | « content/common/gpu/media/dxva_video_decode_accelerator.cc ('k') | content/common/gpu/media/v4l2_video_decode_accelerator.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698