ARTPConnection.h revision f88f84414ae7baead03497f1d650ad8ea2f87688
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 kFakeTimestamps = 1, 33f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber kRegularlyRequestFIR = 2, 34f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber }; 35f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber 36f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber ARTPConnection(uint32_t flags = 0); 377a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 387a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void addStream( 397a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber int rtpSocket, int rtcpSocket, 407a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber const sp<ASessionDescription> &sessionDesc, size_t index, 417a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber const sp<AMessage> ¬ify); 427a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 437a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void removeStream(int rtpSocket, int rtcpSocket); 447a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 457a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber // Creates a pair of UDP datagram sockets bound to adjacent ports 467a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber // (the rtpSocket is bound to an even port, the rtcpSocket to the 477a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber // next higher port). 487a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber static void MakePortPair( 497a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber int *rtpSocket, int *rtcpSocket, unsigned *rtpPort); 507a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 517a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huberprotected: 527a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber virtual ~ARTPConnection(); 537a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 547a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 557a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huberprivate: 567a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber enum { 577a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber kWhatAddStream, 587a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber kWhatRemoveStream, 597a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber kWhatPollStreams, 607a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber }; 617a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 627a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber static const int64_t kSelectTimeoutUs; 637a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 64f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber uint32_t mFlags; 65f88f84414ae7baead03497f1d650ad8ea2f87688Andreas Huber 667a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber struct StreamInfo; 677a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber List<StreamInfo> mStreams; 687a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 697a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber bool mPollEventPending; 7057648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber int64_t mLastReceiverReportTimeUs; 717a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 727a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void onAddStream(const sp<AMessage> &msg); 737a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void onRemoveStream(const sp<AMessage> &msg); 747a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void onPollStreams(); 7557648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber void onSendReceiverReports(); 767a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 777a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber status_t receive(StreamInfo *info, bool receiveRTP); 787a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 797a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber status_t parseRTP(StreamInfo *info, const sp<ABuffer> &buffer); 807a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber status_t parseRTCP(StreamInfo *info, const sp<ABuffer> &buffer); 817a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber status_t parseSR(StreamInfo *info, const uint8_t *data, size_t size); 8257648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber status_t parseBYE(StreamInfo *info, const uint8_t *data, size_t size); 8357648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber 8457648e4eec7dd2593af467877bc7cce4aa654759Andreas Huber sp<ARTPSource> findSource(StreamInfo *info, uint32_t id); 857a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 867a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber void postPollEvent(); 877a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 887a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(ARTPConnection); 897a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber}; 907a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 917a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber} // namespace android 927a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber 937a747b8e0dadf909ea4ac0b67fd88fc14b4eb3f8Andreas Huber#endif // A_RTP_CONNECTION_H_ 94