| Index: cc/resources/video_resource_updater.cc
|
| diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc
|
| index 568c6f2b8bc6f320a95ec1e533cd30d7d1e44cd6..8d608bd6d6122961e09862fc9663d2962a2dd5e4 100644
|
| --- a/cc/resources/video_resource_updater.cc
|
| +++ b/cc/resources/video_resource_updater.cc
|
| @@ -24,11 +24,6 @@
|
| #include "third_party/skia/include/core/SkCanvas.h"
|
| #include "ui/gfx/geometry/size_conversions.h"
|
|
|
| -#if DCHECK_IS_ON()
|
| -#include "base/single_thread_task_runner.h"
|
| -#include "base/threading/thread_task_runner_handle.h"
|
| -#endif
|
| -
|
| namespace cc {
|
|
|
| namespace {
|
| @@ -124,14 +119,6 @@ class SyncTokenClientImpl : public media::VideoFrame::SyncTokenClient {
|
| gpu::SyncToken sync_token_;
|
| };
|
|
|
| -#if DCHECK_IS_ON()
|
| -void OnVideoFrameDestruct(
|
| - const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| - const base::Closure& task) {
|
| - task_runner->PostTask(FROM_HERE, task);
|
| -}
|
| -#endif
|
| -
|
| } // namespace
|
|
|
| VideoResourceUpdater::PlaneResource::PlaneResource(
|
| @@ -139,48 +126,26 @@ VideoResourceUpdater::PlaneResource::PlaneResource(
|
| const gfx::Size& resource_size,
|
| ResourceFormat resource_format,
|
| gpu::Mailbox mailbox)
|
| - : resource_id(resource_id),
|
| - resource_size(resource_size),
|
| - resource_format(resource_format),
|
| - mailbox(mailbox),
|
| - ref_count(0),
|
| - frame_ptr(nullptr),
|
| -#if DCHECK_IS_ON()
|
| - destructed(false),
|
| -#endif
|
| - plane_index(0u) {
|
| -}
|
| + : resource_id_(resource_id),
|
| + resource_size_(resource_size),
|
| + resource_format_(resource_format),
|
| + mailbox_(mailbox) {}
|
|
|
| VideoResourceUpdater::PlaneResource::PlaneResource(const PlaneResource& other) =
|
| default;
|
|
|
| -bool VideoResourceUpdater::PlaneResourceMatchesUniqueID(
|
| - const PlaneResource& plane_resource,
|
| - const media::VideoFrame* video_frame,
|
| - size_t plane_index) {
|
| - bool matched = plane_resource.frame_ptr == video_frame &&
|
| - plane_resource.plane_index == plane_index &&
|
| - plane_resource.timestamp == video_frame->timestamp();
|
| -#if DCHECK_IS_ON()
|
| - if ((plane_index == 0) && matched) {
|
| - DCHECK(!plane_resource.destructed)
|
| - << "ERROR: reused the destructed resource."
|
| - << " timestamp = " << plane_resource.timestamp;
|
| - }
|
| -#endif
|
| - return matched;
|
| +bool VideoResourceUpdater::PlaneResource::Matches(int unique_frame_id,
|
| + size_t plane_index) {
|
| + return has_unique_frame_id_and_plane_index_ &&
|
| + unique_frame_id_ == unique_frame_id && plane_index_ == plane_index;
|
| }
|
|
|
| -void VideoResourceUpdater::SetPlaneResourceUniqueId(
|
| - const media::VideoFrame* video_frame,
|
| - size_t plane_index,
|
| - PlaneResource* plane_resource) {
|
| - plane_resource->frame_ptr = video_frame;
|
| - plane_resource->plane_index = plane_index;
|
| - plane_resource->timestamp = video_frame->timestamp();
|
| -#if DCHECK_IS_ON()
|
| - plane_resource->destructed = false;
|
| -#endif
|
| +void VideoResourceUpdater::PlaneResource::SetUniqueId(int unique_frame_id,
|
| + size_t plane_index) {
|
| + DCHECK_EQ(ref_count_, 1);
|
| + plane_index_ = plane_index;
|
| + unique_frame_id_ = unique_frame_id;
|
| + has_unique_frame_id_and_plane_index_ = true;
|
| }
|
|
|
| VideoFrameExternalResources::VideoFrameExternalResources()
|
| @@ -202,7 +167,7 @@ VideoResourceUpdater::VideoResourceUpdater(ContextProvider* context_provider,
|
|
|
| VideoResourceUpdater::~VideoResourceUpdater() {
|
| for (const PlaneResource& plane_resource : all_resources_)
|
| - resource_provider_->DeleteResource(plane_resource.resource_id);
|
| + resource_provider_->DeleteResource(plane_resource.resource_id());
|
| }
|
|
|
| VideoResourceUpdater::ResourceList::iterator
|
| @@ -238,8 +203,8 @@ VideoResourceUpdater::AllocateResource(const gfx::Size& plane_size,
|
| }
|
|
|
| void VideoResourceUpdater::DeleteResource(ResourceList::iterator resource_it) {
|
| - DCHECK_EQ(resource_it->ref_count, 0);
|
| - resource_provider_->DeleteResource(resource_it->resource_id);
|
| + DCHECK(!resource_it->has_refs());
|
| + resource_provider_->DeleteResource(resource_it->resource_id());
|
| all_resources_.erase(resource_it);
|
| }
|
|
|
| @@ -342,7 +307,7 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
|
|
|
| // Drop recycled resources that are the wrong format.
|
| for (auto it = all_resources_.begin(); it != all_resources_.end();) {
|
| - if (it->ref_count == 0 && it->resource_format != output_resource_format)
|
| + if (!it->has_refs() && it->resource_format() != output_resource_format)
|
| DeleteResource(it++);
|
| else
|
| ++it;
|
| @@ -362,9 +327,9 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
|
| // Try recycle a previously-allocated resource.
|
| ResourceList::iterator resource_it = all_resources_.end();
|
| for (auto it = all_resources_.begin(); it != all_resources_.end(); ++it) {
|
| - if (it->resource_size == output_plane_resource_size &&
|
| - it->resource_format == output_resource_format) {
|
| - if (PlaneResourceMatchesUniqueID(*it, video_frame.get(), i)) {
|
| + if (it->resource_size() == output_plane_resource_size &&
|
| + it->resource_format() == output_resource_format) {
|
| + if (it->Matches(video_frame->unique_id(), i)) {
|
| // Bingo, we found a resource that already contains the data we are
|
| // planning to put in it. It's safe to reuse it even if
|
| // resource_provider_ holds some references to it, because those
|
| @@ -378,8 +343,8 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
|
| // codereview.chromium.org/145273021.
|
| const bool in_use =
|
| software_compositor &&
|
| - resource_provider_->InUseByConsumer(it->resource_id);
|
| - if (it->ref_count == 0 && !in_use) {
|
| + resource_provider_->InUseByConsumer(it->resource_id());
|
| + if (!it->has_refs() && !in_use) {
|
| // We found a resource with the correct size that we can overwrite.
|
| resource_it = it;
|
| }
|
| @@ -396,14 +361,14 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
|
| if (resource_it == all_resources_.end())
|
| break;
|
|
|
| - ++resource_it->ref_count;
|
| + resource_it->add_ref();
|
| plane_resources.push_back(resource_it);
|
| }
|
|
|
| if (plane_resources.size() != output_plane_count) {
|
| // Allocation failed, nothing will be returned so restore reference counts.
|
| for (ResourceList::iterator resource_it : plane_resources)
|
| - --resource_it->ref_count;
|
| + resource_it->remove_ref();
|
| return VideoFrameExternalResources();
|
| }
|
|
|
| @@ -412,34 +377,27 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
|
| if (software_compositor) {
|
| DCHECK_EQ(plane_resources.size(), 1u);
|
| PlaneResource& plane_resource = *plane_resources[0];
|
| - DCHECK_EQ(plane_resource.resource_format, kRGBResourceFormat);
|
| - DCHECK(plane_resource.mailbox.IsZero());
|
| + DCHECK_EQ(plane_resource.resource_format(), kRGBResourceFormat);
|
| + DCHECK(plane_resource.mailbox().IsZero());
|
|
|
| - if (!PlaneResourceMatchesUniqueID(plane_resource, video_frame.get(), 0)) {
|
| + if (!plane_resource.Matches(video_frame->unique_id(), 0)) {
|
| // We need to transfer data from |video_frame| to the plane resource.
|
| if (!video_renderer_)
|
| video_renderer_.reset(new media::SkCanvasVideoRenderer);
|
|
|
| ResourceProvider::ScopedWriteLockSoftware lock(
|
| - resource_provider_, plane_resource.resource_id);
|
| + resource_provider_, plane_resource.resource_id());
|
| SkCanvas canvas(lock.sk_bitmap());
|
| // This is software path, so canvas and video_frame are always backed
|
| // by software.
|
| video_renderer_->Copy(video_frame, &canvas, media::Context3D());
|
| - SetPlaneResourceUniqueId(video_frame.get(), 0, &plane_resource);
|
| -#if DCHECK_IS_ON()
|
| - // Add VideoFrame destructor callback.
|
| - video_frame->AddDestructionObserver(base::Bind(
|
| - &OnVideoFrameDestruct, base::ThreadTaskRunnerHandle::Get(),
|
| - base::Bind(&VideoResourceUpdater::MarkOldResource, AsWeakPtr(),
|
| - base::Unretained(video_frame.get()),
|
| - video_frame->timestamp())));
|
| -#endif
|
| + plane_resource.SetUniqueId(video_frame->unique_id(), 0);
|
| }
|
|
|
| - external_resources.software_resources.push_back(plane_resource.resource_id);
|
| + external_resources.software_resources.push_back(
|
| + plane_resource.resource_id());
|
| external_resources.software_release_callback =
|
| - base::Bind(&RecycleResource, AsWeakPtr(), plane_resource.resource_id);
|
| + base::Bind(&RecycleResource, AsWeakPtr(), plane_resource.resource_id());
|
| external_resources.type = VideoFrameExternalResources::SOFTWARE_RESOURCE;
|
| return external_resources;
|
| }
|
| @@ -447,22 +405,22 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
|
| for (size_t i = 0; i < plane_resources.size(); ++i) {
|
| PlaneResource& plane_resource = *plane_resources[i];
|
| // Update each plane's resource id with its content.
|
| - DCHECK_EQ(plane_resource.resource_format,
|
| + DCHECK_EQ(plane_resource.resource_format(),
|
| resource_provider_->YuvResourceFormat(bits_per_channel));
|
|
|
| - if (!PlaneResourceMatchesUniqueID(plane_resource, video_frame.get(), i)) {
|
| + if (!plane_resource.Matches(video_frame->unique_id(), i)) {
|
| // We need to transfer data from |video_frame| to the plane resource.
|
| // TODO(reveman): Can use GpuMemoryBuffers here to improve performance.
|
|
|
| // The |resource_size_pixels| is the size of the resource we want to
|
| // upload to.
|
| - gfx::Size resource_size_pixels = plane_resource.resource_size;
|
| + gfx::Size resource_size_pixels = plane_resource.resource_size();
|
| // The |video_stride_bytes| is the width of the video frame we are
|
| // uploading (including non-frame data to fill in the stride).
|
| int video_stride_bytes = video_frame->stride(i);
|
|
|
| size_t bytes_per_row = ResourceUtil::UncheckedWidthInBytes<size_t>(
|
| - resource_size_pixels.width(), plane_resource.resource_format);
|
| + resource_size_pixels.width(), plane_resource.resource_format());
|
| // Use 4-byte row alignment (OpenGL default) for upload performance.
|
| // Assuming that GL_UNPACK_ALIGNMENT has not changed from default.
|
| size_t upload_image_stride =
|
| @@ -472,7 +430,7 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
|
| int shift = 0;
|
|
|
| // LUMINANCE_F16 uses half-floats, so we always need a conversion step.
|
| - if (plane_resource.resource_format == LUMINANCE_F16) {
|
| + if (plane_resource.resource_format() == LUMINANCE_F16) {
|
| needs_conversion = true;
|
| // Note that the current method of converting integers to half-floats
|
| // stops working if you have more than 10 bits of data.
|
| @@ -495,7 +453,7 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
|
| upload_pixels_.resize(needed_size);
|
|
|
| for (int row = 0; row < resource_size_pixels.height(); ++row) {
|
| - if (plane_resource.resource_format == LUMINANCE_F16) {
|
| + if (plane_resource.resource_format() == LUMINANCE_F16) {
|
| uint16_t* dst = reinterpret_cast<uint16_t*>(
|
| &upload_pixels_[upload_image_stride * row]);
|
| const uint16_t* src = reinterpret_cast<uint16_t*>(
|
| @@ -527,22 +485,12 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
|
| pixels = &upload_pixels_[0];
|
| }
|
|
|
| - resource_provider_->CopyToResource(plane_resource.resource_id, pixels,
|
| + resource_provider_->CopyToResource(plane_resource.resource_id(), pixels,
|
| resource_size_pixels);
|
| - SetPlaneResourceUniqueId(video_frame.get(), i, &plane_resource);
|
| -#if DCHECK_IS_ON()
|
| - // Add VideoFrame destructor callback.
|
| - if (i == 0) {
|
| - video_frame->AddDestructionObserver(base::Bind(
|
| - &OnVideoFrameDestruct, base::ThreadTaskRunnerHandle::Get(),
|
| - base::Bind(&VideoResourceUpdater::MarkOldResource, AsWeakPtr(),
|
| - base::Unretained(video_frame.get()),
|
| - video_frame->timestamp())));
|
| - }
|
| -#endif
|
| + plane_resource.SetUniqueId(video_frame->unique_id(), i);
|
| }
|
|
|
| - if (plane_resource.resource_format == LUMINANCE_F16) {
|
| + if (plane_resource.resource_format() == LUMINANCE_F16) {
|
| // By OR-ing with 0x3800, 10-bit numbers become half-floats in the
|
| // range [0.5..1) and 9-bit numbers get the range [0.5..0.75).
|
| //
|
| @@ -566,11 +514,11 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes(
|
| }
|
|
|
| external_resources.mailboxes.push_back(
|
| - TextureMailbox(plane_resource.mailbox, gpu::SyncToken(),
|
| + TextureMailbox(plane_resource.mailbox(), gpu::SyncToken(),
|
| resource_provider_->GetResourceTextureTarget(
|
| - plane_resource.resource_id)));
|
| - external_resources.release_callbacks.push_back(
|
| - base::Bind(&RecycleResource, AsWeakPtr(), plane_resource.resource_id));
|
| + plane_resource.resource_id())));
|
| + external_resources.release_callbacks.push_back(base::Bind(
|
| + &RecycleResource, AsWeakPtr(), plane_resource.resource_id()));
|
| }
|
|
|
| external_resources.type = VideoFrameExternalResources::YUV_RESOURCE;
|
| @@ -616,10 +564,10 @@ void VideoResourceUpdater::CopyPlaneTexture(
|
| for (auto it = all_resources_.begin(); it != all_resources_.end(); ++it) {
|
| // Reuse resource if attributes match and the resource is a currently
|
| // unreferenced texture.
|
| - if (it->resource_size == output_plane_resource_size &&
|
| - it->resource_format == copy_target_format && !it->mailbox.IsZero() &&
|
| - it->ref_count == 0 &&
|
| - resource_provider_->GetTextureHint(it->resource_id) !=
|
| + if (it->resource_size() == output_plane_resource_size &&
|
| + it->resource_format() == copy_target_format &&
|
| + !it->mailbox().IsZero() && !it->has_refs() &&
|
| + resource_provider_->GetTextureHint(it->resource_id()) !=
|
| ResourceProvider::TEXTURE_HINT_IMMUTABLE) {
|
| resource = it;
|
| break;
|
| @@ -633,14 +581,15 @@ void VideoResourceUpdater::CopyPlaneTexture(
|
| true, is_immutable);
|
| }
|
|
|
| - ++resource->ref_count;
|
| + resource->add_ref();
|
|
|
| ResourceProvider::ScopedWriteLockGL lock(resource_provider_,
|
| - resource->resource_id);
|
| + resource->resource_id());
|
| uint32_t texture_id = lock.texture_id();
|
|
|
| - DCHECK_EQ(resource_provider_->GetResourceTextureTarget(resource->resource_id),
|
| - (GLenum)GL_TEXTURE_2D);
|
| + DCHECK_EQ(
|
| + resource_provider_->GetResourceTextureTarget(resource->resource_id()),
|
| + (GLenum)GL_TEXTURE_2D);
|
|
|
| gl->WaitSyncTokenCHROMIUM(mailbox_holder.sync_token.GetConstData());
|
| uint32_t src_texture_id = gl->CreateAndConsumeTextureCHROMIUM(
|
| @@ -661,11 +610,11 @@ void VideoResourceUpdater::CopyPlaneTexture(
|
| video_frame->UpdateReleaseSyncToken(&client);
|
|
|
| external_resources->mailboxes.push_back(TextureMailbox(
|
| - resource->mailbox, sync_token, GL_TEXTURE_2D, video_frame->coded_size(),
|
| + resource->mailbox(), sync_token, GL_TEXTURE_2D, video_frame->coded_size(),
|
| gfx::GpuMemoryBufferId(), false, false));
|
|
|
| external_resources->release_callbacks.push_back(
|
| - base::Bind(&RecycleResource, AsWeakPtr(), resource->resource_id));
|
| + base::Bind(&RecycleResource, AsWeakPtr(), resource->resource_id()));
|
| }
|
|
|
| VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes(
|
| @@ -728,7 +677,7 @@ void VideoResourceUpdater::RecycleResource(
|
| const ResourceList::iterator resource_it = std::find_if(
|
| updater->all_resources_.begin(), updater->all_resources_.end(),
|
| [resource_id](const PlaneResource& plane_resource) {
|
| - return plane_resource.resource_id == resource_id;
|
| + return plane_resource.resource_id() == resource_id;
|
| });
|
| if (resource_it == updater->all_resources_.end())
|
| return;
|
| @@ -740,35 +689,12 @@ void VideoResourceUpdater::RecycleResource(
|
| }
|
|
|
| if (lost_resource) {
|
| - resource_it->ref_count = 0;
|
| + resource_it->clear_refs();
|
| updater->DeleteResource(resource_it);
|
| return;
|
| }
|
|
|
| - --resource_it->ref_count;
|
| - DCHECK_GE(resource_it->ref_count, 0);
|
| -}
|
| -
|
| -#if DCHECK_IS_ON()
|
| -// static
|
| -void VideoResourceUpdater::MarkOldResource(
|
| - base::WeakPtr<VideoResourceUpdater> updater,
|
| - const media::VideoFrame* video_frame_ptr,
|
| - base::TimeDelta timestamp) {
|
| - if (!updater)
|
| - return;
|
| - const ResourceList::iterator resource_it = std::find_if(
|
| - updater->all_resources_.begin(), updater->all_resources_.end(),
|
| - [video_frame_ptr, timestamp](const PlaneResource& plane_resource) {
|
| - return plane_resource.frame_ptr == video_frame_ptr &&
|
| - plane_resource.timestamp == timestamp &&
|
| - plane_resource.plane_index == 0;
|
| - });
|
| - if (resource_it == updater->all_resources_.end())
|
| - return;
|
| -
|
| - resource_it->destructed = true;
|
| + resource_it->remove_ref();
|
| }
|
| -#endif
|
|
|
| } // namespace cc
|
|
|