PlaylistFetcher.h revision 1da7ee098ac97d2fdd2cff16a2bfa51fd1889ad8
1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (C) 2012 The Android Open Source Project 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Licensed under the Apache License, Version 2.0 (the "License"); 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * you may not use this file except in compliance with the License. 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * You may obtain a copy of the License at 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * http://www.apache.org/licenses/LICENSE-2.0 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Unless required by applicable law or agreed to in writing, software 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * distributed under the License is distributed on an "AS IS" BASIS, 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * See the License for the specific language governing permissions and 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * limitations under the License. 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#ifndef PLAYLIST_FETCHER_H_ 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define PLAYLIST_FETCHER_H_ 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <media/stagefright/foundation/AHandler.h> 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "mpeg2ts/ATSParser.h" 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "LiveSession.h" 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgnamespace android { 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstruct ABuffer; 29474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstruct AnotherPacketSource; 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstruct DataSource; 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstruct HTTPBase; 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstruct LiveDataSource; 33474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstruct M3UParser; 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstruct String8; 35474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstruct PlaylistFetcher : public AHandler { 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org enum { 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatStarted, 39474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatPaused, 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatStopped, 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatError, 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatDurationUpdate, 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatTemporarilyDoneFetching, 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatPrepared, 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatPreparationFailed, 46474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatStartedAt, 47474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org }; 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org PlaylistFetcher( 50474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const sp<AMessage> ¬ify, 51474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const sp<LiveSession> &session, 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const char *uri); 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sp<DataSource> getDataSource(); 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void startAsync( 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const sp<AnotherPacketSource> &audioSource, 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const sp<AnotherPacketSource> &videoSource, 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const sp<AnotherPacketSource> &subtitleSource, 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t startTimeUs = -1ll, 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t minStartTimeUs = 0ll /* start after this timestamp */, 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int32_t startSeqNumberHint = -1 /* try starting at this sequence number */); 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void pauseAsync(); 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void stopAsync(bool selfTriggered = false); 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void resumeUntilAsync(const sp<AMessage> ¶ms); 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgprotected: 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org virtual ~PlaylistFetcher(); 72474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org virtual void onMessageReceived(const sp<AMessage> &msg); 73474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgprivate: 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org enum { 76474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kMaxNumRetries = 5, 77474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org }; 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org enum { 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatStart = 'strt', 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatPause = 'paus', 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatStop = 'stop', 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatMonitorQueue = 'moni', 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatResumeUntil = 'rsme', 85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org kWhatDownloadNext = 'dlnx', 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org }; 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org static const int64_t kMinBufferedDurationUs; 89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org static const int64_t kMaxMonitorDelayUs; 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org static const int32_t kDownloadBlockSize; 91474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org static const int32_t kNumSkipFrames; 92474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org static bool bufferStartsWithTsSyncByte(const sp<ABuffer>& buffer); 94474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 95474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // notifications to mSession 96474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sp<AMessage> mNotify; 97474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sp<AMessage> mStartTimeUsNotify; 98474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 99474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sp<LiveSession> mSession; 100474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org AString mURI; 101474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org AString mVideoMime; 102474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 103474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org uint32_t mStreamTypeMask; 104474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t mStartTimeUs; 105474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t mMinStartTimeUs; // start fetching no earlier than this value 106474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sp<AMessage> mStopParams; // message containing the latest timestamps we should fetch. 107474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 108474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org KeyedVector<LiveSession::StreamType, sp<AnotherPacketSource> > 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org mPacketSources; 110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org KeyedVector<AString, sp<ABuffer> > mAESKeyForURI; 112474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 113474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t mLastPlaylistFetchTimeUs; 114474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sp<M3UParser> mPlaylist; 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int32_t mSeqNumber; 116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int32_t mNumRetries; 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bool mStartup; 118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bool mPrepared; 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bool mSkipToFirstIDRAfterConnect; 120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t mNextPTSTimeUs; 121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int32_t mMonitorQueueGeneration; 123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org enum RefreshState { 125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org INITIAL_MINIMUM_RELOAD_DELAY, 126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org FIRST_UNCHANGED_RELOAD_ATTEMPT, 127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org SECOND_UNCHANGED_RELOAD_ATTEMPT, 128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org THIRD_UNCHANGED_RELOAD_ATTEMPT 129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org }; 130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org RefreshState mRefreshState; 131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org uint8_t mPlaylistHash[16]; 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 134474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org sp<ATSParser> mTSParser; 135474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bool mFirstPTSValid; 137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org uint64_t mFirstPTS; 138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t mAbsoluteTimeAnchorUs; 139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 140474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // Stores the initialization vector to decrypt the next block of cipher text, which can 141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // either be derived from the sequence number, read from the manifest, or copied from 142474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // the last block of cipher text (cipher-block chaining). 143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned char mAESInitVec[16]; 144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // Set first to true if decrypting the first segment of a playlist segment. When 146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // first is true, reset the initialization vector based on the available 147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // information in the manifest; otherwise, use the initialization vector as 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // updated by the last call to AES_cbc_encrypt. 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // 150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // For the input to decrypt correctly, decryptBuffer must be called on 151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // consecutive byte ranges on block boundaries, e.g. 0..15, 16..47, 48..63, 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // and so on. 153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org status_t decryptBuffer( 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org size_t playlistIndex, const sp<ABuffer> &buffer, 155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org bool first = true); 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org status_t checkDecryptPadding(const sp<ABuffer> &buffer); 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void postMonitorQueue(int64_t delayUs = 0, int64_t minDelayUs = 0); 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void cancelMonitorQueue(); 160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t delayUsToRefreshPlaylist() const; 162ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org status_t refreshPlaylist(); 163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // Returns the media time in us of the segment specified by seqNumber. 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // This is computed by summing the durations of all segments before it. 166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t getSegmentStartTimeUs(int32_t seqNumber) const; 167ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 168ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org status_t onStart(const sp<AMessage> &msg); 169ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org void onPause(); 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void onStop(const sp<AMessage> &msg); 171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void onMonitorQueue(); 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void onDownloadNext(); 173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 174ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org // Resume a fetcher to continue until the stopping point stored in msg. 175ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org status_t onResumeUntil(const sp<AMessage> &msg); 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org status_t extractAndQueueAccessUnitsFromTs(const sp<ABuffer> &buffer); 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org status_t extractAndQueueAccessUnits( 180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const sp<ABuffer> &buffer, const sp<AMessage> &itemMeta); 181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 182ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org void notifyError(status_t err); 183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org void queueDiscontinuity( 185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ATSParser::DiscontinuityType type, const sp<AMessage> &extra); 186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int32_t getSeqNumberForTime(int64_t timeUs) const; 188ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org 189ab3cb4e3f1f39482ee3bd15c6918af868144d6dejohannkoenig@chromium.org void updateDuration(); 190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 191474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // Before resuming a fetcher in onResume, check the remaining duration is longer than that 192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org // returned by resumeThreshold. 193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int64_t resumeThreshold(const sp<AMessage> &msg); 194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org DISALLOW_EVIL_CONSTRUCTORS(PlaylistFetcher); 196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org}; 197ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 198ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org} // namespace android 199ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 200ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org#endif // PLAYLIST_FETCHER_H_ 201ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org 202ed759d81a39febed3a8a395386639d54307504aagrunell@chromium.org