/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef __AAH_TX_PACKET_H__ #define __AAH_TX_PACKET_H__ #include #include #include #include namespace android { class TRTPPacket : public RefBase { public: enum TRTPHeaderType { kHeaderTypeAudio = 1, kHeaderTypeVideo = 2, kHeaderTypeSubpicture = 3, kHeaderTypeControl = 4, }; enum TRTPPayloadFlags { kFlag_TSTransformPresent = 0x02, kFlag_TSValid = 0x01, }; protected: TRTPPacket(TRTPHeaderType headerType) : mIsPacked(false) , mVersion(2) , mPadding(false) , mExtension(false) , mCsrcCount(0) , mPayloadType(100) , mSeqNumber(0) , mPTSValid(false) , mPTS(0) , mEpoch(0) , mProgramID(0) , mSubstreamID(0) , mClockTranformValid(false) , mTRTPVersion(1) , mTRTPLength(0) , mTRTPHeaderType(headerType) , mPacket(NULL) , mPacketLen(0) { } public: virtual ~TRTPPacket(); void setSeqNumber(uint16_t val); uint16_t getSeqNumber() const; void setPTS(int64_t val); int64_t getPTS() const; void setEpoch(uint32_t val); void setProgramID(uint16_t val); void setSubstreamID(uint16_t val); void setClockTransform(const LinearTransform& trans); uint8_t* getPacket() const; int getPacketLen() const; void setExpireTime(nsecs_t val); nsecs_t getExpireTime() const; virtual bool pack() = 0; // mask for the number of bits in a TRTP epoch static const uint32_t kTRTPEpochMask = (1 << 22) - 1; static const int kTRTPEpochShift = 10; protected: static const int kRTPHeaderLen = 12; virtual int TRTPHeaderLen() const; void writeTRTPHeader(uint8_t*& buf, bool isFirstFragment, int totalPacketLen); void writeU8(uint8_t*& buf, uint8_t val); void writeU16(uint8_t*& buf, uint16_t val); void writeU32(uint8_t*& buf, uint32_t val); void writeU64(uint8_t*& buf, uint64_t val); bool mIsPacked; uint8_t mVersion; bool mPadding; bool mExtension; uint8_t mCsrcCount; uint8_t mPayloadType; uint16_t mSeqNumber; bool mPTSValid; int64_t mPTS; uint32_t mEpoch; uint16_t mProgramID; uint16_t mSubstreamID; LinearTransform mClockTranform; bool mClockTranformValid; uint8_t mTRTPVersion; uint32_t mTRTPLength; TRTPHeaderType mTRTPHeaderType; uint8_t* mPacket; int mPacketLen; nsecs_t mExpireTime; DISALLOW_EVIL_CONSTRUCTORS(TRTPPacket); }; class TRTPAudioPacket : public TRTPPacket { public: enum AudioPayloadFlags { kFlag_AuxLengthPresent = 0x10, kFlag_RandomAccessPoint = 0x08, kFlag_Dropable = 0x04, kFlag_Discontinuity = 0x02, kFlag_EndOfStream = 0x01, }; TRTPAudioPacket() : TRTPPacket(kHeaderTypeAudio) , mCodecType(kCodecInvalid) , mRandomAccessPoint(false) , mDropable(false) , mDiscontinuity(false) , mEndOfStream(false) , mVolume(0) , mAccessUnitData(NULL) , mAccessUnitLen(0) , mAuxData(NULL) , mAuxDataLen(0) { } enum TRTPAudioCodecType { kCodecInvalid = 0, kCodecPCMBigEndian = 1, kCodecPCMLittleEndian = 2, kCodecMPEG1Audio = 3, kCodecAACAudio = 4, }; void setCodecType(TRTPAudioCodecType val); void setRandomAccessPoint(bool val); void setDropable(bool val); void setDiscontinuity(bool val); void setEndOfStream(bool val); void setVolume(uint8_t val); void setAccessUnitData(const void* data, size_t len); void setAuxData(const void* data, size_t len); virtual bool pack(); protected: virtual int TRTPHeaderLen() const; private: TRTPAudioCodecType mCodecType; bool mRandomAccessPoint; bool mDropable; bool mDiscontinuity; bool mEndOfStream; uint8_t mVolume; const void* mAccessUnitData; size_t mAccessUnitLen; const void* mAuxData; size_t mAuxDataLen; DISALLOW_EVIL_CONSTRUCTORS(TRTPAudioPacket); }; class TRTPControlPacket : public TRTPPacket { public: TRTPControlPacket() : TRTPPacket(kHeaderTypeControl) , mCommandID(kCommandNop) {} enum TRTPCommandID { kCommandNop = 1, kCommandFlush = 2, kCommandEOS = 3, }; void setCommandID(TRTPCommandID val); virtual bool pack(); private: TRTPCommandID mCommandID; DISALLOW_EVIL_CONSTRUCTORS(TRTPControlPacket); }; } // namespace android #endif // __AAH_TX_PLAYER_H__