blob: e5f171677bda3c4901af93afc34cbaf685b456da [file] [log] [blame]
Wei Jia53692fa2017-12-11 10:33:46 -08001/*
2 * Copyright 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Wei Jia2409c872018-02-02 10:34:33 -080017#ifndef RTSP_SOURCE2_H_
Wei Jia53692fa2017-12-11 10:33:46 -080018
Wei Jia2409c872018-02-02 10:34:33 -080019#define RTSP_SOURCE2_H_
Wei Jia53692fa2017-12-11 10:33:46 -080020
21#include "NuPlayer2Source.h"
22
23#include "ATSParser.h"
24
25namespace android {
26
27struct ALooper;
28struct AReplyToken;
29struct AnotherPacketSource;
30struct MyHandler;
31struct SDPLoader;
32
Wei Jia2409c872018-02-02 10:34:33 -080033struct NuPlayer2::RTSPSource2 : public NuPlayer2::Source {
34 RTSPSource2(
Wei Jia53692fa2017-12-11 10:33:46 -080035 const sp<AMessage> &notify,
36 const sp<MediaHTTPService> &httpService,
37 const char *url,
38 const KeyedVector<String8, String8> *headers,
Wei Jia53692fa2017-12-11 10:33:46 -080039 uid_t uid = 0,
40 bool isSDP = false);
41
42 virtual status_t getBufferingSettings(
43 BufferingSettings* buffering /* nonnull */) override;
44 virtual status_t setBufferingSettings(const BufferingSettings& buffering) override;
45
Wei Jiaf01e3122018-10-18 11:49:44 -070046 virtual void prepareAsync(int64_t startTimeUs);
Wei Jia53692fa2017-12-11 10:33:46 -080047 virtual void start();
48 virtual void stop();
49
50 virtual status_t feedMoreTSData();
51
52 virtual status_t dequeueAccessUnit(bool audio, sp<ABuffer> *accessUnit);
53
54 virtual status_t getDuration(int64_t *durationUs);
55 virtual status_t seekTo(
56 int64_t seekTimeUs,
57 MediaPlayer2SeekMode mode = MediaPlayer2SeekMode::SEEK_PREVIOUS_SYNC) override;
58
59 void onMessageReceived(const sp<AMessage> &msg);
60
61protected:
Wei Jia2409c872018-02-02 10:34:33 -080062 virtual ~RTSPSource2();
Wei Jia53692fa2017-12-11 10:33:46 -080063
64 virtual sp<MetaData> getFormatMeta(bool audio);
65
66private:
67 enum {
68 kWhatNotify = 'noti',
69 kWhatDisconnect = 'disc',
70 kWhatPerformSeek = 'seek',
71 kWhatPollBuffering = 'poll',
72 kWhatSignalEOS = 'eos ',
73 };
74
75 enum State {
76 DISCONNECTED,
77 CONNECTING,
78 CONNECTED,
79 SEEKING,
80 };
81
82 enum Flags {
83 // Don't log any URLs.
84 kFlagIncognito = 1,
85 };
86
87 struct TrackInfo {
88 sp<AnotherPacketSource> mSource;
89
90 int32_t mTimeScale;
91 uint32_t mRTPTime;
92 int64_t mNormalPlaytimeUs;
93 bool mNPTMappingValid;
94 };
95
96 sp<MediaHTTPService> mHTTPService;
97 AString mURL;
98 KeyedVector<String8, String8> mExtraHeaders;
Wei Jia53692fa2017-12-11 10:33:46 -080099 uid_t mUID;
100 uint32_t mFlags;
101 bool mIsSDP;
102 State mState;
103 status_t mFinalResult;
104 sp<AReplyToken> mDisconnectReplyID;
105 Mutex mBufferingLock;
106 bool mBuffering;
107 bool mInPreparationPhase;
108 bool mEOSPending;
109
110 Mutex mBufferingSettingsLock;
111 BufferingSettings mBufferingSettings;
112
113 sp<ALooper> mLooper;
114 sp<MyHandler> mHandler;
115 sp<SDPLoader> mSDPLoader;
116
117 Vector<TrackInfo> mTracks;
118 sp<AnotherPacketSource> mAudioTrack;
119 sp<AnotherPacketSource> mVideoTrack;
120
121 sp<ATSParser> mTSParser;
122
123 int32_t mSeekGeneration;
124
125 int64_t mEOSTimeoutAudio;
126 int64_t mEOSTimeoutVideo;
127
128 sp<AReplyToken> mSeekReplyID;
129
130 sp<AnotherPacketSource> getSource(bool audio);
131
132 void onConnected();
133 void onSDPLoaded(const sp<AMessage> &msg);
134 void onDisconnected(const sp<AMessage> &msg);
135 void finishDisconnectIfPossible();
136
137 void performSeek(int64_t seekTimeUs);
138 void schedulePollBuffering();
139 void checkBuffering(
140 bool *prepared,
141 bool *underflow,
142 bool *overflow,
143 bool *startServer,
144 bool *finished);
145 void onPollBuffering();
146
147 bool haveSufficientDataOnAllTracks();
148
149 void setEOSTimeout(bool audio, int64_t timeout);
150 void setError(status_t err);
151 void startBufferingIfNecessary();
152 bool stopBufferingIfNecessary();
153 void finishSeek(status_t err);
154
155 void postSourceEOSIfNecessary();
156 void signalSourceEOS(status_t result);
157 void onSignalEOS(const sp<AMessage> &msg);
158
159 bool sourceNearEOS(bool audio);
160 bool sourceReachedEOS(bool audio);
161
Wei Jia2409c872018-02-02 10:34:33 -0800162 DISALLOW_EVIL_CONSTRUCTORS(RTSPSource2);
Wei Jia53692fa2017-12-11 10:33:46 -0800163};
164
165} // namespace android
166
Wei Jia2409c872018-02-02 10:34:33 -0800167#endif // RTSP_SOURCE2_H_