forked from ponchio/untrunc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
track.h
92 lines (68 loc) · 2.28 KB
/
track.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
//==================================================================//
/*
Untrunc - track.h
Untrunc is GPL software; you can freely distribute,
redistribute, modify & use under the terms of the GNU General
Public License; either version 2 or its successor.
Untrunc is distributed under the GPL "AS IS", without
any warranty; without the implied warranty of merchantability
or fitness for either an expressed or implied particular purpose.
Please see the included GNU General Public License (GPL) for
your rights and further details; see the file COPYING. If you
cannot, write to the Free Software Foundation, 59 Temple Place
Suite 330, Boston, MA 02111-1307, USA. Or www.fsf.org
Copyright 2010 Federico Ponchio
*/
//==================================================================//
#ifndef TRACK_H
#define TRACK_H
#include <vector>
#include <string>
class Atom;
struct AVCodecContext;
struct AVCodec;
class Codec {
public:
std::string name;
AVCodecContext *context;
AVCodec *codec;
Codec();
bool parse(Atom *trak, std::vector<int> &offsets, Atom *mdat);
void clear();
bool matchSample(const unsigned char *start, int maxlength);
bool isKeyframe (const unsigned char *start, int maxlength);
int getLength ( unsigned char *start, int maxlength, int &duration);
private:
// Used by mp4a.
int mask1;
int mask0;
};
class Track {
public:
Atom *trak;
int timescale;
int duration;
Codec codec;
std::vector<int> times;
std::vector<int> keyframes; // 0 based!
std::vector<int> sizes;
std::vector<int> offsets; // Should be 64-bit!
Track();
bool parse(Atom *trak, Atom *mdat);
void clear();
void writeToAtoms();
void fixTimes();
protected:
void cleanUp();
std::vector<int> getSampleTimes (Atom *t);
std::vector<int> getKeyframes (Atom *t);
std::vector<int> getSampleSizes (Atom *t);
std::vector<int> getChunkOffsets (Atom *t);
std::vector<int> getSampleToChunk(Atom *t, int nchunks);
void saveSampleTimes();
void saveKeyframes();
void saveSampleSizes();
void saveSampleToChunk();
void saveChunkOffsets();
};
#endif // TRACK_H