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 76f436470aa243cd5d69dbee3aac3bf015d87347..ded062a42247692bb469e8cb70812f3d1215ea3a 100644 |
--- a/content/common/gpu/media/v4l2_video_decode_accelerator.cc |
+++ b/content/common/gpu/media/v4l2_video_decode_accelerator.cc |
@@ -267,10 +267,7 @@ bool V4L2VideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile, |
return false; |
} |
- if (!CreateInputBuffers()) |
- return false; |
- |
- if (!SetupOutputFormat()) |
+ if (!SetupFormats()) |
return false; |
// Subscribe to the resolution change event. |
@@ -284,6 +281,9 @@ bool V4L2VideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile, |
decoder_h264_parser_.reset(new media::H264Parser()); |
} |
+ if (!CreateInputBuffers()) |
+ return false; |
+ |
if (!decoder_thread_.Start()) { |
LOG(ERROR) << "Initialize(): decoder thread failed to start"; |
NOTIFY_ERROR(PLATFORM_FAILURE); |
@@ -1629,6 +1629,12 @@ bool V4L2VideoDecodeAccelerator::GetFormatInfo(struct v4l2_format* format, |
} |
} |
+ // Make sure we are still getting the format we set on initialization. |
+ if (format->fmt.pix_mp.pixelformat != output_format_fourcc_) { |
+ LOG(ERROR) << "Unexpected format from G_FMT on output"; |
+ return false; |
+ } |
+ |
return true; |
} |
@@ -1654,24 +1660,6 @@ bool V4L2VideoDecodeAccelerator::CreateInputBuffers() { |
DCHECK(!input_streamon_); |
DCHECK(input_buffer_map_.empty()); |
- __u32 pixelformat = V4L2Device::VideoCodecProfileToV4L2PixFmt(video_profile_); |
- if (!pixelformat) { |
- NOTREACHED(); |
- return false; |
- } |
- |
- struct v4l2_format format; |
- memset(&format, 0, sizeof(format)); |
- format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; |
- format.fmt.pix_mp.pixelformat = pixelformat; |
- if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
- switches::kIgnoreResolutionLimitsForAcceleratedVideoDecode)) |
- format.fmt.pix_mp.plane_fmt[0].sizeimage = kInputBufferMaxSizeFor4k; |
- else |
- format.fmt.pix_mp.plane_fmt[0].sizeimage = kInputBufferMaxSizeFor1080p; |
- format.fmt.pix_mp.num_planes = 1; |
- IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_FMT, &format); |
- |
struct v4l2_requestbuffers reqbufs; |
memset(&reqbufs, 0, sizeof(reqbufs)); |
reqbufs.count = kInputBufferCount; |
@@ -1709,10 +1697,37 @@ bool V4L2VideoDecodeAccelerator::CreateInputBuffers() { |
return true; |
} |
-bool V4L2VideoDecodeAccelerator::SetupOutputFormat() { |
- // We have to set up the format for output beforehand, because the driver may |
- // not allow changing it once we start streaming; whether it can support our |
- // chosen output format or not may depend on the input format. |
+bool V4L2VideoDecodeAccelerator::SetupFormats() { |
+ // We always run this as we prepare to initialize. |
+ DCHECK_EQ(decoder_state_, kUninitialized); |
+ DCHECK(!input_streamon_); |
+ DCHECK(!output_streamon_); |
+ |
+ __u32 input_format_fourcc = |
+ V4L2Device::VideoCodecProfileToV4L2PixFmt(video_profile_); |
+ if (!input_format_fourcc) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ |
+ size_t input_size; |
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kIgnoreResolutionLimitsForAcceleratedVideoDecode)) |
+ input_size = kInputBufferMaxSizeFor4k; |
+ else |
+ input_size = kInputBufferMaxSizeFor1080p; |
+ |
+ struct v4l2_format format; |
+ memset(&format, 0, sizeof(format)); |
+ format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE; |
+ format.fmt.pix_mp.pixelformat = input_format_fourcc; |
+ format.fmt.pix_mp.plane_fmt[0].sizeimage = input_size; |
+ format.fmt.pix_mp.num_planes = 1; |
+ IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_S_FMT, &format); |
+ |
+ // We have to set up the format for output, because the driver may not allow |
+ // changing it once we start streaming; whether it can support our chosen |
+ // output format or not may depend on the input format. |
struct v4l2_fmtdesc fmtdesc; |
memset(&fmtdesc, 0, sizeof(fmtdesc)); |
fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; |
@@ -1731,7 +1746,6 @@ bool V4L2VideoDecodeAccelerator::SetupOutputFormat() { |
// Just set the fourcc for output; resolution, etc., will come from the |
// driver once it extracts it from the stream. |
- struct v4l2_format format; |
memset(&format, 0, sizeof(format)); |
format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE; |
format.fmt.pix_mp.pixelformat = output_format_fourcc_; |