File: Ap4SegmentBuilder.h

package info (click to toggle)
kodi-inputstream-adaptive 2.6.14%2Bds1-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 4,036 kB
  • sloc: cpp: 53,019; ansic: 492; makefile: 10
file content (166 lines) | stat: -rw-r--r-- 5,961 bytes parent folder | download
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
163
164
165
166
/*****************************************************************
|
|    AP4 - Segment Builder
|
|    Copyright 2002-2014 Axiomatic Systems, LLC
|
|
|    This file is part of Bento4/AP4 (MP4 Atom Processing Library).
|
|    Unless you have obtained Bento4 under a difference license,
|    this version of Bento4 is Bento4|GPL.
|    Bento4|GPL is free software; you can redistribute it and/or modify
|    it under the terms of the GNU General Public License as published by
|    the Free Software Foundation; either version 2, or (at your option)
|    any later version.
|
|    Bento4|GPL is distributed in the hope that it will be useful,
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
|    GNU General Public License for more details.
|
|    You should have received a copy of the GNU General Public License
|    along with Bento4|GPL; see the file COPYING.  If not, write to the
|    Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|    02111-1307, USA.
|
 ****************************************************************/

#ifndef _AP4_SEGMENT_BUILDER_H_
#define _AP4_SEGMENT_BUILDER_H_

/*----------------------------------------------------------------------
|   includes
+---------------------------------------------------------------------*/
#include "Ap4Types.h"
#include "../Codecs/Ap4AvcParser.h"
#include "../Codecs/Ap4AdtsParser.h"
#include "Ap4List.h"
#include "Ap4Sample.h"
#include "Ap4String.h"
#include "Ap4Track.h"

/*----------------------------------------------------------------------
|   class references
+---------------------------------------------------------------------*/
class AP4_ByteStream;
class AP4_MpegAudioSampleDescription;

/*----------------------------------------------------------------------
|   AP4_SegmentBuilder
+---------------------------------------------------------------------*/
class AP4_SegmentBuilder
{
public:
    // constructor and destructor
    AP4_SegmentBuilder(AP4_Track::Type track_type,
                       AP4_UI32        track_id,
                       AP4_UI64        media_time_origin = 0);
    virtual ~AP4_SegmentBuilder();
    
    // accessors
    AP4_UI32               GetTrackId()        { return m_TrackId;        }
    AP4_UI32               GetTimescale()      { return m_Timescale;      }
    AP4_UI64               GetMediaStartTime() { return m_MediaStartTime; }
    AP4_UI64               GetMediaDuration()  { return m_MediaDuration;  }
    AP4_Array<AP4_Sample>& GetSamples()        { return m_Samples;        }
    
    // methods
    virtual AP4_Result AddSample(AP4_Sample& sample);
    virtual AP4_Result WriteMediaSegment(AP4_ByteStream& stream, unsigned int sequence_number);
    virtual AP4_Result WriteInitSegment(AP4_ByteStream& stream) = 0;
    
protected:
    // methods
    AP4_Track::Type       m_TrackType;
    AP4_UI32              m_TrackId;
    AP4_String            m_TrackLanguage;
    AP4_UI32              m_Timescale;
    AP4_UI64              m_SampleStartNumber;
    AP4_UI64              m_MediaTimeOrigin;
    AP4_UI64              m_MediaStartTime;
    AP4_UI64              m_MediaDuration;
    AP4_Array<AP4_Sample> m_Samples;
};

/*----------------------------------------------------------------------
|   AP4_FeedSegmentBuilder
+---------------------------------------------------------------------*/
class AP4_FeedSegmentBuilder : public AP4_SegmentBuilder
{
public:
    // constructor
    AP4_FeedSegmentBuilder(AP4_Track::Type track_type,
                           AP4_UI32        track_id,
                           AP4_UI64        media_time_origin = 0);
    
    // methods
    virtual AP4_Result Feed(const void* data,
                            AP4_Size    data_size,
                            AP4_Size&   bytes_consumed) = 0;    
};

/*----------------------------------------------------------------------
|   AP4_AvcSegmentBuilder
+---------------------------------------------------------------------*/
class AP4_AvcSegmentBuilder : public AP4_FeedSegmentBuilder
{
public:
    // constructor
    AP4_AvcSegmentBuilder(AP4_UI32 track_id,
                          double   frames_per_second,
                          AP4_UI64 media_time_origin = 0);
    
    // AP4_SegmentBuilder methods
    virtual AP4_Result WriteMediaSegment(AP4_ByteStream& stream, unsigned int sequence_number);
    virtual AP4_Result WriteInitSegment(AP4_ByteStream& stream);

    // methods
    AP4_Result Feed(const void* data,
                    AP4_Size    data_size,
                    AP4_Size&   bytes_consumed);
    
protected:
    // types
    struct SampleOrder {
        SampleOrder(AP4_UI32 decode_order, AP4_UI32 display_order) :
            m_DecodeOrder(decode_order),
            m_DisplayOrder(display_order) {}
        AP4_UI32        m_DecodeOrder;
        AP4_UI32        m_DisplayOrder;
    };
    
    // methods
    void SortSamples(SampleOrder* array, unsigned int n);

    // members
    AP4_AvcFrameParser     m_FrameParser;
    double                 m_FramesPerSecond;
    AP4_Array<SampleOrder> m_SampleOrders;
};

/*----------------------------------------------------------------------
|   AP4_AacSegmentBuilder
+---------------------------------------------------------------------*/
class AP4_AacSegmentBuilder : public AP4_FeedSegmentBuilder
{
public:
    // constructor
    AP4_AacSegmentBuilder(AP4_UI32 track_id, AP4_UI64 media_time_origin = 0);
    ~AP4_AacSegmentBuilder();
    
    // AP4_SegmentBuilder methods
    virtual AP4_Result WriteInitSegment(AP4_ByteStream& stream);

    // methods
    AP4_Result Feed(const void* data,
                    AP4_Size    data_size,
                    AP4_Size&   bytes_consumed);
    
protected:
    // members
    AP4_AdtsParser                  m_FrameParser;
    AP4_MpegAudioSampleDescription* m_SampleDescription;
};

#endif // _AP4_SEGMENT_BUILDER_H_