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> &notify,
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
4348fa06d1e80a872c7495804979256e021e566ae0Wei Jia    virtual status_t getDefaultBufferingSettings(
4448fa06d1e80a872c7495804979256e021e566ae0Wei Jia            BufferingSettings* buffering /* nonnull */) override;
4548fa06d1e80a872c7495804979256e021e566ae0Wei Jia    virtual status_t setBufferingSettings(const BufferingSettings& buffering) override;
4648fa06d1e80a872c7495804979256e021e566ae0Wei Jia
479575c96b6e418914e2ffc6741ecc8d71e3968dbeAndreas Huber    virtual void prepareAsync();
482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual void start();
492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual void stop();
502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual status_t feedMoreTSData();
522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual status_t getDuration(int64_t *durationUs);
56c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia    virtual status_t seekTo(
57c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            int64_t seekTimeUs,
58c5de09127e9e0d5df7aa587be317e1487d793245Wei Jia            MediaPlayerSeekMode mode = MediaPlayerSeekMode::SEEK_PREVIOUS_SYNC) override;
59b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber
602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void onMessageReceived(const sp<AMessage> &msg);
612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberprotected:
632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual ~RTSPSource();
642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
65840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber    virtual sp<MetaData> getFormatMeta(bool audio);
66840667883fd09d44015716d79bc3ac4d60edc0f0Andreas Huber
672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberprivate:
682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    enum {
692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        kWhatNotify          = 'noti',
702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        kWhatDisconnect      = 'disc',
71ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber        kWhatPerformSeek     = 'seek',
72641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih        kWhatPollBuffering   = 'poll',
73f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih        kWhatSignalEOS       = 'eos ',
7448fa06d1e80a872c7495804979256e021e566ae0Wei Jia        kWhatSetBufferingSettings = 'sBuS',
752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    };
762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    enum State {
782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        DISCONNECTED,
792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        CONNECTING,
802bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        CONNECTED,
812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        SEEKING,
822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    };
832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    enum Flags {
852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        // Don't log any URLs.
862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        kFlagIncognito = 1,
872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    };
882bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    struct TrackInfo {
902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        sp<AnotherPacketSource> mSource;
912bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        int32_t mTimeScale;
932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        uint32_t mRTPTime;
942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        int64_t mNormalPlaytimeUs;
951906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber        bool mNPTMappingValid;
962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    };
972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
981b86fe063badb5f28c467ade39be0f4008688947Andreas Huber    sp<IMediaHTTPService> mHTTPService;
992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    AString mURL;
1002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    KeyedVector<String8, String8> mExtraHeaders;
1012bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    bool mUIDValid;
1022bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    uid_t mUID;
1032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    uint32_t mFlags;
1047a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    bool mIsSDP;
1052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    State mState;
1062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    status_t mFinalResult;
1073f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar    sp<AReplyToken> mDisconnectReplyID;
108180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang    Mutex mBufferingLock;
109b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson    bool mBuffering;
110641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih    bool mInPreparationPhase;
111f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih    bool mEOSPending;
11248fa06d1e80a872c7495804979256e021e566ae0Wei Jia    BufferingSettings mBufferingSettings;
1132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<ALooper> mLooper;
1152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<MyHandler> mHandler;
1167a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    sp<SDPLoader> mSDPLoader;
1172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    Vector<TrackInfo> mTracks;
1192bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AnotherPacketSource> mAudioTrack;
1202bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AnotherPacketSource> mVideoTrack;
1212bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
122cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber    sp<ATSParser> mTSParser;
123cfaeeec0900014d97e15829e0fa52f865ee4c786Andreas Huber
124ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    int32_t mSeekGeneration;
125ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
126b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson    int64_t mEOSTimeoutAudio;
127b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson    int64_t mEOSTimeoutVideo;
128b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson
1298d237a5ce1e3c1dbc1d538f47e68cff2cc52d799Robert Shih    sp<AReplyToken> mSeekReplyID;
1308d237a5ce1e3c1dbc1d538f47e68cff2cc52d799Robert Shih
1312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AnotherPacketSource> getSource(bool audio);
1322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void onConnected();
1347a33b7740412accf6a1cc912686c8d0acfb2a883Oscar Rydhé    void onSDPLoaded(const sp<AMessage> &msg);
1352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void onDisconnected(const sp<AMessage> &msg);
1362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void finishDisconnectIfPossible();
1372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
138ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    void performSeek(int64_t seekTimeUs);
139641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih    void schedulePollBuffering();
140f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih    void checkBuffering(
141f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih            bool *prepared,
142f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih            bool *underflow,
143f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih            bool *overflow,
144f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih            bool *startServer,
145f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih            bool *finished);
146641e0c718da1c58e5b89379f60465c4e564ebb73Robert Shih    void onPollBuffering();
147ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
148bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    bool haveSufficientDataOnAllTracks();
149bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
150b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson    void setEOSTimeout(bool audio, int64_t timeout);
151180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang    void setError(status_t err);
152180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang    void startBufferingIfNecessary();
153180d1b96ee2312f1056a58e26884a89d25ab62c8Chong Zhang    bool stopBufferingIfNecessary();
1548d237a5ce1e3c1dbc1d538f47e68cff2cc52d799Robert Shih    void finishSeek(status_t err);
155b50e83eca302a12f0fced6e7bab1b8617d63deaaRoger Jönsson
156f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih    void postSourceEOSIfNecessary();
157f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih    void signalSourceEOS(status_t result);
158f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih    void onSignalEOS(const sp<AMessage> &msg);
159f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih
160f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih    bool sourceNearEOS(bool audio);
161f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih    bool sourceReachedEOS(bool audio);
162f1d261f1b5914ddc219a23b763ab19363eeedd85Robert Shih
1632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(RTSPSource);
1642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber};
1652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}  // namespace android
1672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#endif  // RTSP_SOURCE_H_
169