OSDN Git Service

Add full color range support
authorHeYue <yue.he@intel.com>
Tue, 27 Nov 2018 06:39:50 +0000 (14:39 +0800)
committerLin Johnson <johnson.lin@intel.com>
Thu, 29 Nov 2018 02:19:45 +0000 (10:19 +0800)
By default the HWC only support reduced color range.

Change-Id: Icf3ed7ab7c8a4a619da6e47341e5832a8577caf7
Tracked-On: https://jira01.devtools.intel.com/browse/OAM-71652
Tests: Support full color video.
Signed-off-by: HeYue <yue.he@intel.com>
14 files changed:
Android.common.mk
common/Android.mk
common/compositor/va/varenderer.cpp
common/core/hwclayer.cpp
common/core/overlaylayer.cpp
common/core/overlaylayer.h
os/android/iahwc2.cpp
os/android/platformdefines.h
os/linux/platformdefines.h
public/hwclayer.h
public/hwcmeta.h
wsi/Android.mk
wsi/drm/drmbuffer.h
wsi/overlaybuffer.h

index ee24914..952b3c7 100644 (file)
@@ -121,6 +121,8 @@ LOCAL_CPPFLAGS += \
        -Wno-unused-parameter \
        -Wno-unused-variable
 
+LOCAL_CPPFLAGS += -DVA_SUPPORT_COLOR_RANGE
+
 ifeq ($(strip $(BOARD_USES_VULKAN)), true)
 LOCAL_SHARED_LIBRARIES += \
        libvulkan
index c56de4a..8bdf2b4 100644 (file)
@@ -133,6 +133,8 @@ LOCAL_CPPFLAGS += \
         -Wno-unused-parameter \
         -O3
 
+LOCAL_CPPFLAGS += -DVA_SUPPORT_COLOR_RANGE
+
 ifeq ($(strip $(BOARD_USES_VULKAN)), true)
 LOCAL_SHARED_LIBRARIES += \
         libvulkan
index 368d049..1c17496 100644 (file)
@@ -246,6 +246,7 @@ bool VARenderer::Draw(const MediaState& state, NativeSurface* surface) {
 
   // Get Input Surface.
   OverlayBuffer* buffer_in = state.layer_->GetBuffer();
+  uint32_t dataspace = buffer_in->GetDataSpace();
   const MediaResourceHandle& resource = buffer_in->GetMediaResource(
       va_display_, state.layer_->GetSourceCropWidth(),
       state.layer_->GetSourceCropHeight());
@@ -296,6 +297,12 @@ bool VARenderer::Draw(const MediaState& state, NativeSurface* surface) {
   pipe_param.output_region = &output_region;
   pipe_param.output_color_standard = VAProcColorStandardBT601;
 
+#ifdef VA_SUPPORT_COLOR_RANGE
+  if ((dataspace & HAL_DATASPACE_RANGE_FULL) != 0) {
+    pipe_param.input_color_properties.color_range = VA_SOURCE_RANGE_FULL;
+  }
+#endif
+
 #ifdef VA_WITH_PAVP
   if (state.layer_->IsProtected()) {
     /*Turn on protected flag*/
index 79ae05e..a7532e9 100644 (file)
@@ -44,6 +44,12 @@ void HwcLayer::SetTransform(int32_t transform) {
   }
 }
 
+void HwcLayer::SetDataSpace(uint32_t dataspace) {
+  if (dataspace_ != dataspace) {
+    dataspace_ = dataspace;
+  }
+}
+
 void HwcLayer::SetAlpha(uint8_t alpha) {
   if (alpha_ != alpha) {
     alpha_ = alpha;
index a347beb..39c2af6 100644 (file)
@@ -110,6 +110,8 @@ void OverlayLayer::SetBuffer(HWCNativeHandle handle, int32_t acquire_fence,
     buffer->SetOriginalHandle(handle);
   }
 
+  buffer->SetDataSpace(dataspace_);
+
   imported_buffer_.reset(new ImportedBuffer(buffer, acquire_fence));
   ValidateForOverlayUsage();
 }
@@ -199,6 +201,7 @@ void OverlayLayer::InitializeState(HwcLayer* layer,
   source_crop_width_ = layer->GetSourceCropWidth();
   source_crop_height_ = layer->GetSourceCropHeight();
   source_crop_ = layer->GetSourceCrop();
+  dataspace_ = layer->GetDataSpace();
   blending_ = layer->GetBlending();
   surface_damage_ = layer->GetLayerDamage();
 
index 95a7943..c090b04 100644 (file)
@@ -286,6 +286,7 @@ struct OverlayLayer {
   uint32_t display_frame_width_ = 0;
   uint32_t display_frame_height_ = 0;
   uint8_t alpha_ = 0xff;
+  uint32_t dataspace_ = 0;
 
   uint32_t solid_color_ = 0;
 
index 8a57f40..9d41ee8 100644 (file)
@@ -891,6 +891,7 @@ HWC2::Error IAHWC2::Hwc2Layer::SetLayerCompositionType(int32_t type) {
 HWC2::Error IAHWC2::Hwc2Layer::SetLayerDataspace(int32_t dataspace) {
   supported(__func__);
   dataspace_ = static_cast<android_dataspace_t>(dataspace);
+  hwc_layer_.SetDataSpace(dataspace_);
   return HWC2::Error::None;
 }
 
index adb7649..f039040 100644 (file)
@@ -29,6 +29,7 @@
 #include <cros_gralloc_handle.h>
 #include <hardware/hardware.h>
 #include <hardware/hwcomposer.h>
+#include <system/graphics.h>
 #include <ui/GraphicBuffer.h>
 #include <utils/Trace.h>
 #include "platformcommondefines.h"
index 7fdfb62..266bfd3 100644 (file)
@@ -32,6 +32,8 @@
 
 #include "platformcommondefines.h"
 
+#define HAL_DATASPACE_RANGE_FULL 0x8000000
+
 struct gbm_handle {
   union {
     // for GBM_BO_IMPORT_FD
index cefb9cf..96b75d7 100644 (file)
@@ -42,6 +42,8 @@ struct HwcLayer {
     return sf_handle_;
   }
 
+  void SetDataSpace(uint32_t dataspace);
+
   void SetTransform(int32_t sf_transform);
 
   uint32_t GetTransform() const {
@@ -68,6 +70,10 @@ struct HwcLayer {
   void SetDisplayFrame(const HwcRect<int>& display_frame, int translate_x_pos,
                        int translate_y_pos);
 
+  uint32_t GetDataSpace() const {
+    return dataspace_;
+  }
+
   const HwcRect<int>& GetDisplayFrame() const {
     return display_frame_;
   }
@@ -316,6 +322,7 @@ struct HwcLayer {
   uint32_t display_frame_width_ = 0;
   uint32_t display_frame_height_ = 0;
   uint8_t alpha_ = 0xff;
+  uint32_t dataspace_ = 0;
   HwcRect<float> source_crop_;
   HwcRect<int> display_frame_;
   HwcRect<int> surface_damage_;
index d9bedc0..d64c4b1 100644 (file)
@@ -38,6 +38,7 @@ struct HwcMeta {
   int prime_fds_[4];
   uint32_t num_planes_ = 0;
   uint32_t fb_modifiers_[8];
+  uint32_t dataspace_ = 0;
   hwcomposer::HWCLayerType usage_ = hwcomposer::kLayerNormal;
 };
 
index eb94cd9..ffe876d 100644 (file)
@@ -90,6 +90,8 @@ LOCAL_CPPFLAGS += \
         -Wno-unused-parameter \
         -O3
 
+LOCAL_CPPFLAGS += -DVA_SUPPORT_COLOR_RANGE
+
 ifeq ($(strip $(BOARD_USES_VULKAN)), true)
 LOCAL_SHARED_LIBRARIES += \
         libvulkan
index c7b9b0a..196d4b6 100644 (file)
@@ -40,6 +40,10 @@ class DrmBuffer : public OverlayBuffer {
       HWCNativeHandle handle, ResourceManager* buffer_manager,
       FrameBufferManager* frame_buffer_manager) override;
 
+  uint32_t GetDataSpace() const override {
+    return METADATA(dataspace_);
+  }
+
   uint32_t GetWidth() const override {
     return METADATA(width_);
   }
@@ -76,6 +80,10 @@ class DrmBuffer : public OverlayBuffer {
     return METADATA(tiling_mode_);
   }
 
+  void SetDataSpace(uint32_t dataspace) override {
+    METADATA(dataspace_) = dataspace;
+  }
+
   bool GetInterlace() override {
     return METADATA(is_interlaced_);
   }
index ae9545e..b8b0345 100644 (file)
@@ -45,6 +45,8 @@ class OverlayBuffer {
       HWCNativeHandle handle, ResourceManager* buffer_manager,
       FrameBufferManager* frame_buffer_manager) = 0;
 
+  virtual uint32_t GetDataSpace() const = 0;
+
   virtual uint32_t GetWidth() const = 0;
 
   virtual uint32_t GetHeight() const = 0;
@@ -63,6 +65,8 @@ class OverlayBuffer {
 
   virtual uint32_t GetTilingMode() const = 0;
 
+  virtual void SetDataSpace(uint32_t dataspace) = 0;
+
   virtual bool GetInterlace() = 0;
 
   virtual void SetInterlace(bool isInterlaced) = 0;