summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-02-18 16:45:13 -0800
committerAndreas Huber <andih@google.com>2010-02-18 16:45:13 -0800
commit406a18b5b3d53466a3e03b66413ff3a50243a6a8 (patch)
treee9585ff0cf444ac6f4e433992cc4f60bf35f7c1c /media
parent5706329cf42db714582fa698eb9f408350276f16 (diff)
downloadframeworks_base-406a18b5b3d53466a3e03b66413ff3a50243a6a8.zip
frameworks_base-406a18b5b3d53466a3e03b66413ff3a50243a6a8.tar.gz
frameworks_base-406a18b5b3d53466a3e03b66413ff3a50243a6a8.tar.bz2
Implement legacy behaviour for MediaPlayer's behaviour of starting from the start of the media on a start() call instead of resuming at the current position, if previously reached the end of the stream. Also properly report number of frames played to audio flinger. Finally, delay spawing the queue thread until actually used.
related-to-bug: 2453220
Diffstat (limited to 'media')
-rw-r--r--media/libmediaplayerservice/MediaPlayerService.cpp2
-rw-r--r--media/libstagefright/AwesomePlayer.cpp27
-rw-r--r--media/libstagefright/include/AwesomePlayer.h2
3 files changed, 25 insertions, 6 deletions
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index b4fc035..50dad33 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -1614,6 +1614,8 @@ void MediaPlayerService::AudioOutput::CallbackWrapper(
size_t actualSize = (*me->mCallback)(
me, buffer->raw, buffer->size, me->mCallbackCookie);
+ buffer->size = actualSize;
+
if (actualSize > 0) {
me->snoopWrite(buffer->raw, actualSize);
}
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp
index 59a5f9d..b3a73b0 100644
--- a/media/libstagefright/AwesomePlayer.cpp
+++ b/media/libstagefright/AwesomePlayer.cpp
@@ -178,7 +178,8 @@ void AwesomeLocalRenderer::init(
}
AwesomePlayer::AwesomePlayer()
- : mTimeSource(NULL),
+ : mQueueStarted(false),
+ mTimeSource(NULL),
mVideoRendererIsPreview(false),
mAudioPlayer(NULL),
mFlags(0),
@@ -201,13 +202,13 @@ AwesomePlayer::AwesomePlayer()
mAudioStatusEventPending = false;
- mQueue.start();
-
reset();
}
AwesomePlayer::~AwesomePlayer() {
- mQueue.stop();
+ if (mQueueStarted) {
+ mQueue.stop();
+ }
reset();
@@ -443,6 +444,8 @@ void AwesomePlayer::onStreamDone() {
notifyListener_l(MEDIA_PLAYBACK_COMPLETE);
pause_l();
+
+ mFlags |= AT_EOS;
}
}
@@ -517,6 +520,12 @@ status_t AwesomePlayer::play_l() {
postBufferingEvent_l();
+ if (mFlags & AT_EOS) {
+ // Legacy behaviour, if a stream finishes playing and then
+ // is started again, we play from the start...
+ seekTo_l(0);
+ }
+
return OK;
}
@@ -651,6 +660,7 @@ status_t AwesomePlayer::seekTo(int64_t timeUs) {
status_t AwesomePlayer::seekTo_l(int64_t timeUs) {
mSeeking = true;
mSeekTimeUs = timeUs;
+ mFlags &= ~AT_EOS;
seekAudioIfNecessary_l();
@@ -989,6 +999,11 @@ status_t AwesomePlayer::prepareAsync_l() {
return UNKNOWN_ERROR; // async prepare already pending
}
+ if (!mQueueStarted) {
+ mQueue.start();
+ mQueueStarted = true;
+ }
+
mFlags |= PREPARING;
mAsyncPrepareEvent = new AwesomeEvent(
this, &AwesomePlayer::onPrepareAsyncEvent);
@@ -1089,7 +1104,7 @@ status_t AwesomePlayer::suspend() {
state->mUriHeaders = mUriHeaders;
state->mFileSource = mFileSource;
- state->mFlags = mFlags & (PLAYING | LOOPING);
+ state->mFlags = mFlags & (PLAYING | LOOPING | AT_EOS);
getPosition_l(&state->mPositionUs);
if (mLastVideoBuffer) {
@@ -1150,7 +1165,7 @@ status_t AwesomePlayer::resume() {
seekTo_l(state->mPositionUs);
- mFlags = state->mFlags & LOOPING;
+ mFlags = state->mFlags & (LOOPING | AT_EOS);
if (state->mLastVideoFrame && mISurface != NULL) {
mVideoRenderer =
diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h
index 114d4c6..ce8eeae 100644
--- a/media/libstagefright/include/AwesomePlayer.h
+++ b/media/libstagefright/include/AwesomePlayer.h
@@ -92,12 +92,14 @@ private:
FIRST_FRAME = 4,
PREPARING = 8,
PREPARED = 16,
+ AT_EOS = 32,
};
mutable Mutex mLock;
OMXClient mClient;
TimedEventQueue mQueue;
+ bool mQueueStarted;
wp<MediaPlayerBase> mListener;
sp<ISurface> mISurface;