summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/gpu_video_decoder_host.h
blob: 2bd2f5b4daa2aaa5ade9e19f56658ae80bf1505e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright (c) 2010 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 CHROME_RENDERER_GPU_VIDEO_DECODER_HOST_H_
#define CHROME_RENDERER_GPU_VIDEO_DECODER_HOST_H_

#include <deque>

#include "base/singleton.h"
#include "chrome/common/gpu_video_common.h"
#include "chrome/renderer/gpu_channel_host.h"
#include "ipc/ipc_channel_proxy.h"
#include "media/base/buffers.h"
#include "media/base/video_frame.h"

using media::VideoFrame;
using media::Buffer;

class GpuVideoServiceHost;

class GpuVideoDecoderHost
    : public base::RefCountedThreadSafe<GpuVideoDecoderHost>,
      public IPC::Channel::Listener {
 public:
  class EventHandler {
   public:
    virtual void OnInitializeDone(
        bool success,
        const GpuVideoDecoderInitDoneParam& param) = 0;
    virtual void OnUninitializeDone() = 0;
    virtual void OnFlushDone() = 0;
    virtual void OnEmptyBufferDone(scoped_refptr<Buffer> buffer) = 0;
    virtual void OnFillBufferDone(scoped_refptr<VideoFrame> frame) = 0;
    virtual void OnDeviceError() = 0;
  };

  typedef enum {
    kStateUninitialized,
    kStateNormal,
    kStateError,
    kStateFlushing,
  } GpuVideoDecoderHostState;

  // IPC::Channel::Listener.
  virtual void OnChannelConnected(int32 peer_pid) {}
  virtual void OnChannelError();
  virtual void OnMessageReceived(const IPC::Message& message);

  bool Initialize(const GpuVideoDecoderInitParam& param);
  bool Uninitialize();
  void EmptyThisBuffer(scoped_refptr<Buffer> buffer);
  void FillThisBuffer(scoped_refptr<VideoFrame> frame);
  bool Flush();

  int32 decoder_id() { return decoder_info_.decoder_id_; }
  int32 route_id() { return decoder_info_.decoder_route_id_; }
  int32 my_route_id() { return decoder_info_.decoder_host_route_id_; }

  virtual ~GpuVideoDecoderHost() {}

 private:
  GpuVideoDecoderHost(GpuVideoServiceHost* service_host,
                      GpuChannelHost* channel_host,
                      EventHandler* event_handler,
                      GpuVideoDecoderInfoParam decoder_info)
      : gpu_video_service_host_(service_host),
        channel_host_(channel_host),
        event_handler_(event_handler),
        decoder_info_(decoder_info),
        buffer_id_serial_(0),
        state_(kStateUninitialized),
        input_buffer_busy_(false) {}
  friend class GpuVideoServiceHost;

  // Input message handler.
  void OnInitializeDone(const GpuVideoDecoderInitDoneParam& param);
  void OnUninitializeDone();
  void OnFlushDone();
  void OnEmptyThisBufferDone();
  void OnFillThisBufferDone(const GpuVideoDecoderOutputBufferParam& param);
  void OnEmptyThisBufferACK();

  // Helper function.
  void SendInputBufferToGpu();

  // We expect that GpuVideoServiceHost's always available during our life span.
  GpuVideoServiceHost* gpu_video_service_host_;

  scoped_refptr<GpuChannelHost> channel_host_;

  // We expect that the client of us will always available during our life span.
  EventHandler* event_handler_;

  // Globally identify this decoder in the GPU process.
  GpuVideoDecoderInfoParam decoder_info_;

  // Input buffer id serial number generator.
  int32 buffer_id_serial_;

  // Hold information about GpuVideoDecoder configuration.
  GpuVideoDecoderInitParam init_param_;

  // Hold information about output surface format, etc.
  GpuVideoDecoderInitDoneParam done_param_;

  // Current state of video decoder.
  GpuVideoDecoderHostState state_;

  // We are not able to push all received buffer to gpu process at once.
  std::deque<scoped_refptr<Buffer> > input_buffer_queue_;

  // Currently we do not use ring buffer in input buffer, therefore before
  // GPU process had finished access it, we should not touch it.
  bool input_buffer_busy_;

  // Transfer buffers for both input and output.
  // TODO(jiesun): remove output buffer when hardware composition is ready.
  scoped_ptr<base::SharedMemory> input_transfer_buffer_;
  scoped_ptr<base::SharedMemory> output_transfer_buffer_;

  DISALLOW_COPY_AND_ASSIGN(GpuVideoDecoderHost);
};

#endif  // CHROME_RENDERER_GPU_VIDEO_DECODER_HOST_H_