12bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber/* 22bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Copyright (C) 2010 The Android Open Source Project 32bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * 42bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 52bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * you may not use this file except in compliance with the License. 62bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * You may obtain a copy of the License at 72bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * 82bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 92bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * 102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * Unless required by applicable law or agreed to in writing, software 112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 122bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * See the License for the specific language governing permissions and 142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber * limitations under the License. 152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber */ 162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#ifndef RTSP_SOURCE_H_ 182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#define RTSP_SOURCE_H_ 202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include "NuPlayerSource.h" 222bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 23cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber#include "ATSParser.h" 24cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 252bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubernamespace android { 262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstruct ALooper; 283f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken; 292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstruct AnotherPacketSource; 302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstruct MyHandler; 317a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhéstruct SDPLoader; 322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstruct NuPlayer::RTSPSource : public NuPlayer::Source { 342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber RTSPSource( 35b5f25f005bc1d3ae35f45b58c88345e183dc336dAndreas Huber const sp<AMessage> ¬ify, 361b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber const char *url, 382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber const KeyedVector<String8, String8> *headers, 392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber bool uidValid = false, 407a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé uid_t uid = 0, 417a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé bool isSDP = false); 422bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 439575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber virtual void prepareAsync(); 442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber virtual void start(); 452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber virtual void stop(); 462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber virtual status_t feedMoreTSData(); 482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit); 502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber virtual status_t getDuration(int64_t *durationUs); 522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber virtual status_t seekTo(int64_t seekTimeUs); 53b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void onMessageReceived(const sp<AMessage> &msg); 552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberprotected: 572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber virtual ~RTSPSource(); 582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 59840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber virtual sp<MetaData> getFormatMeta(bool audio); 60840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber 612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberprivate: 622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber enum { 632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber kWhatNotify = 'noti', 642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber kWhatDisconnect = 'disc', 65ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber kWhatPerformSeek = 'seek', 66641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih kWhatPollBuffering = 'poll', 672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber }; 682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber enum State { 702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber DISCONNECTED, 712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber CONNECTING, 722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber CONNECTED, 732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber SEEKING, 742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber }; 752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber enum Flags { 772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber // Don't log any URLs. 782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber kFlagIncognito = 1, 792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber }; 802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 81641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih // Buffer Prepare/Underflow/Overflow/Resume Marks 82641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih static const int64_t kPrepareMarkUs; 83641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih static const int64_t kUnderflowMarkUs; 84641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih static const int64_t kOverflowMarkUs; 85641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih static const int64_t kStartServerMarkUs; 86641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih 872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber struct TrackInfo { 882bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber sp<AnotherPacketSource> mSource; 892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber int32_t mTimeScale; 912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber uint32_t mRTPTime; 922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber int64_t mNormalPlaytimeUs; 931906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber bool mNPTMappingValid; 942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber }; 952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 961b86fe063badb5f28c467ade39be0f4008688947Andreas Huber sp<IMediaHTTPService> mHTTPService; 972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber AString mURL; 982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber KeyedVector<String8, String8> mExtraHeaders; 992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber bool mUIDValid; 1002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber uid_t mUID; 1012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber uint32_t mFlags; 1027a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé bool mIsSDP; 1032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber State mState; 1042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber status_t mFinalResult; 1053f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDisconnectReplyID; 106180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang Mutex mBufferingLock; 107b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson bool mBuffering; 108641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih bool mInPreparationPhase; 1092bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1102bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber sp<ALooper> mLooper; 1112bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber sp<MyHandler> mHandler; 1127a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé sp<SDPLoader> mSDPLoader; 1132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber Vector<TrackInfo> mTracks; 1152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber sp<AnotherPacketSource> mAudioTrack; 1162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber sp<AnotherPacketSource> mVideoTrack; 1172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 118cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber sp<ATSParser> mTSParser; 119cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber 120ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber int32_t mSeekGeneration; 121ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber 122b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson int64_t mEOSTimeoutAudio; 123b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson int64_t mEOSTimeoutVideo; 124b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 1258d237a5ce1e3c1dbc1d538f47e68cff2cc52d799Robert Shih sp<AReplyToken> mSeekReplyID; 1268d237a5ce1e3c1dbc1d538f47e68cff2cc52d799Robert Shih 1272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber sp<AnotherPacketSource> getSource(bool audio); 1282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void onConnected(); 1307a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé void onSDPLoaded(const sp<AMessage> &msg); 1312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void onDisconnected(const sp<AMessage> &msg); 1322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber void finishDisconnectIfPossible(); 1332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 134ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber void performSeek(int64_t seekTimeUs); 135641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih void schedulePollBuffering(); 136641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih void checkBuffering(bool *prepared, bool *underflow, bool *overflow, bool *startServer); 137641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih void onPollBuffering(); 138ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber 139bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber bool haveSufficientDataOnAllTracks(); 140bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber 141b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson void setEOSTimeout(bool audio, int64_t timeout); 142180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang void setError(status_t err); 143180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang void startBufferingIfNecessary(); 144180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang bool stopBufferingIfNecessary(); 1458d237a5ce1e3c1dbc1d538f47e68cff2cc52d799Robert Shih void finishSeek(status_t err); 146b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson 1472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber DISALLOW_EVIL_CONSTRUCTORS(RTSPSource); 1482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}; 1492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber} // namespace android 1512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber 1522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#endif // RTSP_SOURCE_H_ 153