1fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber/* 2fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * Copyright 2012, The Android Open Source Project 3fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * 4fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * you may not use this file except in compliance with the License. 6fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * You may obtain a copy of the License at 7fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * 8fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * 10fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * Unless required by applicable law or agreed to in writing, software 11fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * See the License for the specific language governing permissions and 14fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber * limitations under the License. 15fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber */ 16fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 17fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#ifndef RTP_SINK_H_ 18fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 19fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#define RTP_SINK_H_ 20fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 21fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#include <media/stagefright/foundation/AHandler.h> 22fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 23fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#include "LinearRegression.h" 24fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 25fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#include <gui/Surface.h> 26fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 27fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Hubernamespace android { 28fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 29fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct ABuffer; 30fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct ANetworkSession; 31fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct TunnelRenderer; 32fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 33fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber// Creates a pair of sockets for RTP/RTCP traffic, instantiates a renderer 34fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber// for incoming transport stream data and occasionally sends statistics over 35fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber// the RTCP channel. 36fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberstruct RTPSink : public AHandler { 37fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber RTPSink(const sp<ANetworkSession> &netSession, 38fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber const sp<ISurfaceTexture> &surfaceTex); 39fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 40fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber // If TCP interleaving is used, no UDP sockets are created, instead 41fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber // incoming RTP/RTCP packets (arriving on the RTSP control connection) 42fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber // are manually injected by WifiDisplaySink. 43fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber status_t init(bool useTCPInterleaving); 44fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 45fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber status_t connect( 46fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber const char *host, int32_t remoteRtpPort, int32_t remoteRtcpPort); 47fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 48fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber int32_t getRTPPort() const; 49fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 50fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber status_t injectPacket(bool isRTP, const sp<ABuffer> &buffer); 51fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 52fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberprotected: 53fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 54fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber virtual ~RTPSink(); 55fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 56fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huberprivate: 57fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber enum { 58fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber kWhatRTPNotify, 59fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber kWhatRTCPNotify, 60fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber kWhatSendRR, 61fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber kWhatPacketLost, 62fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber kWhatInject, 63fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber }; 64fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 65fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber struct Source; 66fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber struct StreamSource; 67fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 68fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber sp<ANetworkSession> mNetSession; 69fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber sp<ISurfaceTexture> mSurfaceTex; 70fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber KeyedVector<uint32_t, sp<Source> > mSources; 71fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 72fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber int32_t mRTPPort; 73fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber int32_t mRTPSessionID; 74fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber int32_t mRTCPSessionID; 75fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 76fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber int64_t mFirstArrivalTimeUs; 77fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber int64_t mNumPacketsReceived; 78fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber LinearRegression mRegression; 79fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber int64_t mMaxDelayMs; 80fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 81fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber sp<TunnelRenderer> mRenderer; 82fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 83fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber status_t parseRTP(const sp<ABuffer> &buffer); 84fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber status_t parseRTCP(const sp<ABuffer> &buffer); 85fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber status_t parseBYE(const uint8_t *data, size_t size); 86fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber status_t parseSR(const uint8_t *data, size_t size); 87fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 88fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber void addSDES(const sp<ABuffer> &buffer); 89fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber void onSendRR(); 90fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber void onPacketLost(const sp<AMessage> &msg); 91fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber void scheduleSendRR(); 92fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 93fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(RTPSink); 94fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber}; 95fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 96fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber} // namespace android 97fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber 98fbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96Andreas Huber#endif // RTP_SINK_H_ 99