/* * Copyright 2013, 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 RTP_RECEIVER_H_ #define RTP_RECEIVER_H_ #include "RTPBase.h" #include namespace android { struct ABuffer; struct ANetworkSession; // An object of this class facilitates receiving of media data on an RTP // channel. The channel is established over a UDP or TCP connection depending // on which "TransportMode" was chosen. In addition different RTP packetization // schemes are supported such as "Transport Stream Packets over RTP", // or "AVC/H.264 encapsulation as specified in RFC 3984 (non-interleaved mode)" struct RTPReceiver : public RTPBase, public AHandler { enum { kWhatInitDone, kWhatError, kWhatAccessUnit, kWhatPacketLost, }; RTPReceiver( const sp &netSession, const sp ¬ify); status_t registerPacketType( uint8_t packetType, PacketizationMode mode); status_t initAsync(TransportMode mode, int32_t *outLocalRTPPort); status_t connect( const char *remoteHost, int32_t remoteRTPPort, int32_t remoteRTCPPort); status_t notifyLateness(int64_t latenessUs); protected: virtual ~RTPReceiver(); virtual void onMessageReceived(const sp &msg); private: enum { kWhatRTPNotify, kWhatRTCPNotify, kWhatSendRR, }; enum { kSourceID = 0xdeadbeef, kPacketLostAfterUs = 100000, kRequestRetransmissionAfterUs = -1, }; struct Assembler; struct H264Assembler; struct Source; struct TSAssembler; sp mNetSession; sp mNotify; TransportMode mMode; int32_t mRTPSessionID; int32_t mRTCPSessionID; int32_t mRTPClientSessionID; // in TRANSPORT_TCP mode. KeyedVector mPacketTypes; KeyedVector > mSources; void onNetNotify(bool isRTP, const sp &msg); status_t onRTPData(const sp &data); status_t onRTCPData(const sp &data); void onSendRR(); void scheduleSendRR(); void addSDES(const sp &buffer); void notifyInitDone(status_t err); void notifyError(status_t err); void notifyPacketLost(); sp makeAssembler(uint8_t packetType); void requestRetransmission(uint32_t senderSSRC, int32_t extSeqNo); DISALLOW_EVIL_CONSTRUCTORS(RTPReceiver); }; } // namespace android #endif // RTP_RECEIVER_H_