OSDN Git Service

Ensure VA processing the buffer with correct crop/frame
authorXiaosong Wei <xiaosong.wei@intel.com>
Mon, 9 Oct 2017 08:33:34 +0000 (16:33 +0800)
committerKalyan Kondapally <kalyan.kondapally@intel.com>
Mon, 9 Oct 2017 10:36:05 +0000 (03:36 -0700)
The surface region for VA input must be from layer's SourceCrop
and the output region for VA output must be from layer's DisplayFrame

Jira: None.
Test: Video uses packed YUV formats and is displayed correctly on Android.
Signed-off-by: Xiaosong Wei <xiaosong.wei@intel.com>
common/compositor/compositor.cpp [changed mode: 0644->0755]
common/compositor/renderstate.h [changed mode: 0644->0755]
common/compositor/va/varenderer.cpp [changed mode: 0644->0755]

old mode 100644 (file)
new mode 100755 (executable)
index fe16ae8..c8af500
@@ -81,11 +81,7 @@ bool Compositor::Draw(DisplayPlaneStateList &comp_planes,
       state.surface_ = plane.GetOffScreenTarget();
       MediaState &media_state = state.media_state_;
       const OverlayLayer &layer = layers[plane.source_layers().at(0)];
-      media_state.source_buffer_ = layer.GetBuffer();
-      media_state.frame_width_ = layer.GetDisplayFrameWidth();
-      media_state.frame_height_ = layer.GetDisplayFrameHeight();
-      media_state.out_width_ = layer.GetSourceCropWidth();
-      media_state.out_height_ = layer.GetSourceCropHeight();
+      media_state.layer_ = &layer;
     } else if (plane.GetCompositionState() ==
                DisplayPlaneState::State::kRender) {
       comp = &plane;
old mode 100644 (file)
new mode 100755 (executable)
index b2a8cf5..539b3ed
@@ -58,11 +58,7 @@ struct RenderState {
 };
 
 struct MediaState {
-  const OverlayBuffer *source_buffer_;
-  uint32_t frame_width_;
-  uint32_t frame_height_;
-  uint32_t out_width_;
-  uint32_t out_height_;
+  const OverlayLayer *layer_;
 };
 
 struct DrawState {
old mode 100644 (file)
new mode 100755 (executable)
index 41ca7a6..6c5b0fc
@@ -202,7 +202,7 @@ bool VARenderer::Init(int gpu_fd) {
 bool VARenderer::Draw(const MediaState& state, NativeSurface* surface) {
   VASurfaceAttribExternalBuffers external_in;
   memset(&external_in, 0, sizeof(external_in));
-  const OverlayBuffer* buffer_in = state.source_buffer_;
+  const OverlayBuffer* buffer_in = state.layer_->GetBuffer();
   unsigned long prime_fd_in = buffer_in->GetPrimeFD();
   int rt_format = DrmFormatToRTFormat(buffer_in->GetFormat());
   external_in.pixel_format = DrmFormatToVAFormat(buffer_in->GetFormat());
@@ -227,8 +227,8 @@ bool VARenderer::Draw(const MediaState& state, NativeSurface* surface) {
   VASurfaceAttribExternalBuffers external_out;
   memset(&external_out, 0, sizeof(external_out));
   OverlayBuffer* buffer_out = surface->GetLayer()->GetBuffer();
-  int dest_width = state.out_width_;
-  int dest_height = state.out_height_;
+  int dest_width = buffer_out->GetWidth();
+  int dest_height = buffer_out->GetHeight();
   unsigned long prime_fd_out = buffer_out->GetPrimeFD();
   rt_format = DrmFormatToRTFormat(buffer_out->GetFormat());
   external_out.pixel_format = DrmFormatToVAFormat(buffer_out->GetFormat());
@@ -246,7 +246,8 @@ bool VARenderer::Draw(const MediaState& state, NativeSurface* surface) {
 
   ScopedVASurfaceID surface_out(va_display_);
   if (!surface_out.CreateSurface(rt_format, external_out)) {
-    DTRACE("Create Output surface failed\n");
+    DTRACE("Create Output surface failed, pixel_format:%4.4s w/h: %dx%d\n",
+           (char*)&external_out.pixel_format, dest_width, dest_height);
     return false;
   }
 
@@ -265,18 +266,27 @@ bool VARenderer::Draw(const MediaState& state, NativeSurface* surface) {
   memset(&param, 0, sizeof(VAProcPipelineParameterBuffer));
 
   VARectangle surface_region, output_region;
-  surface_region.x = 0;
-  surface_region.y = 0;
-  surface_region.width = state.frame_width_;
-  surface_region.height = state.frame_height_;
+  HwcRect<float> source_crop = state.layer_->GetSourceCrop();
+  surface_region.x = source_crop.left;
+  surface_region.y = source_crop.top;
+  surface_region.width = source_crop.right;
+  surface_region.height = source_crop.bottom;
   param.surface_region = &surface_region;
 
-  output_region.x = 0;
-  output_region.y = 0;
-  output_region.width = dest_width;
-  output_region.height = dest_height;
+  HwcRect<int> display_frame = state.layer_->GetDisplayFrame();
+  output_region.x = display_frame.left;
+  output_region.y = display_frame.top;
+  output_region.width = display_frame.right;
+  output_region.height = display_frame.bottom;
   param.output_region = &output_region;
 
+  DUMPTRACE("surface_region: (%d, %d, %d, %d)\n",
+             surface_region.x, surface_region.y,
+             surface_region.width, surface_region.height);
+  DUMPTRACE("Layer DisplayFrame:(%d,%d,%d,%d)\n",
+             display_frame.left, display_frame.top,
+             display_frame.right, display_frame.bottom);
+
   param.surface = surface_in;
   param.surface_color_standard = VAProcColorStandardBT601;
   param.output_color_standard = VAProcColorStandardBT601;