blob: 41edc5ac7d9b6128014d18b340efb1abd6ace0b8 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_GPU_IPC_CLIENT_GPU_VIDEO_DECODE_ACCELERATOR_HOST_H_
#define MEDIA_GPU_IPC_CLIENT_GPU_VIDEO_DECODE_ACCELERATOR_HOST_H_
#include <stdint.h>
#include <vector>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/single_thread_task_runner.h"
#include "gpu/ipc/client/command_buffer_proxy_impl.h"
#include "media/mojo/mojom/gpu_accelerated_video_decoder.mojom.h"
#include "media/video/video_decode_accelerator.h"
#include "mojo/public/cpp/bindings/associated_receiver.h"
#include "mojo/public/cpp/bindings/shared_associated_remote.h"
#include "ui/gfx/geometry/size.h"
namespace media {
// This class is used to talk to VideoDecodeAccelerator in the Gpu process
// through IPC messages.
class GpuVideoDecodeAcceleratorHost
: public VideoDecodeAccelerator,
public gpu::CommandBufferProxyImpl::DeletionObserver,
public mojom::GpuAcceleratedVideoDecoderClient {
public:
// |this| is guaranteed not to outlive |impl|. (See comments for |impl_|.)
explicit GpuVideoDecodeAcceleratorHost(gpu::CommandBufferProxyImpl* impl);
GpuVideoDecodeAcceleratorHost(const GpuVideoDecodeAcceleratorHost&) = delete;
GpuVideoDecodeAcceleratorHost& operator=(GpuVideoDecodeAcceleratorHost&) =
delete;
// VideoDecodeAccelerator implementation.
bool Initialize(const Config& config, Client* client) override;
void Decode(BitstreamBuffer bitstream_buffer) override;
void AssignPictureBuffers(const std::vector<PictureBuffer>& buffers) override;
void ReusePictureBuffer(int32_t picture_buffer_id) override;
void Flush() override;
void Reset() override;
void SetOverlayInfo(const OverlayInfo&) override;
void Destroy() override;
// gpu::CommandBufferProxyImpl::DeletionObserver implemetnation.
void OnWillDeleteImpl() override;
private:
// Only Destroy() should be deleting |this|.
~GpuVideoDecodeAcceleratorHost() override;
void OnDisconnectedFromGpuProcess();
// Notify |client_| of an error. Posts a task to avoid re-entrancy.
void PostNotifyError(Error);
// mojom::GpuAcceleratedVideoDecoderClient:
void OnInitializationComplete(bool success) override;
void OnBitstreamBufferProcessed(int32_t bitstream_buffer_id) override;
void OnProvidePictureBuffers(uint32_t num_requested_buffers,
VideoPixelFormat format,
uint32_t textures_per_buffer,
const gfx::Size& dimensions,
uint32_t texture_target) override;
void OnDismissPictureBuffer(int32_t picture_buffer_id) override;
void OnPictureReady(mojom::PictureReadyParamsPtr params) override;
void OnError(uint32_t error) override;
void OnFlushDone();
void OnResetDone();
// Receiver and remote endpoints for connections to the GPU process. These are
// associated with the corresponding CommandBuffer interface given at
// construction time.
mojo::AssociatedReceiver<mojom::GpuAcceleratedVideoDecoderClient>
client_receiver_{this};
mojo::SharedAssociatedRemote<mojom::GpuAcceleratedVideoDecoder> decoder_;
// The client that will receive callbacks from the decoder.
Client* client_;
// Protect |impl_|. |impl_| is used on media thread, but it can be invalidated
// on main thread.
base::Lock impl_lock_;
// Unowned reference to the gpu::CommandBufferProxyImpl that created us.
// |this| registers as a DeletionObserver of |impl_|, the so reference is
// always valid as long as it is not NULL.
gpu::CommandBufferProxyImpl* impl_;
// Requested dimensions of the buffer, from ProvidePictureBuffers().
gfx::Size picture_buffer_dimensions_;
// Task runner for tasks that should run on the thread this class is
// constructed.
scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
// WeakPtr for posting tasks to ourself.
base::WeakPtr<GpuVideoDecodeAcceleratorHost> weak_this_;
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<GpuVideoDecodeAcceleratorHost> weak_this_factory_{this};
};
} // namespace media
#endif // MEDIA_GPU_IPC_CLIENT_GPU_VIDEO_DECODE_ACCELERATOR_HOST_H_