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