StagefrightPlayer.cpp revision acdd9d0f59c3d8bdc3de80664a609527ec3d21e2
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
9acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber#include <media/Metadata.h>
10acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber#include <media/stagefright/MediaExtractor.h>
11acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
1220111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android {
1320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1420111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberStagefrightPlayer::StagefrightPlayer()
15bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    : mPlayer(new AwesomePlayer) {
1620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("StagefrightPlayer");
17bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
18bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer->setListener(this);
1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2120111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberStagefrightPlayer::~StagefrightPlayer() {
2220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("~StagefrightPlayer");
2320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    reset();
24bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
25bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    delete mPlayer;
26bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer = NULL;
2720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::initCheck() {
3020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("initCheck");
3120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
3220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
3320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
342db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huberstatus_t StagefrightPlayer::setDataSource(
355561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber        const char *url, const KeyedVector<String8, String8> *headers) {
362db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber    LOGI("setDataSource('%s')", url);
375561ccf4a8db88a2e44eac1b3ed13b4ff53a7f20Andreas Huber    return mPlayer->setDataSource(url, headers);
3820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
40a75e9fb4876139fff4bb836fb0ebd5f80c8b20b3Andreas Huber// Warning: The filedescriptor passed into this method will only be valid until
41a75e9fb4876139fff4bb836fb0ebd5f80c8b20b3Andreas Huber// the method returns, if you want to keep it, dup it!
4220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) {
4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("setDataSource(%d, %lld, %lld)", fd, offset, length);
44bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->setDataSource(dup(fd), offset, length);
4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
4620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setVideoSurface(const sp<ISurface> &surface) {
4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("setVideoSurface");
4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    mPlayer->setISurface(surface);
5120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
5220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
5320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::prepare() {
55c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return mPlayer->prepare();
5620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
5720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
5820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::prepareAsync() {
59c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber    return mPlayer->prepareAsync();
6020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::start() {
6320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("start");
6420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
65bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->play();
6620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
6720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::stop() {
6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("stop");
7020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
71bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return pause();  // what's the difference?
7220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
7320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
7420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::pause() {
7520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("pause");
7620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
77bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->pause();
7820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
7920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool StagefrightPlayer::isPlaying() {
8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("isPlaying");
82bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->isPlaying();
8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::seekTo(int msec) {
8620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("seekTo");
8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    status_t err = mPlayer->seekTo((int64_t)msec * 1000);
8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return err;
9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
9220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::getCurrentPosition(int *msec) {
9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("getCurrentPosition");
9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
96bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t positionUs;
97bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    status_t err = mPlayer->getPosition(&positionUs);
98bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
99bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
100bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber        return err;
10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
10220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
103bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *msec = (positionUs + 500) / 1000;
104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
10820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::getDuration(int *msec) {
10920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("getDuration");
11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
111bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    int64_t durationUs;
112bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    status_t err = mPlayer->getDuration(&durationUs);
113bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
114bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    if (err != OK) {
115acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        *msec = 0;
116acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        return OK;
11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    }
11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
119bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    *msec = (durationUs + 500) / 1000;
120bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
12120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
12320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::reset() {
12520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("reset");
12620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
127bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer->reset();
12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return OK;
13020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
13120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setLooping(int loop) {
13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("setLooping");
134bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber
135bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    return mPlayer->setLooping(loop);
13620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
13820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberplayer_type StagefrightPlayer::playerType() {
13920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    LOGV("playerType");
14020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return STAGEFRIGHT_PLAYER;
14120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
14220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
1434e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huberstatus_t StagefrightPlayer::suspend() {
1444e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber    LOGV("suspend");
1454e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber    return mPlayer->suspend();
1464e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber}
1474e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber
1484e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huberstatus_t StagefrightPlayer::resume() {
1494e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber    LOGV("resume");
1504e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber    return mPlayer->resume();
1514e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber}
1524e92c7efc68b5d7635a32dbd283ab8558ad9bdd6Andreas Huber
15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) {
15420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    return INVALID_OPERATION;
15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) {
15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber    MediaPlayerInterface::setAudioSink(audioSink);
15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
160bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber    mPlayer->setAudioSink(audioSink);
16120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}
16220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber
163acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberstatus_t StagefrightPlayer::getMetadata(
164acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber        const media::Metadata::Filter& ids, Parcel *records) {
165acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    using media::Metadata;
166acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
167acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    uint32_t flags = mPlayer->flags();
168acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
169acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    Metadata metadata(records);
170acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
171acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    metadata.appendBool(
172acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            Metadata::kPauseAvailable,
173acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            flags & MediaExtractor::CAN_PAUSE);
174acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
175acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    metadata.appendBool(
176acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            Metadata::kSeekBackwardAvailable,
177acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            flags & MediaExtractor::CAN_SEEK_BACKWARD);
178acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
179acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    metadata.appendBool(
180acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            Metadata::kSeekForwardAvailable,
181acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber            flags & MediaExtractor::CAN_SEEK_FORWARD);
182acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
183acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber    return OK;
184acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber}
185acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber
18620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber}  // namespace android
187