kodi
LinearMemoryStream.h
1 /*
2  * Copyright (C) 2016-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "IMemoryStream.h"
12 
13 #include <memory>
14 #include <stdint.h>
15 
16 namespace KODI
17 {
18 namespace RETRO
19 {
21 {
22 public:
24 
25  ~CLinearMemoryStream() override = default;
26 
27  // partial implementation of IMemoryStream
28  void Init(size_t frameSize, uint64_t maxFrameCount) override;
29  void Reset() override;
30  size_t FrameSize() const override { return m_frameSize; }
31  uint64_t MaxFrameCount() const override { return m_maxFrames; }
32  void SetMaxFrameCount(uint64_t maxFrameCount) override;
33  uint8_t* BeginFrame() override;
34  void SubmitFrame() override;
35  const uint8_t* CurrentFrame() const override;
36  uint64_t FutureFramesAvailable() const override { return 0; }
37  uint64_t AdvanceFrames(uint64_t frameCount) override { return 0; }
38  uint64_t PastFramesAvailable() const override = 0;
39  uint64_t RewindFrames(uint64_t frameCount) override = 0;
40  uint64_t GetFrameCounter() const override { return m_currentFrameHistory; }
41  void SetFrameCounter(uint64_t frameCount) override { m_currentFrameHistory = frameCount; }
42 
43 protected:
44  virtual void SubmitFrameInternal() = 0;
45  virtual void CullPastFrames(uint64_t frameCount) = 0;
46 
47  // Helper function
48  uint64_t BufferSize() const;
49 
50  size_t m_paddedFrameSize;
51  uint64_t m_maxFrames;
52 
58  std::unique_ptr<uint32_t[]> m_currentFrame;
59  std::unique_ptr<uint32_t[]> m_nextFrame;
60  bool m_bHasCurrentFrame;
61  bool m_bHasNextFrame;
62 
63  uint64_t m_currentFrameHistory;
64 
65 private:
66  size_t m_frameSize;
67 };
68 } // namespace RETRO
69 } // namespace KODI
uint64_t AdvanceFrames(uint64_t frameCount) override
Seek ahead the specified number of frames.
Definition: LinearMemoryStream.h:37
uint64_t FutureFramesAvailable() const override
Return the number of frames ahead of the current frame.
Definition: LinearMemoryStream.h:36
std::unique_ptr< uint32_t[]> m_currentFrame
Simple double-buffering.
Definition: LinearMemoryStream.h:58
size_t FrameSize() const override
Return the frame size passed to Init()
Definition: LinearMemoryStream.h:30
uint64_t GetFrameCounter() const override
Get the total number of frames played until the current frame.
Definition: LinearMemoryStream.h:40
void Reset() override
Free any resources used by this stream.
Definition: LinearMemoryStream.cpp:31
uint64_t MaxFrameCount() const override
Return the current max frame count.
Definition: LinearMemoryStream.h:31
void Init(size_t frameSize, uint64_t maxFrameCount) override
Initialize memory stream.
Definition: LinearMemoryStream.cpp:22
const uint8_t * CurrentFrame() const override
Get a pointer to the current frame.
Definition: LinearMemoryStream.cpp:76
uint64_t PastFramesAvailable() const override=0
Return the number of frames behind the current frame.
uint64_t RewindFrames(uint64_t frameCount) override=0
Seek backwards the specified number of frames.
Definition: AudioDecoder.h:18
void SubmitFrame() override
Indicate that a frame of size FrameSize() has been written to the location returned from BeginFrame()...
Definition: LinearMemoryStream.cpp:84
void SetMaxFrameCount(uint64_t maxFrameCount) override
Update the max frame count.
Definition: LinearMemoryStream.cpp:43
Definition: LinearMemoryStream.h:20
Stream of serialized states from game clients.
Definition: IMemoryStream.h:43
void SetFrameCounter(uint64_t frameCount) override
Set the total number of frames played until the current frame.
Definition: LinearMemoryStream.h:41
uint8_t * BeginFrame() override
Definition: LinearMemoryStream.cpp:59