127c174483a8ae9688d5d4897c19074f62c7f1701James Dong/* 227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Copyright (C) 2009 The Android Open Source Project 327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 527c174483a8ae9688d5d4897c19074f62c7f1701James Dong * you may not use this file except in compliance with the License. 627c174483a8ae9688d5d4897c19074f62c7f1701James Dong * You may obtain a copy of the License at 727c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 827c174483a8ae9688d5d4897c19074f62c7f1701James Dong * http://www.apache.org/licenses/LICENSE-2.0 927c174483a8ae9688d5d4897c19074f62c7f1701James Dong * 1027c174483a8ae9688d5d4897c19074f62c7f1701James Dong * Unless required by applicable law or agreed to in writing, software 1127c174483a8ae9688d5d4897c19074f62c7f1701James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1227c174483a8ae9688d5d4897c19074f62c7f1701James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327c174483a8ae9688d5d4897c19074f62c7f1701James Dong * See the License for the specific language governing permissions and 1427c174483a8ae9688d5d4897c19074f62c7f1701James Dong * limitations under the License. 1527c174483a8ae9688d5d4897c19074f62c7f1701James Dong */ 1627c174483a8ae9688d5d4897c19074f62c7f1701James Dong 1720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber//#define LOG_NDEBUG 0 1820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#define LOG_TAG "StagefrightPlayer" 1920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include <utils/Log.h> 2020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 2120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber#include "StagefrightPlayer.h" 22bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 23bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber#include "AwesomePlayer.h" 2420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 25acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber#include <media/Metadata.h> 26acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber#include <media/stagefright/MediaExtractor.h> 27acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 2820111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubernamespace android { 2920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3020111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberStagefrightPlayer::StagefrightPlayer() 31bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber : mPlayer(new AwesomePlayer) { 323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("StagefrightPlayer"); 33bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 34bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mPlayer->setListener(this); 3520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 3620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 3720111aa043c5f404472bc63b90bc5aad906b1101Andreas HuberStagefrightPlayer::~StagefrightPlayer() { 383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("~StagefrightPlayer"); 3920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber reset(); 40bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 41bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber delete mPlayer; 42bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mPlayer = NULL; 4320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 4420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 4520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::initCheck() { 463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("initCheck"); 4720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 4820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 4920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 509b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huberstatus_t StagefrightPlayer::setUID(uid_t uid) { 519b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber mPlayer->setUID(uid); 529b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 539b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber return OK; 549b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber} 559b80c2bdb205bc143104f54d0743b6eedd67b14eAndreas Huber 562db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huberstatus_t StagefrightPlayer::setDataSource( 571b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const sp<IMediaHTTPService> &httpService, 581b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const char *url, 591b86fe063badb5f28c467ade39be0f4008688947Andreas Huber const KeyedVector<String8, String8> *headers) { 601b86fe063badb5f28c467ade39be0f4008688947Andreas Huber return mPlayer->setDataSource(httpService, url, headers); 6120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 6220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 63a75e9fb4876139fff4bb836fb0ebd5f80c8b20b3Andreas Huber// Warning: The filedescriptor passed into this method will only be valid until 64a75e9fb4876139fff4bb836fb0ebd5f80c8b20b3Andreas Huber// the method returns, if you want to keep it, dup it! 6520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setDataSource(int fd, int64_t offset, int64_t length) { 663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setDataSource(%d, %lld, %lld)", fd, offset, length); 67bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mPlayer->setDataSource(dup(fd), offset, length); 6820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 6920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 70e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huberstatus_t StagefrightPlayer::setDataSource(const sp<IStreamSource> &source) { 71e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber return mPlayer->setDataSource(source); 72e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber} 73e2b1028852120bcfded33b8f06f66b780437fe92Andreas Huber 741173118eace0e9e347cb007f0da817cee87579edGlenn Kastenstatus_t StagefrightPlayer::setVideoSurfaceTexture( 758ba01021b573889802e67e029225a96f0dfa471aAndy McFadden const sp<IGraphicBufferProducer> &bufferProducer) { 763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVideoSurfaceTexture"); 771173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 788ba01021b573889802e67e029225a96f0dfa471aAndy McFadden return mPlayer->setSurfaceTexture(bufferProducer); 791173118eace0e9e347cb007f0da817cee87579edGlenn Kasten} 801173118eace0e9e347cb007f0da817cee87579edGlenn Kasten 8120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::prepare() { 82c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return mPlayer->prepare(); 8320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 8420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::prepareAsync() { 86c23f12af0394aa2f6651968a3c8840f1af317aa1Andreas Huber return mPlayer->prepareAsync(); 8720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 8820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 8920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::start() { 903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("start"); 9120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 92bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mPlayer->play(); 9320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 9420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 9520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::stop() { 963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stop"); 9720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 98bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return pause(); // what's the difference? 9920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 10020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::pause() { 1023856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("pause"); 10320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 104bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mPlayer->pause(); 10520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 10620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 10720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberbool StagefrightPlayer::isPlaying() { 1083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("isPlaying"); 109bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mPlayer->isPlaying(); 11020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 11120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::seekTo(int msec) { 1133856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("seekTo %.2f secs", msec / 1E3); 11420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber status_t err = mPlayer->seekTo((int64_t)msec * 1000); 11620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 11720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return err; 11820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 11920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 12020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::getCurrentPosition(int *msec) { 1213856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getCurrentPosition"); 12220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 123bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t positionUs; 124bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mPlayer->getPosition(&positionUs); 125bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 126bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 127bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return err; 12820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 12920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 130bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *msec = (positionUs + 500) / 1000; 131bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 13220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 13320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 13420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 13520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::getDuration(int *msec) { 1363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getDuration"); 13720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 138bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber int64_t durationUs; 139bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber status_t err = mPlayer->getDuration(&durationUs); 140bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 141bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber if (err != OK) { 142acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber *msec = 0; 143acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 14420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber } 14520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 146bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber *msec = (durationUs + 500) / 1000; 147bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 14820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 14920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 15020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15120111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::reset() { 1523856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reset"); 15320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 154bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mPlayer->reset(); 15520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return OK; 15720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 15820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 15920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::setLooping(int loop) { 1603856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setLooping"); 161bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber 162bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber return mPlayer->setLooping(loop); 16320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 16420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 16520111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberplayer_type StagefrightPlayer::playerType() { 1663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("playerType"); 16720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber return STAGEFRIGHT_PLAYER; 16820111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 16920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huberstatus_t StagefrightPlayer::invoke(const Parcel &request, Parcel *reply) { 171f9d660a5e0196240add5daf0199f128d471e592cInsun Kang ALOGV("invoke()"); 172f9d660a5e0196240add5daf0199f128d471e592cInsun Kang return mPlayer->invoke(request, reply); 17320111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 17420111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 17520111aa043c5f404472bc63b90bc5aad906b1101Andreas Hubervoid StagefrightPlayer::setAudioSink(const sp<AudioSink> &audioSink) { 17620111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber MediaPlayerInterface::setAudioSink(audioSink); 17720111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 178bfa6b2d7a1be1832ac40ed90aece1834f720b5c6Andreas Huber mPlayer->setAudioSink(audioSink); 17920111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} 18020111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber 1814f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t StagefrightPlayer::setParameter(int key, const Parcel &request) { 1827a8b0ed6419e57dd8b41d3806893d63d3df91aabJean-Michel Trivi ALOGV("setParameter(key=%d)", key); 1834f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return mPlayer->setParameter(key, request); 1844f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 1854f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 1864f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wangstatus_t StagefrightPlayer::getParameter(int key, Parcel *reply) { 1873856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getParameter"); 1884f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang return mPlayer->getParameter(key, reply); 1894f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang} 1904f9e47f2c03ce36261c4717cd7e131d7940bb068Gloria Wang 191acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huberstatus_t StagefrightPlayer::getMetadata( 19284333e0475bc911adc16417f4ca327c975cf6c36Andreas Huber const media::Metadata::Filter& /* ids */, Parcel *records) { 193acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber using media::Metadata; 194acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 195acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber uint32_t flags = mPlayer->flags(); 196acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 197acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Metadata metadata(records); 198acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 199acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber metadata.appendBool( 200acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Metadata::kPauseAvailable, 201acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber flags & MediaExtractor::CAN_PAUSE); 202acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 203acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber metadata.appendBool( 204acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Metadata::kSeekBackwardAvailable, 205acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber flags & MediaExtractor::CAN_SEEK_BACKWARD); 206acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 207acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber metadata.appendBool( 208acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber Metadata::kSeekForwardAvailable, 209acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber flags & MediaExtractor::CAN_SEEK_FORWARD); 210acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 21170f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber metadata.appendBool( 21270f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber Metadata::kSeekAvailable, 21370f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber flags & MediaExtractor::CAN_SEEK); 21470f521de2675ce6eedf4b22beed94ea1289b0f38Andreas Huber 215acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber return OK; 216acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber} 217acdd9d0f59c3d8bdc3de80664a609527ec3d21e2Andreas Huber 218a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huberstatus_t StagefrightPlayer::dump(int fd, const Vector<String16> &args) const { 219a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber return mPlayer->dump(fd, args); 220a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber} 221a0b1d4b161599c2bb2a47119e50c51e75bbe980eAndreas Huber 22220111aa043c5f404472bc63b90bc5aad906b1101Andreas Huber} // namespace android 223