1a44153c1a57202fb538659eb50706e60454d6273Andreas Huber/* 2a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * Copyright (C) 2010 The Android Open Source Project 3a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * 4a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * you may not use this file except in compliance with the License. 6a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * You may obtain a copy of the License at 7a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * 8a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * 10a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * Unless required by applicable law or agreed to in writing, software 11a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * See the License for the specific language governing permissions and 14a44153c1a57202fb538659eb50706e60454d6273Andreas Huber * limitations under the License. 15a44153c1a57202fb538659eb50706e60454d6273Andreas Huber */ 16a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 17a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#ifndef LIVE_SESSION_H_ 18a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 19a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#define LIVE_SESSION_H_ 20a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 21a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#include <media/stagefright/foundation/AHandler.h> 2289bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih#include <media/mediaplayer.h> 23a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 24ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber#include <utils/String8.h> 25ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber 260852843d304006e3ab333081fddda13b07193de8Robert Shih#include "mpeg2ts/ATSParser.h" 270852843d304006e3ab333081fddda13b07193de8Robert Shih 28a44153c1a57202fb538659eb50706e60454d6273Andreas Hubernamespace android { 29a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 30a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct ABuffer; 313f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnarstruct AReplyToken; 3214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct AnotherPacketSource; 33ee4e1b1a63758941460ae79a064249d3a5189443Lajos Molnarclass DataSource; 3414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct HTTPBase; 351b86fe063badb5f28c467ade39be0f4008688947Andreas Huberstruct IMediaHTTPService; 36a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveDataSource; 37a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct M3UParser; 3814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct PlaylistFetcher; 39d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhangstruct HLSTime; 405abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhangstruct HTTPDownloader; 41a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 42a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveSession : public AHandler { 437314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber enum Flags { 447314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber // Don't log any URLs. 457314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber kFlagIncognito = 1, 467314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber }; 47a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 488ca002eedc747dd854b61cbe364b52c06869273fRobert Shih enum StreamIndex { 498ca002eedc747dd854b61cbe364b52c06869273fRobert Shih kAudioIndex = 0, 508ca002eedc747dd854b61cbe364b52c06869273fRobert Shih kVideoIndex = 1, 518ca002eedc747dd854b61cbe364b52c06869273fRobert Shih kSubtitleIndex = 2, 528ca002eedc747dd854b61cbe364b52c06869273fRobert Shih kMaxStreams = 3, 530852843d304006e3ab333081fddda13b07193de8Robert Shih kMetaDataIndex = 3, 540852843d304006e3ab333081fddda13b07193de8Robert Shih kNumSources = 4, 558ca002eedc747dd854b61cbe364b52c06869273fRobert Shih }; 568ca002eedc747dd854b61cbe364b52c06869273fRobert Shih 5714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber enum StreamType { 588ca002eedc747dd854b61cbe364b52c06869273fRobert Shih STREAMTYPE_AUDIO = 1 << kAudioIndex, 598ca002eedc747dd854b61cbe364b52c06869273fRobert Shih STREAMTYPE_VIDEO = 1 << kVideoIndex, 608ca002eedc747dd854b61cbe364b52c06869273fRobert Shih STREAMTYPE_SUBTITLES = 1 << kSubtitleIndex, 610852843d304006e3ab333081fddda13b07193de8Robert Shih STREAMTYPE_METADATA = 1 << kMetaDataIndex, 6214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 63964adb17885185808398507d2de88665fe193ee2Chong Zhang 64a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang enum SeekMode { 65a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang kSeekModeExactPosition = 0, // used for seeking 66a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang kSeekModeNextSample = 1, // used for seamless switching 67a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang kSeekModeNextSegment = 2, // used for seamless switching 68a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang }; 69a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 70964adb17885185808398507d2de88665fe193ee2Chong Zhang LiveSession( 71964adb17885185808398507d2de88665fe193ee2Chong Zhang const sp<AMessage> ¬ify, 72964adb17885185808398507d2de88665fe193ee2Chong Zhang uint32_t flags, 73964adb17885185808398507d2de88665fe193ee2Chong Zhang const sp<IMediaHTTPService> &httpService); 74964adb17885185808398507d2de88665fe193ee2Chong Zhang 750852843d304006e3ab333081fddda13b07193de8Robert Shih int64_t calculateMediaTimeUs(int64_t firstTimeUs, int64_t timeUs, int32_t discontinuitySeq); 7614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t dequeueAccessUnit(StreamType stream, sp<ABuffer> *accessUnit); 7714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 7814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t getStreamFormat(StreamType stream, sp<AMessage> *format); 79a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 805abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang sp<HTTPDownloader> getHTTPDownloader(); 81a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang 8214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void connectAsync( 83ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber const char *url, 84ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber const KeyedVector<String8, String8> *headers = NULL); 85ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber 8614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t disconnect(); 87a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 88a44153c1a57202fb538659eb50706e60454d6273Andreas Huber // Blocks until seek is complete. 8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber status_t seekTo(int64_t timeUs); 90a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 91b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber status_t getDuration(int64_t *durationUs) const; 92404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang size_t getTrackCount() const; 93404fced9bfa8fa423ee210a271ca051ffd1bec13Chong Zhang sp<AMessage> getTrackInfo(size_t trackIndex) const; 94dcb89b3b505522efde173c105a851c412f947178Chong Zhang status_t selectTrack(size_t index, bool select); 9589bf2525c5b57f17260de5b00c5f3f78ac4b881eRobert Shih ssize_t getSelectedTrack(media_track_type /* type */) const; 96b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 97b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber bool isSeekable() const; 98b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber bool hasDynamicDuration() const; 99a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 1007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang static const char *getKeyForStream(StreamType type); 10125f82752942b1c78aec8ee303d61afff85cff9d1Chong Zhang static const char *getNameForStream(StreamType type); 1020852843d304006e3ab333081fddda13b07193de8Robert Shih static ATSParser::SourceType getSourceTypeForStream(StreamType type); 1037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 1040df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber enum { 10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatStreamsChanged, 10614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatError, 1070df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber kWhatPrepared, 1080df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber kWhatPreparationFailed, 1097c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang kWhatBufferingStart, 1107c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang kWhatBufferingEnd, 1117c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang kWhatBufferingUpdate, 1120852843d304006e3ab333081fddda13b07193de8Robert Shih kWhatMetadataDetected, 1130df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber }; 1140df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 115a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprotected: 116a44153c1a57202fb538659eb50706e60454d6273Andreas Huber virtual ~LiveSession(); 117a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 118a44153c1a57202fb538659eb50706e60454d6273Andreas Huber virtual void onMessageReceived(const sp<AMessage> &msg); 119a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 120a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprivate: 12114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber friend struct PlaylistFetcher; 122a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 123a44153c1a57202fb538659eb50706e60454d6273Andreas Huber enum { 12414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatConnect = 'conn', 12514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatDisconnect = 'disc', 12614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatSeek = 'seek', 12714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatFetcherNotify = 'notf', 128dcb89b3b505522efde173c105a851c412f947178Chong Zhang kWhatChangeConfiguration = 'chC0', 12914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatChangeConfiguration2 = 'chC2', 13014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber kWhatChangeConfiguration3 = 'chC3', 131964adb17885185808398507d2de88665fe193ee2Chong Zhang kWhatPollBuffering = 'poll', 132a44153c1a57202fb538659eb50706e60454d6273Andreas Huber }; 133a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 1347c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang // Bandwidth Switch Mark Defaults 135765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang static const int64_t kUpSwitchMarkUs; 136765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang static const int64_t kDownSwitchMarkUs; 137765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang static const int64_t kUpSwitchMarginUs; 138d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang static const int64_t kResumeThresholdUs; 1397c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 1407c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang // Buffer Prepare/Ready/Underflow Marks 141765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang static const int64_t kReadyMarkUs; 142765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang static const int64_t kPrepareMarkUs; 143765f27c2376e83766d9e1d8f8136025c5437ce49Chong Zhang static const int64_t kUnderflowMarkUs; 144a93fd2be99d21629bed504b9b7df035fc2f54562Leena Winterrowd 145538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang struct BandwidthEstimator; 146a44153c1a57202fb538659eb50706e60454d6273Andreas Huber struct BandwidthItem { 14714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber size_t mPlaylistIndex; 148a44153c1a57202fb538659eb50706e60454d6273Andreas Huber unsigned long mBandwidth; 1495ef659e010e90175eb5282d9642a02f6105189bfChong Zhang int64_t mLastFailureUs; 150a44153c1a57202fb538659eb50706e60454d6273Andreas Huber }; 151a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 15214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber struct FetcherInfo { 15314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<PlaylistFetcher> mFetcher; 15414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mDurationUs; 1551543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih bool mToBeRemoved; 156a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang bool mToBeResumed; 15714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber }; 15814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 1598ca002eedc747dd854b61cbe364b52c06869273fRobert Shih struct StreamItem { 1608ca002eedc747dd854b61cbe364b52c06869273fRobert Shih const char *mType; 161f4a48dfa8570d6a4708a868b8b15d1236f7ca54bRobert Shih AString mUri, mNewUri; 162a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang SeekMode mSeekMode; 163309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih size_t mCurDiscontinuitySeq; 164309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mLastDequeuedTimeUs; 165309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mLastSampleDurationUs; 166309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih StreamItem() 167a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang : StreamItem("") {} 168309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih StreamItem(const char *type) 169309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih : mType(type), 17081636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang mSeekMode(kSeekModeExactPosition) { 17181636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang reset(); 17281636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang } 17381636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang void reset() { 17481636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang mCurDiscontinuitySeq = 0; 17581636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang mLastDequeuedTimeUs = -1ll; 17681636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang mLastSampleDurationUs = 0ll; 17781636761bead03f13b4ed9320a7f25ce1354f1aeChong Zhang } 1788ca002eedc747dd854b61cbe364b52c06869273fRobert Shih AString uriKey() { 1798ca002eedc747dd854b61cbe364b52c06869273fRobert Shih AString key(mType); 1808ca002eedc747dd854b61cbe364b52c06869273fRobert Shih key.append("URI"); 1818ca002eedc747dd854b61cbe364b52c06869273fRobert Shih return key; 1828ca002eedc747dd854b61cbe364b52c06869273fRobert Shih } 1838ca002eedc747dd854b61cbe364b52c06869273fRobert Shih }; 1848ca002eedc747dd854b61cbe364b52c06869273fRobert Shih StreamItem mStreams[kMaxStreams]; 1858ca002eedc747dd854b61cbe364b52c06869273fRobert Shih 1860df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber sp<AMessage> mNotify; 1877314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber uint32_t mFlags; 1881b86fe063badb5f28c467ade39be0f4008688947Andreas Huber sp<IMediaHTTPService> mHTTPService; 1897314fa17093d514199fedcb55ac41136a1b31cb3Andreas Huber 1907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool mBuffering; 1910df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber bool mInPreparationPhase; 1927c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t mPollBufferingGeneration; 1937c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int32_t mPrevBufferPercentage; 1940df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 19514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<String8, String8> mExtraHeaders; 196a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 197a44153c1a57202fb538659eb50706e60454d6273Andreas Huber AString mMasterURL; 198ad0d9c9c39a24b7fbd94e935a5855c9025341929Andreas Huber 199a44153c1a57202fb538659eb50706e60454d6273Andreas Huber Vector<BandwidthItem> mBandwidthItems; 200309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih ssize_t mCurBandwidthIndex; 2017c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang ssize_t mOrigBandwidthIndex; 202a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang int32_t mLastBandwidthBps; 2035ef659e010e90175eb5282d9642a02f6105189bfChong Zhang bool mLastBandwidthStable; 204538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang sp<BandwidthEstimator> mBandwidthEstimator; 20514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 206a44153c1a57202fb538659eb50706e60454d6273Andreas Huber sp<M3UParser> mPlaylist; 207a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang int32_t mMaxWidth; 208a0d0ba51ad60a68117a0ee78e37ab78715b8a069Chong Zhang int32_t mMaxHeight; 2097e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber 210964adb17885185808398507d2de88665fe193ee2Chong Zhang sp<ALooper> mFetcherLooper; 21114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<AString, FetcherInfo> mFetcherInfos; 21214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber uint32_t mStreamMask; 21314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2141543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // Masks used during reconfiguration: 2151543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // mNewStreamMask: streams in the variant playlist we're switching to; 2161543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // we don't want to immediately overwrite the original value. 2171543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih uint32_t mNewStreamMask; 2181543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih 2191543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // mSwapMask: streams that have started to playback content in the new variant playlist; 2201543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // we use this to track reconfiguration progress. 2211543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih uint32_t mSwapMask; 2221543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih 22314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources; 2241543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih // A second set of packet sources that buffer content for the variant we're switching to. 2251543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih KeyedVector<StreamType, sp<AnotherPacketSource> > mPacketSources2; 2261543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih 2271543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih int32_t mSwitchGeneration; 228b44ce2f84691559672cfaf6bb8fd3a9ac43904f2Robert Shih int32_t mSubtitleGeneration; 22914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 23014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber size_t mContinuationCounter; 23114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<AMessage> mContinuation; 2325ce50c1931e1e3d8f113394bbe2c9f99354f4c5fRobert Shih sp<AMessage> mSeekReply; 23314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 23414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber int64_t mLastDequeuedTimeUs; 235dcb89b3b505522efde173c105a851c412f947178Chong Zhang int64_t mRealTimeBaseUs; 23614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 23714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber bool mReconfigurationInProgress; 2381543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih bool mSwitchInProgress; 2397c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t mUpSwitchMark; 2407c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t mDownSwitchMark; 2417c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t mUpSwitchMargin; 2427c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 2433f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mDisconnectReplyID; 2443f27436a9346f043f52265da1e6a74cde2bffd4dLajos Molnar sp<AReplyToken> mSeekReplyID; 24514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 246309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih bool mFirstTimeUsValid; 247309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mFirstTimeUs; 248309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih int64_t mLastSeekTimeUs; 2490852843d304006e3ab333081fddda13b07193de8Robert Shih bool mHasMetadata; 2500852843d304006e3ab333081fddda13b07193de8Robert Shih 251309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih KeyedVector<size_t, int64_t> mDiscontinuityAbsStartTimesUs; 252309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih KeyedVector<size_t, int64_t> mDiscontinuityOffsetTimesUs; 253309aa8bf5e4cd66fe988adf2654cac3fadc2a1c3Robert Shih 25414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber sp<PlaylistFetcher> addFetcher(const char *uri); 2557e43a5a2dcfa9bc64ef477472a33c87a84695c09Andreas Huber 256a44153c1a57202fb538659eb50706e60454d6273Andreas Huber void onConnect(const sp<AMessage> &msg); 2575abbd3dcbb0bb32a3d4b90dddbcf90458967eb6fChong Zhang void onMasterPlaylistFetched(const sp<AMessage> &msg); 258a1151185c7eb3b4c483f7067deba1775fd0a2510Lajos Molnar void onSeek(const sp<AMessage> &msg); 25914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber 2600852843d304006e3ab333081fddda13b07193de8Robert Shih bool UriIsSameAsIndex( const AString &uri, int32_t index, bool newUri); 2610852843d304006e3ab333081fddda13b07193de8Robert Shih sp<AnotherPacketSource> getPacketSourceForStreamIndex(size_t trackIndex, bool newUri); 2620852843d304006e3ab333081fddda13b07193de8Robert Shih sp<AnotherPacketSource> getMetadataSource( 2630852843d304006e3ab333081fddda13b07193de8Robert Shih sp<AnotherPacketSource> sources[kNumSources], uint32_t streamMask, bool newUri); 2640852843d304006e3ab333081fddda13b07193de8Robert Shih 2657c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool resumeFetcher( 2667c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang const AString &uri, uint32_t streamMask, 2677c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t timeUs = -1ll, bool newUri = false); 2687c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 269a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang float getAbortThreshold( 270a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang ssize_t currentBWIndex, ssize_t targetBWIndex) const; 271538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang void addBandwidthMeasurement(size_t numBytes, int64_t delayUs); 272538b6d22a3578c0201d48f8548289aa254d81484Chong Zhang size_t getBandwidthIndex(int32_t bandwidthBps); 2735ef659e010e90175eb5282d9642a02f6105189bfChong Zhang ssize_t getLowestValidBandwidthIndex() const; 274d47dfcb5a2e5901c96fc92662cec7aa30f7f8843Chong Zhang HLSTime latestMediaSegmentStartTime() const; 275a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 2765ef659e010e90175eb5282d9642a02f6105189bfChong Zhang static bool isBandwidthValid(const BandwidthItem &item); 27714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber static int SortByBandwidth(const BandwidthItem *, const BandwidthItem *); 2788ca002eedc747dd854b61cbe364b52c06869273fRobert Shih static StreamType indexToType(int idx); 279f69c996864844e8f669308af8412cede043062a2Robert Shih static ssize_t typeToIndex(int32_t type); 280a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 281dcb89b3b505522efde173c105a851c412f947178Chong Zhang void changeConfiguration( 2827c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang int64_t timeUs, ssize_t bwIndex = -1, bool pickTrack = false); 283dcb89b3b505522efde173c105a851c412f947178Chong Zhang void onChangeConfiguration(const sp<AMessage> &msg); 28414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onChangeConfiguration2(const sp<AMessage> &msg); 28514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void onChangeConfiguration3(const sp<AMessage> &msg); 2867c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang 287a48d372833ccec13c96ece9efcc226e8beac7f59Chong Zhang void swapPacketSource(StreamType stream); 2887c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void tryToFinishBandwidthSwitch(const AString &oldUri); 2897c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void cancelBandwidthSwitch(bool resume = false); 2907c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool checkSwitchProgress( 2917c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang sp<AMessage> &msg, int64_t delayUs, bool *needResumeUntil); 292a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 2938464d7decb34a3044e92b4085f1bbaafb51410e8Chong Zhang bool switchBandwidthIfNeeded(bool bufferHigh, bool bufferLow); 2945ef659e010e90175eb5282d9642a02f6105189bfChong Zhang bool tryBandwidthFallback(); 2951543d3c735a5ba4ddfcf8ab644575df13c7e30a9Robert Shih 296964adb17885185808398507d2de88665fe193ee2Chong Zhang void schedulePollBuffering(); 297964adb17885185808398507d2de88665fe193ee2Chong Zhang void cancelPollBuffering(); 2987c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void restartPollBuffering(); 299964adb17885185808398507d2de88665fe193ee2Chong Zhang void onPollBuffering(); 3007c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang bool checkBuffering(bool &underflow, bool &ready, bool &down, bool &up); 3017c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void startBufferingIfNecessary(); 3027c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void stopBufferingIfNecessary(); 3037c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void notifyBufferingUpdate(int32_t percentage); 304a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 30514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void finishDisconnect(); 306b7c8e91880463ff4981e3e53e98e45d68e2fe374Andreas Huber 30714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber void postPrepared(status_t err); 3087c8708046117e03c0d38006bdd9685139df3ac6bChong Zhang void postError(status_t err); 3090df36ec3303c2c6bf9b42c07945ac8bd234153f3Andreas Huber 310a44153c1a57202fb538659eb50706e60454d6273Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(LiveSession); 311a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}; 312a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 313a44153c1a57202fb538659eb50706e60454d6273Andreas Huber} // namespace android 314a44153c1a57202fb538659eb50706e60454d6273Andreas Huber 315a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#endif // LIVE_SESSION_H_ 316