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") {
sources = [
"media_image_manager_unittest.cc",
"media_position_unittest.cc",
"struct_traits_unittest.cc",
]
deps = [
":cpp",
"//base",
"//mojo/public/cpp/test_support:test_utils",
"//services/media_session/public/mojom",
"//skia",
"//testing/gtest",
]
}
......
......@@ -51,21 +51,45 @@ bool StructTraits<media_session::mojom::MediaMetadataDataView,
const base::span<const uint8_t>
StructTraits<media_session::mojom::MediaImageBitmapDataView,
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()),
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
bool StructTraits<media_session::mojom::MediaImageBitmapDataView, SkBitmap>::
Read(media_session::mojom::MediaImageBitmapDataView data, SkBitmap* out) {
mojo::ArrayDataView<uint8_t> pixel_data;
data.GetPixelDataDataView(&pixel_data);
SkImageInfo info = SkImageInfo::Make(
data.width(), data.height(), kRGBA_8888_SkColorType, kPremul_SkAlphaType);
// Convert the mojo color type into the Skia equivalient. This will tell us
// 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()) {
// Insufficient buffer size.
return false;
......@@ -80,9 +104,11 @@ bool StructTraits<media_session::mojom::MediaImageBitmapDataView, SkBitmap>::
return false;
}
// Copy the pixels into |out|.
return out->tryAllocPixels(info) &&
bitmap.readPixels(info, out->getPixels(), out->rowBytes(), 0, 0);
// Copy the pixels into |out| and convert them to the system default color
// type if needed.
SkImageInfo out_info = info.makeColorType(kN32_SkColorType);
return out->tryAllocPixels(out_info) &&
bitmap.readPixels(out_info, out->getPixels(), out->rowBytes(), 0, 0);
}
// static
......
......@@ -65,6 +65,8 @@ struct StructTraits<media_session::mojom::MediaImageBitmapDataView, SkBitmap> {
static const base::span<const uint8_t> pixel_data(const SkBitmap& r);
static int width(const SkBitmap& r) { return r.width(); }
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,
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";
import "ui/gfx/geometry/mojom/geometry.mojom";
import "url/mojom/url.mojom";
// Next MinVersion: 4
// Next MinVersion: 6
[Extensible]
enum MediaPlaybackState {
......@@ -61,13 +61,21 @@ struct MediaMetadata {
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
// use it in ARC and we do not use ArcBitmap because we need to use it in the
// service.
struct MediaImageBitmap {
int32 width;
int32 height;
array<uint8> pixel_data; // Must be ARGB_8888
array<uint8> pixel_data;
[MinVersion=5] MediaImageBitmapColorType color_type;
};
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