15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_CLIENT_GPU_VIDEO_DECODE_ACCELERATOR_HOST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_CLIENT_GPU_VIDEO_DECODE_ACCELERATOR_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/non_thread_safe.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/common/gpu/client/command_buffer_proxy_impl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_listener.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/video/video_decode_accelerator.h"
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/size.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuChannelHost;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is used to talk to VideoDecodeAccelerator in the Gpu process
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// through IPC messages.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GpuVideoDecodeAcceleratorHost
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public IPC::Listener,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public media::VideoDecodeAccelerator,
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      public CommandBufferProxyImpl::DeletionObserver,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::NonThreadSafe {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // |this| is guaranteed not to outlive |channel| and |impl|.  (See comments
29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // for |channel_| and |impl_|.)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuVideoDecodeAcceleratorHost(GpuChannelHost* channel,
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                CommandBufferProxyImpl* impl);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC::Listener implementation.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChannelError() OVERRIDE;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // media::VideoDecodeAccelerator implementation.
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual bool Initialize(media::VideoCodecProfile profile,
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                          Client* client) OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Decode(const media::BitstreamBuffer& bitstream_buffer) OVERRIDE;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AssignPictureBuffers(
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<media::PictureBuffer>& buffers) OVERRIDE;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ReusePictureBuffer(int32 picture_buffer_id) OVERRIDE;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Flush() OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Reset() OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Destroy() OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // CommandBufferProxyImpl::DeletionObserver implemetnation.
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnWillDeleteImpl() OVERRIDE;
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only Destroy() should be deleting |this|.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GpuVideoDecodeAcceleratorHost();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Notify |client_| of an error.  Posts a task to avoid re-entrancy.
56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void PostNotifyError(Error);
57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Send(IPC::Message* message);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // IPC handlers, proxying media::VideoDecodeAccelerator::Client for the GPU
61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // process.  Should not be called directly.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnBitstreamBufferProcessed(int32 bitstream_buffer_id);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnProvidePictureBuffer(uint32 num_requested_buffers,
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                              const gfx::Size& dimensions,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              uint32 texture_target);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDismissPictureBuffer(int32 picture_buffer_id);
6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void OnPictureReady(int32 picture_buffer_id,
6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      int32 bitstream_buffer_id,
6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                      const gfx::Rect& visible_rect);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnFlushDone();
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnResetDone();
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  void OnNotifyError(uint32 error);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Unowned reference to the GpuChannelHost to send IPC messages to the GPU
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // process.  |channel_| outlives |impl_|, so the reference is always valid as
76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // long as it is not NULL.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GpuChannelHost* channel_;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Route ID for the associated decoder in the GPU process.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 decoder_route_id_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // The client that will receive callbacks from the decoder.
83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  Client* client_;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // Unowned reference to the CommandBufferProxyImpl that created us.  |this|
86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // registers as a DeletionObserver of |impl_|, the so reference is always
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // valid as long as it is not NULL.
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CommandBufferProxyImpl* impl_;
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Requested dimensions of the buffer, from ProvidePictureBuffers().
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  gfx::Size picture_buffer_dimensions_;
9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // WeakPtr factory for posting tasks back to itself.
94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::WeakPtrFactory<GpuVideoDecodeAcceleratorHost> weak_this_factory_;
95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(GpuVideoDecodeAcceleratorHost);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_CLIENT_GPU_VIDEO_DECODE_ACCELERATOR_HOST_H_
102