summaryrefslogtreecommitdiffstats
path: root/media/libmediaplayerservice/StagefrightPlayer.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2009-11-20 09:32:46 -0800
committerAndreas Huber <andih@google.com>2009-11-23 10:44:30 -0800
commitbfa6b2d7a1be1832ac40ed90aece1834f720b5c6 (patch)
tree5b4948c52fde583d593d088ffc4a7f772c904a86 /media/libmediaplayerservice/StagefrightPlayer.cpp
parentbf89c099fc97717e3008a481aeddc76c1ac5e00d (diff)
downloadframeworks_av-bfa6b2d7a1be1832ac40ed90aece1834f720b5c6.zip
frameworks_av-bfa6b2d7a1be1832ac40ed90aece1834f720b5c6.tar.gz
frameworks_av-bfa6b2d7a1be1832ac40ed90aece1834f720b5c6.tar.bz2
Squashed commit of the following:
commit 1efc38dc3c33fef57b759002db3965ed07a28cb0 Author: Andreas Huber <andih@google.com> Date: Thu Nov 19 14:36:14 2009 -0800 Sending the SEEK-COMPLETE notification temporarily broke seeking backwards in time behaviour. This is now fixed. Also, get rid of the semi-random delay after posting buffers to surface flinger in favour of delaying the buffer release until the next frame is displayed. commit 51973062eb5ee63fd64b845d72bac517cc3369cf Author: Andreas Huber <andih@google.com> Date: Wed Nov 18 14:01:43 2009 -0800 Fix one more unit test, properly send seek-complete notification only after seek actually completed. commit cb22250b34b1fcfe1bf459723a761fd003950229 Author: Andreas Huber <andih@google.com> Date: Wed Nov 18 12:31:36 2009 -0800 Fix seek-while-paused in AwesomePlayer, revert to using FileSource if MmapSource fails. commit 25eb9241138ddf7bb27ce90657116c5f8a94d880 Author: Andreas Huber <andih@google.com> Date: Wed Nov 18 12:30:40 2009 -0800 Support seeking and duration in AMRExtractor, assuming all frames are the same size. commit 44192f2ebb7ea3bbd3ba5910025692dbc6a08faa Author: Andreas Huber <andih@google.com> Date: Wed Nov 18 10:21:44 2009 -0800 MediaPlayerImpl is dead, long live AwesomePlayer. commit c5b52d3c0674f5dc94db506afbce52401cceddac Author: Andreas Huber <andih@google.com> Date: Wed Nov 18 09:42:23 2009 -0800 New implementation of the stagefright mediaplayer.
Diffstat (limited to 'media/libmediaplayerservice/StagefrightPlayer.cpp')
-rw-r--r--media/libmediaplayerservice/StagefrightPlayer.cpp115
1 files changed, 36 insertions, 79 deletions
diff --git a/media/libmediaplayerservice/StagefrightPlayer.cpp b/media/libmediaplayerservice/StagefrightPlayer.cpp
index dbee451..5915105 100644
--- a/media/libmediaplayerservice/StagefrightPlayer.cpp
+++ b/media/libmediaplayerservice/StagefrightPlayer.cpp
@@ -3,19 +3,24 @@
#include <utils/Log.h>
#include "StagefrightPlayer.h"
-#include <media/stagefright/MediaPlayerImpl.h>
+
+#include "AwesomePlayer.h"
namespace android {
StagefrightPlayer::StagefrightPlayer()
- : mPlayer(NULL) {
+ : mPlayer(new AwesomePlayer) {
LOGV("StagefrightPlayer");
+
+ mPlayer->setListener(this);
}
StagefrightPlayer::~StagefrightPlayer() {
LOGV("~StagefrightPlayer");
reset();
- LOGV("~StagefrightPlayer done.");
+
+ delete mPlayer;
+ mPlayer = NULL;
}
status_t StagefrightPlayer::initCheck() {
@@ -25,62 +30,32 @@ status_t StagefrightPlayer::initCheck() {
status_t StagefrightPlayer::setDataSource(const char *url) {
LOGV("setDataSource('%s')", url);
-
- reset();
- mPlayer = new MediaPlayerImpl(url);
-
- status_t err = mPlayer->initCheck();
- if (err != OK) {
- delete mPlayer;
- mPlayer = NULL;
- } else {
- mPlayer->setAudioSink(mAudioSink);
- }
-
- return err;
+ return mPlayer->setDataSource(url);
}
// Warning: The filedescriptor passed into this method will only be valid until
// the method returns, if you want to keep it, dup it!
status_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
-
- reset();
- mPlayer = new MediaPlayerImpl(dup(fd), offset, length);
-
- status_t err = mPlayer->initCheck();
- if (err != OK) {
- delete mPlayer;
- mPlayer = NULL;
- } else {
- mPlayer->setAudioSink(mAudioSink);
- }
-
- return err;
+ return mPlayer->setDataSource(dup(fd), offset, length);
}
status_t StagefrightPlayer::setVideoSurface(const sp<ISurface> &surface) {
LOGV("setVideoSurface");
- if (mPlayer == NULL) {
- return NO_INIT;
- }
-
mPlayer->setISurface(surface);
-
return OK;
}
status_t StagefrightPlayer::prepare() {
LOGV("prepare");
- if (mPlayer == NULL) {
- return NO_INIT;
+ int32_t width, height;
+ if (mPlayer->getVideoDimensions(&width, &height) != OK) {
+ width = height = 0;
}
- sendEvent(
- MEDIA_SET_VIDEO_SIZE,
- mPlayer->getWidth(), mPlayer->getHeight());
+ sendEvent(MEDIA_SET_VIDEO_SIZE, width, height);
return OK;
}
@@ -102,92 +77,76 @@ status_t StagefrightPlayer::prepareAsync() {
status_t StagefrightPlayer::start() {
LOGV("start");
- if (mPlayer == NULL) {
- return NO_INIT;
- }
-
- mPlayer->play();
-
- return OK;
+ return mPlayer->play();
}
status_t StagefrightPlayer::stop() {
LOGV("stop");
- if (mPlayer == NULL) {
- return NO_INIT;
- }
-
- reset();
-
- return OK;
+ return pause(); // what's the difference?
}
status_t StagefrightPlayer::pause() {
LOGV("pause");
- if (mPlayer == NULL) {
- return NO_INIT;
- }
-
- mPlayer->pause();
-
- return OK;
+ return mPlayer->pause();
}
bool StagefrightPlayer::isPlaying() {
LOGV("isPlaying");
- return mPlayer != NULL && mPlayer->isPlaying();
+ return mPlayer->isPlaying();
}
status_t StagefrightPlayer::seekTo(int msec) {
LOGV("seekTo");
- if (mPlayer == NULL) {
- return NO_INIT;
- }
-
status_t err = mPlayer->seekTo((int64_t)msec * 1000);
- sendEvent(MEDIA_SEEK_COMPLETE);
-
return err;
}
status_t StagefrightPlayer::getCurrentPosition(int *msec) {
LOGV("getCurrentPosition");
- if (mPlayer == NULL) {
- return NO_INIT;
+ int64_t positionUs;
+ status_t err = mPlayer->getPosition(&positionUs);
+
+ if (err != OK) {
+ return err;
}
- *msec = mPlayer->getPosition() / 1000;
+ *msec = (positionUs + 500) / 1000;
+
return OK;
}
status_t StagefrightPlayer::getDuration(int *msec) {
LOGV("getDuration");
- if (mPlayer == NULL) {
- return NO_INIT;
+ int64_t durationUs;
+ status_t err = mPlayer->getDuration(&durationUs);
+
+ if (err != OK) {
+ return err;
}
- *msec = mPlayer->getDuration() / 1000;
+ *msec = (durationUs + 500) / 1000;
+
return OK;
}
status_t StagefrightPlayer::reset() {
LOGV("reset");
- delete mPlayer;
- mPlayer = NULL;
+ mPlayer->reset();
return OK;
}
status_t StagefrightPlayer::setLooping(int loop) {
LOGV("setLooping");
- return UNKNOWN_ERROR;
+
+ return mPlayer->setLooping(loop);
}
player_type StagefrightPlayer::playerType() {
@@ -202,9 +161,7 @@ status_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
void StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
MediaPlayerInterface::setAudioSink(audioSink);
- if (mPlayer != NULL) {
- mPlayer->setAudioSink(audioSink);
- }
+ mPlayer->setAudioSink(audioSink);
}
} // namespace android