RTSPSource.h revision bfd4d0d9fe0033abf3f55b94f30f6a58846a875e
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
232bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#include <media/stagefright/foundation/AHandlerReflector.h>
242bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
252bfdd428c56c7524d1a11979f200a1762866032dAndreas Hubernamespace android {
262bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
272bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstruct ALooper;
282bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstruct AnotherPacketSource;
292bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstruct MyHandler;
302bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
312bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberstruct NuPlayer::RTSPSource : public NuPlayer::Source {
322bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    RTSPSource(
332bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            const char *url,
342bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            const KeyedVector<String8, String8> *headers,
352bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            bool uidValid = false,
362bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber            uid_t uid = 0);
372bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
382bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual void start();
392bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual void stop();
402bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
412bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual status_t feedMoreTSData();
422bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
432bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual sp<MetaData> getFormat(bool audio);
442bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
452bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
462bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual status_t getDuration(int64_t *durationUs);
472bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual status_t seekTo(int64_t seekTimeUs);
482bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual bool isSeekable();
492bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
502bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void onMessageReceived(const sp<AMessage> &msg);
512bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
522bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberprotected:
532bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    virtual ~RTSPSource();
542bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
552bfdd428c56c7524d1a11979f200a1762866032dAndreas Huberprivate:
562bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    enum {
572bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        kWhatNotify          = 'noti',
582bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        kWhatDisconnect      = 'disc',
59ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber        kWhatPerformSeek     = 'seek',
602bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    };
612bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
622bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    enum State {
632bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        DISCONNECTED,
642bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        CONNECTING,
652bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        CONNECTED,
662bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        SEEKING,
672bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    };
682bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
692bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    enum Flags {
702bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        // Don't log any URLs.
712bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        kFlagIncognito = 1,
722bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    };
732bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
742bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    struct TrackInfo {
752bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        sp<AnotherPacketSource> mSource;
762bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
772bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        int32_t mTimeScale;
782bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        uint32_t mRTPTime;
792bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber        int64_t mNormalPlaytimeUs;
801906e5c7492b9cbc88601365536a69e9a490c963Andreas Huber        bool mNPTMappingValid;
812bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    };
822bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
832bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    AString mURL;
842bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    KeyedVector<String8, String8> mExtraHeaders;
852bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    bool mUIDValid;
862bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    uid_t mUID;
872bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    uint32_t mFlags;
882bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    State mState;
892bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    status_t mFinalResult;
902bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    uint32_t mDisconnectReplyID;
91bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    bool mStartingUp;
922bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
932bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<ALooper> mLooper;
942bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AHandlerReflector<RTSPSource> > mReflector;
952bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<MyHandler> mHandler;
962bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
972bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    Vector<TrackInfo> mTracks;
982bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AnotherPacketSource> mAudioTrack;
992bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AnotherPacketSource> mVideoTrack;
1002bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
101ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    int32_t mSeekGeneration;
102ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
1032bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    sp<AnotherPacketSource> getSource(bool audio);
1042bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1052bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void onConnected();
1062bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void onDisconnected(const sp<AMessage> &msg);
1072bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    void finishDisconnectIfPossible();
1082bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
109ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber    void performSeek(int64_t seekTimeUs);
110ee736e9e74c5368db8d63214513c85cb74bb0183Andreas Huber
111bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber    bool haveSufficientDataOnAllTracks();
112bfd4d0d9fe0033abf3f55b94f30f6a58846a875eAndreas Huber
1132bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber    DISALLOW_EVIL_CONSTRUCTORS(RTSPSource);
1142bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber};
1152bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1162bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber}  // namespace android
1172bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber
1182bfdd428c56c7524d1a11979f200a1762866032dAndreas Huber#endif  // RTSP_SOURCE_H_
119