blob: f4a3c7a6aa5113a4d99c9d5720575dceea664e1e [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/synchronization/waitable_event.h"
#include "base/threading/non_thread_safe.h"
#include "ipc/ipc_listener.h"
#include "ipc/ipc_sender.h"
#include "media/video/jpeg_decode_accelerator.h"
namespace base {
class SingleThreadTaskRunner;
}
namespace gpu {
class FilteredSender;
}
namespace media {
class GpuJpegDecodeAcceleratorFactoryProvider {
public:
using CreateAcceleratorCB =
base::Callback<std::unique_ptr<JpegDecodeAccelerator>(
scoped_refptr<base::SingleThreadTaskRunner>)>;
// Static query for JPEG supported. This query calls the appropriate
// platform-specific version.
static bool IsAcceleratedJpegDecodeSupported();
static std::vector<CreateAcceleratorCB> GetAcceleratorFactories();
};
class GpuJpegDecodeAccelerator
: public IPC::Sender,
public base::NonThreadSafe,
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);
// 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_;
DISALLOW_IMPLICIT_CONSTRUCTORS(GpuJpegDecodeAccelerator);
};
} // namespace media
#endif // MEDIA_GPU_IPC_SERVICE_GPU_JPEG_DECODE_ACCELERATOR_H_