[go: nahoru, domu]

Attach visible rectangle information with ProvidePictureBuffers

Crosvm-based hw video decode acceleration needs to have visible rectangle
information at the same time when fourcc frame width and height for output
buffers are provided (i.e. ProvidePictureBuffers is called). Since this is
ChromeOS specific additional change, I add a new ProvidePictureBuffers with
visible rectangle argument, ProvidePictureBuffersWithVisibleRect in order to
reduce the amount of code changes.

Bug: 949898, b:130004718
Test: ./libvda_unittest (with CLs up to crrev.com/c/1575320)
Change-Id: I5e06e9519a8560631cea8e47d0738cb060c955e6
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1600950
Commit-Queue: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: Alexandre Courbot <acourbot@chromium.org>
Reviewed-by: Dan Sanders <sandersd@chromium.org>
Cr-Commit-Position: refs/heads/master@{#661685}
diff --git a/media/gpu/vp9_decoder.cc b/media/gpu/vp9_decoder.cc
index f5ecfbb..6cb9071 100644
--- a/media/gpu/vp9_decoder.cc
+++ b/media/gpu/vp9_decoder.cc
@@ -135,8 +135,17 @@
 
     gfx::Size new_pic_size(curr_frame_hdr_->frame_width,
                            curr_frame_hdr_->frame_height);
-    DCHECK(!new_pic_size.IsEmpty());
+    gfx::Rect new_render_rect(curr_frame_hdr_->render_width,
+                              curr_frame_hdr_->render_height);
+    // For safety, check the validity of render size or leave it as (0, 0).
+    if (!gfx::Rect(new_pic_size).Contains(new_render_rect)) {
+      DVLOG(1) << "Render size exceeds picture size. render size: "
+               << new_render_rect.ToString()
+               << ", picture size: " << new_pic_size.ToString();
+      new_render_rect = gfx::Rect();
+    }
 
+    DCHECK(!new_pic_size.IsEmpty());
     if (new_pic_size != pic_size_) {
       DVLOG(1) << "New resolution: " << new_pic_size.ToString();
 
@@ -164,6 +173,7 @@
       ref_frames_.Clear();
 
       pic_size_ = new_pic_size;
+      visible_rect_ = new_render_rect;
       size_change_failure_counter_ = 0;
       return kAllocateNewSurfaces;
     }
@@ -171,16 +181,6 @@
     scoped_refptr<VP9Picture> pic = accelerator_->CreateVP9Picture();
     if (!pic)
       return kRanOutOfSurfaces;
-
-    gfx::Rect new_render_rect(curr_frame_hdr_->render_width,
-                              curr_frame_hdr_->render_height);
-    // For safety, check the validity of render size or leave it as (0, 0).
-    if (!gfx::Rect(pic_size_).Contains(new_render_rect)) {
-      DVLOG(1) << "Render size exceeds picture size. render size: "
-               << new_render_rect.ToString()
-               << ", picture size: " << pic_size_.ToString();
-      new_render_rect = gfx::Rect();
-    }
     DVLOG(2) << "Render resolution: " << new_render_rect.ToString();
 
     pic->set_visible_rect(new_render_rect);
@@ -252,6 +252,10 @@
   return pic_size_;
 }
 
+gfx::Rect VP9Decoder::GetVisibleRect() const {
+  return visible_rect_;
+}
+
 size_t VP9Decoder::GetRequiredNumOfPictures() const {
   constexpr size_t kPicsInPipeline = limits::kMaxVideoFrames + 1;
   return kPicsInPipeline + GetNumReferenceFrames();