blob: b1e917d2abea2547d3e53537b4b6de681b6c0e34 [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),
38 mStartupSeekTimeUs(-1) {
Andreas Huberf9334412010-12-15 15:17:42 -080039 mLooper->setName("NuPlayerDriver Looper");
40
41 mLooper->start(
42 false, /* runOnCallingThread */
43 true, /* canCallJava */
44 PRIORITY_AUDIO);
45
46 mPlayer = new NuPlayer;
47 mLooper->registerHandler(mPlayer);
48
Andreas Huber43c3e6c2011-01-05 12:17:08 -080049 mPlayer->setDriver(this);
Andreas Huberf9334412010-12-15 15:17:42 -080050}
51
52NuPlayerDriver::~NuPlayerDriver() {
53 mLooper->stop();
54}
55
56status_t NuPlayerDriver::initCheck() {
57 return OK;
58}
59
Andreas Huber9b80c2b2011-06-30 15:47:02 -070060status_t NuPlayerDriver::setUID(uid_t uid) {
61 mPlayer->setUID(uid);
62
63 return OK;
64}
65
Andreas Huberf9334412010-12-15 15:17:42 -080066status_t NuPlayerDriver::setDataSource(
67 const char *url, const KeyedVector<String8, String8> *headers) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -080068 CHECK_EQ((int)mState, (int)UNINITIALIZED);
69
Andreas Huber5bc087c2010-12-23 10:27:40 -080070 mPlayer->setDataSource(url, headers);
71
Andreas Huber43c3e6c2011-01-05 12:17:08 -080072 mState = STOPPED;
73
Andreas Huber5bc087c2010-12-23 10:27:40 -080074 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -080075}
76
77status_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
78 return INVALID_OPERATION;
79}
80
81status_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -080082 CHECK_EQ((int)mState, (int)UNINITIALIZED);
83
Andreas Huberf9334412010-12-15 15:17:42 -080084 mPlayer->setDataSource(source);
85
Andreas Huber43c3e6c2011-01-05 12:17:08 -080086 mState = STOPPED;
87
Andreas Huberf9334412010-12-15 15:17:42 -080088 return OK;
89}
90
91status_t NuPlayerDriver::setVideoSurface(const sp<Surface> &surface) {
92 mPlayer->setVideoSurface(surface);
93
94 return OK;
95}
96
Glenn Kasten11731182011-02-08 17:26:17 -080097status_t NuPlayerDriver::setVideoSurfaceTexture(
98 const sp<ISurfaceTexture> &surfaceTexture) {
99 mPlayer->setVideoSurfaceTexture(surfaceTexture);
100
101 return OK;
102}
103
Andreas Huberf9334412010-12-15 15:17:42 -0800104status_t NuPlayerDriver::prepare() {
105 return OK;
106}
107
108status_t NuPlayerDriver::prepareAsync() {
Andreas Huber5bc087c2010-12-23 10:27:40 -0800109 sendEvent(MEDIA_PREPARED);
110
Andreas Huberf9334412010-12-15 15:17:42 -0800111 return OK;
112}
113
114status_t NuPlayerDriver::start() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800115 switch (mState) {
116 case UNINITIALIZED:
117 return INVALID_OPERATION;
118 case STOPPED:
119 {
120 mPlayer->start();
121
122 if (mStartupSeekTimeUs >= 0) {
Andreas Huber2048d0c2011-07-15 16:25:41 -0700123 if (mStartupSeekTimeUs == 0) {
124 notifySeekComplete();
125 } else {
126 mPlayer->seekToAsync(mStartupSeekTimeUs);
127 }
128
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800129 mStartupSeekTimeUs = -1;
130 }
Andreas Huber2048d0c2011-07-15 16:25:41 -0700131
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800132 break;
133 }
134 case PLAYING:
135 return OK;
136 default:
137 {
138 CHECK_EQ((int)mState, (int)PAUSED);
139
140 mPlayer->resume();
141 break;
142 }
143 }
144
145 mState = PLAYING;
Andreas Huberf9334412010-12-15 15:17:42 -0800146
147 return OK;
148}
149
150status_t NuPlayerDriver::stop() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800151 return pause();
Andreas Huberf9334412010-12-15 15:17:42 -0800152}
153
154status_t NuPlayerDriver::pause() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800155 switch (mState) {
156 case UNINITIALIZED:
157 return INVALID_OPERATION;
158 case STOPPED:
159 return OK;
160 case PLAYING:
161 mPlayer->pause();
162 break;
163 default:
164 {
165 CHECK_EQ((int)mState, (int)PAUSED);
166 return OK;
167 }
168 }
169
170 mState = PAUSED;
171
Andreas Huberf9334412010-12-15 15:17:42 -0800172 return OK;
173}
174
175bool NuPlayerDriver::isPlaying() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800176 return mState == PLAYING;
Andreas Huberf9334412010-12-15 15:17:42 -0800177}
178
179status_t NuPlayerDriver::seekTo(int msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800180 int64_t seekTimeUs = msec * 1000ll;
181
182 switch (mState) {
183 case UNINITIALIZED:
184 return INVALID_OPERATION;
185 case STOPPED:
186 {
187 mStartupSeekTimeUs = seekTimeUs;
188 break;
189 }
190 case PLAYING:
191 case PAUSED:
192 {
193 mPlayer->seekToAsync(seekTimeUs);
194 break;
195 }
196
197 default:
198 TRESPASS();
199 break;
200 }
201
202 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800203}
204
205status_t NuPlayerDriver::getCurrentPosition(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800206 Mutex::Autolock autoLock(mLock);
207
208 if (mPositionUs < 0) {
209 *msec = 0;
210 } else {
211 *msec = (mPositionUs + 500ll) / 1000;
212 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800213
214 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800215}
216
217status_t NuPlayerDriver::getDuration(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800218 Mutex::Autolock autoLock(mLock);
219
220 if (mDurationUs < 0) {
221 *msec = 0;
222 } else {
223 *msec = (mDurationUs + 500ll) / 1000;
224 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800225
226 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800227}
228
229status_t NuPlayerDriver::reset() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800230 Mutex::Autolock autoLock(mLock);
231 mResetInProgress = true;
232
233 mPlayer->resetAsync();
234
235 while (mResetInProgress) {
236 mCondition.wait(mLock);
237 }
238
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800239 mDurationUs = -1;
240 mPositionUs = -1;
241 mState = UNINITIALIZED;
242 mStartupSeekTimeUs = -1;
243
Andreas Huberf9334412010-12-15 15:17:42 -0800244 return OK;
245}
246
247status_t NuPlayerDriver::setLooping(int loop) {
248 return INVALID_OPERATION;
249}
250
251player_type NuPlayerDriver::playerType() {
252 return NU_PLAYER;
253}
254
255status_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) {
256 return INVALID_OPERATION;
257}
258
259void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
260 mPlayer->setAudioSink(audioSink);
261}
262
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700263status_t NuPlayerDriver::setParameter(int key, const Parcel &request) {
264 return INVALID_OPERATION;
265}
266
267status_t NuPlayerDriver::getParameter(int key, Parcel *reply) {
268 return INVALID_OPERATION;
269}
270
Andreas Huberf9334412010-12-15 15:17:42 -0800271status_t NuPlayerDriver::getMetadata(
272 const media::Metadata::Filter& ids, Parcel *records) {
273 return INVALID_OPERATION;
274}
275
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800276void NuPlayerDriver::notifyResetComplete() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800277 Mutex::Autolock autoLock(mLock);
278 CHECK(mResetInProgress);
279 mResetInProgress = false;
280 mCondition.broadcast();
281}
282
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800283void NuPlayerDriver::notifyDuration(int64_t durationUs) {
284 Mutex::Autolock autoLock(mLock);
285 mDurationUs = durationUs;
286}
287
288void NuPlayerDriver::notifyPosition(int64_t positionUs) {
289 Mutex::Autolock autoLock(mLock);
290 mPositionUs = positionUs;
291}
292
293void NuPlayerDriver::notifySeekComplete() {
294 sendEvent(MEDIA_SEEK_COMPLETE);
295}
296
Andreas Huber3fe62152011-09-16 15:09:22 -0700297void NuPlayerDriver::notifyFrameStats(
298 int64_t numFramesTotal, int64_t numFramesDropped) {
299 Mutex::Autolock autoLock(mLock);
300 mNumFramesTotal = numFramesTotal;
301 mNumFramesDropped = numFramesDropped;
302}
303
304status_t NuPlayerDriver::dump(int fd, const Vector<String16> &args) const {
305 Mutex::Autolock autoLock(mLock);
306
307 FILE *out = fdopen(dup(fd), "w");
308
309 fprintf(out, " NuPlayer\n");
310 fprintf(out, " numFramesTotal(%lld), numFramesDropped(%lld), "
311 "percentageDropped(%.2f)\n",
312 mNumFramesTotal,
313 mNumFramesDropped,
314 mNumFramesTotal == 0
315 ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal);
316
317 fclose(out);
318 out = NULL;
319
320 return OK;
321}
322
Andreas Huberf9334412010-12-15 15:17:42 -0800323} // namespace android