17a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber/* 27a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * Copyright (C) 2010 The Android Open Source Project 37a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * 47a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 57a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * you may not use this file except in compliance with the License. 67a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * You may obtain a copy of the License at 77a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * 87a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 97a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * 107a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * Unless required by applicable law or agreed to in writing, software 117a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 127a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * See the License for the specific language governing permissions and 147a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber * limitations under the License. 157a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber */ 167a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 177a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber#ifndef A_RTP_CONNECTION_H_ 187a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 197a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber#define A_RTP_CONNECTION_H_ 207a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 217a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber#include <media/stagefright/foundation/AHandler.h> 227a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber#include <utils/List.h> 237a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 247a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Hubernamespace android { 257a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 267a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huberstruct ABuffer; 277a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huberstruct ARTPSource; 287a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huberstruct ASessionDescription; 297a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 307a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huberstruct ARTPConnection : public AHandler { 31f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber enum Flags { 32f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber kRegularlyRequestFIR = 2, 33f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber }; 34f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber 35f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber ARTPConnection(uint32_t flags = 0); 367a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 377a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void addStream( 387a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber int rtpSocket, int rtcpSocket, 397a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber const sp<ASessionDescription> &sessionDesc, size_t index, 400416da73a0addfc7b3eddfea4a6a0a0215e1dd0bAndreas Huber const sp<AMessage> ¬ify, 410416da73a0addfc7b3eddfea4a6a0a0215e1dd0bAndreas Huber bool injected); 427a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 437a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void removeStream(int rtpSocket, int rtcpSocket); 447a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 450416da73a0addfc7b3eddfea4a6a0a0215e1dd0bAndreas Huber void injectPacket(int index, const sp<ABuffer> &buffer); 460416da73a0addfc7b3eddfea4a6a0a0215e1dd0bAndreas Huber 477a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber // Creates a pair of UDP datagram sockets bound to adjacent ports 487a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber // (the rtpSocket is bound to an even port, the rtcpSocket to the 497a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber // next higher port). 507a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber static void MakePortPair( 517a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber int *rtpSocket, int *rtcpSocket, unsigned *rtpPort); 527a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 537a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huberprotected: 547a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber virtual ~ARTPConnection(); 557a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 567a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 577a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huberprivate: 587a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber enum { 597a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber kWhatAddStream, 607a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber kWhatRemoveStream, 617a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber kWhatPollStreams, 620416da73a0addfc7b3eddfea4a6a0a0215e1dd0bAndreas Huber kWhatInjectPacket, 637a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber }; 647a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 657a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber static const int64_t kSelectTimeoutUs; 667a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 67f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber uint32_t mFlags; 68f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber 697a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber struct StreamInfo; 707a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber List<StreamInfo> mStreams; 717a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 727a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber bool mPollEventPending; 7357648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber int64_t mLastReceiverReportTimeUs; 747a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 757a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void onAddStream(const sp<AMessage> &msg); 767a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void onRemoveStream(const sp<AMessage> &msg); 777a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void onPollStreams(); 780416da73a0addfc7b3eddfea4a6a0a0215e1dd0bAndreas Huber void onInjectPacket(const sp<AMessage> &msg); 7957648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber void onSendReceiverReports(); 807a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 817a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber status_t receive(StreamInfo *info, bool receiveRTP); 827a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 837a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber status_t parseRTP(StreamInfo *info, const sp<ABuffer> &buffer); 847a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber status_t parseRTCP(StreamInfo *info, const sp<ABuffer> &buffer); 857a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber status_t parseSR(StreamInfo *info, const uint8_t *data, size_t size); 8657648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber status_t parseBYE(StreamInfo *info, const uint8_t *data, size_t size); 8757648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber 8857648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber sp<ARTPSource> findSource(StreamInfo *info, uint32_t id); 897a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 907a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void postPollEvent(); 917a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 927a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ARTPConnection); 937a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber}; 947a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 957a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber} // namespace android 967a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 977a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber#endif // A_RTP_CONNECTION_H_ 98