StagefrightPlayer.cpp revision bfa6b2d7a1be1832ac40ed90aece1834f720b5c6
120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//#define LOG_NDEBUG 0
220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "StagefrightPlayer"
320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h>
420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include "StagefrightPlayer.h"
6bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
7bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "AwesomePlayer.h"
820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
920111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
1020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1120111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberStagefrightPlayer::StagefrightPlayer()
12bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    : mPlayer(new AwesomePlayer) {
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("StagefrightPlayer");
14bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
15bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer->setListener(this);
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1820111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberStagefrightPlayer::~StagefrightPlayer() {
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("~StagefrightPlayer");
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    reset();
21bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    delete mPlayer;
23bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer = NULL;
2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
2520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::initCheck() {
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("initCheck");
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setDataSource(const char *url) {
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("setDataSource('%s')", url);
33bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->setDataSource(url);
3420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
36a75e9fb4876139fff4bb836fb0ebd5f80c8b20b3Andreas Huber// Warning: The filedescriptor passed into this method will only be valid until
37a75e9fb4876139fff4bb836fb0ebd5f80c8b20b3Andreas Huber// the method returns, if you want to keep it, dup it!
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->setDataSource(dup(fd), offset, length);
4120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setVideoSurface(const sp<ISurface> &surface) {
4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("setVideoSurface");
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mPlayer->setISurface(surface);
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::prepare() {
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("prepare");
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
53bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int32_t width, height;
54bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (mPlayer->getVideoDimensions(&width, &height) != OK) {
55bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        width = height = 0;
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
58bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    sendEvent(MEDIA_SET_VIDEO_SIZE, width, height);
5920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::prepareAsync() {
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("prepareAsync");
6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    status_t err = prepare();
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    if (err != OK) {
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber        return err;
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
7120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    sendEvent(MEDIA_PREPARED);
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::start() {
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("start");
7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
80bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->play();
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
8220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::stop() {
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("stop");
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
86bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return pause();  // what's the difference?
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::pause() {
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("pause");
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
92bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->pause();
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool StagefrightPlayer::isPlaying() {
9620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("isPlaying");
97bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->isPlaying();
9820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::seekTo(int msec) {
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("seekTo");
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    status_t err = mPlayer->seekTo((int64_t)msec * 1000);
10420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return err;
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::getCurrentPosition(int *msec) {
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("getCurrentPosition");
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
111bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t positionUs;
112bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    status_t err = mPlayer->getPosition(&positionUs);
113bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
114bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
115bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return err;
11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
118bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *msec = (positionUs + 500) / 1000;
119bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::getDuration(int *msec) {
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("getDuration");
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
126bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t durationUs;
127bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    status_t err = mPlayer->getDuration(&durationUs);
128bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
129bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
130bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return err;
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
133bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *msec = (durationUs + 500) / 1000;
134bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::reset() {
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("reset");
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
141bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer->reset();
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
14620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setLooping(int loop) {
14720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("setLooping");
148bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
149bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->setLooping(loop);
15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberplayer_type StagefrightPlayer::playerType() {
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("playerType");
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return STAGEFRIGHT_PLAYER;
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return INVALID_OPERATION;
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
16020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaPlayerInterface::setAudioSink(audioSink);
16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
164bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer->setAudioSink(audioSink);
16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
16620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
168