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

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

Issue 874083005: Fix visible size for V4L2 VDA (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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_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 7aa737406c9f2f92347c9024e4f03f2146254f8d..5f087e7e429c1c4636fefc8ba7713c1814d29d6a 100644
--- a/content/common/gpu/media/v4l2_video_decode_accelerator.cc
+++ b/content/common/gpu/media/v4l2_video_decode_accelerator.cc
@@ -21,6 +21,7 @@
#include "content/common/gpu/media/v4l2_video_decode_accelerator.h"
#include "media/base/media_switches.h"
#include "media/filters/h264_parser.h"
+#include "ui/gfx/geometry/rect.h"
#include "ui/gl/scoped_binders.h"
#define NOTIFY_ERROR(x) \
@@ -745,6 +746,8 @@ bool V4L2VideoDecodeAccelerator::DecodeBufferInitial(
// Success! Setup our parameters.
if (!CreateBuffersForFormat(format))
return false;
+ if (!GetCropSize(frame_buffer_size_, &frame_visible_size_))
+ frame_visible_size_ = frame_buffer_size_;
// We expect to process the initial buffer once during stream init to
// configure stream parameters, but will not consume the steam data on that
@@ -1084,9 +1087,8 @@ void V4L2VideoDecodeAccelerator::Dequeue() {
DVLOG(3) << "Dequeue(): returning input_id=" << dqbuf.timestamp.tv_sec
<< " as picture_id=" << output_record.picture_id;
const media::Picture& picture =
- media::Picture(output_record.picture_id,
- dqbuf.timestamp.tv_sec,
- gfx::Rect(frame_buffer_size_));
+ media::Picture(output_record.picture_id, dqbuf.timestamp.tv_sec,
+ gfx::Rect(frame_visible_size_));
pending_picture_ready_.push(
PictureRecord(output_record.cleared, picture));
SendPictureReady();
@@ -1546,6 +1548,8 @@ void V4L2VideoDecodeAccelerator::FinishResolutionChange() {
NOTIFY_ERROR(PLATFORM_FAILURE);
return;
}
+ if (!GetCropSize(frame_buffer_size_, &frame_visible_size_))
Pawel Osciak 2015/01/29 05:02:04 Could we call this from GetFormatInfo()?
kcwu 2015/01/29 09:33:11 Done.
+ frame_visible_size_ = frame_buffer_size_;
decoder_state_ = kDecoding;
@@ -1658,6 +1662,34 @@ bool V4L2VideoDecodeAccelerator::CreateBuffersForFormat(
return true;
}
+bool V4L2VideoDecodeAccelerator::GetCropSize(const gfx::Size& buffer_size,
+ gfx::Size* crop_size) {
+ DCHECK_EQ(decoder_thread_.message_loop(), base::MessageLoop::current());
+
+ struct v4l2_crop crop_arg;
Pawel Osciak 2015/01/29 05:02:04 memset to 0 please.
kcwu 2015/01/29 09:33:10 Done.
+ crop_arg.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+
+ IOCTL_OR_ERROR_RETURN_FALSE(VIDIOC_G_CROP, &crop_arg);
+
+ gfx::Rect rect(crop_arg.c.left, crop_arg.c.top, crop_arg.c.width,
+ crop_arg.c.height);
+ DVLOG(3) << "Crop rectangle is " << rect.ToString();
Pawel Osciak 2015/01/29 05:02:04 Let's stop calling this crop and say visible size
kcwu 2015/01/29 09:33:11 Done.
+ if (!gfx::Rect(buffer_size).Contains(rect)) {
Pawel Osciak 2015/01/29 05:02:04 Please also check if it's !Empty()
kcwu 2015/01/29 09:33:10 Done.
+ DLOG(ERROR) << "crop rectangle " << rect.ToString()
+ << " is not inside buffer size " << buffer_size.ToString();
+ return false;
+ }
+
+ if (!rect.origin().IsOrigin()) {
Pawel Osciak 2015/01/29 05:02:04 Please add a comment why.
kcwu 2015/01/29 09:33:10 Done.
+ DLOG(ERROR) << "Unexpected crop rectangle " << rect.ToString()
+ << ", top-left is not origin";
+ return false;
+ }
+ *crop_size = rect.size();
+
+ return true;
+}
+
bool V4L2VideoDecodeAccelerator::CreateInputBuffers() {
DVLOG(3) << "CreateInputBuffers()";
// We always run this as we prepare to initialize.
@@ -1978,6 +2010,14 @@ bool V4L2VideoDecodeAccelerator::IsResolutionChangeNecessary() {
DVLOG(3) << "IsResolutionChangeNecessary(): Resolution change detected";
return true;
}
+
+ gfx::Size new_crop_size;
+ if (GetCropSize(new_size, &new_crop_size) &&
+ new_crop_size != frame_visible_size_) {
+ DVLOG(3) << "IsResolutionChangeNecessary(): crop size change detected";
Pawel Osciak 2015/01/29 05:02:04 Crop size does not influence resolution change. If
kcwu 2015/01/29 09:33:11 Done.
+ return true;
+ }
+
return false;
}

Powered by Google App Engine
This is Rietveld 408576698