frame_subscriber.h 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright (c) 2015 GitHub, Inc.
  2. // Use of this source code is governed by the MIT license that can be
  3. // found in the LICENSE file.
  4. #ifndef ELECTRON_SHELL_BROWSER_API_FRAME_SUBSCRIBER_H_
  5. #define ELECTRON_SHELL_BROWSER_API_FRAME_SUBSCRIBER_H_
  6. #include <memory>
  7. #include <string>
  8. #include "base/callback.h"
  9. #include "base/memory/weak_ptr.h"
  10. #include "components/viz/host/client_frame_sink_video_capturer.h"
  11. #include "content/public/browser/web_contents.h"
  12. #include "content/public/browser/web_contents_observer.h"
  13. #include "media/capture/mojom/video_capture_buffer.mojom-forward.h"
  14. #include "mojo/public/cpp/bindings/pending_remote.h"
  15. #include "v8/include/v8.h"
  16. namespace gfx {
  17. class Image;
  18. class Rect;
  19. } // namespace gfx
  20. namespace electron {
  21. namespace api {
  22. class WebContents;
  23. class FrameSubscriber : public content::WebContentsObserver,
  24. public viz::mojom::FrameSinkVideoConsumer {
  25. public:
  26. using FrameCaptureCallback =
  27. base::RepeatingCallback<void(const gfx::Image&, const gfx::Rect&)>;
  28. FrameSubscriber(content::WebContents* web_contents,
  29. const FrameCaptureCallback& callback,
  30. bool only_dirty);
  31. ~FrameSubscriber() override;
  32. // disable copy
  33. FrameSubscriber(const FrameSubscriber&) = delete;
  34. FrameSubscriber& operator=(const FrameSubscriber&) = delete;
  35. private:
  36. void AttachToHost(content::RenderWidgetHost* host);
  37. void DetachFromHost();
  38. void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
  39. void RenderViewDeleted(content::RenderViewHost* host) override;
  40. void RenderViewHostChanged(content::RenderViewHost* old_host,
  41. content::RenderViewHost* new_host) override;
  42. // viz::mojom::FrameSinkVideoConsumer implementation.
  43. void OnFrameCaptured(
  44. ::media::mojom::VideoBufferHandlePtr data,
  45. ::media::mojom::VideoFrameInfoPtr info,
  46. const gfx::Rect& content_rect,
  47. mojo::PendingRemote<viz::mojom::FrameSinkVideoConsumerFrameCallbacks>
  48. callbacks) override;
  49. void OnStopped() override;
  50. void OnLog(const std::string& message) override;
  51. void Done(const gfx::Rect& damage, const SkBitmap& frame);
  52. // Get the pixel size of render view.
  53. gfx::Size GetRenderViewSize() const;
  54. FrameCaptureCallback callback_;
  55. bool only_dirty_;
  56. content::RenderWidgetHost* host_;
  57. std::unique_ptr<viz::ClientFrameSinkVideoCapturer> video_capturer_;
  58. base::WeakPtrFactory<FrameSubscriber> weak_ptr_factory_{this};
  59. };
  60. } // namespace api
  61. } // namespace electron
  62. #endif // ELECTRON_SHELL_BROWSER_API_FRAME_SUBSCRIBER_H_