blob: d35d1dfe2ffe677157a852dc3927b0dd8c19de52 [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"
Andreas Huber9575c962013-02-05 13:59:56 -080024#include "NuPlayerSource.h"
Andreas Huberf9334412010-12-15 15:17:42 -080025
Andreas Huber1aef2112011-01-04 14:01:29 -080026#include <media/stagefright/foundation/ADebug.h>
Andreas Huberf9334412010-12-15 15:17:42 -080027#include <media/stagefright/foundation/ALooper.h>
Andreas Huber9575c962013-02-05 13:59:56 -080028#include <media/stagefright/MetaData.h>
Andreas Huberf9334412010-12-15 15:17:42 -080029
30namespace android {
31
32NuPlayerDriver::NuPlayerDriver()
Andreas Huber9575c962013-02-05 13:59:56 -080033 : mState(STATE_IDLE),
Andreas Huberec0c5972013-02-05 14:47:13 -080034 mIsAsyncPrepare(false),
Andreas Huber9575c962013-02-05 13:59:56 -080035 mAsyncResult(UNKNOWN_ERROR),
Andreas Huber57a339c2012-12-03 11:18:00 -080036 mSetSurfaceInProgress(false),
Andreas Huber43c3e6c2011-01-05 12:17:08 -080037 mDurationUs(-1),
38 mPositionUs(-1),
Andreas Huber3fe62152011-09-16 15:09:22 -070039 mNumFramesTotal(0),
40 mNumFramesDropped(0),
Andreas Huber1aef2112011-01-04 14:01:29 -080041 mLooper(new ALooper),
Andreas Huber9575c962013-02-05 13:59:56 -080042 mPlayerFlags(0),
Andreas Hubera4af2142011-10-26 15:23:31 -070043 mAtEOS(false),
Andreas Huber43c3e6c2011-01-05 12:17:08 -080044 mStartupSeekTimeUs(-1) {
Andreas Huberf9334412010-12-15 15:17:42 -080045 mLooper->setName("NuPlayerDriver Looper");
46
47 mLooper->start(
48 false, /* runOnCallingThread */
49 true, /* canCallJava */
50 PRIORITY_AUDIO);
51
52 mPlayer = new NuPlayer;
53 mLooper->registerHandler(mPlayer);
54
Andreas Huber43c3e6c2011-01-05 12:17:08 -080055 mPlayer->setDriver(this);
Andreas Huberf9334412010-12-15 15:17:42 -080056}
57
58NuPlayerDriver::~NuPlayerDriver() {
59 mLooper->stop();
60}
61
62status_t NuPlayerDriver::initCheck() {
63 return OK;
64}
65
Andreas Huber9b80c2b2011-06-30 15:47:02 -070066status_t NuPlayerDriver::setUID(uid_t uid) {
67 mPlayer->setUID(uid);
68
69 return OK;
70}
71
Andreas Huberf9334412010-12-15 15:17:42 -080072status_t NuPlayerDriver::setDataSource(
Andreas Huber1b86fe02014-01-29 11:13:26 -080073 const sp<IMediaHTTPService> &httpService,
74 const char *url,
75 const KeyedVector<String8, String8> *headers) {
Andreas Huber9575c962013-02-05 13:59:56 -080076 Mutex::Autolock autoLock(mLock);
Andreas Huber43c3e6c2011-01-05 12:17:08 -080077
Andreas Huber9575c962013-02-05 13:59:56 -080078 if (mState != STATE_IDLE) {
79 return INVALID_OPERATION;
80 }
Andreas Huber5bc087c2010-12-23 10:27:40 -080081
Andreas Huber9575c962013-02-05 13:59:56 -080082 mState = STATE_SET_DATASOURCE_PENDING;
Andreas Huber43c3e6c2011-01-05 12:17:08 -080083
Andreas Huber1b86fe02014-01-29 11:13:26 -080084 mPlayer->setDataSourceAsync(httpService, url, headers);
Andreas Huber9575c962013-02-05 13:59:56 -080085
86 while (mState == STATE_SET_DATASOURCE_PENDING) {
87 mCondition.wait(mLock);
88 }
89
90 return mAsyncResult;
Andreas Huberf9334412010-12-15 15:17:42 -080091}
92
93status_t NuPlayerDriver::setDataSource(int fd, int64_t offset, int64_t length) {
Andreas Huber9575c962013-02-05 13:59:56 -080094 Mutex::Autolock autoLock(mLock);
Andreas Huberafed0e12011-09-20 15:39:58 -070095
Andreas Huber9575c962013-02-05 13:59:56 -080096 if (mState != STATE_IDLE) {
97 return INVALID_OPERATION;
98 }
Andreas Huberafed0e12011-09-20 15:39:58 -070099
Andreas Huber9575c962013-02-05 13:59:56 -0800100 mState = STATE_SET_DATASOURCE_PENDING;
Andreas Huberafed0e12011-09-20 15:39:58 -0700101
Andreas Huber9575c962013-02-05 13:59:56 -0800102 mPlayer->setDataSourceAsync(fd, offset, length);
103
104 while (mState == STATE_SET_DATASOURCE_PENDING) {
105 mCondition.wait(mLock);
106 }
107
108 return mAsyncResult;
Andreas Huberf9334412010-12-15 15:17:42 -0800109}
110
111status_t NuPlayerDriver::setDataSource(const sp<IStreamSource> &source) {
Andreas Huber9575c962013-02-05 13:59:56 -0800112 Mutex::Autolock autoLock(mLock);
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800113
Andreas Huber9575c962013-02-05 13:59:56 -0800114 if (mState != STATE_IDLE) {
115 return INVALID_OPERATION;
116 }
Andreas Huberf9334412010-12-15 15:17:42 -0800117
Andreas Huber9575c962013-02-05 13:59:56 -0800118 mState = STATE_SET_DATASOURCE_PENDING;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800119
Andreas Huber9575c962013-02-05 13:59:56 -0800120 mPlayer->setDataSourceAsync(source);
121
122 while (mState == STATE_SET_DATASOURCE_PENDING) {
123 mCondition.wait(mLock);
124 }
125
126 return mAsyncResult;
Andreas Huberf9334412010-12-15 15:17:42 -0800127}
128
Glenn Kasten11731182011-02-08 17:26:17 -0800129status_t NuPlayerDriver::setVideoSurfaceTexture(
Andy McFadden8ba01022012-12-18 09:46:54 -0800130 const sp<IGraphicBufferProducer> &bufferProducer) {
Andreas Huber57a339c2012-12-03 11:18:00 -0800131 Mutex::Autolock autoLock(mLock);
132
Andreas Huber9575c962013-02-05 13:59:56 -0800133 if (mSetSurfaceInProgress) {
Andreas Huber57a339c2012-12-03 11:18:00 -0800134 return INVALID_OPERATION;
135 }
136
Andreas Huber9575c962013-02-05 13:59:56 -0800137 switch (mState) {
138 case STATE_SET_DATASOURCE_PENDING:
139 case STATE_RESET_IN_PROGRESS:
140 return INVALID_OPERATION;
141
142 default:
143 break;
144 }
145
Andreas Huber57a339c2012-12-03 11:18:00 -0800146 mSetSurfaceInProgress = true;
147
Andy McFadden8ba01022012-12-18 09:46:54 -0800148 mPlayer->setVideoSurfaceTextureAsync(bufferProducer);
Andreas Huber57a339c2012-12-03 11:18:00 -0800149
150 while (mSetSurfaceInProgress) {
151 mCondition.wait(mLock);
152 }
Glenn Kasten11731182011-02-08 17:26:17 -0800153
154 return OK;
155}
156
Andreas Huberf9334412010-12-15 15:17:42 -0800157status_t NuPlayerDriver::prepare() {
Andreas Huber9575c962013-02-05 13:59:56 -0800158 Mutex::Autolock autoLock(mLock);
159 return prepare_l();
160}
161
162status_t NuPlayerDriver::prepare_l() {
163 switch (mState) {
164 case STATE_UNPREPARED:
165 mState = STATE_PREPARING;
Andreas Huberec0c5972013-02-05 14:47:13 -0800166
167 // Make sure we're not posting any notifications, success or
168 // failure information is only communicated through our result
169 // code.
170 mIsAsyncPrepare = false;
Andreas Huber9575c962013-02-05 13:59:56 -0800171 mPlayer->prepareAsync();
172 while (mState == STATE_PREPARING) {
173 mCondition.wait(mLock);
174 }
175 return (mState == STATE_PREPARED) ? OK : UNKNOWN_ERROR;
176 default:
177 return INVALID_OPERATION;
178 };
Andreas Huberf9334412010-12-15 15:17:42 -0800179}
180
181status_t NuPlayerDriver::prepareAsync() {
Andreas Huber9575c962013-02-05 13:59:56 -0800182 Mutex::Autolock autoLock(mLock);
Andreas Huberafed0e12011-09-20 15:39:58 -0700183
Andreas Huber9575c962013-02-05 13:59:56 -0800184 switch (mState) {
185 case STATE_UNPREPARED:
186 mState = STATE_PREPARING;
Andreas Huberec0c5972013-02-05 14:47:13 -0800187 mIsAsyncPrepare = true;
Andreas Huber9575c962013-02-05 13:59:56 -0800188 mPlayer->prepareAsync();
189 return OK;
190 default:
191 return INVALID_OPERATION;
192 };
Andreas Huberf9334412010-12-15 15:17:42 -0800193}
194
195status_t NuPlayerDriver::start() {
Andreas Huber9575c962013-02-05 13:59:56 -0800196 Mutex::Autolock autoLock(mLock);
197
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800198 switch (mState) {
Andreas Huber9575c962013-02-05 13:59:56 -0800199 case STATE_UNPREPARED:
200 {
201 status_t err = prepare_l();
202
203 if (err != OK) {
204 return err;
205 }
206
207 CHECK_EQ(mState, STATE_PREPARED);
208
209 // fall through
210 }
211
212 case STATE_PREPARED:
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800213 {
Andreas Hubera4af2142011-10-26 15:23:31 -0700214 mAtEOS = false;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800215 mPlayer->start();
216
217 if (mStartupSeekTimeUs >= 0) {
Andreas Huber2048d0c2011-07-15 16:25:41 -0700218 if (mStartupSeekTimeUs == 0) {
219 notifySeekComplete();
220 } else {
221 mPlayer->seekToAsync(mStartupSeekTimeUs);
222 }
223
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800224 mStartupSeekTimeUs = -1;
225 }
226 break;
227 }
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800228
Andreas Huber9575c962013-02-05 13:59:56 -0800229 case STATE_RUNNING:
230 break;
231
232 case STATE_PAUSED:
233 {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800234 mPlayer->resume();
235 break;
236 }
Andreas Huber9575c962013-02-05 13:59:56 -0800237
238 default:
239 return INVALID_OPERATION;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800240 }
241
Andreas Huber9575c962013-02-05 13:59:56 -0800242 mState = STATE_RUNNING;
Andreas Huberf9334412010-12-15 15:17:42 -0800243
244 return OK;
245}
246
247status_t NuPlayerDriver::stop() {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800248 return pause();
Andreas Huberf9334412010-12-15 15:17:42 -0800249}
250
251status_t NuPlayerDriver::pause() {
Andreas Huber9575c962013-02-05 13:59:56 -0800252 Mutex::Autolock autoLock(mLock);
253
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800254 switch (mState) {
Andreas Huber9575c962013-02-05 13:59:56 -0800255 case STATE_PAUSED:
256 case STATE_PREPARED:
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800257 return OK;
Andreas Huber9575c962013-02-05 13:59:56 -0800258
259 case STATE_RUNNING:
Lajos Molnarcbaffcf2013-08-14 18:30:38 -0700260 notifyListener(MEDIA_PAUSED);
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800261 mPlayer->pause();
262 break;
Andreas Huber9575c962013-02-05 13:59:56 -0800263
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800264 default:
Andreas Huber9575c962013-02-05 13:59:56 -0800265 return INVALID_OPERATION;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800266 }
267
Andreas Huber9575c962013-02-05 13:59:56 -0800268 mState = STATE_PAUSED;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800269
Andreas Huberf9334412010-12-15 15:17:42 -0800270 return OK;
271}
272
273bool NuPlayerDriver::isPlaying() {
Andreas Huber9575c962013-02-05 13:59:56 -0800274 return mState == STATE_RUNNING && !mAtEOS;
Andreas Huberf9334412010-12-15 15:17:42 -0800275}
276
277status_t NuPlayerDriver::seekTo(int msec) {
Andreas Huber9575c962013-02-05 13:59:56 -0800278 Mutex::Autolock autoLock(mLock);
279
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800280 int64_t seekTimeUs = msec * 1000ll;
281
282 switch (mState) {
Andreas Huber9575c962013-02-05 13:59:56 -0800283 case STATE_PREPARED:
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800284 {
285 mStartupSeekTimeUs = seekTimeUs;
286 break;
287 }
Andreas Huber9575c962013-02-05 13:59:56 -0800288
289 case STATE_RUNNING:
290 case STATE_PAUSED:
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800291 {
Andreas Hubera4af2142011-10-26 15:23:31 -0700292 mAtEOS = false;
Lajos Molnarcbaffcf2013-08-14 18:30:38 -0700293 // seeks can take a while, so we essentially paused
294 notifyListener(MEDIA_PAUSED);
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800295 mPlayer->seekToAsync(seekTimeUs);
296 break;
297 }
298
299 default:
Andreas Huber9575c962013-02-05 13:59:56 -0800300 return INVALID_OPERATION;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800301 }
302
303 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800304}
305
306status_t NuPlayerDriver::getCurrentPosition(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800307 Mutex::Autolock autoLock(mLock);
308
309 if (mPositionUs < 0) {
310 *msec = 0;
311 } else {
312 *msec = (mPositionUs + 500ll) / 1000;
313 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800314
315 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800316}
317
318status_t NuPlayerDriver::getDuration(int *msec) {
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800319 Mutex::Autolock autoLock(mLock);
320
321 if (mDurationUs < 0) {
Andreas Huberd85929f2013-04-11 11:07:55 -0700322 return UNKNOWN_ERROR;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800323 }
Andreas Huber5bc087c2010-12-23 10:27:40 -0800324
Andreas Huberd85929f2013-04-11 11:07:55 -0700325 *msec = (mDurationUs + 500ll) / 1000;
326
Andreas Huber5bc087c2010-12-23 10:27:40 -0800327 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800328}
329
330status_t NuPlayerDriver::reset() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800331 Mutex::Autolock autoLock(mLock);
Andreas Huber1aef2112011-01-04 14:01:29 -0800332
Andreas Huber9575c962013-02-05 13:59:56 -0800333 switch (mState) {
334 case STATE_IDLE:
335 return OK;
336
337 case STATE_SET_DATASOURCE_PENDING:
338 case STATE_RESET_IN_PROGRESS:
339 return INVALID_OPERATION;
340
Andreas Huberb5f28d42013-04-25 15:11:19 -0700341 case STATE_PREPARING:
342 {
343 CHECK(mIsAsyncPrepare);
344
345 notifyListener(MEDIA_PREPARED);
346 break;
347 }
348
Andreas Huber9575c962013-02-05 13:59:56 -0800349 default:
350 break;
351 }
352
Lajos Molnarcbaffcf2013-08-14 18:30:38 -0700353 notifyListener(MEDIA_STOPPED);
354
Andreas Huber9575c962013-02-05 13:59:56 -0800355 mState = STATE_RESET_IN_PROGRESS;
Andreas Huber1aef2112011-01-04 14:01:29 -0800356 mPlayer->resetAsync();
357
Andreas Huber9575c962013-02-05 13:59:56 -0800358 while (mState == STATE_RESET_IN_PROGRESS) {
Andreas Huber1aef2112011-01-04 14:01:29 -0800359 mCondition.wait(mLock);
360 }
361
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800362 mDurationUs = -1;
363 mPositionUs = -1;
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800364 mStartupSeekTimeUs = -1;
365
Andreas Huberf9334412010-12-15 15:17:42 -0800366 return OK;
367}
368
369status_t NuPlayerDriver::setLooping(int loop) {
370 return INVALID_OPERATION;
371}
372
373player_type NuPlayerDriver::playerType() {
374 return NU_PLAYER;
375}
376
377status_t NuPlayerDriver::invoke(const Parcel &request, Parcel *reply) {
James Dong0d268a32012-08-31 12:18:27 -0700378 if (reply == NULL) {
379 ALOGE("reply is a NULL pointer");
380 return BAD_VALUE;
381 }
382
383 int32_t methodId;
384 status_t ret = request.readInt32(&methodId);
385 if (ret != OK) {
386 ALOGE("Failed to retrieve the requested method to invoke");
387 return ret;
388 }
389
390 switch (methodId) {
391 case INVOKE_ID_SET_VIDEO_SCALING_MODE:
392 {
393 int mode = request.readInt32();
394 return mPlayer->setVideoScalingMode(mode);
395 }
Andreas Huberd5e56232013-03-12 11:01:43 -0700396
Chong Zhangdcb89b32013-08-06 09:44:47 -0700397 case INVOKE_ID_GET_TRACK_INFO:
398 {
399 return mPlayer->getTrackInfo(reply);
400 }
401
402 case INVOKE_ID_SELECT_TRACK:
403 {
404 int trackIndex = request.readInt32();
405 return mPlayer->selectTrack(trackIndex, true /* select */);
406 }
407
408 case INVOKE_ID_UNSELECT_TRACK:
409 {
410 int trackIndex = request.readInt32();
411 return mPlayer->selectTrack(trackIndex, false /* select */);
412 }
413
James Dong0d268a32012-08-31 12:18:27 -0700414 default:
415 {
416 return INVALID_OPERATION;
417 }
418 }
Andreas Huberf9334412010-12-15 15:17:42 -0800419}
420
421void NuPlayerDriver::setAudioSink(const sp<AudioSink> &audioSink) {
422 mPlayer->setAudioSink(audioSink);
423}
424
Gloria Wang4f9e47f2011-04-25 17:28:22 -0700425status_t NuPlayerDriver::setParameter(int key, const Parcel &request) {
426 return INVALID_OPERATION;
427}
428
429status_t NuPlayerDriver::getParameter(int key, Parcel *reply) {
430 return INVALID_OPERATION;
431}
432
Andreas Huberf9334412010-12-15 15:17:42 -0800433status_t NuPlayerDriver::getMetadata(
434 const media::Metadata::Filter& ids, Parcel *records) {
Andreas Huber9575c962013-02-05 13:59:56 -0800435 Mutex::Autolock autoLock(mLock);
436
437 using media::Metadata;
438
439 Metadata meta(records);
440
441 meta.appendBool(
442 Metadata::kPauseAvailable,
443 mPlayerFlags & NuPlayer::Source::FLAG_CAN_PAUSE);
444
445 meta.appendBool(
446 Metadata::kSeekBackwardAvailable,
447 mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_BACKWARD);
448
449 meta.appendBool(
450 Metadata::kSeekForwardAvailable,
451 mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK_FORWARD);
452
453 meta.appendBool(
454 Metadata::kSeekAvailable,
455 mPlayerFlags & NuPlayer::Source::FLAG_CAN_SEEK);
456
457 return OK;
Andreas Huberf9334412010-12-15 15:17:42 -0800458}
459
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800460void NuPlayerDriver::notifyResetComplete() {
Andreas Huber1aef2112011-01-04 14:01:29 -0800461 Mutex::Autolock autoLock(mLock);
Andreas Huber9575c962013-02-05 13:59:56 -0800462
463 CHECK_EQ(mState, STATE_RESET_IN_PROGRESS);
464 mState = STATE_IDLE;
Andreas Huber1aef2112011-01-04 14:01:29 -0800465 mCondition.broadcast();
466}
467
Andreas Huber57a339c2012-12-03 11:18:00 -0800468void NuPlayerDriver::notifySetSurfaceComplete() {
469 Mutex::Autolock autoLock(mLock);
Andreas Huber9575c962013-02-05 13:59:56 -0800470
Andreas Huber57a339c2012-12-03 11:18:00 -0800471 CHECK(mSetSurfaceInProgress);
472 mSetSurfaceInProgress = false;
Andreas Huber9575c962013-02-05 13:59:56 -0800473
Andreas Huber57a339c2012-12-03 11:18:00 -0800474 mCondition.broadcast();
475}
476
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800477void NuPlayerDriver::notifyDuration(int64_t durationUs) {
478 Mutex::Autolock autoLock(mLock);
479 mDurationUs = durationUs;
480}
481
482void NuPlayerDriver::notifyPosition(int64_t positionUs) {
483 Mutex::Autolock autoLock(mLock);
484 mPositionUs = positionUs;
485}
486
487void NuPlayerDriver::notifySeekComplete() {
Andreas Hubera4af2142011-10-26 15:23:31 -0700488 notifyListener(MEDIA_SEEK_COMPLETE);
Andreas Huber43c3e6c2011-01-05 12:17:08 -0800489}
490
Andreas Huber3fe62152011-09-16 15:09:22 -0700491void NuPlayerDriver::notifyFrameStats(
492 int64_t numFramesTotal, int64_t numFramesDropped) {
493 Mutex::Autolock autoLock(mLock);
494 mNumFramesTotal = numFramesTotal;
495 mNumFramesDropped = numFramesDropped;
496}
497
498status_t NuPlayerDriver::dump(int fd, const Vector<String16> &args) const {
499 Mutex::Autolock autoLock(mLock);
500
501 FILE *out = fdopen(dup(fd), "w");
502
503 fprintf(out, " NuPlayer\n");
504 fprintf(out, " numFramesTotal(%lld), numFramesDropped(%lld), "
505 "percentageDropped(%.2f)\n",
506 mNumFramesTotal,
507 mNumFramesDropped,
508 mNumFramesTotal == 0
509 ? 0.0 : (double)mNumFramesDropped / mNumFramesTotal);
510
511 fclose(out);
512 out = NULL;
513
514 return OK;
515}
516
Chong Zhangdcb89b32013-08-06 09:44:47 -0700517void NuPlayerDriver::notifyListener(
518 int msg, int ext1, int ext2, const Parcel *in) {
Andreas Hubera4af2142011-10-26 15:23:31 -0700519 if (msg == MEDIA_PLAYBACK_COMPLETE || msg == MEDIA_ERROR) {
520 mAtEOS = true;
521 }
522
Chong Zhangdcb89b32013-08-06 09:44:47 -0700523 sendEvent(msg, ext1, ext2, in);
Andreas Hubera4af2142011-10-26 15:23:31 -0700524}
525
Andreas Huber9575c962013-02-05 13:59:56 -0800526void NuPlayerDriver::notifySetDataSourceCompleted(status_t err) {
527 Mutex::Autolock autoLock(mLock);
528
529 CHECK_EQ(mState, STATE_SET_DATASOURCE_PENDING);
530
531 mAsyncResult = err;
532 mState = (err == OK) ? STATE_UNPREPARED : STATE_IDLE;
533 mCondition.broadcast();
534}
535
536void NuPlayerDriver::notifyPrepareCompleted(status_t err) {
537 Mutex::Autolock autoLock(mLock);
538
Andreas Huberb5f28d42013-04-25 15:11:19 -0700539 if (mState != STATE_PREPARING) {
540 // We were preparing asynchronously when the client called
541 // reset(), we sent a premature "prepared" notification and
542 // then initiated the reset. This notification is stale.
543 CHECK(mState == STATE_RESET_IN_PROGRESS || mState == STATE_IDLE);
544 return;
545 }
546
Andreas Huber9575c962013-02-05 13:59:56 -0800547 CHECK_EQ(mState, STATE_PREPARING);
548
549 mAsyncResult = err;
550
551 if (err == OK) {
Andreas Huberec0c5972013-02-05 14:47:13 -0800552 if (mIsAsyncPrepare) {
553 notifyListener(MEDIA_PREPARED);
554 }
Andreas Huber9575c962013-02-05 13:59:56 -0800555 mState = STATE_PREPARED;
556 } else {
Andreas Huberec0c5972013-02-05 14:47:13 -0800557 if (mIsAsyncPrepare) {
558 notifyListener(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err);
559 }
Andreas Huber9575c962013-02-05 13:59:56 -0800560 mState = STATE_UNPREPARED;
561 }
562
563 mCondition.broadcast();
564}
565
566void NuPlayerDriver::notifyFlagsChanged(uint32_t flags) {
567 Mutex::Autolock autoLock(mLock);
568
569 mPlayerFlags = flags;
570}
571
Andreas Huberf9334412010-12-15 15:17:42 -0800572} // namespace android