blob: 736cb27d297c14e49643c293658ad74dec635894 [file] [log] [blame]
// Copyright 2015 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_SERVICE_GPU_JPEG_DECODE_ACCELERATOR_H_
#define MEDIA_GPU_IPC_SERVICE_GPU_JPEG_DECODE_ACCELERATOR_H_
#include <stdint.h>
#include <memory>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/synchronization/waitable_event.h"
#include "ipc/ipc_listener.h"
#include "ipc/ipc_sender.h"
#include "media/gpu/ipc/service/gpu_jpeg_decode_accelerator_factory_provider.h"
#include "media/gpu/mojo/jpeg_decoder.mojom.h"
#include "media/video/jpeg_decode_accelerator.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace gpu {
class FilteredSender;
}
namespace media {
// TODO(c.padhi): Move GpuJpegDecodeAccelerator to media/gpu/mojo, see
// http://crbug.com/699255.
class GpuJpegDecodeAccelerator
: public IPC::Sender,
public mojom::GpuJpegDecodeAccelerator,
public base::SupportsWeakPtr<GpuJpegDecodeAccelerator> {
public:
// |channel| must outlive this object.
// This convenience constructor internally calls
// GpuJpegDecodeAcceleratorFactoryProvider::GetAcceleratorFactories() to
// fill |accelerator_factory_functions_|.
GpuJpegDecodeAccelerator(
gpu::FilteredSender* channel,
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner);
// |channel| must outlive this object.
GpuJpegDecodeAccelerator(
gpu::FilteredSender* channel,
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
std::vector<GpuJpegDecodeAcceleratorFactoryProvider::CreateAcceleratorCB>
accelerator_factory_functions);
~GpuJpegDecodeAccelerator() override;
void AddClient(int32_t route_id, base::Callback<void(bool)> response);
void NotifyDecodeStatus(int32_t route_id,
int32_t bitstream_buffer_id,
JpegDecodeAccelerator::Error error);
// mojom::GpuJpegDecodeAccelerator implementation.
void Initialize(InitializeCallback callback) override;
void Decode(mojom::BitstreamBufferPtr input_buffer,
const gfx::Size& coded_size,
mojo::ScopedSharedBufferHandle output_handle,
uint32_t output_buffer_size,
DecodeCallback callback) override;
void Uninitialize() override;
// Function to delegate sending to actual sender.
bool Send(IPC::Message* message) override;
private:
class Client;
class MessageFilter;
void ClientRemoved();
std::vector<GpuJpegDecodeAcceleratorFactoryProvider::CreateAcceleratorCB>
accelerator_factory_functions_;
gpu::FilteredSender* channel_;
// The message filter to run JpegDecodeAccelerator::Decode on IO thread.
scoped_refptr<MessageFilter> filter_;
// GPU child task runner.
scoped_refptr<base::SingleThreadTaskRunner> child_task_runner_;
// GPU IO task runner.
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
// Number of clients added to |filter_|.
int client_number_;
SEQUENCE_CHECKER(sequence_checker_);
DISALLOW_IMPLICIT_CONSTRUCTORS(GpuJpegDecodeAccelerator);
};
} // namespace media
#endif // MEDIA_GPU_IPC_SERVICE_GPU_JPEG_DECODE_ACCELERATOR_H_