blob: d03601fd1d10fc2ebcc837f8da4027c9be2b06a5 [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) {
Andreas Huberafed0e12011-09-20 15:39:58 -070079 CHECK_EQ((int)mState, (int)UNINITIALIZED);
80
81 mPlayer->setDataSource(fd, offset, length);
82
83 mState = STOPPED;
84
85 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -080086}
87
88status_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -080089 CHECK_EQ((int)mState, (int)UNINITIALIZED);
90
Andreas Huberf9334412010-12-15 15:17:42 -080091 mPlayer->setDataSource(source);
92
Andreas Huber43c3e6c2011-01-05 12:17:08 -080093 mState = STOPPED;
94
Andreas Huberf9334412010-12-15 15:17:42 -080095 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() {
Andreas Huber0b7c9a32012-04-30 11:35:34 -0700106 sendEvent(MEDIA_SET_VIDEO_SIZE, 0, 0);
Andreas Huberf9334412010-12-15 15:17:42 -0800107 return OK;
108}
109
110status_t NuPlayerDriver::prepareAsync() {
Andreas Huberafed0e12011-09-20 15:39:58 -0700111 status_t err = prepare();
112
Andreas Hubera4af2142011-10-26 15:23:31 -0700113 notifyListener(MEDIA_PREPARED);
Andreas Huber5bc087c2010-12-23 10:27:40 -0800114
Andreas Huberafed0e12011-09-20 15:39:58 -0700115 return err;
Andreas Huberf9334412010-12-15 15:17:42 -0800116}
117
118status_t NuPlayerDriver::start() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800119 switch (mState) {
120 case UNINITIALIZED:
121 return INVALID_OPERATION;
122 case STOPPED:
123 {
Andreas Hubera4af2142011-10-26 15:23:31 -0700124 mAtEOS = false;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800125 mPlayer->start();
126
127 if (mStartupSeekTimeUs >= 0) {
Andreas Huber2048d0c2011-07-15 16:25:41 -0700128 if (mStartupSeekTimeUs == 0) {
129 notifySeekComplete();
130 } else {
131 mPlayer->seekToAsync(mStartupSeekTimeUs);
132 }
133
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800134 mStartupSeekTimeUs = -1;
135 }
Andreas Huber2048d0c2011-07-15 16:25:41 -0700136
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800137 break;
138 }
139 case PLAYING:
140 return OK;
141 default:
142 {
143 CHECK_EQ((int)mState, (int)PAUSED);
144
145 mPlayer->resume();
146 break;
147 }
148 }
149
150 mState = PLAYING;
Andreas Huberf9334412010-12-15 15:17:42 -0800151
152 return OK;
153}
154
155status_t NuPlayerDriver::stop() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800156 return pause();
Andreas Huberf9334412010-12-15 15:17:42 -0800157}
158
159status_t NuPlayerDriver::pause() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800160 switch (mState) {
161 case UNINITIALIZED:
162 return INVALID_OPERATION;
163 case STOPPED:
164 return OK;
165 case PLAYING:
166 mPlayer->pause();
167 break;
168 default:
169 {
170 CHECK_EQ((int)mState, (int)PAUSED);
171 return OK;
172 }
173 }
174
175 mState = PAUSED;
176
Andreas Huberf9334412010-12-15 15:17:42 -0800177 return OK;
178}
179
180bool NuPlayerDriver::isPlaying() {
Andreas Hubera4af2142011-10-26 15:23:31 -0700181 return mState == PLAYING && !mAtEOS;
Andreas Huberf9334412010-12-15 15:17:42 -0800182}
183
184status_t NuPlayerDriver::seekTo(int msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800185 int64_t seekTimeUs = msec * 1000ll;
186
187 switch (mState) {
188 case UNINITIALIZED:
189 return INVALID_OPERATION;
190 case STOPPED:
191 {
192 mStartupSeekTimeUs = seekTimeUs;
193 break;
194 }
195 case PLAYING:
196 case PAUSED:
197 {
Andreas Hubera4af2142011-10-26 15:23:31 -0700198 mAtEOS = false;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800199 mPlayer->seekToAsync(seekTimeUs);
200 break;
201 }
202
203 default:
204 TRESPASS();
205 break;
206 }
207
208 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800209}
210
211status_t NuPlayerDriver::getCurrentPosition(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800212 Mutex::Autolock autoLock(mLock);
213
214 if (mPositionUs < 0) {
215 *msec = 0;
216 } else {
217 *msec = (mPositionUs + 500ll) / 1000;
218 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800219
220 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800221}
222
223status_t NuPlayerDriver::getDuration(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800224 Mutex::Autolock autoLock(mLock);
225
226 if (mDurationUs < 0) {
227 *msec = 0;
228 } else {
229 *msec = (mDurationUs + 500ll) / 1000;
230 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800231
232 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800233}
234
235status_t NuPlayerDriver::reset() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800236 Mutex::Autolock autoLock(mLock);
237 mResetInProgress = true;
238
239 mPlayer->resetAsync();
240
241 while (mResetInProgress) {
242 mCondition.wait(mLock);
243 }
244
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800245 mDurationUs = -1;
246 mPositionUs = -1;
247 mState = UNINITIALIZED;
248 mStartupSeekTimeUs = -1;
249
Andreas Huberf9334412010-12-15 15:17:42 -0800250 return OK;
251}
252
253status_t NuPlayerDriver::setLooping(int loop) {
254 return INVALID_OPERATION;
255}
256
257player_type NuPlayerDriver::playerType() {
258 return NU_PLAYER;
259}
260
261status_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) {
James Dong0d268a32012-08-31 12:18:27 -0700262 if (reply == NULL) {
263 ALOGE("reply is a NULL pointer");
264 return BAD_VALUE;
265 }
266
267 int32_t methodId;
268 status_t ret = request.readInt32(&methodId);
269 if (ret != OK) {
270 ALOGE("Failed to retrieve the requested method to invoke");
271 return ret;
272 }
273
274 switch (methodId) {
275 case INVOKE_ID_SET_VIDEO_SCALING_MODE:
276 {
277 int mode = request.readInt32();
278 return mPlayer->setVideoScalingMode(mode);
279 }
280 default:
281 {
282 return INVALID_OPERATION;
283 }
284 }
Andreas Huberf9334412010-12-15 15:17:42 -0800285}
286
287void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
288 mPlayer->setAudioSink(audioSink);
289}
290
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700291status_t NuPlayerDriver::setParameter(int key, const Parcel &request) {
292 return INVALID_OPERATION;
293}
294
295status_t NuPlayerDriver::getParameter(int key, Parcel *reply) {
296 return INVALID_OPERATION;
297}
298
Andreas Huberf9334412010-12-15 15:17:42 -0800299status_t NuPlayerDriver::getMetadata(
300 const media::Metadata::Filter& ids, Parcel *records) {
301 return INVALID_OPERATION;
302}
303
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800304void NuPlayerDriver::notifyResetComplete() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800305 Mutex::Autolock autoLock(mLock);
306 CHECK(mResetInProgress);
307 mResetInProgress = false;
308 mCondition.broadcast();
309}
310
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800311void NuPlayerDriver::notifyDuration(int64_t durationUs) {
312 Mutex::Autolock autoLock(mLock);
313 mDurationUs = durationUs;
314}
315
316void NuPlayerDriver::notifyPosition(int64_t positionUs) {
317 Mutex::Autolock autoLock(mLock);
318 mPositionUs = positionUs;
319}
320
321void NuPlayerDriver::notifySeekComplete() {
Andreas Hubera4af2142011-10-26 15:23:31 -0700322 notifyListener(MEDIA_SEEK_COMPLETE);
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800323}
324
Andreas Huber3fe62152011-09-16 15:09:22 -0700325void NuPlayerDriver::notifyFrameStats(
326 int64_t numFramesTotal, int64_t numFramesDropped) {
327 Mutex::Autolock autoLock(mLock);
328 mNumFramesTotal = numFramesTotal;
329 mNumFramesDropped = numFramesDropped;
330}
331
332status_t NuPlayerDriver::dump(int fd, const Vector<String16> &args) const {
333 Mutex::Autolock autoLock(mLock);
334
335 FILE *out = fdopen(dup(fd), "w");
336
337 fprintf(out, " NuPlayer\n");
338 fprintf(out, " numFramesTotal(%lld), numFramesDropped(%lld), "
339 "percentageDropped(%.2f)\n",
340 mNumFramesTotal,
341 mNumFramesDropped,
342 mNumFramesTotal == 0
343 ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal);
344
345 fclose(out);
346 out = NULL;
347
348 return OK;
349}
350
Andreas Hubera4af2142011-10-26 15:23:31 -0700351void NuPlayerDriver::notifyListener(int msg, int ext1, int ext2) {
352 if (msg == MEDIA_PLAYBACK_COMPLETE || msg == MEDIA_ERROR) {
353 mAtEOS = true;
354 }
355
356 sendEvent(msg, ext1, ext2);
357}
358
Andreas Huberf9334412010-12-15 15:17:42 -0800359} // namespace android