vdr  2.4.1
ringbuffer.h
Go to the documentation of this file.
1 /*
2  * ringbuffer.h: A ring buffer
3  *
4  * See the main source file 'vdr.c' for copyright information and
5  * how to reach the author.
6  *
7  * $Id: ringbuffer.h 4.2 2017/03/19 13:11:39 kls Exp $
8  */
9 
10 #ifndef __RINGBUFFER_H
11 #define __RINGBUFFER_H
12 
13 #include "thread.h"
14 #include "tools.h"
15 
16 class cRingBuffer {
17 private:
21  int size;
26 protected:
28  int maxFill;//XXX
30  bool statistics;//XXX
31  void UpdatePercentage(int Fill);
32  void WaitForPut(void);
33  void WaitForGet(void);
34  void EnablePut(void);
35  void EnableGet(void);
36  virtual void Clear(void) = 0;
37  virtual int Available(void) = 0;
38  virtual int Free(void) { return Size() - Available() - 1; }
39  int Size(void) { return size; }
40 public:
41  cRingBuffer(int Size, bool Statistics = false);
42  virtual ~cRingBuffer();
43  void SetTimeouts(int PutTimeout, int GetTimeout);
44  void SetIoThrottle(void);
45  void ReportOverflow(int Bytes);
46  };
47 
49 //#define DEBUGRINGBUFFERS
50 #ifdef DEBUGRINGBUFFERS
51 private:
52  int lastHead, lastTail;
53  int lastPut, lastGet;
54  static cRingBufferLinear *RBLS[];
55  static void AddDebugRBL(cRingBufferLinear *RBL);
56  static void DelDebugRBL(cRingBufferLinear *RBL);
57 public:
58  static void PrintDebugRBL(void);
59 #endif
60 private:
61  int margin, head, tail;
62  int gotten;
64  char *description;
65 protected:
66  virtual int DataReady(const uchar *Data, int Count);
72 public:
73  cRingBufferLinear(int Size, int Margin = 0, bool Statistics = false, const char *Description = NULL);
78  virtual ~cRingBufferLinear();
79  virtual int Available(void);
80  virtual int Free(void) { return Size() - Available() - 1 - margin; }
81  virtual void Clear(void);
85  int Read(int FileHandle, int Max = 0);
91  int Read(cUnbufferedFile *File, int Max = 0);
93  int Put(const uchar *Data, int Count);
96  uchar *Get(int &Count);
101  void Del(int Count);
105  };
106 
108 
109 class cFrame {
110  friend class cRingBufferFrame;
111 private:
114  int count;
116  int index;
117  uint32_t pts;
119 public:
120  cFrame(const uchar *Data, int Count, eFrameType = ftUnknown, int Index = -1, uint32_t Pts = 0, bool independent = false);
124  ~cFrame();
125  uchar *Data(void) const { return data; }
126  int Count(void) const { return count; }
127  eFrameType Type(void) const { return type; }
128  int Index(void) const { return index; }
129  uint32_t Pts(void) const { return pts; }
130  bool Independent(void) const { return independent; }
131  };
132 
134 private:
138  void Delete(cFrame *Frame);
139  void Lock(void) { mutex.Lock(); }
140  void Unlock(void) { mutex.Unlock(); }
141 public:
142  cRingBufferFrame(int Size, bool Statistics = false);
143  virtual ~cRingBufferFrame();
144  virtual int Available(void);
145  virtual void Clear(void);
146  // Immediately clears the ring buffer.
147  bool Put(cFrame *Frame);
148  // Puts the Frame into the ring buffer.
149  // Returns true if this was possible.
150  cFrame *Get(void);
151  // Gets the next frame from the ring buffer.
152  // The actual data still remains in the buffer until Drop() is called.
153  void Drop(cFrame *Frame);
154  // Drops the Frame that has just been fetched with Get().
155  };
156 
157 #endif // __RINGBUFFER_H
ftAudio
@ ftAudio
Definition: ringbuffer.h:107
cFrame::Independent
bool Independent(void) const
Definition: ringbuffer.h:130
cRingBufferFrame::Lock
void Lock(void)
Definition: ringbuffer.h:139
cFrame::next
cFrame * next
Definition: ringbuffer.h:112
cRingBuffer::overflowBytes
int overflowBytes
Definition: ringbuffer.h:24
cRingBufferLinear::Clear
virtual void Clear(void)
Immediately clears the ring buffer.
Definition: ringbuffer.c:217
cRingBuffer::maxFill
int maxFill
Definition: ringbuffer.h:28
cRingBuffer::SetTimeouts
void SetTimeouts(int PutTimeout, int GetTimeout)
Definition: ringbuffer.c:89
cRingBufferFrame
Definition: ringbuffer.h:133
cRingBuffer::lastPercent
int lastPercent
Definition: ringbuffer.h:29
cRingBufferFrame::Put
bool Put(cFrame *Frame)
Definition: ringbuffer.c:443
cRingBufferLinear::Put
int Put(const uchar *Data, int Count)
Puts at most Count bytes of Data into the ring buffer.
Definition: ringbuffer.c:306
cRingBuffer::UpdatePercentage
void UpdatePercentage(int Fill)
Definition: ringbuffer.c:46
cFrame::Data
uchar * Data(void) const
Definition: ringbuffer.h:125
cRingBufferLinear::Available
virtual int Available(void)
Definition: ringbuffer.c:211
ftUnknown
@ ftUnknown
Definition: ringbuffer.h:107
cRingBufferFrame::head
cFrame * head
Definition: ringbuffer.h:136
cRingBuffer::putTimeout
int putTimeout
Definition: ringbuffer.h:19
cRingBufferLinear::head
int head
Definition: ringbuffer.h:61
cFrame::independent
bool independent
Definition: ringbuffer.h:118
cRingBufferFrame::mutex
cMutex mutex
Definition: ringbuffer.h:135
cRingBufferLinear::Read
int Read(int FileHandle, int Max=0)
Reads at most Max bytes from FileHandle and stores them in the ring buffer.
Definition: ringbuffer.c:230
cRingBufferFrame::cRingBufferFrame
cRingBufferFrame(int Size, bool Statistics=false)
Definition: ringbuffer.c:420
cFrame::cFrame
cFrame(const uchar *Data, int Count, eFrameType=ftUnknown, int Index=-1, uint32_t Pts=0, bool independent=false)
Creates a new cFrame object.
Definition: ringbuffer.c:394
cRingBuffer::statistics
bool statistics
Definition: ringbuffer.h:30
cRingBuffer::getThreadTid
tThreadId getThreadTid
Definition: ringbuffer.h:27
cFrame::type
eFrameType type
Definition: ringbuffer.h:115
cUnbufferedFile
cUnbufferedFile is used for large files that are mainly written or read in a streaming manner,...
Definition: tools.h:457
cMutex
Definition: thread.h:67
cRingBufferLinear::cRingBufferLinear
cRingBufferLinear(int Size, int Margin=0, bool Statistics=false, const char *Description=NULL)
Creates a linear ring buffer.
Definition: ringbuffer.c:170
cRingBufferLinear::Free
virtual int Free(void)
Definition: ringbuffer.h:80
cRingBuffer::Available
virtual int Available(void)=0
cRingBuffer::readyForGet
cCondWait readyForGet
Definition: ringbuffer.h:18
tThreadId
pid_t tThreadId
Definition: thread.h:17
cRingBufferLinear::Del
void Del(int Count)
Deletes at most Count bytes from the ring buffer.
Definition: ringbuffer.c:371
uchar
unsigned char uchar
Definition: tools.h:31
cRingBufferFrame::currentFill
int currentFill
Definition: ringbuffer.h:137
cRingBuffer::Clear
virtual void Clear(void)=0
cRingBufferFrame::Drop
void Drop(cFrame *Frame)
Definition: ringbuffer.c:477
cMutex::Unlock
void Unlock(void)
Definition: thread.c:228
cFrame::data
uchar * data
Definition: ringbuffer.h:113
cRingBuffer::SetIoThrottle
void SetIoThrottle(void)
Definition: ringbuffer.c:95
cMutex::Lock
void Lock(void)
Definition: thread.c:222
cRingBufferLinear::tail
int tail
Definition: ringbuffer.h:61
cRingBuffer::getTimeout
int getTimeout
Definition: ringbuffer.h:20
cRingBuffer::WaitForGet
void WaitForGet(void)
Definition: ringbuffer.c:71
cIoThrottle
Definition: thread.h:267
cRingBuffer::Free
virtual int Free(void)
Definition: ringbuffer.h:38
cRingBufferLinear::Get
uchar * Get(int &Count)
Gets data from the ring buffer.
Definition: ringbuffer.c:346
cRingBuffer::size
int size
Definition: ringbuffer.h:21
cRingBuffer::readyForPut
cCondWait readyForPut
Definition: ringbuffer.h:18
eFrameType
eFrameType
Definition: ringbuffer.h:107
cRingBufferFrame::Delete
void Delete(cFrame *Frame)
Definition: ringbuffer.c:471
cRingBufferLinear::buffer
uchar * buffer
Definition: ringbuffer.h:63
cFrame::Index
int Index(void) const
Definition: ringbuffer.h:128
cRingBuffer::WaitForPut
void WaitForPut(void)
Definition: ringbuffer.c:65
ftDolby
@ ftDolby
Definition: ringbuffer.h:107
cFrame
Definition: ringbuffer.h:109
cRingBufferFrame::Get
cFrame * Get(void)
Definition: ringbuffer.c:463
cRingBuffer::overflowCount
int overflowCount
Definition: ringbuffer.h:23
cRingBufferFrame::~cRingBufferFrame
virtual ~cRingBufferFrame()
Definition: ringbuffer.c:427
cRingBufferLinear
Definition: ringbuffer.h:48
cFrame::~cFrame
~cFrame()
Definition: ringbuffer.c:413
cRingBuffer
Definition: ringbuffer.h:16
cFrame::Pts
uint32_t Pts(void) const
Definition: ringbuffer.h:129
cRingBufferLinear::~cRingBufferLinear
virtual ~cRingBufferLinear()
Definition: ringbuffer.c:197
cRingBufferLinear::description
char * description
Definition: ringbuffer.h:64
cRingBuffer::Size
int Size(void)
Definition: ringbuffer.h:39
cFrame::pts
uint32_t pts
Definition: ringbuffer.h:117
cRingBuffer::lastOverflowReport
time_t lastOverflowReport
Definition: ringbuffer.h:22
cRingBufferFrame::Available
virtual int Available(void)
Definition: ringbuffer.c:498
ftVideo
@ ftVideo
Definition: ringbuffer.h:107
cRingBuffer::EnableGet
void EnableGet(void)
Definition: ringbuffer.c:83
cCondWait
Definition: thread.h:19
cRingBufferLinear::DataReady
virtual int DataReady(const uchar *Data, int Count)
By default a ring buffer has data ready as soon as there are at least 'margin' bytes available.
Definition: ringbuffer.c:206
cRingBuffer::~cRingBuffer
virtual ~cRingBuffer()
Definition: ringbuffer.c:39
cRingBuffer::cRingBuffer
cRingBuffer(int Size, bool Statistics=false)
Definition: ringbuffer.c:26
tools.h
cFrame::index
int index
Definition: ringbuffer.h:116
cFrame::Type
eFrameType Type(void) const
Definition: ringbuffer.h:127
cRingBufferFrame::Clear
virtual void Clear(void)
Definition: ringbuffer.c:432
thread.h
cRingBufferLinear::gotten
int gotten
Definition: ringbuffer.h:62
cRingBuffer::ReportOverflow
void ReportOverflow(int Bytes)
Definition: ringbuffer.c:101
cRingBufferLinear::margin
int margin
Definition: ringbuffer.h:61
cRingBufferFrame::Unlock
void Unlock(void)
Definition: ringbuffer.h:140
cFrame::Count
int Count(void) const
Definition: ringbuffer.h:126
cRingBuffer::ioThrottle
cIoThrottle * ioThrottle
Definition: ringbuffer.h:25
cFrame::count
int count
Definition: ringbuffer.h:114
cRingBuffer::EnablePut
void EnablePut(void)
Definition: ringbuffer.c:77