Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cFLVFile.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cFLVFile_H
7 #define _INC_cFLVFile_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "../AV/cAVSink.h"
15 
16 namespace GrayLib
17 {
18  class cFLVForm
19  {
23  public:
24  static const BYTE k_INVALID = 0xFF;
25  protected:
26  BYTE m_bVal;
27 
28  public:
29  cFLVForm() noexcept
30  : m_bVal(k_INVALID)
31  {
32  }
33  bool isValid() const noexcept
34  {
35  return m_bVal != k_INVALID;
36  }
37  void put_Byte(BYTE bVal) noexcept
38  {
39  m_bVal = bVal;
40  }
41  BYTE get_Byte() const noexcept
42  {
43  return m_bVal;
44  }
45  };
46 
47  class cFLVVideo : public cFLVForm
48  {
51  public:
53  {
57  CODEC_H263 = 0x02,
58  CODEC_SCREEN = 0x03,
59  CODEC_ON2_VP6E = 0x04,
60  CODEC_ON2_VP6S = 0x05,
61  CODEC_SCREEN2 = 0x06,
62  CODEC_H264 = 0x07,
63  CODEC_MASK = 0x07,
64  };
66  {
69  FRAME_0 = 0,
70  FRAME_KEY = 0x10,
71  FRAME_INTER = 0x20,
72  FRAME_DISP_INTER = 0x30, // NOT USED
73  FRAME_MASK = 0x30,
74  };
75 
77  {
78  return (CODEC_TYPE)(m_bVal & CODEC_MASK);
79  }
80  void put_Codec(CODEC_TYPE eCodecType)
81  {
82  m_bVal &= ~CODEC_MASK;
83  m_bVal |= eCodecType;
84  }
86  {
87  return (FRAME_TYPE)(m_bVal & FRAME_MASK);
88  }
89  void put_FrameType(FRAME_TYPE eFrameType)
90  {
91  m_bVal &= ~FRAME_MASK;
92  m_bVal |= eFrameType;
93  }
94  };
95 
96  class cFLVAudio : public cFLVForm
97  {
100  public:
102  {
106  };
108  {
109  SIZE_8 = 0,
110  SIZE_16 = (1 << 1),
112  };
114  {
115  RATE_5KHZ = 0, // signifies 5512Hz or 8000Hz in the case of FORMAT_NELLYMOSER
116  RATE_11KHZ = (1 << 2), // 11025
117  RATE_22KHZ = (2 << 2), // 22050
118  RATE_44KHZ = (3 << 2), // 44100
120  };
122  {
124  FORMAT_ADPCM = (1 << 4),
125  FORMAT_MP3 = (2 << 4),
126  FORMAT_PCM_LE = (3 << 4), // Little Endian PCM data.
128  FORMAT_NELLY_8KHZ_MONO = (5 << 4), // NELLYMOSER_8KHZ_MONO
129  FORMAT_NELLYMOSER = (6 << 4), // http://en.wikipedia.org/wiki/Nellymoser_Asao_Codec
130  FORMAT_AAC = (10 << 4), // AAC (HE-AAC/AAC SBR, AAC Main Profile, and AAC-LC) M4A, MP4
131  FORMAT_SPEEX = (11 << 4),
133  };
134 
136  {
137  return (FORMAT_TYPE)(m_bVal & FORMAT_MASK);
138  }
139  void put_Format(FORMAT_TYPE eFormat)
140  {
141  m_bVal &= ~FORMAT_MASK;
142  m_bVal |= eFormat;
143  }
145  {
146  return (RATE_TYPE)(m_bVal & RATE_MASK);
147  }
148  void put_SamplingRate(RATE_TYPE eSamplingRate)
149  {
150  m_bVal &= ~RATE_MASK;
151  m_bVal |= eSamplingRate;
152  }
154  {
155  return (SIZE_TYPE)(m_bVal & SIZE_MASK);
156  }
157  void put_SampleSize(SIZE_TYPE eSampleSize)
158  {
159  m_bVal &= ~SIZE_MASK;
160  m_bVal |= eSampleSize;
161  }
163  {
164  return (CHAN_TYPE)(m_bVal & CHAN_MASK);
165  }
167  {
168  m_bVal &= ~CHAN_MASK;
169  m_bVal |= eChan;
170  }
171  };
172 
173  class cFLVTag
174  {
177  public:
178  static const size_t k_SIZE = 11;
179 
180  enum TAG_TYPE
181  {
184  TAG_UNK = 0,
185  TAG_AUDIO = 0x08,
186  TAG_VIDEO = 0x09,
187  TAG_META = 0x12,
188  TAG_META2 = 0x18,
189  };
190 
192  size_t m_dataSize;
194  UINT32 m_nStreamID;
195 
196  // followed by m_dataSize data. first byte of which might be cFLVAudio or cFLVVideo depending on m_eType
197  // followed by UI32 tail = ( m_dataSize + k_SIZE )
198  public:
201  , m_dataSize(0)
202  , m_timeStamp(0)
203  , m_nStreamID(0)
204  {
205  }
206  };
207 
209  {
213 
214  public:
215  static const BYTE k_VERSION_1 = 1;
216 
218  {
221  FLV_FORMFLAG_VIDEO = 0x1,
222  FLV_FORMFLAG_AUDIO = 0x4,
223  };
225  {
226  FLV_META_Number = 0,
239  };
240 
241  static const char k_bFLV[4];
245 
246  public:
248  : m_bFormFlags(0)
249  {
250  }
251 
252  bool hasAudio() const
253  {
254  return m_bFormFlags & FLV_FORMFLAG_AUDIO;
255  }
256  bool hasVideo() const
257  {
258  return m_bFormFlags & FLV_FORMFLAG_VIDEO;
259  }
260  };
261 
263  {
266  public:
271  protected:
272  HRESULT WriteUI24(UINT32 uVal) const;
273  HRESULT WriteUI32(UINT32 uVal) const;
274  HRESULT WriteTagHeader(const cFLVTag& tag) const;
275  HRESULT WriteHeader() const;
276  public:
277  cFLVFileWriter(cStreamOutput* pStreamOut);
278  virtual ~cFLVFileWriter();
279 
280  HRESULT OnHeaderVideo(const cSurfaceBitmapInfo* pForm, size_t nSizeForm);
281  HRESULT OnHeaderAudio(const cWaveFormatEx* pForm, size_t nSizeForm);
282 
283  // cAVSink
284  virtual HRESULT OnHeaderOpen(const cAVHeader& head) override;
285  virtual HRESULT OnHeaderStream(const cAVHeaderStream& head, const void* pForm, size_t nSizeForm) override;
286  virtual HRESULT OnHeaderClose() override;
287  virtual HRESULT OnFrame(const cAVHeaderFrame& head, const void* pData, size_t nSizeData) override;
288  virtual HRESULT OnClose() override;
289 
291  };
292 
294  {
297 
298  public:
299  static const BYTE k_FLAG_Header = 0x80;
302 
303  protected:
304  HRESULT ReadUI16(WORD& uVal);
305  HRESULT ReadUI24(UINT32& uVal);
306  HRESULT ReadUI32(UINT32& uVal);
307  HRESULT ReadTag(cFLVTag& tag);
308  HRESULT ReadMetaString(cString& sVal);
309  HRESULT ReadMeta(UINT32 uLenBlockMax, FLV_META_TYPE eTypeEnd, UINT32 uQtyMax);
310 
311  HRESULT UpdateHeaderAudio(BYTE bFormFlag);
312  HRESULT UpdateHeaderVideo(BYTE bFormFlag);
313  HRESULT ReadFrame(const cFLVTag& tag);
314 
315  public:
317  : cAVReader(s, pAVSink)
318  , m_bFormFlagsFound(0)
319  {
320  }
321  virtual ~cFLVFileReader(void)
322  {
323  }
324  virtual HRESULT ReadStream() override;
325 
327  };
328 }
329 #endif
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
Definition: cAVSink.h:80
Definition: cAVSink.h:60
Definition: cAVSink.h:44
Definition: cAVSink.h:181
Definition: cAVSink.h:130
Definition: cFLVFile.h:97
SIZE_TYPE get_SampleSize() const
Definition: cFLVFile.h:153
RATE_TYPE
Definition: cFLVFile.h:114
@ RATE_5KHZ
Definition: cFLVFile.h:115
@ RATE_22KHZ
Definition: cFLVFile.h:117
@ RATE_MASK
Definition: cFLVFile.h:119
@ RATE_11KHZ
Definition: cFLVFile.h:116
@ RATE_44KHZ
Definition: cFLVFile.h:118
FORMAT_TYPE get_Format() const
Definition: cFLVFile.h:135
FORMAT_TYPE
Definition: cFLVFile.h:122
@ FORMAT_NELLY_16KHZ_MONO
Definition: cFLVFile.h:127
@ FORMAT_MP3
Definition: cFLVFile.h:125
@ FORMAT_ADPCM
Definition: cFLVFile.h:124
@ FORMAT_PCM_LE
Definition: cFLVFile.h:126
@ FORMAT_SPEEX
Definition: cFLVFile.h:131
@ FORMAT_NELLYMOSER
Definition: cFLVFile.h:129
@ FORMAT_AAC
Definition: cFLVFile.h:130
@ FORMAT_UNCOMPRESSED
Definition: cFLVFile.h:123
@ FORMAT_MASK
Definition: cFLVFile.h:132
@ FORMAT_NELLY_8KHZ_MONO
Definition: cFLVFile.h:128
void put_SamplingRate(RATE_TYPE eSamplingRate)
Definition: cFLVFile.h:148
void put_SampleSize(SIZE_TYPE eSampleSize)
Definition: cFLVFile.h:157
CHAN_TYPE get_Channels() const
Definition: cFLVFile.h:162
RATE_TYPE get_SamplingRate() const
Definition: cFLVFile.h:144
SIZE_TYPE
Definition: cFLVFile.h:108
@ SIZE_8
Definition: cFLVFile.h:109
@ SIZE_16
Definition: cFLVFile.h:110
@ SIZE_MASK
Definition: cFLVFile.h:111
void put_Format(FORMAT_TYPE eFormat)
Definition: cFLVFile.h:139
CHAN_TYPE
Definition: cFLVFile.h:102
@ CHAN_MASK
Definition: cFLVFile.h:105
@ CHAN_STEREO
Definition: cFLVFile.h:103
@ CHAN_MONO
Definition: cFLVFile.h:104
void put_Channels(CHAN_TYPE eChan)
Definition: cFLVFile.h:166
Definition: cFLVFile.h:294
BYTE m_bFormFlagsFound
FLV_FORMFLAG_TYPE mask. What stream types have i got.
Definition: cFLVFile.h:300
virtual ~cFLVFileReader(void)
Definition: cFLVFile.h:321
cArrayRef< cAVFrame > m_FramesQ
Definition: cFLVFile.h:301
cFLVFileReader(cStreamInput &s, cAVSink *pAVSink)
Definition: cFLVFile.h:316
UNITTEST_FRIEND(cFLVFileReader)
Definition: cFLVFile.h:263
UNITTEST_FRIEND(cFLVFileWriter)
TIMESYSD_t m_timeStampA
from cAVHeader. 0 = real time.
Definition: cFLVFile.h:269
TIMESYSD_t m_timeStampV
accumulated from OnFrame calls
Definition: cFLVFile.h:270
cStreamOutput * m_pStreamOut
Definition: cFLVFile.h:267
float m_fFramesPerSec
Definition: cFLVFile.h:268
Definition: cFLVFile.h:209
BYTE m_bFormFlags
FLV_FORMFLAG_TYPE mask.
Definition: cFLVFile.h:242
FLV_META_TYPE
Definition: cFLVFile.h:225
@ FLV_META_String
2 = String type
Definition: cFLVFile.h:228
@ FLV_META_StrictArray
10 = Strict array type
Definition: cFLVFile.h:236
@ FLV_META_Date
11 = Date type
Definition: cFLVFile.h:237
@ FLV_META_ECMA
8 = ECMA array type
Definition: cFLVFile.h:234
@ FLV_META_Null
5 = Null type
Definition: cFLVFile.h:231
@ FLV_META_Ref
7 = Reference type
Definition: cFLVFile.h:233
@ FLV_META_Undef
6 = Undefined type
Definition: cFLVFile.h:232
@ FLV_META_END
9 = END marker.
Definition: cFLVFile.h:235
@ FLV_META_Boolean
1 = Boolean type
Definition: cFLVFile.h:227
@ FLV_META_Object
3 = Object type
Definition: cFLVFile.h:229
@ FLV_META_LongString
12 = Long string type
Definition: cFLVFile.h:238
@ FLV_META_MovieClip
4 = MovieClip type
Definition: cFLVFile.h:230
bool hasVideo() const
Definition: cFLVFile.h:256
cFLVAudio m_FormAudio
for the current frame.
Definition: cFLVFile.h:244
cFLVFile()
Definition: cFLVFile.h:247
cFLVVideo m_FormVideo
for the current frame.
Definition: cFLVFile.h:243
FLV_FORMFLAG_TYPE
Definition: cFLVFile.h:218
bool hasAudio() const
Definition: cFLVFile.h:252
Definition: cFLVFile.h:19
BYTE m_bVal
Definition: cFLVFile.h:26
void put_Byte(BYTE bVal) noexcept
Definition: cFLVFile.h:37
bool isValid() const noexcept
Definition: cFLVFile.h:33
static const BYTE k_INVALID
Definition: cFLVFile.h:24
cFLVForm() noexcept
Definition: cFLVFile.h:29
BYTE get_Byte() const noexcept
Definition: cFLVFile.h:41
Definition: cFLVFile.h:174
TAG_TYPE
Definition: cFLVFile.h:181
@ TAG_UNK
Definition: cFLVFile.h:184
@ TAG_META2
SCRIPTDATAOBJECT ???
Definition: cFLVFile.h:188
@ TAG_AUDIO
AUDIODATA.
Definition: cFLVFile.h:185
@ TAG_VIDEO
VIDEODATA.
Definition: cFLVFile.h:186
@ TAG_META
SCRIPTDATAOBJECT.
Definition: cFLVFile.h:187
cFLVTag()
Definition: cFLVFile.h:199
TIMESYSD_t m_timeStamp
3 actual bytes. Time in milliseconds at which the data in this tag applies. This value is relative to...
Definition: cFLVFile.h:193
size_t m_dataSize
3 actual bytes. sizeof data to follow, but not 4 byte tag tail.
Definition: cFLVFile.h:192
TAG_TYPE m_eTagType
1 byte
Definition: cFLVFile.h:191
UINT32 m_nStreamID
3 bytes = 0 = unused.
Definition: cFLVFile.h:194
static const size_t k_SIZE
Size of tag data is 11 bytes in stream.
Definition: cFLVFile.h:178
Definition: cFLVFile.h:48
void put_Codec(CODEC_TYPE eCodecType)
Definition: cFLVFile.h:80
void put_FrameType(FRAME_TYPE eFrameType)
Definition: cFLVFile.h:89
FRAME_TYPE
Definition: cFLVFile.h:66
@ FRAME_KEY
Definition: cFLVFile.h:70
@ FRAME_0
Definition: cFLVFile.h:69
@ FRAME_MASK
Definition: cFLVFile.h:73
@ FRAME_DISP_INTER
Definition: cFLVFile.h:72
@ FRAME_INTER
Definition: cFLVFile.h:71
FRAME_TYPE get_FrameType() const
Definition: cFLVFile.h:85
CODEC_TYPE get_Codec() const
Definition: cFLVFile.h:76
CODEC_TYPE
Definition: cFLVFile.h:53
@ CODEC_SCREEN2
Macromedia Screen Video 2. some chroma compression?
Definition: cFLVFile.h:61
@ CODEC_SCREEN
Macromedia Screen Video 1. ZLIB based.
Definition: cFLVFile.h:58
@ CODEC_H264
H.264 (MPEG-4 Part 10)
Definition: cFLVFile.h:62
@ CODEC_UNCOMPRESSED
Definition: cFLVFile.h:56
@ CODEC_H263
Sorenson Spark H.263.
Definition: cFLVFile.h:57
@ CODEC_MASK
Definition: cFLVFile.h:63
@ CODEC_ON2_VP6E
On2 TrueMotion VP6-E.
Definition: cFLVFile.h:59
@ CODEC_ON2_VP6S
On2 TrueMotion VP6-S.
Definition: cFLVFile.h:60
Definition: cSurfaceInfo.h:308
Definition: cWaveFormat.h:73
Definition: cArrayRef.h:21
Definition: cStream.h:306
Definition: cStream.h:126
Definition: cMesh.h:22
INT32 TIMESYSD_t
Time delta. signed milli-Seconds Span. cTimeSys::k_DMAX, cTimeSys::k_INF = MAILSLOT_WAIT_FOREVER.
Definition: cTimeSys.h:28