-
Notifications
You must be signed in to change notification settings - Fork 4
/
sample_entry.h
162 lines (138 loc) · 4.91 KB
/
sample_entry.h
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
//
// Created by wlanjie on 2018/3/10.
//
#ifndef MP4_SAMPLEENTRY_H
#define MP4_SAMPLEENTRY_H
#include "container.h"
#include "sampledescription.h"
namespace mp4 {
class SampleEntry : public Container {
public:
SampleEntry(Atom::Type format, const AtomParent* details = nullptr);
SampleEntry(Atom::Type format, Size size, ByteStream& stream, AtomFactory& factory);
virtual ~SampleEntry() {}
UI16 getDataReferenceIndex() { return dataReferenceIndex; }
virtual Result write(ByteStream& stream);
virtual SampleDescription* toSampleDescription();
virtual Atom* clone();
virtual void onChildChanged(Atom* child);
protected:
SampleEntry(Atom::Type format, Size size);
virtual void read(ByteStream& stream, AtomFactory& factory);
virtual Size getFieldsSize();
virtual Result readFields(ByteStream& stream);
virtual Result writeFields(ByteStream& stream);
UI08 reserved1[6];
UI16 dataReferenceIndex;
};
class VisualSampleEntry : public SampleEntry {
public:
VisualSampleEntry(Atom::Type format,
UI16 width,
UI16 height,
UI16 depth,
const char* compressorName,
const AtomParent* details = nullptr);
VisualSampleEntry(Atom::Type format,
Size size,
ByteStream& stream,
AtomFactory& factory);
UI16 getWidth() { return width; }
UI16 getHeight() { return height; }
UI32 getHorizResolution() { return horizResolution; }
UI32 getVertResolution() { return vertResolution; }
UI16 getDepth() { return depth; }
const char* getCompressorName() { return compressorName.getChars(); }
SampleDescription* toSampleDescription();
protected:
virtual Size getFieldsSize();
virtual Result readFields(ByteStream& stream);
virtual Result writeFields(ByteStream& stream);
UI16 predefined1; // = 0
UI16 reserved2; // = 0
UI08 predefined2[12]; // = 0
UI16 width;
UI16 height;
UI32 horizResolution; // = 0x00480000 (72 dpi)
UI32 vertResolution; // = 0x00480000 (72 dpi)
UI32 reserved3; // = 0
UI16 frameCount; // = 1
String compressorName;
UI16 depth; // = 0x0018
UI16 predefined3; // = 0xFFFF
};
class AvcSampleEntry : public VisualSampleEntry {
public:
AvcSampleEntry(UI32 format,
Size size,
ByteStream& stream,
AtomFactory& factory);
AvcSampleEntry(UI32 format,
UI16 width,
UI16 height,
UI16 depth,
const char* compressorName,
const AtomParent* details);
virtual SampleDescription* toSampleDescription();
};
class HevcSampleEntry : public VisualSampleEntry {
public:
HevcSampleEntry(UI32 format,
Size size,
ByteStream& stream,
AtomFactory& factory);
HevcSampleEntry(UI32 format,
UI16 width,
UI16 height,
UI16 depth,
const char* compressorName,
const AtomParent* details);
virtual SampleDescription* toSampleDescription();
};
class AudioSampleEntry : public SampleEntry {
public:
AudioSampleEntry(Atom::Type format, UI32 sampleRate, UI16 sampleSize, UI16 channelCount);
AudioSampleEntry(Atom::Type format, Size size, ByteStream& stream, AtomFactory& factory);
UI32 getSampleRete();
UI16 getSampleSize() { return sampleSize; }
UI16 getChannelCount();
SampleDescription* toSampleDescription();
protected:
virtual Size getFieldsSize();
virtual Result readFields(ByteStream& stream);
virtual Result writeFields(ByteStream& stream);
UI16 qtVersion;
UI16 qtRevision;
UI32 qtVendor;
UI16 channelCount;
UI16 sampleSize;
UI16 qtCompressionId;
UI16 qtPacketSize;
UI32 sampleRate;
UI32 qtV1SamplesPerPacket;
UI32 qtV1BytesPerPacket;
UI32 qtV1BytesPerFrame;
UI32 qtV1BytesPerSample;
UI32 qtV2StructSize;
double qtV2SampleRate64;
UI32 qtV2ChannelCount;
UI32 qtV2Reserved;
UI32 qtV2BitsPerChannel;
UI32 qtV2FormatSpecificFlags;
UI32 qtV2BytesPerAudioPacket;
UI32 qtV2LPCMFramesPerAudioPacket;
DataBuffer qtV2Extension;
};
class MpegAudioSampleEntry : public AudioSampleEntry {
public:
MpegAudioSampleEntry(UI32 type, UI32 sampleRate, UI16 sampleSize, UI16 channelCount, EsDescriptor* descriptor);
MpegAudioSampleEntry(UI32 type, Size size, ByteStream& stream, AtomFactory& factory);
SampleDescription* toSampleDescription();
};
class Mp4aSampleEntry : public MpegAudioSampleEntry {
public:
Mp4aSampleEntry(Size size, ByteStream& stream, AtomFactory& factory);
Mp4aSampleEntry(UI32 sampleRate, UI16 sampleSize, UI16 channelCount, EsDescriptor* descriptor);
};
}
#endif //MP4_SAMPLEENTRY_H