blob: b001cf4d2741c092dc1a4a6c2cd0f09ca20d5479 [file] [log] [blame]
Andreas Huberbfa6b2d2009-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 Huber1156dc92011-03-08 15:59:28 -080021#include "HTTPBase.h"
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080022#include "TimedEventQueue.h"
23
24#include <media/MediaPlayerInterface.h>
Andreas Huberfa090f52010-02-12 14:40:08 -080025#include <media/stagefright/DataSource.h>
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080026#include <media/stagefright/OMXClient.h>
Andreas Huber5d2de4d2010-07-07 13:35:27 -070027#include <media/stagefright/TimeSource.h>
Richard Fitzgeraldad3af332013-03-25 16:54:37 +000028#include <media/stagefright/MetaData.h>
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080029#include <utils/threads.h>
Gloria Wangdcd25ef2010-06-22 13:55:38 -070030#include <drm/DrmManagerClient.h>
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080031
32namespace android {
33
Andreas Huber66b0a352010-01-26 16:20:10 -080034struct AudioPlayer;
Andreas Huber7b3396a2010-02-12 10:42:02 -080035struct DataSource;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080036struct MediaBuffer;
37struct MediaExtractor;
38struct MediaSource;
Andreas Huber0a5baa92010-06-10 11:17:50 -070039struct NuCachedSource2;
Andy McFadden8ba01022012-12-18 09:46:54 -080040struct IGraphicBufferProducer;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080041
Gloria Wangdcd25ef2010-06-22 13:55:38 -070042class DrmManagerClinet;
43class DecryptHandle;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080044
Insun Kang66551742012-01-11 22:03:12 +090045class TimedTextDriver;
Andreas Huber681755f2011-04-21 10:06:43 -070046struct WVMExtractor;
Gloria Wang7a1e3e82011-05-03 15:59:03 -070047
Andreas Huber733b7722009-12-14 14:18:22 -080048struct AwesomeRenderer : public RefBase {
49 AwesomeRenderer() {}
50
51 virtual void render(MediaBuffer *buffer) = 0;
52
53private:
54 AwesomeRenderer(const AwesomeRenderer &);
55 AwesomeRenderer &operator=(const AwesomeRenderer &);
56};
57
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080058struct AwesomePlayer {
59 AwesomePlayer();
60 ~AwesomePlayer();
61
Andreas Huber07260452010-01-21 10:28:45 -080062 void setListener(const wp<MediaPlayerBase> &listener);
Andreas Huber9b80c2b2011-06-30 15:47:02 -070063 void setUID(uid_t uid);
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080064
Andreas Huber5561ccf2010-01-27 16:49:05 -080065 status_t setDataSource(
66 const char *uri,
67 const KeyedVector<String8, String8> *headers = NULL);
68
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080069 status_t setDataSource(int fd, int64_t offset, int64_t length);
70
Andreas Hubere2b10282010-11-23 11:41:34 -080071 status_t setDataSource(const sp<IStreamSource> &source);
72
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080073 void reset();
74
Andreas Huberc23f12a2010-02-08 14:40:30 -080075 status_t prepare();
Andreas Huberbd22c522010-02-09 14:05:43 -080076 status_t prepare_l();
Andreas Huberc23f12a2010-02-08 14:40:30 -080077 status_t prepareAsync();
78 status_t prepareAsync_l();
79
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080080 status_t play();
81 status_t pause();
82
83 bool isPlaying() const;
84
Andy McFadden8ba01022012-12-18 09:46:54 -080085 status_t setSurfaceTexture(const sp<IGraphicBufferProducer> &bufferProducer);
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080086 void setAudioSink(const sp<MediaPlayerBase::AudioSink> &audioSink);
87 status_t setLooping(bool shouldLoop);
88
89 status_t getDuration(int64_t *durationUs);
90 status_t getPosition(int64_t *positionUs);
91
Gloria Wang4f9e47f2011-04-25 17:28:22 -070092 status_t setParameter(int key, const Parcel &request);
93 status_t getParameter(int key, Parcel *reply);
Insun Kangf9d660a2012-02-16 20:28:27 +090094 status_t invoke(const Parcel &request, Parcel *reply);
James Dong5b1b8a92011-05-25 19:37:03 -070095 status_t setCacheStatCollectFreq(const Parcel &request);
Gloria Wang4f9e47f2011-04-25 17:28:22 -070096
Andreas Huberbfa6b2d2009-11-20 09:32:46 -080097 status_t seekTo(int64_t timeUs);
98
Andreas Huberacdd9d02010-05-06 10:18:05 -070099 // This is a mask of MediaExtractor::Flags.
100 uint32_t flags() const;
101
Andreas Huber84b343f2011-03-22 10:31:21 -0700102 void postAudioEOS(int64_t delayUs = 0ll);
Andreas Hubered54ad02010-09-28 11:56:39 -0700103 void postAudioSeekComplete();
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000104 void postAudioTearDown();
Andreas Hubera0b1d4b2011-06-07 15:52:25 -0700105 status_t dump(int fd, const Vector<String16> &args) const;
106
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800107private:
108 friend struct AwesomeEvent;
Dharmaray Kundargiccb35062011-01-16 16:43:20 -0800109 friend struct PreviewPlayer;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800110
Andreas Huberacdd9d02010-05-06 10:18:05 -0700111 enum {
Gloria Wang7a1e3e82011-05-03 15:59:03 -0700112 PLAYING = 0x01,
113 LOOPING = 0x02,
114 FIRST_FRAME = 0x04,
115 PREPARING = 0x08,
116 PREPARED = 0x10,
117 AT_EOS = 0x20,
118 PREPARE_CANCELLED = 0x40,
119 CACHE_UNDERRUN = 0x80,
120 AUDIO_AT_EOS = 0x0100,
121 VIDEO_AT_EOS = 0x0200,
122 AUTO_LOOPING = 0x0400,
Andreas Huber6a05c9e2010-10-19 12:18:51 -0700123
124 // We are basically done preparing but are currently buffering
125 // sufficient data to begin playback and finish the preparation phase
126 // for good.
Gloria Wang7a1e3e82011-05-03 15:59:03 -0700127 PREPARING_CONNECTED = 0x0800,
Andreas Huber2b1222f2011-02-07 11:43:12 -0800128
129 // We're triggering a single video event to display the first frame
130 // after the seekpoint.
Gloria Wang7a1e3e82011-05-03 15:59:03 -0700131 SEEK_PREVIEW = 0x1000,
Andreas Huberf0303442011-02-11 13:09:36 -0800132
Gloria Wang7a1e3e82011-05-03 15:59:03 -0700133 AUDIO_RUNNING = 0x2000,
134 AUDIOPLAYER_STARTED = 0x4000,
Andreas Huber7314fa12011-02-24 14:42:48 -0800135
Gloria Wang7a1e3e82011-05-03 15:59:03 -0700136 INCOGNITO = 0x8000,
137
138 TEXT_RUNNING = 0x10000,
Insun Kangf9d660a2012-02-16 20:28:27 +0900139 TEXTPLAYER_INITIALIZED = 0x20000,
James Dong14f95742011-08-11 17:38:35 -0700140
141 SLOW_DECODER_HACK = 0x40000,
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800142 };
143
144 mutable Mutex mLock;
Andreas Huber2415ecb2010-03-26 10:17:17 -0700145 Mutex mMiscStateLock;
Andreas Hubera0b1d4b2011-06-07 15:52:25 -0700146 mutable Mutex mStatsLock;
Andreas Huber02f6e982011-09-01 11:39:11 -0700147 Mutex mAudioLock;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800148
149 OMXClient mClient;
150 TimedEventQueue mQueue;
Andreas Huber2e8ffaf2010-02-18 16:45:13 -0800151 bool mQueueStarted;
Andreas Huber07260452010-01-21 10:28:45 -0800152 wp<MediaPlayerBase> mListener;
Andreas Huber9b80c2b2011-06-30 15:47:02 -0700153 bool mUIDValid;
154 uid_t mUID;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800155
Glenn Kasten11731182011-02-08 17:26:17 -0800156 sp<ANativeWindow> mNativeWindow;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800157 sp<MediaPlayerBase::AudioSink> mAudioSink;
158
Andreas Huber5d2de4d2010-07-07 13:35:27 -0700159 SystemTimeSource mSystemTimeSource;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800160 TimeSource *mTimeSource;
161
Andreas Huberbd22c522010-02-09 14:05:43 -0800162 String8 mUri;
163 KeyedVector<String8, String8> mUriHeaders;
164
Andreas Huber7b3396a2010-02-12 10:42:02 -0800165 sp<DataSource> mFileSource;
166
Andreas Huber88d8a832010-03-05 10:42:10 -0800167 sp<MediaSource> mVideoTrack;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800168 sp<MediaSource> mVideoSource;
Andreas Huber733b7722009-12-14 14:18:22 -0800169 sp<AwesomeRenderer> mVideoRenderer;
James Dongc374dae2012-07-19 19:18:06 -0700170 bool mVideoRenderingStarted;
Andreas Huberfa090f52010-02-12 14:40:08 -0800171 bool mVideoRendererIsPreview;
Lajos Molnarcbaffcf2013-08-14 18:30:38 -0700172 int32_t mMediaRenderingStartGeneration;
173 int32_t mStartGeneration;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800174
James Dongab7a2e52012-04-26 17:11:28 -0700175 ssize_t mActiveAudioTrackIndex;
Andreas Huber88d8a832010-03-05 10:42:10 -0800176 sp<MediaSource> mAudioTrack;
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000177 sp<MediaSource> mOmxSource;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800178 sp<MediaSource> mAudioSource;
179 AudioPlayer *mAudioPlayer;
180 int64_t mDurationUs;
181
James Dongb45c01c2011-01-16 11:30:13 -0800182 int32_t mDisplayWidth;
183 int32_t mDisplayHeight;
James Dong4f6eed02012-04-30 14:38:12 -0700184 int32_t mVideoScalingMode;
James Dongb45c01c2011-01-16 11:30:13 -0800185
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800186 uint32_t mFlags;
Andreas Huberacdd9d02010-05-06 10:18:05 -0700187 uint32_t mExtractorFlags;
James Dong14f95742011-08-11 17:38:35 -0700188 uint32_t mSinceLastDropped;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800189
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800190 int64_t mTimeSourceDeltaUs;
191 int64_t mVideoTimeUs;
192
Andreas Huber64bb6982011-02-24 12:05:40 -0800193 enum SeekType {
194 NO_SEEK,
195 SEEK,
196 SEEK_VIDEO_ONLY
197 };
198 SeekType mSeeking;
199
Andreas Huber1321fdd2010-03-31 09:40:15 -0700200 bool mSeekNotificationSent;
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800201 int64_t mSeekTimeUs;
202
Andreas Huber7fbdb092010-10-12 16:55:11 -0700203 int64_t mBitrate; // total bitrate of the file (in bps) or -1 if unknown.
204
Andreas Huber1862a332010-02-03 11:37:29 -0800205 bool mWatchForAudioSeekComplete;
206 bool mWatchForAudioEOS;
207
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800208 sp<TimedEventQueue::Event> mVideoEvent;
209 bool mVideoEventPending;
210 sp<TimedEventQueue::Event> mStreamDoneEvent;
211 bool mStreamDoneEventPending;
Andreas Huber66b0a352010-01-26 16:20:10 -0800212 sp<TimedEventQueue::Event> mBufferingEvent;
213 bool mBufferingEventPending;
Andreas Huber1862a332010-02-03 11:37:29 -0800214 sp<TimedEventQueue::Event> mCheckAudioStatusEvent;
215 bool mAudioStatusEventPending;
Andreas Huber145e68f2011-01-11 15:05:28 -0800216 sp<TimedEventQueue::Event> mVideoLagEvent;
217 bool mVideoLagEventPending;
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000218 sp<TimedEventQueue::Event> mAudioTearDownEvent;
219 bool mAudioTearDownEventPending;
Andreas Huberc23f12a2010-02-08 14:40:30 -0800220 sp<TimedEventQueue::Event> mAsyncPrepareEvent;
221 Condition mPreparedCondition;
Andreas Huberbd22c522010-02-09 14:05:43 -0800222 bool mIsAsyncPrepare;
223 status_t mPrepareResult;
Andreas Huber5295c0c2010-02-23 13:45:33 -0800224 status_t mStreamDoneStatus;
Andreas Huberc23f12a2010-02-08 14:40:30 -0800225
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800226 void postVideoEvent_l(int64_t delayUs = -1);
Andreas Huber66b0a352010-01-26 16:20:10 -0800227 void postBufferingEvent_l();
Andreas Huber5295c0c2010-02-23 13:45:33 -0800228 void postStreamDoneEvent_l(status_t status);
Andreas Huber02f6e982011-09-01 11:39:11 -0700229 void postCheckAudioStatusEvent(int64_t delayUs);
Andreas Huber145e68f2011-01-11 15:05:28 -0800230 void postVideoLagEvent_l();
Richard Fitzgerald94ea60f2013-05-14 15:52:03 +0100231 void postAudioTearDownEvent(int64_t delayUs);
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000232
Andreas Huber7b3396a2010-02-12 10:42:02 -0800233 status_t play_l();
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800234
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800235 MediaBuffer *mVideoBuffer;
236
Andreas Huber1156dc92011-03-08 15:59:28 -0800237 sp<HTTPBase> mConnectingDataSource;
Andreas Huber0a5baa92010-06-10 11:17:50 -0700238 sp<NuCachedSource2> mCachedSource;
Andreas Huber66b0a352010-01-26 16:20:10 -0800239
Gloria Wangdcd25ef2010-06-22 13:55:38 -0700240 DrmManagerClient *mDrmManagerClient;
Gloria Wangb5ce3612011-02-24 16:40:57 -0800241 sp<DecryptHandle> mDecryptHandle;
Gloria Wangdcd25ef2010-06-22 13:55:38 -0700242
Andreas Huber150694c2011-03-14 10:55:40 -0700243 int64_t mLastVideoTimeUs;
Insun Kang66551742012-01-11 22:03:12 +0900244 TimedTextDriver *mTextDriver;
Andreas Huber150694c2011-03-14 10:55:40 -0700245
Andreas Huber681755f2011-04-21 10:06:43 -0700246 sp<WVMExtractor> mWVMExtractor;
James Dongeec46ab2012-04-11 17:56:22 -0700247 sp<MediaExtractor> mExtractor;
Andreas Huber681755f2011-04-21 10:06:43 -0700248
Andreas Huber7b3396a2010-02-12 10:42:02 -0800249 status_t setDataSource_l(
250 const char *uri,
251 const KeyedVector<String8, String8> *headers = NULL);
252
253 status_t setDataSource_l(const sp<DataSource> &dataSource);
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800254 status_t setDataSource_l(const sp<MediaExtractor> &extractor);
255 void reset_l();
256 status_t seekTo_l(int64_t timeUs);
Andreas Huberb2e39542010-10-05 10:25:34 -0700257 status_t pause_l(bool at_eos = false);
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800258 void initRenderer_l();
Andreas Huber5daeb122010-08-16 08:49:37 -0700259 void notifyVideoSize_l();
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800260 void seekAudioIfNecessary_l();
261
Andreas Huberc34233e2011-11-16 10:46:05 -0800262 void cancelPlayerEvents(bool keepNotifications = false);
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800263
Andreas Huber88d8a832010-03-05 10:42:10 -0800264 void setAudioSource(sp<MediaSource> source);
265 status_t initAudioDecoder();
266
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000267
Andreas Huber88d8a832010-03-05 10:42:10 -0800268 void setVideoSource(sp<MediaSource> source);
Andreas Huber2a4d22d2010-09-08 14:32:20 -0700269 status_t initVideoDecoder(uint32_t flags = 0);
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800270
Edwin Wong6a3969c2012-05-02 18:57:12 -0700271 void addTextSource_l(size_t trackIndex, const sp<MediaSource>& source);
Gloria Wang7a1e3e82011-05-03 15:59:03 -0700272
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800273 void onStreamDone();
274
Andreas Huberc23f12a2010-02-08 14:40:30 -0800275 void notifyListener_l(int msg, int ext1 = 0, int ext2 = 0);
Andreas Huber66b0a352010-01-26 16:20:10 -0800276
Andreas Huberc23f12a2010-02-08 14:40:30 -0800277 void onVideoEvent();
Andreas Huber66b0a352010-01-26 16:20:10 -0800278 void onBufferingUpdate();
Andreas Huber1862a332010-02-03 11:37:29 -0800279 void onCheckAudioStatus();
Andreas Huberc23f12a2010-02-08 14:40:30 -0800280 void onPrepareAsyncEvent();
Andreas Huber88d8a832010-03-05 10:42:10 -0800281 void abortPrepare(status_t err);
Andreas Huber8650e192010-09-03 13:20:33 -0700282 void finishAsyncPrepare_l();
Andreas Huber145e68f2011-01-11 15:05:28 -0800283 void onVideoLagUpdate();
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000284 void onAudioTearDownEvent();
285
286 void beginPrepareAsync_l();
Andreas Huber8650e192010-09-03 13:20:33 -0700287
288 bool getCachedDuration_l(int64_t *durationUs, bool *eos);
Andreas Huber88d8a832010-03-05 10:42:10 -0800289
Andreas Huberbd22c522010-02-09 14:05:43 -0800290 status_t finishSetDataSource_l();
Andreas Huber07260452010-01-21 10:28:45 -0800291
Andreas Hubere966fb02010-03-24 09:24:40 -0700292 static bool ContinuePreparation(void *cookie);
293
Andreas Huber7fbdb092010-10-12 16:55:11 -0700294 bool getBitrate(int64_t *bitrate);
295
Andreas Huber4769cc92010-10-19 09:34:44 -0700296 void finishSeekIfNecessary(int64_t videoTimeUs);
Andreas Huber34ef0f32010-11-11 15:37:17 -0800297 void ensureCacheIsFetching_l();
Andreas Huber4769cc92010-10-19 09:34:44 -0700298
Lajos Molnarcbaffcf2013-08-14 18:30:38 -0700299 void notifyIfMediaStarted_l();
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000300 void createAudioPlayer_l();
Andreas Huber5442cb52011-07-14 13:02:47 -0700301 status_t startAudioPlayer_l(bool sendErrorNotification = true);
Andreas Huberf0303442011-02-11 13:09:36 -0800302
Andreas Huber150694c2011-03-14 10:55:40 -0700303 void shutdownVideoDecoder_l();
Andreas Huber63970b42011-08-29 13:01:23 -0700304 status_t setNativeWindow_l(const sp<ANativeWindow> &native);
Andreas Huber150694c2011-03-14 10:55:40 -0700305
Andreas Huber681755f2011-04-21 10:06:43 -0700306 bool isStreamingHTTP() const;
James Dong5b1b8a92011-05-25 19:37:03 -0700307 void sendCacheStats();
James Dong9d2f3862012-01-10 08:24:37 -0800308 void checkDrmStatus(const sp<DataSource>& dataSource);
Andreas Huber681755f2011-04-21 10:06:43 -0700309
Andreas Hubera0b1d4b2011-06-07 15:52:25 -0700310 enum FlagMode {
311 SET,
312 CLEAR,
313 ASSIGN
314 };
315 void modifyFlags(unsigned value, FlagMode mode);
316
317 struct TrackStat {
318 String8 mMIME;
319 String8 mDecoderName;
320 };
321
322 // protected by mStatsLock
323 struct Stats {
324 int mFd;
325 String8 mURI;
326 int64_t mBitrate;
James Dongab7a2e52012-04-26 17:11:28 -0700327
328 // FIXME:
329 // These two indices are just 0 or 1 for now
330 // They are not representing the actual track
331 // indices in the stream.
Andreas Hubera0b1d4b2011-06-07 15:52:25 -0700332 ssize_t mAudioTrackIndex;
333 ssize_t mVideoTrackIndex;
James Dongab7a2e52012-04-26 17:11:28 -0700334
Andreas Hubera0b1d4b2011-06-07 15:52:25 -0700335 int64_t mNumVideoFramesDecoded;
336 int64_t mNumVideoFramesDropped;
337 int32_t mVideoWidth;
338 int32_t mVideoHeight;
339 uint32_t mFlags;
340 Vector<TrackStat> mTracks;
341 } mStats;
342
Richard Fitzgeraldad3af332013-03-25 16:54:37 +0000343 bool mOffloadAudio;
344 bool mAudioTearDown;
345
James Dong4f6eed02012-04-30 14:38:12 -0700346 status_t setVideoScalingMode(int32_t mode);
347 status_t setVideoScalingMode_l(int32_t mode);
James Dongeec46ab2012-04-11 17:56:22 -0700348 status_t getTrackInfo(Parcel* reply) const;
349
James Dongab7a2e52012-04-26 17:11:28 -0700350 status_t selectAudioTrack_l(const sp<MediaSource>& source, size_t trackIndex);
351
James Dongeec46ab2012-04-11 17:56:22 -0700352 // when select is true, the given track is selected.
353 // otherwise, the given track is unselected.
354 status_t selectTrack(size_t trackIndex, bool select);
355
356 size_t countTracks() const;
357
Andreas Huberbfa6b2d2009-11-20 09:32:46 -0800358 AwesomePlayer(const AwesomePlayer &);
359 AwesomePlayer &operator=(const AwesomePlayer &);
360};
361
362} // namespace android
363
364#endif // AWESOME_PLAYER_H_