Commit fc0f49d7 authored by Miguel Casas's avatar Miguel Casas Committed by Commit Bot

Edid: make a class out of the edid parsing functions

This CL refactors the multiple individual functions of edid_parser.*
into a single EdidParser class that parses an EDID blob passed on
ctor, populating the necessary/available fields.  This simplifies
extending this parser (which has happened and is expected to happen
again), and simplifies the client APIs and the unittests.

The client contract is changed a bit, since EdidParser won't tell
if the parsing failed, but this is not really impactful since the
current users ignore this booleans anyhow. Erroneous parsing is
signalled via error values.

Besides that, a notable change is that now we're parsing the whole
EDID whereas on ToT this was somewhat on demand. But anyway
drm_util always wanted all those parsings, and EDIDParserX11,
which only needed one on ToT, is expected to work on Linux, where
walking a 128B array should not be very demanding.

Also EDIDParserX11 had two unused methods, removed.

Change-Id: Id38a02dad1bc4ba55a3f7041034098dac5153020
Bug: 821393
Reviewed-on: https://chromium-review.googlesource.com/970085Reviewed-by: default avatarDaniel Nicoara <dnicoara@chromium.org>
Commit-Queue: Miguel Casas <mcasas@chromium.org>
Cr-Commit-Position: refs/heads/master@{#548858}
parent b828cce0
...@@ -317,10 +317,11 @@ ManagedDisplayInfo DisplayChangeObserver::CreateManagedDisplayInfo( ...@@ -317,10 +317,11 @@ ManagedDisplayInfo DisplayChangeObserver::CreateManagedDisplayInfo(
if (snapshot->product_code() != DisplaySnapshot::kInvalidProductCode) { if (snapshot->product_code() != DisplaySnapshot::kInvalidProductCode) {
uint16_t manufacturer_id = 0; uint16_t manufacturer_id = 0;
uint16_t product_id = 0; uint16_t product_id = 0;
SplitProductCodeInManufacturerIdAndProductId(snapshot->product_code(), EdidParser::SplitProductCodeInManufacturerIdAndProductId(
&manufacturer_id, &product_id); snapshot->product_code(), &manufacturer_id, &product_id);
new_info.set_manufacturer_id(ManufacturerIdToString(manufacturer_id)); new_info.set_manufacturer_id(
new_info.set_product_id(ProductIdToString(product_id)); EdidParser::ManufacturerIdToString(manufacturer_id));
new_info.set_product_id(EdidParser::ProductIdToString(product_id));
} }
new_info.set_year_of_manufacture(snapshot->year_of_manufacture()); new_info.set_year_of_manufacture(snapshot->year_of_manufacture());
......
This diff is collapsed.
...@@ -11,77 +11,68 @@ ...@@ -11,77 +11,68 @@
#include <vector> #include <vector>
#include "base/compiler_specific.h" #include "base/compiler_specific.h"
#include "base/optional.h"
#include "third_party/skia/include/core/SkColorSpace.h"
#include "ui/display/util/display_util_export.h" #include "ui/display/util/display_util_export.h"
#include "ui/gfx/geometry/size.h"
namespace gfx {
class Size;
}
struct SkColorSpacePrimaries;
// EDID (Extended Display Identification Data) is a format for monitor
// metadata. This provides a parser for the data.
namespace display { namespace display {
// Generates the display id and product id for the pair of |edid| and |index|, // This class parses a EDID (Extended Display Identification Data) binary blob
// and store in |display_id_out| and |product_code_out|. Returns true if the // passed on constructor, and provides access to the parsed information, plus
// display id is successfully generated, or false otherwise. // a few utility postprocessings.
DISPLAY_UTIL_EXPORT bool GetDisplayIdFromEDID(const std::vector<uint8_t>& edid, class DISPLAY_UTIL_EXPORT EdidParser {
uint8_t index, public:
int64_t* display_id_out, explicit EdidParser(const std::vector<uint8_t>& edid_blob);
int64_t* product_code_out); ~EdidParser();
// Parses |edid| as EDID data and stores extracted data into |manufacturer_id|, uint16_t manufacturer_id() const { return manufacturer_id_; }
// |product_id|, |human_readable_name|, |active_pixel_out| and uint16_t product_id() const { return product_id_; }
// |physical_display_size_out|, then returns true. nullptr can be passed for const std::string& display_name() const { return display_name_; }
// unwanted output parameters. Some devices (especially internal displays) may const gfx::Size& active_pixel_size() const { return active_pixel_size_; }
// not have the field for |human_readable_name|, and it will return true in int32_t year_of_manufacture() const { return year_of_manufacture_; }
// that case. bool has_overscan_flag() const { return overscan_flag_.has_value(); }
DISPLAY_UTIL_EXPORT bool ParseOutputDeviceData( bool overscan_flag() const { return overscan_flag_.value(); }
const std::vector<uint8_t>& edid, double gamma() const { return gamma_; }
uint16_t* manufacturer_id, int32_t bits_per_channel() const { return bits_per_channel_; }
uint16_t* product_id, const SkColorSpacePrimaries& primaries() const { return primaries_; }
std::string* human_readable_name,
gfx::Size* active_pixel_out, // Returns a 32-bit identifier for this display |manufacturer_id_| and
gfx::Size* physical_display_size_out); // |product_id_|.
uint32_t GetProductCode() const;
// Splits the |product_code| (as returned by GetDisplayIdFromEDID()) into its
// constituents |manufacturer_id| and |product_id|. // Generates a unique display id out of a mix of |manufacturer_id_|, hashed
DISPLAY_UTIL_EXPORT void SplitProductCodeInManufacturerIdAndProductId( // |display_name_| if available, and |output_index|.
int64_t product_code, int64_t GetDisplayId(uint8_t output_index) const;
uint16_t* manufacturer_id,
uint16_t* product_id); // Splits the |product_code| (as returned by GetDisplayId()) into its
// constituents |manufacturer_id| and |product_id|.
// Extracts the three letter Manufacturer ID out of |manufacturer_id|. static void SplitProductCodeInManufacturerIdAndProductId(
DISPLAY_UTIL_EXPORT std::string ManufacturerIdToString( int64_t product_code,
uint16_t manufacturer_id); uint16_t* manufacturer_id,
uint16_t* product_id);
// Extracts the 2 Byte Product ID as hex out of |product_id|. // Extracts the three letter Manufacturer ID out of |manufacturer_id|.
DISPLAY_UTIL_EXPORT std::string ProductIdToString(uint16_t product_id); static std::string ManufacturerIdToString(uint16_t manufacturer_id);
// Extracts the 2 Byte Product ID as hex out of |product_id|.
DISPLAY_UTIL_EXPORT bool ParseOutputOverscanFlag( static std::string ProductIdToString(uint16_t product_id);
const std::vector<uint8_t>& edid,
bool* flag); private:
// Parses |edid_blob|, filling up as many as possible fields below.
DISPLAY_UTIL_EXPORT bool ParseYearOfManufacture( void ParseEdid(const std::vector<uint8_t>& edid);
const std::vector<uint8_t>& edid,
int32_t* year); uint16_t manufacturer_id_;
uint16_t product_id_;
// Extracts from |edid| the |primaries| chromaticity coordinates (CIE xy std::string display_name_;
// coordinates for Red, Green and Blue channels and for the White Point). // Active pixel size from the first detailed timing descriptor in the EDID.
DISPLAY_UTIL_EXPORT bool ParseChromaticityCoordinates( gfx::Size active_pixel_size_;
const std::vector<uint8_t>& edid, int32_t year_of_manufacture_;
SkColorSpacePrimaries* primaries) WARN_UNUSED_RESULT; base::Optional<bool> overscan_flag_;
double gamma_;
// Extracts the gamma value from |edid| and returns it, or returns 0.0. int bits_per_channel_;
DISPLAY_UTIL_EXPORT bool ParseGammaValue(const std::vector<uint8_t>& edid, SkColorSpacePrimaries primaries_;
double* gamma) WARN_UNUSED_RESULT;
DISALLOW_COPY_AND_ASSIGN(EdidParser);
// Extracts the bits per channel from |edid| and returns it, or returns 0. };
DISPLAY_UTIL_EXPORT bool ParseBitsPerChannel(const std::vector<uint8_t>& edid,
int* bits_per_channel)
WARN_UNUSED_RESULT;
} // namespace display } // namespace display
......
...@@ -23,17 +23,7 @@ Environment* env = new Environment(); ...@@ -23,17 +23,7 @@ Environment* env = new Environment();
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
std::vector<uint8_t> edid; std::vector<uint8_t> edid;
edid.assign(data, data + size); edid.assign(data, data + size);
uint16_t manufacturer_id, product_code; // Ctor already parses |edid|, which is what we want here.
std::string human_readable_name; display::EdidParser edid_parser(edid);
gfx::Size active_pixel_size, physical_display_size;
bool overscan;
int32_t year_of_manufacture;
display::ParseOutputDeviceData(edid, &manufacturer_id, &product_code,
&human_readable_name, &active_pixel_size,
&physical_display_size);
display::ParseOutputOverscanFlag(edid, &overscan);
display::ParseYearOfManufacture(edid, &year_of_manufacture);
return 0; return 0;
} }
This diff is collapsed.
...@@ -73,33 +73,18 @@ bool GetEDIDProperty(XID output, std::vector<uint8_t>* edid) { ...@@ -73,33 +73,18 @@ bool GetEDIDProperty(XID output, std::vector<uint8_t>* edid) {
} // namespace } // namespace
EDIDParserX11::EDIDParserX11(XID output_id) EDIDParserX11::EDIDParserX11(XID output_id) : output_id_(output_id) {
: output_id_(output_id) {
GetEDIDProperty(output_id_, &edid_); GetEDIDProperty(output_id_, &edid_);
} }
EDIDParserX11::~EDIDParserX11() { EDIDParserX11::~EDIDParserX11() {}
}
bool EDIDParserX11::GetDisplayId(uint8_t index, int64_t* out_display_id) const { bool EDIDParserX11::GetDisplayId(uint8_t index, int64_t* out_display_id) const {
if (edid_.empty()) if (edid_.empty())
return false; return false;
return GetDisplayIdFromEDID(edid_, index, out_display_id, nullptr); *out_display_id = EdidParser(edid_).GetDisplayId(output_id_);
} return true;
std::string EDIDParserX11::GetDisplayName() const {
std::string display_name;
ParseOutputDeviceData(edid_, nullptr, nullptr, &display_name, nullptr,
nullptr);
return display_name;
}
bool EDIDParserX11::GetOutputOverscanFlag(bool* out_flag) const {
if (edid_.empty())
return false;
return ParseOutputOverscanFlag(edid_, out_flag);
} }
} // namespace display } // namespace display
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "base/macros.h" #include "base/macros.h"
#include "ui/display/types/display_constants.h" #include "ui/display/types/display_constants.h"
#include "ui/display/util/display_util_export.h" #include "ui/display/util/display_util_export.h"
#include "ui/display/util/edid_parser.h"
typedef unsigned long XID; typedef unsigned long XID;
typedef XID RROutput; typedef XID RROutput;
...@@ -31,22 +32,11 @@ class DISPLAY_UTIL_EXPORT EDIDParserX11 { ...@@ -31,22 +32,11 @@ class DISPLAY_UTIL_EXPORT EDIDParserX11 {
// Returns true if successful, false otherwise. // Returns true if successful, false otherwise.
bool GetDisplayId(uint8_t index, int64_t* out_display_id) const; bool GetDisplayId(uint8_t index, int64_t* out_display_id) const;
// Generate the human readable string from EDID obtained from |output|.
// Returns an empty string upon error.
std::string GetDisplayName() const;
// Gets the overscan flag and stores to |out_flag|. Returns true if the flag
// is found. Otherwise returns false and doesn't touch |out_flag|. The output
// will produce overscan if |out_flag| is set to true, but the output may
// still produce overscan even though it returns true and |out_flag| is set to
// false.
bool GetOutputOverscanFlag(bool* out_flag) const;
XID output_id() const { return output_id_; } XID output_id() const { return output_id_; }
const std::vector<uint8_t>& edid() const { return edid_; } const std::vector<uint8_t>& edid() const { return edid_; }
private: private:
XID output_id_; const XID output_id_;
// This will be an empty vector upon failure to get the EDID from the // This will be an empty vector upon failure to get the EDID from the
// |output_id_|. // |output_id_|.
......
...@@ -382,7 +382,7 @@ std::unique_ptr<display::DisplaySnapshot> CreateDisplaySnapshot( ...@@ -382,7 +382,7 @@ std::unique_ptr<display::DisplaySnapshot> CreateDisplaySnapshot(
const base::FilePath& sys_path, const base::FilePath& sys_path,
size_t device_index, size_t device_index,
const gfx::Point& origin) { const gfx::Point& origin) {
int64_t display_id = ConnectorIndex(device_index, info->index()); const uint8_t display_index = ConnectorIndex(device_index, info->index());
const gfx::Size physical_size = const gfx::Size physical_size =
gfx::Size(info->connector()->mmWidth, info->connector()->mmHeight); gfx::Size(info->connector()->mmWidth, info->connector()->mmHeight);
const display::DisplayConnectionType type = GetDisplayType(info->connector()); const display::DisplayConnectionType type = GetDisplayType(info->connector());
...@@ -392,33 +392,31 @@ std::unique_ptr<display::DisplaySnapshot> CreateDisplaySnapshot( ...@@ -392,33 +392,31 @@ std::unique_ptr<display::DisplaySnapshot> CreateDisplaySnapshot(
HasColorCorrectionMatrix(fd, info->crtc()); HasColorCorrectionMatrix(fd, info->crtc());
const gfx::Size maximum_cursor_size = GetMaximumCursorSize(fd); const gfx::Size maximum_cursor_size = GetMaximumCursorSize(fd);
std::vector<uint8_t> edid;
std::string display_name; std::string display_name;
int64_t display_id = -1;
int64_t product_code = display::DisplaySnapshot::kInvalidProductCode; int64_t product_code = display::DisplaySnapshot::kInvalidProductCode;
int32_t year_of_manufacture = display::kInvalidYearOfManufacture; int32_t year_of_manufacture = display::kInvalidYearOfManufacture;
bool has_overscan = false; bool has_overscan = false;
gfx::ColorSpace display_color_space; gfx::ColorSpace display_color_space;
// Active pixels size from the first detailed timing descriptor in the EDID.
// This is the size of the active pixels from the first detailed timing
// descriptor in the EDID.
gfx::Size active_pixel_size; gfx::Size active_pixel_size;
ScopedDrmPropertyBlobPtr edid_blob( ScopedDrmPropertyBlobPtr edid_blob(
GetDrmPropertyBlob(fd, info->connector(), "EDID")); GetDrmPropertyBlob(fd, info->connector(), "EDID"));
std::vector<uint8_t> edid;
if (edid_blob) { if (edid_blob) {
edid.assign(static_cast<uint8_t*>(edid_blob->data), edid.assign(static_cast<uint8_t*>(edid_blob->data),
static_cast<uint8_t*>(edid_blob->data) + edid_blob->length); static_cast<uint8_t*>(edid_blob->data) + edid_blob->length);
// TODO(mcasas): GetDisplayIdFromEDID() calls ParseOutputDeviceData(), clean display::EdidParser edid_parser(edid);
// up the code and add UMA for EDID errors, https://crbug.com/821393. Also display_name = edid_parser.display_name();
// handle correctly the parsing failures of the following functions. active_pixel_size = edid_parser.active_pixel_size();
display::GetDisplayIdFromEDID(edid, display_id, &display_id, &product_code); product_code = edid_parser.GetProductCode();
display::ParseOutputDeviceData(edid, nullptr, nullptr, &display_name, display_id = edid_parser.GetDisplayId(display_index);
&active_pixel_size, nullptr); year_of_manufacture = edid_parser.year_of_manufacture();
display::ParseYearOfManufacture(edid, &year_of_manufacture); has_overscan =
display::ParseOutputOverscanFlag(edid, &has_overscan); edid_parser.has_overscan_flag() && edid_parser.overscan_flag();
display_color_space = GetColorSpaceFromEdid(edid_parser);
display_color_space = GetColorSpaceFromEdid(edid);
} else { } else {
VLOG(1) << "Failed to get EDID blob for connector " VLOG(1) << "Failed to get EDID blob for connector "
<< info->connector()->connector_id; << info->connector()->connector_id;
...@@ -638,10 +636,8 @@ std::vector<OverlayCheckReturn_Params> CreateParamsFromOverlayStatusList( ...@@ -638,10 +636,8 @@ std::vector<OverlayCheckReturn_Params> CreateParamsFromOverlayStatusList(
return params; return params;
} }
gfx::ColorSpace GetColorSpaceFromEdid(const std::vector<uint8_t>& edid) { gfx::ColorSpace GetColorSpaceFromEdid(const display::EdidParser& edid_parser) {
SkColorSpacePrimaries primaries = {0}; const SkColorSpacePrimaries primaries = edid_parser.primaries();
if (!display::ParseChromaticityCoordinates(edid, &primaries))
return gfx::ColorSpace();
// Sanity check: primaries should verify By <= Ry <= Gy, Bx <= Rx and Gx <= // Sanity check: primaries should verify By <= Ry <= Gy, Bx <= Rx and Gx <=
// Rx, to guarantee that the R, G and B colors are each in the correct region. // Rx, to guarantee that the R, G and B colors are each in the correct region.
...@@ -677,8 +673,8 @@ gfx::ColorSpace GetColorSpaceFromEdid(const std::vector<uint8_t>& edid) { ...@@ -677,8 +673,8 @@ gfx::ColorSpace GetColorSpaceFromEdid(const std::vector<uint8_t>& edid) {
if (!primaries.toXYZD50(&color_space_as_matrix)) if (!primaries.toXYZD50(&color_space_as_matrix))
return gfx::ColorSpace(); return gfx::ColorSpace();
double gamma = 0.0; const double gamma = edid_parser.gamma();
if (!display::ParseGammaValue(edid, &gamma)) if (gamma < 1.0)
return gfx::ColorSpace(); return gfx::ColorSpace();
SkColorSpaceTransferFn transfer = {gamma, 1.f, 0.f, 0.f, 0.f, 0.f, 0.f}; SkColorSpaceTransferFn transfer = {gamma, 1.f, 0.f, 0.f, 0.f, 0.f, 0.f};
......
...@@ -21,6 +21,7 @@ typedef struct _drmModeModeInfo drmModeModeInfo; ...@@ -21,6 +21,7 @@ typedef struct _drmModeModeInfo drmModeModeInfo;
namespace display { namespace display {
class DisplayMode; class DisplayMode;
class EdidParser;
} // namespace display } // namespace display
namespace gfx { namespace gfx {
...@@ -119,9 +120,9 @@ OverlayStatusList CreateOverlayStatusListFrom( ...@@ -119,9 +120,9 @@ OverlayStatusList CreateOverlayStatusListFrom(
std::vector<OverlayCheckReturn_Params> CreateParamsFromOverlayStatusList( std::vector<OverlayCheckReturn_Params> CreateParamsFromOverlayStatusList(
const OverlayStatusList& returns); const OverlayStatusList& returns);
// Parses |edid| to extract a gfx::ColorSpace which will be IsValid() if both // Uses |edid_parser| to extract a gfx::ColorSpace which will be IsValid() if
// gamma and the color primaries were correctly found. // both gamma and the color primaries were correctly found.
gfx::ColorSpace GetColorSpaceFromEdid(const std::vector<uint8_t>& edid); gfx::ColorSpace GetColorSpaceFromEdid(const display::EdidParser& edid_parser);
} // namespace ui } // namespace ui
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "ui/display/types/display_snapshot.h" #include "ui/display/types/display_snapshot.h"
#include "ui/display/util/edid_parser.h"
#include "ui/gfx/geometry/size.h" #include "ui/gfx/geometry/size.h"
#include "ui/ozone/common/gpu/ozone_gpu_message_params.h" #include "ui/ozone/common/gpu/ozone_gpu_message_params.h"
...@@ -314,8 +315,8 @@ TEST_F(DrmUtilTest, GetColorSpaceFromEdid) { ...@@ -314,8 +315,8 @@ TEST_F(DrmUtilTest, GetColorSpaceFromEdid) {
hpz32x_toXYZ50_matrix.setRowMajord(hpz32x_toXYZ50_coeffs); hpz32x_toXYZ50_matrix.setRowMajord(hpz32x_toXYZ50_coeffs);
const gfx::ColorSpace hpz32x_color_space = gfx::ColorSpace::CreateCustom( const gfx::ColorSpace hpz32x_color_space = gfx::ColorSpace::CreateCustom(
hpz32x_toXYZ50_matrix, SkColorSpaceTransferFn({2.2, 1, 0, 0, 0, 0, 0})); hpz32x_toXYZ50_matrix, SkColorSpaceTransferFn({2.2, 1, 0, 0, 0, 0, 0}));
EXPECT_STREQ(hpz32x_color_space.ToString().c_str(), EXPECT_EQ(hpz32x_color_space.ToString(),
GetColorSpaceFromEdid(hpz32x_edid).ToString().c_str()); GetColorSpaceFromEdid(display::EdidParser(hpz32x_edid)).ToString());
const std::vector<uint8_t> samus_edid(kSamus, kSamus + arraysize(kSamus) - 1); const std::vector<uint8_t> samus_edid(kSamus, kSamus + arraysize(kSamus) - 1);
const double samus_toXYZ50_coeffs[] = {0.41211, 0.39743, 0.15468, 0., const double samus_toXYZ50_coeffs[] = {0.41211, 0.39743, 0.15468, 0.,
...@@ -325,8 +326,8 @@ TEST_F(DrmUtilTest, GetColorSpaceFromEdid) { ...@@ -325,8 +326,8 @@ TEST_F(DrmUtilTest, GetColorSpaceFromEdid) {
samus_toXYZ50_matrix.setRowMajord(samus_toXYZ50_coeffs); samus_toXYZ50_matrix.setRowMajord(samus_toXYZ50_coeffs);
const gfx::ColorSpace samus_color_space = gfx::ColorSpace::CreateCustom( const gfx::ColorSpace samus_color_space = gfx::ColorSpace::CreateCustom(
samus_toXYZ50_matrix, SkColorSpaceTransferFn({2.5, 1, 0, 0, 0, 0, 0})); samus_toXYZ50_matrix, SkColorSpaceTransferFn({2.5, 1, 0, 0, 0, 0, 0}));
EXPECT_STREQ(samus_color_space.ToString().c_str(), EXPECT_EQ(samus_color_space.ToString(),
GetColorSpaceFromEdid(samus_edid).ToString().c_str()); GetColorSpaceFromEdid(display::EdidParser(samus_edid)).ToString());
const std::vector<uint8_t> eve_edid(kEve, kEve + arraysize(kEve) - 1); const std::vector<uint8_t> eve_edid(kEve, kEve + arraysize(kEve) - 1);
const double eve_toXYZ50_coeffs[] = {0.444601, 0.377972, 0.141646, 0., const double eve_toXYZ50_coeffs[] = {0.444601, 0.377972, 0.141646, 0.,
...@@ -336,35 +337,37 @@ TEST_F(DrmUtilTest, GetColorSpaceFromEdid) { ...@@ -336,35 +337,37 @@ TEST_F(DrmUtilTest, GetColorSpaceFromEdid) {
eve_toXYZ50_matrix.setRowMajord(eve_toXYZ50_coeffs); eve_toXYZ50_matrix.setRowMajord(eve_toXYZ50_coeffs);
const gfx::ColorSpace eve_color_space = gfx::ColorSpace::CreateCustom( const gfx::ColorSpace eve_color_space = gfx::ColorSpace::CreateCustom(
eve_toXYZ50_matrix, SkColorSpaceTransferFn({2.2, 1, 0, 0, 0, 0, 0})); eve_toXYZ50_matrix, SkColorSpaceTransferFn({2.2, 1, 0, 0, 0, 0, 0}));
EXPECT_STREQ(eve_color_space.ToString().c_str(), EXPECT_EQ(eve_color_space.ToString(),
GetColorSpaceFromEdid(eve_edid).ToString().c_str()); GetColorSpaceFromEdid(display::EdidParser(eve_edid)).ToString());
const std::vector<uint8_t> no_gamma_edid( const std::vector<uint8_t> no_gamma_edid(
kEdidWithNoGamma, kEdidWithNoGamma + arraysize(kEdidWithNoGamma) - 1); kEdidWithNoGamma, kEdidWithNoGamma + arraysize(kEdidWithNoGamma) - 1);
const gfx::ColorSpace no_gamma_color_space = const gfx::ColorSpace no_gamma_color_space =
GetColorSpaceFromEdid(no_gamma_edid); GetColorSpaceFromEdid(display::EdidParser(no_gamma_edid));
EXPECT_FALSE(no_gamma_color_space.IsValid()); EXPECT_FALSE(no_gamma_color_space.IsValid());
} }
TEST_F(DrmUtilTest, GetInvalidColorSpaceFromEdid) { TEST_F(DrmUtilTest, GetInvalidColorSpaceFromEdid) {
const std::vector<uint8_t> empty_edid; const std::vector<uint8_t> empty_edid;
EXPECT_EQ(gfx::ColorSpace(), GetColorSpaceFromEdid(empty_edid)); EXPECT_EQ(gfx::ColorSpace(),
GetColorSpaceFromEdid(display::EdidParser(empty_edid)));
const std::vector<uint8_t> invalid_edid( const std::vector<uint8_t> invalid_edid(
kInvalidEdid, kInvalidEdid + arraysize(kInvalidEdid) - 1); kInvalidEdid, kInvalidEdid + arraysize(kInvalidEdid) - 1);
const gfx::ColorSpace invalid_color_space = const gfx::ColorSpace invalid_color_space =
GetColorSpaceFromEdid(invalid_edid); GetColorSpaceFromEdid(display::EdidParser(invalid_edid));
EXPECT_FALSE(invalid_color_space.IsValid()); EXPECT_FALSE(invalid_color_space.IsValid());
const std::vector<uint8_t> sst210_edid(kSST210, const std::vector<uint8_t> sst210_edid(kSST210,
kSST210 + arraysize(kSST210) - 1); kSST210 + arraysize(kSST210) - 1);
const gfx::ColorSpace sst210_color_space = GetColorSpaceFromEdid(sst210_edid); const gfx::ColorSpace sst210_color_space =
GetColorSpaceFromEdid(display::EdidParser(sst210_edid));
EXPECT_FALSE(sst210_color_space.IsValid()) << sst210_color_space.ToString(); EXPECT_FALSE(sst210_color_space.IsValid()) << sst210_color_space.ToString();
const std::vector<uint8_t> sst210_edid_2( const std::vector<uint8_t> sst210_edid_2(
kSST210Corrected, kSST210Corrected + arraysize(kSST210Corrected) - 1); kSST210Corrected, kSST210Corrected + arraysize(kSST210Corrected) - 1);
const gfx::ColorSpace sst210_color_space_2 = const gfx::ColorSpace sst210_color_space_2 =
GetColorSpaceFromEdid(sst210_edid_2); GetColorSpaceFromEdid(display::EdidParser(sst210_edid_2));
EXPECT_FALSE(sst210_color_space_2.IsValid()) EXPECT_FALSE(sst210_color_space_2.IsValid())
<< sst210_color_space_2.ToString(); << sst210_color_space_2.ToString();
...@@ -372,7 +375,7 @@ TEST_F(DrmUtilTest, GetInvalidColorSpaceFromEdid) { ...@@ -372,7 +375,7 @@ TEST_F(DrmUtilTest, GetInvalidColorSpaceFromEdid) {
kBrokenBluePrimaries, kBrokenBluePrimaries,
kBrokenBluePrimaries + arraysize(kBrokenBluePrimaries) - 1); kBrokenBluePrimaries + arraysize(kBrokenBluePrimaries) - 1);
const gfx::ColorSpace broken_blue_color_space = const gfx::ColorSpace broken_blue_color_space =
GetColorSpaceFromEdid(broken_blue_edid); GetColorSpaceFromEdid(display::EdidParser(broken_blue_edid));
EXPECT_FALSE(broken_blue_color_space.IsValid()) EXPECT_FALSE(broken_blue_color_space.IsValid())
<< broken_blue_color_space.ToString(); << broken_blue_color_space.ToString();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment