summaryrefslogtreecommitdiff
path: root/chromium/media/renderers/video_resource_updater.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/renderers/video_resource_updater.cc')
-rw-r--r--chromium/media/renderers/video_resource_updater.cc52
1 files changed, 32 insertions, 20 deletions
diff --git a/chromium/media/renderers/video_resource_updater.cc b/chromium/media/renderers/video_resource_updater.cc
index 27678f2b65f..5667c75131c 100644
--- a/chromium/media/renderers/video_resource_updater.cc
+++ b/chromium/media/renderers/video_resource_updater.cc
@@ -13,6 +13,7 @@
#include "base/atomic_sequence_num.h"
#include "base/bind.h"
#include "base/bit_cast.h"
+#include "base/logging.h"
#include "base/memory/shared_memory_mapping.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/strings/stringprintf.h"
@@ -121,6 +122,12 @@ VideoFrameResourceType ExternalResourceTypeForHardwarePlanes(
buffer_formats[1] = gfx::BufferFormat::RG_88;
return VideoFrameResourceType::YUV;
+ case PIXEL_FORMAT_P016LE:
+ DCHECK_EQ(num_textures, 1);
+ // TODO(mcasas): Support other formats such as e.g. P012.
+ buffer_formats[0] = gfx::BufferFormat::P010;
+ return VideoFrameResourceType::RGB;
+
case PIXEL_FORMAT_UYVY:
NOTREACHED();
FALLTHROUGH;
@@ -143,7 +150,6 @@ VideoFrameResourceType ExternalResourceTypeForHardwarePlanes(
case PIXEL_FORMAT_YUV444P12:
case PIXEL_FORMAT_Y16:
case PIXEL_FORMAT_XBGR:
- case PIXEL_FORMAT_P016LE:
case PIXEL_FORMAT_UNKNOWN:
break;
}
@@ -465,9 +471,9 @@ VideoResourceUpdater::~VideoResourceUpdater() {
void VideoResourceUpdater::ObtainFrameResources(
scoped_refptr<VideoFrame> video_frame) {
- if (video_frame->metadata()->GetUnguessableToken(
- VideoFrameMetadata::OVERLAY_PLANE_ID, &overlay_plane_id_)) {
+ if (video_frame->metadata()->overlay_plane_id.has_value()) {
// This is a hole punching VideoFrame, there is nothing to display.
+ overlay_plane_id_ = *video_frame->metadata()->overlay_plane_id;
frame_resource_type_ = VideoFrameResourceType::VIDEO_HOLE;
return;
}
@@ -584,8 +590,8 @@ void VideoResourceUpdater::AppendQuads(viz::RenderPass* render_pass,
frame_resources_.size() > 3 ? frame_resources_[3].id : 0,
frame->ColorSpace(), frame_resource_offset_,
frame_resource_multiplier_, frame_bits_per_channel_);
- if (frame->metadata()->IsTrue(VideoFrameMetadata::PROTECTED_VIDEO)) {
- if (frame->metadata()->IsTrue(VideoFrameMetadata::HW_PROTECTED)) {
+ if (frame->metadata()->protected_video) {
+ if (frame->metadata()->hw_protected) {
yuv_video_quad->protected_video_type =
gfx::ProtectedVideoType::kHardwareProtected;
} else {
@@ -613,8 +619,8 @@ void VideoResourceUpdater::AppendQuads(viz::RenderPass* render_pass,
bool nearest_neighbor = false;
gfx::ProtectedVideoType protected_video_type =
gfx::ProtectedVideoType::kClear;
- if (frame->metadata()->IsTrue(VideoFrameMetadata::PROTECTED_VIDEO)) {
- if (frame->metadata()->IsTrue(VideoFrameMetadata::HW_PROTECTED))
+ if (frame->metadata()->protected_video) {
+ if (frame->metadata()->hw_protected)
protected_video_type = gfx::ProtectedVideoType::kHardwareProtected;
else
protected_video_type = gfx::ProtectedVideoType::kSoftwareProtected;
@@ -814,8 +820,7 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes(
VideoFrameExternalResources external_resources;
gfx::ColorSpace resource_color_space = video_frame->ColorSpace();
- bool copy_required =
- video_frame->metadata()->IsTrue(VideoFrameMetadata::COPY_REQUIRED);
+ bool copy_required = video_frame->metadata()->copy_required;
GLuint target = video_frame->mailbox_holder(0).texture_target;
// If |copy_required| then we will copy into a GL_TEXTURE_2D target.
@@ -857,19 +862,18 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes(
auto transfer_resource = viz::TransferableResource::MakeGL(
mailbox_holder.mailbox, GL_LINEAR, mailbox_holder.texture_target,
mailbox_holder.sync_token, plane_size,
- video_frame->metadata()->IsTrue(VideoFrameMetadata::ALLOW_OVERLAY));
+ video_frame->metadata()->allow_overlay);
transfer_resource.color_space = resource_color_space;
transfer_resource.read_lock_fences_enabled =
- video_frame->metadata()->IsTrue(
- VideoFrameMetadata::READ_LOCK_FENCES_ENABLED);
+ video_frame->metadata()->read_lock_fences_enabled;
transfer_resource.format = viz::GetResourceFormat(buffer_formats[i]);
transfer_resource.ycbcr_info = video_frame->ycbcr_info();
#if defined(OS_ANDROID)
transfer_resource.is_backed_by_surface_texture =
- video_frame->metadata()->IsTrue(VideoFrameMetadata::TEXTURE_OWNER);
- transfer_resource.wants_promotion_hint = video_frame->metadata()->IsTrue(
- VideoFrameMetadata::WANTS_PROMOTION_HINT);
+ video_frame->metadata()->texture_owner;
+ transfer_resource.wants_promotion_hint =
+ video_frame->metadata()->wants_promotion_hint;
#endif
external_resources.resources.push_back(std::move(transfer_resource));
external_resources.release_callbacks.push_back(
@@ -990,11 +994,19 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
SkBitmap sk_bitmap;
sk_bitmap.installPixels(info, software_resource->pixels(),
info.minRowBytes());
+ // This is software path, so |canvas| and |video_frame| are always
+ // backed by software.
cc::SkiaPaintCanvas canvas(sk_bitmap);
-
- // This is software path, so canvas and video_frame are always backed
- // by software.
- video_renderer_->Copy(video_frame, &canvas, nullptr);
+ cc::PaintFlags flags;
+ flags.setBlendMode(SkBlendMode::kSrc);
+ flags.setFilterQuality(kLow_SkFilterQuality);
+
+ // Note that PaintCanvasVideoRenderer::Copy would copy to the origin,
+ // not |video_frame->visible_rect|, so call Paint instead.
+ // https://crbug.com/1090435
+ video_renderer_->Paint(video_frame, &canvas,
+ gfx::RectF(video_frame->visible_rect()), flags,
+ media::kNoTransformation, nullptr);
} else {
HardwarePlaneResource* hardware_resource = plane_resource->AsHardware();
size_t bytes_per_row = viz::ResourceSizes::CheckedWidthInBytes<size_t>(
@@ -1242,7 +1254,7 @@ void VideoResourceUpdater::RecycleResource(uint32_t plane_resource_id,
if (resource_it == all_resources_.end())
return;
- if (context_provider_ && sync_token.HasData()) {
+ if ((raster_context_provider_ || context_provider_) && sync_token.HasData()) {
auto* gl = raster_context_provider_ ? raster_context_provider_->ContextGL()
: context_provider_->ContextGL();
gl->WaitSyncTokenCHROMIUM(sync_token.GetConstData());