blob: 835d2bbc402ba1f5545b9badd3907986772863bf [file] [log] [blame]
Andreas Huber27366fc2009-11-20 09:32:46 -08001/*
2 * Copyright (C) 2009 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
17#ifndef AWESOME_PLAYER_H_
18
19#define AWESOME_PLAYER_H_
20
Andreas Huber5f5719e2011-03-08 15:59:28 -080021#include "HTTPBase.h"
Andreas Huber27366fc2009-11-20 09:32:46 -080022#include "TimedEventQueue.h"
23
24#include <media/MediaPlayerInterface.h>
Andreas Huber7b73cfc2010-02-12 14:40:08 -080025#include <media/stagefright/DataSource.h>
Andreas Huber27366fc2009-11-20 09:32:46 -080026#include <media/stagefright/OMXClient.h>
Andreas Huber971305d2010-07-07 13:35:27 -070027#include <media/stagefright/TimeSource.h>
Andreas Huber27366fc2009-11-20 09:32:46 -080028#include <utils/threads.h>
Gloria Wangd5770912010-06-22 13:55:38 -070029#include <drm/DrmManagerClient.h>
Andreas Huber27366fc2009-11-20 09:32:46 -080030
31namespace android {
32
Andreas Huberb9e63832010-01-26 16:20:10 -080033struct AudioPlayer;
Andreas Huberba7ec912010-02-12 10:42:02 -080034struct DataSource;
Andreas Huber27366fc2009-11-20 09:32:46 -080035struct MediaBuffer;
36struct MediaExtractor;
37struct MediaSource;
Andreas Huber4d61f602010-06-10 11:17:50 -070038struct NuCachedSource2;
Glenn Kastencc562a32011-02-08 17:26:17 -080039struct ISurfaceTexture;
Andreas Huber27366fc2009-11-20 09:32:46 -080040
Andreas Huber7a747b82010-06-07 15:19:40 -070041struct ALooper;
42struct ARTSPController;
43
Gloria Wangd5770912010-06-22 13:55:38 -070044class DrmManagerClinet;
45class DecryptHandle;
Andreas Huber27366fc2009-11-20 09:32:46 -080046
Gloria Wangc6091dd2011-05-03 15:59:03 -070047class TimedTextPlayer;
48
Andreas Huber1314e732009-12-14 14:18:22 -080049struct AwesomeRenderer : public RefBase {
50 AwesomeRenderer() {}
51
52 virtual void render(MediaBuffer *buffer) = 0;
53
54private:
55 AwesomeRenderer(const AwesomeRenderer &);
56 AwesomeRenderer &operator=(const AwesomeRenderer &);
57};
58
Andreas Huber27366fc2009-11-20 09:32:46 -080059struct AwesomePlayer {
60 AwesomePlayer();
61 ~AwesomePlayer();
62
Andreas Hubera3f43842010-01-21 10:28:45 -080063 void setListener(const wp<MediaPlayerBase> &listener);
Andreas Huber27366fc2009-11-20 09:32:46 -080064
Andreas Huber433c9ac2010-01-27 16:49:05 -080065 status_t setDataSource(
66 const char *uri,
67 const KeyedVector<String8, String8> *headers = NULL);
68
Andreas Huber27366fc2009-11-20 09:32:46 -080069 status_t setDataSource(int fd, int64_t offset, int64_t length);
70
Andreas Huber52b52cd2010-11-23 11:41:34 -080071 status_t setDataSource(const sp<IStreamSource> &source);
72
Andreas Huber27366fc2009-11-20 09:32:46 -080073 void reset();
74
Andreas Huber6be780e2010-02-08 14:40:30 -080075 status_t prepare();
Andreas Huberffdf4782010-02-09 14:05:43 -080076 status_t prepare_l();
Andreas Huber6be780e2010-02-08 14:40:30 -080077 status_t prepareAsync();
78 status_t prepareAsync_l();
79
Andreas Huber27366fc2009-11-20 09:32:46 -080080 status_t play();
81 status_t pause();
82
83 bool isPlaying() const;
84
Andreas Hubere3c01832010-08-16 08:49:37 -070085 void setSurface(const sp<Surface> &surface);
Glenn Kastencc562a32011-02-08 17:26:17 -080086 void setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture);
Andreas Huber27366fc2009-11-20 09:32:46 -080087 void setAudioSink(const sp<MediaPlayerBase::AudioSink> &audioSink);
88 status_t setLooping(bool shouldLoop);
89
90 status_t getDuration(int64_t *durationUs);
91 status_t getPosition(int64_t *positionUs);
92
Gloria Wangd01ec6e2011-04-25 17:28:22 -070093 status_t setParameter(int key, const Parcel &request);
94 status_t getParameter(int key, Parcel *reply);
95
Andreas Huber27366fc2009-11-20 09:32:46 -080096 status_t seekTo(int64_t timeUs);
97
Andreas Huber62f7ffe2010-05-06 10:18:05 -070098 // This is a mask of MediaExtractor::Flags.
99 uint32_t flags() const;
100
Andreas Huber4dc482d2011-03-22 10:31:21 -0700101 void postAudioEOS(int64_t delayUs = 0ll);
Andreas Huber2b359ed2010-09-28 11:56:39 -0700102 void postAudioSeekComplete();
103
Gloria Wangc6091dd2011-05-03 15:59:03 -0700104 status_t setTimedTextTrackIndex(int32_t index);
105
Andreas Huber27366fc2009-11-20 09:32:46 -0800106private:
107 friend struct AwesomeEvent;
Dharmaray Kundargi3b3cddc2011-01-16 16:43:20 -0800108 friend struct PreviewPlayer;
Andreas Huber27366fc2009-11-20 09:32:46 -0800109
Andreas Huber62f7ffe2010-05-06 10:18:05 -0700110 enum {
Gloria Wangc6091dd2011-05-03 15:59:03 -0700111 PLAYING = 0x01,
112 LOOPING = 0x02,
113 FIRST_FRAME = 0x04,
114 PREPARING = 0x08,
115 PREPARED = 0x10,
116 AT_EOS = 0x20,
117 PREPARE_CANCELLED = 0x40,
118 CACHE_UNDERRUN = 0x80,
119 AUDIO_AT_EOS = 0x0100,
120 VIDEO_AT_EOS = 0x0200,
121 AUTO_LOOPING = 0x0400,
Andreas Hubereaf2c5a2010-10-19 12:18:51 -0700122
123 // We are basically done preparing but are currently buffering
124 // sufficient data to begin playback and finish the preparation phase
125 // for good.
Gloria Wangc6091dd2011-05-03 15:59:03 -0700126 PREPARING_CONNECTED = 0x0800,
Andreas Huber0a84f4f2011-02-07 11:43:12 -0800127
128 // We're triggering a single video event to display the first frame
129 // after the seekpoint.
Gloria Wangc6091dd2011-05-03 15:59:03 -0700130 SEEK_PREVIEW = 0x1000,
Andreas Huberce8a1012011-02-11 13:09:36 -0800131
Gloria Wangc6091dd2011-05-03 15:59:03 -0700132 AUDIO_RUNNING = 0x2000,
133 AUDIOPLAYER_STARTED = 0x4000,
Andreas Huber53182c42011-02-24 14:42:48 -0800134
Gloria Wangc6091dd2011-05-03 15:59:03 -0700135 INCOGNITO = 0x8000,
136
137 TEXT_RUNNING = 0x10000,
138 TEXTPLAYER_STARTED = 0x20000,
Andreas Huber27366fc2009-11-20 09:32:46 -0800139 };
140
141 mutable Mutex mLock;
Andreas Huber252573c2010-03-26 10:17:17 -0700142 Mutex mMiscStateLock;
Andreas Huber27366fc2009-11-20 09:32:46 -0800143
144 OMXClient mClient;
145 TimedEventQueue mQueue;
Andreas Huber406a18b2010-02-18 16:45:13 -0800146 bool mQueueStarted;
Andreas Hubera3f43842010-01-21 10:28:45 -0800147 wp<MediaPlayerBase> mListener;
Andreas Huber27366fc2009-11-20 09:32:46 -0800148
Andreas Hubere3c01832010-08-16 08:49:37 -0700149 sp<Surface> mSurface;
Glenn Kastencc562a32011-02-08 17:26:17 -0800150 sp<ANativeWindow> mNativeWindow;
Andreas Huber27366fc2009-11-20 09:32:46 -0800151 sp<MediaPlayerBase::AudioSink> mAudioSink;
152
Andreas Huber971305d2010-07-07 13:35:27 -0700153 SystemTimeSource mSystemTimeSource;
Andreas Huber27366fc2009-11-20 09:32:46 -0800154 TimeSource *mTimeSource;
155
Andreas Huberffdf4782010-02-09 14:05:43 -0800156 String8 mUri;
157 KeyedVector<String8, String8> mUriHeaders;
158
Andreas Huberba7ec912010-02-12 10:42:02 -0800159 sp<DataSource> mFileSource;
160
Andreas Huber3ac94ef2010-03-05 10:42:10 -0800161 sp<MediaSource> mVideoTrack;
Andreas Huber27366fc2009-11-20 09:32:46 -0800162 sp<MediaSource> mVideoSource;
Andreas Huber1314e732009-12-14 14:18:22 -0800163 sp<AwesomeRenderer> mVideoRenderer;
Andreas Huber7b73cfc2010-02-12 14:40:08 -0800164 bool mVideoRendererIsPreview;
Andreas Huber27366fc2009-11-20 09:32:46 -0800165
Andreas Huber3ac94ef2010-03-05 10:42:10 -0800166 sp<MediaSource> mAudioTrack;
Andreas Huber27366fc2009-11-20 09:32:46 -0800167 sp<MediaSource> mAudioSource;
168 AudioPlayer *mAudioPlayer;
169 int64_t mDurationUs;
170
James Dong08adfd22011-01-16 11:30:13 -0800171 int32_t mDisplayWidth;
172 int32_t mDisplayHeight;
173
Andreas Huber27366fc2009-11-20 09:32:46 -0800174 uint32_t mFlags;
Andreas Huber62f7ffe2010-05-06 10:18:05 -0700175 uint32_t mExtractorFlags;
Andreas Huber27366fc2009-11-20 09:32:46 -0800176
Andreas Huber27366fc2009-11-20 09:32:46 -0800177 int64_t mTimeSourceDeltaUs;
178 int64_t mVideoTimeUs;
179
Andreas Hubera2c29972011-02-24 12:05:40 -0800180 enum SeekType {
181 NO_SEEK,
182 SEEK,
183 SEEK_VIDEO_ONLY
184 };
185 SeekType mSeeking;
186
Andreas Huber8e2b9412010-03-31 09:40:15 -0700187 bool mSeekNotificationSent;
Andreas Huber27366fc2009-11-20 09:32:46 -0800188 int64_t mSeekTimeUs;
189
Andreas Huber4deb3eb2010-10-12 16:55:11 -0700190 int64_t mBitrate; // total bitrate of the file (in bps) or -1 if unknown.
191
Andreas Huber70d10c02010-02-03 11:37:29 -0800192 bool mWatchForAudioSeekComplete;
193 bool mWatchForAudioEOS;
194
Andreas Huber27366fc2009-11-20 09:32:46 -0800195 sp<TimedEventQueue::Event> mVideoEvent;
196 bool mVideoEventPending;
197 sp<TimedEventQueue::Event> mStreamDoneEvent;
198 bool mStreamDoneEventPending;
Andreas Huberb9e63832010-01-26 16:20:10 -0800199 sp<TimedEventQueue::Event> mBufferingEvent;
200 bool mBufferingEventPending;
Andreas Huber70d10c02010-02-03 11:37:29 -0800201 sp<TimedEventQueue::Event> mCheckAudioStatusEvent;
202 bool mAudioStatusEventPending;
Andreas Huber52c78322011-01-11 15:05:28 -0800203 sp<TimedEventQueue::Event> mVideoLagEvent;
204 bool mVideoLagEventPending;
Andreas Huber27366fc2009-11-20 09:32:46 -0800205
Andreas Huber6be780e2010-02-08 14:40:30 -0800206 sp<TimedEventQueue::Event> mAsyncPrepareEvent;
207 Condition mPreparedCondition;
Andreas Huberffdf4782010-02-09 14:05:43 -0800208 bool mIsAsyncPrepare;
209 status_t mPrepareResult;
Andreas Huberd7d22eb2010-02-23 13:45:33 -0800210 status_t mStreamDoneStatus;
Andreas Huber6be780e2010-02-08 14:40:30 -0800211
Andreas Huber27366fc2009-11-20 09:32:46 -0800212 void postVideoEvent_l(int64_t delayUs = -1);
Andreas Huberb9e63832010-01-26 16:20:10 -0800213 void postBufferingEvent_l();
Andreas Huberd7d22eb2010-02-23 13:45:33 -0800214 void postStreamDoneEvent_l(status_t status);
Andreas Huber4dc482d2011-03-22 10:31:21 -0700215 void postCheckAudioStatusEvent_l(int64_t delayUs);
Andreas Huber52c78322011-01-11 15:05:28 -0800216 void postVideoLagEvent_l();
Andreas Huberba7ec912010-02-12 10:42:02 -0800217 status_t play_l();
Andreas Huber27366fc2009-11-20 09:32:46 -0800218
Andreas Huber27366fc2009-11-20 09:32:46 -0800219 MediaBuffer *mVideoBuffer;
220
Andreas Huber5f5719e2011-03-08 15:59:28 -0800221 sp<HTTPBase> mConnectingDataSource;
Andreas Huber4d61f602010-06-10 11:17:50 -0700222 sp<NuCachedSource2> mCachedSource;
Andreas Huberb9e63832010-01-26 16:20:10 -0800223
Andreas Huber7a747b82010-06-07 15:19:40 -0700224 sp<ALooper> mLooper;
225 sp<ARTSPController> mRTSPController;
Andreas Hubercb218792011-02-14 14:14:23 -0800226 sp<ARTSPController> mConnectingRTSPController;
Andreas Huber7a747b82010-06-07 15:19:40 -0700227
Gloria Wangd5770912010-06-22 13:55:38 -0700228 DrmManagerClient *mDrmManagerClient;
Gloria Wangae775272011-02-24 16:40:57 -0800229 sp<DecryptHandle> mDecryptHandle;
Gloria Wangd5770912010-06-22 13:55:38 -0700230
Andreas Huber3a785fe2011-03-14 10:55:40 -0700231 int64_t mLastVideoTimeUs;
Gloria Wangc6091dd2011-05-03 15:59:03 -0700232 TimedTextPlayer *mTextPlayer;
Andreas Huber3a785fe2011-03-14 10:55:40 -0700233
Andreas Huberba7ec912010-02-12 10:42:02 -0800234 status_t setDataSource_l(
235 const char *uri,
236 const KeyedVector<String8, String8> *headers = NULL);
237
238 status_t setDataSource_l(const sp<DataSource> &dataSource);
Andreas Huber27366fc2009-11-20 09:32:46 -0800239 status_t setDataSource_l(const sp<MediaExtractor> &extractor);
240 void reset_l();
241 status_t seekTo_l(int64_t timeUs);
Andreas Huberc743f452010-10-05 10:25:34 -0700242 status_t pause_l(bool at_eos = false);
Andreas Huber27366fc2009-11-20 09:32:46 -0800243 void initRenderer_l();
Andreas Hubere3c01832010-08-16 08:49:37 -0700244 void notifyVideoSize_l();
Andreas Huber27366fc2009-11-20 09:32:46 -0800245 void seekAudioIfNecessary_l();
246
Andreas Huberb9e63832010-01-26 16:20:10 -0800247 void cancelPlayerEvents(bool keepBufferingGoing = false);
Andreas Huber27366fc2009-11-20 09:32:46 -0800248
Andreas Huber3ac94ef2010-03-05 10:42:10 -0800249 void setAudioSource(sp<MediaSource> source);
250 status_t initAudioDecoder();
251
252 void setVideoSource(sp<MediaSource> source);
Andreas Huber4c19bf92010-09-08 14:32:20 -0700253 status_t initVideoDecoder(uint32_t flags = 0);
Andreas Huber27366fc2009-11-20 09:32:46 -0800254
Gloria Wangc6091dd2011-05-03 15:59:03 -0700255 void addTextSource(sp<MediaSource> source);
256
Andreas Huber27366fc2009-11-20 09:32:46 -0800257 void onStreamDone();
258
Andreas Huber6be780e2010-02-08 14:40:30 -0800259 void notifyListener_l(int msg, int ext1 = 0, int ext2 = 0);
Andreas Huberb9e63832010-01-26 16:20:10 -0800260
Andreas Huber6be780e2010-02-08 14:40:30 -0800261 void onVideoEvent();
Andreas Huberb9e63832010-01-26 16:20:10 -0800262 void onBufferingUpdate();
Andreas Huber70d10c02010-02-03 11:37:29 -0800263 void onCheckAudioStatus();
Andreas Huber6be780e2010-02-08 14:40:30 -0800264 void onPrepareAsyncEvent();
Andreas Huber3ac94ef2010-03-05 10:42:10 -0800265 void abortPrepare(status_t err);
Andreas Huber87ab9cd2010-09-03 13:20:33 -0700266 void finishAsyncPrepare_l();
Andreas Huber52c78322011-01-11 15:05:28 -0800267 void onVideoLagUpdate();
Andreas Huber87ab9cd2010-09-03 13:20:33 -0700268
269 bool getCachedDuration_l(int64_t *durationUs, bool *eos);
Andreas Huber3ac94ef2010-03-05 10:42:10 -0800270
Andreas Huberffdf4782010-02-09 14:05:43 -0800271 status_t finishSetDataSource_l();
Andreas Hubera3f43842010-01-21 10:28:45 -0800272
Andreas Huberf71daba2010-03-24 09:24:40 -0700273 static bool ContinuePreparation(void *cookie);
274
Andreas Huber0c46b692010-10-08 15:21:08 -0700275 static void OnRTSPSeekDoneWrapper(void *cookie);
276 void onRTSPSeekDone();
277
Andreas Huber4deb3eb2010-10-12 16:55:11 -0700278 bool getBitrate(int64_t *bitrate);
279
Andreas Huber4d450a82010-10-19 09:34:44 -0700280 void finishSeekIfNecessary(int64_t videoTimeUs);
Andreas Huber10b920c2010-11-11 15:37:17 -0800281 void ensureCacheIsFetching_l();
Andreas Huber4d450a82010-10-19 09:34:44 -0700282
Andreas Huberce8a1012011-02-11 13:09:36 -0800283 status_t startAudioPlayer_l();
Andreas Huber5fd43e32011-05-10 13:56:39 -0700284 void postAudioSeekComplete_l();
Andreas Huberce8a1012011-02-11 13:09:36 -0800285
Andreas Huber3a785fe2011-03-14 10:55:40 -0700286 void shutdownVideoDecoder_l();
287 void setNativeWindow_l(const sp<ANativeWindow> &native);
288
Andreas Huber27366fc2009-11-20 09:32:46 -0800289 AwesomePlayer(const AwesomePlayer &);
290 AwesomePlayer &operator=(const AwesomePlayer &);
291};
292
293} // namespace android
294
295#endif // AWESOME_PLAYER_H_
296