Commit 966ea28f authored by Becca Hughes's avatar Becca Hughes Committed by Commit Bot

[Media Session] Add color type to bitmap

Add a color type to MediaImageBitmap. The default color
type (N32) is platform specific and is an alias for either
RGBA_8888 or BGRA_8888. When deserializing we will convert
all images to the platform default. The color type tells
us the original color type of the image which may be
different if it came from ARC or Chrome.

ARC only supports RGBA_8888 and images from ARC will
fallback to RGBA_8888 which is the default value.

BUG=987814

Change-Id: I9fed118c85e29a24c232bc3adc52cdf64988bd3d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1717168
Commit-Queue: Becca Hughes <beccahughes@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#681878}
parent 46d3cdb6
...@@ -71,11 +71,15 @@ source_set("tests") { ...@@ -71,11 +71,15 @@ source_set("tests") {
sources = [ sources = [
"media_image_manager_unittest.cc", "media_image_manager_unittest.cc",
"media_position_unittest.cc", "media_position_unittest.cc",
"struct_traits_unittest.cc",
] ]
deps = [ deps = [
":cpp", ":cpp",
"//base", "//base",
"//mojo/public/cpp/test_support:test_utils",
"//services/media_session/public/mojom",
"//skia",
"//testing/gtest", "//testing/gtest",
] ]
} }
......
...@@ -51,21 +51,45 @@ bool StructTraits<media_session::mojom::MediaMetadataDataView, ...@@ -51,21 +51,45 @@ bool StructTraits<media_session::mojom::MediaMetadataDataView,
const base::span<const uint8_t> const base::span<const uint8_t>
StructTraits<media_session::mojom::MediaImageBitmapDataView, StructTraits<media_session::mojom::MediaImageBitmapDataView,
SkBitmap>::pixel_data(const SkBitmap& r) { SkBitmap>::pixel_data(const SkBitmap& r) {
const SkImageInfo& info = r.info();
DCHECK_EQ(info.colorType(), kRGBA_8888_SkColorType);
return base::make_span(static_cast<uint8_t*>(r.getPixels()), return base::make_span(static_cast<uint8_t*>(r.getPixels()),
r.computeByteSize()); r.computeByteSize());
} }
// static
media_session::mojom::MediaImageBitmapColorType
StructTraits<media_session::mojom::MediaImageBitmapDataView,
SkBitmap>::color_type(const SkBitmap& r) {
switch (r.info().colorType()) {
case (kRGBA_8888_SkColorType):
return media_session::mojom::MediaImageBitmapColorType::kRGBA_8888;
case (kBGRA_8888_SkColorType):
return media_session::mojom::MediaImageBitmapColorType::kBGRA_8888;
default:
NOTREACHED();
return media_session::mojom::MediaImageBitmapColorType::kRGBA_8888;
}
}
// static // static
bool StructTraits<media_session::mojom::MediaImageBitmapDataView, SkBitmap>:: bool StructTraits<media_session::mojom::MediaImageBitmapDataView, SkBitmap>::
Read(media_session::mojom::MediaImageBitmapDataView data, SkBitmap* out) { Read(media_session::mojom::MediaImageBitmapDataView data, SkBitmap* out) {
mojo::ArrayDataView<uint8_t> pixel_data; mojo::ArrayDataView<uint8_t> pixel_data;
data.GetPixelDataDataView(&pixel_data); data.GetPixelDataDataView(&pixel_data);
SkImageInfo info = SkImageInfo::Make( // Convert the mojo color type into the Skia equivalient. This will tell us
data.width(), data.height(), kRGBA_8888_SkColorType, kPremul_SkAlphaType); // what format the image is in.
SkColorType color_type;
switch (data.color_type()) {
case (media_session::mojom::MediaImageBitmapColorType::kRGBA_8888):
color_type = kRGBA_8888_SkColorType;
break;
case (media_session::mojom::MediaImageBitmapColorType::kBGRA_8888):
color_type = kBGRA_8888_SkColorType;
break;
}
SkImageInfo info = SkImageInfo::Make(data.width(), data.height(), color_type,
kPremul_SkAlphaType);
if (info.computeByteSize(info.minRowBytes()) > pixel_data.size()) { if (info.computeByteSize(info.minRowBytes()) > pixel_data.size()) {
// Insufficient buffer size. // Insufficient buffer size.
return false; return false;
...@@ -80,9 +104,11 @@ bool StructTraits<media_session::mojom::MediaImageBitmapDataView, SkBitmap>:: ...@@ -80,9 +104,11 @@ bool StructTraits<media_session::mojom::MediaImageBitmapDataView, SkBitmap>::
return false; return false;
} }
// Copy the pixels into |out|. // Copy the pixels into |out| and convert them to the system default color
return out->tryAllocPixels(info) && // type if needed.
bitmap.readPixels(info, out->getPixels(), out->rowBytes(), 0, 0); SkImageInfo out_info = info.makeColorType(kN32_SkColorType);
return out->tryAllocPixels(out_info) &&
bitmap.readPixels(out_info, out->getPixels(), out->rowBytes(), 0, 0);
} }
// static // static
......
...@@ -65,6 +65,8 @@ struct StructTraits<media_session::mojom::MediaImageBitmapDataView, SkBitmap> { ...@@ -65,6 +65,8 @@ struct StructTraits<media_session::mojom::MediaImageBitmapDataView, SkBitmap> {
static const base::span<const uint8_t> pixel_data(const SkBitmap& r); static const base::span<const uint8_t> pixel_data(const SkBitmap& r);
static int width(const SkBitmap& r) { return r.width(); } static int width(const SkBitmap& r) { return r.width(); }
static int height(const SkBitmap& r) { return r.height(); } static int height(const SkBitmap& r) { return r.height(); }
static media_session::mojom::MediaImageBitmapColorType color_type(
const SkBitmap& r);
static bool Read(media_session::mojom::MediaImageBitmapDataView data, static bool Read(media_session::mojom::MediaImageBitmapDataView data,
SkBitmap* out); SkBitmap* out);
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "mojo/public/cpp/test_support/test_utils.h"
#include "services/media_session/public/cpp/media_session_mojom_traits.h"
#include "testing/gtest/include/gtest/gtest.h"
using media_session::mojom::MediaImageBitmap;
namespace media_session {
using MojoTraitsTest = testing::Test;
TEST_F(MojoTraitsTest, ColorTypeConversion_RGBA_8888) {
SkBitmap input;
SkImageInfo info =
SkImageInfo::Make(200, 100, kRGBA_8888_SkColorType, kPremul_SkAlphaType);
input.allocPixels(info);
SkBitmap output;
ASSERT_TRUE(
mojo::test::SerializeAndDeserialize<MediaImageBitmap>(&input, &output));
// The output image should have the same properties but should have the
// color type standardised on the platform default.
EXPECT_FALSE(output.isNull());
EXPECT_EQ(kN32_SkColorType, output.info().colorType());
EXPECT_EQ(200, output.info().width());
EXPECT_EQ(100, output.info().height());
EXPECT_EQ(kPremul_SkAlphaType, output.info().alphaType());
}
TEST_F(MojoTraitsTest, ColorTypeConversion_BGRA_8888) {
SkBitmap input;
SkImageInfo info =
SkImageInfo::Make(200, 100, kBGRA_8888_SkColorType, kPremul_SkAlphaType);
input.allocPixels(info);
SkBitmap output;
ASSERT_TRUE(
mojo::test::SerializeAndDeserialize<MediaImageBitmap>(&input, &output));
// The output image should have the same properties but should have the
// color type standardised on the platform default.
EXPECT_FALSE(output.isNull());
EXPECT_EQ(kN32_SkColorType, output.info().colorType());
EXPECT_EQ(200, output.info().width());
EXPECT_EQ(100, output.info().height());
EXPECT_EQ(kPremul_SkAlphaType, output.info().alphaType());
}
} // namespace media_session
...@@ -9,7 +9,7 @@ import "mojo/public/mojom/base/time.mojom"; ...@@ -9,7 +9,7 @@ import "mojo/public/mojom/base/time.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom"; import "ui/gfx/geometry/mojom/geometry.mojom";
import "url/mojom/url.mojom"; import "url/mojom/url.mojom";
// Next MinVersion: 4 // Next MinVersion: 6
[Extensible] [Extensible]
enum MediaPlaybackState { enum MediaPlaybackState {
...@@ -61,13 +61,21 @@ struct MediaMetadata { ...@@ -61,13 +61,21 @@ struct MediaMetadata {
mojo_base.mojom.String16 source_title; mojo_base.mojom.String16 source_title;
}; };
// The color type of the bitmap.
[Extensible]
enum MediaImageBitmapColorType {
kRGBA_8888, // On Android, this is Bitmap.Config.ARGB_8888
kBGRA_8888,
};
// A bitmap image. We use this instead of SkImage or skia.image.Bitmap so we can // A bitmap image. We use this instead of SkImage or skia.image.Bitmap so we can
// use it in ARC and we do not use ArcBitmap because we need to use it in the // use it in ARC and we do not use ArcBitmap because we need to use it in the
// service. // service.
struct MediaImageBitmap { struct MediaImageBitmap {
int32 width; int32 width;
int32 height; int32 height;
array<uint8> pixel_data; // Must be ARGB_8888 array<uint8> pixel_data;
[MinVersion=5] MediaImageBitmapColorType color_type;
}; };
struct MediaPosition { struct MediaPosition {
......
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