15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef PPAPI_SHARED_IMPL_MEDIA_STREAM_BUFFER_MANAGER_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define PPAPI_SHARED_IMPL_MEDIA_STREAM_BUFFER_MANAGER_H_
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <deque>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/compiler_specific.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/shared_memory.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_shared_export.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace ppapi {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)union MediaStreamBuffer;
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// This class is used by both read side and write side of a MediaStreamTrack to
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// maintain a queue of buffers for reading or writing.
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// An example:
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//  1. The writer calls the writer's |buffer_manager_.Dequeue()| to get a free
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//     buffer.
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//  2. The writer fills data into the buffer.
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//  3. The writer sends the buffer index to the reader via an IPC message.
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//  4. The reader receives the buffer index and calls the reader's
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//     |buffer_buffer.Enqueue()| to put the buffer into the read's queue.
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//  5. The reader calls reader's |buffer_buffer_.Dequeue()| to get a received
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//     buffer.
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//  6. When the buffer from the step 5 is consumed, the reader sends the buffer
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//     index back to writer via an IPC message.
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//  7. The writer receives the buffer index and puts it back to the writer's
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//     free buffer queue by calling the writer's |buffer_manager_.Enqueue()|.
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)//  8. Go back to step 1.
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class PPAPI_SHARED_EXPORT MediaStreamBufferManager {
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  class PPAPI_SHARED_EXPORT Delegate {
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)   public:
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual ~Delegate();
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // It is called when a new buffer is enqueued.
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    virtual void OnNewBufferEnqueued();
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  };
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // MediaStreamBufferManager doesn't own |delegate|, the caller should keep
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // it alive during the MediaStreamBufferManager's lifecycle.
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit MediaStreamBufferManager(Delegate* delegate);
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~MediaStreamBufferManager();
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int32_t number_of_buffers() const { return number_of_buffers_; }
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int32_t buffer_size() const { return buffer_size_; }
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Initializes shared memory for buffers transmission.
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool SetBuffers(int32_t number_of_buffers,
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  int32_t buffer_size,
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  scoped_ptr<base::SharedMemory> shm,
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                  bool enqueue_all_buffers);
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Dequeues a buffer from |buffer_queue_|.
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int32_t DequeueBuffer();
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Dequeues all the buffers from |buffer_queue_|.
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  std::vector<int32_t> DequeueBuffers();
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Puts a buffer into |buffer_queue_|.
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void EnqueueBuffer(int32_t index);
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Gets the buffer address for the given buffer index.
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaStreamBuffer* GetBufferPointer(int32_t index);
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Delegate* delegate_;
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A queue of buffer indices.
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::deque<int32_t> buffer_queue_;
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A vector of buffer pointers. It is used for index to pointer converting.
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::vector<MediaStreamBuffer*> buffers_;
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The buffer size in bytes.
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int32_t buffer_size_;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The number of buffers in the shared memory.
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int32_t number_of_buffers_;
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A memory block shared between renderer process and plugin process.
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::SharedMemory> shm_;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaStreamBufferManager);
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace ppapi
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // PPAPI_SHAERD_IMPL_MEDIA_STREAM_BUFFER_MANAGER_H_
98