blob: 4e6f75c58068a4093c7d778520096fdb4dee6088 [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 Huber4d61f602010-06-10 11:17:50 -070021#include "NuHTTPDataSource.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
Andreas Huber1314e732009-12-14 14:18:22 -080047struct AwesomeRenderer : public RefBase {
48 AwesomeRenderer() {}
49
50 virtual void render(MediaBuffer *buffer) = 0;
51
52private:
53 AwesomeRenderer(const AwesomeRenderer &);
54 AwesomeRenderer &operator=(const AwesomeRenderer &);
55};
56
Andreas Huber27366fc2009-11-20 09:32:46 -080057struct AwesomePlayer {
58 AwesomePlayer();
59 ~AwesomePlayer();
60
Andreas Hubera3f43842010-01-21 10:28:45 -080061 void setListener(const wp<MediaPlayerBase> &listener);
Andreas Huber27366fc2009-11-20 09:32:46 -080062
Andreas Huber433c9ac2010-01-27 16:49:05 -080063 status_t setDataSource(
64 const char *uri,
65 const KeyedVector<String8, String8> *headers = NULL);
66
Andreas Huber27366fc2009-11-20 09:32:46 -080067 status_t setDataSource(int fd, int64_t offset, int64_t length);
68
Andreas Huber52b52cd2010-11-23 11:41:34 -080069 status_t setDataSource(const sp<IStreamSource> &source);
70
Andreas Huber27366fc2009-11-20 09:32:46 -080071 void reset();
72
Andreas Huber6be780e2010-02-08 14:40:30 -080073 status_t prepare();
Andreas Huberffdf4782010-02-09 14:05:43 -080074 status_t prepare_l();
Andreas Huber6be780e2010-02-08 14:40:30 -080075 status_t prepareAsync();
76 status_t prepareAsync_l();
77
Andreas Huber27366fc2009-11-20 09:32:46 -080078 status_t play();
79 status_t pause();
80
81 bool isPlaying() const;
82
Andreas Hubere3c01832010-08-16 08:49:37 -070083 void setSurface(const sp<Surface> &surface);
Glenn Kastencc562a32011-02-08 17:26:17 -080084 void setSurfaceTexture(const sp<ISurfaceTexture> &surfaceTexture);
Andreas Huber27366fc2009-11-20 09:32:46 -080085 void setAudioSink(const sp<MediaPlayerBase::AudioSink> &audioSink);
86 status_t setLooping(bool shouldLoop);
87
88 status_t getDuration(int64_t *durationUs);
89 status_t getPosition(int64_t *positionUs);
90
91 status_t seekTo(int64_t timeUs);
92
Andreas Huber62f7ffe2010-05-06 10:18:05 -070093 // This is a mask of MediaExtractor::Flags.
94 uint32_t flags() const;
95
Andreas Huber2b359ed2010-09-28 11:56:39 -070096 void postAudioEOS();
97 void postAudioSeekComplete();
98
Andreas Huber27366fc2009-11-20 09:32:46 -080099private:
100 friend struct AwesomeEvent;
Dharmaray Kundargi3b3cddc2011-01-16 16:43:20 -0800101 friend struct PreviewPlayer;
Andreas Huber27366fc2009-11-20 09:32:46 -0800102
Andreas Huber62f7ffe2010-05-06 10:18:05 -0700103 enum {
Andreas Huberedbb4d82010-03-12 08:59:22 -0800104 PLAYING = 1,
105 LOOPING = 2,
106 FIRST_FRAME = 4,
107 PREPARING = 8,
108 PREPARED = 16,
109 AT_EOS = 32,
110 PREPARE_CANCELLED = 64,
Andreas Huber4d61f602010-06-10 11:17:50 -0700111 CACHE_UNDERRUN = 128,
Andreas Huber971305d2010-07-07 13:35:27 -0700112 AUDIO_AT_EOS = 256,
113 VIDEO_AT_EOS = 512,
Andreas Huber9fee0b22010-09-03 14:09:21 -0700114 AUTO_LOOPING = 1024,
Andreas Hubereaf2c5a2010-10-19 12:18:51 -0700115
116 // We are basically done preparing but are currently buffering
117 // sufficient data to begin playback and finish the preparation phase
118 // for good.
119 PREPARING_CONNECTED = 2048,
Andreas Huber0a84f4f2011-02-07 11:43:12 -0800120
121 // We're triggering a single video event to display the first frame
122 // after the seekpoint.
123 SEEK_PREVIEW = 4096,
Andreas Huberce8a1012011-02-11 13:09:36 -0800124
125 AUDIO_RUNNING = 8192,
126 AUDIOPLAYER_STARTED = 16384,
Andreas Huber53182c42011-02-24 14:42:48 -0800127
128 INCOGNITO = 32768,
Andreas Huber27366fc2009-11-20 09:32:46 -0800129 };
130
131 mutable Mutex mLock;
Andreas Huber252573c2010-03-26 10:17:17 -0700132 Mutex mMiscStateLock;
Andreas Huber27366fc2009-11-20 09:32:46 -0800133
134 OMXClient mClient;
135 TimedEventQueue mQueue;
Andreas Huber406a18b2010-02-18 16:45:13 -0800136 bool mQueueStarted;
Andreas Hubera3f43842010-01-21 10:28:45 -0800137 wp<MediaPlayerBase> mListener;
Andreas Huber27366fc2009-11-20 09:32:46 -0800138
Andreas Hubere3c01832010-08-16 08:49:37 -0700139 sp<Surface> mSurface;
Glenn Kastencc562a32011-02-08 17:26:17 -0800140 sp<ANativeWindow> mNativeWindow;
Andreas Huber27366fc2009-11-20 09:32:46 -0800141 sp<MediaPlayerBase::AudioSink> mAudioSink;
142
Andreas Huber971305d2010-07-07 13:35:27 -0700143 SystemTimeSource mSystemTimeSource;
Andreas Huber27366fc2009-11-20 09:32:46 -0800144 TimeSource *mTimeSource;
145
Andreas Huberffdf4782010-02-09 14:05:43 -0800146 String8 mUri;
147 KeyedVector<String8, String8> mUriHeaders;
148
Andreas Huberba7ec912010-02-12 10:42:02 -0800149 sp<DataSource> mFileSource;
150
Andreas Huber3ac94ef2010-03-05 10:42:10 -0800151 sp<MediaSource> mVideoTrack;
Andreas Huber27366fc2009-11-20 09:32:46 -0800152 sp<MediaSource> mVideoSource;
Andreas Huber1314e732009-12-14 14:18:22 -0800153 sp<AwesomeRenderer> mVideoRenderer;
Andreas Huber7b73cfc2010-02-12 14:40:08 -0800154 bool mVideoRendererIsPreview;
Andreas Huber27366fc2009-11-20 09:32:46 -0800155
Andreas Huber3ac94ef2010-03-05 10:42:10 -0800156 sp<MediaSource> mAudioTrack;
Andreas Huber27366fc2009-11-20 09:32:46 -0800157 sp<MediaSource> mAudioSource;
158 AudioPlayer *mAudioPlayer;
159 int64_t mDurationUs;
160
James Dong08adfd22011-01-16 11:30:13 -0800161 int32_t mDisplayWidth;
162 int32_t mDisplayHeight;
163
Andreas Huber27366fc2009-11-20 09:32:46 -0800164 uint32_t mFlags;
Andreas Huber62f7ffe2010-05-06 10:18:05 -0700165 uint32_t mExtractorFlags;
pmehendale28f939d2011-01-06 14:43:49 -0800166 uint32_t mSinceLastDropped;
Andreas Huber27366fc2009-11-20 09:32:46 -0800167
Andreas Huber27366fc2009-11-20 09:32:46 -0800168 int64_t mTimeSourceDeltaUs;
169 int64_t mVideoTimeUs;
170
Andreas Hubera2c29972011-02-24 12:05:40 -0800171 enum SeekType {
172 NO_SEEK,
173 SEEK,
174 SEEK_VIDEO_ONLY
175 };
176 SeekType mSeeking;
177
Andreas Huber8e2b9412010-03-31 09:40:15 -0700178 bool mSeekNotificationSent;
Andreas Huber27366fc2009-11-20 09:32:46 -0800179 int64_t mSeekTimeUs;
180
Andreas Huber4deb3eb2010-10-12 16:55:11 -0700181 int64_t mBitrate; // total bitrate of the file (in bps) or -1 if unknown.
182
Andreas Huber70d10c02010-02-03 11:37:29 -0800183 bool mWatchForAudioSeekComplete;
184 bool mWatchForAudioEOS;
185
Andreas Huber27366fc2009-11-20 09:32:46 -0800186 sp<TimedEventQueue::Event> mVideoEvent;
187 bool mVideoEventPending;
188 sp<TimedEventQueue::Event> mStreamDoneEvent;
189 bool mStreamDoneEventPending;
Andreas Huberb9e63832010-01-26 16:20:10 -0800190 sp<TimedEventQueue::Event> mBufferingEvent;
191 bool mBufferingEventPending;
Andreas Huber70d10c02010-02-03 11:37:29 -0800192 sp<TimedEventQueue::Event> mCheckAudioStatusEvent;
193 bool mAudioStatusEventPending;
Andreas Huber52c78322011-01-11 15:05:28 -0800194 sp<TimedEventQueue::Event> mVideoLagEvent;
195 bool mVideoLagEventPending;
Andreas Huber27366fc2009-11-20 09:32:46 -0800196
Andreas Huber6be780e2010-02-08 14:40:30 -0800197 sp<TimedEventQueue::Event> mAsyncPrepareEvent;
198 Condition mPreparedCondition;
Andreas Huberffdf4782010-02-09 14:05:43 -0800199 bool mIsAsyncPrepare;
200 status_t mPrepareResult;
Andreas Huberd7d22eb2010-02-23 13:45:33 -0800201 status_t mStreamDoneStatus;
Andreas Huber6be780e2010-02-08 14:40:30 -0800202
Andreas Huber27366fc2009-11-20 09:32:46 -0800203 void postVideoEvent_l(int64_t delayUs = -1);
Andreas Huberb9e63832010-01-26 16:20:10 -0800204 void postBufferingEvent_l();
Andreas Huberd7d22eb2010-02-23 13:45:33 -0800205 void postStreamDoneEvent_l(status_t status);
Andreas Huber70d10c02010-02-03 11:37:29 -0800206 void postCheckAudioStatusEvent_l();
Andreas Huber52c78322011-01-11 15:05:28 -0800207 void postVideoLagEvent_l();
Andreas Huberba7ec912010-02-12 10:42:02 -0800208 status_t play_l();
Andreas Huber27366fc2009-11-20 09:32:46 -0800209
Andreas Huber27366fc2009-11-20 09:32:46 -0800210 MediaBuffer *mVideoBuffer;
211
Andreas Huber4d61f602010-06-10 11:17:50 -0700212 sp<NuHTTPDataSource> mConnectingDataSource;
213 sp<NuCachedSource2> mCachedSource;
Andreas Huberb9e63832010-01-26 16:20:10 -0800214
Andreas Huber7a747b82010-06-07 15:19:40 -0700215 sp<ALooper> mLooper;
216 sp<ARTSPController> mRTSPController;
Andreas Hubercb218792011-02-14 14:14:23 -0800217 sp<ARTSPController> mConnectingRTSPController;
Andreas Huber7a747b82010-06-07 15:19:40 -0700218
Gloria Wangd5770912010-06-22 13:55:38 -0700219 DrmManagerClient *mDrmManagerClient;
220 DecryptHandle *mDecryptHandle;
221
Andreas Huberba7ec912010-02-12 10:42:02 -0800222 status_t setDataSource_l(
223 const char *uri,
224 const KeyedVector<String8, String8> *headers = NULL);
225
226 status_t setDataSource_l(const sp<DataSource> &dataSource);
Andreas Huber27366fc2009-11-20 09:32:46 -0800227 status_t setDataSource_l(const sp<MediaExtractor> &extractor);
228 void reset_l();
229 status_t seekTo_l(int64_t timeUs);
Andreas Huberc743f452010-10-05 10:25:34 -0700230 status_t pause_l(bool at_eos = false);
Andreas Huber27366fc2009-11-20 09:32:46 -0800231 void initRenderer_l();
Andreas Hubere3c01832010-08-16 08:49:37 -0700232 void notifyVideoSize_l();
Andreas Huber27366fc2009-11-20 09:32:46 -0800233 void seekAudioIfNecessary_l();
234
Andreas Huberb9e63832010-01-26 16:20:10 -0800235 void cancelPlayerEvents(bool keepBufferingGoing = false);
Andreas Huber27366fc2009-11-20 09:32:46 -0800236
Andreas Huber3ac94ef2010-03-05 10:42:10 -0800237 void setAudioSource(sp<MediaSource> source);
238 status_t initAudioDecoder();
239
240 void setVideoSource(sp<MediaSource> source);
Andreas Huber4c19bf92010-09-08 14:32:20 -0700241 status_t initVideoDecoder(uint32_t flags = 0);
Andreas Huber27366fc2009-11-20 09:32:46 -0800242
Andreas Huber27366fc2009-11-20 09:32:46 -0800243 void onStreamDone();
244
Andreas Huber6be780e2010-02-08 14:40:30 -0800245 void notifyListener_l(int msg, int ext1 = 0, int ext2 = 0);
Andreas Huberb9e63832010-01-26 16:20:10 -0800246
Andreas Huber6be780e2010-02-08 14:40:30 -0800247 void onVideoEvent();
Andreas Huberb9e63832010-01-26 16:20:10 -0800248 void onBufferingUpdate();
Andreas Huber70d10c02010-02-03 11:37:29 -0800249 void onCheckAudioStatus();
Andreas Huber6be780e2010-02-08 14:40:30 -0800250 void onPrepareAsyncEvent();
Andreas Huber3ac94ef2010-03-05 10:42:10 -0800251 void abortPrepare(status_t err);
Andreas Huber87ab9cd2010-09-03 13:20:33 -0700252 void finishAsyncPrepare_l();
Andreas Huber52c78322011-01-11 15:05:28 -0800253 void onVideoLagUpdate();
Andreas Huber87ab9cd2010-09-03 13:20:33 -0700254
255 bool getCachedDuration_l(int64_t *durationUs, bool *eos);
Andreas Huber3ac94ef2010-03-05 10:42:10 -0800256
Andreas Huberffdf4782010-02-09 14:05:43 -0800257 status_t finishSetDataSource_l();
Andreas Hubera3f43842010-01-21 10:28:45 -0800258
Andreas Huberf71daba2010-03-24 09:24:40 -0700259 static bool ContinuePreparation(void *cookie);
260
Andreas Huber0c46b692010-10-08 15:21:08 -0700261 static void OnRTSPSeekDoneWrapper(void *cookie);
262 void onRTSPSeekDone();
263
Andreas Huber4deb3eb2010-10-12 16:55:11 -0700264 bool getBitrate(int64_t *bitrate);
265
Andreas Huber4d450a82010-10-19 09:34:44 -0700266 void finishSeekIfNecessary(int64_t videoTimeUs);
Andreas Huber10b920c2010-11-11 15:37:17 -0800267 void ensureCacheIsFetching_l();
Andreas Huber4d450a82010-10-19 09:34:44 -0700268
Andreas Huberce8a1012011-02-11 13:09:36 -0800269 status_t startAudioPlayer_l();
270
Andreas Huber27366fc2009-11-20 09:32:46 -0800271 AwesomePlayer(const AwesomePlayer &);
272 AwesomePlayer &operator=(const AwesomePlayer &);
273};
274
275} // namespace android
276
277#endif // AWESOME_PLAYER_H_
278