-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathflvtag.cpp
87 lines (76 loc) · 2.96 KB
/
flvtag.cpp
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
#include "flvtag.h"
FlvTag FlvTag::flvHeader(bool hasAudio, bool hasVideo)
{
FlvTag tag;
tag.reserve( 13 );
tag.append( 'F' );
tag.append( 'L' );
tag.append( 'V' );
tag.append( 0x01 ); // Version
tag.append( ( hasAudio ? 0x04 : 0x00 ) | ( hasVideo ? 0x01 : 0x00 ) ); // Flags
tag.append( char(0) ); // DataOffset
tag.append( char(0) ); // DataOffset
tag.append( char(0) ); // DataOffset
tag.append( 0x09 ); // DataOffset
tag.append( char(0) ); // PreviousTagSize
tag.append( char(0) ); // PreviousTagSize
tag.append( char(0) ); // PreviousTagSize
tag.append( char(0) ); // PreviousTagSize
return tag;
}
FlvTag FlvTag::flvTag(quint8 tagType, qint64 pts, qint64 dts, bool keyframe, quint8 *data, int size, bool sequenceHeader)
{
FlvTag tag;
tag.reserve( size + 32); // 32 sounds good. Bigest is probablly 20
tag.append( tagType );
quint32 dataSize = size;
switch( tagType )
{
case 9:
{
dataSize += 5; // 5 is video heaer size
tag.append( quint8( (dataSize >> 16) & 0xFF ) );
tag.append( quint8( (dataSize >> 8) & 0xFF ) );
tag.append( quint8( (dataSize >> 0) & 0xFF ) );
tag.append( quint8( (dts >> 16) & 0xFF ) );
tag.append( quint8( (dts >> 8) & 0xFF ) );
tag.append( quint8( (dts >> 0) & 0xFF ) );
tag.append( quint8( (dts >> 24) & 0xFF ) );
tag.append( char(0) ); // StreamId
tag.append( char(0) );
tag.append( char(0) );
tag.append( ( keyframe ? 0x10 : 0x20 ) | 0x07 ); // FrameType + CodecID
tag.append( sequenceHeader ? 0x00 : 0x01 );
pts = sequenceHeader ? 0 : (pts - dts);
tag.append( ( pts >> 16 ) & 0xFF );
tag.append( ( pts >> 8 ) & 0xFF );
tag.append( ( pts >> 0 ) & 0xFF );
} break;
case 8:
{
dataSize += 2; // a is aac heaer size
tag.append( quint8( (dataSize >> 16) & 0xFF ) );
tag.append( quint8( (dataSize >> 8) & 0xFF ) );
tag.append( quint8( (dataSize >> 0) & 0xFF ) );
tag.append( quint8( (dts >> 16) & 0xFF ) );
tag.append( quint8( (dts >> 8) & 0xFF ) );
tag.append( quint8( (dts >> 0) & 0xFF ) );
tag.append( quint8( (dts >> 24) & 0xFF ) );
tag.append( char(0) ); // StreamId
tag.append( char(0) );
tag.append( char(0) );
tag.append( 0xA0 | 0x0F ); // CodecID + SoundFormat
tag.append( sequenceHeader ? 0x00 : 0x01 );
} break;
default:
qDebug() << "Unknown tagType" << tagType;
return FlvTag();
}
tag.append( (const char*)data, size );
dataSize += 11;
tag.append( (dataSize >> 24) & 0xFF );
tag.append( (dataSize >> 16) & 0xFF );
tag.append( (dataSize >> 8) & 0xFF );
tag.append( (dataSize >> 0) & 0xFF );
return tag;
}