Index: content/common/gpu/media/v4l2_video_decode_accelerator.cc |
diff --git a/content/common/gpu/media/v4l2_video_decode_accelerator.cc b/content/common/gpu/media/v4l2_video_decode_accelerator.cc |
index dfd0866e47d77748e1eb6cb95a695d27c5a6c9e4..0f251930a9431f2d8a4a2bf9693826674b492e93 100644 |
--- a/content/common/gpu/media/v4l2_video_decode_accelerator.cc |
+++ b/content/common/gpu/media/v4l2_video_decode_accelerator.cc |
@@ -192,6 +192,7 @@ V4L2VideoDecodeAccelerator::V4L2VideoDecodeAccelerator( |
egl_context_(egl_context), |
video_profile_(media::VIDEO_CODEC_PROFILE_UNKNOWN), |
output_format_fourcc_(0), |
+ min_picture_count_(0), |
weak_this_factory_(this) { |
weak_this_ = weak_this_factory_.GetWeakPtr(); |
} |
@@ -210,6 +211,7 @@ V4L2VideoDecodeAccelerator::~V4L2VideoDecodeAccelerator() { |
} |
bool V4L2VideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile, |
+ uint32_t min_picture_count, |
Client* client) { |
DVLOG(3) << "Initialize()"; |
DCHECK(child_task_runner_->BelongsToCurrentThread()); |
@@ -239,6 +241,7 @@ bool V4L2VideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile, |
return false; |
}; |
video_profile_ = profile; |
+ min_picture_count_ = min_picture_count; |
if (egl_display_ == EGL_NO_DISPLAY) { |
LOG(ERROR) << "Initialize(): could not get EGLDisplay"; |
@@ -1836,7 +1839,9 @@ bool V4L2VideoDecodeAccelerator::CreateOutputBuffers() { |
// Allocate the output buffers. |
struct v4l2_requestbuffers reqbufs; |
memset(&reqbufs, 0, sizeof(reqbufs)); |
- reqbufs.count = output_dpb_size_ + kDpbOutputBufferExtraCount; |
+ reqbufs.count = std::max(min_picture_count_, |
+ static_cast<uint32_t>( |
+ output_dpb_size_ + kDpbOutputBufferExtraCount)); |
reqbufs.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; |
reqbufs.memory = V4L2_MEMORY_MMAP; |
IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_REQBUFS, &reqbufs); |