• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef __AAH_TX_PACKET_H__
18 #define __AAH_TX_PACKET_H__
19 
20 #include <media/stagefright/foundation/ABase.h>
21 #include <utils/LinearTransform.h>
22 #include <utils/RefBase.h>
23 #include <utils/Timers.h>
24 
25 namespace android {
26 
27 class TRTPPacket : public RefBase {
28   public:
29     enum TRTPHeaderType {
30         kHeaderTypeAudio = 1,
31         kHeaderTypeVideo = 2,
32         kHeaderTypeSubpicture = 3,
33         kHeaderTypeControl = 4,
34     };
35 
36     enum TRTPPayloadFlags {
37         kFlag_TSTransformPresent = 0x02,
38         kFlag_TSValid = 0x01,
39     };
40 
41   protected:
TRTPPacket(TRTPHeaderType headerType)42     TRTPPacket(TRTPHeaderType headerType)
43         : mIsPacked(false)
44         , mVersion(2)
45         , mPadding(false)
46         , mExtension(false)
47         , mCsrcCount(0)
48         , mPayloadType(100)
49         , mSeqNumber(0)
50         , mPTSValid(false)
51         , mPTS(0)
52         , mEpoch(0)
53         , mProgramID(0)
54         , mSubstreamID(0)
55         , mClockTranformValid(false)
56         , mTRTPVersion(1)
57         , mTRTPLength(0)
58         , mTRTPHeaderType(headerType)
59         , mPacket(NULL)
60         , mPacketLen(0) { }
61 
62   public:
63     virtual ~TRTPPacket();
64 
65     void setSeqNumber(uint16_t val);
66     uint16_t getSeqNumber() const;
67 
68     void setPTS(int64_t val);
69     int64_t getPTS() const;
70 
71     void setEpoch(uint32_t val);
72     void setProgramID(uint16_t val);
73     void setSubstreamID(uint16_t val);
74     void setClockTransform(const LinearTransform& trans);
75 
76     uint8_t* getPacket() const;
77     int getPacketLen() const;
78 
79     void setExpireTime(nsecs_t val);
80     nsecs_t getExpireTime() const;
81 
82     virtual bool pack() = 0;
83 
84     // mask for the number of bits in a TRTP epoch
85     static const uint32_t kTRTPEpochMask = (1 << 22) - 1;
86     static const int kTRTPEpochShift = 10;
87 
88   protected:
89     static const int kRTPHeaderLen = 12;
90     virtual int TRTPHeaderLen() const;
91 
92     void writeTRTPHeader(uint8_t*& buf,
93                          bool isFirstFragment,
94                          int totalPacketLen);
95 
96     void writeU8(uint8_t*& buf, uint8_t val);
97     void writeU16(uint8_t*& buf, uint16_t val);
98     void writeU32(uint8_t*& buf, uint32_t val);
99     void writeU64(uint8_t*& buf, uint64_t val);
100 
101     bool mIsPacked;
102 
103     uint8_t mVersion;
104     bool mPadding;
105     bool mExtension;
106     uint8_t mCsrcCount;
107     uint8_t mPayloadType;
108     uint16_t mSeqNumber;
109     bool mPTSValid;
110     int64_t  mPTS;
111     uint32_t mEpoch;
112     uint16_t mProgramID;
113     uint16_t mSubstreamID;
114     LinearTransform mClockTranform;
115     bool mClockTranformValid;
116     uint8_t mTRTPVersion;
117     uint32_t mTRTPLength;
118     TRTPHeaderType mTRTPHeaderType;
119 
120     uint8_t* mPacket;
121     int mPacketLen;
122 
123     nsecs_t mExpireTime;
124 
125     DISALLOW_EVIL_CONSTRUCTORS(TRTPPacket);
126 };
127 
128 class TRTPAudioPacket : public TRTPPacket {
129   public:
130     enum AudioPayloadFlags {
131         kFlag_AuxLengthPresent = 0x10,
132         kFlag_RandomAccessPoint = 0x08,
133         kFlag_Dropable = 0x04,
134         kFlag_Discontinuity = 0x02,
135         kFlag_EndOfStream = 0x01,
136     };
137 
TRTPAudioPacket()138     TRTPAudioPacket()
139         : TRTPPacket(kHeaderTypeAudio)
140         , mCodecType(kCodecInvalid)
141         , mRandomAccessPoint(false)
142         , mDropable(false)
143         , mDiscontinuity(false)
144         , mEndOfStream(false)
145         , mVolume(0)
146         , mAccessUnitData(NULL)
147         , mAccessUnitLen(0)
148         , mAuxData(NULL)
149         , mAuxDataLen(0) { }
150 
151     enum TRTPAudioCodecType {
152         kCodecInvalid = 0,
153         kCodecPCMBigEndian = 1,
154         kCodecPCMLittleEndian = 2,
155         kCodecMPEG1Audio = 3,
156         kCodecAACAudio = 4,
157     };
158 
159     void setCodecType(TRTPAudioCodecType val);
160     void setRandomAccessPoint(bool val);
161     void setDropable(bool val);
162     void setDiscontinuity(bool val);
163     void setEndOfStream(bool val);
164     void setVolume(uint8_t val);
165     void setAccessUnitData(const void* data, size_t len);
166     void setAuxData(const void* data, size_t len);
167 
168     virtual bool pack();
169 
170   protected:
171     virtual int TRTPHeaderLen() const;
172 
173   private:
174     TRTPAudioCodecType mCodecType;
175     bool mRandomAccessPoint;
176     bool mDropable;
177     bool mDiscontinuity;
178     bool mEndOfStream;
179     uint8_t mVolume;
180 
181     const void* mAccessUnitData;
182     size_t mAccessUnitLen;
183     const void* mAuxData;
184     size_t mAuxDataLen;
185 
186     DISALLOW_EVIL_CONSTRUCTORS(TRTPAudioPacket);
187 };
188 
189 class TRTPControlPacket : public TRTPPacket {
190   public:
TRTPControlPacket()191     TRTPControlPacket()
192         : TRTPPacket(kHeaderTypeControl)
193         , mCommandID(kCommandNop) {}
194 
195     enum TRTPCommandID {
196         kCommandNop   = 1,
197         kCommandFlush = 2,
198         kCommandEOS   = 3,
199     };
200 
201     void setCommandID(TRTPCommandID val);
202 
203     virtual bool pack();
204 
205   private:
206     TRTPCommandID mCommandID;
207 
208     DISALLOW_EVIL_CONSTRUCTORS(TRTPControlPacket);
209 };
210 
211 }  // namespace android
212 
213 #endif  // __AAH_TX_PLAYER_H__
214