blob: 452ba994abd65ab6c92e4fe99ff88e6755b3ed4a [file] [log] [blame]
Andreas Huberf9334412010-12-15 15:17:42 -08001/*
2 * Copyright (C) 2010 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//#define LOG_NDEBUG 0
18#define LOG_TAG "NuPlayerDriver"
19#include <utils/Log.h>
20
21#include "NuPlayerDriver.h"
22
23#include "NuPlayer.h"
24
Andreas Huber1aef2112011-01-04 14:01:29 -080025#include <media/stagefright/foundation/ADebug.h>
Andreas Huberf9334412010-12-15 15:17:42 -080026#include <media/stagefright/foundation/ALooper.h>
27
28namespace android {
29
30NuPlayerDriver::NuPlayerDriver()
Andreas Huber1aef2112011-01-04 14:01:29 -080031 : mResetInProgress(false),
Andreas Huber43c3e6c2011-01-05 12:17:08 -080032 mDurationUs(-1),
33 mPositionUs(-1),
Andreas Huber3fe62152011-09-16 15:09:22 -070034 mNumFramesTotal(0),
35 mNumFramesDropped(0),
Andreas Huber1aef2112011-01-04 14:01:29 -080036 mLooper(new ALooper),
Andreas Huber43c3e6c2011-01-05 12:17:08 -080037 mState(UNINITIALIZED),
Andreas Hubera4af2142011-10-26 15:23:31 -070038 mAtEOS(false),
Andreas Huber43c3e6c2011-01-05 12:17:08 -080039 mStartupSeekTimeUs(-1) {
Andreas Huberf9334412010-12-15 15:17:42 -080040 mLooper->setName("NuPlayerDriver Looper");
41
42 mLooper->start(
43 false, /* runOnCallingThread */
44 true, /* canCallJava */
45 PRIORITY_AUDIO);
46
47 mPlayer = new NuPlayer;
48 mLooper->registerHandler(mPlayer);
49
Andreas Huber43c3e6c2011-01-05 12:17:08 -080050 mPlayer->setDriver(this);
Andreas Huberf9334412010-12-15 15:17:42 -080051}
52
53NuPlayerDriver::~NuPlayerDriver() {
54 mLooper->stop();
55}
56
57status_t NuPlayerDriver::initCheck() {
58 return OK;
59}
60
Andreas Huber9b80c2b2011-06-30 15:47:02 -070061status_t NuPlayerDriver::setUID(uid_t uid) {
62 mPlayer->setUID(uid);
63
64 return OK;
65}
66
Andreas Huberf9334412010-12-15 15:17:42 -080067status_t NuPlayerDriver::setDataSource(
68 const char *url, const KeyedVector<String8, String8> *headers) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -080069 CHECK_EQ((int)mState, (int)UNINITIALIZED);
70
Andreas Huber5bc087c2010-12-23 10:27:40 -080071 mPlayer->setDataSource(url, headers);
72
Andreas Huber43c3e6c2011-01-05 12:17:08 -080073 mState = STOPPED;
74
Andreas Huber5bc087c2010-12-23 10:27:40 -080075 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -080076}
77
78status_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
79 return INVALID_OPERATION;
80}
81
82status_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -080083 CHECK_EQ((int)mState, (int)UNINITIALIZED);
84
Andreas Huberf9334412010-12-15 15:17:42 -080085 mPlayer->setDataSource(source);
86
Andreas Huber43c3e6c2011-01-05 12:17:08 -080087 mState = STOPPED;
88
Andreas Huberf9334412010-12-15 15:17:42 -080089 return OK;
90}
91
92status_t NuPlayerDriver::setVideoSurface(const sp<Surface> &surface) {
93 mPlayer->setVideoSurface(surface);
94
95 return OK;
96}
97
Glenn Kasten11731182011-02-08 17:26:17 -080098status_t NuPlayerDriver::setVideoSurfaceTexture(
99 const sp<ISurfaceTexture> &surfaceTexture) {
100 mPlayer->setVideoSurfaceTexture(surfaceTexture);
101
102 return OK;
103}
104
Andreas Huberf9334412010-12-15 15:17:42 -0800105status_t NuPlayerDriver::prepare() {
106 return OK;
107}
108
109status_t NuPlayerDriver::prepareAsync() {
Andreas Hubera4af2142011-10-26 15:23:31 -0700110 notifyListener(MEDIA_PREPARED);
Andreas Huber5bc087c2010-12-23 10:27:40 -0800111
Andreas Huberf9334412010-12-15 15:17:42 -0800112 return OK;
113}
114
115status_t NuPlayerDriver::start() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800116 switch (mState) {
117 case UNINITIALIZED:
118 return INVALID_OPERATION;
119 case STOPPED:
120 {
Andreas Hubera4af2142011-10-26 15:23:31 -0700121 mAtEOS = false;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800122 mPlayer->start();
123
124 if (mStartupSeekTimeUs >= 0) {
Andreas Huber2048d0c2011-07-15 16:25:41 -0700125 if (mStartupSeekTimeUs == 0) {
126 notifySeekComplete();
127 } else {
128 mPlayer->seekToAsync(mStartupSeekTimeUs);
129 }
130
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800131 mStartupSeekTimeUs = -1;
132 }
Andreas Huber2048d0c2011-07-15 16:25:41 -0700133
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800134 break;
135 }
136 case PLAYING:
137 return OK;
138 default:
139 {
140 CHECK_EQ((int)mState, (int)PAUSED);
141
142 mPlayer->resume();
143 break;
144 }
145 }
146
147 mState = PLAYING;
Andreas Huberf9334412010-12-15 15:17:42 -0800148
149 return OK;
150}
151
152status_t NuPlayerDriver::stop() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800153 return pause();
Andreas Huberf9334412010-12-15 15:17:42 -0800154}
155
156status_t NuPlayerDriver::pause() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800157 switch (mState) {
158 case UNINITIALIZED:
159 return INVALID_OPERATION;
160 case STOPPED:
161 return OK;
162 case PLAYING:
163 mPlayer->pause();
164 break;
165 default:
166 {
167 CHECK_EQ((int)mState, (int)PAUSED);
168 return OK;
169 }
170 }
171
172 mState = PAUSED;
173
Andreas Huberf9334412010-12-15 15:17:42 -0800174 return OK;
175}
176
177bool NuPlayerDriver::isPlaying() {
Andreas Hubera4af2142011-10-26 15:23:31 -0700178 return mState == PLAYING && !mAtEOS;
Andreas Huberf9334412010-12-15 15:17:42 -0800179}
180
181status_t NuPlayerDriver::seekTo(int msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800182 int64_t seekTimeUs = msec * 1000ll;
183
184 switch (mState) {
185 case UNINITIALIZED:
186 return INVALID_OPERATION;
187 case STOPPED:
188 {
189 mStartupSeekTimeUs = seekTimeUs;
190 break;
191 }
192 case PLAYING:
193 case PAUSED:
194 {
Andreas Hubera4af2142011-10-26 15:23:31 -0700195 mAtEOS = false;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800196 mPlayer->seekToAsync(seekTimeUs);
197 break;
198 }
199
200 default:
201 TRESPASS();
202 break;
203 }
204
205 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800206}
207
208status_t NuPlayerDriver::getCurrentPosition(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800209 Mutex::Autolock autoLock(mLock);
210
211 if (mPositionUs < 0) {
212 *msec = 0;
213 } else {
214 *msec = (mPositionUs + 500ll) / 1000;
215 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800216
217 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800218}
219
220status_t NuPlayerDriver::getDuration(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800221 Mutex::Autolock autoLock(mLock);
222
223 if (mDurationUs < 0) {
224 *msec = 0;
225 } else {
226 *msec = (mDurationUs + 500ll) / 1000;
227 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800228
229 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800230}
231
232status_t NuPlayerDriver::reset() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800233 Mutex::Autolock autoLock(mLock);
234 mResetInProgress = true;
235
236 mPlayer->resetAsync();
237
238 while (mResetInProgress) {
239 mCondition.wait(mLock);
240 }
241
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800242 mDurationUs = -1;
243 mPositionUs = -1;
244 mState = UNINITIALIZED;
245 mStartupSeekTimeUs = -1;
246
Andreas Huberf9334412010-12-15 15:17:42 -0800247 return OK;
248}
249
250status_t NuPlayerDriver::setLooping(int loop) {
251 return INVALID_OPERATION;
252}
253
254player_type NuPlayerDriver::playerType() {
255 return NU_PLAYER;
256}
257
258status_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) {
259 return INVALID_OPERATION;
260}
261
262void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
263 mPlayer->setAudioSink(audioSink);
264}
265
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700266status_t NuPlayerDriver::setParameter(int key, const Parcel &request) {
267 return INVALID_OPERATION;
268}
269
270status_t NuPlayerDriver::getParameter(int key, Parcel *reply) {
271 return INVALID_OPERATION;
272}
273
Andreas Huberf9334412010-12-15 15:17:42 -0800274status_t NuPlayerDriver::getMetadata(
275 const media::Metadata::Filter& ids, Parcel *records) {
276 return INVALID_OPERATION;
277}
278
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800279void NuPlayerDriver::notifyResetComplete() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800280 Mutex::Autolock autoLock(mLock);
281 CHECK(mResetInProgress);
282 mResetInProgress = false;
283 mCondition.broadcast();
284}
285
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800286void NuPlayerDriver::notifyDuration(int64_t durationUs) {
287 Mutex::Autolock autoLock(mLock);
288 mDurationUs = durationUs;
289}
290
291void NuPlayerDriver::notifyPosition(int64_t positionUs) {
292 Mutex::Autolock autoLock(mLock);
293 mPositionUs = positionUs;
294}
295
296void NuPlayerDriver::notifySeekComplete() {
Andreas Hubera4af2142011-10-26 15:23:31 -0700297 notifyListener(MEDIA_SEEK_COMPLETE);
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800298}
299
Andreas Huber3fe62152011-09-16 15:09:22 -0700300void NuPlayerDriver::notifyFrameStats(
301 int64_t numFramesTotal, int64_t numFramesDropped) {
302 Mutex::Autolock autoLock(mLock);
303 mNumFramesTotal = numFramesTotal;
304 mNumFramesDropped = numFramesDropped;
305}
306
307status_t NuPlayerDriver::dump(int fd, const Vector<String16> &args) const {
308 Mutex::Autolock autoLock(mLock);
309
310 FILE *out = fdopen(dup(fd), "w");
311
312 fprintf(out, " NuPlayer\n");
313 fprintf(out, " numFramesTotal(%lld), numFramesDropped(%lld), "
314 "percentageDropped(%.2f)\n",
315 mNumFramesTotal,
316 mNumFramesDropped,
317 mNumFramesTotal == 0
318 ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal);
319
320 fclose(out);
321 out = NULL;
322
323 return OK;
324}
325
Andreas Hubera4af2142011-10-26 15:23:31 -0700326void NuPlayerDriver::notifyListener(int msg, int ext1, int ext2) {
327 if (msg == MEDIA_PLAYBACK_COMPLETE || msg == MEDIA_ERROR) {
328 mAtEOS = true;
329 }
330
331 sendEvent(msg, ext1, ext2);
332}
333
Andreas Huberf9334412010-12-15 15:17:42 -0800334} // namespace android