LiveSession.h revision 43c3e6ce02215ca99d506458f596cb1211639f29
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>
22a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
23a44153c1a57202fb538659eb50706e60454d6273Andreas Hubernamespace android {
24a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
25a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct ABuffer;
26a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct DataSource;
27a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveDataSource;
28a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct M3UParser;
29a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct NuHTTPDataSource;
30a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
31a44153c1a57202fb538659eb50706e60454d6273Andreas Huberstruct LiveSession : public AHandler {
32a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    LiveSession();
33a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
34a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    sp<DataSource> getDataSource();
35a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
36a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void connect(const char *url);
37a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void disconnect();
38a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
39a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    // Blocks until seek is complete.
40a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void seekTo(int64_t timeUs);
41a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
42a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    status_t getDuration(int64_t *durationUs);
43a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    bool isSeekable();
44a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
45a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprotected:
46a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    virtual ~LiveSession();
47a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
48a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    virtual void onMessageReceived(const sp<AMessage> &msg);
49a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
50a44153c1a57202fb538659eb50706e60454d6273Andreas Huberprivate:
51a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    enum {
5243c3e6ce02215ca99d506458f596cb1211639f29Andreas Huber        kMaxNumQueuedFragments = 3,
535bc087c573c70c84c6a39946457590b42d392a33Andreas Huber        kMaxNumRetries         = 5,
54a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    };
55a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
56a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    static const int64_t kMaxPlaylistAgeUs;
57a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
58a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    enum {
59a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        kWhatConnect        = 'conn',
60a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        kWhatDisconnect     = 'disc',
61a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        kWhatMonitorQueue   = 'moni',
62a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        kWhatSeek           = 'seek',
63a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    };
64a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
65a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    struct BandwidthItem {
66a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        AString mURI;
67a44153c1a57202fb538659eb50706e60454d6273Andreas Huber        unsigned long mBandwidth;
68a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    };
69a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
70a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    sp<LiveDataSource> mDataSource;
71a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
72a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    sp<NuHTTPDataSource> mHTTPDataSource;
73a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
74a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    AString mMasterURL;
75a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Vector<BandwidthItem> mBandwidthItems;
76a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
77a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    KeyedVector<AString, sp<ABuffer> > mAESKeyForURI;
78a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
79a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    ssize_t mPrevBandwidthIndex;
80a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    int64_t mLastPlaylistFetchTimeUs;
81a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    sp<M3UParser> mPlaylist;
82a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    int32_t mSeqNumber;
83a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    int64_t mSeekTimeUs;
84a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    int32_t mNumRetries;
85a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
86a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Mutex mLock;
87a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    Condition mCondition;
88a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    int64_t mDurationUs;
89a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    bool mSeekDone;
90a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
91a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    int32_t mMonitorQueueGeneration;
92a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
93a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void onConnect(const sp<AMessage> &msg);
94a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void onDisconnect();
95a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void onDownloadNext();
96a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void onMonitorQueue();
97a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void onSeek(const sp<AMessage> &msg);
98a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
99a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    status_t fetchFile(const char *url, sp<ABuffer> *out);
100a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    sp<M3UParser> fetchPlaylist(const char *url);
101a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    size_t getBandwidthIndex();
102a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
103a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    status_t decryptBuffer(
104a44153c1a57202fb538659eb50706e60454d6273Andreas Huber            size_t playlistIndex, const sp<ABuffer> &buffer);
105a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
106a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    void postMonitorQueue(int64_t delayUs = 0);
107a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
108a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    static int SortByBandwidth(const BandwidthItem *, const BandwidthItem *);
109a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
110a44153c1a57202fb538659eb50706e60454d6273Andreas Huber    DISALLOW_EVIL_CONSTRUCTORS(LiveSession);
111a44153c1a57202fb538659eb50706e60454d6273Andreas Huber};
112a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
113a44153c1a57202fb538659eb50706e60454d6273Andreas Huber}  // namespace android
114a44153c1a57202fb538659eb50706e60454d6273Andreas Huber
115a44153c1a57202fb538659eb50706e60454d6273Andreas Huber#endif  // LIVE_SESSION_H_
116