blob: 1598b620950895ab6354d3d0a436f8d8c79c8362 (
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
|
/*
* dxr3syncbuffer.h:
*
* See the main source file 'dxr3.c' for copyright information and
* how to reach the author.
*
*/
#ifndef _DXR3SYNCBUFFER_H_
#define _DXR3SYNCBUFFER_H_
#include <stdint.h>
#include "dxr3vdrincludes.h"
#include "dxr3interface.h"
#include "dxr3generaldefines.h"
#include "dxr3nextpts.h"
#include "dxr3log.h"
// ==================================
const uint32_t UNKNOWN_CHANNEL_COUNT = 0xFFFFFFFF;
const uint32_t UNKNOWN_DATA_RATE = 0xFFFFFFFF;
const uint32_t UNKNOWN_ASPECT_RATIO = 0xFFFFFFFF;
// ==================================
class cFixedLengthFrame
{
public:
explicit cFixedLengthFrame(uint32_t length);
~cFixedLengthFrame();
void CopyFrame(const uint8_t* pStart, int length, uint32_t pts, eFrameType type);
uint8_t* GetData(void);
int GetCount(void);
uint32_t GetPts(void);
void SetPts(uint32_t pts);
void SetChannelCount(uint32_t channelCount) {if (channelCount != UNKNOWN_CHANNEL_COUNT) m_staticAudioChannelCount = m_audioChannelCount = channelCount; else m_audioChannelCount = m_staticAudioChannelCount; };
void SetDataRate(uint32_t dataRate) {if (m_audioDataRate != UNKNOWN_DATA_RATE) m_staticAudioDataRate = m_audioDataRate = dataRate; else m_audioDataRate = m_staticAudioDataRate;};
void SetAspectRatio(uint32_t aspectRatio) {m_videoAspectRatio = aspectRatio;};
uint32_t GetChannelCount(void) {return ((m_audioChannelCount == m_staticAudioChannelCount || !m_staticAudioChannelCount)? m_audioChannelCount : m_staticAudioChannelCount) ;};
uint32_t GetDataRate(void) {return ((m_audioDataRate == m_staticAudioDataRate || !m_staticAudioDataRate) ? m_audioDataRate : m_staticAudioDataRate);};
uint32_t GetAspectRatio(void) {return m_videoAspectRatio;};
eFrameType GetFrameType(void) {return m_type;}
static void Clear(void) {m_staticAudioDataRate = 0; m_staticAudioChannelCount = 0;};
protected:
uint8_t* m_pData;
int m_count;
int m_length;
uint32_t m_pts;
eFrameType m_type;
uint32_t m_audioChannelCount;
uint32_t m_audioDataRate;
uint32_t m_videoAspectRatio;
static uint32_t m_staticAudioChannelCount;
static uint32_t m_staticAudioDataRate;
private:
cFixedLengthFrame(); // you are not allowed to use this constructor
cFixedLengthFrame(cFixedLengthFrame&); // no copy constructor
};
// ==================================
class cDxr3SyncBuffer : public cRingBuffer
{
public:
enum eSyncBufferException
{
SYNC_BUFFER_OVERRUN
};
public:
cDxr3SyncBuffer(int frameCount, int frameLength, cDxr3Interface& dxr3Device);
~cDxr3SyncBuffer();
virtual int Available(void);
cFixedLengthFrame* Push(const uint8_t* pStart, int length, uint32_t pts, eFrameType type = ftUnknown) throw (eSyncBufferException);
void Pop(void);
cFixedLengthFrame* Get(void);
void Clear(void);
void Stop(void) { m_bStopped = true;};
void Start(void);
void WaitForSysClock(uint32_t pts, uint32_t delta);
void WaitForNextPut(void);
void WakeUp(void);
void WaitForReceiverStopped(void);
void SetDemuxMode(eDxr3DemuxMode demuxMode) {m_demuxMode = demuxMode;};
eDxr3DemuxMode GetDemuxMode(void) {return m_demuxMode;};
bool Poll(int TimeoutMs);
bool IsPolled(void) { return m_bPollSync;};
uint32_t GetFillLevel(void) { return Available() * 100 / Size();};
protected:
void ReceiverStopped(void);
cFixedLengthFrame* m_pBuffer;
int m_count;
int m_nextFree;
int m_next;
bool m_bWaitPts;
bool m_bPutBlock;
bool m_bGetBlock;
bool m_bStartReceiver;
bool m_bStopped;
uint32_t m_waitPts;
uint32_t m_waitDelta;
uint32_t m_lastPts;
eDxr3DemuxMode m_demuxMode;
cCondVar receiverStopped;
cMutex receiverStoppedMutex;
cDxr3Interface& m_dxr3Device;
bool m_bPollSync;
private:
cDxr3SyncBuffer(); // you are not allowed to use this constructor
cDxr3SyncBuffer(cDxr3SyncBuffer&); // no constructor
};
#endif /*_DXR3SYNCBUFFER_H_*/
|