1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CC_RESOURCES_VIDEO_RESOURCE_UPDATER_H_
6 #define CC_RESOURCES_VIDEO_RESOURCE_UPDATER_H_
11 #include "base/basictypes.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/time/time.h"
15 #include "cc/base/cc_export.h"
16 #include "cc/resources/release_callback_impl.h"
17 #include "cc/resources/resource_format.h"
18 #include "cc/resources/texture_mailbox.h"
19 #include "ui/gfx/geometry/size.h"
22 class SkCanvasVideoRenderer
;
27 class ContextProvider
;
28 class ResourceProvider
;
30 class CC_EXPORT VideoFrameExternalResources
{
32 // Specifies what type of data is contained in the mailboxes, as well as how
33 // many mailboxes will be present.
38 STREAM_TEXTURE_RESOURCE
,
41 #if defined(VIDEO_HOLE)
42 // TODO(danakj): Implement this with a solid color layer instead of a video
43 // frame and video layer.
45 #endif // defined(VIDEO_HOLE)
47 // TODO(danakj): Remove this and abstract TextureMailbox into
48 // "ExternalResource" that can hold a hardware or software backing.
53 std::vector
<TextureMailbox
> mailboxes
;
54 std::vector
<ReleaseCallbackImpl
> release_callbacks
;
56 // TODO(danakj): Remove these too.
57 std::vector
<unsigned> software_resources
;
58 ReleaseCallbackImpl software_release_callback
;
60 VideoFrameExternalResources();
61 ~VideoFrameExternalResources();
64 // VideoResourceUpdater is used by the video system to produce frame content as
65 // resources consumable by the compositor.
66 class CC_EXPORT VideoResourceUpdater
67 : public base::SupportsWeakPtr
<VideoResourceUpdater
> {
69 VideoResourceUpdater(ContextProvider
* context_provider
,
70 ResourceProvider
* resource_provider
);
71 ~VideoResourceUpdater();
73 VideoFrameExternalResources
CreateExternalResourcesFromVideoFrame(
74 const scoped_refptr
<media::VideoFrame
>& video_frame
);
77 struct PlaneResource
{
79 gfx::Size resource_size
;
80 ResourceFormat resource_format
;
82 // The balance between the number of times this resource has been returned
83 // from CreateForSoftwarePlanes vs released in RecycleResource.
85 // These last three members will be used for identifying the data stored in
86 // this resource, and uniquely identifies a media::VideoFrame plane. The
87 // frame pointer will only be used for pointer comparison, i.e. the
88 // underlying data will not be accessed.
89 const void* frame_ptr
;
91 base::TimeDelta timestamp
;
93 PlaneResource(unsigned resource_id
,
94 const gfx::Size
& resource_size
,
95 ResourceFormat resource_format
,
96 gpu::Mailbox mailbox
);
99 static bool PlaneResourceMatchesUniqueID(const PlaneResource
& plane_resource
,
100 const media::VideoFrame
* video_frame
,
103 static void SetPlaneResourceUniqueId(const media::VideoFrame
* video_frame
,
105 PlaneResource
* plane_resource
);
107 // This needs to be a container where iterators can be erased without
108 // invalidating other iterators.
109 typedef std::list
<PlaneResource
> ResourceList
;
110 ResourceList::iterator
AllocateResource(const gfx::Size
& plane_size
,
111 ResourceFormat format
,
113 void DeleteResource(ResourceList::iterator resource_it
);
114 bool VerifyFrame(const scoped_refptr
<media::VideoFrame
>& video_frame
);
115 VideoFrameExternalResources
CreateForHardwarePlanes(
116 const scoped_refptr
<media::VideoFrame
>& video_frame
);
117 VideoFrameExternalResources
CreateForSoftwarePlanes(
118 const scoped_refptr
<media::VideoFrame
>& video_frame
);
120 static void RecycleResource(base::WeakPtr
<VideoResourceUpdater
> updater
,
121 unsigned resource_id
,
124 BlockingTaskRunner
* main_thread_task_runner
);
125 static void ReturnTexture(base::WeakPtr
<VideoResourceUpdater
> updater
,
126 const scoped_refptr
<media::VideoFrame
>& video_frame
,
129 BlockingTaskRunner
* main_thread_task_runner
);
131 ContextProvider
* context_provider_
;
132 ResourceProvider
* resource_provider_
;
133 scoped_ptr
<media::SkCanvasVideoRenderer
> video_renderer_
;
134 std::vector
<uint8_t> upload_pixels_
;
136 // Recycle resources so that we can reduce the number of allocations and
138 ResourceList all_resources_
;
140 DISALLOW_COPY_AND_ASSIGN(VideoResourceUpdater
);
145 #endif // CC_RESOURCES_VIDEO_RESOURCE_UPDATER_H_