114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber/*
214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * Copyright (C) 2012 The Android Open Source Project
314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber *
414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * you may not use this file except in compliance with the License.
614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * You may obtain a copy of the License at
714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber *
814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber *
1014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * Unless required by applicable law or agreed to in writing, software
1114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
1214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * See the License for the specific language governing permissions and
1414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber * limitations under the License.
1514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber */
1614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#ifndef PLAYLIST_FETCHER_H_
1814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
1914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#define PLAYLIST_FETCHER_H_
2014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#include <media/stagefright/foundation/AHandler.h>
2214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#include "mpeg2ts/ATSParser.h"
2414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#include "LiveSession.h"
2514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Hubernamespace android {
2714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
2814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct ABuffer;
2914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct AnotherPacketSource;
3014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct DataSource;
3114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct HTTPBase;
3214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct LiveDataSource;
3314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct M3UParser;
3414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct String8;
3514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
3614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberstruct PlaylistFetcher : public AHandler {
3714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum {
3814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStarted,
3914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPaused,
4014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStopped,
4114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatError,
4214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatDurationUpdate,
4314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatTemporarilyDoneFetching,
4414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPrepared,
4514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPreparationFailed,
4614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
4714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
4814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    PlaylistFetcher(
4914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<AMessage> &notify,
5014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<LiveSession> &session,
5114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const char *uri);
5214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
5314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<DataSource> getDataSource();
5414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
5514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void startAsync(
5614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<AnotherPacketSource> &audioSource,
5714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<AnotherPacketSource> &videoSource,
5814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            const sp<AnotherPacketSource> &subtitleSource,
5914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            int64_t startTimeUs = -1ll);
6014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
6114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void pauseAsync();
6214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
6314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void stopAsync();
6414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
6514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprotected:
6614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    virtual ~PlaylistFetcher();
6714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
6814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
6914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huberprivate:
7014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum {
7114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kMaxNumRetries         = 5,
7214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
7314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
7414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum {
7514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStart          = 'strt',
7614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatPause          = 'paus',
7714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatStop           = 'stop',
7814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        kWhatMonitorQueue   = 'moni',
7914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
8014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
8114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    static const int64_t kMinBufferedDurationUs;
8214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
8314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<AMessage> mNotify;
8414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<LiveSession> mSession;
8514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    AString mURI;
8614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
8714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint32_t mStreamTypeMask;
8814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mStartTimeUs;
8914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
9014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<LiveSession::StreamType, sp<AnotherPacketSource> >
9114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        mPacketSources;
9214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
9314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    KeyedVector<AString, sp<ABuffer> > mAESKeyForURI;
9414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
9514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mLastPlaylistFetchTimeUs;
9614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<M3UParser> mPlaylist;
9714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mSeqNumber;
9814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mNumRetries;
9914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mStartup;
10014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mNextPTSTimeUs;
10114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
10214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t mMonitorQueueGeneration;
10314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
10414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    enum RefreshState {
10514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        INITIAL_MINIMUM_RELOAD_DELAY,
10614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        FIRST_UNCHANGED_RELOAD_ATTEMPT,
10714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        SECOND_UNCHANGED_RELOAD_ATTEMPT,
10814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber        THIRD_UNCHANGED_RELOAD_ATTEMPT
10914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    };
11014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    RefreshState mRefreshState;
11114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint8_t mPlaylistHash[16];
11314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    sp<ATSParser> mTSParser;
11514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
11614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool mFirstPTSValid;
11714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    uint64_t mFirstPTS;
11814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t mAbsoluteTimeAnchorUs;
11914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
12014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t decryptBuffer(
12114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            size_t playlistIndex, const sp<ABuffer> &buffer);
12214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
12314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void postMonitorQueue(int64_t delayUs = 0);
12414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void cancelMonitorQueue();
12514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
12614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    bool timeToRefreshPlaylist(int64_t nowUs) const;
12714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
12814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    // Returns the media time in us of the segment specified by seqNumber.
12914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    // This is computed by summing the durations of all segments before it.
13014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int64_t getSegmentStartTimeUs(int32_t seqNumber) const;
13114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
13214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    status_t onStart(const sp<AMessage> &msg);
13314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onPause();
13414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onStop();
13514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onMonitorQueue();
13614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void onDownloadNext();
13714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
138dcb89b3b505522efde173c105a851c412f947178Chong Zhang    status_t extractAndQueueAccessUnits(
139dcb89b3b505522efde173c105a851c412f947178Chong Zhang            const sp<ABuffer> &buffer, const sp<AMessage> &itemMeta);
14014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
14114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void notifyError(status_t err);
14214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
14314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void queueDiscontinuity(
14414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber            ATSParser::DiscontinuityType type, const sp<AMessage> &extra);
14514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
14614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    int32_t getSeqNumberForTime(int64_t timeUs) const;
14714f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
14814f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    void updateDuration();
14914f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
15014f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(PlaylistFetcher);
15114f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber};
15214f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
15314f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber}  // namespace android
15414f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
15514f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber#endif  // PLAYLIST_FETCHER_H_
15614f7672b5d450ed26a06fd3bb3ce045ea78b11b2Andreas Huber
157