#include "services/media_session/public/cpp/media_session_mojom_traits.h"
#include "base/compiler_specific.h"
#include "mojo/public/cpp/base/string16_mojom_traits.h"
#include "mojo/public/cpp/base/time_mojom_traits.h"
#include "services/media_session/public/cpp/chapter_information.h"
#include "ui/gfx/geometry/mojom/geometry_mojom_traits.h"
#include "url/mojom/url_gurl_mojom_traits.h"
namespace mojo {
bool StructTraits<media_session::mojom::MediaImageDataView,
media_session::MediaImage>::
Read(media_session::mojom::MediaImageDataView data,
media_session::MediaImage* out) {
if (!data.ReadSrc(&out->src))
return false;
if (!data.ReadType(&out->type))
return false;
if (!data.ReadSizes(&out->sizes))
return false;
return true;
}
bool StructTraits<media_session::mojom::MediaMetadataDataView,
media_session::MediaMetadata>::
Read(media_session::mojom::MediaMetadataDataView data,
media_session::MediaMetadata* out) {
if (!data.ReadTitle(&out->title))
return false;
if (!data.ReadArtist(&out->artist))
return false;
if (!data.ReadAlbum(&out->album))
return false;
if (!data.ReadChapters(&out->chapters)) {
return false;
}
if (!data.ReadSourceTitle(&out->source_title))
return false;
return true;
}
const base::span<const uint8_t>
StructTraits<media_session::mojom::MediaImageBitmapDataView,
SkBitmap>::pixel_data(const SkBitmap& r) {
return UNSAFE_TODO(
base::span(static_cast<uint8_t*>(r.getPixels()), r.computeByteSize()));
}
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();
}
}
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);
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()) {
return false;
}
SkBitmap bitmap;
if (!bitmap.installPixels(info, const_cast<uint8_t*>(pixel_data.data()),
info.minRowBytes())) {
return false;
}
SkImageInfo out_info = info.makeColorType(kN32_SkColorType);
return out->tryAllocPixels(out_info) &&
bitmap.readPixels(out_info, out->getPixels(), out->rowBytes(), 0, 0);
}
void StructTraits<media_session::mojom::MediaImageBitmapDataView,
SkBitmap>::SetToNull(SkBitmap* out) {
out->reset();
}
bool StructTraits<media_session::mojom::MediaPositionDataView,
media_session::MediaPosition>::
Read(media_session::mojom::MediaPositionDataView data,
media_session::MediaPosition* out) {
if (!data.ReadDuration(&out->duration_))
return false;
if (!data.ReadPosition(&out->position_))
return false;
if (!data.ReadLastUpdatedTime(&out->last_updated_time_))
return false;
out->playback_rate_ = data.playback_rate();
out->end_of_media_ = data.end_of_media();
return true;
}
bool StructTraits<media_session::mojom::ChapterInformationDataView,
media_session::ChapterInformation>::
Read(media_session::mojom::ChapterInformationDataView data,
media_session::ChapterInformation* out) {
if (!data.ReadTitle(&out->title_)) {
return false;
}
if (!data.ReadStartTime(&out->startTime_)) {
return false;
}
if (!data.ReadArtwork(&out->artwork_)) {
return false;
}
return true;
}
}